SpECTRE  v2024.09.29
domain::creators::BinaryCompactObject< UseWorldtube > Class Template Reference

A general domain for two compact objects. More...

#include <BinaryCompactObject.hpp>

Classes

struct  CartesianCubeAtXCoord
 
struct  CenterOfMassOffset
 
struct  CubeScale
 
struct  Envelope
 
struct  EnvelopeRadius
 
struct  Excision
 Options for an excision region in the domain. More...
 
struct  InitialGridPoints
 
struct  InitialRefinement
 
struct  Object
 Options for one of the two objects in the binary domain. More...
 
struct  ObjectA
 
struct  ObjectB
 
struct  OpeningAngle
 
struct  OuterBoundaryCondition
 
struct  OuterRadius
 
struct  OuterShell
 
struct  RadialDistributionEnvelope
 
struct  RadialDistributionOuterShell
 
struct  TimeDependentMaps
 
struct  UseEquiangularMap
 

Public Types

using maps_list = tmpl::flatten< tmpl::list< domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, Affine3D >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, Equiangular3D >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, Affine3D, Translation >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, CoordinateMaps::DiscreteRotation< 3 >, Affine3D >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, Equiangular3D >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, Equiangular3D, Translation >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, CoordinateMaps::Frustum >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, CoordinateMaps::Wedge< 3 > >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, CoordinateMaps::Wedge< 3 >, Translation >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, Affine3D, Affine3D >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, Equiangular3D, Affine3D >, domain::CoordinateMap< Frame::BlockLogical, Frame::Inertial, CoordinateMaps::Wedge< 3 >, Affine3D >, bco::TimeDependentMapOptions< false >::maps_list > >
 
template<typename Metavariables >
using options = tmpl::append< tmpl::list< ObjectA, ObjectB, CenterOfMassOffset, EnvelopeRadius, OuterRadius, CubeScale, InitialRefinement, InitialGridPoints, UseEquiangularMap, RadialDistributionEnvelope, RadialDistributionOuterShell, OpeningAngle, TimeDependentMaps >, tmpl::conditional_t< domain::BoundaryConditions::has_boundary_conditions_base_v< typename Metavariables::system >, tmpl::list< OuterBoundaryCondition< domain::BoundaryConditions::get_boundary_conditions_base< typename Metavariables::system > > >, tmpl::list<> > >
 

Public Member Functions

 BinaryCompactObject (typename ObjectA::type object_A, typename ObjectB::type object_B, std::array< double, 2 > center_of_mass_offset, double envelope_radius, double outer_radius, double cube_scale, const typename InitialRefinement::type &initial_refinement, const typename InitialGridPoints::type &initial_number_of_grid_points, bool use_equiangular_map=true, CoordinateMaps::Distribution radial_distribution_envelope=CoordinateMaps::Distribution::Projective, CoordinateMaps::Distribution radial_distribution_outer_shell=CoordinateMaps::Distribution::Linear, double opening_angle_in_degrees=90.0, std::optional< bco::TimeDependentMapOptions< false > > time_dependent_options=std::nullopt, std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > outer_boundary_condition=nullptr, const Options::Context &context={})
 
 BinaryCompactObject (const BinaryCompactObject &)=delete
 
 BinaryCompactObject (BinaryCompactObject &&)=default
 
BinaryCompactObjectoperator= (const BinaryCompactObject &)=delete
 
BinaryCompactObjectoperator= (BinaryCompactObject &&)=default
 
Domain< 3 > create_domain () const override
 
std::unordered_map< std::string, tnsr::I< double, 3, Frame::Grid > > grid_anchors () const override
 A set of named coordinates in the grid frame, like the center of the domain or the positions of specific objects in a domain. More...
 
std::vector< DirectionMap< 3, std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > > > external_boundary_conditions () const override
 The set of external boundary condition for every block in the domain. More...
 
std::vector< std::array< size_t, 3 > > initial_extents () const override
 Obtain the initial grid extents of the Elements in each block. More...
 
std::vector< std::array< size_t, 3 > > initial_refinement_levels () const override
 Obtain the initial refinement levels of the blocks. More...
 
std::vector< std::stringblock_names () const override
 A human-readable name for every block, or empty if the domain creator doesn't support block names (yet). More...
 
std::unordered_map< std::string, std::unordered_set< std::string > > block_groups () const override
 Labels to refer to groups of blocks. The groups can overlap, and they don't have to cover all blocks in the domain. The groups can be used to refer to multiple blocks at once when specifying input-file options. More...
 
auto functions_of_time (const std::unordered_map< std::string, double > &initial_expiration_times={}) const -> std::unordered_map< std::string, std::unique_ptr< domain::FunctionsOfTime::FunctionOfTime > > override
 Retrieve the functions of time used for moving meshes. More...
 
