![]() |
deal.II version GIT relicensing-3075-gc235bd4825 2025-04-15 08:10:00+00:00
|
#include <deal.II/multigrid/multigrid.h>
Public Types | |
enum | Cycle { v_cycle , w_cycle , f_cycle } |
using | vector_type = VectorType |
using | const_vector_type = const VectorType |
Public Member Functions | |
Multigrid (const MGMatrixBase< VectorType > &matrix, const MGCoarseGridBase< VectorType > &coarse, const MGTransferBase< VectorType > &transfer, const MGSmootherBase< VectorType > &pre_smooth, const MGSmootherBase< VectorType > &post_smooth, const unsigned int minlevel=0, const unsigned int maxlevel=numbers::invalid_unsigned_int, Cycle cycle=v_cycle) | |
void | reinit (const unsigned int minlevel, const unsigned int maxlevel) |
void | cycle () |
void | vcycle () |
void | set_edge_matrices (const MGMatrixBase< VectorType > &edge_out, const MGMatrixBase< VectorType > &edge_in) |
void | set_edge_in_matrix (const MGMatrixBase< VectorType > &edge_in) |
void | set_edge_flux_matrices (const MGMatrixBase< VectorType > &edge_down, const MGMatrixBase< VectorType > &edge_up) |
unsigned int | get_maxlevel () const |
unsigned int | get_minlevel () const |
void | set_maxlevel (const unsigned int) |
void | set_minlevel (const unsigned int level, bool relative=false) |
void | set_cycle (Cycle) |
boost::signals2::connection | connect_pre_smoother_step (const std::function< void(const bool, const unsigned int)> &slot) |
boost::signals2::connection | connect_residual_step (const std::function< void(const bool, const unsigned int)> &slot) |
boost::signals2::connection | connect_restriction (const std::function< void(const bool, const unsigned int)> &slot) |
boost::signals2::connection | connect_coarse_solve (const std::function< void(const bool, const unsigned int)> &slot) |
boost::signals2::connection | connect_prolongation (const std::function< void(const bool, const unsigned int)> &slot) |
boost::signals2::connection | connect_edge_prolongation (const std::function< void(const bool, const unsigned int)> &slot) |
boost::signals2::connection | connect_post_smoother_step (const std::function< void(const bool, const unsigned int)> &slot) |
template<class Archive > | |
void | serialize (Archive &ar, const unsigned int version) |
Querying the observer pointers an object has. | |
unsigned int | n_subscriptions () const |
template<typename StreamType > | |
void | list_subscribers (StreamType &stream) const |
void | list_subscribers () const |
Static Public Member Functions | |
static ::ExceptionBase & | ExcInUse (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcNoSubscriber (std::string arg1, std::string arg2) |
Public Attributes | |
MGLevelObject< VectorType > | defect |
MGLevelObject< VectorType > | solution |
Private Types | |
using | map_value_type = decltype(counter_map)::value_type |
using | map_iterator = decltype(counter_map)::iterator |
Private Member Functions | |
void | level_v_step (const unsigned int level) |
void | level_step (const unsigned int level, Cycle cycle) |
EnableObserverPointer functionality | |
Classes derived from EnableObserverPointer provide a facility to subscribe to this object. This is mostly used by the ObserverPointer class. | |
void | subscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
void | unsubscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
void | check_no_subscribers () const noexcept |
Private Attributes | |
mg::Signals | signals |
Cycle | cycle_type |
unsigned int | minlevel |
unsigned int | maxlevel |
MGLevelObject< VectorType > | t |
MGLevelObject< VectorType > | defect2 |
ObserverPointer< const MGMatrixBase< VectorType >, Multigrid< VectorType > > | matrix |
ObserverPointer< const MGCoarseGridBase< VectorType >, Multigrid< VectorType > > | coarse |
ObserverPointer< const MGTransferBase< VectorType >, Multigrid< VectorType > > | transfer |
ObserverPointer< const MGSmootherBase< VectorType >, Multigrid< VectorType > > | pre_smooth |
ObserverPointer< const MGSmootherBase< VectorType >, Multigrid< VectorType > > | post_smooth |
ObserverPointer< const MGMatrixBase< VectorType > > | edge_out |
ObserverPointer< const MGMatrixBase< VectorType > > | edge_in |
ObserverPointer< const MGMatrixBase< VectorType >, Multigrid< VectorType > > | edge_down |
ObserverPointer< const MGMatrixBase< VectorType >, Multigrid< VectorType > > | edge_up |
std::atomic< unsigned int > | counter |
std::map< std::string, unsigned int > | counter_map |
std::vector< std::atomic< bool > * > | validity_pointers |
const std::type_info * | object_info |
Static Private Attributes | |
static std::mutex | mutex |
Friends | |
template<int dim, typename OtherVectorType , typename TransferType > | |
class | PreconditionMG |
Implementation of the multigrid method. The implementation supports both continuous and discontinuous elements and follows the procedure described in the multigrid paper by Janssen and Kanschat.
The function which starts a multigrid cycle on the finest level is cycle(). Depending on the cycle type chosen with the constructor (see enum Cycle), this function triggers one of the cycles level_v_step() or level_step(), where the latter one can do different types of cycles.
Using this class, it is expected that the right hand side has been converted from a vector living on the locally finest level to a multilevel vector. This is a nontrivial operation, usually initiated automatically by the class PreconditionMG and performed by the classes derived from MGTransferBase.
Definition at line 165 of file multigrid.h.
using Multigrid< VectorType >::vector_type = VectorType |
Definition at line 181 of file multigrid.h.
using Multigrid< VectorType >::const_vector_type = const VectorType |
Definition at line 182 of file multigrid.h.
|
privateinherited |
The data type used in counter_map.
Definition at line 224 of file enable_observer_pointer.h.
|
privateinherited |
The iterator type used in counter_map.
Definition at line 229 of file enable_observer_pointer.h.
enum Multigrid::Cycle |
List of implemented cycle types.
Enumerator | |
---|---|
v_cycle | The V-cycle. |
w_cycle | The W-cycle. |
f_cycle | The F-cycle. |
Definition at line 171 of file multigrid.h.
Multigrid< VectorType >::Multigrid | ( | const MGMatrixBase< VectorType > & | matrix, |
const MGCoarseGridBase< VectorType > & | coarse, | ||
const MGTransferBase< VectorType > & | transfer, | ||
const MGSmootherBase< VectorType > & | pre_smooth, | ||
const MGSmootherBase< VectorType > & | post_smooth, | ||
const unsigned int | minlevel = 0 , |
||
const unsigned int | maxlevel = numbers::invalid_unsigned_int , |
||
Cycle | cycle = v_cycle |
||
) |
Constructor. transfer
is an object performing prolongation and restriction. For levels in [minlevel, maxlevel] matrix has to contain valid matrices. By default the maxlevel is set to the maximal valid level.
This function already initializes the vectors which will be used later in the course of the computations. You should therefore create objects of this type as late as possible.
void Multigrid< VectorType >::cycle | ( | ) |
Execute one multigrid cycle. The type of cycle is selected by the constructor argument cycle. See the enum Cycle for available types.
void Multigrid< VectorType >::vcycle | ( | ) |
Execute one step of the V-cycle algorithm. This function assumes, that the multilevel vector defect is filled with the residual of an outer defect correction scheme. This is usually taken care of by PreconditionMG). After vcycle(), the result is in the multilevel vector solution. See copy_*_mg
in the MGTools namespace if you want to use these vectors yourself.
The actual work for this function is done in level_v_step().
void Multigrid< VectorType >::set_edge_matrices | ( | const MGMatrixBase< VectorType > & | edge_out, |
const MGMatrixBase< VectorType > & | edge_in | ||
) |
Set additional matrices to correct residual computation at refinement edges. Since we only smoothen in the interior of the refined part of the mesh, the coupling across the refinement edge is missing. This coupling is provided by these two matrices.
edge_out.vmult
is used, for the second argument, we use edge_in.Tvmult
. Thus, edge_in
should be assembled in transposed form. This saves a second sparsity pattern for edge_in
. In particular, for symmetric operators, both arguments can refer to the same matrix, saving assembling of one of them. void Multigrid< VectorType >::set_edge_in_matrix | ( | const MGMatrixBase< VectorType > & | edge_in | ) |
Similar to the function above: however, only edge_in
is set. This is useful if the matrix attached to this class ignores the edge constraints during vmult(), which is only used during the computation of the residual.
void Multigrid< VectorType >::set_edge_flux_matrices | ( | const MGMatrixBase< VectorType > & | edge_down, |
const MGMatrixBase< VectorType > & | edge_up | ||
) |
Set additional matrices to correct residual computation at refinement edges. These matrices originate from discontinuous Galerkin methods (see FE_DGQ etc.), where they correspond to the edge fluxes at the refinement edge between two levels.
edge_down.vmult
is used, for the second argument, we use edge_up.Tvmult
. Thus, edge_up
should be assembled in transposed form. This saves a second sparsity pattern for edge_up
. In particular, for symmetric operators, both arguments can refer to the same matrix, saving assembling of one of them. Return the finest level for multigrid.
Return the coarsest level for multigrid.
Set the highest level for which the multilevel method is performed. By default, this is the finest level of the Triangulation. Accepted are values not smaller than the current minlevel.
void Multigrid< VectorType >::set_minlevel | ( | const unsigned int | level, |
bool | relative = false |
||
) |
Chance cycle_type used in cycle().
boost::signals2::connection Multigrid< VectorType >::connect_pre_smoother_step | ( | const std::function< void(const bool, const unsigned int)> & | slot | ) |
Connect a function to mg::Signals::pre_smoother_step.
boost::signals2::connection Multigrid< VectorType >::connect_residual_step | ( | const std::function< void(const bool, const unsigned int)> & | slot | ) |
Connect a function to mg::Signals::residual_step.
boost::signals2::connection Multigrid< VectorType >::connect_restriction | ( | const std::function< void(const bool, const unsigned int)> & | slot | ) |
Connect a function to mg::Signals::restriction.
boost::signals2::connection Multigrid< VectorType >::connect_coarse_solve | ( | const std::function< void(const bool, const unsigned int)> & | slot | ) |
Connect a function to mg::Signals::coarse_solve.
boost::signals2::connection Multigrid< VectorType >::connect_prolongation | ( | const std::function< void(const bool, const unsigned int)> & | slot | ) |
Connect a function to mg::Signals::prolongation.
boost::signals2::connection Multigrid< VectorType >::connect_edge_prolongation | ( | const std::function< void(const bool, const unsigned int)> & | slot | ) |
Connect a function to mg::Signals::edge_prolongation.
boost::signals2::connection Multigrid< VectorType >::connect_post_smoother_step | ( | const std::function< void(const bool, const unsigned int)> & | slot | ) |
Connect a function to mg::Signals::post_smoother_step.
|
private |
The V-cycle multigrid method. level
is the level the function starts on. It will usually be called for the highest level from outside, but will then call itself recursively for level-1
, unless we are on minlevel where the coarse grid solver solves the problem exactly.
|
private |
The actual W-cycle or F-cycle multigrid method. level
is the level the function starts on. It will usually be called for the highest level from outside, but will then call itself recursively for level-1
, unless we are on minlevel where the coarse grid solver solves the problem exactly.
|
inlineinherited |
Return the present number of subscriptions to this object. This allows to use this class for reference counted lifetime determination where the last one to unsubscribe also deletes the object.
Definition at line 340 of file enable_observer_pointer.h.
|
inlineinherited |
List the subscribers to the input stream
.
Definition at line 357 of file enable_observer_pointer.h.
|
inherited |
List the subscribers to deallog
.
Definition at line 200 of file enable_observer_pointer.cc.
|
inlineinherited |
Read or write the data of this object to or from a stream for the purpose of serialization using the BOOST serialization library.
This function does not actually serialize any of the member variables of this class. The reason is that what this class stores is only who subscribes to this object, but who does so at the time of storing the contents of this object does not necessarily have anything to do with who subscribes to the object when it is restored. Consequently, we do not want to overwrite the subscribers at the time of restoring, and then there is no reason to write the subscribers out in the first place.
Definition at line 349 of file enable_observer_pointer.h.
|
privateinherited |
Subscribes a user of the object by storing the pointer validity
. The subscriber may be identified by text supplied as identifier
.
Definition at line 132 of file enable_observer_pointer.cc.
|
privateinherited |
Unsubscribes a user from the object.
identifier
and the validity
pointer must be the same as the one supplied to subscribe(). Definition at line 152 of file enable_observer_pointer.cc.
|
privatenoexceptinherited |
Check that there are no objects subscribing to this object. If this check passes then it is safe to destroy the current object. It this check fails then this function will either abort or print an error message to deallog (by using the AssertNothrow mechanism), but will not throw an exception.
Definition at line 54 of file enable_observer_pointer.cc.
|
friend |
Definition at line 486 of file multigrid.h.
|
private |
Signals for the various actions that the Multigrid algorithm uses.
Definition at line 365 of file multigrid.h.
Cycle type performed by the method cycle().
Definition at line 389 of file multigrid.h.
Level for coarse grid solution.
Definition at line 394 of file multigrid.h.
Highest level of cells.
Definition at line 399 of file multigrid.h.
MGLevelObject<VectorType> Multigrid< VectorType >::defect |
Input vector for the cycle. Contains the defect of the outer method projected to the multilevel vectors.
Definition at line 406 of file multigrid.h.
MGLevelObject<VectorType> Multigrid< VectorType >::solution |
The solution update after the multigrid step.
Definition at line 411 of file multigrid.h.
|
private |
Auxiliary vector.
Definition at line 417 of file multigrid.h.
|
private |
Auxiliary vector for W- and F-cycles. Left uninitialized in V-cycle.
Definition at line 422 of file multigrid.h.
|
private |
The matrix for each level.
Definition at line 428 of file multigrid.h.
|
private |
The matrix for each level.
Definition at line 434 of file multigrid.h.
|
private |
Object for grid transfer.
Definition at line 440 of file multigrid.h.
|
private |
The pre-smoothing object.
Definition at line 446 of file multigrid.h.
|
private |
The post-smoothing object.
Definition at line 452 of file multigrid.h.
|
private |
Edge matrix from the interior of the refined part to the refinement edge.
vmult
is used for these matrices. Definition at line 459 of file multigrid.h.
|
private |
Transpose edge matrix from the refinement edge to the interior of the refined part.
Tvmult
is used for these matrices. Definition at line 467 of file multigrid.h.
|
private |
Edge matrix from fine to coarse.
vmult
is used for these matrices. Definition at line 475 of file multigrid.h.
|
private |
Transpose edge matrix from coarse to fine.
Tvmult
is used for these matrices. Definition at line 483 of file multigrid.h.
|
mutableprivateinherited |
Store the number of objects which subscribed to this object. Initially, this number is zero, and upon destruction it shall be zero again (i.e. all objects which subscribed should have unsubscribed again).
The creator (and owner) of an object is counted in the map below if HE manages to supply identification.
We use the mutable
keyword in order to allow subscription to constant objects also.
This counter may be read from and written to concurrently in multithreaded code: hence we use the std::atomic
class template.
Definition at line 213 of file enable_observer_pointer.h.
|
mutableprivateinherited |
In this map, we count subscriptions for each different identification string supplied to subscribe().
Definition at line 219 of file enable_observer_pointer.h.
|
mutableprivateinherited |
In this vector, we store pointers to the validity bool in the ObserverPointer objects that subscribe to this class.
Definition at line 235 of file enable_observer_pointer.h.
|
mutableprivateinherited |
Pointer to the typeinfo object of this object, from which we can later deduce the class name. Since this information on the derived class is neither available in the destructor, nor in the constructor, we obtain it in between and store it here.
Definition at line 243 of file enable_observer_pointer.h.
|
staticprivateinherited |
A mutex used to ensure data consistency when accessing the mutable
members of this class. This lock is used in the subscribe() and unsubscribe() functions, as well as in list_subscribers()
.
Definition at line 250 of file enable_observer_pointer.h.