SpECTRE Documentation Coverage Report
Current view: top level - Evolution/Systems/RadiationTransport/M1Grey - M1HydroCoupling.hpp Hit Total Coverage
Commit: 1f2210958b4f38fdc0400907ee7c6d5af5111418 Lines: 2 10 20.0 %
Date: 2025-12-05 05:03:31
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/Tensor/TypeAliases.hpp"
      14             : #include "Evolution/Imex/Protocols/ImplicitSource.hpp"
      15             : #include "Evolution/Imex/Protocols/ImplicitSourceJacobian.hpp"
      16             : #include "Evolution/Imex/Tags/Jacobian.hpp"
      17             : #include "Evolution/Systems/RadiationTransport/M1Grey/Tags.hpp"
      18             : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
      19             : #include "PointwiseFunctions/Hydro/Tags.hpp"
      20             : #include "Utilities/ProtocolHelpers.hpp"
      21             : #include "Utilities/Protocols/StaticReturnApplyable.hpp"
      22             : #include "Utilities/Requires.hpp"
      23             : #include "Utilities/TMPL.hpp"
      24             : #include "Utilities/TaggedTuple.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 1.14