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.");
99 if (use_petsc) { PetscInitialize(NULL,NULL,petscrc_file,NULL); }
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);
294 char vishost[] =
"localhost";
297 sol_sock <<
"parallel " << num_procs <<
" " << myid <<
"\n";
298 sol_sock.precision(8);
299 sol_sock <<
"solution\n" << *pmesh << x << flush;
312 if (use_petsc) { PetscFinalize(); }
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
Logical size of the array.
void SetPreconditioner(Solver &precond)
Sets the solver to perform preconditioning.
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.
Subclass constant coefficient.
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)
void SetPrintLevel(int print_lvl)
PetscInt M() const
Returns the global number of rows.
HYPRE_Int GetGlobalNumRows() const
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
void SetMaxIter(int max_iter)
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 Coefficient that may optionally depend on time.
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)
void f_exact(const Vector &, Vector &)
virtual double ComputeL2Error(Coefficient *exsol[], const IntegrationRule *irs[]=NULL) const
void SetSpace(ParFiniteElementSpace *fe)
void SetPreconditioner(HypreSolver &precond)
Set the hypre solver to be used as a preconditioner.
void PrintOptions(std::ostream &out) const
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.
Integrator for (Q u, v) for VectorFiniteElements.