<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Odd behavior in Pardiso Back Substitution with MKL 2025 in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1672201#M36979</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I have a strange problem with MKL 2025&amp;nbsp; Pardiso Solve.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have simple code (attached) which is essentially loading a sparse matrix,&amp;nbsp; running a two-step factorization and then running back substitution for an input vector.&amp;nbsp; In short, the code looks like&lt;/P&gt;&lt;P&gt;A.load(File)&amp;nbsp; //&amp;nbsp; Square sparse matrix in Yale format&lt;/P&gt;&lt;P&gt;B =&amp;nbsp; Simple vector&amp;nbsp; internally crated // Size == A.rowSize()&lt;/P&gt;&lt;P&gt;X = 0&amp;nbsp; // Solution initialized to 0&lt;/P&gt;&lt;P&gt;// Phase 11&lt;/P&gt;&lt;P&gt;A.symbolic_factorization(....)&lt;/P&gt;&lt;P&gt;// Phase 22&amp;nbsp;&lt;/P&gt;&lt;P&gt;A.numerical_factorization(....)&amp;nbsp;&lt;/P&gt;&lt;P&gt;//Phase 33&amp;nbsp;&lt;/P&gt;&lt;P&gt;A.BackSubstitute(B, X)&amp;nbsp; //&amp;nbsp; Expecting&amp;nbsp; &amp;nbsp;X to have the solution of AX = B&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am attaching the matrix ( named Good and Bad).&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Using MKL 2021.3, for both Good and Bad matrix I am getting&amp;nbsp; AX = B&amp;nbsp;&lt;/P&gt;&lt;P&gt;However&lt;/P&gt;&lt;P&gt;Using MKL 2025.0 ,&amp;nbsp; I am getting the expected results for the Good case,&amp;nbsp; but it is not working for the Bad case.&amp;nbsp; In fact strangely,&amp;nbsp; I am getting X ==0&amp;nbsp; after the backsubstibution call&amp;nbsp; as if A is behaving like an identity matrix.&amp;nbsp; I am not getting any errors in Phases 11, 22 or 33.&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Clearly it is a case specific problem&amp;nbsp; as the Good matrix is showing ok ( also we have tested this for many different matrices and everything works fine except this one case).&amp;nbsp; Any help will be appreciated.&lt;/P&gt;&lt;P&gt;I have included the C++ file,&amp;nbsp; along with the input matrices ( Yale*.txt)&amp;nbsp; and the B's and X's for the good and bad cases.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;Swagato&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;PS:&amp;nbsp; For some reason it is not attaching my C++ code even if I am calling it a text file.&amp;nbsp; So&amp;nbsp; pasting the code here ( apologies for the indentation getting messed up) :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;stddef.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;iostream&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;string&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;fstream&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;mkl.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;mkl_pardiso.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;mkl_spblas.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;vector&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;typedef struct { double r, i; } doublecomplex;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;void loadIaJaAFile(const char* fileName, int&amp;amp; n, int&amp;amp; nnz, int** ia, int** ja, doublecomplex** a)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::ifstream myfile;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;myfile.open(fileName);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string text;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;char* pch;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (myfile.is_open())&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// read number of equations&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;n = atoi(text.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// read number of nonzeros&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;nnz = atoi(text.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// allocate memory for csr matrix&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;*ia = (int*)malloc((n + 1) * sizeof(int));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;*ja = (int*)malloc(nnz * sizeof(int));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;*a = (doublecomplex*)malloc(nnz * sizeof(doublecomplex));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// read and convert input data&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt;= n; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*ia)[i] = atoi(text.c_str()) - 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt; nnz; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*ja)[i] = atoi(text.c_str()) - 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt; nnz; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch = strtok((char*)text.c_str(), " ,");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (pch[0] == '(')&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch[0] = ' ';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*a)[i].r = atof(pch);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch = strtok(NULL, " ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (pch[(strlen(pch) - 1)] == ')')&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch[(strlen(pch) - 1)] = ' ';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*a)[i].i = atof(pch);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Unable to open file" &amp;lt;&amp;lt; fileName;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(0);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "# of equations " &amp;lt;&amp;lt; n &amp;lt;&amp;lt; ", # of&amp;nbsp; nonzeros " &amp;lt;&amp;lt; (*ia)[n] - 1 &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;void freeMem(int** ia, int** ja, doublecomplex** a, doublecomplex** b, doublecomplex** x)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*ia);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*ja);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*a);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*b);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int testMKLPardisoDirect(const char* iajaaFile, const char* inputFile, const char* outputFile)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int&amp;nbsp; &amp;nbsp; n, nnz, nrhs = 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int* ia, * ja;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;doublecomplex* a;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Loading matrix data..." &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;loadIaJaAFile(iajaaFile, n, nnz, &amp;amp;ia, &amp;amp;ja, &amp;amp;a);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//loadIaJaAFile("small.iajaa", n, nnz, &amp;amp;ia, &amp;amp;ja, &amp;amp;a);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;doublecomplex* b = (doublecomplex*)malloc(n * sizeof(doublecomplex));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;doublecomplex* x = (doublecomplex*)malloc(n * sizeof(doublecomplex));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Setting up RHS..." &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt; n * nrhs; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;b[i].r = (double)i / (double)n;&amp;nbsp; b[i].i = (double)i / (double)n;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;x[i].r = 0.0;&amp;nbsp; x[i].i = 0.0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Finished setting up RHS..." &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mkl_set_num_threads(1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Matrix data. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT mtype = 13;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Complex symmetric matrix */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* RHS and solution vectors. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Internal solver memory pointer pt, */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* 32-bit: int pt[64]; 64-bit: long int pt[64] */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* or void *pt[64] should be OK on both architectures */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;void* pt[64];&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Pardiso control parameters. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT iparm[64];&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT maxfct, mnum, phase, error, msglvl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Auxiliary variables. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT i;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;double ddum;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Double dummy */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::vector&amp;lt;MKL_INT&amp;gt; irowSel;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Setup Pardiso control parameters. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; 64; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[i] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[0] = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* No solver default */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[1] = 2;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Fill-in reordering from METIS */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[5] = 1; //New&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[7] = 0;// 2;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Max numbers of iterative refinement steps */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[9] = 13;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Perturb the pivot elements with 1E-13 */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[10] = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Use nonsymmetric permutation and scaling MPS */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[12] = 1;//&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[17] = -1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Output: Number of nonzeros in the factor LU */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[18] = -1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Output: Mflops for LU factorization */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[24] = 1; //&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[34] = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* PARDISO use C-style indexing for ia and ja arrays */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;maxfct = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Maximum number of numerical factorizations. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mnum = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Which factorization to use. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msglvl = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Print statistical information in file */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;error = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Initialize error flag */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Initialize the internal solver memory pointer. This is only&amp;nbsp; */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/*&amp;nbsp; &amp;nbsp;necessary for the FIRST call of the PARDISO solver.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; 64; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pt[i] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::vector&amp;lt;int&amp;gt; rowSelVec;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Selective output rows&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;irowSel.resize(1, 0);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Reordering and Symbolic Factorization. This step also allocates&amp;nbsp; */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/*&amp;nbsp; &amp;nbsp; all memory that is necessary for the factorization.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = 11;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, a, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (error != 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nERROR during symbolic factorization: %d", error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nReordering completed ... ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nNumber of nonzeros in factors = %d", iparm[17]);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nNumber of factorization MFLOPS = %d", iparm[18]);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Numerical factorization. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = 22;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, a, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (error != 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nERROR during numerical factorization: %d", error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(2);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nFactorization completed ... ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -----------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Back substitution and iterative refinement. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -----------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = 33;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[5] = 0;&amp;nbsp; &amp;nbsp;/* Write solution into 0: x, 1: b*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, a, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, b, x, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (error != 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nERROR during solution: %d", error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(3);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nSolve completed ... ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::ofstream inFile(inputFile);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; n; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;inFile &amp;lt;&amp;lt; b[i].r &amp;lt;&amp;lt; " " &amp;lt;&amp;lt; b[i].i &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;inFile.close();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::ofstream outFile(outputFile);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; n; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;outFile &amp;lt;&amp;lt; x[i].r &amp;lt;&amp;lt; " " &amp;lt;&amp;lt; x[i].i &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;outFile.close();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Termination and release of memory. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = -1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Release internal memory. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, &amp;amp;ddum, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int main(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string goodMatrix = "Yale_Good_490.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string goodB = "Good_B.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string goodX = "Good_X.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;testMKLPardisoDirect(goodMatrix.c_str(), goodB.c_str(), goodX.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string badMatrix = "Yale_Bad_5289.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string badB = "Bad_B.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string badX = "Bad_X.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;testMKLPardisoDirect(badMatrix.c_str(), badB.c_str(), badX.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 04 Mar 2025 19:22:56 GMT</pubDate>
    <dc:creator>SChakraborty</dc:creator>
    <dc:date>2025-03-04T19:22:56Z</dc:date>
    <item>
      <title>Odd behavior in Pardiso Back Substitution with MKL 2025</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1672201#M36979</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I have a strange problem with MKL 2025&amp;nbsp; Pardiso Solve.&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have simple code (attached) which is essentially loading a sparse matrix,&amp;nbsp; running a two-step factorization and then running back substitution for an input vector.&amp;nbsp; In short, the code looks like&lt;/P&gt;&lt;P&gt;A.load(File)&amp;nbsp; //&amp;nbsp; Square sparse matrix in Yale format&lt;/P&gt;&lt;P&gt;B =&amp;nbsp; Simple vector&amp;nbsp; internally crated // Size == A.rowSize()&lt;/P&gt;&lt;P&gt;X = 0&amp;nbsp; // Solution initialized to 0&lt;/P&gt;&lt;P&gt;// Phase 11&lt;/P&gt;&lt;P&gt;A.symbolic_factorization(....)&lt;/P&gt;&lt;P&gt;// Phase 22&amp;nbsp;&lt;/P&gt;&lt;P&gt;A.numerical_factorization(....)&amp;nbsp;&lt;/P&gt;&lt;P&gt;//Phase 33&amp;nbsp;&lt;/P&gt;&lt;P&gt;A.BackSubstitute(B, X)&amp;nbsp; //&amp;nbsp; Expecting&amp;nbsp; &amp;nbsp;X to have the solution of AX = B&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am attaching the matrix ( named Good and Bad).&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Using MKL 2021.3, for both Good and Bad matrix I am getting&amp;nbsp; AX = B&amp;nbsp;&lt;/P&gt;&lt;P&gt;However&lt;/P&gt;&lt;P&gt;Using MKL 2025.0 ,&amp;nbsp; I am getting the expected results for the Good case,&amp;nbsp; but it is not working for the Bad case.&amp;nbsp; In fact strangely,&amp;nbsp; I am getting X ==0&amp;nbsp; after the backsubstibution call&amp;nbsp; as if A is behaving like an identity matrix.&amp;nbsp; I am not getting any errors in Phases 11, 22 or 33.&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Clearly it is a case specific problem&amp;nbsp; as the Good matrix is showing ok ( also we have tested this for many different matrices and everything works fine except this one case).&amp;nbsp; Any help will be appreciated.&lt;/P&gt;&lt;P&gt;I have included the C++ file,&amp;nbsp; along with the input matrices ( Yale*.txt)&amp;nbsp; and the B's and X's for the good and bad cases.&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;Swagato&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;PS:&amp;nbsp; For some reason it is not attaching my C++ code even if I am calling it a text file.&amp;nbsp; So&amp;nbsp; pasting the code here ( apologies for the indentation getting messed up) :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;stddef.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;iostream&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;string&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;fstream&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;mkl.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;mkl_pardiso.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;mkl_spblas.h&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;#include &amp;lt;vector&amp;gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;typedef struct { double r, i; } doublecomplex;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;void loadIaJaAFile(const char* fileName, int&amp;amp; n, int&amp;amp; nnz, int** ia, int** ja, doublecomplex** a)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::ifstream myfile;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;myfile.open(fileName);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string text;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;char* pch;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (myfile.is_open())&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// read number of equations&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;n = atoi(text.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// read number of nonzeros&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;nnz = atoi(text.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// allocate memory for csr matrix&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;*ia = (int*)malloc((n + 1) * sizeof(int));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;*ja = (int*)malloc(nnz * sizeof(int));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;*a = (doublecomplex*)malloc(nnz * sizeof(doublecomplex));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// read and convert input data&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt;= n; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*ia)[i] = atoi(text.c_str()) - 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt; nnz; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*ja)[i] = atoi(text.c_str()) - 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt; nnz; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;getline(myfile, text);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch = strtok((char*)text.c_str(), " ,");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (pch[0] == '(')&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch[0] = ' ';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*a)[i].r = atof(pch);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch = strtok(NULL, " ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (pch[(strlen(pch) - 1)] == ')')&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pch[(strlen(pch) - 1)] = ' ';&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;(*a)[i].i = atof(pch);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Unable to open file" &amp;lt;&amp;lt; fileName;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(0);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "# of equations " &amp;lt;&amp;lt; n &amp;lt;&amp;lt; ", # of&amp;nbsp; nonzeros " &amp;lt;&amp;lt; (*ia)[n] - 1 &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;void freeMem(int** ia, int** ja, doublecomplex** a, doublecomplex** b, doublecomplex** x)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*ia);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*ja);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*a);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*b);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;free(*x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int testMKLPardisoDirect(const char* iajaaFile, const char* inputFile, const char* outputFile)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int&amp;nbsp; &amp;nbsp; n, nnz, nrhs = 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int* ia, * ja;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;doublecomplex* a;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Loading matrix data..." &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;loadIaJaAFile(iajaaFile, n, nnz, &amp;amp;ia, &amp;amp;ja, &amp;amp;a);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//loadIaJaAFile("small.iajaa", n, nnz, &amp;amp;ia, &amp;amp;ja, &amp;amp;a);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;doublecomplex* b = (doublecomplex*)malloc(n * sizeof(doublecomplex));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;doublecomplex* x = (doublecomplex*)malloc(n * sizeof(doublecomplex));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Setting up RHS..." &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (int i = 0; i &amp;lt; n * nrhs; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;b[i].r = (double)i / (double)n;&amp;nbsp; b[i].i = (double)i / (double)n;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;x[i].r = 0.0;&amp;nbsp; x[i].i = 0.0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::cout &amp;lt;&amp;lt; "Finished setting up RHS..." &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mkl_set_num_threads(1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Matrix data. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT mtype = 13;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Complex symmetric matrix */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* RHS and solution vectors. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Internal solver memory pointer pt, */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* 32-bit: int pt[64]; 64-bit: long int pt[64] */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* or void *pt[64] should be OK on both architectures */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;void* pt[64];&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Pardiso control parameters. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT iparm[64];&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT maxfct, mnum, phase, error, msglvl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* Auxiliary variables. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;MKL_INT i;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;double ddum;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Double dummy */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::vector&amp;lt;MKL_INT&amp;gt; irowSel;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Setup Pardiso control parameters. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; 64; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[i] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[0] = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* No solver default */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[1] = 2;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Fill-in reordering from METIS */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[5] = 1; //New&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[7] = 0;// 2;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Max numbers of iterative refinement steps */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[9] = 13;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Perturb the pivot elements with 1E-13 */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[10] = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Use nonsymmetric permutation and scaling MPS */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[12] = 1;//&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[17] = -1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Output: Number of nonzeros in the factor LU */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[18] = -1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Output: Mflops for LU factorization */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[24] = 1; //&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[34] = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* PARDISO use C-style indexing for ia and ja arrays */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;maxfct = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Maximum number of numerical factorizations. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mnum = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Which factorization to use. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msglvl = 1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Print statistical information in file */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;error = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Initialize error flag */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Initialize the internal solver memory pointer. This is only&amp;nbsp; */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/*&amp;nbsp; &amp;nbsp;necessary for the FIRST call of the PARDISO solver.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; 64; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;pt[i] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::vector&amp;lt;int&amp;gt; rowSelVec;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Selective output rows&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;irowSel.resize(1, 0);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Reordering and Symbolic Factorization. This step also allocates&amp;nbsp; */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/*&amp;nbsp; &amp;nbsp; all memory that is necessary for the factorization.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = 11;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, a, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (error != 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nERROR during symbolic factorization: %d", error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nReordering completed ... ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nNumber of nonzeros in factors = %d", iparm[17]);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nNumber of factorization MFLOPS = %d", iparm[18]);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Numerical factorization. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* ----------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = 22;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, a, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (error != 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nERROR during numerical factorization: %d", error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(2);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nFactorization completed ... ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -----------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Back substitution and iterative refinement. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* -----------------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = 33;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;iparm[5] = 0;&amp;nbsp; &amp;nbsp;/* Write solution into 0: x, 1: b*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, a, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, b, x, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (error != 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nERROR during solution: %d", error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;exit(3);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;printf("\nSolve completed ... ");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::ofstream inFile(inputFile);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; n; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;inFile &amp;lt;&amp;lt; b[i].r &amp;lt;&amp;lt; " " &amp;lt;&amp;lt; b[i].i &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;inFile.close();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::ofstream outFile(outputFile);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;for (i = 0; i &amp;lt; n; i++)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;outFile &amp;lt;&amp;lt; x[i].r &amp;lt;&amp;lt; " " &amp;lt;&amp;lt; x[i].i &amp;lt;&amp;lt; std::endl;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;outFile.close();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* .. Termination and release of memory. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/* --------------------------------------*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;phase = -1;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Release internal memory. */&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;PARDISO(pt, &amp;amp;maxfct, &amp;amp;mnum, &amp;amp;mtype, &amp;amp;phase, &amp;amp;n, &amp;amp;ddum, ia, ja, &amp;amp;irowSel[0], &amp;amp;nrhs, iparm, &amp;amp;msglvl, &amp;amp;ddum, &amp;amp;ddum, &amp;amp;error);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;freeMem(&amp;amp;ia, &amp;amp;ja, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int main(void)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string goodMatrix = "Yale_Good_490.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string goodB = "Good_B.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string goodX = "Good_X.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;testMKLPardisoDirect(goodMatrix.c_str(), goodB.c_str(), goodX.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string badMatrix = "Yale_Bad_5289.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string badB = "Bad_B.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;std::string badX = "Bad_X.txt";&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;testMKLPardisoDirect(badMatrix.c_str(), badB.c_str(), badX.c_str());&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 04 Mar 2025 19:22:56 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1672201#M36979</guid>
      <dc:creator>SChakraborty</dc:creator>
      <dc:date>2025-03-04T19:22:56Z</dc:date>
    </item>
    <item>
      <title>Re: Odd behavior in Pardiso Back Substitution with MKL 2025</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673313#M36986</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you for posting in the forum. All-zero output for some matrices with iparm[7]=0 is a known issue for oneMKL 2025.0. It has been fixed and the fix will be included in the upcoming 2025.1 release.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I tried the Bad_matrix case with the fixed version and the results are expected.&lt;/P&gt;
