Information about the thick spherical shell mesh. More...
#include <spherical_shell.hpp>
Public Member Functions | |
| DomainInfo ()=default | |
| DomainInfo (int diamond_lateral_refinement_level, const std::vector< double > &radii) | |
| Constructs a thick spherical shell with one subdomain per diamond (10 subdomains total) and shells at specific radii. | |
| DomainInfo (int diamond_lateral_refinement_level, const std::vector< double > &radii, int num_subdomains_in_lateral_direction, int num_subdomains_in_radial_direction) | |
| Constructs a thick spherical shell with shells at specific radii. | |
| int | subdomain_max_refinement_level () const |
| The "maximum refinement level" of the subdomains. | |
| int | diamond_lateral_refinement_level () const |
| const std::vector< double > & | radii () const |
| int | num_subdomains_per_diamond_side () const |
| int | num_subdomains_in_radial_direction () const |
| int | subdomain_num_nodes_per_side_laterally () const |
| Equivalent to calling subdomain_num_nodes_per_side_laterally( subdomain_refinement_level() ) | |
| int | subdomain_num_nodes_radially () const |
| Equivalent to calling subdomain_num_nodes_radially( subdomain_refinement_level() ) | |
| int | subdomain_num_nodes_per_side_laterally (const int level) const |
| Number of nodes in the lateral direction of a subdomain on the passed level. | |
| int | subdomain_num_nodes_radially (const int level) const |
| Number of nodes in the radial direction of a subdomain on the passed level. | |
| std::vector< SubdomainInfo > | local_subdomains (const SubdomainToRankDistributionFunction &subdomain_to_rank) const |
Information about the thick spherical shell mesh.
General information
The thick spherical shell is built from ten spherical diamonds. The diamonds are essentially curved hexahedra. The number of cells in lateral directions is required to be a power of 2, the number of cells in the radial direction can be chosen arbitrarily (though a power of two allows for maximally deep multigrid hierarchies).
Each diamond can be subdivided into subdomains (in all three directions) for better parallel distribution (each process can only operate on one or more entire subdomains).
This class holds data such as
Note that all subdomains always have the same shape.
Multigrid and coarsening
Since the global number of cells in a diamond in lateral and radial direction does not need to match, and since the number of cells in radial direction does not even need to be a power of two (although it is a good idea to choose it that way), this class computes the maximum number of coarsening steps (which is equivalent to the number of "refinement levels") dynamically. Thus, a bad choice for the number of radial layers may result in a mesh that cannot be coarsened at all.
Parallel distribution
This class has no notion of parallel distribution. For that refer to the DistributedDomain class.
|
default |
|
inline |
Constructs a thick spherical shell with one subdomain per diamond (10 subdomains total) and shells at specific radii.
uniform_shell_radii() to quickly construct a uniform list of radii.Note: a 'shell' is a spherical 2D manifold in 3D space (it is thin), a 'layer' is defined as the volume between two 'shells' (it is thick)
| diamond_lateral_refinement_level | number of lateral diamond refinements |
| radii | list of shell radii, vector must have at least 2 elements |
|
inline |
Constructs a thick spherical shell with shells at specific radii.
uniform_shell_radii() to quickly construct a uniform list of radii.Note: a 'shell' is a spherical 2D manifold in 3D space (it is thin), a 'layer' is defined as the volume between two 'shells' (it is thick)
| diamond_lateral_refinement_level | number of lateral diamond refinements |
| radii | list of shell radii, vector must have at least 2 elements |
| num_subdomains_in_lateral_direction | number of subdomains in lateral direction per diamond |
| num_subdomains_in_radial_direction | number of subdomains in radial direction per diamond |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
The "maximum refinement level" of the subdomains.
This (non-negative) number is essentially indicating how many times a subdomain can be uniformly coarsened.
|
inline |
Equivalent to calling subdomain_num_nodes_per_side_laterally( subdomain_refinement_level() )
|
inline |
Number of nodes in the lateral direction of a subdomain on the passed level.
The level must be non-negative. The finest level is given by subdomain_max_refinement_level().
|
inline |
Equivalent to calling subdomain_num_nodes_radially( subdomain_refinement_level() )
|
inline |
Number of nodes in the radial direction of a subdomain on the passed level.
The level must be non-negative. The finest level is given by subdomain_max_refinement_level().