18#ifdef MFEM_USE_MKL_CPARDISO
22#ifdef MFEM_USE_SUPERLU
26#ifdef MFEM_USE_STRUMPACK
36 std::string name = name_in;
37 for (
char &c : name) { c = std::tolower(c); }
45 MFEM_ABORT(
"Unknown ParallelDirectSolver type string: " + name_in);
50 : type(type_), comm(comm_)
56#elif defined(MFEM_USE_SUPERLU)
58#elif defined(MFEM_USE_STRUMPACK)
60#elif defined(MFEM_USE_MKL_CPARDISO)
63 MFEM_ABORT(
"No parallel direct solver was enabled in MFEM.");
71 const std::string &name)
74void ParallelDirectSolver::InitSolver()
86 MFEM_ABORT(
"MUMPS requested but MFEM_USE_MUMPS is not defined.");
90#ifdef MFEM_USE_SUPERLU
92 auto *slu =
new SuperLUSolver(comm);
97 MFEM_ABORT(
"SuperLU requested but MFEM_USE_SUPERLU is not defined.");
101#ifdef MFEM_USE_STRUMPACK
103 auto *strumpack =
new STRUMPACKSolver(comm);
104 strumpack->SetKrylovSolver(strumpack::KrylovSolver::DIRECT);
105 strumpack->SetReorderingStrategy(strumpack::ReorderingStrategy::METIS);
106 strumpack->SetMatching(strumpack::MatchingJob::NONE);
107 strumpack->SetCompression(strumpack::CompressionType::NONE);
108 solver.reset(strumpack);
112 MFEM_ABORT(
"STRUMPACK requested but MFEM_USE_STRUMPACK is not defined.");
116#ifdef MFEM_USE_MKL_CPARDISO
118 auto *cpardiso =
new CPardisoSolver(comm);
119 solver.reset(cpardiso);
123 MFEM_ABORT(
"CPARDISO requested but MFEM_USE_MKL_CPARDISO is not defined.");
127 MFEM_ABORT(
"Invalid solver type.");
133 MFEM_VERIFY(solver,
"Solver not initialized.");
140 solver->SetOperator(op);
144#ifdef MFEM_USE_SUPERLU
147 solver->SetOperator(*superlu_mat);
150 MFEM_ABORT(
"SUPERLU not enabled.");
154#ifdef MFEM_USE_STRUMPACK
157 solver->SetOperator(*strumpack_mat);
160 MFEM_ABORT(
"STRUMPACK not enabled.");
164 MFEM_ABORT(
"SetOperator: unknown type.");
170 MFEM_VERIFY(solver,
"Solver not initialized.");
176 if (!solver) {
return; }
179 if (
auto *mumps =
dynamic_cast<MUMPSSolver*
>(solver.get()))
181 mumps->SetPrintLevel(print_lvl);
185#ifdef MFEM_USE_SUPERLU
188 slu->SetPrintStatistics(print_lvl != 0);
192#ifdef MFEM_USE_STRUMPACK
195 sp->SetPrintFactorStatistics(print_lvl != 0);
196 sp->SetPrintSolveStatistics(print_lvl != 0);
200#ifdef MFEM_USE_MKL_CPARDISO
203 pardiso->SetPrintLevel(print_lvl);
MKL Parallel Direct Sparse Solver for Clusters.
MUMPS: A Parallel Sparse Direct Solver.
Wrapper around parallel sparse direct solvers (MUMPS, SuperLU_DIST, STRUMPACK, CPARDISO).
Type
Type of parallel direct solver to use.
ParallelDirectSolver(MPI_Comm comm_, Type type_=Type::AUTO)
Construct a ParallelDirectSolver from an MPI communicator and a Type.
virtual void SetPrintLevel(int print_lvl)
virtual void Mult(const Vector &x, Vector &y) const override
Apply the inverse of the operator: y = A^{-1} x.
virtual void SetOperator(const Operator &op) override
Set the operator to be factored/solved by the direct solver.