12#ifndef MFEM_DPG_PRECONDITIONERS
13#define MFEM_DPG_PRECONDITIONERS
59 const ParFiniteElementSpace * pfespace,
int print_level);
78 std::vector<std::vector<std::unique_ptr<FiniteElementCollection>>>
fec_owned;
79 std::vector<std::vector<std::unique_ptr<ParFiniteElementSpace>>>
fes_owned;
82 std::vector<std::vector<std::unique_ptr<PRefinementTransferOperator>>>
T_level;
85 const std::vector<
Array<int>> & ess_bdr_marker_);
109 std::unique_ptr<Solver> coarse_prec;
113 const std::vector<
Array<int>> & ess_bdr_marker_,
115 real_t smoother_relax_factor = 2.0/3,
116 bool mumps_coarse_solver =
false,
117 int coarse_cg_max_iter = 10,
118 real_t coarse_cg_rel_tol = 1e-3);
130 std::unique_ptr<PRefinementHierarchy> hierarchy;
133 std::unique_ptr<Solver> coarse_prec;
137 const std::vector<
Array<int>> & ess_bdr_marker,
139 real_t smoother_relax_factor = 2.0/3,
140 bool mumps_coarse_solver =
false,
141 int coarse_cg_max_iter = 10,
142 real_t coarse_cg_rel_tol = 1e-3);
154 const Solver * prec =
nullptr;
155 bool own_prec =
false;
159 :
Solver(2*real_prec->
Height()), prec(real_prec), own_prec(own) { }
164 MFEM_VERIFY(x.
Size() == 2*n,
"Invalid x vector size");
165 MFEM_VERIFY(y.
Size() == 2*n,
"Invalid y vector size");
173 prec->
Mult(x_r, y_r);
174 prec->
Mult(x_i, y_i);
180 MFEM_VERIFY(x.
Size() == 2*n,
"Invalid x vector size");
181 MFEM_VERIFY(y.
Size() == 2*n,
"Invalid y vector size");
196 "ComplexPreconditioner::SetOperator only accepts ComplexOperator");
202 if (own_prec) {
delete prec; }
A class to handle Block diagonal preconditioners in a matrix-free implementation.
void Mult(const Vector &x, Vector &y) const override
Operator application.
A class to handle Block systems in a matrix-free implementation.
Mimic the action of a complex operator using two real operators.
Creates a p-refinement multigrid preconditioner for a given set of parallel finite element spaces and...
ComplexPRefinementMultigrid(const Array< ParFiniteElementSpace * > &pfes_, const std::vector< Array< int > > &ess_bdr_marker, const ComplexOperator &Op_, int mgmaxlevels=-1, real_t smoother_relax_factor=2.0/3, bool mumps_coarse_solver=false, int coarse_cg_max_iter=10, real_t coarse_cg_rel_tol=1e-3)
~ComplexPRefinementMultigrid() override=default
virtual void Mult(const Vector &x, Vector &y) const override
Operator application: y=A(x).
void SetOperator(const Operator &op_) override
Set/update the solver for the given operator.
virtual void MultTranspose(const Vector &x, Vector &y) const override
Action of the transpose operator: y=A^t(x). The default behavior in class Operator is to generate an ...
ComplexPreconditioner(const Solver *real_prec, bool own=false)
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
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 ...
std::vector< Array< int > > ess_tdof_list
std::vector< std::vector< std::unique_ptr< PRefinementTransferOperator > > > T_level
const Array< ParFiniteElementSpace * > & pfes
std::vector< std::vector< std::unique_ptr< ParFiniteElementSpace > > > fes_owned
int GetFESpaceMinimumOrder(const ParFiniteElementSpace *pfespace) const
std::vector< std::vector< std::unique_ptr< FiniteElementCollection > > > fec_owned
std::vector< Array< int > > ess_bdr_marker
void BuildSpaceHierarchy(int mgmaxlevels=-1)
Computes orders/maxlevels and constructs fec/fes hierarchy and T_level storage.
BlockOperator * BuildProlongation(int lev)
Builds block-diagonal prolongation for level lev (coarse=lev, fine=lev+1). Its diagonal blocks are Hy...
const ParFiniteElementSpace * GetParFESpace(int lev, int b) const
PRefinementHierarchy(const Array< ParFiniteElementSpace * > &pfes_, const std::vector< Array< int > > &ess_bdr_marker_)
Creates a p-refinement multigrid preconditioner for a given set of parallel finite element spaces and...
~PRefinementMultigrid() override=default
PRefinementMultigrid(const Array< ParFiniteElementSpace * > &pfes_, const std::vector< Array< int > > &ess_bdr_marker_, const BlockOperator &Op_, int mgmaxlevels=-1, real_t smoother_relax_factor=2.0/3, bool mumps_coarse_solver=false, int coarse_cg_max_iter=10, real_t coarse_cg_rel_tol=1e-3)
Abstract parallel finite element space.
Class for parallel meshes.
void MultTranspose(const Vector &x, Vector &y) const override
Action of the transpose operator.
SymmetricBlockDiagonalPreconditioner(const Array< int > &offsets, real_t c_=1.0)
Constructs a symmetric block-diagonal preconditioner with the given block offsets and scaling factor.
void Mult(const Vector &x, Vector &y) const override
Operator application.
int Size() const
Returns the size of the vector.
Solver * MakeFESpaceDefaultSolver(const ParFiniteElementSpace *pfespace, int print_level)
Creates a default solver for a given parallel FE space. The default solvers are the following: