SpECTRE  v2026.06.09.01
Loading...
Searching...
No Matches
domain::creators::BinaryCompactObject Class Reference

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

#include <BinaryCompactObject.hpp>

Classes

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

Public Types

using maps_list
template<typename Metavariables>
using options

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, const std::vector< double > &radial_partitioning_outer_shell={}, const typename RadialDistributionOuterShell::type &radial_distribution_outer_shell=CoordinateMaps::Distribution::Linear, double opening_angle_in_degrees=90.0, bool spherical_harmonics_in_wavezone=false, bool use_worldtube=false, 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
BinaryCompactObject & operator= (const BinaryCompactObject &)=delete
BinaryCompactObject & operator= (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.
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.
std::vector< std::array< size_t, 3 > > initial_extents () const override
 Obtain the initial grid extents of the Elements in each block.
std::vector< std::array< size_t, 3 > > initial_refinement_levels () const override
 Obtain the initial refinement levels of the blocks.
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).
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.
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.
Public Member Functions inherited from DomainCreator< 3 >
DomainCreator< VolumeDim > & operator= (const DomainCreator< VolumeDim > &)=delete

Static Public Attributes

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

Detailed Description

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 in the Grid frame.
  • 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 at the initial time (typically t=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 wavezone can support using spherical harmonic shells by setting SphericalHarmonicsInWavezone to true. In this case you cannot set an angular h-refinement level in the angular directions, and you can only choose the \(\ell\) of the shells since having an \(m_{\max}\) below the maximum allowed from the \(\ell\) can drive simulations unstable.

The UseWorldtube option defaults to false. When set to true, some of the functions of time will be IntegratedFunctionOfTime used to control the orbit of the worldtube.

Member Typedef Documentation

◆ options

template<typename Metavariables>
using domain::creators::BinaryCompactObject::options
Initial value:
tmpl::append<
tmpl::conditional_t<
domain::BoundaryConditions::has_boundary_conditions_base_v<
typename Metavariables::system>,
typename Metavariables::system>>>,
tmpl::list<>>>
typename detail::get_boundary_conditions_base< T >::type get_boundary_conditions_base
Returns T::boundary_condition_base or a placeholder class.
Definition GetBoundaryConditionsBase.hpp:32
Definition BinaryCompactObject.hpp:354
Definition BinaryCompactObject.hpp:448
Definition BinaryCompactObject.hpp:368
Definition BinaryCompactObject.hpp:458
Definition BinaryCompactObject.hpp:340
Definition BinaryCompactObject.hpp:347
Definition BinaryCompactObject.hpp:415
Definition BinaryCompactObject.hpp:381
Definition BinaryCompactObject.hpp:506
Definition BinaryCompactObject.hpp:480
Definition BinaryCompactObject.hpp:439

Member Function Documentation

◆ block_groups()

std::unordered_map< std::string, std::unordered_set< std::string > > domain::creators::BinaryCompactObject::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()

std::vector< std::string > domain::creators::BinaryCompactObject::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()

Domain< 3 > domain::creators::BinaryCompactObject::create_domain ( ) const
overridevirtual

Implements DomainCreator< 3 >.

◆ external_boundary_conditions()

std::vector< DirectionMap< 3, std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > > > domain::creators::BinaryCompactObject::external_boundary_conditions ( ) const
overridevirtual

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

Implements DomainCreator< 3 >.

◆ functions_of_time()

auto domain::creators::BinaryCompactObject::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()

std::unordered_map< std::string, tnsr::I< double, 3, Frame::Grid > > domain::creators::BinaryCompactObject::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()

std::vector< std::array< size_t, 3 > > domain::creators::BinaryCompactObject::initial_extents ( ) const
overridevirtual

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

Implements DomainCreator< 3 >.

◆ initial_refinement_levels()

std::vector< std::array< size_t, 3 > > domain::creators::BinaryCompactObject::initial_refinement_levels ( ) const
inlineoverridevirtual

Obtain the initial refinement levels of the blocks.

Implements DomainCreator< 3 >.

Member Data Documentation

◆ help

Options::String domain::creators::BinaryCompactObject::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:
  • src/Domain/Creators/BinaryCompactObject.hpp