29 #ifndef MFEM_USE_PETSC 30 #error This example requires that MFEM is built with MFEM_USE_PETSC=YES 41 int main(
int argc,
char *argv[])
44 Mpi::Init(argc, argv);
45 int num_procs = Mpi::WorldSize();
46 int myid = Mpi::WorldRank();
50 const char *mesh_file =
"../../data/star.mesh";
53 bool static_cond =
false;
54 bool hybridization =
false;
55 bool visualization = 1;
56 bool use_petsc =
true;
57 const char *petscrc_file =
"";
58 bool use_nonoverlapping =
false;
61 args.
AddOption(&mesh_file,
"-m",
"--mesh",
64 "Finite element order (polynomial degree).");
65 args.
AddOption(&set_bc,
"-bc",
"--impose-bc",
"-no-bc",
"--dont-impose-bc",
66 "Impose or not essential boundary conditions.");
67 args.
AddOption(&
freq,
"-f",
"--frequency",
"Set the frequency for the exact" 69 args.
AddOption(&static_cond,
"-sc",
"--static-condensation",
"-no-sc",
70 "--no-static-condensation",
"Enable static condensation.");
71 args.
AddOption(&hybridization,
"-hb",
"--hybridization",
"-no-hb",
72 "--no-hybridization",
"Enable hybridization.");
73 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
75 "Enable or disable GLVis visualization.");
76 args.
AddOption(&use_petsc,
"-usepetsc",
"--usepetsc",
"-no-petsc",
78 "Use or not PETSc to solve the linear system.");
79 args.
AddOption(&petscrc_file,
"-petscopts",
"--petscopts",
80 "PetscOptions file to use.");
81 args.
AddOption(&use_nonoverlapping,
"-nonoverlapping",
"--nonoverlapping",
82 "-no-nonoverlapping",
"--no-nonoverlapping",
83 "Use or not the block diagonal PETSc's matrix format " 84 "for non-overlapping domain decomposition.");
105 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
115 (int)floor(log(1000./mesh->
GetNE())/log(2.)/
dim);
116 for (
int l = 0; l < ref_levels; l++)
128 int par_ref_levels = 2;
129 for (
int l = 0; l < par_ref_levels; l++)
142 cout <<
"Number of finite element unknowns: " << size << endl;
153 ess_bdr = set_bc ? 1 : 0;
193 a->EnableStaticCondensation();
195 else if (hybridization)
213 a->FormLinearSystem(ess_tdof_list, x, *
b, A, X, B);
218 cout <<
"Size of linear system: " << glob_size << endl;
230 (
a->StaticCondensationIsEnabled() ?
a->SCParFESpace() : fespace);
231 if (
dim == 2) { prec =
new HypreAMS(A, prec_fespace); }
232 else { prec =
new HypreADS(A, prec_fespace); }
242 a->SetOperatorType(use_nonoverlapping ?
243 Operator::PETSC_MATIS : Operator::PETSC_MATAIJ);
244 a->FormLinearSystem(ess_tdof_list, x, *
b, A, X, B);
248 cout <<
"Size of linear system: " << A.
M() << endl;
252 if (use_nonoverlapping)
255 (
a->StaticCondensationIsEnabled() ?
a->SCParFESpace() : fespace);
279 a->RecoverFEMSolution(X, *
b, x);
286 cout <<
"\n|| F_h - F ||_{L^2} = " <<
err <<
'\n' << endl;
293 ostringstream mesh_name, sol_name;
294 mesh_name <<
"mesh." << setfill(
'0') << setw(6) << myid;
295 sol_name <<
"sol." << setfill(
'0') << setw(6) << myid;
297 ofstream mesh_ofs(mesh_name.str().c_str());
298 mesh_ofs.precision(8);
299 pmesh->
Print(mesh_ofs);
301 ofstream sol_ofs(sol_name.str().c_str());
302 sol_ofs.precision(8);
312 sol_sock <<
"parallel " << num_procs <<
" " << myid <<
"\n";
313 sol_sock.precision(8);
314 sol_sock <<
"solution\n" << *pmesh << x << flush;
virtual void GetEssentialTrueDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list, int component=-1)
Conjugate gradient method.
The Auxiliary-space Maxwell Solver in hypre.
Abstract class for PETSc's preconditioners.
The Auxiliary-space Divergence Solver in hypre.
OutStream err(std::cerr)
Global stream used by the library for standard error output. Initially it uses the same std::streambu...
A coefficient that is constant across space and time.
void PrintOptions(std::ostream &out) const
Print the options.
Wrapper for PETSc's matrix class.
void f_exact(const Vector &, Vector &)
void PrintUsage(std::ostream &out) const
Print the usage message.
int main(int argc, char *argv[])
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
bool Good() const
Return true if the command line options were parsed successfully.
Abstract parallel finite element space.
virtual void ProjectCoefficient(Coefficient &coeff)
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
PetscInt M() const
Returns the global number of rows.
(Q div u, div v) for RT elements
void F_exact(const Vector &, Vector &)
The BoomerAMG solver in hypre.
virtual void SetPrintLevel(int print_lvl)
Legacy method to set the level of verbosity of the solver output.
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
Auxiliary class for BDDC customization.
void SetMaxIter(int max_it)
virtual double ComputeL2Error(Coefficient *exsol[], const IntegrationRule *irs[]=NULL, const Array< int > *elems=NULL) const
HYPRE_BigInt GlobalTrueVSize() const
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
A general vector function coefficient.
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
double p(const Vector &x, double t)
void SetRelTol(double rtol)
Base class Coefficients that optionally depend on space and time. These are used by the BilinearFormI...
Collection of finite elements from the same family in multiple dimensions. This class is used to matc...
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...
int SpaceDimension() const
virtual void Save(std::ostream &out) const
int GetNE() const
Returns number of elements.
void MFEMInitializePetsc()
Convenience functions to initialize/finalize PETSc.
void SetSpace(ParFiniteElementSpace *fe)
Abstract class for hypre's solvers and preconditioners.
int Size() const
Return the logical size of the array.
for VectorFiniteElements (Nedelec, Raviart-Thomas)
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
void Print(std::ostream &out=mfem::out) const override
Class for parallel grid function.
Wrapper for hypre's ParCSR matrix class.
Class for parallel meshes.
void SetEssBdrDofs(const Array< int > *essdofs, bool loc=false)
Specify dofs on the essential boundary.
HYPRE_BigInt GetGlobalNumRows() const
Return the global number of rows.
double f(const Vector &p)