56int main(
int argc,
char *argv[])
59 const char *mesh_file =
"../data/beam-hex.mesh";
62 bool static_cond =
false;
64 const char *device_config =
"cpu";
65 bool visualization = 1;
68 args.
AddOption(&mesh_file,
"-m",
"--mesh",
71 "Finite element order (polynomial degree).");
73 "Choose between 0: grad, 1: curl, 2: div");
74 args.
AddOption(&static_cond,
"-sc",
"--static-condensation",
"-no-sc",
75 "--no-static-condensation",
"Enable static condensation.");
76 args.
AddOption(&pa,
"-pa",
"--partial-assembly",
"-no-pa",
77 "--no-partial-assembly",
"Enable Partial Assembly.");
78 args.
AddOption(&device_config,
"-d",
"--device",
79 "Device configuration string, see Device::Configure().");
80 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
82 "Enable or disable GLVis visualization.");
95 Device device(device_config);
101 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
110 int ref_levels = (int)floor(log(50000./mesh->
GetNE())/log(2.)/
dim);
111 for (
int l = 0; l < ref_levels; l++)
146 cout <<
"Number of Nedelec finite element unknowns: " << test_size << endl;
147 cout <<
"Number of H1 finite element unknowns: " << trial_size << endl;
151 cout <<
"Number of Nedelec finite element unknowns: " << trial_size << endl;
152 cout <<
"Number of Raviart-Thomas finite element unknowns: " << test_size <<
157 cout <<
"Number of Raviart-Thomas finite element unknowns: "
158 << trial_size << endl;
159 cout <<
"Number of L2 finite element unknowns: " << test_size << endl;
195 a.SetAssemblyLevel(AssemblyLevel::PARTIAL);
219 if (static_cond) {
a.EnableStaticCondensation(); }
222 if (!pa) {
a.Finalize(); }
229 a_mixed.
Mult(gftrial, x);
234 mixed.
Mult(gftrial, x);
284 dlo.
Mult(gftrial, discreteInterpolant);
311 cout <<
"\n Solution of (E_h,v) = (grad p_h,v) for E_h and v in H(curl): "
312 "|| E_h - grad p ||_{L_2} = " << errSol <<
'\n' << endl;
313 cout <<
" Gradient interpolant E_h = grad p_h in H(curl): || E_h - grad p"
314 " ||_{L_2} = " << errInterp <<
'\n' << endl;
315 cout <<
" Projection E_h of exact grad p in H(curl): || E_h - grad p "
316 "||_{L_2} = " << errProj <<
'\n' << endl;
324 cout <<
"\n Solution of (E_h,w) = (curl v_h,w) for E_h and w in H(div): "
325 "|| E_h - curl v ||_{L_2} = " << errSol <<
'\n' << endl;
326 cout <<
" Curl interpolant E_h = curl v_h in H(div): || E_h - curl v "
327 "||_{L_2} = " << errInterp <<
'\n' << endl;
328 cout <<
" Projection E_h of exact curl v in H(div): || E_h - curl v "
329 "||_{L_2} = " << errProj <<
'\n' << endl;
333 int order_quad = max(2, 2*order+1);
344 cout <<
"\n Solution of (f_h,q) = (div v_h,q) for f_h and q in L_2: "
345 "|| f_h - div v ||_{L_2} = " << errSol <<
'\n' << endl;
346 cout <<
" Divergence interpolant f_h = div v_h in L_2: || f_h - div v "
347 "||_{L_2} = " << errInterp <<
'\n' << endl;
348 cout <<
" Projection f_h of exact div v in L_2: || f_h - div v "
349 "||_{L_2} = " << errProj <<
'\n' << endl;
354 ofstream mesh_ofs(
"refined.mesh");
355 mesh_ofs.precision(8);
356 mesh->
Print(mesh_ofs);
357 ofstream sol_ofs(
"sol.gf");
358 sol_ofs.precision(8);
367 sol_sock.precision(8);
368 sol_sock <<
"solution\n" << *mesh << x << flush;
383 return sin(x(0)) * sin(x(1)) * sin(x(2));
387 return sin(x(0)) * sin(x(1));
397 f(0) = cos(x(0)) * sin(x(1)) * sin(x(2));
398 f(1) = sin(x(0)) * cos(x(1)) * sin(x(2));
399 f(2) = sin(x(0)) * sin(x(1)) * cos(x(2));
403 f(0) = cos(x(0)) * sin(x(1));
404 f(1) = sin(x(0)) * cos(x(1));
405 if (x.
Size() == 3) {
f(2) = 0.0; }
413 return -3.0 * sin(x(0)) * sin(x(1)) * sin(x(2));
417 return -2.0 * sin(x(0)) * sin(x(1));
427 v(0) = sin(
kappa * x(1));
428 v(1) = sin(
kappa * x(2));
429 v(2) = sin(
kappa * x(0));
433 v(0) = sin(
kappa * x(1));
434 v(1) = sin(
kappa * x(0));
435 if (x.
Size() == 3) { v(2) = 0.0; }
Conjugate gradient method.
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
virtual void Mult(const Vector &b, Vector &x) const
Iterative solution of the linear system using the Conjugate Gradient method.
A coefficient that is constant across space and time.
Data type for scaled Jacobi-type smoother of sparse matrix.
The MFEM Device class abstracts hardware devices such as GPUs, as well as programming models such as ...
void Print(std::ostream &out=mfem::out)
Print the configuration of the MFEM virtual device object.
void AddDomainInterpolator(DiscreteInterpolator *di)
Adds a domain interpolator. Assumes ownership of di.
virtual void Assemble(int skip_zeros=1)
Construct the internal matrix representation of the discrete linear operator.
Collection of finite elements from the same family in multiple dimensions. This class is used to matc...
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
virtual int GetTrueVSize() const
Return the number of vector true (conforming) dofs.
A general function coefficient.
Class for grid function - Vector with associated FE space.
void SetTrueVector()
Shortcut for calling GetTrueDofs() with GetTrueVector() as argument.
virtual void Save(std::ostream &out) const
Save the GridFunction to an output stream.
virtual real_t ComputeL2Error(Coefficient *exsol[], const IntegrationRule *irs[]=NULL, const Array< int > *elems=NULL) const
void SetFromTrueVector()
Shortcut for calling SetFromTrueDofs() with GetTrueVector() as argument.
virtual void ProjectCoefficient(Coefficient &coeff)
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
Arbitrary order H1-conforming (continuous) finite elements.
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 SetRelTol(real_t rtol)
virtual void SetPreconditioner(Solver &pr)
This should be called before SetOperator.
virtual void SetPrintLevel(int print_lvl)
Legacy method to set the level of verbosity of the solver output.
void SetMaxIter(int max_it)
Arbitrary order "L2-conforming" discontinuous finite elements.
virtual void Print(std::ostream &os=mfem::out, const std::string &comments="") const
int GetNE() const
Returns number of elements.
int Dimension() const
Dimension of the reference space used within the elements.
int SpaceDimension() const
Dimension of the physical space containing the mesh.
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
Arbitrary order H(curl)-conforming Nedelec finite elements.
Jacobi smoothing for a given bilinear form (no matrix necessary).
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
void PrintUsage(std::ostream &out) const
Print the usage message.
void PrintOptions(std::ostream &out) const
Print the options.
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...
bool Good() const
Return true if the command line options were parsed successfully.
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
virtual void Mult(const Vector &x, Vector &y) const
Matrix vector multiplication.
A general vector function coefficient.
int Size() const
Returns the size of the vector.
real_t p_exact(const Vector &x)
void curlv_exact(const Vector &x, Vector &cv)
void v_exact(const Vector &x, Vector &v)
void gradp_exact(const Vector &, Vector &)
real_t div_gradp_exact(const Vector &x)
std::function< real_t(const Vector &)> f(real_t mass_coeff)
IntegrationRules IntRules(0, Quadrature1D::GaussLegendre)
A global object with all integration rules (defined in intrules.cpp)