12#ifndef MFEM_DIVFREE_SOLVER_HPP
13#define MFEM_DIVFREE_SOLVER_HPP
41 std::vector<OperatorPtr>
P_l2;
43 std::vector<OperatorPtr>
Q_l2;
45 std::vector<OperatorPtr>
C;
55 std::unique_ptr<FiniteElementCollection> hcurl_fec_;
58 std::unique_ptr<ParFiniteElementSpace> coarse_hdiv_fes_;
59 std::unique_ptr<ParFiniteElementSpace> coarse_l2_fes_;
60 std::unique_ptr<ParFiniteElementSpace> coarse_hcurl_fes_;
61 std::unique_ptr<ParFiniteElementSpace> l2_0_fes_;
63 std::unique_ptr<ParFiniteElementSpace> hdiv_fes_;
64 std::unique_ptr<ParFiniteElementSpace> l2_fes_;
65 std::unique_ptr<ParFiniteElementSpace> hcurl_fes_;
67 std::vector<SparseMatrix> el_l2dof_;
74 void MakeDofRelationTables(
int level);
126 std::vector<OperatorPtr> solvers_loc_;
180 std::vector<Array<int>> ops_offsets_;
187 void SolveParticular(
const Vector& rhs,
Vector& sol)
const;
188 void SolveDivFree(
const Vector& rhs,
Vector& sol)
const;
189 void SolvePotential(
const Vector &rhs,
Vector& sol)
const;
Conjugate gradient method.
virtual void Mult(const Vector &b, Vector &x) const
Iterative solution of the linear system using the Conjugate Gradient method.
Data type dense matrix using column-major storage.
Block diagonal solver for A, each block is inverted by direct solver.
virtual void Mult(const Vector &x, Vector &y) const
Direct solution of the block diagonal linear system.
Wrapper for hypre's ParCSR matrix class.
Arbitrary order "L2-conforming" discontinuous finite elements.
Pointer to an Operator of a specified type.
Abstract parallel finite element space.
Class for parallel meshes.
Arbitrary order H(div)-conforming Raviart-Thomas finite elements.
BBTSolver(const HypreParMatrix &B, IterSolveParameters param)
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
virtual void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
DFSSpaces(int order, int num_refine, ParMesh *mesh, const Array< int > &ess_attr, const DFSParameters ¶m)
const DFSData & GetDFSData() const
ParFiniteElementSpace * GetHdivFES() const
ParFiniteElementSpace * GetL2FES() const
Abstract solver class for Darcy's flow.
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
DivFreeSolver(const HypreParMatrix &M, const HypreParMatrix &B, const DFSData &data)
virtual int GetNumIterations() const
virtual void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
Solver for local problems in SaddleSchwarzSmoother.
virtual void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
LocalSolver(const DenseMatrix &M, const DenseMatrix &B)
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 ...
virtual void Mult(const Vector &x, Vector &y) const
Operator application: y=A(x).
virtual void SetOperator(const Operator &op)
Set/update the solver for the given operator.
SaddleSchwarzSmoother(const HypreParMatrix &M, const HypreParMatrix &B, const SparseMatrix &agg_hdivdof, const SparseMatrix &agg_l2dof, const HypreParMatrix &P_l2, const HypreParMatrix &Q_l2)
Block diagonal solver for symmetric A, each block is inverted by direct solver.
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 ...
SymDirectSubBlockSolver(const SparseMatrix &A, const SparseMatrix &block_dof)
Data for the divergence free solver.
std::vector< OperatorPtr > agg_l2dof
std::vector< OperatorPtr > P_hcurl
Array< int > coarsest_ess_hdivdofs
std::vector< OperatorPtr > P_hdiv
std::vector< OperatorPtr > P_l2
std::vector< OperatorPtr > Q_l2
std::vector< OperatorPtr > agg_hdivdof
std::vector< OperatorPtr > C
Parameters for the divergence free solver.
IterSolveParameters coarse_solve_param
IterSolveParameters BBT_solve_param