68int main(
int argc,
char *argv[])
71 const char *mesh_file =
"../../data/star.mesh";
77 bool use_pointwise_transfer =
false;
80 args.
AddOption(&mesh_file,
"-m",
"--mesh",
83 "Problem type (see the RHO_exact function).");
85 "Finite element order (polynomial degree) or -1 for"
86 " isoparametric space.");
87 args.
AddOption(&lref,
"-lref",
"--lor-ref-level",
"LOR refinement level.");
88 args.
AddOption(&lorder,
"-lo",
"--lor-order",
89 "LOR space order (polynomial degree, zero by default).");
90 args.
AddOption(&vis,
"-vis",
"--visualization",
"-no-vis",
92 "Enable or disable GLVis visualization.");
93 args.
AddOption(&useH1,
"-h1",
"--use-h1",
"-l2",
"--use-l2",
94 "Use H1 spaces instead of L2.");
95 args.
AddOption(&use_pointwise_transfer,
"-t",
"--use-pointwise-transfer",
96 "-no-t",
"--dont-use-pointwise-transfer",
97 "Use pointwise transfer operators instead of L2 projection.");
101 Mesh mesh(mesh_file, 1, 1);
116 cerr <<
"Switching the H1 LOR space order from 0 to 1\n";
162 if (use_pointwise_transfer)
174 R.
Mult(rho, rho_lor);
184 P.
Mult(rho_lor, rho);
190 cout <<
"|HO - P(R(HO))|_∞ = " << rho_prev.
Normlinf() << endl;
194 LinearForm M_rho(&fespace), M_rho_lor(&fespace_lor);
198 M_ho.
Mult(rho, M_rho);
200 cout <<
"HO -> LOR dual field: " << abs(M_rho.Sum()-M_rho_lor.
Sum()) <<
"\n\n";
215 P.
Mult(rho_lor, rho);
222 R.
Mult(rho, rho_lor);
223 compute_mass(&fespace_lor, lor_mass, LOR_dc,
"R(P(LOR))");
226 rho_lor_prev -= rho_lor;
228 cout <<
"|LOR - R(P(LOR))|_∞ = " << rho_lor_prev.
Normlinf() << endl;
232 if (!use_pointwise_transfer)
234 M_lor.
Mult(rho_lor, M_rho_lor);
236 cout <<
"LOR -> HO dual field: " << abs(M_rho.Sum() - M_rho_lor.
Sum()) <<
'\n';
251 return x(1)+0.25*cos(2*M_PI*x.
Norml2());
253 return x(1)*x(1)*x(1) + 2*x(0)*x(1) + x(0);
255 return M_PI/2-atan(5*(2*x.
Norml2()-1));
257 return (x.
Norml2() < 0.1) ? 1 : 0;
272 sol_sockL2.precision(8);
274 <<
"window_geometry " << x <<
" " << y <<
" " << w <<
" " << h
275 <<
"plot_caption '" <<
space <<
" " << prefix <<
" Density'"
276 <<
"window_title '" <<
direction <<
"'" << flush;
290 cout <<
space <<
" " << prefix <<
" mass = " << newmass;
294 cout <<
" (" << fabs(newmass-massL2)*100/massL2 <<
"%)";
@ GaussLobatto
Closed type.
A coefficient that is constant across space and time.
GridFunction * GetField(const std::string &field_name)
Get a pointer to a grid function in the collection.
Mesh * GetMesh()
Get a pointer to the mesh in the collection.
Class for domain integration .
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...
A general function coefficient.
Class for grid function - Vector with associated FE space.
void SetTrueVector()
Shortcut for calling GetTrueDofs() with GetTrueVector() as argument.
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...
Base class for transfer algorithms that construct transfer Operators between two finite element (FE) ...
virtual bool SupportsBackwardsOperator() const
virtual const Operator & ForwardOperator()=0
Return an Operator that transfers GridFunctions from the domain FE space to GridFunctions in the rang...
virtual const Operator & BackwardOperator()=0
Return an Operator that transfers GridFunctions from the range FE space back to GridFunctions in the ...
Arbitrary order H1-conforming (continuous) finite elements.
Transfer data between a coarse mesh and an embedded refined mesh using interpolation.
Transfer data in L2 and H1 finite element spaces between a coarse mesh and an embedded refined mesh u...
Arbitrary order "L2-conforming" discontinuous finite elements.
int Dimension() const
Dimension of the reference space used within the elements.
static Mesh MakeRefined(Mesh &orig_mesh, int ref_factor, int ref_type)
Create a refined (by any factor) version of orig_mesh.
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
virtual void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
void ParseCheck(std::ostream &out=mfem::out)
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...
real_t Normlinf() const
Returns the l_infinity norm of the vector.
real_t Norml2() const
Returns the l2 norm of the vector.
real_t Sum() const
Return the sum of the vector entries.
Data collection with VisIt I/O routines.
virtual void RegisterField(const std::string &field_name, GridFunction *gf) override
Add a grid function to the collection and update the root file.
void visualize(VisItDataCollection &, string, int, int)
real_t RHO_exact(const Vector &x)
real_t compute_mass(FiniteElementSpace *, real_t, VisItDataCollection &, string)