SpECTRE
v2024.12.16
|
The set of utilities for performing CurvedScalarWave evolution with a worldtube excision scheme. More...
Namespaces | |
namespace | Actions |
Actions for the worldtube-curved scalar wave system. | |
namespace | Initialization |
Initialization mutators and actions for the worldtube-curved scalar wave system. | |
namespace | OptionTags |
Option tags for the worldtube. | |
namespace | Tags |
Tags related to the worldtube. | |
Classes | |
struct | IterateAccelerationTerms |
Computes the next iteration of the acceleration due to scalar self force from the current iteration of the regular field, as well as the quantities required to compute the acceleration terms of the puncture field. More... | |
struct | Registration |
struct | UpdateAcceleration |
Computes the final acceleration of the particle at this time step. More... | |
struct | WorldtubeSingleton |
The singleton component that represents the worldtube. More... | |
Functions | |
tnsr::iAA< double, 3 > | spatial_derivative_inverse_ks_metric (const tnsr::I< double, 3 > &pos) |
The spatial derivative of the zero spin inverse Kerr Schild metric, | |
tnsr::iaa< double, 3 > | spatial_derivative_ks_metric (const tnsr::aa< double, 3 > &metric, const tnsr::iAA< double, 3 > &di_inverse_metric) |
The spatial derivative of the spacetime metric, | |
tnsr::iiAA< double, 3 > | second_spatial_derivative_inverse_ks_metric (const tnsr::I< double, 3 > &pos) |
The second spatial derivative of the zero spin inverse Kerr Schild metric, | |
tnsr::iiaa< double, 3 > | second_spatial_derivative_metric (const tnsr::aa< double, 3 > &metric, const tnsr::iaa< double, 3 > &di_metric, const tnsr::iAA< double, 3 > &di_inverse_metric, const tnsr::iiAA< double, 3 > &dij_inverse_metric) |
The spatial derivative of the spacetime metric, | |
tnsr::iAbb< double, 3 > | spatial_derivative_christoffel (const tnsr::iaa< double, 3 > &di_metric, const tnsr::iiaa< double, 3 > &dij_metric, const tnsr::AA< double, 3 > &inverse_metric, const tnsr::iAA< double, 3 > &di_inverse_metric) |
The spatial derivative of the Christoffel symbols, | |
tnsr::iA< double, 3 > | spatial_derivative_ks_contracted_christoffel (const tnsr::I< double, 3 > &pos) |
The spatial derivative of the zero spin Kerr Schild contracted Christoffel symbols, | |
void | puncture_field (gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > result, const tnsr::I< DataVector, 3, Frame::Inertial > ¢ered_coords, const tnsr::I< double, 3 > &particle_position, const tnsr::I< double, 3 > &particle_velocity, const tnsr::I< double, 3 > &particle_acceleration, double bh_mass, size_t order) |
Computes the puncture/singular field | |
void | puncture_field_0 (gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > result, const tnsr::I< DataVector, 3, Frame::Inertial > ¢ered_coords, const tnsr::I< double, 3 > &particle_position, const tnsr::I< double, 3 > &particle_velocity, const tnsr::I< double, 3 > &particle_acceleration, double bh_mass) |
Computes the puncture/singular field | |
void | puncture_field_1 (gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > result, const tnsr::I< DataVector, 3, Frame::Inertial > ¢ered_coords, const tnsr::I< double, 3 > &particle_position, const tnsr::I< double, 3 > &particle_velocity, const tnsr::I< double, 3 > &particle_acceleration, double bh_mass) |
Computes the puncture/singular field | |
void | acceleration_terms_0 (gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > result, const tnsr::I< DataVector, 3, Frame::Inertial > ¢ered_coords, const tnsr::I< double, 3 > &particle_position, const tnsr::I< double, 3 > &particle_velocity, const tnsr::I< double, 3 > &particle_acceleration, double ft, double fx, double fy, double dt_ft, double dt_fx, double dt_fy, double bh_mass) |
Computes the acceleration terms of a puncture/singular field | |
void | acceleration_terms_1 (gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > result, const tnsr::I< DataVector, 3, Frame::Inertial > ¢ered_coords, const tnsr::I< double, 3 > &particle_position, const tnsr::I< double, 3 > &particle_velocity, const tnsr::I< double, 3 > &particle_acceleration, double ft, double fx, double fy, double dt_ft, double dt_fx, double dt_fy, double Du_ft, double Du_fx, double Du_fy, double dt_Du_ft, double dt_Du_fx, double dt_Du_fy, double bh_mass) |
Computes the acceleration terms of a puncture/singular field | |
double | smooth_broken_power_law (double orbit_radius, double alpha, double radius_at_inf, double rb, double delta) |
A smoothly broken power law that falls off to a constant value for larger radii. More... | |
double | smooth_broken_power_law_derivative (double orbit_radius, double alpha, double radius_at_inf, double rb, double delta) |
Returns the analytical derivative of smooth_broken_power_law . | |
template<size_t Dim> | |
tnsr::A< double, Dim > | self_force_per_mass (const tnsr::a< double, Dim > &d_psi, const tnsr::A< double, Dim > &four_velocity, double particle_charge, double particle_mass, const tnsr::AA< double, Dim > &inverse_metric) |
Computes the scalar self-force per unit mass. More... | |
template<size_t Dim> | |
tnsr::A< double, Dim > | dt_self_force_per_mass (const tnsr::a< double, Dim > &d_psi, const tnsr::a< double, Dim > &dt_d_psi, const tnsr::A< double, Dim > &four_velocity, const tnsr::A< double, Dim > &dt_four_velocity, double particle_charge, double particle_mass, const tnsr::AA< double, Dim > &inverse_metric, const tnsr::AA< double, Dim > &dt_inverse_metric) |
Computes the first time derivative of scalar self-force per unit mass, see self_force_per_mass , by applying the chain rule. | |
template<size_t Dim> | |
tnsr::A< double, Dim > | dt2_self_force_per_mass (const tnsr::a< double, Dim > &d_psi, const tnsr::a< double, Dim > &dt_d_psi, const tnsr::a< double, Dim > &dt2_d_psi, const tnsr::A< double, Dim > &four_velocity, const tnsr::A< double, Dim > &dt_four_velocity, const tnsr::A< double, Dim > &dt2_four_velocity, double particle_charge, double particle_mass, const tnsr::AA< double, Dim > &inverse_metric, const tnsr::AA< double, Dim > &dt_inverse_metric, const tnsr::AA< double, Dim > &dt2_inverse_metric) |
Computes the second time derivative of scalar self-force per unit mass, see self_force_per_mass , by applying the chain rule. | |
template<size_t Dim> | |
tnsr::A< double, Dim > | Du_self_force_per_mass (const tnsr::A< double, Dim > &self_force, const tnsr::A< double, Dim > &dt_self_force, const tnsr::A< double, Dim > &four_velocity, const tnsr::Abb< double, Dim > &christoffel) |
Computes the covariant derivative of the scalar self-force per unit mass self_force_per_mass , along the four velocity | |
template<size_t Dim> | |
tnsr::A< double, Dim > | dt_Du_self_force_per_mass (const tnsr::A< double, Dim > &self_force, const tnsr::A< double, Dim > &dt_self_force, const tnsr::A< double, Dim > &dt2_self_force, const tnsr::A< double, Dim > &four_velocity, const tnsr::A< double, Dim > &dt_four_velocity, const tnsr::Abb< double, Dim > &christoffel, const tnsr::Abb< double, Dim > &dt_christoffel) |
Computes the time derivative of the covariant derivative of the scalar self-force per unit mass Du_self_force_per_mass , along the four velocity | |
double | turn_on_function (double t_minus_turn_on, double turn_on_timescale) |
A function used to roll-on the self-force continuously from 0 to 1. More... | |
double | dt_turn_on_function (double t_minus_turn_on, double turn_on_timescale) |
The first derivative of turn_on_function | |
double | dt2_turn_on_function (double t_minus_turn_on, double turn_on_timescale) |
The second derivative of turn_on_function | |
template<size_t Dim> | |
void | self_force_acceleration (gsl::not_null< tnsr::I< double, Dim > * > self_force_acc, const Scalar< double > &dt_psi_monopole, const tnsr::i< double, Dim > &psi_dipole, const tnsr::I< double, Dim > &particle_velocity, double particle_charge, double particle_mass, const tnsr::AA< double, Dim > &inverse_metric, const Scalar< double > &dilation_factor) |
Computes the coordinate acceleration due to the scalar self-force onto the charge. More... | |
template<size_t Dim> | |
tnsr::I< double, Dim > | self_force_acceleration (const Scalar< double > &dt_psi_monopole, const tnsr::i< double, Dim > &psi_dipole, const tnsr::I< double, Dim > &particle_velocity, double particle_charge, double particle_mass, const tnsr::AA< double, Dim > &inverse_metric, const Scalar< double > &dilation_factor) |
Computes the coordinate acceleration due to the scalar self-force onto the charge. More... | |
The set of utilities for performing CurvedScalarWave evolution with a worldtube excision scheme.
The worldtube excision scheme is a method that aims to enable NR evolutions of intermediate mass ratio binary black hole simulations. In standard BBH simulations two excision spheres are cut out from the domain within the apparent horizons of the respective black holes. For larger mass ratios, this introduces a scale disparity in the evolution system because the small grid spacing in the elements near the smaller black hole constrain the time step to be orders of magnitude smaller than near the larger black hole due to the CFL condition. The worldtube excision scheme avoids this by excising a much larger region (the worldtube) around the smaller black hole. Since the excision boundary no longer lies within the apparent horizon, boundary conditions are required. These are derived by approximating the solution inside the worldtube using a perturbative solution - a black hole perturbed by another black hole. The solution is calibrated by the evolved metric on the worldtube boundary and in turn provides boundary conditions to the evolution system.
Here, we test this scheme using a toy problem of a scalar charge in circular orbit around a Schwarzschild black hole.
void CurvedScalarWave::Worldtube::acceleration_terms_0 | ( | gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > | result, |
const tnsr::I< DataVector, 3, Frame::Inertial > & | centered_coords, | ||
const tnsr::I< double, 3 > & | particle_position, | ||
const tnsr::I< double, 3 > & | particle_velocity, | ||
const tnsr::I< double, 3 > & | particle_acceleration, | ||
double | ft, | ||
double | fx, | ||
double | fy, | ||
double | dt_ft, | ||
double | dt_fx, | ||
double | dt_fy, | ||
double | bh_mass | ||
) |
Computes the acceleration terms of a puncture/singular field
The appropriate expression can be found in Eq. (37) of [203]. The values ft, fx, fy are the time, x and y component of the self force per unit mass evaluated at the position of the particle; dt_ft, dt_fx, dt_fy are the respective total time derivatives. The code in this function was auto-generated by generating the full expressions with Mathematica and employing common subexpression elimination with sympy. The mathematica file and generating script can be found at https://github.com/nikwit/puncture-field.
void CurvedScalarWave::Worldtube::acceleration_terms_1 | ( | gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > | result, |
const tnsr::I< DataVector, 3, Frame::Inertial > & | centered_coords, | ||
const tnsr::I< double, 3 > & | particle_position, | ||
const tnsr::I< double, 3 > & | particle_velocity, | ||
const tnsr::I< double, 3 > & | particle_acceleration, | ||
double | ft, | ||
double | fx, | ||
double | fy, | ||
double | dt_ft, | ||
double | dt_fx, | ||
double | dt_fy, | ||
double | Du_ft, | ||
double | Du_fx, | ||
double | Du_fy, | ||
double | dt_Du_ft, | ||
double | dt_Du_fx, | ||
double | dt_Du_fy, | ||
double | bh_mass | ||
) |
Computes the acceleration terms of a puncture/singular field
The appropriate expression can be found in Eq. (37) of [203]. The values ft, fx, fy are the time, x and y component of the self force per unit mass evaluated at the position of the particle; dt_ft, dt_fx, dt_fy are the respective total time derivatives. The code in this function was auto-generated by generating the full expressions with Mathematica and employing common subexpression elimination with sympy. The mathematica file and generating script can be found at https://github.com/nikwit/puncture-field.
void CurvedScalarWave::Worldtube::puncture_field | ( | gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > | result, |
const tnsr::I< DataVector, 3, Frame::Inertial > & | centered_coords, | ||
const tnsr::I< double, 3 > & | particle_position, | ||
const tnsr::I< double, 3 > & | particle_velocity, | ||
const tnsr::I< double, 3 > & | particle_acceleration, | ||
double | bh_mass, | ||
size_t | order | ||
) |
Computes the puncture/singular field
The field is computed using a Detweiler-Whiting singular Green's function and perturbatively expanded in the geodesic distance from the particle. It solves the inhomogeneous wave equation
where
The function given here assumes that the particle has scalar charge
void CurvedScalarWave::Worldtube::puncture_field_0 | ( | gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > | result, |
const tnsr::I< DataVector, 3, Frame::Inertial > & | centered_coords, | ||
const tnsr::I< double, 3 > & | particle_position, | ||
const tnsr::I< double, 3 > & | particle_velocity, | ||
const tnsr::I< double, 3 > & | particle_acceleration, | ||
double | bh_mass | ||
) |
void CurvedScalarWave::Worldtube::puncture_field_1 | ( | gsl::not_null< Variables< tmpl::list< CurvedScalarWave::Tags::Psi, ::Tags::dt< CurvedScalarWave::Tags::Psi >, ::Tags::deriv< CurvedScalarWave::Tags::Psi, tmpl::size_t< 3 >, Frame::Inertial > > > * > | result, |
const tnsr::I< DataVector, 3, Frame::Inertial > & | centered_coords, | ||
const tnsr::I< double, 3 > & | particle_position, | ||
const tnsr::I< double, 3 > & | particle_velocity, | ||
const tnsr::I< double, 3 > & | particle_acceleration, | ||
double | bh_mass | ||
) |
Computes the puncture/singular field
For non-geodesic orbits, there are additional contributions, see acceleration_terms_0
.
tnsr::I< double, Dim > CurvedScalarWave::Worldtube::self_force_acceleration | ( | const Scalar< double > & | dt_psi_monopole, |
const tnsr::i< double, Dim > & | psi_dipole, | ||
const tnsr::I< double, Dim > & | particle_velocity, | ||
double | particle_charge, | ||
double | particle_mass, | ||
const tnsr::AA< double, Dim > & | inverse_metric, | ||
const Scalar< double > & | dilation_factor | ||
) |
Computes the coordinate acceleration due to the scalar self-force onto the charge.
It is given by
where
void CurvedScalarWave::Worldtube::self_force_acceleration | ( | gsl::not_null< tnsr::I< double, Dim > * > | self_force_acc, |
const Scalar< double > & | dt_psi_monopole, | ||
const tnsr::i< double, Dim > & | psi_dipole, | ||
const tnsr::I< double, Dim > & | particle_velocity, | ||
double | particle_charge, | ||
double | particle_mass, | ||
const tnsr::AA< double, Dim > & | inverse_metric, | ||
const Scalar< double > & | dilation_factor | ||
) |
Computes the coordinate acceleration due to the scalar self-force onto the charge.
It is given by
where
tnsr::A< double, Dim > CurvedScalarWave::Worldtube::self_force_per_mass | ( | const tnsr::a< double, Dim > & | d_psi, |
const tnsr::A< double, Dim > & | four_velocity, | ||
double | particle_charge, | ||
double | particle_mass, | ||
const tnsr::AA< double, Dim > & | inverse_metric | ||
) |
Computes the scalar self-force per unit mass.
It is given by
where
double CurvedScalarWave::Worldtube::smooth_broken_power_law | ( | double | orbit_radius, |
double | alpha, | ||
double | radius_at_inf, | ||
double | rb, | ||
double | delta | ||
) |
A smoothly broken power law that falls off to a constant value for larger radii.
The function is given by Eq. (3) of [202]
For radii
This function is used to control the worldtube radius for more eccentric orbits so the radius does not grow too large during the apoapsis passage as this does not lead to performance gains and can cause problems with the domain.
double CurvedScalarWave::Worldtube::turn_on_function | ( | double | t_minus_turn_on, |
double | turn_on_timescale | ||
) |
A function used to roll-on the self-force continuously from 0 to 1.
It is given by Eq.(60) of [203]
where