71 int main(
int argc,
char *argv[])
75 const char *mesh_file =
"../../data/star.mesh";
76 int ser_ref_levels = 1, par_ref_levels = 1;
79 bool visualization =
true;
82 args.
AddOption(&mesh_file,
"-m",
"--mesh",
"Mesh file to use.");
83 args.
AddOption(&ser_ref_levels,
"-rs",
"--refine-serial",
84 "Number of times to refine the mesh uniformly in serial.");
85 args.
AddOption(&par_ref_levels,
"-rp",
"--refine-parallel",
86 "Number of times to refine the mesh uniformly in parallel.");
87 args.
AddOption(&order,
"-o",
"--order",
"Polynomial degree.");
89 "FE type. h for H1, n for Hcurl, r for Hdiv, l for L2");
90 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
92 "Enable or disable GLVis visualization.");
95 bool H1 =
false, ND =
false, RT =
false, L2 =
false;
96 if (
string(fe) ==
"h") { H1 =
true; }
97 else if (
string(fe) ==
"n") { ND =
true; }
98 else if (
string(fe) ==
"r") { RT =
true; }
99 else if (
string(fe) ==
"l") { L2 =
true; }
100 else { MFEM_ABORT(
"Bad FE type. Must be 'h', 'n', 'r', or 'l'."); }
103 double kappa = (order+1)*(order+1);
105 Mesh serial_mesh(mesh_file, 1, 1);
107 MFEM_VERIFY(dim == 2 || dim == 3,
"Spatial dimension must be 2 or 3.");
109 ParMesh mesh(MPI_COMM_WORLD, serial_mesh);
113 if (mesh.
ncmesh && (RT || ND))
114 { MFEM_ABORT(
"LOR AMS and ADS solvers are not supported with AMR meshes."); }
119 int b1 = BasisType::GaussLobatto, b2 = BasisType::IntegratedGLL;
120 unique_ptr<FiniteElementCollection> fec;
128 if (mpi.
Root()) { cout <<
"Number of DOFs: " << ndofs << endl; }
132 if (!L2) { fes.GetBoundaryTrueDofs(ess_dofs); }
177 unique_ptr<Solver> solv_lor;
182 else if (RT && dim == 3)
204 if (mpi.
Root()) { cout <<
"L2 error: " << er << endl; }
Class for domain integration L(v) := (f, v)
Conjugate gradient method.
Create and assemble a low-order refined version of a ParBilinearForm.
void SetCycle(int c)
Set time cycle (for time-dependent simulations)
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
Helper class for ParaView visualization data.
Integrator for (curl u, curl v) for Nedelec elements.
Pointer to an Operator of a specified type.
HYPRE_BigInt GlobalTrueVSize() const
virtual void Save(std::ostream &out) const
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...
virtual void Save(const char *fname, int precision=16) const
(Q div u, div v) for RT elements
A simple convenience class that calls MPI_Init() at construction and MPI_Finalize() at destruction...
virtual void RegisterField(const std::string &field_name, GridFunction *gf)
Add a grid function to the collection.
void SetPrintLevel(int print_lvl)
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
void SetMaxIter(int max_it)
void u_vec(const Vector &xvec, Vector &u)
bool Root() const
Return true if WorldRank() == 0.
void SetHighOrderOutput(bool high_order_output_)
void SetTime(double t)
Set physical time (for time-dependent simulations)
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
A general vector function coefficient.
void SetAbsTol(double atol)
void SetRelTol(double rtol)
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...
virtual double ComputeL2Error(Coefficient *exsol[], const IntegrationRule *irs[]=NULL) const
ParFiniteElementSpace & GetParFESpace() const
Return the LOR ParFiniteElementSpace.
NCMesh * ncmesh
Optional non-conforming mesh extension.
void SetLevelsOfDetail(int levels_of_detail_)
void Clear()
Clear the contents of the Mesh.
for VectorFiniteElements (Nedelec, Raviart-Thomas)
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
A general function coefficient.
Arbitrary order H(curl)-conforming Nedelec finite elements.
void f_vec(const Vector &xvec, Vector &f)
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
Arbitrary order H1-conforming (continuous) finite elements.
virtual void Save() override
double u(const Vector &xvec)
Class for parallel grid function.
Class for parallel meshes.
void ParseCheck(std::ostream &out=mfem::out)
void SetPrefixPath(const std::string &prefix)
Set the path where the DataCollection will be saved.
Represents a solver of type SolverType created using the low-order refined version of the given Bilin...
Arbitrary order "L2-conforming" discontinuous finite elements.
double f(const Vector &p)