Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 :
8 : #include "DataStructures/VariablesTag.hpp"
9 : #include "Evolution/Imex/GuessResult.hpp"
10 : #include "Evolution/Imex/Protocols/ImexSystem.hpp"
11 : #include "Evolution/Systems/RadiationTransport/M1Grey/BoundaryConditions/BoundaryCondition.hpp"
12 : #include "Evolution/Systems/RadiationTransport/M1Grey/Characteristics.hpp"
13 : #include "Evolution/Systems/RadiationTransport/M1Grey/M1Closure.hpp"
14 : #include "Evolution/Systems/RadiationTransport/M1Grey/M1HydroCoupling.hpp"
15 : #include "Evolution/Systems/RadiationTransport/M1Grey/Tags.hpp"
16 : #include "Evolution/Systems/RadiationTransport/M1Grey/TimeDerivativeTerms.hpp"
17 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp"
18 : #include "PointwiseFunctions/Hydro/Tags.hpp"
19 : #include "Utilities/ProtocolHelpers.hpp"
20 : #include "Utilities/TMPL.hpp"
21 :
22 : /// \ingroup EvolutionSystemsGroup
23 : /// \brief Items related to general relativistic radiation transport
24 : namespace RadiationTransport {
25 : /// The M1 scheme for radiation transport
26 : ///
27 : /// References:
28 : /// - Post-merger evolution of a neutron star-black hole binary with
29 : /// neutrino transport, \cite Foucart2015vpa
30 : namespace M1Grey {
31 :
32 : template <typename NeutrinoSpeciesList>
33 0 : struct System;
34 :
35 : template <typename... NeutrinoSpecies>
36 : struct System<tmpl::list<NeutrinoSpecies...>>
37 : : tt::ConformsTo<imex::protocols::ImexSystem> {
38 : static std::string name() { return "M1Grey"; }
39 :
40 : static constexpr bool is_in_flux_conservative_form = true;
41 : static constexpr bool has_primitive_and_conservative_vars = false;
42 : static constexpr size_t volume_dim = 3;
43 : // If coupling to hydro, we'll want 3D equations of state
44 : // i.e. P(rho,T,Ye)... but this is not implemented yet.
45 : // For early tests of M1, we'll ignore coupling to the fluid
46 : // and provide analytical expressions for its 4-velocity / LorentzFactor
47 :
48 : using boundary_conditions_base =
49 : BoundaryConditions::BoundaryCondition<tmpl::list<NeutrinoSpecies...>>;
50 :
51 : using variables_tag = ::Tags::Variables<
52 : tmpl::list<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>...,
53 : Tags::TildeS<Frame::Inertial, NeutrinoSpecies>...>>;
54 : using flux_variables =
55 : tmpl::list<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>...,
56 : Tags::TildeS<Frame::Inertial, NeutrinoSpecies>...>;
57 : using gradient_variables = tmpl::list<>;
58 : using primitive_variables_tag = ::Tags::Variables<tmpl::list<
59 : Tags::ClosureFactor<NeutrinoSpecies>...,
60 : Tags::TildeP<Frame::Inertial, NeutrinoSpecies>...,
61 : Tags::TildeJ<NeutrinoSpecies>..., Tags::TildeHNormal<NeutrinoSpecies>...,
62 : Tags::TildeHSpatial<Frame::Inertial, NeutrinoSpecies>...,
63 : Tags::M1HydroCouplingNormal<NeutrinoSpecies>...,
64 : Tags::M1HydroCouplingSpatial<Frame::Inertial, NeutrinoSpecies>...>>;
65 : // gr::tags_for_hydro contains all these tags plus SqrtDetSpatialMetric,
66 : // so it can be used when adding M1 coupling to hydro
67 : using spacetime_variables_tag = ::Tags::Variables<
68 : tmpl::list<gr::Tags::Lapse<DataVector>, gr::Tags::Shift<DataVector, 3>,
69 : gr::Tags::SpatialMetric<DataVector, 3>,
70 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
71 : gr::Tags::SqrtDetSpatialMetric<DataVector>,
72 : ::Tags::deriv<gr::Tags::Lapse<DataVector>, tmpl::size_t<3>,
73 : Frame::Inertial>,
74 : ::Tags::deriv<gr::Tags::Shift<DataVector, 3>, tmpl::size_t<3>,
75 : Frame::Inertial>,
76 : ::Tags::deriv<gr::Tags::SpatialMetric<DataVector, 3>,
77 : tmpl::size_t<3>, Frame::Inertial>,
78 : gr::Tags::ExtrinsicCurvature<DataVector, 3>>>;
79 : using hydro_variables_tag = ::Tags::Variables<
80 : tmpl::list<hydro::Tags::LorentzFactor<DataVector>,
81 : hydro::Tags::SpatialVelocity<DataVector, 3>,
82 : Tags::GreyEmissivity<NeutrinoSpecies>...,
83 : Tags::GreyAbsorptionOpacity<NeutrinoSpecies>...,
84 : Tags::GreyScatteringOpacity<NeutrinoSpecies>...>>;
85 :
86 : using compute_volume_time_derivative_terms =
87 : TimeDerivativeTerms<NeutrinoSpecies...>;
88 :
89 : using inverse_spatial_metric_tag =
90 : gr::Tags::InverseSpatialMetric<DataVector, 3>;
91 :
92 : template <typename Species>
93 0 : struct ImplicitSector : tt::ConformsTo<imex::protocols::ImplicitSector> {
94 0 : using tensors = tmpl::list<Tags::TildeE<Frame::Inertial, Species>,
95 : Tags::TildeS<Frame::Inertial, Species>>;
96 : // Need initial_guess
97 0 : using initial_guess = imex::GuessExplicitResult;
98 :
99 0 : struct M1Solve {
100 : // tags in addition to sector tensors to be made available in databox
101 0 : using tags_from_evolution = tmpl::list<
102 : // spacetime
103 : gr::Tags::Lapse<DataVector>, gr::Tags::SpatialMetric<DataVector, 3>,
104 : gr::Tags::SqrtDetSpatialMetric<DataVector>,
105 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
106 : // neutrino
107 : Tags::GreyEmissivity<NeutrinoSpecies>...,
108 : Tags::GreyAbsorptionOpacity<NeutrinoSpecies>...,
109 : Tags::GreyScatteringOpacity<NeutrinoSpecies>...,
110 : // hydro
111 : hydro::Tags::LorentzFactor<DataVector>,
112 : hydro::Tags::SpatialVelocity<DataVector, 3>>;
113 :
114 0 : using simple_tags = tmpl::list<::Tags::Variables<tmpl::list<
115 : Tags::ClosureFactor<NeutrinoSpecies>...,
116 : Tags::TildeP<Frame::Inertial, NeutrinoSpecies>...,
117 : Tags::TildeJ<NeutrinoSpecies>...,
118 : Tags::TildeHNormal<NeutrinoSpecies>...,
119 : Tags::TildeHSpatial<Frame::Inertial, NeutrinoSpecies>...>>>;
120 0 : using compute_tags = tmpl::list<>;
121 :
122 0 : using source_prep = tmpl::list<ComputeM1Closure<tmpl::list<Species>>>;
123 0 : using jacobian_prep = tmpl::list<ComputeM1Closure<tmpl::list<Species>>>;
124 :
125 0 : using source = ComputeM1HydroCoupling<tmpl::list<Species>>;
126 0 : using jacobian = ComputeM1HydroCouplingJacobian<Species>;
127 : };
128 :
129 0 : using solve_attempts = tmpl::list<M1Solve>;
130 : };
131 :
132 : using implicit_sectors = tmpl::list<ImplicitSector<NeutrinoSpecies>...>;
133 : };
134 : } // namespace M1Grey
135 : } // namespace RadiationTransport
|