diff --git a/AMDiS/src/PardisoSolver.cc b/AMDiS/src/PardisoSolver.cc index 98f749ca66abbd5975f518ba61b0f4504476dd6f..04d6d380753006c497cfe1667e2e01f8e478f49e 100644 --- a/AMDiS/src/PardisoSolver.cc +++ b/AMDiS/src/PardisoSolver.cc @@ -4,6 +4,7 @@ #ifdef HAVE_MKL +#include <mkl.h> #include <mkl_pardiso.h> namespace AMDiS { @@ -120,7 +121,7 @@ namespace AMDiS { iparm[0] = 1; // No solver default iparm[1] = 2; // Fill-in reordering from METIS - iparm[2] = 1; // Number of threads + iparm[2] = mkl_get_max_threads(); // Number of threads iparm[7] = 2; // Max numbers of iterative refinement steps iparm[9] = 13; // Perturb the pivot elements with 1e-13 iparm[10] = 1; // Use nonsymmetric permutation and scaling MPS @@ -151,7 +152,52 @@ namespace AMDiS { PARDISO(pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &idum, &nRhs, iparm, &msglvl, &ddum, &ddum, &error); + TEST_EXIT(error == 0)("Intel MKL Pardiso error during symbolic factorization: %d\n", error); + + // Numerical factorization + phase = 22; + + PARDISO(pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &idum, &nRhs, + iparm, &msglvl, &ddum, &ddum, &error); + + TEST_EXIT(error == 0)("Intel MKL Pardiso error during numerical factorization: %d\n", error); + + // Back substitution and iterative refinement + phase = 33; + iparm[7] = 2; // Max numbers of iterative refinement steps + + PARDISO(pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &idum, &nRhs, + iparm, &msglvl, bvec, xvec, &error); + + TEST_EXIT(error == 0)("Intel MKL Pardiso error during solution: %d\n", error); + + // Termination and release of memory + phase = -1; + + PARDISO(pt, &maxfct, &mnum, &mtype, &phase, &n, a, ia, ja, &idum, &nRhs, + iparm, &msglvl, &ddum, &ddum, &error); + + + // Copy and resort solution. + for (int i = 0; i < x->getSize(); i++) { + DOFVector<double>::Iterator it(x->getDOFVector(i), USED_DOFS); + + int counter = 0; + for (it.reset(); !it.end(); it++, counter++) { + *it = xvec[counter * nComponents + i]; + } + } + + // Calculate and print the residual. + *p = *x; + *p *= -1.0; + matVec->matVec(NoTranspose, *p, *r); + *r += *b; + this->residual = norm(r); + + MSG("Residual: %e\n", this->residual); + free(a); free(ja);