42 int main(
int argc,
char *argv[])
46 MPI_Init(&argc, &argv);
47 MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
48 MPI_Comm_rank(MPI_COMM_WORLD, &myid);
51 const char *mesh_file =
"../data/star.mesh";
53 bool visualization = 1;
56 args.
AddOption(&mesh_file,
"-m",
"--mesh",
59 "Finite element order (polynomial degree).");
60 args.
AddOption(&visualization,
"-vis",
"--visualization",
"-no-vis",
62 "Enable or disable GLVis visualization.");
81 Mesh *mesh =
new Mesh(mesh_file, 1, 1);
90 (int)floor(log(10000./mesh->
GetNE())/log(2.)/
dim);
91 for (
int l = 0; l < ref_levels; l++)
103 int par_ref_levels = 1;
104 for (
int l = 0; l < par_ref_levels; l++)
119 unsigned int trial_order = order;
120 unsigned int trace_order = order - 1;
121 unsigned int test_order = order;
123 if (dim == 2 && (order%2 == 0 || (pmesh->
MeshGenerator() & 2 && order > 1)))
127 if (test_order < trial_order)
131 cerr <<
"Warning, test space not enriched enough to handle primal"
153 cout <<
"\nNumber of Unknowns:\n"
154 <<
" Trial space, X0 : " << glob_true_s0
155 <<
" (order " << trial_order <<
")\n"
156 <<
" Interface space, Xhat : " << glob_true_s1
157 <<
" (order " << trace_order <<
")\n"
158 <<
" Test space, Y : " << glob_true_s_test
159 <<
" (order " << test_order <<
")\n\n";
215 enum {x0_var, xhat_var, NVAR};
219 int true_s_test = test_space->
TrueVSize();
223 true_offsets[1] = true_s0;
224 true_offsets[2] = true_s0+true_s1;
227 true_offsets_test[0] = 0;
228 true_offsets_test[1] = true_s_test;
246 matSinv->
Mult(*trueF, SinvF);
265 if (dim == 2) { Shatinv =
new HypreAMS(*Shat, xhat_space); }
266 else { Shatinv =
new HypreADS(*Shat, xhat_space); }
287 matSinv->
Mult(LSres, tmp);
291 cout <<
"\n|| B0*x0 + Bhat*xhat - F ||_{S^-1} = " << res << endl;
300 ostringstream mesh_name, sol_name;
301 mesh_name <<
"mesh." << setfill(
'0') << setw(6) << myid;
302 sol_name <<
"sol." << setfill(
'0') << setw(6) << myid;
304 ofstream mesh_ofs(mesh_name.str().c_str());
305 mesh_ofs.precision(8);
306 pmesh->
Print(mesh_ofs);
308 ofstream sol_ofs(sol_name.str().c_str());
309 sol_ofs.precision(8);
319 sol_sock <<
"parallel " << num_procs <<
" " << myid <<
"\n";
320 sol_sock.precision(8);
321 sol_sock <<
"solution\n" << *pmesh << *x0 << flush;
Class for domain integration L(v) := (f, v)
Conjugate gradient method.
The Auxiliary-space Maxwell Solver in hypre.
Integrator defining a sum of multiple Integrators.
The Auxiliary-space Divergence Solver in hypre.
A class to handle Vectors in a block fashion.
virtual void GetEssentialVDofs(const Array< int > &bdr_attr_is_ess, Array< int > &ess_dofs, int component=-1) const
Determine the boundary degrees of freedom.
A coefficient that is constant across space and time.
HypreParMatrix * RAP(const HypreParMatrix *A, const HypreParMatrix *P)
Returns the matrix P^t * A * P.
virtual void Mult(const Vector &b, Vector &x) const
Operator application: y=A(x).
virtual void ReorientTetMesh()
See the remarks for the serial version in mesh.hpp.
int TrueVSize() const
Obsolete, kept for backward compatibility.
HYPRE_BigInt GlobalTrueVSize() const
virtual void MultTranspose(const Vector &x, Vector &y) const
Action of the transpose operator.
int GetNE() const
Returns number of elements.
virtual void Save(std::ostream &out) const
Abstract parallel finite element space.
void AddIntegrator(BilinearFormIntegrator *integ)
Integrator that inverts the matrix assembled by another integrator.
The BoomerAMG solver in hypre.
void SetPrintLevel(int print_lvl)
void Parse()
Parse the command-line options. Note that this function expects all the options provided through the ...
A class to handle Block diagonal preconditioners in a matrix-free implementation. ...
void UniformRefinement(int i, const DSTable &, int *, int *, int *)
void SetPrintLevel(int print_level)
void SetMaxIter(int max_it)
int MeshGenerator()
Get the mesh generator/type.
T Max() const
Find the maximal element in the array, using the comparison operator < for class T.
virtual void Print(std::ostream &out=mfem::out) const
The operator x -> R*A*P*x constructed through the actions of R^T, A and P.
void PrintUsage(std::ostream &out) const
Print the usage message.
virtual void Mult(const Vector &x, Vector &y) const
Operator application.
Wrapper for hypre's parallel vector class.
Array< int > bdr_attributes
A list of all unique boundary attributes used by the Mesh.
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 Distribute(const Vector *tv)
double InnerProduct(HypreParVector *x, HypreParVector *y)
void PrintOptions(std::ostream &out) const
Print the options.
Abstract class for hypre's solvers and preconditioners.
virtual void SetOperator(const Operator &op)
Also calls SetOperator for the preconditioner if there is one.
Arbitrary order "H^{-1/2}-conforming" face finite elements defined on the interface between mesh elem...
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.
Class for parallel grid function.
Wrapper for hypre's ParCSR matrix class.
A class to handle Block systems in a matrix-free implementation.
Class for parallel meshes.
void SetBlock(int iRow, int iCol, Operator *op, double c=1.0)
Add a block op in the block-entry (iblock, jblock).
void SetDiagonalBlock(int iblock, Operator *op)
Add a square block op in the block-entry (iblock, iblock).
Arbitrary order "L2-conforming" discontinuous finite elements.
bool Good() const
Return true if the command line options were parsed successfully.