6#include <deal.II/lac/diagonal_matrix.h>
7#include <deal.II/lac/precondition.h>
8#include <deal.II/lac/solver_control.h>
9#include <deal.II/lac/solver_selector.h>
23#include <prismspf/config.h>
28#include <deal.II/lac/precondition_block.h>
29#include <deal.II/multigrid/mg_coarse.h>
30#include <deal.II/multigrid/mg_constrained_dofs.h>
31#include <deal.II/multigrid/mg_matrix.h>
32#include <deal.II/multigrid/mg_smoother.h>
33#include <deal.II/multigrid/mg_tools.h>
34#include <deal.II/multigrid/mg_transfer_global_coarsening.h>
35#include <deal.II/multigrid/mg_transfer_matrix_free.h>
36#include <deal.II/multigrid/multigrid.h>
40template <
unsigned int dim,
unsigned int degree,
typename number>
46template <
unsigned int dim,
unsigned int degree,
typename number>
51 dealii::PreconditionChebyshev<MFOperator<dim, degree, number>,
53 dealii::DiagonalMatrix<BlockVector<number>>>;
55 using Smoother = dealii::MGSmootherPrecondition<MFOperator<dim, degree, number>,
59 dealii::MGTransferBlockGlobalCoarsening<dim, BlockVector<number>>;
80 dealii::Multigrid<
BlockVector<number>>::Cycle::v_cycle)
87 init(
unsigned int min_level,
88 unsigned int max_level,
96 dealii::MGLevelObject<MFOperator<dim, degree, number>>(min_level, max_level);
97 for (
unsigned level = min_level; level <= max_level; ++level)
99 const unsigned int relative_level = max_level - level;
126 dealii::MGLevelObject<typename SmootherPrecond::AdditionalData> smoother_data(
130 for (
unsigned int level = min_level; level <= max_level; ++level)
132 unsigned int relative_level = level - min_level;
133 smoother_data[level].smoothing_range = chebyshev_params.smoothing_range;
134 smoother_data[level].degree = chebyshev_params.degree;
135 smoother_data[level].eig_cg_n_iterations = chebyshev_params.eig_cg_n_iterations;
136 smoother_data[level].constraints.close();
139 smoother_data[level].preconditioner =
149 multigrid = dealii::Multigrid<BlockVector<number>>(
157 dealii::Multigrid<BlockVector<number>>::Cycle::v_cycle);
170 static std::vector<dealii::MGConstrainedDoFs>
177 for (
unsigned int block_index = 0; block_index < solve_block.
field_indices.size();
184 const std::vector<FieldAttributes> &field_attributes =
186 for (
unsigned int block_index = 0; block_index < solve_block.
field_indices.size();
192 for (
const auto &[comp, comp_bcs] :
195 std::set<unsigned int> constrained_boundary_ids;
196 for (
const auto &[boundary_id, boundary_type] : comp_bcs)
200 constrained_boundary_ids.insert(boundary_id);
205 constrained_boundary_ids,
219template <
unsigned int dim,
unsigned int degree,
typename number>
227 dealii::PreconditionChebyshev<MFOperator<dim, degree, number>,
229 dealii::DiagonalMatrix<BlockVector<number>>>;
238 :
SolverBase<dim, degree, number>(_solve_block, _solve_context)
245 init(
const std::list<SolveBlock> &all_solve_blocks)
override
362 dealii::PreconditionIdentity());
375 for (
unsigned int level = lhs_ops.min_level(); level <= lhs_ops.max_level();
378 lhs_ops[level].reinit_matrix_diagonal();
379 lhs_ops[level].eval_matrix_diagonal();
384 catch (dealii::SolverControl::NoConvergence &exc)
387 <<
"[Increment " <<
solve_context->get_simulation_timer().get_increment()
389 <<
"Warning: linear solver did not converge as per set tolerances before "
392 if (
solve_context->get_user_inputs().output_parameters.should_output(
396 <<
" Linear solve final residual : "
420 value *= std::sqrt(
solve_context->get_triangulation_manager().get_volume());
424 value *= std::sqrt(
double(
solve_block.field_indices.size()));
451 precond_data.smoothing_range = chebyshev_params.smoothing_range;
452 precond_data.eig_cg_n_iterations = chebyshev_params.eig_cg_n_iterations;
466 const typename dealii::SolverRichardson<BlockVector<number>>::AdditionalData
467 local_richardson_parameters(richardson_parameters.omega,
468 richardson_parameters.use_preconditioned_residual);
469 const typename dealii::SolverBicgstab<BlockVector<number>>::AdditionalData
470 local_bicgstab_parameters(bicgstab_parameters.exact_residual,
471 bicgstab_parameters.breakdown);
472 const typename dealii::SolverGMRES<BlockVector<number>>::AdditionalData
473 local_gmres_parameters(gmres_parameters.max_basis_size,
474 gmres_parameters.right_preconditioning,
475 gmres_parameters.use_default_residual,
476 gmres_parameters.force_re_orthogonalization,
477 gmres_parameters.batched_mode,
478 gmres_parameters.orthogonalization_strategy);
479 const typename dealii::SolverFGMRES<BlockVector<number>>::AdditionalData
480 local_fgmres_parameters(gmres_parameters.max_basis_size,
481 gmres_parameters.orthogonalization_strategy);
483 lin_solver.set_data(local_richardson_parameters);
484 lin_solver.set_data(local_bicgstab_parameters);
529 dealii::PreconditionMG<dim,
540 const unsigned int global_refinement =
541 solve_context->get_user_inputs().spatial_discretization.global_refinement;
543 const unsigned int max_level = global_refinement;
553PRISMS_PF_END_NAMESPACE
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:35
static dealii::ConditionalOStream & pout_base()
Generic parallel output stream. Used for essential information in release and debug mode.
Definition conditional_ostreams.cc:44
static const dealii::ComponentMask scalar_empty_mask
Definition constraint_manager.h:148
static const std::array< dealii::ComponentMask, dim > vector_component_mask
Create a component mask.
Definition constraint_manager.h:147
Class that manages solution initialization and swapping with old solutions.
Definition group_solution_handler.h:56
const std::vector< unsigned int > & get_block_to_global_index() const
Get the global index from the block index.
Definition group_solution_handler.cc:163
BlockVector< number > inhomogeneous_values
Vector containing only the inhomogeneous constraints (namely, non-zero Dirichlet values)
Definition linear_solver.h:516
void initialize_preconditioner()
Definition linear_solver.h:430
MFOperator< dim, degree, number > rhs_operator
Matrix free operators.
Definition linear_solver.h:408
void initialize_solver()
Definition linear_solver.h:461
BlockVector< number > rhs_vector
Definition linear_solver.h:411
const LinearSolverParameters & lin_params() const
Linear solver parameters.
Definition linear_solver.h:497
double normalization_value()
Definition linear_solver.h:414
PreconditionChebyshev precond_chebyshev
Definition linear_solver.h:523
int do_linear_solve(BlockVector< number > &b_vector, MFOperator< dim, degree, number > &lhs_matrix, BlockVector< number > &x_vector)
Definition linear_solver.h:350
PreconditionChebyshev::AdditionalData precond_data
Definition linear_solver.h:524
MFOperator< dim, degree, number > lhs_operator
Definition linear_solver.h:410
BlockVector< number > inhomogeneous_rhs
Result of the linear operator applied to the inhomogeneous values.
Definition linear_solver.h:521
void init(const std::list< SolveBlock > &all_solve_blocks) override
Initialize the solver.
Definition linear_solver.h:245
dealii::PreconditionMG< dim, BlockVector< number >, typename MGContext< dim, degree, number >::MGTransferType > PreconditionMG
Definition linear_solver.h:528
dealii::SolverSelector< BlockVector< number > > lin_solver
Solver. Can switch between different linear solvers.
Definition linear_solver.h:510
dealii::PreconditionChebyshev< MFOperator< dim, degree, number >, BlockVector< number >, dealii::DiagonalMatrix< BlockVector< number > > > PreconditionChebyshev
Definition linear_solver.h:226
void initialize_multigrid()
Definition linear_solver.h:538
std::shared_ptr< PreconditionMG > multigrid_preconditioner
Multigrid preconditioner.
Definition linear_solver.h:535
void initialize_chebyshev()
Definition linear_solver.h:447
dealii::SolverControl linear_solver_control
Solver control. Contains max iterations and tolerance.
Definition linear_solver.h:505
void solve_impl() override
Solve for a single update step.
Definition linear_solver.h:305
LinearSolver(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition linear_solver.h:236
MGContext< dim, degree, number > mg_context
Definition linear_solver.h:526
void reinit() override
Reinitialize the solver.
Definition linear_solver.h:290
This class exists to evaluate a single user-defined operator for the matrix-free implementation of so...
Definition mf_operator.h:54
void reinit_matrix_diagonal()
Reinit diagonal matrix to have the correct shape.
Definition mf_operator.cc:219
void eval_matrix_diagonal()
Evaluate matrix diagonal (and inverse).
Definition mf_operator.cc:242
Multigrid context. Everything multigrid needs to be alive to use.
Definition linear_solver.h:48
MGTransferType mg_transfer
Definition linear_solver.h:63
std::vector< dealii::MGConstrainedDoFs > mg_constraints
Definition linear_solver.h:62
dealii::MGCoarseGridApplySmoother< BlockVector< number > > mg_coarse_solver
Definition linear_solver.h:65
dealii::mg::Matrix< BlockVector< number > > mg_matrix
Definition linear_solver.h:66
Smoother mg_smoother
Definition linear_solver.h:64
dealii::PreconditionChebyshev< MFOperator< dim, degree, number >, BlockVector< number >, dealii::DiagonalMatrix< BlockVector< number > > > PreconditionChebyshev
Definition linear_solver.h:50
dealii::MGLevelObject< MFOperator< dim, degree, number > > mg_lhs_operators
Definition linear_solver.h:61
dealii::Multigrid< BlockVector< number > > multigrid
Definition linear_solver.h:67
dealii::PreconditionMG< dim, BlockVector< number >, MGTransferType > multigrid_preconditioner
Definition linear_solver.h:69
dealii::MGSmootherPrecondition< MFOperator< dim, degree, number >, SmootherPrecond, BlockVector< number > > Smoother
Definition linear_solver.h:55
PreconditionChebyshev SmootherPrecond
Definition linear_solver.h:54
dealii::MGTransferBlockGlobalCoarsening< dim, BlockVector< number > > MGTransferType
Definition linear_solver.h:58
static std::vector< dealii::MGConstrainedDoFs > make_mg_constraints(const SolveBlock &solve_block, const SolveContext< dim, degree, number > &solve_context, const GroupSolutionHandler< dim, number > &solutions)
Multigrid constraints.
Definition linear_solver.h:171
void init(unsigned int min_level, unsigned int max_level, const SolveBlock &solve_block, const LinearSolverParameters &lin_params, const SolveContext< dim, degree, number > &solve_context, const GroupSolutionHandler< dim, number > &solutions)
Definition linear_solver.h:87
MGContext()
Definition linear_solver.h:71
virtual void compute_rhs(FieldContainer< dim, degree, number > &variable_list, const SimulationTimer &sim_timer, unsigned int solver_id) const
User-implemented class for the RHS of explicit equations.
Definition pde_operator_base.h:80
virtual void compute_lhs(FieldContainer< dim, degree, number > &variable_list, const SimulationTimer &sim_timer, unsigned int solver_id) const
User-implemented class for the RHS of nonexplicit equations.
Definition pde_operator_base.h:89
Structure to hold the attributes of a solve-block.
Definition solve_block.h:58
DependencyMap dependencies_lhs
Dependencies for the lhs equation(s)
Definition solve_block.h:106
std::set< Types::Index > field_indices
Indices of the fields to be solved in this block.
Definition solve_block.h:97
This class provides context for a solver with ptrs to all the relevant dependencies.
Definition solve_context.h:34
const DoFManager< dim, degree > & get_dof_manager() const
Get the dof manager.
Definition solve_context.h:101
const std::vector< FieldAttributes > & get_field_attributes() const
Get the field attributes.
Definition solve_context.h:62
SolutionIndexer< dim, number > & get_solution_indexer() const
Get the solution manager.
Definition solve_context.h:159
const PDEOperatorBase< dim, degree, number > & get_pde_operator() const
Get a shared pointer to the pde operator.
Definition solve_context.h:205
const SimulationTimer & get_simulation_timer() const
Get the simulation timer.
Definition solve_context.h:187
const InvMManager< dim, degree, number > & get_invm_manager() const
Get the invm manager.
Definition solve_context.h:169
const MatrixFreeManager< dim, number > & get_matrix_free_manager() const
Get the MatrixFree manager.
Definition solve_context.h:141
virtual void init(const std::list< SolveBlock > &all_solve_blocks)
Initialize the solver.
Definition solver_base.h:84
virtual void reinit()
Reinitialize the solution vectors & apply constraints.
Definition solver_base.h:102
SolverBase(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition solver_base.h:36
GroupSolutionHandler< dim, number > solutions
Solution vectors for fields handled by this solver.
Definition solver_base.h:293
const SolveContext< dim, degree, number > * solve_context
Solver context provides access to external information.
Definition solver_base.h:288
SolveBlock solve_block
Information about the solve block this handler is responsible for.
Definition solver_base.h:283
static void start_section(const char *name)
Start a new timer section.
Definition timer.cc:116
static void end_section(const char *name)
End the timer section.
Definition timer.cc:127
@ Dirichlet
Definition constraint_parameters.h:34
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVector
Typedef for solution block vector.
Definition matrix_free_manager.h:32
Definition conditional_ostreams.cc:20
Definition vectorized_operations.h:17
std::map< unsigned int, ComponentConditions > component_constraints
Definition constraint_parameters.h:74
Structure to hold the attributes of a field. This includes things like the name, rank,...
Definition field_attributes.h:26
TensorRank field_type
Field type (Scalar/Vector).
Definition field_attributes.h:51
BoundaryConditionSet boundary_conditions
Field type (Scalar/Vector).
Definition field_attributes.h:56
Struct that stores relevant linear solve information of a certain solve block.
Definition solve_parameters.h:29
unsigned int max_iterations
Definition solve_parameters.h:61
dealii::SolverGMRES ::AdditionalData gmres_parameters
Definition solve_parameters.h:94
SolverToleranceType tolerance_type
Definition solve_parameters.h:58
dealii::PreconditionChebyshev ::AdditionalData chebyshev_parameters
Definition solve_parameters.h:70
dealii::SolverBicgstab ::AdditionalData bicgstab_parameters
Definition solve_parameters.h:86
dealii::SolverRichardson ::AdditionalData richardson_parameters
Definition solve_parameters.h:78
unsigned int mg_depth
Definition solve_parameters.h:64
@ Vector
Definition type_enums.h:55
@ Chebyshev
Definition type_enums.h:145
@ None
Definition type_enums.h:144
@ GMG
Definition type_enums.h:146
SolverToleranceType
Solver tolerance type.
Definition type_enums.h:112
@ RMSEPerField
The mean local error averaged over each field is lower than the tolerance.
Definition type_enums.h:124
@ AbsoluteResidual
Legacy.
Definition type_enums.h:116
@ RMSETotal
The sum of the average local errors of each field is lower than the tolerance.
Definition type_enums.h:132
@ IntegratedPerField
The integrated error averaged over each field is lower than the tolerance.
Definition type_enums.h:128