&lt;P&gt;Btw, starting from oneMKL 2025.0 iparm[7]=0 will turn off the iterative refinement completely, while in prior versions iparm[7]=0 performs 2 iterative refinement steps.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;Fengrui&lt;/P&gt;</description>
      <pubDate>Fri, 07 Mar 2025 18:18:53 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673313#M36986</guid>
      <dc:creator>Fengrui</dc:creator>
      <dc:date>2025-03-07T18:18:53Z</dc:date>
    </item>
    <item>
      <title>Re: Odd behavior in Pardiso Back Substitution with MKL 2025</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673320#M36987</link>
      <description>&lt;P&gt;&lt;a href="https://community.intel.com/t5/user/viewprofilepage/user-id/250759"&gt;@Fengrui&lt;/a&gt;&amp;nbsp;:&amp;nbsp; Thanks for the quick response.&amp;nbsp; &amp;nbsp;What is the ETA of 2025.1&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To make the 2025.0 behave similar to previous versions, should we change iparm[7] = 2?&amp;nbsp;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 07 Mar 2025 18:27:13 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673320#M36987</guid>
      <dc:creator>SChakraborty</dc:creator>
      <dc:date>2025-03-07T18:27:13Z</dc:date>
    </item>
    <item>
      <title>Re: Odd behavior in Pardiso Back Substitution with MKL 2025</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673328#M36988</link>
      <description>&lt;P&gt;It is planned for late March timeframe. I will update here when it is available.&lt;/P&gt;
