Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include "DataStructures/DataBox/Tag.hpp" 7 : #include "DataStructures/Tensor/Tensor.hpp" 8 : #include "Evolution/Systems/CurvedScalarWave/Tags.hpp" 9 : #include "Evolution/Systems/ScalarTensor/Tags.hpp" 10 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp" 11 : #include "PointwiseFunctions/ScalarTensor/ScalarGaussBonnet/CouplingParameters.hpp" 12 : #include "PointwiseFunctions/ScalarTensor/ScalarGaussBonnet/Tags.hpp" 13 : #include "PointwiseFunctions/ScalarTensor/SourceTags.hpp" 14 : #include "Time/Tags/Time.hpp" 15 : #include "Utilities/Gsl.hpp" 16 : 17 : namespace ScalarTensor { 18 : /// @{ 19 : /*! 20 : * \brief Computes the source term given by the coupling of the scalar to 21 : * curvature. 22 : * 23 : * \details For a scalar field with mass parameter $ m_\Psi $, 24 : * the wave equation takes the form 25 : * \begin{align} 26 : * \Box \Psi = \mathcal{S} ~, 27 : * \end{align} 28 : * 29 : * where the source is given by 30 : * \begin{align} 31 : * \mathcal{S} \equiv m^2_\Psi \Psi - f'(\Psi) \mathcal{G}~, 32 : * \end{align} 33 : * where 34 : * \begin{align} 35 : * \mathcal{G} \equiv 8 (E_{ab} E^{ab} - B_{ab} B^{ab}) ~, 36 : * \end{align} 37 : * is the Gauss-Bonnet scalar and the coupling function is given by 38 : * \begin{align} 39 : * f(\Psi) \equiv \lambda \Psi 40 : * + \dfrac{1}{16} \left( \eta \Psi^2 + 2 \zeta \Psi^4 \right) ~, 41 : * \end{align} 42 : * Here the Gauss-Bonnet scalar (in vacuum) is given in terms of the electric 43 : * ($ E_{ab} $) and magnetic ($ B_{ab} $) parts of the Weyl scalar. 44 : * 45 : */ 46 1 : void gauss_bonnet_scalar_source( 47 : gsl::not_null<Scalar<DataVector>*> scalar_source, 48 : const Scalar<DataVector>& weyl_electric_scalar, 49 : const Scalar<DataVector>& weyl_magnetic_scalar, 50 : const Scalar<DataVector>& psi, 51 : const CouplingParameterOptions& coupling_parameters, double mass_psi, 52 : std::pair<double, double> start_and_ramp_times, double time); 53 : 54 1 : Scalar<DataVector> gauss_bonnet_scalar_source( 55 : const Scalar<DataVector>& weyl_electric_scalar, 56 : const Scalar<DataVector>& weyl_magnetic_scalar, 57 : const Scalar<DataVector>& psi, 58 : const CouplingParameterOptions& coupling_parameters, double mass_psi, 59 : std::pair<double, double> start_and_ramp_times, double time); 60 : /// @} 61 : 62 : /*! 63 : * \brief Multiplies by the coupling function. 64 : * 65 : * \details Multiply by the first derivative of the coupling function given by 66 : * \begin{align} 67 : * f(\Psi) \equiv 68 : * + \dfrac{1}{16} \left( 4 \lambda \Psi + 2 \eta \Psi^2 + \zeta \Psi^4 69 : * \right) ~. 70 : * \end{align} 71 : * 72 : */ 73 1 : void multiply_by_negative_deriv_of_coupling_func( 74 : gsl::not_null<Scalar<DataVector>*> scalar_source, 75 : const Scalar<DataVector>& psi, 76 : const CouplingParameterOptions& coupling_parameters, 77 : std::pair<double, double> start_and_ramp_times, double time); 78 : 79 : /*! 80 : * \brief Multiplies by the coupling function. 81 : * 82 : * \details Multiply by the second derivative of the coupling function given by 83 : * \begin{align} 84 : * f(\Psi) \equiv 85 : * + \dfrac{1}{16} \left( 4 \lambda \Psi + 2 \eta \Psi^2 + \zeta \Psi^4 86 : * \right) ~. 87 : * \end{align} 88 : * 89 : */ 90 1 : void multiply_by_negative_second_deriv_of_coupling_func( 91 : gsl::not_null<Scalar<DataVector>*> scalar_source, 92 : const Scalar<DataVector>& psi, 93 : const CouplingParameterOptions& coupling_parameters, 94 : std::pair<double, double> start_and_ramp_times, double time); 95 : 96 : namespace Tags { 97 : /*! 98 : * \copydoc ScalarTensor::gauss_bonnet_scalar_source 99 : */ 100 1 : struct ScalarSourceCompute : ScalarSource, db::ComputeTag { 101 0 : using argument_tags = tmpl::list< 102 : gr::Tags::WeylElectricScalar<DataVector>, 103 : gr::Tags::WeylMagneticScalar<DataVector>, CurvedScalarWave::Tags::Psi, 104 : ScalarTensor::Tags::CouplingParameters, ScalarTensor::Tags::ScalarMass, 105 : ScalarTensor::Tags::RampUpParameters, ::Tags::Time>; 106 0 : using return_type = Scalar<DataVector>; 107 0 : static constexpr void (*function)( 108 : const gsl::not_null<Scalar<DataVector>*> /* scalar_source */, 109 : const Scalar<DataVector>& /* weyl_electric_scalar */, 110 : const Scalar<DataVector>& /* weyl_magnetic_scalar */, 111 : const Scalar<DataVector>& /* psi */, 112 : const CouplingParameterOptions& /* coupling_parameters */, 113 : const double /* mass_psi */, 114 : const std::pair<double, double> /* start_and_ramp_times */, 115 : const double /* time */) = &gauss_bonnet_scalar_source; 116 0 : using base = ScalarSource; 117 : }; 118 : } // namespace Tags 119 : 120 : } // namespace ScalarTensor