- Public Member Functions inherited from DomainCreator< 3 >
 DomainCreator (const DomainCreator< VolumeDim > &)=delete
 
 DomainCreator (DomainCreator< VolumeDim > &&)=default
 
DomainCreator< VolumeDim > & operator= (const DomainCreator< VolumeDim > &)=delete
 
DomainCreator< VolumeDim > & operator= (DomainCreator< VolumeDim > &&)=default
 
virtual Domain< VolumeDim > create_domain () const=0
 
virtual std::unordered_map< std::string, tnsr::I< double, VolumeDim, Frame::Grid > > grid_anchors () const
 A set of named coordinates in the grid frame, like the center of the domain or the positions of specific objects in a domain. More...
 
virtual std::vector< DirectionMap< VolumeDim, std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > > > external_boundary_conditions () const=0
 The set of external boundary condition for every block in the domain. More...
 
virtual std::vector< std::stringblock_names () const
 A human-readable name for every block, or empty if the domain creator doesn't support block names (yet). More...
 
virtual std::unordered_map< std::string, std::unordered_set< std::string > > block_groups () const
 Labels to refer to groups of blocks. The groups can overlap, and they don't have to cover all blocks in the domain. The groups can be used to refer to multiple blocks at once when specifying input-file options. More...
 
virtual std::vector< std::array< size_t, VolumeDim > > initial_extents () const=0
 Obtain the initial grid extents of the Elements in each block. More...
 
virtual std::vector< std::array< size_t, VolumeDim > > initial_refinement_levels () const=0
 Obtain the initial refinement levels of the blocks. More...
 
virtual auto functions_of_time (const std::unordered_map< std::string, double > &initial_expiration_times={}) const -> std::unordered_map< std::string, std::unique_ptr< domain::FunctionsOfTime::FunctionOfTime > >
 Retrieve the functions of time used for moving meshes. More...
 

Static Public Attributes

static constexpr Options::String help
 
- Static Public Attributes inherited from DomainCreator< 3 >
static constexpr size_t volume_dim
 

Detailed Description

template<bool UseWorldtube = false>
class domain::creators::BinaryCompactObject< UseWorldtube >

A general domain for two compact objects.

A BHNS domain.

Creates a 3D Domain that represents a binary compact object solution. The Domain consists of 4 or 5 nested layers of blocks; these layers are, working from the interior toward the exterior:

  • Object A/B interior: (optional) The block at the center of each compact object, if not excised. If present, this block is a cube. If excised, the hole left by its absence is spherical.
  • Object A/B shell: The 6 blocks that resolve each individual compact object. This layer has a spherical outer boundary - if the corresponding interior block exists, then the layer is a cube-to-sphere transition; if the interior block is excised, then the layer is a spherical shell.
  • Object A/B cube: The 6 blocks that surround each object with a cube. Around each compact object, this layer transitions from a sphere to a cube.
  • Envelope: The 10 blocks that transition from the two inner cubes to a sphere centered at the origin.
  • Outer shell: The 10 blocks that form an outer shell centered at the origin, consisting of 2 endcap Wedges on the +x and -x axes, and 8 half Wedges along the yz plane. This layer is spherical, so a logarithmic map can optionally be used in this layer. This allows the domain to extend to large radial distances from the compact objects. This layer can be h-refined radially, creating a layer of multiple concentric spherical shells.
Notes:
  • Object A is located to the right of the origin (along the positive x-axis) and Object B is located to the left of the origin.
  • This domain offers some grid anchors. See domain::creators::bco::create_grid_anchors for which ones are offered.
  • "Cutting plane" refers to the plane along which the domain divides into two hemispheres. The cutting plane always intersects the x-axis at the origin.
  • The x-coordinate locations of the two objects should be chosen such that the center of mass is located at x=0.
  • The cubes are first constructed at the origin. Then, they are translated left/right by their Object's x-coordinate and offset depending on the cube length.
  • The CubeScale option describes how to scale the length of the cube surrounding object A/B. It must be greater than or equal to 1.0 with 1.0 meaning the side length of the cube is the initial physical separation between the two objects. If CubeScale is greater than 1.0, the centers of the two objects will be offset relative to the centers of the cubes.
  • Alternatively, one can replace the inner shell and cube blocks of each object with a single cartesian cube. This is less efficient, but allows testing of methods only coded on cartesian grids.
Time dependence:
The following time-dependent maps are applied:
  • A piecewise Expansion, a Rotation and a piecewise Translation is applied to all blocks from the Grid to the Inertial frame. However, if there is a shape map in the block (defined below), then the expansion, rotation, and translation maps go from the Distorted to the Inertial frame.
  • If an object is excised, then the corresponding shell has a Shape map. The shape map goes from the Grid to the Distorted frame.

