58int main(
int argc,
char *argv[])
67 const char *mesh_file =
"../data/star.mesh";
68 int ser_ref_levels = 2;
69 int par_ref_levels = 1;
73 bool slu_solver =
false;
74 bool sp_solver =
false;
75 bool cpardiso_solver =
false;
76 bool visualization = 1;
79 args.
AddOption(&mesh_file,
"-m",
"--mesh",
81 args.
AddOption(&ser_ref_levels,
"-rs",
"--refine-serial",
82 "Number of times to refine the mesh uniformly in serial.");
83 args.
AddOption(&par_ref_levels,
"-rp",
"--refine-parallel",
84 "Number of times to refine the mesh uniformly in parallel.");
86 "Finite element order (polynomial degree) or -1 for"
87 " isoparametric space.");
89 "Number of desired eigenmodes.");
91 "Random seed used to initialize LOBPCG.");
92#ifdef MFEM_USE_SUPERLU
93 args.
AddOption(&slu_solver,
"-slu",
"--superlu",
"-no-slu",
94 "--no-superlu",
"Use the SuperLU Solver.");
96#ifdef MFEM_USE_STRUMPACK
97 args.
AddOption(&sp_solver,
"-sp",
"--strumpack",
"-no-sp",
98 "--no-strumpack",
"Use the STRUMPACK Solver.");
100#ifdef MFEM_USE_MKL_CPARDISO
101 args.
AddOption(&cpardiso_solver,
"-cpardiso",
"--cpardiso",
"-no-cpardiso",
102 "--no-cpardiso",
"Use the MKL CPardiso Solver.");
104 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
105 "--no-visualization",
106 "Enable or disable GLVis visualization.");
108 if (slu_solver && sp_solver)
111 cout <<
"WARNING: Both SuperLU and STRUMPACK have been selected,"
112 <<
" please choose either one." << endl
113 <<
" Defaulting to SuperLU." << endl;
137 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
143 for (
int lev = 0; lev < ser_ref_levels; lev++)
154 for (
int lev = 0; lev < par_ref_levels; lev++)
179 cout <<
"Number of unknowns: " << size << endl;
207 a->EliminateEssentialBCDiag(ess_bdr, 1.0);
220#if defined(MFEM_USE_SUPERLU) || defined(MFEM_USE_STRUMPACK)
222#ifdef MFEM_USE_SUPERLU
228#ifdef MFEM_USE_STRUMPACK
243 if (!slu_solver && !sp_solver && !cpardiso_solver)
251#ifdef MFEM_USE_SUPERLU
262#ifdef MFEM_USE_STRUMPACK
270 strumpack->
SetMatching(strumpack::MatchingJob::NONE);
277#ifdef MFEM_USE_MKL_CPARDISO
281 cpardiso->SetMatrixType(CPardisoSolver::MatType::REAL_STRUCTURE_SYMMETRIC);
282 cpardiso->SetPrintLevel(1);
283 cpardiso->SetOperator(*A);
311 ostringstream mesh_name, mode_name;
312 mesh_name <<
"mesh." << setfill(
'0') << setw(6) << myid;
314 ofstream mesh_ofs(mesh_name.str().c_str());
315 mesh_ofs.precision(8);
316 pmesh->
Print(mesh_ofs);
318 for (
int i=0; i<nev; i++)
323 mode_name <<
"mode_" << setfill(
'0') << setw(2) << i <<
"."
324 << setfill(
'0') << setw(6) << myid;
326 ofstream mode_ofs(mode_name.str().c_str());
327 mode_ofs.precision(8);
339 mode_sock.precision(8);
341 for (
int i=0; i<nev; i++)
345 cout <<
"Eigenmode " << i+1 <<
'/' << nev
346 <<
", Lambda = " << eigenvalues[i] << endl;
352 mode_sock <<
"parallel " << num_procs <<
" " << myid <<
"\n"
353 <<
"solution\n" << *pmesh << x << flush
354 <<
"window_title 'Eigenmode " << i+1 <<
'/' << nev
355 <<
", Lambda = " << eigenvalues[i] <<
"'" << endl;
360 cout <<
"press (q)uit or (c)ontinue --> " << flush;
363 MPI_Bcast(&c, 1, MPI_CHAR, 0, MPI_COMM_WORLD);
378#if defined(MFEM_USE_SUPERLU) || defined(MFEM_USE_STRUMPACK)
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
void SetSize(int nsize)
Change the logical size of the array, keep existing entries.
int Size() const
Return the logical size of the array.
MKL Parallel Direct Sparse Solver for Clusters.
A coefficient that is constant across space and time.
Collection of finite elements from the same family in multiple dimensions. This class is used to matc...
Arbitrary order H1-conforming (continuous) finite elements.
The BoomerAMG solver in hypre.
void SetPrintLevel(int print_level)
void SetMassMatrix(Operator &M)
void SetPrintLevel(int logging)
void SetPreconditioner(Solver &precond)
void GetEigenvalues(Array< real_t > &eigenvalues) const
Collect the converged eigenvalues.
void SetOperator(Operator &A)
void SetNumModes(int num_eigs)
void Solve()
Solve the eigenproblem.
void SetPrecondUsageMode(int pcg_mode)
void SetRandomSeed(int s)
void SetMaxIter(int max_iter)
const HypreParVector & GetEigenvector(unsigned int i) const
Extract a single eigenvector.
Wrapper for hypre's ParCSR matrix class.
MPI_Comm GetComm() const
MPI communicator.
static void Init()
Initialize hypre by calling HYPRE_Init() and set default options. After calling Hypre::Init(),...
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
int Dimension() const
Dimension of the reference space used within the elements.
void GetNodes(Vector &node_coord) const
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
static int WorldRank()
Return the MPI rank in MPI_COMM_WORLD.
static int WorldSize()
Return the size of MPI_COMM_WORLD.
static void Init(int &argc, char **&argv, int required=default_thread_required, int *provided=nullptr)
Singleton creation with Mpi::Init(argc, argv).
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
void PrintUsage(std::ostream &out) const
Print the usage message.
void PrintOptions(std::ostream &out) const
Print the options.
void AddOption(bool *var, const char *enable_short_name, const char *enable_long_name, const char *disable_short_name, const char *disable_long_name, const char *description, bool required=false)
Add a boolean option and set 'var' to receive the value. Enable/disable tags are used to set the bool...
bool Good() const
Return true if the command line options were parsed successfully.
Abstract parallel finite element space.
HYPRE_BigInt GlobalTrueVSize() const
Class for parallel grid function.
void Save(std::ostream &out) const override
Class for parallel meshes.
void Print(std::ostream &out=mfem::out, const std::string &comments="") const override
void SetOperator(const Operator &op)
Set the operator/matrix.
void SetMatching(strumpack::MatchingJob job)
Configure static pivoting for stability.
void SetCompression(strumpack::CompressionType type)
Select compression for sparse data types.
void SetPrintFactorStatistics(bool print_stat)
Set up verbose printing during the factor step.
void SetKrylovSolver(strumpack::KrylovSolver method)
Set the Krylov solver method to use.
void SetFromCommandLine()
Set options that were captured from the command line.
void SetPrintSolveStatistics(bool print_stat)
Set up verbose printing during the solve step.
void SetReorderingStrategy(strumpack::ReorderingStrategy method)
Set matrix reordering strategy.
void SetColumnPermutation(superlu::ColPerm col_perm)
Specify how to permute the columns of the matrix.
void SetSymmetricPattern(bool sym)
Specify whether the matrix has a symmetric pattern to avoid extra work (default false)
void SetOperator(const Operator &op)
Set the operator/matrix.
void SetPrintStatistics(bool print_stat)
Specify whether to print the solver statistics (default true)
int close()
Close the socketstream.
@ PARMETIS
Sequential ordering on structure of using the PARMETIS package.