&lt;P&gt;Yes, setting iparm[7]=2 will bring the default behavior (2 iterative refinement steps) of previous versions back. Please give it a try. I just tried on my side, and the results seem to be expected (not trivial solutions).&lt;/P&gt;</description>
      <pubDate>Fri, 07 Mar 2025 18:39:29 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673328#M36988</guid>
      <dc:creator>Fengrui</dc:creator>
      <dc:date>2025-03-07T18:39:29Z</dc:date>
    </item>
    <item>
      <title>Re: Odd behavior in Pardiso Back Substitution with MKL 2025</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673926#M36990</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; Is there a list of other known issues with MKL 2025.0&amp;nbsp; Pardiso ?&amp;nbsp; &amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; I ran an experiment with iparm[7]=2 and in my isolated matrix solve environment, that is indeed producing similar ( not identical) results to what I get with&amp;nbsp; 2021.&amp;nbsp; However,&amp;nbsp; when I am running our entire solution ( 3D EM Solver, with many sparse matrix operations)&amp;nbsp; I am getting bad result with the 2025 version with ipard[7]=2 and that gets fixed with 2021 version.&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Before we dive deeper to isolate what is going wrong at a single matrix operation level,&amp;nbsp; wanted to check if there are other known issues that might be impacting us.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 10 Mar 2025 22:58:37 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1673926#M36990</guid>
      <dc:creator>SChakraborty</dc:creator>
      <dc:date>2025-03-10T22:58:37Z</dc:date>
    </item>
    <item>
      <title>Re: Odd behavior in Pardiso Back Substitution with MKL 2025</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1674773#M36993</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you for posting the issue and testing iparm[7]=2 setting.&lt;/P&gt;&lt;P&gt;An associated problem might happen if iparm[20] is set to 2 or 3 for symmetric indefinite matrices (mtype=-2,-4 or 6). Do you set them?&lt;/P&gt;&lt;P&gt;We are not aware of any other new PARDISO issue in oneMKL 2025.0.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Could you maybe try to isolate the matrix and share it with us.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;Chris&lt;/P&gt;</description>
      <pubDate>Thu, 13 Mar 2025 16:21:03 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Odd-behavior-in-Pardiso-Back-Substitution-with-MKL-2025/m-p/1674773#M36993</guid>
      <dc:creator>c_sim</dc:creator>
      <dc:date>2025-03-13T16:21:03Z</dc:date>
    </item>
  </channel>
</rss>

