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 0 : struct System<tmpl::list<NeutrinoSpecies...>>
37 : : tt::ConformsTo<imex::protocols::ImexSystem> {
38 0 : static constexpr bool is_in_flux_conservative_form = true;
39 0 : static constexpr bool has_primitive_and_conservative_vars = false;
40 0 : static constexpr size_t volume_dim = 3;
41 : // If coupling to hydro, we'll want 3D equations of state
42 : // i.e. P(rho,T,Ye)... but this is not implemented yet.
43 : // For early tests of M1, we'll ignore coupling to the fluid
44 : // and provide analytical expressions for its 4-velocity / LorentzFactor
45 :
46 0 : using boundary_conditions_base =
47 : BoundaryConditions::BoundaryCondition<tmpl::list<NeutrinoSpecies...>>;
48 :
49 0 : using variables_tag = ::Tags::Variables<
50 : tmpl::list<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>...,
51 : Tags::TildeS<Frame::Inertial, NeutrinoSpecies>...>>;
52 0 : using flux_variables =
53 : tmpl::list<Tags::TildeE<Frame::Inertial, NeutrinoSpecies>...,
54 : Tags::TildeS<Frame::Inertial, NeutrinoSpecies>...>;
55 0 : using gradient_variables = tmpl::list<>;
56 0 : using primitive_variables_tag = ::Tags::Variables<tmpl::list<
57 : Tags::ClosureFactor<NeutrinoSpecies>...,
58 : Tags::TildeP<Frame::Inertial, NeutrinoSpecies>...,
59 : Tags::TildeJ<NeutrinoSpecies>..., Tags::TildeHNormal<NeutrinoSpecies>...,
60 : Tags::TildeHSpatial<Frame::Inertial, NeutrinoSpecies>...,
61 : Tags::M1HydroCouplingNormal<NeutrinoSpecies>...,
62 : Tags::M1HydroCouplingSpatial<Frame::Inertial, NeutrinoSpecies>...>>;
63 : // gr::tags_for_hydro contains all these tags plus SqrtDetSpatialMetric,
64 : // so it can be used when adding M1 coupling to hydro
65 0 : using spacetime_variables_tag = ::Tags::Variables<
66 : tmpl::list<gr::Tags::Lapse<DataVector>, gr::Tags::Shift<DataVector, 3>,
67 : gr::Tags::SpatialMetric<DataVector, 3>,
68 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
69 : gr::Tags::SqrtDetSpatialMetric<DataVector>,
70 : ::Tags::deriv<gr::Tags::Lapse<DataVector>, tmpl::size_t<3>,
71 : Frame::Inertial>,
72 : ::Tags::deriv<gr::Tags::Shift<DataVector, 3>, tmpl::size_t<3>,
73 : Frame::Inertial>,
74 : ::Tags::deriv<gr::Tags::SpatialMetric<DataVector, 3>,
75 : tmpl::size_t<3>, Frame::Inertial>,
76 : gr::Tags::ExtrinsicCurvature<DataVector, 3>>>;
77 0 : using hydro_variables_tag = ::Tags::Variables<
78 : tmpl::list<hydro::Tags::LorentzFactor<DataVector>,
79 : hydro::Tags::SpatialVelocity<DataVector, 3>,
80 : Tags::GreyEmissivity<NeutrinoSpecies>...,
81 : Tags::GreyAbsorptionOpacity<NeutrinoSpecies>...,
82 : Tags::GreyScatteringOpacity<NeutrinoSpecies>...>>;
83 :
84 0 : using compute_volume_time_derivative_terms =
85 : TimeDerivativeTerms<NeutrinoSpecies...>;
86 :
87 0 : using inverse_spatial_metric_tag =
88 : gr::Tags::InverseSpatialMetric<DataVector, 3>;
89 :
90 : template <typename Species>
91 0 : struct ImplicitSector : tt::ConformsTo<imex::protocols::ImplicitSector> {
92 0 : using tensors = tmpl::list<Tags::TildeE<Frame::Inertial, Species>,
93 : Tags::TildeS<Frame::Inertial, Species>>;
94 : // Need initial_guess
95 0 : using initial_guess = imex::GuessExplicitResult;
96 :
97 0 : struct M1Solve {
98 : // tags in addition to sector tensors to be made available in databox
99 0 : using tags_from_evolution = tmpl::list<
100 : // spacetime
101 : gr::Tags::Lapse<DataVector>, gr::Tags::SpatialMetric<DataVector, 3>,
102 : gr::Tags::SqrtDetSpatialMetric<DataVector>,
103 : gr::Tags::InverseSpatialMetric<DataVector, 3>,
104 : // neutrino
105 : Tags::GreyEmissivity<NeutrinoSpecies>...,
106 : Tags::GreyAbsorptionOpacity<NeutrinoSpecies>...,
107 : Tags::GreyScatteringOpacity<NeutrinoSpecies>...,
108 : // hydro
109 : hydro::Tags::LorentzFactor<DataVector>,
110 : hydro::Tags::SpatialVelocity<DataVector, 3>>;
111 :
112 0 : using simple_tags = tmpl::list<::Tags::Variables<tmpl::list<
113 : Tags::ClosureFactor<NeutrinoSpecies>...,
114 : Tags::TildeP<Frame::Inertial, NeutrinoSpecies>...,
115 : Tags::TildeJ<NeutrinoSpecies>...,
116 : Tags::TildeHNormal<NeutrinoSpecies>...,
117 : Tags::TildeHSpatial<Frame::Inertial, NeutrinoSpecies>...>>>;
118 0 : using compute_tags = tmpl::list<>;
119 :
120 0 : using source_prep = tmpl::list<ComputeM1Closure<tmpl::list<Species>>>;
121 0 : using jacobian_prep = tmpl::list<ComputeM1Closure<tmpl::list<Species>>>;
122 :
123 0 : using source = ComputeM1HydroCoupling<tmpl::list<Species>>;
124 0 : using jacobian = ComputeM1HydroCouplingJacobian<Species>;
125 : };
126 :
127 0 : using solve_attempts = tmpl::list<M1Solve>;
128 : };
129 :
130 0 : using implicit_sectors = tmpl::list<ImplicitSector<NeutrinoSpecies>...>;
131 : };
132 : } // namespace M1Grey
133 : } // namespace RadiationTransport
|