6#include <deal.II/lac/precondition.h>
7#include <deal.II/lac/solver_cg.h>
8#include <deal.II/lac/solver_control.h>
22#include <prismspf/config.h>
26template <
unsigned int dim,
unsigned int degree,
typename number>
32template <
unsigned int dim,
unsigned int degree,
typename number>
46 :
SolverBase<dim, degree, number>(_solve_block, _solve_context)
48 solve_context->get_user_inputs().linear_solve_parameters.linear_solvers.at(
56 init(
const std::list<DependencyMap> &all_dependeny_sets)
override
59 unsigned int num_levels =
solve_context->get_dof_manager().get_dof_handlers().size();
61 for (
unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
64 solutions.get_solution_full_vector(relative_level));
68 for (
unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
87 for (
unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
118 const unsigned int num_levels =
rhs_vector.size();
119 for (
unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
122 solutions.get_solution_full_vector(relative_level));
137 solutions.zero_out_ghosts(relative_level);
142 if (relative_level == 0)
152 solutions.get_solution_full_vector(relative_level));
154 if (relative_level == 0)
159 solutions.apply_constraints(relative_level);
176 cg_solver.solve(lhs_operator, x_vector, b_vector, dealii::PreconditionIdentity());
177 if (
solve_context->get_user_inputs().output_parameters.should_output(
181 <<
" Linear solve final residual : "
190 <<
"[Increment " <<
solve_context->get_simulation_timer().get_increment()
192 <<
"Warning: linear solver did not converge as per set tolerances before "
193 <<
lin_params.max_iterations <<
" iterations.\n";
214 value *= std::sqrt(
solve_context->get_triangulation_manager().get_volume());
218 value *= std::sqrt(
double(
solve_block.field_indices.size()));
246PRISMS_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
std::vector< MFOperator< dim, degree, number > > rhs_operators
Matrix free operators for each level.
Definition linear_solver.h:202
BlockVector< number > inhomogenous_rhs
Result of the linear operator applied to the inhomogeneous values.
Definition linear_solver.h:243
int do_linear_solve(BlockVector< number > &b_vector, MFOperator< dim, degree, number > &lhs_operator, BlockVector< number > &x_vector)
Definition linear_solver.h:168
LinearSolverParameters lin_params
Linear solver parameters.
Definition linear_solver.h:227
double normalization_value()
Definition linear_solver.h:208
void init(const std::list< DependencyMap > &all_dependeny_sets) override
Initialize the solver.
Definition linear_solver.h:56
BlockVector< number > inhomogenous_values
Vector containing only the inhomogeneous constraints (namely, non-zero Dirichlet values)
Definition linear_solver.h:238
std::vector< BlockVector< number > > rhs_vector
Definition linear_solver.h:205
std::vector< MFOperator< dim, degree, number > > lhs_operators
Definition linear_solver.h:204
dealii::SolverControl linear_solver_control
Solver control. Contains max iterations and tolerance.
Definition linear_solver.h:232
LinearSolver(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition linear_solver.h:44
void solve_level(unsigned int relative_level) override
Solve for a single update step.
Definition linear_solver.h:133
void reinit() override
Reinitialize the solver.
Definition linear_solver.h:115
This class exists to evaluate a single user-defined operator for the matrix-free implementation of so...
Definition mf_operator.h:50
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:76
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:85
Structure to hold the attributes of a solve-block.
Definition solve_block.h:56
This class provides context for a solver with ptrs to all the relevant dependencies.
Definition solve_context.h:36
virtual void reinit()
Reinitialize the solution vectors & apply constraints.
Definition solver_base.h:98
SolverBase(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition solver_base.h:37
virtual void init(const std::list< DependencyMap > &all_dependeny_sets)
Initialize the solver.
Definition solver_base.h:83
GroupSolutionHandler< dim, number > solutions
Solution vectors for fields handled by this solver.
Definition solver_base.h:274
const SolveContext< dim, degree, number > * solve_context
Solver context provides access to external information.
Definition solver_base.h:269
SolveBlock solve_block
Information about the solve block this handler is responsible for.
Definition solver_base.h:264
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
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVector
Typedef for solution block vector.
Definition group_solution_handler.h:29
Definition conditional_ostreams.cc:20
Struct that stores relevant linear solve information of a certain field.
Definition linear_solve_parameters.h:22
SolverToleranceType
Solver tolerance type.
Definition type_enums.h:91
@ RMSEPerField
The mean local error averaged over each field is lower than the tolerance.
Definition type_enums.h:103
@ AbsoluteResidual
Legacy.
Definition type_enums.h:95
@ RMSETotal
The sum of the average local errors of each field is lower than the tolerance.
Definition type_enums.h:111
@ IntegratedPerField
The integrated error averaged over each field is lower than the tolerance.
Definition type_enums.h:107