SpECTRE Documentation Coverage Report
Current view: top level - Evolution/Systems/RadiationTransport/M1Grey - M1HydroCoupling.hpp Coverage Total Hit
Commit: 0d1d717af84a81fb1284a20c4013708fe85cc2f0 Lines: 20.0 % 10 2
Test Date: 2026-10-22 17:29:42
Legend: Lines:     hit not hit

            Line data    Source code
       1            1 : // Distributed under the MIT License.
       2              : // See LICENSE.txt for details.
       3              : 
       4              : ///\file
       5              : /// Defines functions to compute the M1-hydro
       6              : /// coupling terms.
       7              : 
       8              : #pragma once
       9              : 
      10              : #include <tuple>
      11              : 
      12              : #include "DataStructures/DataBox/DataBox.hpp"
      13              : #include "DataStructures/TaggedTuple.hpp"
      14              : #include "DataStructures/Tensor/TypeAliases.hpp"
      15              : #include "Evolution/Imex/Protocols/ImplicitSource.hpp"
      16              : #include "Evolution/Imex/Protocols/ImplicitSourceJacobian.hpp"
      17              : #include "Evolution/Imex/Tags/Jacobian.hpp"
      18              : #include "Evolution/Systems/RadiationTransport/M1Grey/Tags.hpp"
      19              : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
      20              : #include "PointwiseFunctions/Hydro/Tags.hpp"
      21              : #include "Utilities/ProtocolHelpers.hpp"
      22              : #include "Utilities/Protocols/StaticReturnApplyable.hpp"
      23              : #include "Utilities/Requires.hpp"
      24              : #include "Utilities/TMPL.hpp"
      25              : 
      26              : /// \cond
      27              : class DataVector;
      28              : namespace Parallel {
      29              : template <typename Metavariables>
      30              : class GlobalCache;
      31              : }  // namespace Parallel
      32              : 
      33              : /// \endcond
      34              : 
      35              : namespace RadiationTransport {
      36              : namespace M1Grey {
      37              : 
      38              : // Implementation of the coupling terms for
      39              : // individual species
      40              : namespace detail {
      41              : void compute_m1_hydro_coupling_impl(
      42              :     gsl::not_null<Scalar<DataVector>*> source_n,
      43              :     gsl::not_null<tnsr::i<DataVector, 3>*> source_i,
      44              :     const Scalar<DataVector>& emissivity,
      45              :     const Scalar<DataVector>& absorption_opacity,
      46              :     const Scalar<DataVector>& scattering_opacity,
      47              :     const Scalar<DataVector>& comoving_energy_density,
      48              :     const Scalar<DataVector>& comoving_momentum_density_normal,
      49              :     const tnsr::i<DataVector, 3>& comoving_momentum_density_spatial,
      50              :     const tnsr::I<DataVector, 3>& fluid_velocity,
      51              :     const Scalar<DataVector>& fluid_lorentz_factor,
      52              :     const Scalar<DataVector>& lapse,
      53              :     const tnsr::ii<DataVector, 3>& spatial_metric,
      54              :     const Scalar<DataVector>& sqrt_det_spatial_metric);
      55              : 
      56              : void compute_m1_hydro_coupling_jacobian_impl(
      57              :     gsl::not_null<Scalar<DataVector>*> deriv_e_source_e,
      58              :     gsl::not_null<tnsr::i<DataVector, 3>*> deriv_e_source_s,
      59              :     gsl::not_null<tnsr::I<DataVector, 3>*> deriv_s_source_e,
      60              :     gsl::not_null<tnsr::Ij<DataVector, 3>*> deriv_s_source_s,
      61              :     const tnsr::i<DataVector, 3>& tilde_s, const Scalar<DataVector>& tilde_e,
      62              :     const Scalar<DataVector>& emissivity,
      63              :     const Scalar<DataVector>& absorption_opacity,
      64              :     const Scalar<DataVector>& scattering_opacity,
      65              :     const tnsr::I<DataVector, 3>& fluid_velocity,
      66              :     const Scalar<DataVector>& fluid_lorentz_factor,
      67              :     const Scalar<DataVector>& closure_factor,
      68              :     const Scalar<DataVector>& comoving_energy_density,
      69              :     const tnsr::i<DataVector, 3>& comoving_momentum_density_spatial,
      70              :     const Scalar<DataVector>& comoving_momentum_density_normal,
      71              :     const Scalar<DataVector>& lapse,
      72              :     const tnsr::ii<DataVector, 3>& spatial_metric,
      73              :     const tnsr::II<DataVector, 3>& inverse_spatial_metric);
      74              : }  // namespace detail
      75              : 
      76              : template <typename NeutrinoSpeciesList>
      77            0 : struct ComputeM1HydroCoupling;
      78              : /*!
      79              :  * Compute the source terms of the M1 equation due to neutrino-matter
      80              :  * interactions.
      81              :  * These are:
      82              :  *
      83              :  * \f{align}{
      84              :  * \partial_t \tilde E = \alpha W (\sqrt{\gamma} \eta - \kappa_a \tilde J)
      85              :  * + \alpha (\kappa_a + \kappa_s) H_n\\
      86              :  * \partial_t \tilde S_i = \alpha u_i (\sqrt{\gamma} \eta - \kappa_a \tilde J)
      87              :  * - \alpha  (\kappa_a + \kappa_s) H_i.
      88              :  * \f}
      89              :  *
      90              :  * with \f$W\f$ the Lorentz factor, \f$u_i = W v_i\f$ the spatial components of
      91              :  * the fluid 4-velocity, \f$\eta\f$ the emissivity, \f$\kappa_{a,s}\f$
      92              :  * the absorption and scattering opacities, \f$J\f$ the comoving energy
      93              :  * density, and \f$H_{n,i}\f$ the normal and spatial components of the comoving
      94              :  * flux density.
      95              :  *
      96              :  * The function returns in `source_n` the energy source and in
      97              :  * `source_i` the momentum source. We write a separate action for these
      98              :  * sources to make it easier to switch between implicit / explicit time
      99              :  * stepping, as well as to add the source terms to both the fluid and M1
     100              :  * evolutions.
     101              :  */
     102              : template <typename... NeutrinoSpecies>
     103            1 : struct ComputeM1HydroCoupling<tmpl::list<NeutrinoSpecies...>>
     104              :     : tt::ConformsTo<imex::protocols::ImplicitSource>,
     105              :       tt::ConformsTo<protocols::StaticReturnApplyable> {
     106            0 :   using return_tags = tmpl::list<
     107              :       ::Tags::Source<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>>...,
     108              :       ::Tags::Source<Tags::TildeS<Frame::Inertial, NeutrinoSpecies>>...>;
     109              : 
     110            0 :   using argument_tags = tmpl::list<
     111              :       Tags::GreyEmissivity<NeutrinoSpecies>...,
     112              :       Tags::GreyAbsorptionOpacity<NeutrinoSpecies>...,
     113              :       Tags::GreyScatteringOpacity<NeutrinoSpecies>...,
     114              :       Tags::TildeJ<NeutrinoSpecies>..., Tags::TildeHNormal<NeutrinoSpecies>...,
     115              :       Tags::TildeHSpatial<Frame::Inertial, NeutrinoSpecies>...,
     116              :       hydro::Tags::SpatialVelocity<DataVector, 3>,
     117              :       hydro::Tags::LorentzFactor<DataVector>, gr::Tags::Lapse<DataVector>,
     118              :       gr::Tags::SpatialMetric<DataVector, 3>,
     119              :       gr::Tags::SqrtDetSpatialMetric<DataVector>>;
     120              : 
     121            0 :   static void apply(
     122              :       const gsl::not_null<typename Tags::M1HydroCouplingNormal<
     123              :           NeutrinoSpecies>::type*>... source_n,
     124              :       const gsl::not_null<typename Tags::M1HydroCouplingSpatial<
     125              :           Frame::Inertial, NeutrinoSpecies>::type*>... source_i,
     126              :       const typename Tags::GreyEmissivity<NeutrinoSpecies>::type&... emissivity,
     127              :       const typename Tags::GreyAbsorptionOpacity<
     128              :           NeutrinoSpecies>::type&... absorption_opacity,
     129              :       const typename Tags::GreyScatteringOpacity<
     130              :           NeutrinoSpecies>::type&... scattering_opacity,
     131              :       const typename Tags::TildeJ<NeutrinoSpecies>::type&... tilde_j,
     132              :       const typename Tags::TildeHNormal<NeutrinoSpecies>::type&... tilde_hn,
     133              :       const typename Tags::TildeHSpatial<Frame::Inertial,
     134              :                                          NeutrinoSpecies>::type&... tilde_hi,
     135              :       const tnsr::I<DataVector, 3>& spatial_velocity,
     136              :       const Scalar<DataVector>& lorentz_factor, const Scalar<DataVector>& lapse,
     137              :       const tnsr::ii<DataVector, 3>& spatial_metric,
     138              :       const Scalar<DataVector>& sqrt_det_spatial_metric) {
     139              :     EXPAND_PACK_LEFT_TO_RIGHT(detail::compute_m1_hydro_coupling_impl(
     140              :         source_n, source_i, emissivity, absorption_opacity, scattering_opacity,
     141              :         tilde_j, tilde_hn, tilde_hi, spatial_velocity, lorentz_factor, lapse,
     142              :         spatial_metric, sqrt_det_spatial_metric));
     143              :   }
     144              : };
     145              : 
     146              : template <typename NeutrinoSpecies>
     147            0 : struct ComputeM1HydroCouplingJacobian
     148              :     : tt::ConformsTo<imex::protocols::ImplicitSourceJacobian>,
     149              :       tt::ConformsTo<protocols::StaticReturnApplyable> {
     150            0 :   using return_tags = tmpl::list<
     151              :       imex::Tags::Jacobian<
     152              :           Tags::TildeE<Frame::Inertial, NeutrinoSpecies>,
     153              :           ::Tags::Source<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>>>,
     154              :       imex::Tags::Jacobian<
     155              :           Tags::TildeE<Frame::Inertial, NeutrinoSpecies>,
     156              :           ::Tags::Source<Tags::TildeS<Frame::Inertial, NeutrinoSpecies>>>,
     157              :       imex::Tags::Jacobian<
     158              :           Tags::TildeS<Frame::Inertial, NeutrinoSpecies>,
     159              :           ::Tags::Source<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>>>,
     160              :       imex::Tags::Jacobian<
     161              :           Tags::TildeS<Frame::Inertial, NeutrinoSpecies>,
     162              :           ::Tags::Source<Tags::TildeS<Frame::Inertial, NeutrinoSpecies>>>>;
     163              : 
     164            0 :   using argument_tags = tmpl::list<
     165              :       Tags::TildeS<Frame::Inertial, NeutrinoSpecies>,
     166              :       Tags::TildeE<Frame::Inertial, NeutrinoSpecies>,
     167              :       Tags::GreyEmissivity<NeutrinoSpecies>,
     168              :       Tags::GreyAbsorptionOpacity<NeutrinoSpecies>,
     169              :       Tags::GreyScatteringOpacity<NeutrinoSpecies>,
     170              :       hydro::Tags::SpatialVelocity<DataVector, 3>,
     171              :       hydro::Tags::LorentzFactor<DataVector>,
     172              :       Tags::ClosureFactor<NeutrinoSpecies>, Tags::TildeJ<NeutrinoSpecies>,
     173              :       Tags::TildeHSpatial<Frame::Inertial, NeutrinoSpecies>,
     174              :       Tags::TildeHNormal<NeutrinoSpecies>, gr::Tags::Lapse<DataVector>,
     175              :       gr::Tags::SpatialMetric<DataVector, 3>,
     176              :       gr::Tags::InverseSpatialMetric<DataVector, 3>>;
     177              : 
     178            0 :   static void apply(
     179              :       const gsl::not_null<Scalar<DataVector>*> deriv_e_source_e,
     180              :       const gsl::not_null<tnsr::i<DataVector, 3>*> deriv_e_source_s,
     181              :       const gsl::not_null<tnsr::I<DataVector, 3>*> deriv_s_source_e,
     182              :       const gsl::not_null<tnsr::Ij<DataVector, 3>*> deriv_s_source_s,
     183              :       const tnsr::i<DataVector, 3>& tilde_s, const Scalar<DataVector>& tilde_e,
     184              :       const Scalar<DataVector>& emissivity,
     185              :       const Scalar<DataVector>& absorption_opacity,
     186              :       const Scalar<DataVector>& scattering_opacity,
     187              :       const tnsr::I<DataVector, 3>& fluid_velocity,
     188              :       const Scalar<DataVector>& fluid_lorentz_factor,
     189              :       const Scalar<DataVector>& closure_factor,
     190              :       const Scalar<DataVector>& comoving_energy_density,
     191              :       const tnsr::i<DataVector, 3>& comoving_momentum_density_spatial,
     192              :       const Scalar<DataVector>& comoving_momentum_density_normal,
     193              :       const Scalar<DataVector>& lapse,
     194              :       const tnsr::ii<DataVector, 3>& spatial_metric,
     195              :       const tnsr::II<DataVector, 3>& inverse_spatial_metric) {
     196              :     detail::compute_m1_hydro_coupling_jacobian_impl(
     197              :         deriv_e_source_e, deriv_e_source_s, deriv_s_source_e, deriv_s_source_s,
     198              :         tilde_s, tilde_e, emissivity, absorption_opacity, scattering_opacity,
     199              :         fluid_velocity, fluid_lorentz_factor, closure_factor,
     200              :         comoving_energy_density, comoving_momentum_density_spatial,
     201              :         comoving_momentum_density_normal, lapse, spatial_metric,
     202              :         inverse_spatial_metric);
     203              :   }
     204              : };
     205              : }  // namespace M1Grey
     206              : }  // namespace RadiationTransport
        

Generated by: LCOV version 2.0-1