I am using Pardiso with the 2017 Update 2 Intel Fortran compiler in VS 2015 and I'm finding that when using mtype=2 (real and symmetric positive definite matrix) if my matrix has a singularity, iparm(30) always returns 1 rather than the location of the equation where the singularity occurs. In the 2016 version of the compiler this worked correctly. Has something changed or is this a bug?
Refer to the Pardiso documentation as follows:
If Intel MKL PARDISO detects zero or negative pivot for mtype=2 or mtype=4 matrix types, the factorization is stopped, Intel MKL PARDISO returns immediately with an error = -4, and iparm(30) reports the number of the equation where the first zero or negative pivot is detected.
For mtype=2 factorization, the pardiso choose Cholesky decomposition. For those factorization using Gaussian elimination required to have positive pivot elements. If the matrix A is singular matrix, det(A)=0, it means there would be no solution or have countless results for factorization. To eliminate singularity, you probably could refer SVD.
Our application is structural engineering where a singularity in the stiffness matrix represents an instability in the structure. Usually the location of instabilities are unknown and so the iparm(30) value helps the engineer to find where the instability is. In the version of Pardiso shipped with MKL 2017 Update 2, it always returns iparm(30)=1 whenever a singularity occurs, whereas previously it returned the location of the first singularity found (even though there might be more than one). Returning iparm(30)=1 makes it impossible for the engineer to find the instability, plus it no longer complies with the Pardiso documentation as per my original post. Can this be fixed?
I am not very clear with your problem, I tested both MKL11.3.3 & MKL2017u3, iparm returns same value that is no. of equation which firstly detected 0 or negative pivots, which version of MKL you get that the iparm is not no. of equation? Could you please provide your input matrix?
The positive definition matrix must be not a singular matrix, if your matrix is singular, you probably could set phase to 11(reordering process), and it would return error:
*** Error in PARDISO ( numerical_factorization) error_num= -1
*** Error in PARDISO: zero or negative pivot, A is not SPD-matrix
I have tested MKL 2017u3 and it has the same problem. I have also found that the problem only occurs with some matrices whereas others work Ok. I have attached a project with a test matrix that shows the problem. In MKL2017u3 my test matrix returns iparm(30)=1 which is incorrect, however if I run the same matrix with MKL 11.2.4 it returns iparm(30)=49 which is correct.
It looks like something has changed since MKL 11.2.4.
I have just installed the new 2018 Fortran compiler and MKL, and the problem appears to be fixed. Are these types of fixes supposed to be included in release notes somewhere? I can't see any mention of this issue anywhere.