All time dependent maps are optional to specify. To include a map, specify its options. Otherwise specify None for that map. You can also turn off time dependent maps all together by specifying None for the TimeDependentMaps option. See domain::creators::bco::TimeDependentMapOptions. This class must pass a template parameter of false to domain::creators::bco::TimeDependentMapOptions.

The UseWorldtube template parameter is set to false by default. When set to true, some of the functions of time will be IntegratedFunctionOfTime used to control the orbit of the worldtube.

Member Function Documentation

◆ block_groups()

template<bool UseWorldtube = false>
std::unordered_map< std::string, std::unordered_set< std::string > > domain::creators::BinaryCompactObject< UseWorldtube >::block_groups ( ) const
inlineoverridevirtual

Labels to refer to groups of blocks. The groups can overlap, and they don't have to cover all blocks in the domain. The groups can be used to refer to multiple blocks at once when specifying input-file options.

Reimplemented from DomainCreator< 3 >.

◆ block_names()

template<bool UseWorldtube = false>
std::vector< std::string > domain::creators::BinaryCompactObject< UseWorldtube >::block_names ( ) const
inlineoverridevirtual

A human-readable name for every block, or empty if the domain creator doesn't support block names (yet).

Reimplemented from DomainCreator< 3 >.

◆ create_domain()

template<bool UseWorldtube = false>
Domain< 3 > domain::creators::BinaryCompactObject< UseWorldtube >::create_domain ( ) const
overridevirtual

Implements DomainCreator< 3 >.

◆ external_boundary_conditions()

template<bool UseWorldtube = false>
std::vector< DirectionMap< 3, std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > > > domain::creators::BinaryCompactObject< UseWorldtube >::external_boundary_conditions ( ) const
overridevirtual

The set of external boundary condition for every block in the domain.

Implements DomainCreator< 3 >.

◆ functions_of_time()

template<bool UseWorldtube = false>
auto domain::creators::BinaryCompactObject< UseWorldtube >::functions_of_time ( const std::unordered_map< std::string, double > &  initial_expiration_times = {}) const -> std::unordered_map< std::string, std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime>>
overridevirtual

Retrieve the functions of time used for moving meshes.

Reimplemented from DomainCreator< 3 >.

◆ grid_anchors()

template<bool UseWorldtube = false>
std::unordered_map< std::string, tnsr::I< double, 3, Frame::Grid > > domain::creators::BinaryCompactObject< UseWorldtube >::grid_anchors ( ) const
inlineoverridevirtual

A set of named coordinates in the grid frame, like the center of the domain or the positions of specific objects in a domain.

Reimplemented from DomainCreator< 3 >.

◆ initial_extents()

template<bool UseWorldtube = false>
std::vector< std::array< size_t, 3 > > domain::creators::BinaryCompactObject< UseWorldtube >::initial_extents ( ) const
inlineoverridevirtual

Obtain the initial grid extents of the Elements in each block.

Implements DomainCreator< 3 >.

◆ initial_refinement_levels()

template<bool UseWorldtube = false>
std::vector< std::array< size_t, 3 > > domain::creators::BinaryCompactObject< UseWorldtube >::initial_refinement_levels ( ) const
inlineoverridevirtual

Obtain the initial refinement levels of the blocks.

Implements DomainCreator< 3 >.

Member Data Documentation

◆ help

template<bool UseWorldtube = false>
constexpr Options::String domain::creators::BinaryCompactObject< UseWorldtube >::help
staticconstexpr
Initial value:
{
"A general domain for two compact objects. Each object is represented by "
"a cube along the x-axis. Object A is located on the right and Object B "
"is located on the left. Their locations should be chosen such that "
"their center of mass is located at the origin."
"The interior of each object can have a spherical excision to "
"represent a black hole."
"\n"
"The two objects are enveloped by a sphere centered at the origin, "
"and by an outer shell that can transition to large outer radii."
"\n"
"Both the InitialRefinement and the InitialGridPoints can be one of "
"the following:\n"
" - A single number: Uniform refinement in all blocks and "
"dimensions\n"
" - Three numbers: Refinement in [polar, azimuthal, radial] direction "
"in all blocks\n"
" - A map from block names or groups to three numbers: Per-block "
"refinement in [polar, azimuthal, radial] direction\n"
" - A list, with [polar, azimuthal, radial] refinement for each block\n"
"\n"
"The domain can rotate around the "
"z-axis and expand/compress radially. The two objects can each have a "
"spherical distortion (shape map)."}

The documentation for this class was generated from the following file: