ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SBMLayout.H
Go to the documentation of this file.
1 #ifndef ERF_SBM_LAYOUT_H_
2 #define ERF_SBM_LAYOUT_H_
3 
4 #include "ERF_SpectralGrid.H"
7 
8 #include <string>
9 #include <limits>
10 #include <vector>
11 
12 namespace erf_sbm {
13 
14 /**
15  * Semantic class of an attached carrier-bin extensive quantity.
16  *
17  * ExtensiveMass is nonnegative additional mass and is not part of the water
18  * projection. NumberCarried is a nonnegative count-like quantity. A
19  * MassBoundedSubset is nonnegative and may be constrained by its carrier mass
20  * when that future physics is implemented.
21  */
23 /** P1/P2 remap contract; independent remapping is reserved for future work. */
27 
29  int population_id{0};
30  std::string semantic_id{"liquid_mass"};
34  // These are units of the transported prognostic components, not of the
35  // particle-coordinate grid.
36  std::string mass_state_units{"kg m^-3"};
37  std::string number_state_units{"m^-3"};
38 };
39 
41  int population_id{0};
43 };
44 
46  std::string name;
47  std::string semantic_id;
48  std::string units;
52  // All P1/P2 property kinds are aligned to carrier bins and conservatively
53  // remapped with the carrier. The kind, not this policy, distinguishes
54  // additional mass from count-like or mass-bounded semantics.
56  bool transported{true};
57  bool may_overlap_mass{false};
58  // Optional finite per-carrier support bounds. NaN means that the
59  // descriptor only requests nonnegativity; no arbitrary carrier floor is
60  // manufactured by the generic transport layer.
62  amrex::Real support_max{std::numeric_limits<amrex::Real>::quiet_NaN()};
63 };
64 
66  int population_id{0};
67  std::string semantic_id;
71  std::string mass_state_units;
72  std::string number_state_units;
73  int mass_offset{0};
74  int number_offset{-1};
76  // Component starts for this population's attached fields, in descriptor
77  // order. Filled once by SBMLayout and exposed through non-owning device
78  // views; the vector is immutable for the layout lifetime.
79  std::vector<int> property_component_offsets;
80 };
81 
82 struct SBMLayoutSpec {
83  std::vector<SpectralPopulationSpec> populations;
85  std::vector<AttachedPropertyDescriptor> attached_properties;
86 };
87 
89  bool valid{false};
90  std::string message;
91 };
92 
93 /** Immutable runtime SBM component and projection layout. */
94 class SBMLayout {
95 public:
96  static LayoutValidation validate (const SBMLayoutSpec& spec);
97  explicit SBMLayout (SBMLayoutSpec spec);
98 
99  [[nodiscard]] const std::vector<PopulationLayout>& populations () const noexcept { return m_populations; }
100  [[nodiscard]] const std::vector<AttachedPropertyDescriptor>& attached_properties () const noexcept { return m_properties; }
101  [[nodiscard]] const ::erf_auxiliary::AuxiliaryProjection& bulk_projection () const noexcept { return m_projection; }
102  [[nodiscard]] const LiquidProjectionSpec& liquid_projection () const noexcept { return m_liquid_projection; }
103  [[nodiscard]] int ncomp () const noexcept { return m_ncomp; }
104  [[nodiscard]] int mass_offset (const int population) const;
105  [[nodiscard]] int property_offset (const int property) const;
106  [[nodiscard]] std::string schema_identity () const noexcept { return m_schema_identity; }
107  [[nodiscard]] std::string inspection () const;
109 
110 private:
111  std::vector<PopulationLayout> m_populations;
112  std::vector<AttachedPropertyDescriptor> m_properties;
113  std::vector<int> m_property_offsets;
116  int m_ncomp{0};
117  std::string m_schema_identity;
118 };
119 
120 } // namespace erf_sbm
121 
122 #endif
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_AuxiliaryProjection.H:28
Definition: ERF_AuxiliaryStateLayout.H:21
Definition: ERF_SBMLayout.H:94
const std::vector< PopulationLayout > & populations() const noexcept
Definition: ERF_SBMLayout.H:99
::erf_auxiliary::AuxiliaryStateLayout auxiliary_layout() const
Definition: ERF_SBMLayout.cpp:220
std::string inspection() const
Definition: ERF_SBMLayout.cpp:185
SBMLayout(SBMLayoutSpec spec)
Definition: ERF_SBMLayout.cpp:82
const std::vector< AttachedPropertyDescriptor > & attached_properties() const noexcept
Definition: ERF_SBMLayout.H:100
std::string schema_identity() const noexcept
Definition: ERF_SBMLayout.H:106
std::vector< int > m_property_offsets
Definition: ERF_SBMLayout.H:113
const ::erf_auxiliary::AuxiliaryProjection & bulk_projection() const noexcept
Definition: ERF_SBMLayout.H:101
int property_offset(const int property) const
Definition: ERF_SBMLayout.cpp:171
LiquidProjectionSpec m_liquid_projection
Definition: ERF_SBMLayout.H:114
int m_ncomp
Definition: ERF_SBMLayout.H:116
std::string m_schema_identity
Definition: ERF_SBMLayout.H:117
int mass_offset(const int population) const
Definition: ERF_SBMLayout.cpp:179
std::vector< AttachedPropertyDescriptor > m_properties
Definition: ERF_SBMLayout.H:112
std::vector< PopulationLayout > m_populations
Definition: ERF_SBMLayout.H:111
::erf_auxiliary::AuxiliaryProjection m_projection
Definition: ERF_SBMLayout.H:115
const LiquidProjectionSpec & liquid_projection() const noexcept
Definition: ERF_SBMLayout.H:102
int ncomp() const noexcept
Definition: ERF_SBMLayout.H:103
static LayoutValidation validate(const SBMLayoutSpec &spec)
Definition: ERF_SBMLayout.cpp:12
Definition: ERF_SpectralGrid.H:110
Definition: ERF.H:108
SupportRequirement
Definition: ERF_SBMLayout.H:25
MomentMode
Definition: ERF_SpectralGrid.H:19
PopulationPhase
Definition: ERF_SBMLayout.H:26
PropertyKind
Definition: ERF_SBMLayout.H:22
PropertyRemapPolicy
Definition: ERF_SBMLayout.H:24
Definition: ERF_SBMLayout.H:45
bool transported
Definition: ERF_SBMLayout.H:56
amrex::Real support_max
Definition: ERF_SBMLayout.H:62
PropertyKind kind
Definition: ERF_SBMLayout.H:50
std::string name
Definition: ERF_SBMLayout.H:46
std::string semantic_id
Definition: ERF_SBMLayout.H:47
amrex::Real support_min
Definition: ERF_SBMLayout.H:61
PropertyRemapPolicy remap_policy
Definition: ERF_SBMLayout.H:55
std::string units
Definition: ERF_SBMLayout.H:48
SupportRequirement support
Definition: ERF_SBMLayout.H:51
int carrier_population
Definition: ERF_SBMLayout.H:49
bool may_overlap_mass
Definition: ERF_SBMLayout.H:57
Definition: ERF_SBMLayout.H:88
bool valid
Definition: ERF_SBMLayout.H:89
std::string message
Definition: ERF_SBMLayout.H:90
Definition: ERF_SBMLayout.H:40
int population_id
Definition: ERF_SBMLayout.H:41
int cloud_rain_split
Definition: ERF_SBMLayout.H:42
Definition: ERF_SBMLayout.H:65
int component_count
Definition: ERF_SBMLayout.H:75
std::string semantic_id
Definition: ERF_SBMLayout.H:67
int number_offset
Definition: ERF_SBMLayout.H:74
MomentMode moment_mode
Definition: ERF_SBMLayout.H:70
PopulationPhase phase
Definition: ERF_SBMLayout.H:68
SpectralGrid grid
Definition: ERF_SBMLayout.H:69
std::vector< int > property_component_offsets
Definition: ERF_SBMLayout.H:79
int mass_offset
Definition: ERF_SBMLayout.H:73
std::string number_state_units
Definition: ERF_SBMLayout.H:72
std::string mass_state_units
Definition: ERF_SBMLayout.H:71
int population_id
Definition: ERF_SBMLayout.H:66
Definition: ERF_SBMLayout.H:82
LiquidProjectionSpec liquid_projection
Definition: ERF_SBMLayout.H:84
std::vector< SpectralPopulationSpec > populations
Definition: ERF_SBMLayout.H:83
std::vector< AttachedPropertyDescriptor > attached_properties
Definition: ERF_SBMLayout.H:85
Definition: ERF_SpectralGrid.H:21
Definition: ERF_SBMLayout.H:28
std::string mass_state_units
Definition: ERF_SBMLayout.H:36
MomentMode moment_mode
Definition: ERF_SBMLayout.H:33
PopulationPhase phase
Definition: ERF_SBMLayout.H:31
std::string number_state_units
Definition: ERF_SBMLayout.H:37
SpectralGridSpec grid
Definition: ERF_SBMLayout.H:32
int population_id
Definition: ERF_SBMLayout.H:29
std::string semantic_id
Definition: ERF_SBMLayout.H:30