68 int 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);
105 int basis_lor = BasisType::GaussLobatto;
106 Mesh mesh_lor = Mesh::MakeRefined(mesh, lref, basis_lor);
116 cerr <<
"Switching the H1 LOR space order from 0 to 1\n";
158 double ho_mass =
compute_mass(&fespace, -1.0, HO_dc,
"HO ");
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";
207 double lor_mass =
compute_mass(&fespace_lor, -1.0, LOR_dc,
"LOR ");
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;
288 double newmass = lf(*dc.
GetField(
"density"));
290 cout <<
space <<
" " << prefix <<
" mass = " << newmass;
294 cout <<
" (" << fabs(newmass-massL2)*100/massL2 <<
"%)";
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 ...
Class for domain integration L(v) := (f, v)
Class for grid function - Vector with associated FE space.
int main(int argc, char *argv[])
void SetFromTrueVector()
Shortcut for calling SetFromTrueDofs() with GetTrueVector() as argument.
A coefficient that is constant across space and time.
int Dimension() const
Dimension of the reference space used within the elements.
GridFunction * GetField(const std::string &field_name)
Get a pointer to a grid function in the collection.
virtual const Operator & BackwardOperator()=0
Return an Operator that transfers GridFunctions from the range FE space back to GridFunctions in the ...
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
double RHO_exact(const Vector &x)
void SetTrueVector()
Shortcut for calling GetTrueDofs() with GetTrueVector() as argument.
virtual const Operator & ForwardOperator()=0
Return an Operator that transfers GridFunctions from the domain FE space to GridFunctions in the rang...
Data collection with VisIt I/O routines.
double Sum() const
Return the sum of the vector entries.
virtual bool SupportsBackwardsOperator() const
Base class for transfer algorithms that construct transfer Operators between two finite element (FE) ...
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
Transfer data between a coarse mesh and an embedded refined mesh using interpolation.
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...
Transfer data in L2 and H1 finite element spaces between a coarse mesh and an embedded refined mesh u...
virtual void ProjectCoefficient(Coefficient &coeff)
Project coeff Coefficient to this GridFunction. The projection computation depends on the choice of t...
double Norml2() const
Returns the l2 norm of the vector.
Mesh * GetMesh()
Get a pointer to the mesh in the collection.
A general function coefficient.
Arbitrary order H1-conforming (continuous) finite elements.
double compute_mass(FiniteElementSpace *, double, VisItDataCollection &, string)
double Normlinf() const
Returns the l_infinity norm of the vector.
void visualize(VisItDataCollection &, string, int, int)
void ParseCheck(std::ostream &out=mfem::out)
Arbitrary order "L2-conforming" discontinuous finite elements.
virtual void RegisterField(const std::string &field_name, GridFunction *gf) override
Add a grid function to the collection and update the root file.