SpECTRE
v2025.01.30
|
A V-cycle geometric multgrid solver for linear equations \(Ax = b\). More...
#include <Multigrid.hpp>
Public Types | |
using | fields_tag = FieldsTag |
using | options_group = OptionsGroup |
using | source_tag = SourceTag |
using | operand_tag = FieldsTag |
using | smooth_source_tag = source_tag |
using | smooth_fields_tag = fields_tag |
using | component_list = tmpl::list< detail::ElementsRegistrationComponent< Metavariables, OptionsGroup > > |
using | observed_reduction_data_tags = observers::make_reduction_data_tags< tmpl::list< async_solvers::reduction_data > > |
using | initialize_element = tmpl::list< async_solvers::InitializeElement< FieldsTag, OptionsGroup, SourceTag >, detail::InitializeElement< Dim, FieldsTag, OptionsGroup, SourceTag > > |
using | amr_projectors = tmpl::list< initialize_element, detail::ProjectMultigridSections< Metavariables > > |
using | register_element = tmpl::list< detail::RegisterElement< Dim, OptionsGroup >, async_solvers::RegisterElement< FieldsTag, OptionsGroup, SourceTag, Tags::IsFinestGrid >, observers::Actions::RegisterWithObservers< detail::RegisterWithVolumeObserver< OptionsGroup > > > |
template<typename ApplyOperatorActions , typename PreSmootherActions , typename PostSmootherActions , typename Label = OptionsGroup> | |
using | solve = tmpl::list< async_solvers::PrepareSolve< FieldsTag, OptionsGroup, SourceTag, Label, Tags::IsFinestGrid, false >, detail::ReceiveResidualFromFinerGrid< Dim, FieldsTag, OptionsGroup, SourceTag >, detail::PreparePreSmoothing< FieldsTag, OptionsGroup, SourceTag >, PreSmootherActions, detail::SkipPostSmoothingAtBottom< FieldsTag, OptionsGroup, SourceTag >, detail::SendResidualToCoarserGrid< FieldsTag, OptionsGroup, ResidualIsMassiveTag, SourceTag >, detail::ReceiveCorrectionFromCoarserGrid< Dim, FieldsTag, OptionsGroup, SourceTag >, ApplyOperatorActions, ::Actions::Label< detail::PostSmoothingBeginLabel >, PostSmootherActions, detail::SendCorrectionToFinerGrid< FieldsTag, OptionsGroup, SourceTag >, detail::ObserveVolumeData< FieldsTag, OptionsGroup, SourceTag >, async_solvers::CompleteStep< FieldsTag, OptionsGroup, SourceTag, Label, Tags::IsFinestGrid, false > > |
A V-cycle geometric multgrid solver for linear equations \(Ax = b\).
This linear solver iteratively corrects an initial guess \(x_0\) by restricting the residual \(b - Ax\) to a series of coarser grids, solving for a correction on the coarser grids, and then prolongating (interpolating) the correction back to the finer grids. The solves on grids with different scales can very effectively solve large-scale modes in the solution, which Krylov-type linear solvers such as GMRES or Conjugate Gradients typically struggle with. Therefore, a multigrid solver can be an effective preconditioner for Krylov-type linear solvers (see LinearSolver::gmres::Gmres
and LinearSolver::cg::ConjugateGradient
). See [30] for an introduction to multigrid methods.
LinearSolver::multigrid::ElementsAllocator
and LinearSolver::multigrid::coarsen
for the code that creates the multigrid hierarchy.Spectral::projection_matrix_child_to_parent
and Spectral::projection_matrix_parent_to_child
, where "child" means the finer grid and "parent" means the coarser grid. Note that the residuals \(b - Ax\) may or may not already include a mass matrix and Jacobian factors, depending on the implementation of the linear operator \(A\). To account for this, provide a tag as the ResidualIsMassiveTag
that holds a bool
. See section 3 in [72] for details on the inter-mesh operators.smooth_fields_tag
for the source in the smooth_source_tag
. Useful smoothers are asynchronous linear solvers that parallelize well, such as LinearSolver::Schwarz::Schwarz
. The multigrid algorithm doesn't assume anything about the smoother, but requires only that the PreSmootherActions
and the PostSmootherActions
passed to solve
leave the smooth_fields_tag
in a state that represents an approximate solution to the smooth_source_tag
, and that db::add_tag_prefix<LinearSolver::Tags::OperatorAppliedTo, smooth_fields_tag>
is left up-to-date as well. The smoother can assume that, on entry, these two tags represent the initial fields and the linear operator applied to the initial fields, respectively. Here's an example of setting up a smoother for the multigrid solver:The smoother can be used to construct an action list like this:
LinearSolver::multigrid::Tags::EnablePreSmoothing
), and then "going up" the grid hierarchy again, smoothing on every level again ("post-smoothing"). When going down, the algorithm projects the remaining residual of the smoother to the next-coarser grid, setting it as the source for the smoother on the coarser grid. When going up again, the algorithm projects the solution of the smoother to the next-finer grid, adding it to the solution on the finer grid as a correction. The bottom-most coarsest grid (the "tip" of the V-cycle) may skip the post-smoothing, so the result of the pre-smoother is immediately projected up to the finer grid (controlled by the LinearSolver::multigrid::Tags::EnablePostSmoothingAtBottom
option). On the top-most finest grid (the "original" grid that represents the overall solution) the algorithm applies the smoothing and the corrections from the coarser grids directly to the solution fields.