56 int main(
int argc,
char *argv[])
59 Mpi::Init(argc, argv);
60 int num_procs = Mpi::WorldSize();
61 int myid = Mpi::WorldRank();
65 const char *mesh_file =
"../data/beam-hex.mesh";
68 bool static_cond =
false;
70 const char *device_config =
"cpu";
71 bool visualization = 1;
74 args.
AddOption(&mesh_file,
"-m",
"--mesh",
77 "Finite element order (polynomial degree).");
78 args.
AddOption(&prob,
"-p",
"--problem-type",
79 "Choose between 0: grad, 1: curl, 2: div");
80 args.
AddOption(&static_cond,
"-sc",
"--static-condensation",
"-no-sc",
81 "--no-static-condensation",
"Enable static condensation.");
82 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
83 "--no-partial-assembly",
"Enable Partial Assembly.");
84 args.
AddOption(&device_config,
"-d",
"--device",
85 "Device configuration string, see Device::Configure().");
86 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
88 "Enable or disable GLVis visualization.");
107 Device device(device_config);
108 if (myid == 0) { device.
Print(); }
113 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
122 int ref_levels = (int)floor(log(1000./mesh->
GetNE())/log(2.)/
dim);
123 for (
int l = 0; l < ref_levels; l++)
137 int par_ref_levels = 1;
138 for (
int l = 0; l < par_ref_levels; l++)
175 cout <<
"Number of Nedelec finite element unknowns: " << test_size << endl;
176 cout <<
"Number of H1 finite element unknowns: " << trial_size << endl;
180 cout <<
"Number of Nedelec finite element unknowns: " << trial_size << endl;
181 cout <<
"Number of Raviart-Thomas finite element unknowns: " << test_size <<
186 cout <<
"Number of Raviart-Thomas finite element unknowns: "
187 << trial_size << endl;
188 cout <<
"Number of L2 finite element unknowns: " << test_size << endl;
263 a_mixed.
Mult(gftrial, b);
332 dlo.
Mult(gftrial, discreteInterpolant);
356 double errInterp = discreteInterpolant.
ComputeL2Error(gradp_coef);
361 cout <<
"\n Solution of (E_h,v) = (grad p_h,v) for E_h and v in H(curl)"
362 ": || E_h - grad p ||_{L_2} = " << errSol <<
'\n' << endl;
363 cout <<
" Gradient interpolant E_h = grad p_h in H(curl): || E_h - grad"
364 " p ||_{L_2} = " << errInterp <<
'\n' << endl;
365 cout <<
" Projection E_h of exact grad p in H(curl): || E_h - grad p "
366 "||_{L_2} = " << errProj <<
'\n' << endl;
372 double errInterp = discreteInterpolant.
ComputeL2Error(curlv_coef);
377 cout <<
"\n Solution of (E_h,w) = (curl v_h,w) for E_h and w in "
378 "H(div): || E_h - curl v ||_{L_2} = " << errSol <<
'\n' << endl;
379 cout <<
" Curl interpolant E_h = curl v_h in H(div): || E_h - curl v "
380 "||_{L_2} = " << errInterp <<
'\n' << endl;
381 cout <<
" Projection E_h of exact curl v in H(div): || E_h - curl v "
382 "||_{L_2} = " << errProj <<
'\n' << endl;
387 int order_quad = max(2, 2*order+1);
389 for (
int i=0; i < Geometry::NumGeom; ++i)
395 double errInterp = discreteInterpolant.
ComputeL2Error(divgradp_coef, irs);
400 cout <<
"\n Solution of (f_h,q) = (div v_h,q) for f_h and q in L_2: "
401 "|| f_h - div v ||_{L_2} = " << errSol <<
'\n' << endl;
402 cout <<
" Divergence interpolant f_h = div v_h in L_2: || f_h - div v"
403 " ||_{L_2} = " << errInterp <<
'\n' << endl;
404 cout <<
" Projection f_h of exact div v in L_2: || f_h - div v "
405 "||_{L_2} = " << errProj <<
'\n' << endl;
412 ostringstream mesh_name, sol_name;
413 mesh_name <<
"mesh." << setfill(
'0') << setw(6) << myid;
414 sol_name <<
"sol." << setfill(
'0') << setw(6) << myid;
416 ofstream mesh_ofs(mesh_name.str().c_str());
417 mesh_ofs.precision(8);
418 pmesh->
Print(mesh_ofs);
420 ofstream sol_ofs(sol_name.str().c_str());
421 sol_ofs.precision(8);
431 sol_sock <<
"parallel " << num_procs <<
" " << myid <<
"\n";
432 sol_sock.precision(8);
433 sol_sock <<
"solution\n" << *pmesh << x << flush;
448 return sin(x(0)) * sin(x(1)) * sin(x(2));
452 return sin(x(0)) * sin(x(1));
462 f(0) = cos(x(0)) * sin(x(1)) * sin(x(2));
463 f(1) = sin(x(0)) * cos(x(1)) * sin(x(2));
464 f(2) = sin(x(0)) * sin(x(1)) * cos(x(2));
468 f(0) = cos(x(0)) * sin(x(1));
469 f(1) = sin(x(0)) * cos(x(1));
470 if (x.
Size() == 3) {
f(2) = 0.0; }
478 return -3.0 * sin(x(0)) * sin(x(1)) * sin(x(2));
482 return -2.0 * sin(x(0)) * sin(x(1));
492 v(0) = sin(
kappa * x(1));
493 v(1) = sin(
kappa * x(2));
494 v(2) = sin(
kappa * x(0));
498 v(0) = sin(
kappa * x(1));
499 v(1) = sin(
kappa * x(0));
500 if (x.
Size() == 3) { v(2) = 0.0; }
Conjugate gradient method.
Class for an integration rule - an Array of IntegrationPoint.
const IntegrationRule & Get(int GeomType, int Order)
Returns an integration rule for given GeomType and Order.
void SetFromTrueVector()
Shortcut for calling SetFromTrueDofs() with GetTrueVector() as argument.
A coefficient that is constant across space and time.
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
Pointer to an Operator of a specified type.
HYPRE_BigInt GlobalTrueVSize() const
int Size() const
Returns the size of the vector.
int GetNE() const
Returns number of elements.
virtual void Save(std::ostream &out) const
void Print(std::ostream &out=mfem::out)
Print the configuration of the MFEM virtual device object.
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...
void SetPrintLevel(int print_lvl)
void AddDomainInterpolator(DiscreteInterpolator *di)
Adds a domain interpolator. Assumes ownership of di.
virtual int GetTrueVSize() const
Return the number of local vector true dofs.
void SetTrueVector()
Shortcut for calling GetTrueDofs() with GetTrueVector() as argument.
virtual void SetPrintLevel(int print_lvl)
Legacy method to set the level of verbosity of the solver output.
virtual void SetFromTrueDofs(const Vector &tv)
Set the GridFunction from the given true-dof vector.
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
void curlv_exact(const Vector &x, Vector &cv)
Jacobi preconditioner in hypre.
Jacobi smoothing for a given bilinear form (no matrix necessary).
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
void SetMaxIter(int max_it)
virtual double ComputeL2Error(Coefficient *exsol[], const IntegrationRule *irs[]=NULL, const Array< int > *elems=NULL) const
void v_exact(const Vector &x, Vector &v)
void PrintUsage(std::ostream &out) const
Print the usage message.
void SetMaxIter(int max_iter)
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
double p_exact(const Vector &x)
A general vector function coefficient.
int SpaceDimension() const
void SetRelTol(double rtol)
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 SetPreconditioner(HypreSolver &precond)
Set the hypre solver to be used as a preconditioner.
void PrintOptions(std::ostream &out) const
Print the options.
HypreParVector * GetTrueDofs() const
Returns the true dofs in a new HypreParVector.
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.
double div_gradp_exact(const Vector &x)
HYPRE_Int Mult(HypreParVector &x, HypreParVector &y, double alpha=1.0, double beta=0.0) const
Computes y = alpha * A * x + beta * y.
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
Arbitrary order H1-conforming (continuous) finite elements.
void Print(std::ostream &out=mfem::out) const override
Class for parallel grid function.
The MFEM Device class abstracts hardware devices such as GPUs, as well as programming models such as ...
Wrapper for hypre's ParCSR matrix class.
virtual void Assemble(int skip_zeros=1)
Construct the internal matrix representation of the discrete linear operator.
virtual void Mult(const HypreParVector &b, HypreParVector &x) const
Solve Ax=b with hypre's PCG.
Class for parallel meshes.
IntegrationRules IntRules(0, Quadrature1D::GaussLegendre)
A global object with all integration rules (defined in intrules.cpp)
Arbitrary order "L2-conforming" discontinuous finite elements.
double f(const Vector &p)
void gradp_exact(const Vector &, Vector &)
bool Good() const
Return true if the command line options were parsed successfully.