61class MultigridPreconditionerBase :
public PreconditionerBase<Number>
64 typedef MultigridNumber_ MultigridNumber;
67 typedef std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>> Map_DBC;
68 typedef std::map<dealii::types::boundary_id, dealii::ComponentMask> Map_DBC_ComponentMask;
71 dealii::GridTools::PeriodicFacePair<typename dealii::Triangulation<dim>::cell_iterator>>
74 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
75 typedef dealii::LinearAlgebra::distributed::Vector<MultigridNumber> VectorTypeMG;
80 typedef std::vector<std::pair<unsigned int, unsigned int>> Levels;
88 MultigridPreconditionerBase(MPI_Comm
const & comm);
93 virtual ~MultigridPreconditionerBase()
104 dealii::FiniteElement<dim>
const & fe,
105 bool const operator_is_singular,
106 Map_DBC
const & dirichlet_bc,
107 Map_DBC_ComponentMask
const & dirichlet_bc_component_mask,
108 bool const initialize_preconditioners);
121 vmult(VectorType & dst, VectorType
const & src)
const override;
127 solve(VectorType & dst, VectorType
const & src)
const;
134 apply_smoother_on_fine_level(VectorTypeMG & dst, VectorTypeMG
const & src)
const;
136 std::shared_ptr<TimerTree>
137 get_timings()
const override;
145 initialize_mapping();
151 initialize_matrix_free_objects();
158 update_matrix_free_objects();
178 initialize_dof_handler_and_constraints(
bool is_singular,
179 unsigned int const n_components,
180 Map_DBC
const & dirichlet_bc,
181 Map_DBC_ComponentMask
const & dirichlet_bc_component_mask);
184 do_initialize_dof_handler_and_constraints(
186 unsigned int const n_components,
187 Map_DBC
const & dirichlet_bc,
188 Map_DBC_ComponentMask
const & dirichlet_bc_component_mask,
189 dealii::MGLevelObject<std::shared_ptr<dealii::DoFHandler<dim>
const>> & dofhandlers,
190 dealii::MGLevelObject<std::shared_ptr<dealii::AffineConstraints<MultigridNumber>>> &
197 initialize_transfer_operators();
200 do_initialize_transfer_operators(
202 unsigned int const dof_index);
218 for_all_levels(std::function<
void(
unsigned int const)>
const & function_on_level)
221 function_on_level(level);
234 function_on_level(level);
245 std::function<
void(
unsigned int const,
unsigned int const)>
const & levelwise_transfer)
248 levelwise_transfer(fine_level, fine_level - 1);
252 std::shared_ptr<Grid<dim>
const> grid;
254 std::shared_ptr<MultigridMappings<dim, Number>> multigrid_mappings;
256 dealii::MGLevelObject<std::shared_ptr<dealii::DoFHandler<dim>
const>> dof_handlers;
257 dealii::MGLevelObject<std::shared_ptr<dealii::AffineConstraints<MultigridNumber>>> constraints;
259 dealii::MGLevelObject<std::shared_ptr<MatrixFreeData<dim, MultigridNumber>>>
260 matrix_free_data_objects;
261 dealii::MGLevelObject<std::shared_ptr<dealii::MatrixFree<dim, MultigridNumber>>>
264 dealii::MGLevelObject<std::shared_ptr<Operator>> operators;
266 std::shared_ptr<MultigridTransfer<dim, MultigridNumber, VectorTypeMG>> transfers;
268 std::vector<MGLevelInfo> level_info;
275 initialize_levels(
unsigned int const degree,
bool const is_dg);
280 dealii::Mapping<dim>
const &
281 get_mapping(
unsigned int const h_level)
const;
287 get_number_of_h_levels()
const;
294 unsigned int const level,
295 unsigned int const h_level) = 0;
301 initialize_operators();
307 virtual std::shared_ptr<Operator>
308 initialize_operator(
unsigned int const level);
314 initialize_smoothers(
bool const initialize_preconditioner);
317 initialize_smoother(Operator & matrix,
unsigned int level,
bool const initialize_preconditioner);
323 initialize_coarse_solver(
bool const operator_is_singular,
bool const initialize_preconditioners);
329 initialize_multigrid_algorithm();
331 MPI_Comm
const mpi_comm;
337 std::vector<MGDoFHandlerIdentifier> p_levels;
339 dealii::MGLevelObject<std::shared_ptr<Smoother>> smoothers;
341 std::shared_ptr<CoarseGridSolverBase<Operator>> coarse_grid_solver;
343 std::shared_ptr<MultigridAlgorithm<VectorTypeMG, Operator, Smoother>> multigrid_algorithm;