33 #ifndef MFEM_USE_PETSC
34 #error This example requires that MFEM is built with MFEM_USE_PETSC=YES
46 int main(
int argc,
char *argv[])
50 MPI_Init(&argc, &argv);
51 MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
52 MPI_Comm_rank(MPI_COMM_WORLD, &myid);
55 const char *mesh_file =
"../../data/beam-tet.mesh";
57 bool static_cond =
false;
58 bool visualization = 1;
59 bool use_petsc =
true;
60 const char *petscrc_file =
"";
61 bool use_nonoverlapping =
false;
64 args.
AddOption(&mesh_file,
"-m",
"--mesh",
67 "Finite element order (polynomial degree).");
68 args.
AddOption(&
freq,
"-f",
"--frequency",
"Set the frequency for the exact"
70 args.
AddOption(&static_cond,
"-sc",
"--static-condensation",
"-no-sc",
71 "--no-static-condensation",
"Enable static condensation.");
72 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
74 "Enable or disable GLVis visualization.");
75 args.
AddOption(&use_petsc,
"-usepetsc",
"--usepetsc",
"-no-petsc",
77 "Use or not PETSc to solve the linear system.");
78 args.
AddOption(&petscrc_file,
"-petscopts",
"--petscopts",
79 "PetscOptions file to use.");
80 args.
AddOption(&use_nonoverlapping,
"-nonoverlapping",
"--nonoverlapping",
81 "-no-nonoverlapping",
"--no-nonoverlapping",
82 "Use or not the block diagonal PETSc's matrix format "
83 "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++)
130 int par_ref_levels = 2;
131 for (
int l = 0; l < par_ref_levels; l++)
145 cout <<
"Number of finite element unknowns: " << size << endl;
223 Operator::PETSC_MATIS : Operator::PETSC_MATAIJ);
228 cout <<
"Size of linear system: " << A.
M() << endl;
239 if (use_nonoverlapping)
271 cout <<
"\n|| E_h - E ||_{L^2} = " << err <<
'\n' << endl;
278 ostringstream mesh_name, sol_name;
279 mesh_name <<
"mesh." << setfill(
'0') << setw(6) << myid;
280 sol_name <<
"sol." << setfill(
'0') << setw(6) << myid;
282 ofstream mesh_ofs(mesh_name.str().c_str());
283 mesh_ofs.precision(8);
284 pmesh->
Print(mesh_ofs);
286 ofstream sol_ofs(sol_name.str().c_str());
287 sol_ofs.precision(8);
297 sol_sock <<
"parallel " << num_procs <<
" " << myid <<
"\n";
298 sol_sock.precision(8);
299 sol_sock <<
"solution\n" << *pmesh << x << flush;
324 E(0) = sin(
kappa * x(1));
325 E(1) = sin(
kappa * x(2));
326 E(2) = sin(
kappa * x(0));
330 E(0) = sin(
kappa * x(1));
331 E(1) = sin(
kappa * x(0));
332 if (x.
Size() == 3) { E(2) = 0.0; }
348 if (x.
Size() == 3) {
f(2) = 0.0; }
int Size() const
Return the logical size of the array.
void SetPreconditioner(Solver &precond)
void SetPrintLevel(int plev)
virtual void GetEssentialTrueDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list, int component=-1)
The Auxiliary-space Maxwell Solver in hypre.
Abstract class for PETSc's preconditioners.
A coefficient that is constant across space and time.
Wrapper for PETSc's matrix class.
virtual void ReorientTetMesh()
See the remarks for the serial version in mesh.hpp.
Integrator for (curl u, curl v) for Nedelec elements.
int Size() const
Returns the size of the vector.
int GetNE() const
Returns number of elements.
virtual void Save(std::ostream &out) const
Abstract parallel finite element space.
virtual void ProjectCoefficient(Coefficient &coeff)
void SetMaxIter(int max_iter)
int main(int argc, char *argv[])
void SetPrintLevel(int print_lvl)
PetscInt M() const
Returns the global number of rows.
HYPRE_Int GetGlobalNumRows() const
Return the global number of rows.
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.
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
HYPRE_Int GlobalTrueVSize() const
virtual void Print(std::ostream &out=mfem::out) const
void PrintUsage(std::ostream &out) const
Print the usage message.
void SetMaxIter(int max_iter)
A general vector function coefficient.
int SpaceDimension() const
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
OutStream err(std::cerr)
Global stream used by the library for standard error output. Initially it uses the same std::streambu...
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...
void f_exact(const Vector &, Vector &)
virtual double ComputeL2Error(Coefficient *exsol[], const IntegrationRule *irs[]=NULL) const
void MFEMInitializePetsc()
Convenience functions to initialize/finalize PETSc.
void SetSpace(ParFiniteElementSpace *fe)
void SetPreconditioner(HypreSolver &precond)
Set the hypre solver to be used as a preconditioner.
void PrintOptions(std::ostream &out) const
Print the options.
void E_exact(const Vector &, Vector &)
Abstract class for hypre's solvers and preconditioners.
for VectorFiniteElements (Nedelec, Raviart-Thomas)
Arbitrary order H(curl)-conforming Nedelec finite elements.
Class for parallel grid function.
Wrapper for hypre's ParCSR matrix class.
virtual void Mult(const HypreParVector &b, HypreParVector &x) const
Solve Ax=b with hypre's PCG.
virtual void Mult(const Vector &b, Vector &x) const
Application of the solver.
Class for parallel meshes.
void SetEssBdrDofs(const Array< int > *essdofs, bool loc=false)
Specify dofs on the essential boundary.
double f(const Vector &p)
double sigma(const Vector &x)
bool Good() const
Return true if the command line options were parsed successfully.