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/DataVector.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 "Utilities/Gsl.hpp" 12 : 13 : namespace ScalarTensor { 14 : 15 : /*! 16 : * \brief Add in the trace-reversed stress-energy source term to the \f$\Pi\f$ 17 : * evolved variable of the ::gh system. 18 : * 19 : * \details The only stress energy source term in the Generalized Harmonic 20 : * evolution equations is in the equation for \f$\Pi_{a b}\f$: 21 : * \f[ 22 : * \partial_t \Pi_{ab} + \text{\{spatial derivative terms\}} = 23 : * \text{\{GH source terms\}} 24 : * - 16 \pi \alpha (T^{(\Psi)}_{ab} - \frac{1}{2} g_{a b} g^{cd}T^{(\Psi)}_{cd}) 25 : * ~. 26 : * \f] 27 : * 28 : * (note that this function takes as argument the trace-reversed stress-energy 29 : * tensor) 30 : * 31 : * This function adds that contribution to the existing value of `dt_pi`. The 32 : * spacetime terms in the GH equation should be computed before passing the 33 : * `dt_pi` to this function for updating. 34 : * 35 : * \param dt_pi Time derivative of the $\Pi_{ab}$ variable in the ::gh system. 36 : * The vacuum part should be computed before with ::gh::TimeDerivative 37 : * \param trace_reversed_stress_energy Trace-reversed stress energy tensor of 38 : * the scalar $T^{(\Psi), \text{TR}}_{a b} \equiv T^{(\Psi)}_{ab} - \frac{1}{2} 39 : * g_{a b} g^{cd}T^{(\Psi)}_{cd} = \partial_a \Psi \partial_b \Psi $. 40 : * \param lapse Lapse $\alpha$. 41 : * 42 : * \see `gh::TimeDerivative` for details about the spacetime 43 : * part of the time derivative calculation. 44 : */ 45 1 : void add_stress_energy_term_to_dt_pi( 46 : gsl::not_null<tnsr::aa<DataVector, 3_st>*> dt_pi, 47 : const tnsr::aa<DataVector, 3_st>& trace_reversed_stress_energy, 48 : const Scalar<DataVector>& lapse); 49 : 50 : /*! 51 : * \brief Compute the trace-reversed stress-energy tensor of the scalar field. 52 : * 53 : * \details The trace-reversed stress energy tensor is needed to compute the 54 : * backreaction of the scalar to the spacetime evolution and is given by 55 : * \f{align*}{ 56 : * T^{(\Psi), \text{TR}}_{a b} &\equiv T^{(\Psi)}_{ab} - \frac{1}{2} 57 : * g_{a b} g^{cd}T^{(\Psi)}_{cd} \\ 58 : * &= \partial_a \Psi \partial_b \Psi ~, 59 : * \f} 60 : * 61 : * where \f$T^{(\Psi)}_{ab}\f$ is the standard stress-energy tensor of the 62 : * scalar. 63 : * 64 : * In terms of the evolved variables of the scalar, 65 : * \f{align*}{ 66 : T_{00} &= \alpha^2 \Pi^{2} - 2 \alpha \Pi \beta^{i} \Phi_{i} 67 : + \beta^{i} \beta^{j} \Phi_{i} \Phi{j}~, \\ 68 : T_{0k} &= - \alpha \Pi \Phi_{k} + \beta^{i} \Phi_{i} \Phi_{k}~, \\ 69 : T_{ij} &= \Phi_{i} \Phi{j}~. 70 : * \f} 71 : * 72 : * where \f$\alpha\f$ is the lapse. 73 : * 74 : * \param stress_energy Trace-reversed stress energy tensor of 75 : * the scalar $T^{(\Psi), \text{TR}}_{a b} \equiv T^{(\Psi)}_{ab} - \frac{1}{2} 76 : * g_{a b} g^{cd}T^{(\Psi)}_{cd} = \partial_a \Psi \partial_b \Psi $. 77 : * \param pi_scalar Scalar evolution variable $\Pi$. 78 : * \param phi_scalar Scalar evolution variable $\Phi_i$. 79 : * \param lapse Lapse $\alpha$. 80 : * \param shift Shift $\beta^{i}$. 81 : */ 82 1 : void trace_reversed_stress_energy( 83 : gsl::not_null<tnsr::aa<DataVector, 3_st>*> stress_energy, 84 : const Scalar<DataVector>& pi_scalar, 85 : const tnsr::i<DataVector, 3_st>& phi_scalar, 86 : const Scalar<DataVector>& lapse, const tnsr::I<DataVector, 3_st>& shift); 87 : 88 : namespace Tags { 89 : 90 : /*! 91 : * \brief Compute tag for the trace reversed stress energy tensor. 92 : * 93 : * \details Compute using ScalarTensor::trace_reversed_stress_energy. 94 : */ 95 1 : struct TraceReversedStressEnergyCompute 96 : : TraceReversedStressEnergy<DataVector, 3_st, Frame::Inertial>, 97 : db::ComputeTag { 98 0 : static constexpr size_t Dim = 3; 99 0 : using argument_tags = 100 : tmpl::list<CurvedScalarWave::Tags::Pi, CurvedScalarWave::Tags::Phi<Dim>, 101 : gr::Tags::Lapse<DataVector>, 102 : gr::Tags::Shift<DataVector, 3, Frame::Inertial>>; 103 0 : using return_type = tnsr::aa<DataVector, Dim, Frame::Inertial>; 104 0 : static constexpr void (*function)( 105 : const gsl::not_null<tnsr::aa<DataVector, Dim>*> result, 106 : const Scalar<DataVector>&, const tnsr::i<DataVector, Dim>&, 107 : const Scalar<DataVector>&, 108 : const tnsr::I<DataVector, Dim>&) = &trace_reversed_stress_energy; 109 0 : using base = TraceReversedStressEnergy<DataVector, Dim, Frame::Inertial>; 110 : }; 111 : } // namespace Tags 112 : 113 : } // namespace ScalarTensor