Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 :
8 : #include "DataStructures/DataBox/DataBoxTag.hpp"
9 : #include "DataStructures/DataBox/Prefixes.hpp"
10 : #include "DataStructures/DataVector.hpp"
11 : #include "DataStructures/Tensor/Tensor.hpp"
12 : #include "Evolution/DiscontinuousGalerkin/TimeDerivativeDecisions.hpp"
13 : #include "Evolution/Systems/RadiationTransport/M1Grey/Fluxes.hpp"
14 : #include "Evolution/Systems/RadiationTransport/M1Grey/Sources.hpp"
15 : #include "Evolution/Systems/RadiationTransport/M1Grey/Tags.hpp"
16 : #include "NumericalAlgorithms/LinearOperators/PartialDerivatives.hpp"
17 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
18 : #include "PointwiseFunctions/Hydro/Tags.hpp"
19 : #include "Utilities/Gsl.hpp"
20 : #include "Utilities/TMPL.hpp"
21 :
22 : namespace RadiationTransport::M1Grey {
23 : template <typename... NeutrinoSpecies>
24 0 : struct TimeDerivativeTerms {
25 0 : struct TildeSUp : db::SimpleTag {
26 0 : using type = tnsr::I<DataVector, 3, Frame::Inertial>;
27 : };
28 :
29 0 : using temporary_tags =
30 : tmpl::list<TildeSUp, gr::Tags::InverseSpatialMetric<DataVector, 3>>;
31 0 : using argument_tags =
32 : tmpl::list<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>...,
33 : Tags::TildeS<Frame::Inertial, NeutrinoSpecies>...,
34 : Tags::TildeP<Frame::Inertial, NeutrinoSpecies>...,
35 : gr::Tags::Lapse<DataVector>, gr::Tags::Shift<DataVector, 3>,
36 : gr::Tags::SpatialMetric<DataVector, 3>,
37 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
38 : ::Tags::deriv<gr::Tags::Lapse<DataVector>, tmpl::size_t<3>,
39 : Frame::Inertial>,
40 : ::Tags::deriv<gr::Tags::Shift<DataVector, 3>, tmpl::size_t<3>,
41 : Frame::Inertial>,
42 : ::Tags::deriv<gr::Tags::SpatialMetric<DataVector, 3>,
43 : tmpl::size_t<3>, Frame::Inertial>,
44 : gr::Tags::ExtrinsicCurvature<DataVector, 3>,
45 : Tags::GreyEmissivity<NeutrinoSpecies>...,
46 : Tags::GreyAbsorptionOpacity<NeutrinoSpecies>...,
47 : Tags::GreyScatteringOpacity<NeutrinoSpecies>...,
48 : Tags::TildeJ<NeutrinoSpecies>...,
49 : Tags::TildeHNormal<NeutrinoSpecies>...,
50 : Tags::TildeHSpatial<Frame::Inertial, NeutrinoSpecies>...,
51 : hydro::Tags::SpatialVelocity<DataVector, 3>,
52 : hydro::Tags::LorentzFactor<DataVector>,
53 : gr::Tags::SqrtDetSpatialMetric<DataVector>>;
54 :
55 0 : static ::evolution::dg::TimeDerivativeDecisions<3> apply(
56 : const gsl::not_null<typename Tags::TildeE<
57 : Frame::Inertial,
58 : NeutrinoSpecies>::type*>... non_flux_terms_dt_tilde_e,
59 : const gsl::not_null<typename Tags::TildeS<
60 : Frame::Inertial,
61 : NeutrinoSpecies>::type*>... non_flux_terms_dt_tilde_s,
62 :
63 : const gsl::not_null<typename ::Tags::Flux<
64 : Tags::TildeE<Frame::Inertial, NeutrinoSpecies>, tmpl::size_t<3>,
65 : Frame::Inertial>::type*>... tilde_e_flux,
66 : const gsl::not_null<typename ::Tags::Flux<
67 : Tags::TildeS<Frame::Inertial, NeutrinoSpecies>, tmpl::size_t<3>,
68 : Frame::Inertial>::type*>... tilde_s_flux,
69 :
70 : const gsl::not_null<tnsr::I<DataVector, 3, Frame::Inertial>*> tilde_s_M,
71 : const gsl::not_null<tnsr::II<DataVector, 3, Frame::Inertial>*>
72 : temp_inv_spatial_metric,
73 :
74 : const typename Tags::TildeE<Frame::Inertial,
75 : NeutrinoSpecies>::type&... tilde_e,
76 : const typename Tags::TildeS<Frame::Inertial,
77 : NeutrinoSpecies>::type&... tilde_s,
78 : const typename Tags::TildeP<Frame::Inertial,
79 : NeutrinoSpecies>::type&... tilde_p,
80 : const Scalar<DataVector>& lapse,
81 : const tnsr::I<DataVector, 3, Frame::Inertial>& shift,
82 : const tnsr::ii<DataVector, 3, Frame::Inertial>& spatial_metric,
83 : const tnsr::II<DataVector, 3, Frame::Inertial>& inv_spatial_metric,
84 : const tnsr::i<DataVector, 3>& d_lapse,
85 : const tnsr::iJ<DataVector, 3>& d_shift,
86 : const tnsr::ijj<DataVector, 3>& d_spatial_metric,
87 : const tnsr::ii<DataVector, 3>& extrinsic_curvature,
88 : const Scalar<DataVector>& emissivity,
89 : const Scalar<DataVector>& absorption_opacity,
90 : const Scalar<DataVector>& scattering_opacity,
91 : const typename Tags::TildeJ<NeutrinoSpecies>::type&... tilde_j,
92 : const typename Tags::TildeHNormal<
93 : NeutrinoSpecies>::type&... tilde_h_normal,
94 : const typename Tags::TildeHSpatial<
95 : Frame::Inertial, NeutrinoSpecies>::type&... tilde_h_spatial,
96 : const tnsr::I<DataVector, 3>& spatial_velocity,
97 : const Scalar<DataVector>& lorentz,
98 : const Scalar<DataVector>& sqrt_det_spatial_metric) {
99 : *temp_inv_spatial_metric = inv_spatial_metric;
100 : EXPAND_PACK_LEFT_TO_RIGHT(detail::compute_fluxes_impl(
101 : tilde_e_flux, tilde_s_flux, tilde_s_M, tilde_e, tilde_s, tilde_p, lapse,
102 : shift, spatial_metric, inv_spatial_metric));
103 : EXPAND_PACK_LEFT_TO_RIGHT(detail::compute_sources_impl(
104 : non_flux_terms_dt_tilde_e, non_flux_terms_dt_tilde_s, tilde_e, tilde_s,
105 : tilde_p, lapse, d_lapse, d_shift, d_spatial_metric, inv_spatial_metric,
106 : extrinsic_curvature, spatial_metric, emissivity, absorption_opacity,
107 : scattering_opacity, tilde_j, tilde_h_normal, tilde_h_spatial,
108 : spatial_velocity, lorentz, sqrt_det_spatial_metric));
109 : return {true};
110 : }
111 : };
112 : } // namespace RadiationTransport::M1Grey
|