PRISMS-PF Manual
Loading...
Searching...
No Matches
linear_solver.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
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>
10
14#include <prismspf/core/timer.h>
16#include <prismspf/core/types.h>
17
20
22
23#include <prismspf/config.h>
24
25#include <memory>
26#include <string>
27//
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>
37
39
40template <unsigned int dim, unsigned int degree, typename number>
41class SolveContext;
42
46template <unsigned int dim, unsigned int degree, typename number>
48{
49public:
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>>;
60 // dc = default constructible, ndc = not default constructible
61 dealii::MGLevelObject<MFOperator<dim, degree, number>> mg_lhs_operators; // dc
62 std::vector<dealii::MGConstrainedDoFs> mg_constraints; // dc
65 dealii::MGCoarseGridApplySmoother<BlockVector<number>> mg_coarse_solver; // dc
66 dealii::mg::Matrix<BlockVector<number>> mg_matrix; // dc
67 dealii::Multigrid<BlockVector<number>> multigrid; // ndc
68 dealii::PreconditionMG<dim, BlockVector<number>, MGTransferType>
70
78 0,
79 0,
80 dealii::Multigrid<BlockVector<number>>::Cycle::v_cycle)
81 , multigrid_preconditioner(std::vector<const dealii::DoFHandler<dim> *>(),
84 {}
85
86 void
87 init(unsigned int min_level,
88 unsigned int max_level,
89 const SolveBlock &solve_block,
90 const LinearSolverParameters &lin_params,
91 const SolveContext<dim, degree, number> &solve_context,
92 const GroupSolutionHandler<dim, number> &solutions)
93 {
94 // 1. Level operators
96 dealii::MGLevelObject<MFOperator<dim, degree, number>>(min_level, max_level);
97 for (unsigned level = min_level; level <= max_level; ++level)
98 {
99 const unsigned int relative_level = max_level - level;
100 mg_lhs_operators[level].init(solve_context.get_pde_operator(),
102 solve_context.get_field_attributes(),
103 solve_context.get_solution_indexer(),
104 solve_context.get_matrix_free_manager(),
105 solve_context.get_simulation_timer(),
106 solve_block,
107 solve_block.dependencies_lhs);
108 mg_lhs_operators[level].set_scaling_diagonal(
109 lin_params.tolerance_type != AbsoluteResidual,
110 solve_context.get_invm_manager().get_invm_sqrt(
111 solve_context.get_field_attributes(),
112 solve_block.field_indices,
113 relative_level));
114 mg_lhs_operators[level].set_relative_level(relative_level);
115 }
116
117 // 2. MG Constraints (homogeneous)
118 mg_constraints = make_mg_constraints(solve_block, solve_context, solutions);
119
120 // 3. MG Transfer
121 mg_transfer.initialize_constraints(mg_constraints);
122 mg_transfer.build(
123 solve_context.get_dof_manager().get_block_dof_handlers(solve_block.field_indices));
124
125 // 4. MG Smoother
126 dealii::MGLevelObject<typename SmootherPrecond::AdditionalData> smoother_data(
127 min_level,
128 max_level);
129 const auto &chebyshev_params = lin_params.chebyshev_parameters;
130 for (unsigned int level = min_level; level <= max_level; ++level)
131 {
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(); // todo
137
138 mg_lhs_operators[level].reinit_matrix_diagonal();
139 smoother_data[level].preconditioner =
140 mg_lhs_operators[level].get_matrix_diagonal_inverse();
141 }
142 mg_smoother.initialize(mg_lhs_operators, smoother_data);
143
144 // 5. Coarse grid solver
145 mg_coarse_solver.initialize(mg_smoother);
146
147 // 6. Multigrid object
148 mg_matrix = dealii::mg::Matrix<BlockVector<number>>(mg_lhs_operators);
149 multigrid = dealii::Multigrid<BlockVector<number>>(
150 mg_matrix,
155 min_level,
156 max_level,
157 dealii::Multigrid<BlockVector<number>>::Cycle::v_cycle);
158
159 // multigrid_preconditioner =
160 // dealii::PreconditionMG<dim, BlockVector<number>, MGTransferType>(
161 // solve_context.get_dof_manager()
162 // .get_block_dof_handlers(solve_block.field_indices),
163 // multigrid,
164 // mg_transfer);
165 }
166
170 static std::vector<dealii::MGConstrainedDoFs>
171 make_mg_constraints(const SolveBlock &solve_block,
172 const SolveContext<dim, degree, number> &solve_context,
173 const GroupSolutionHandler<dim, number> &solutions)
174 {
175 std::vector<dealii::MGConstrainedDoFs> mg_constraints(
176 solve_block.field_indices.size());
177 for (unsigned int block_index = 0; block_index < solve_block.field_indices.size();
178 block_index++)
179 {
180 unsigned int field_index = solutions.get_block_to_global_index()[block_index];
181 mg_constraints[block_index].initialize(
182 solve_context.get_dof_manager().get_field_dof_handler(field_index));
183 }
184 std::unordered_map<std::string, FieldConstraints<dim>> boundary_condition_list =
185 solve_context.get_user_inputs().boundary_parameters.boundary_condition_list;
186 const std::vector<FieldAttributes> &field_attributes =
187 solve_context.get_field_attributes();
188 for (unsigned int block_index = 0; block_index < solve_block.field_indices.size();
189 block_index++)
190 {
191 unsigned int field_index = solutions.get_block_to_global_index()[block_index];
192 const FieldAttributes &field = field_attributes[field_index];
193 unsigned int num_comps = (field.field_type == TensorRank::Vector) ? dim : 1;
194 for (unsigned int comp = 0; comp < num_comps; comp++)
195 {
196 std::set<unsigned int> constrained_boundary_ids;
197 const ComponentConditions &comp_bcs =
198 boundary_condition_list[field.name].component_constraints.at(comp);
199 for (const auto &[boundary_id, boundary_type] : comp_bcs.conditions)
200 {
201 if (boundary_type == Condition::Dirichlet ||
202 boundary_type == Condition::TimeDependentDirichlet)
203 {
204 constrained_boundary_ids.insert(boundary_id);
205 }
206 }
207 mg_constraints[block_index].make_zero_boundary_constraints(
208 solve_context.get_dof_manager().get_field_dof_handler(field_index),
209 constrained_boundary_ids,
210 num_comps == 1
213 }
214 }
215 return mg_constraints;
216 }
217};
218
223template <unsigned int dim, unsigned int degree, typename number>
224class LinearSolver : public SolverBase<dim, degree, number>
225{
226protected:
227 using SolverBase<dim, degree, number>::solutions;
228 using SolverBase<dim, degree, number>::solve_context;
229 using SolverBase<dim, degree, number>::solve_block;
231 dealii::PreconditionChebyshev<MFOperator<dim, degree, number>,
233 dealii::DiagonalMatrix<BlockVector<number>>>;
234
235public:
241 const SolveContext<dim, degree, number> &_solve_context)
242 : SolverBase<dim, degree, number>(_solve_block, _solve_context)
243 {}
244
248 void
249 init(const std::list<SolveBlock> &all_solve_blocks) override
250 {
252 rhs_vector.reinit(solutions.get_solution_full_vector());
253
254 // Initialize rhs_operator
255 rhs_operator.init(solve_context->get_pde_operator(),
257 solve_context->get_field_attributes(),
258 solve_context->get_solution_indexer(),
259 solve_context->get_matrix_free_manager(),
260 solve_context->get_simulation_timer(),
262 solve_block.dependencies_rhs);
263 rhs_operator.set_scaling_diagonal(lin_params().tolerance_type != AbsoluteResidual,
264 solve_context->get_invm_manager().get_invm_sqrt(
265 solve_context->get_field_attributes(),
266 solve_block.field_indices));
267 // Initialize lhs_operator
268 lhs_operator.init(solve_context->get_pde_operator(),
270 solve_context->get_field_attributes(),
271 solve_context->get_solution_indexer(),
272 solve_context->get_matrix_free_manager(),
273 solve_context->get_simulation_timer(),
275 solve_block.dependencies_lhs);
276 lhs_operator.set_scaling_diagonal(lin_params().tolerance_type != AbsoluteResidual,
277 solve_context->get_invm_manager().get_invm_sqrt(
278 solve_context->get_field_attributes(),
279 solve_block.field_indices));
280
281 linear_solver_control.set_max_steps(lin_params().max_iterations);
282 linear_solver_control.set_tolerance(lin_params().tolerance * normalization_value());
284 inhomogeneous_values.reinit(solutions.get_solution_full_vector());
285 solutions.apply_constraints(inhomogeneous_values);
286 inhomogeneous_rhs.reinit(solutions.get_solution_full_vector());
288 }
289
293 void
294 reinit() override
295 {
297 rhs_vector.reinit(solutions.get_solution_full_vector());
298
299 inhomogeneous_values.reinit(solutions.get_solution_full_vector());
300 solutions.apply_constraints(inhomogeneous_values);
301 inhomogeneous_rhs.reinit(solutions.get_solution_full_vector());
303 }
304
308 void
309 solve_impl() override
310 {
311 // Zero out the ghosts
312 Timer::start_section("Zero ghosts");
313 solutions.zero_out_ghosts();
314 Timer::end_section("Zero ghosts");
315
316 // Set up rhs vector
317 rhs_operator.compute_operator(rhs_vector);
318
319 // Set inhomogeneous Dirichlet values. TODO: only update if time-dependent
320 solutions.apply_constraints(inhomogeneous_values);
321
322 // Note 1. Use the previous result of the linear solve without nonzero dirichlet
323 // as the initial guess in the next increment. See Note 2. `inhomogeneous_rhs` is
324 // not actually what it is being used as here, we just don't want to allocate a
325 // whole new vector for this purpose
326 solutions.get_solution_full_vector().swap(inhomogeneous_rhs);
327 // Get the homogeneous rhs
328 lhs_operator.read_plain = true;
330 lhs_operator.read_plain = false;
332
333 // Linear solve
334 do_linear_solve(rhs_vector, lhs_operator, solutions.get_solution_full_vector());
335
336 // Note 2. Make a copy of the solution to use as the initial guess in the next
337 // increment. See Note 1. `inhomogeneous_rhs` is not actually what it is being
338 // used as here, we just don't want to allocate a whole new vector for this
339 // purpose
340 inhomogeneous_rhs = solutions.get_solution_full_vector();
341 // Add back in nonzero dirichlet conditions
342 solutions.get_solution_full_vector() += inhomogeneous_values;
343
344 // Apply constraints
345 solutions.apply_constraints();
346
347 // Update the ghosts
348 Timer::start_section("Update ghosts");
349 solutions.update_ghosts();
350 Timer::end_section("Update ghosts");
351 }
352
353 int
356 BlockVector<number> &x_vector)
357 {
358 // Linear solve
359 try
360 {
361 if (lin_params().preconditioner == None)
362 {
363 lin_solver.solve(lhs_matrix,
364 x_vector,
365 b_vector,
366 dealii::PreconditionIdentity());
367 }
368 else if (lin_params().preconditioner == Chebyshev)
369 {
370 lhs_matrix.reinit_matrix_diagonal();
371 lhs_matrix.eval_matrix_diagonal();
372
373 lin_solver.solve(lhs_matrix, x_vector, b_vector, precond_chebyshev);
374 }
375 else if (lin_params().preconditioner == GMG)
376 {
377 // TODO: recalculate diagonals
378 auto &lhs_ops = mg_context.mg_lhs_operators;
379 for (unsigned int level = lhs_ops.min_level(); level <= lhs_ops.max_level();
380 ++level)
381 {
382 lhs_ops[level].reinit_matrix_diagonal(); // todo
383 lhs_ops[level].eval_matrix_diagonal();
384 }
385 lin_solver.solve(lhs_operator, x_vector, b_vector, *multigrid_preconditioner);
386 }
387 }
388 catch (dealii::SolverControl::NoConvergence &exc)
389 {
391 << "[Increment " << solve_context->get_simulation_timer().get_increment()
392 << "] "
393 << "Warning: linear solver did not converge as per set tolerances before "
394 << lin_params().max_iterations << " iterations.\n";
395 }
396 if (solve_context->get_user_inputs().output_parameters.should_output(
397 solve_context->get_simulation_timer().get_increment()))
398 {
400 << " Linear solve final residual : "
402 << " Linear steps: " << linear_solver_control.last_step() << "\n"
403 << std::flush;
404 }
405 return linear_solver_control.last_step();
406 }
407
408protected:
413
416
417 double
419 {
421 double value = 1.0;
422 if (type == RMSEPerField || type == RMSETotal)
423 {
424 value *= std::sqrt(solve_context->get_triangulation_manager().get_volume());
425 }
426 if (type == RMSEPerField || type == IntegratedPerField)
427 {
428 value *= std::sqrt(double(solve_block.field_indices.size()));
429 }
430 return value;
431 }
432
433 void
435 {
436 if (lin_params().preconditioner == None)
437 {
438 void(0); // do nothing
439 }
440 if (lin_params().preconditioner == Chebyshev)
441 {
443 }
444 if (lin_params().preconditioner == GMG)
445 {
447 }
448 }
449
450 void
452 {
453 const auto &chebyshev_params = lin_params().chebyshev_parameters;
454 precond_data.degree = chebyshev_params.degree;
455 precond_data.smoothing_range = chebyshev_params.smoothing_range; // ≈ λ_min / λ_max
456 precond_data.eig_cg_n_iterations = chebyshev_params.eig_cg_n_iterations;
457
458 lhs_operator.reinit_matrix_diagonal();
459 precond_data.preconditioner = lhs_operator.get_matrix_diagonal_inverse();
460
462 }
463
464 void
466 {
467 const auto &richardson_parameters = lin_params().richardson_parameters;
468 const auto &bicgstab_parameters = lin_params().bicgstab_parameters;
469 const auto &gmres_parameters = lin_params().gmres_parameters;
470 const typename dealii::SolverRichardson<BlockVector<number>>::AdditionalData
471 local_richardson_parameters(richardson_parameters.omega,
472 richardson_parameters.use_preconditioned_residual);
473 const typename dealii::SolverBicgstab<BlockVector<number>>::AdditionalData
474 local_bicgstab_parameters(bicgstab_parameters.exact_residual,
475 bicgstab_parameters.breakdown);
476 const typename dealii::SolverGMRES<BlockVector<number>>::AdditionalData
477 local_gmres_parameters(gmres_parameters.max_basis_size,
478 gmres_parameters.right_preconditioning,
479 gmres_parameters.use_default_residual,
480 gmres_parameters.force_re_orthogonalization,
481 gmres_parameters.batched_mode,
482 gmres_parameters.orthogonalization_strategy);
483 const typename dealii::SolverFGMRES<BlockVector<number>>::AdditionalData
484 local_fgmres_parameters(gmres_parameters.max_basis_size,
485 gmres_parameters.orthogonalization_strategy);
486
487 lin_solver.set_data(local_richardson_parameters);
488 lin_solver.set_data(local_bicgstab_parameters);
489 lin_solver.set_data(local_gmres_parameters);
490 lin_solver.set_data(local_fgmres_parameters);
491
492 lin_solver.select(lin_params().solver_type);
494 }
495
496private:
502 {
503 return solve_block.linear_solver_parameters;
504 }
505
509 dealii::SolverControl linear_solver_control;
510
514 dealii::SolverSelector<BlockVector<number>> lin_solver;
515
521
526
528 PreconditionChebyshev::AdditionalData precond_data;
529
531
533 dealii::PreconditionMG<dim,
539 std::shared_ptr<PreconditionMG> multigrid_preconditioner = nullptr;
540
541 void
543 {
544 const unsigned int global_refinement =
545 solve_context->get_user_inputs().spatial_discretization.global_refinement;
546 const unsigned int min_level = global_refinement - (lin_params().mg_depth) + 1;
547 const unsigned int max_level = global_refinement;
549 .init(min_level, max_level, solve_block, lin_params(), *solve_context, solutions);
550 multigrid_preconditioner = std::make_shared<PreconditionMG>(
551 solve_context->get_dof_manager().get_block_dof_handlers(solve_block.field_indices),
552 mg_context.multigrid,
553 mg_context.mg_transfer);
554 }
555};
556
557PRISMS_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:146
static const std::array< dealii::ComponentMask, dim > vector_component_mask
Create a component mask.
Definition constraint_manager.h:145
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:520
void initialize_preconditioner()
Definition linear_solver.h:434
MFOperator< dim, degree, number > rhs_operator
Matrix free operators.
Definition linear_solver.h:412
void initialize_solver()
Definition linear_solver.h:465
BlockVector< number > rhs_vector
Definition linear_solver.h:415
const LinearSolverParameters & lin_params() const
Linear solver parameters.
Definition linear_solver.h:501
double normalization_value()
Definition linear_solver.h:418
PreconditionChebyshev precond_chebyshev
Definition linear_solver.h:527
int do_linear_solve(BlockVector< number > &b_vector, MFOperator< dim, degree, number > &lhs_matrix, BlockVector< number > &x_vector)
Definition linear_solver.h:354
PreconditionChebyshev::AdditionalData precond_data
Definition linear_solver.h:528
MFOperator< dim, degree, number > lhs_operator
Definition linear_solver.h:414
BlockVector< number > inhomogeneous_rhs
Result of the linear operator applied to the inhomogeneous values.
Definition linear_solver.h:525
void init(const std::list< SolveBlock > &all_solve_blocks) override
Initialize the solver.
Definition linear_solver.h:249
dealii::PreconditionMG< dim, BlockVector< number >, typename MGContext< dim, degree, number >::MGTransferType > PreconditionMG
Definition linear_solver.h:532
dealii::SolverSelector< BlockVector< number > > lin_solver
Solver. Can switch between different linear solvers.
Definition linear_solver.h:514
dealii::PreconditionChebyshev< MFOperator< dim, degree, number >, BlockVector< number >, dealii::DiagonalMatrix< BlockVector< number > > > PreconditionChebyshev
Definition linear_solver.h:230
void initialize_multigrid()
Definition linear_solver.h:542
std::shared_ptr< PreconditionMG > multigrid_preconditioner
Multigrid preconditioner.
Definition linear_solver.h:539
void initialize_chebyshev()
Definition linear_solver.h:451
dealii::SolverControl linear_solver_control
Solver control. Contains max iterations and tolerance.
Definition linear_solver.h:509
void solve_impl() override
Solve for a single update step.
Definition linear_solver.h:309
LinearSolver(SolveBlock _solve_block, const SolveContext< dim, degree, number > &_solve_context)
Constructor.
Definition linear_solver.h:240
MGContext< dim, degree, number > mg_context
Definition linear_solver.h:530
void reinit() override
Reinitialize the solver.
Definition linear_solver.h:294
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:213
void eval_matrix_diagonal()
Evaluate matrix diagonal (and inverse).
Definition mf_operator.cc:236
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:79
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:88
Structure to hold the attributes of a solve-block.
Definition solve_block.h:59
DependencyMap dependencies_lhs
Dependencies for the lhs equation(s)
Definition solve_block.h:107
std::set< Types::Index > field_indices
Indices of the fields to be solved in this block.
Definition solve_block.h:98
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:100
const std::vector< FieldAttributes > & get_field_attributes() const
Get the field attributes.
Definition solve_context.h:61
SolutionIndexer< dim, number > & get_solution_indexer() const
Get the solution manager.
Definition solve_context.h:158
const UserInputParameters< dim > & get_user_inputs() const
Get the user-inputs.
Definition solve_context.h:70
const PDEOperatorBase< dim, degree, number > & get_pde_operator() const
Get a shared pointer to the pde operator.
Definition solve_context.h:204
const SimulationTimer & get_simulation_timer() const
Get the simulation timer.
Definition solve_context.h:186
const InvMManager< dim, degree, number > & get_invm_manager() const
Get the invm manager.
Definition solve_context.h:168
const MatrixFreeManager< dim, number > & get_matrix_free_manager() const
Get the MatrixFree manager.
Definition solve_context.h:140
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
@ TimeDependentDirichlet
Definition constraint_parameters.h:37
@ Dirichlet
Definition constraint_parameters.h:35
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
Struct that stores relevant information for boundary conditions of a certain field.
Definition constraint_parameters.h:120
std::map< unsigned int, Condition > conditions
Definition constraint_parameters.h:125
Structure to hold the attributes of a field. This includes things like the name, rank,...
Definition field_attributes.h:24
TensorRank field_type
Field type (Scalar/Vector).
Definition field_attributes.h:47
std::string name
Field name.
Definition field_attributes.h:42
Struct that stores relevant linear solve information of a certain solve block.
Definition linear_solve_parameters.h:25
unsigned int max_iterations
Definition linear_solve_parameters.h:36
dealii::SolverGMRES ::AdditionalData gmres_parameters
Definition linear_solve_parameters.h:45
SolverToleranceType tolerance_type
Definition linear_solve_parameters.h:33
dealii::PreconditionChebyshev ::AdditionalData chebyshev_parameters
Definition linear_solve_parameters.h:41
dealii::SolverBicgstab ::AdditionalData bicgstab_parameters
Definition linear_solve_parameters.h:44
dealii::SolverRichardson ::AdditionalData richardson_parameters
Definition linear_solve_parameters.h:43
unsigned int mg_depth
Definition linear_solve_parameters.h:55
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
@ Chebyshev
Definition type_enums.h:145
@ None
Definition type_enums.h:144
@ GMG
Definition type_enums.h:146
@ Vector
Definition type_enums.h:55