12 #include "../config/config.hpp"
14 #ifdef MFEM_USE_STRUMPACK
20 using namespace strumpack;
25 STRUMPACKRowLocMatrix::STRUMPACKRowLocMatrix(MPI_Comm comm,
26 int num_loc_rows,
int first_loc_row,
27 int glob_nrows,
int glob_ncols,
28 int *I,
int *J,
double *data)
29 : comm_(comm), A_(NULL)
37 MPI_Comm_rank(comm_, &rank);
38 MPI_Comm_size(comm_, &nprocs);
39 int * dist =
new int[nprocs + 1];
40 dist[rank + 1] = first_loc_row + num_loc_rows;
42 MPI_Allgather(MPI_IN_PLACE, 0, MPI_INT, dist + 1, 1, MPI_INT, comm_);
43 A_ =
new CSRMatrixMPI<double,int>(num_loc_rows, I, J, data, dist, comm_,
false);
48 : comm_(hypParMat.GetComm()),
52 hypre_ParCSRMatrix * parcsr_op =
53 (hypre_ParCSRMatrix *)const_cast<HypreParMatrix&>(hypParMat);
55 MFEM_ASSERT(parcsr_op != NULL,
"STRUMPACK: const_cast failed in SetOperator");
59 hypre_CSRMatrix * csr_op = hypre_MergeDiagAndOffd(parcsr_op);
60 hypre_CSRMatrixSetDataOwner(csr_op,0);
63 width = csr_op->num_rows;
66 MPI_Comm_rank(comm_, &rank);
67 MPI_Comm_size(comm_, &nprocs);
68 int * dist =
new int[nprocs + 1];
69 dist[rank + 1] = parcsr_op->first_row_index + csr_op->num_rows;
71 MPI_Allgather(MPI_IN_PLACE, 0, MPI_INT, dist + 1, 1, MPI_INT, comm_);
72 A_ =
new CSRMatrixMPI<double,int>(csr_op->num_rows, csr_op->i, csr_op->j,
73 csr_op->data, dist, comm_,
false);
77 hypre_CSRMatrixDestroy(csr_op);
83 if ( A_ != NULL ) {
delete A_; }
91 this->
Init(argc, argv);
110 void STRUMPACKSolver::Init(
int argc,
char* argv[] )
118 solver_ =
new StrumpackSparseSolverMPIDist<double,int>(
comm_, argc, argv,
124 solver_->options().set_from_command_line( );
139 solver_->options().set_Krylov_solver( method );
145 solver_->options().set_reordering_method( method );
150 #if STRUMPACK_VERSION_MAJOR >= 3
151 solver_->options().set_matching( strumpack::MatchingJob::NONE );
153 solver_->options().set_mc64job( strumpack::MC64Job::NONE );
159 #if STRUMPACK_VERSION_MAJOR >= 3
160 solver_->options().set_matching
161 ( strumpack::MatchingJob::MAX_DIAGONAL_PRODUCT_SCALING );
164 ( strumpack::MC64Job::MAX_DIAGONAL_PRODUCT_SCALING );
168 #if STRUMPACK_VERSION_MAJOR >= 3
171 solver_->options().set_matching
172 ( strumpack::MatchingJob::COMBBLAS );
178 solver_->options().set_rel_tol( rtol );
183 solver_->options().set_abs_tol( atol );
189 MFEM_ASSERT(
APtr_ != NULL,
190 "STRUMPACK Error: The operator must be set before"
191 " the system can be solved.");
192 MFEM_ASSERT(x.
Size() ==
Width(),
"invalid x.Size() = " << x.
Size()
193 <<
", expected size = " <<
Width());
194 MFEM_ASSERT(y.
Size() ==
Height(),
"invalid y.Size() = " << y.
Size()
195 <<
", expected size = " <<
Height());
197 double* yPtr = (
double*)y;
198 double* xPtr = (
double*)(const_cast<Vector&>(x));
201 ReturnCode ret =
solver_->factor();
204 case ReturnCode::SUCCESS:
break;
205 case ReturnCode::MATRIX_NOT_SET:
207 MFEM_ABORT(
"STRUMPACK: Matrix was not set!");
210 case ReturnCode::REORDERING_ERROR:
212 MFEM_ABORT(
"STRUMPACK: Matrix reordering failed!");
227 mfem_error(
"STRUMPACKSolver::SetOperator : not STRUMPACKRowLocMatrix!");
240 #endif // MFEM_USE_MPI
241 #endif // MFEM_USE_STRUMPACK
const STRUMPACKRowLocMatrix * APtr_
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
STRUMPACKSolver(int argc, char *argv[], MPI_Comm comm)
int Size() const
Returns the size of the vector.
strumpack::StrumpackSparseSolverMPIDist< double, int > * solver_
void SetFromCommandLine()
strumpack::CSRMatrixMPI< double, int > * getA() const
void SetPrintFactorStatistics(bool print_stat)
STRUMPACKRowLocMatrix(MPI_Comm comm, int num_loc_rows, int first_loc_row, int glob_nrows, int glob_ncols, int *I, int *J, double *data)
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
void mfem_error(const char *msg)
Function called when an error is encountered. Used by the macros MFEM_ABORT, MFEM_ASSERT, MFEM_VERIFY.
void SetPrintSolveStatistics(bool print_stat)
void SetReorderingStrategy(strumpack::ReorderingStrategy method)
void SetRelTol(double rtol)
A class to initialize the size of a Tensor.
int height
Dimension of the output / number of rows in the matrix.
void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
void SetKrylovSolver(strumpack::KrylovSolver method)
void SetAbsTol(double atol)
void SetOperator(const Operator &op)
Set/update the solver for the given operator.
Wrapper for hypre's ParCSR matrix class.
int width
Dimension of the input / number of columns in the matrix.
void EnableParallelMatching()