ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SBMConstraintGroups.H
Go to the documentation of this file.
1 #ifndef ERF_SBM_CONSTRAINT_GROUPS_H_
2 #define ERF_SBM_CONSTRAINT_GROUPS_H_
3 
4 #include "ERF_SBMLayout.H"
5 
6 #include <AMReX_GpuQualifiers.H>
7 #include <AMReX_REAL.H>
8 
9 #include <cmath>
10 #include <string>
11 #include <utility>
12 #include <vector>
13 
14 namespace erf_sbm {
15 
16 /** A fixed coefficient in a device-ready linear admissibility form. */
18  int component{0};
20 };
21 
22 /** Host-side semantic name plus a linear form evaluated as form >= 0. */
24  std::string semantic_id;
25  std::vector<ConstraintTerm> terms;
26 };
27 
28 /**
29  * Complete atomic constraint group over one population bin.
30  */
32  int population_id{0};
33  int bin{0};
34  std::string semantic_id;
36  std::vector<int> members;
37  std::vector<int> transport_members;
38  std::vector<int> attached_property_indices;
39  std::vector<LinearConstraint> constraints;
40 
41  [[nodiscard]] bool contains (const int component) const noexcept;
42  [[nodiscard]] amrex::Real evaluate (const LinearConstraint& constraint,
43  const std::vector<amrex::Real>& state) const;
44  [[nodiscard]] bool admissible (const std::vector<amrex::Real>& state,
45  amrex::Real* minimum_margin = nullptr,
46  std::string* failed_constraint = nullptr) const;
47 };
48 
49 /**
50  * Device-ready flattened form of one semantic constraint. Terms are stored
51  * in one sparse array and addressed by offset/count, with no fixed term limit.
52  */
54  int group_index{0};
55  int population_id{0};
56  int bin{0};
58  int term_offset{0};
59  int term_count{0};
60 };
61 
62 /** Host-owned compact storage copied as contiguous views to production kernels. */
64  std::vector<ConstraintDescriptor> constraints;
65  std::vector<ConstraintTerm> terms;
66 };
67 
68 /** Evaluate a validated flattened constraint in host or device code. */
69 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
71  const ConstraintTerm* terms,
72  const amrex::Real* state) noexcept
73 {
74  amrex::Real result = amrex::Real(0.0);
75  for (int i = 0; i < constraint.term_count; ++i) {
76  const auto& term = terms[constraint.term_offset + i];
77  result = std::fma(term.coefficient, state[term.component], result);
78  }
79  return result;
80 }
81 
82 /** Device-ready metadata for a donor-derived attached-property envelope. */
84  int group_index{0};
87  int mass_component{-1};
90  int two_moment{0};
94  int has_hard_min{0};
95  int has_hard_max{0};
96 };
97 
98 /** Build deterministic groups from the immutable runtime layout. */
99 [[nodiscard]] std::vector<ConstraintGroup>
100 make_constraint_groups (const SBMLayout& layout);
101 
102 /** Flatten complete semantic groups into bounded device descriptors. */
103 [[nodiscard]] FlattenedConstraintSet
104 make_constraint_descriptors (const SBMLayout& layout);
105 
106 /** Flatten arbitrary semantic groups through the production sparse format. */
107 [[nodiscard]] FlattenedConstraintSet
108 flatten_constraint_groups (const std::vector<ConstraintGroup>& groups,
109  int state_components);
110 
111 [[nodiscard]] std::vector<AttachedPropertySupportDescriptor>
112 make_attached_property_support_descriptors (const SBMLayout& layout);
113 
114 /**
115  * A production scratch chunk is a sequence of complete constraint groups.
116  * `max_groups` is a policy limit on atomic groups, never a component limit;
117  * all mass/number/property members of each group stay together.
118  */
120  std::vector<int> group_indices;
121  std::vector<int> components;
122 };
123 
124 [[nodiscard]] std::vector<ConstraintClosureChunk>
125 make_constraint_closure_chunks (const SBMLayout& layout, int max_groups);
126 
127 /**
128  * Compatibility entry point delegating to the canonical grid-layer transform.
129  */
130 [[nodiscard]] EndpointTransform
132  amrex::Real lower, amrex::Real upper);
133 
134 /** Inverse transform with finite-state and nonnegative-endpoint checks. */
135 [[nodiscard]] std::pair<amrex::Real, amrex::Real>
137  amrex::Real lower, amrex::Real upper);
138 
139 /** Host reference for the finite property-support constraints. */
140 [[nodiscard]] bool
141 property_support_is_admissible (amrex::Real property, amrex::Real carrier_number,
142  amrex::Real lower, amrex::Real upper,
143  amrex::Real tolerance = 0.0) noexcept;
144 
145 } // namespace erf_sbm
146 
147 #endif
Real H
Definition: ERF_InitCustomPert_MovingTerrain.H:7
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_SBMLayout.H:94
Definition: ERF.H:108
std::pair< amrex::Real, amrex::Real > inverse_two_moment(const amrex::Real L, const amrex::Real H, const amrex::Real lower, const amrex::Real upper)
Definition: ERF_SBMConstraintGroups.cpp:286
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real evaluate_constraint_descriptor(const ConstraintDescriptor &constraint, const ConstraintTerm *terms, const amrex::Real *state) noexcept
Definition: ERF_SBMConstraintGroups.H:70
std::vector< ConstraintGroup > make_constraint_groups(const SBMLayout &layout)
Definition: ERF_SBMConstraintGroups.cpp:77
bool property_support_is_admissible(const amrex::Real property, const amrex::Real carrier_number, const amrex::Real lower, const amrex::Real upper, const amrex::Real tolerance) noexcept
Definition: ERF_SBMConstraintGroups.cpp:292
FlattenedConstraintSet flatten_constraint_groups(const std::vector< ConstraintGroup > &groups, const int state_components)
Definition: ERF_SBMConstraintGroups.cpp:167
std::vector< AttachedPropertySupportDescriptor > make_attached_property_support_descriptors(const SBMLayout &layout)
Definition: ERF_SBMConstraintGroups.cpp:214
MomentMode
Definition: ERF_SpectralGrid.H:19
std::vector< ConstraintClosureChunk > make_constraint_closure_chunks(const SBMLayout &layout, const int max_groups)
Definition: ERF_SBMConstraintGroups.cpp:257
EndpointTransform transform_two_moment(const amrex::Real C, const amrex::Real M, const amrex::Real lower, const amrex::Real upper)
Definition: ERF_SBMConstraintGroups.cpp:280
FlattenedConstraintSet make_constraint_descriptors(const SBMLayout &layout)
Definition: ERF_SBMConstraintGroups.cpp:208
Definition: ERF_SBMConstraintGroups.H:83
int property_component
Definition: ERF_SBMConstraintGroups.H:86
amrex::Real pivot
Definition: ERF_SBMConstraintGroups.H:91
int has_hard_max
Definition: ERF_SBMConstraintGroups.H:95
int carrier_component
Definition: ERF_SBMConstraintGroups.H:89
int number_component
Definition: ERF_SBMConstraintGroups.H:88
amrex::Real hard_min
Definition: ERF_SBMConstraintGroups.H:92
amrex::Real hard_max
Definition: ERF_SBMConstraintGroups.H:93
int two_moment
Definition: ERF_SBMConstraintGroups.H:90
int group_index
Definition: ERF_SBMConstraintGroups.H:84
int mass_component
Definition: ERF_SBMConstraintGroups.H:87
int has_hard_min
Definition: ERF_SBMConstraintGroups.H:94
int property_index
Definition: ERF_SBMConstraintGroups.H:85
Definition: ERF_SBMConstraintGroups.H:119
std::vector< int > group_indices
Definition: ERF_SBMConstraintGroups.H:120
std::vector< int > components
Definition: ERF_SBMConstraintGroups.H:121
Definition: ERF_SBMConstraintGroups.H:53
int term_offset
Definition: ERF_SBMConstraintGroups.H:58
int bin
Definition: ERF_SBMConstraintGroups.H:56
int population_id
Definition: ERF_SBMConstraintGroups.H:55
int group_index
Definition: ERF_SBMConstraintGroups.H:54
int term_count
Definition: ERF_SBMConstraintGroups.H:59
int constraint_index
Definition: ERF_SBMConstraintGroups.H:57
Definition: ERF_SBMConstraintGroups.H:31
std::vector< int > transport_members
Definition: ERF_SBMConstraintGroups.H:37
bool contains(const int component) const noexcept
Definition: ERF_SBMConstraintGroups.cpp:24
std::vector< int > attached_property_indices
Definition: ERF_SBMConstraintGroups.H:38
int bin
Definition: ERF_SBMConstraintGroups.H:33
std::vector< int > members
Definition: ERF_SBMConstraintGroups.H:36
int population_id
Definition: ERF_SBMConstraintGroups.H:32
amrex::Real evaluate(const LinearConstraint &constraint, const std::vector< amrex::Real > &state) const
Definition: ERF_SBMConstraintGroups.cpp:30
std::vector< LinearConstraint > constraints
Definition: ERF_SBMConstraintGroups.H:39
std::string semantic_id
Definition: ERF_SBMConstraintGroups.H:34
bool admissible(const std::vector< amrex::Real > &state, amrex::Real *minimum_margin=nullptr, std::string *failed_constraint=nullptr) const
Definition: ERF_SBMConstraintGroups.cpp:43
MomentMode moment_mode
Definition: ERF_SBMConstraintGroups.H:35
Definition: ERF_SBMConstraintGroups.H:17
int component
Definition: ERF_SBMConstraintGroups.H:18
amrex::Real coefficient
Definition: ERF_SBMConstraintGroups.H:19
Definition: ERF_SpectralGrid.H:34
Definition: ERF_SBMConstraintGroups.H:63
std::vector< ConstraintTerm > terms
Definition: ERF_SBMConstraintGroups.H:65
std::vector< ConstraintDescriptor > constraints
Definition: ERF_SBMConstraintGroups.H:64
Definition: ERF_SBMConstraintGroups.H:23
std::vector< ConstraintTerm > terms
Definition: ERF_SBMConstraintGroups.H:25
std::string semantic_id
Definition: ERF_SBMConstraintGroups.H:24