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 "Utilities/Gsl.hpp" 9 : 10 : namespace grmhd::GhValenciaDivClean { 11 : 12 : /*! 13 : * \brief Add in the trace-reversed stress-energy source term to the \f$\Pi\f$ 14 : * evolved variable of the Generalized Harmonic system. 15 : * 16 : * \details The only stress energy source term in the Generalized Harmonic 17 : * evolution equations is in the equation for \f$\Pi_{a b}\f$: 18 : * 19 : * \f[ 20 : * \partial_t \Pi_{ab} + \text{(spatial derivative terms)} = 21 : * \text{(GH source terms)} 22 : * - 16 \pi \alpha (T_{ab} - \frac{1}{2} g_{a b} T^c{}_c) 23 : * \f] 24 : * 25 : * (note that this function takes as argument the trace-reversed stress energy 26 : * tensor) 27 : * 28 : * This function adds that contribution to the existing value of `dt_pi`. The 29 : * spacetime terms in the GH equation should be computed before passing the 30 : * `dt_pi` to this function for updating. 31 : * 32 : * \see `gh::TimeDerivative` for details about the spacetime 33 : * part of the time derivative calculation. 34 : */ 35 1 : void add_stress_energy_term_to_dt_pi( 36 : gsl::not_null<tnsr::aa<DataVector, 3>*> dt_pi, 37 : const tnsr::aa<DataVector, 3>& trace_reversed_stress_energy, 38 : const Scalar<DataVector>& lapse); 39 : 40 : /*! 41 : * \brief Calculate the trace-reversed stress-energy tensor \f$(T_{\mu \nu} - 42 : * 1/2 g_{\mu \nu} g^{\lambda \sigma} T_{\lambda \sigma}) \f$ associated with 43 : * the matter part of the GRMHD system. 44 : * 45 : * \details The stress energy tensor is needed to compute the backreaction of 46 : * the matter to the spacetime degrees of freedom. The stress energy is 47 : * calculated as described in \cite Moesta2013dna : 48 : * 49 : * \f[ 50 : * T_{\mu \nu} = \rho h^* u_\mu u_\nu + p^* g_{\mu \nu} - b_\mu b_\nu, 51 : * \f] 52 : * 53 : * where \f$u_\mu\f$ is the four-velocity, \f$\rho\f$ is the rest mass density, 54 : * \f$h^*\f$ is the magnetically modified enthalpy, \f$p^*\f$ is the 55 : * magnetically modified pressure, and \f$b_{\mu}\f$ is the comoving magnetic 56 : * field (note that we deviate from the notation of \cite Moesta2013dna by 57 : * denoting the pressure with a lower-case \f$p\f$ instead of an upper-case 58 : * \f$P\f$). 59 : * 60 : * The spatial components of the four velocity \f$u_\mu\f$ are 61 : * 62 : * \f[ 63 : * u_i = W v_i, 64 : * \f] 65 : * 66 : * and the time component is 67 : * 68 : * \f[ 69 : * u_0 = - \alpha W + \beta^i u_i. 70 : * \f]. 71 : * 72 : * The magnetically modified enthalpy is 73 : * 74 : * \f[ 75 : * h^* = 1 + \epsilon + (p + b^2) / \rho. 76 : * \f] 77 : * 78 : * The magnetically modified pressure is 79 : * 80 : * \f[ 81 : * p^* = p + b^2 / 2. 82 : * \f] 83 : * 84 : * 85 : * The comoving magnetic field is computed via 86 : * 87 : * \f{align}{ 88 : * b_i &= B_i / W + v_i W v^k B_k\\ 89 : * b_0 &= - \alpha W v^i B_i + \beta^i b_i 90 : * \f} 91 : * 92 : * Therefore, the trace-reversed stress energy simplifies to 93 : * 94 : * \f[ 95 : * (T_{\mu \nu} - \frac{1}{2} g_{\mu \nu} g^{\lambda \sigma} T_{\lambda \sigma}) 96 : * = \rho h^* u_\mu u_\nu + \left(\frac{1}{2} \rho h^* - p\right) g_{\mu \nu} 97 : * - b_\mu b_\nu 98 : * \f] 99 : */ 100 1 : void trace_reversed_stress_energy( 101 : gsl::not_null<tnsr::aa<DataVector, 3>*> stress_energy, 102 : gsl::not_null<tnsr::a<DataVector, 3>*> four_velocity_one_form_buffer, 103 : gsl::not_null<tnsr::a<DataVector, 3>*> 104 : comoving_magnetic_field_one_form_buffer, 105 : const Scalar<DataVector>& rest_mass_density, 106 : const tnsr::i<DataVector, 3, Frame::Inertial>& spatial_velocity_one_form, 107 : const tnsr::i<DataVector, 3, Frame::Inertial>& magnetic_field_one_form, 108 : const Scalar<DataVector>& magnetic_field_squared, 109 : const Scalar<DataVector>& magnetic_field_dot_spatial_velocity, 110 : const Scalar<DataVector>& lorentz_factor, 111 : const Scalar<DataVector>& one_over_w_squared, 112 : const Scalar<DataVector>& pressure, 113 : const Scalar<DataVector>& specific_internal_energy, 114 : const tnsr::aa<DataVector, 3, Frame::Inertial>& spacetime_metric, 115 : const tnsr::I<DataVector, 3, Frame::Inertial>& shift, 116 : const Scalar<DataVector>& lapse); 117 : } // namespace grmhd::GhValenciaDivClean