85 if (!result.valid)
throw std::invalid_argument(
"invalid SBM layout: " + result.message);
90 for (std::size_t i = 0; i < spec.populations.size(); ++i) {
91 const auto& input = spec.populations[i];
92 PopulationLayout population{input.population_id, input.semantic_id, input.phase,
93 SpectralGrid(input.grid), input.moment_mode,
94 input.mass_state_units, input.number_state_units,
96 population.component_count = population.grid.nbins();
97 offset += population.component_count;
99 population.number_offset =
offset;
100 population.component_count += population.grid.nbins();
101 offset += population.grid.nbins();
105 for (
const auto& property : spec.attached_properties) {
108 [&](
const PopulationLayout& candidate) {
109 return candidate.population_id == m_properties.back().carrier_population;
112 throw std::invalid_argument(
"attached property refers to an unknown population");
119 carrier->property_component_offsets.push_back(
offset);
120 offset += carrier->grid.nbins();
124 std::vector<::erf_auxiliary::ProjectionRule> rules;
127 [&](
const PopulationLayout& population) {
128 return population.population_id == m_liquid_projection.population_id;
131 rules.push_back({
"qc", liquid->mass_offset, split});
132 rules.push_back({
"qr", liquid->mass_offset + split, liquid->grid.nbins() - split});
135 throw std::invalid_argument(
"SBM projection does not match layout");
138 std::ostringstream schema;
139 schema <<
"sbm-layout-v1|ncomp=" <<
m_ncomp
140 <<
"|constraint_policy=nonnegative-bin-mass-and-moments-v1"
141 <<
"|projection=liquid-mass-sum-to-qc-qr-v1"
146 schema <<
"population=" <<
p.population_id <<
':' <<
p.semantic_id
147 <<
":phase=" <<
static_cast<int>(
p.phase) <<
':' <<
p.grid.identity()
148 <<
":moment=" <<
static_cast<int>(
p.moment_mode)
149 <<
":representation=" << identity.representation
150 <<
":reconstruction=" << identity.reconstruction
151 <<
":packet_remap=" << identity.packet_remap
152 <<
":mass_units=" <<
p.mass_state_units
153 <<
":number_units=" <<
p.number_state_units
154 <<
":mass=" <<
p.mass_offset <<
":number=" <<
p.number_offset <<
'|';
158 schema <<
"property=" <<
p.name <<
':' <<
p.semantic_id <<
':' <<
p.units
159 <<
':' <<
p.carrier_population <<
':' <<
static_cast<int>(
p.kind)
160 <<
":remap=" <<
static_cast<int>(
p.remap_policy)
161 <<
":support=" <<
static_cast<int>(
p.support)
162 <<
":transported=" << (
p.transported ? 1 : 0)
163 <<
":may_overlap_mass=" << (
p.may_overlap_mass ? 1 : 0)
AMREX_FORCE_INLINE IntVect offset(const int face_dir, const int normal)
Definition: ERF_ReadBndryPlanes.cpp:32
Definition: ERF_AuxiliaryProjection.H:28
ProjectionValidation validate(const int source_components) const
Definition: ERF_AuxiliaryProjection.cpp:7
std::vector< int > m_property_offsets
Definition: ERF_SBMLayout.H:113
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
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
static LayoutValidation validate(const SBMLayoutSpec &spec)
Definition: ERF_SBMLayout.cpp:12
@ p
Definition: ERF_WSM6.H:280
constexpr RepresentationIdentity representation_identity(const MomentMode mode) noexcept
Definition: ERF_SBMRepresentation.H:16
std::string canonical_real(const amrex::Real value, const bool allow_unbounded_nan=false)
Definition: ERF_SBMCanonicalIdentity.H:18
bool valid
Definition: ERF_AuxiliaryProjection.H:23
int population_id
Definition: ERF_SBMLayout.H:41
int cloud_rain_split
Definition: ERF_SBMLayout.H:42