I am feeding pardiso a diagonal matrix with several zeros on the main diagonal. It is returning error=-1, "input inconsistent", when I was expecting -7 for "diagonal matrix is singular".
What exactly does "input inconsistent" mean?
There are several possibilities, and we would have to see details of the arguments to locate the inconsistency. You can get Pardiso to reveal more information about the inconsistencies by setting iparm(27) = 1 before calling Pardiso. For example, I deliberately made an error in one of the values in the row pointer array; with iparm(27)=0, the error was not detected until later in the solution process, and the error message was not very helpful:
*** Error in PARDISO ( reordering_phase) error_num= -180 *** error PARDISO: reordering, symbolic factorization
When I set iparm(27)=1 and reran the program, I saw more useful information:
*** Error in PARDISO (incorrect input matrix ) error_num= 21 *** Input check: i=8, ia(i)=19, ia(i+1)=16 are incompatible Reordering completed ... The following ERROR was detected: -1
The matrix is real*8, simple and small, n=80 and nnz=36. All nonzero entries are on the main diagonal.
I am running pardiso in a DLL. I'm still trying to figure out how to get it to print out the error message.
The matrix is 80 X 80, and has only 36 nonzero elements, all on the diagonal. Thus, it is a diagonal matrix with 44 zeros on the diagonal. The matrix is definitely singular. What do you intend to do with this singular matrix? What do you expect Pardiso to do for you, given this matrix?
Pardiso is a sophisticated high-performance solver for sparse linear equations. However, I would not rely on it to diagnose and do extensive analyses to pinpoint errors in the input arguments. The number of arguments to Pardiso is large, and the number of options specified in the iparm array is large. Getting the correct values into these arguments and checking them for consistency is best done in user code preceding the call to Pardiso.
I am aware that the matrix is singular. That is why I was wondering why pardiso didn't return error = -7. Why it returns error = -1 is a bit of a mystery.
In this particular situation, the matrix is a lumped mass matrix for a structural dynamics system. The calculation using pardiso is to compute initial accelerations for the beginning of a transient integration (initial value problem). The forces applied to the system at t=0 are only at degrees of freedom with nonzero mass. Since for this case the initial displacements and velocities are zero, the initial accelerations are merely the nodal forces divided by the nodal masses. When I call umfpack for this matrix, it returns "singular matrix". In spite of this condition the solution is the correct one, i.e. xdd=F/m.
The calculation case I'm trying to run isn't particularly realistic. It is from a published paper, and I use it as a validation case for my code.
My goal is not for pardiso to give me the "correct" solution for this academic problem. I just want to understand the error codes.