SpECTRE  v2022.09.02
domain::creators::BinaryCompactObject Class Reference

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

#include <BinaryCompactObject.hpp>

Classes

struct  AsymptoticVelocityOuterBoundary
 The asymptotic radial velocity of the outer boundary. More...
 
struct  DecayTimescaleOuterBoundaryVelocity
 The timescale for how fast the outer boundary velocity approaches its asymptotic value. More...
 
struct  EnvelopingCube
 
struct  Excision
 Options for an excision region in the domain. More...
 
struct  ExpansionMap
 
struct  ExpansionMapOuterBoundary
 The outer boundary or pivot point of the domain::CoordinateMaps::TimeDependent::CubicScale map. More...
 
struct  FrustumSphericity
 
struct  InitialAngularVelocity
 The angular velocity of the rotation. More...
 
struct  InitialExpansion
 The initial value of the expansion factor. More...
 
struct  InitialExpansionVelocity
 The velocity of the expansion factor. More...
 
struct  InitialGridPoints
 
struct  InitialRefinement
 
struct  InitialSizeMapAccelerations
 Initial accelerations for functions of time for size maps for objects A,B. More...
 
struct  InitialSizeMapValues
 Initial values for functions of time for size maps for objects A,B. More...
 
struct  InitialSizeMapVelocities
 Initial velocities for functions of time for size maps for objects A,B. More...
 
struct  InitialTime
 The initial time of the functions of time. More...
 
struct  Object
 Options for one of the two objects in the binary domain. More...
 
struct  ObjectA
 
struct  ObjectB
 
struct  OuterBoundaryCondition
 
struct  OuterRadius
 
struct  OuterShell
 
struct  RadialDistributionOuterShell
 
struct  RadiusEnvelopingCube
 
struct  RadiusEnvelopingSphere
 
struct  RotationMap
 
struct  SizeMap
 
struct  TimeDependentMaps
 
struct  UseProjectiveMap
 

Public Types

using maps_list = 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::Grid, Frame::Inertial, domain::CoordinateMaps::TimeDependent::CubicScale< 3 >, domain::CoordinateMaps::TimeDependent::Rotation< 3 > >, domain::CoordinateMap< Frame::Grid, Frame::Inertial, domain::CoordinateMaps::TimeDependent::SphericalCompression< false >, domain::CoordinateMaps::TimeDependent::CubicScale< 3 >, domain::CoordinateMaps::TimeDependent::Rotation< 3 > > >
 
template<typename Metavariables >
using time_independent_options = tmpl::append< tmpl::list< ObjectA, ObjectB, RadiusEnvelopingCube, OuterRadius, InitialRefinement, InitialGridPoints, UseProjectiveMap, FrustumSphericity, RadiusEnvelopingSphere, RadialDistributionOuterShell >, 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<> > >
 
using time_dependent_options = tmpl::list< InitialTime, ExpansionMapOuterBoundary, InitialExpansion, InitialExpansionVelocity, AsymptoticVelocityOuterBoundary, DecayTimescaleOuterBoundaryVelocity, InitialAngularVelocity, InitialSizeMapValues, InitialSizeMapVelocities, InitialSizeMapAccelerations >
 
template<typename Metavariables >
using options = tmpl::conditional_t< BinaryCompactObject_detail::enable_time_dependent_maps_v< Metavariables >, tmpl::append< time_dependent_options, time_independent_options< Metavariables > >, time_independent_options< Metavariables > >
 

Public Member Functions

 BinaryCompactObject (Object object_A, Object object_B, double radius_enveloping_cube, double outer_radius_domain, const typename InitialRefinement::type &initial_refinement, const typename InitialGridPoints::type &initial_number_of_grid_points, bool use_projective_map=true, double frustum_sphericity=0.0, const std::optional< double > &radius_enveloping_sphere=std::nullopt, CoordinateMaps::Distribution radial_distribution_outer_shell=CoordinateMaps::Distribution::Linear, std::unique_ptr< domain::BoundaryConditions::BoundaryCondition > outer_boundary_condition=nullptr, const Options::Context &context={})
 
 BinaryCompactObject (double initial_time, double expansion_map_outer_boundary, double initial_expansion, double initial_expansion_velocity, double asymptotic_velocity_outer_boundary, double decay_timescale_outer_boundary_velocity, std::array< double, 3 > initial_angular_velocity, std::array< double, 2 > initial_size_map_values, std::array< double, 2 > initial_size_map_velocities, std::array< double, 2 > initial_size_map_accelerations, Object object_A, Object object_B, double radius_enveloping_cube, double outer_radius_domain, const typename InitialRefinement::type &initial_refinement, const typename InitialGridPoints::type &initial_number_of_grid_points, bool use_projective_map=true, double frustum_sphericity=0.0, const std::optional< double > &radius_enveloping_sphere=std::nullopt, CoordinateMaps::Distribution radial_distribution_outer_shell=CoordinateMaps::Distribution::Linear, 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::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::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
 

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, 5, or 6 nested layers of blocks; these layers are, working from the interior toward the exterior:

  • 0: (optionally) 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.
  • 1: The blocks that resolve each individual compact object. This layer has a spherical outer boundary - if the corresponding layer-0 block exists, then the layer is a cube-to-sphere transition; if the layer-0 block is excised, then the layer is a spherical shell.
  • 2: The blocks that surround each object with a cube. Around each compact object, this layer transitions from a sphere to a cube.
  • 3: The blocks that surround each cube with a half-cube. At this layer, the two compact objects are enclosed in a single cube-shaped grid. This layer can have a spherical outer shape by setting the "frustum sphericity" to one.
  • 4: The 10 blocks that form the first outer shell. This layer transitions back to spherical. The gridpoints are distributed linearly with respect to radius. This layer can be omitted if the "frustum sphericity" is one, so layer 3 is already spherical.
  • 5: The 10 blocks that form a second outer shell. 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.

In the code and options below, ObjectA and ObjectB refer to the two compact objects, and by extension, also refer to the layers that immediately surround each compact object. Note that ObjectA is located to the left of the origin (along the negative x-axis) and ObjectB is located to the right of the origin. enveloping cube refers to the outer surface of Layer 3. outer sphere is the radius of the spherical outer boundary, which is the outer boundary of Layer 5. The enveloping cube and outer sphere are both centered at the origin. cutting plane refers to the plane along which the domain divides into two hemispheres. In the final coordinates, the cutting plane always intersects the x-axis at the origin.

Note
The x-coordinate locations of the ObjectA and ObjectB should be chosen such that the center of mass is located at x=0.
When using this domain, the metavariables struct can contain a struct named domain that conforms to domain::protocols::Metavariables. If domain::enable_time_dependent_maps is either set to false or not specified in the metavariables, then this domain will be time-independent. If domain::enable_time_dependent_maps is set to true, then this domain also includes a time-dependent map, along with additional options (and a corresponding constructor) for initializing the time-dependent map. These options include the InitialTime which specifies the initial time for the FunctionsOfTime controlling the map. The time-dependent map itself consists of a composition of a CubicScale expansion map and a Rotation map everywhere except possibly in layer 1; in that case, if ObjectA or ObjectB is excised, then the time-dependent map in the corresponding blocks in layer 1 is a composition of a SphericalCompression size map, a CubicScale expansion map, and a Rotation map.

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 >.

◆ 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 >.

◆ initial_extents()

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

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 >.


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