56int main(
int argc,
char *argv[])
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).");
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;
225 a.SetAssemblyLevel(AssemblyLevel::PARTIAL);
249 if (static_cond) {
a.EnableStaticCondensation(); }
252 if (!pa) {
a.Finalize(); }
263 a_mixed.
Mult(gftrial,
b);
264 b.ParallelAssemble(B);
285 a.FormSystemMatrix(ess_tdof_list, A);
332 dlo.
Mult(gftrial, discreteInterpolant);
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;
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);
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.
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.
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...
A general function coefficient.
void SetTrueVector()
Shortcut for calling GetTrueDofs() with GetTrueVector() as argument.
void SetFromTrueVector()
Shortcut for calling SetFromTrueDofs() with GetTrueVector() as argument.
Arbitrary order H1-conforming (continuous) finite elements.
Jacobi preconditioner in hypre.
void SetPrintLevel(int print_lvl)
void SetPreconditioner(HypreSolver &precond)
Set the hypre solver to be used as a preconditioner.
virtual void Mult(const HypreParVector &b, HypreParVector &x) const
Solve Ax=b with hypre's PCG.
void SetMaxIter(int max_iter)
Wrapper for hypre's ParCSR matrix class.
HYPRE_Int Mult(HypreParVector &x, HypreParVector &y, real_t alpha=1.0, real_t beta=0.0) const
Computes y = alpha * A * x + beta * y.
static void Init()
Initialize hypre by calling HYPRE_Init() and set default options. After calling Hypre::Init(),...
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.
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 *)
static int WorldRank()
Return the MPI rank in MPI_COMM_WORLD.
static int WorldSize()
Return the size of MPI_COMM_WORLD.
static void Init(int &argc, char **&argv, int required=default_thread_required, int *provided=nullptr)
Singleton creation with Mpi::Init(argc, argv).
Arbitrary order H(curl)-conforming Nedelec finite elements.
Pointer to an Operator of a specified type.
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.
Abstract parallel finite element space.
HYPRE_BigInt GlobalTrueVSize() const
int GetTrueVSize() const override
Return the number of local vector true dofs.
Class for parallel grid function.
void Save(std::ostream &out) const override
real_t ComputeL2Error(Coefficient *exsol[], const IntegrationRule *irs[]=NULL, const Array< int > *elems=NULL) const override
HypreParVector * GetTrueDofs() const
Returns the true dofs in a new HypreParVector.
void SetFromTrueDofs(const Vector &tv) override
Set the GridFunction from the given true-dof vector.
void ProjectCoefficient(Coefficient &coeff) override
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
Class for parallel meshes.
void Print(std::ostream &out=mfem::out, const std::string &comments="") const override
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
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)