ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_AuxiliaryStage.H
Go to the documentation of this file.
1 #ifndef ERF_AUXILIARY_STAGE_H_
2 #define ERF_AUXILIARY_STAGE_H_
3 
5 
6 #include <string>
7 #include <vector>
8 
9 namespace erf_auxiliary {
10 
11 enum class HostIntegrator {
15 };
16 
17 /** State view that bounds the low-order limiter trial for this host stage. */
18 enum class LimiterTrialBase {
19  Anchor,
20  Input
21 };
22 
24  const amrex::MultiFab* field{nullptr};
25  int component{-1};
26  double time{0.0};
27 };
28 
30  amrex::MultiFab* field{nullptr};
31  int component{-1};
32  double time{0.0};
33 };
34 
36  const amrex::MultiFab* x{nullptr};
37  const amrex::MultiFab* y{nullptr};
38  const amrex::MultiFab* z{nullptr};
39 };
40 
43  double anchor_weight{0.0};
44  double input_weight{0.0};
47  double completed_ledger_time{0.0};
48 };
49 
51  /** Perform global positive-density and finite-result validation. */
52  Global,
53  /**
54  * Skip global checks. The caller guarantees every input state value is
55  * finite, density is finite and strictly positive, and each state/density
56  * quotient is finite and representable in amrex::Real. No global
57  * reduction is performed by this policy.
58  */
60 };
61 
62 /** Semantic host and state views at the pre-overwrite slow-RHS post seam. */
65  int level{-1};
66  int stage{-1};
67 
68  double step_old_time{0.0};
69  double input_time{0.0};
70  double target_time{0.0};
71 
73 
77 
81 
85 
87 };
88 
89 /** Return the explicit ERF recurrence recipe for one supported host stage. */
91  int stage,
92  double host_stage_interval,
93  AuxiliaryStageRecipe& recipe,
94  std::string& diagnostic);
95 
96 /** Form z=U_input/rho_input from the explicit input-time views. */
97 bool BuildAuxiliaryIntensiveState (const ConstTimedFieldView& state_input,
98  const ConstTimedFieldView& rho_input,
99  double input_time,
100  amrex::MultiFab& intensive,
102  std::string& diagnostic);
103 
104 const char* HostIntegratorName (HostIntegrator method) noexcept;
105 
106 /** Apply H_target = a H_anchor + b H_input - c D_xi(F_rate). */
108  const MappedFaceFluxRate& rate,
109  const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx_inv,
110  int rate_component = 0);
111 
112 /** Whether the mutable stage target is a distinct MultiFab from both inputs. */
114 
115 /** Completed-step time integral of accepted mapped face rates and stage order. */
117 public:
121 
122  void define (const amrex::BoxArray& cell_ba,
123  const amrex::DistributionMapping& dm,
124  int ncomp = 1);
125 
126  /**
127  * MPI-collective completed-stage admission. All participating ranks must
128  * enter for the same host stage, including after a local recoverable error;
129  * callers must not branch around the call based on rank-local predicates.
130  * Asynchronous rank-local Abort or MPI process failure is outside this
131  * protection. A rejected in-progress transaction discards its partial
132  * accepted transfers everywhere. If every rank instead has a valid
133  * completed prior step and no rank has begun the next step, rejection
134  * leaves that prior completed transfer intact. Starting a valid new step
135  * invalidates the previous completed record. Read a transfer as accepted
136  * only while step_complete() is true; this object does not provide a
137  * retained snapshot.
138  */
139  bool accept_stage (HostIntegrator method,
140  int stage,
141  double step_old_time,
142  const AuxiliaryStageRecipe& recipe,
143  const MappedFaceFluxRate& rate,
144  std::string& diagnostic);
145 
146  /** Begin one host stage; chunk accumulation does not advance stage order. */
147  bool begin_stage (HostIntegrator method,
148  int stage,
149  double step_old_time,
150  const AuxiliaryStageRecipe& recipe,
151  std::string& diagnostic);
152 
153  /** Add one accepted source component to its global ledger component. */
155  int source_component,
156  int ledger_component,
157  std::string& diagnostic);
158 
159  /**
160  * MPI-collective stage admission. Every rank participating in this level's
161  * call must enter despite local recoverable errors; callers must not branch
162  * around it using rank-local predicates. Incomplete, invalid, mismatched,
163  * or nonfinite in-progress stages invalidate the partial record everywhere.
164  * If all ranks instead have a completed prior step and no active next step,
165  * a rejected idle call preserves that prior record. A valid new stage zero
166  * invalidates it. A rank that never enters, asynchronous Abort, or MPI
167  * process failure is outside this protection.
168  */
169  bool finish_stage (std::string& diagnostic);
170 
171  [[nodiscard]] bool is_defined () const noexcept { return m_integral.is_defined(); }
172  [[nodiscard]] bool step_active () const noexcept { return m_step_active; }
173  [[nodiscard]] bool step_complete () const noexcept { return m_step_complete; }
174  [[nodiscard]] int next_stage () const noexcept { return m_next_stage; }
175  [[nodiscard]] const IntegratedMappedFaceFlux& integrated_flux () const noexcept {
176  return m_integral;
177  }
178 
179 private:
180  void latch_stage_failure (const std::string& diagnostic);
181  void discard_step ();
182 
184  bool m_step_active{false};
185  bool m_step_complete{false};
186  bool m_stage_open{false};
188  int m_next_stage{0};
189  int m_open_stage{-1};
191  double m_step_old_time{0.0};
192  std::vector<unsigned char> m_stage_components_seen;
194 };
195 
196 } // namespace erf_auxiliary
197 
198 #endif
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_AuxiliaryStage.H:116
bool accept_stage(HostIntegrator method, int stage, double step_old_time, const AuxiliaryStageRecipe &recipe, const MappedFaceFluxRate &rate, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:297
amrex::Real m_open_stage_weight
Definition: ERF_AuxiliaryStage.H:190
bool finish_stage(std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:458
bool m_step_active
Definition: ERF_AuxiliaryStage.H:184
bool accumulate_stage_component(const MappedFaceFluxRate &rate, int source_component, int ledger_component, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:421
const IntegratedMappedFaceFlux & integrated_flux() const noexcept
Definition: ERF_AuxiliaryStage.H:175
int m_open_stage
Definition: ERF_AuxiliaryStage.H:189
std::string m_stage_failure_diagnostic
Definition: ERF_AuxiliaryStage.H:193
HostIntegrator m_method
Definition: ERF_AuxiliaryStage.H:187
std::vector< unsigned char > m_stage_components_seen
Definition: ERF_AuxiliaryStage.H:192
CompletedStepFluxLedger(const CompletedStepFluxLedger &)=delete
bool begin_stage(HostIntegrator method, int stage, double step_old_time, const AuxiliaryStageRecipe &recipe, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:330
IntegratedMappedFaceFlux m_integral
Definition: ERF_AuxiliaryStage.H:183
bool m_stage_open
Definition: ERF_AuxiliaryStage.H:186
bool m_step_complete
Definition: ERF_AuxiliaryStage.H:185
bool step_complete() const noexcept
Definition: ERF_AuxiliaryStage.H:173
void discard_step()
Definition: ERF_AuxiliaryStage.cpp:281
double m_step_old_time
Definition: ERF_AuxiliaryStage.H:191
bool step_active() const noexcept
Definition: ERF_AuxiliaryStage.H:172
void define(const amrex::BoxArray &cell_ba, const amrex::DistributionMapping &dm, int ncomp=1)
Definition: ERF_AuxiliaryStage.cpp:254
CompletedStepFluxLedger & operator=(const CompletedStepFluxLedger &)=delete
bool is_defined() const noexcept
Definition: ERF_AuxiliaryStage.H:171
void latch_stage_failure(const std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:271
int m_next_stage
Definition: ERF_AuxiliaryStage.H:188
int next_stage() const noexcept
Definition: ERF_AuxiliaryStage.H:174
bool is_defined() const noexcept
Definition: ERF_AuxiliaryMappedTransport.H:43
Definition: ERF_AuxiliaryInertTracer.cpp:15
bool AuxiliaryStageTargetIsDisjoint(const AuxiliaryStageContext &context)
Definition: ERF_AuxiliaryStage.cpp:160
void ApplyAuxiliaryMappedStage(const AuxiliaryStageContext &context, const MappedFaceFluxRate &rate, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv, const int rate_component)
Definition: ERF_AuxiliaryStage.cpp:169
AuxiliaryFieldValidationPolicy
Definition: ERF_AuxiliaryStage.H:50
HostIntegrator
Definition: ERF_AuxiliaryStage.H:11
bool MakeAuxiliaryStageRecipe(const HostIntegrator method, const int stage, const double host_stage_interval, AuxiliaryStageRecipe &recipe, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:67
LimiterTrialBase
Definition: ERF_AuxiliaryStage.H:18
const char * HostIntegratorName(const HostIntegrator method) noexcept
Definition: ERF_AuxiliaryStage.cpp:57
bool BuildAuxiliaryIntensiveState(const ConstTimedFieldView &state_input, const ConstTimedFieldView &rho_input, const double input_time, amrex::MultiFab &intensive, const AuxiliaryFieldValidationPolicy validation, std::string &diagnostic)
Definition: ERF_AuxiliaryStage.cpp:113
Definition: ERF_AuxiliaryStage.H:63
int level
Definition: ERF_AuxiliaryStage.H:65
ConstTimedFieldView rho_anchor
Definition: ERF_AuxiliaryStage.H:78
AuxiliaryStageRecipe recurrence
Definition: ERF_AuxiliaryStage.H:72
ConstTimedFieldView rho_input
Definition: ERF_AuxiliaryStage.H:79
int stage
Definition: ERF_AuxiliaryStage.H:66
ConstTimedFieldView measure_anchor
Definition: ERF_AuxiliaryStage.H:82
double input_time
Definition: ERF_AuxiliaryStage.H:69
ConstTimedFieldView measure_input
Definition: ERF_AuxiliaryStage.H:83
HostIntegrator method
Definition: ERF_AuxiliaryStage.H:64
ConstTimedFieldView state_input
Definition: ERF_AuxiliaryStage.H:75
double target_time
Definition: ERF_AuxiliaryStage.H:70
ConstTimedFieldView measure_target
Definition: ERF_AuxiliaryStage.H:84
double step_old_time
Definition: ERF_AuxiliaryStage.H:68
HostCarrierFluxView carrier
Definition: ERF_AuxiliaryStage.H:86
ConstTimedFieldView rho_target
Definition: ERF_AuxiliaryStage.H:80
MutableTimedFieldView state_target
Definition: ERF_AuxiliaryStage.H:76
ConstTimedFieldView state_anchor
Definition: ERF_AuxiliaryStage.H:74
Definition: ERF_AuxiliaryStage.H:41
double face_rate_time_coefficient
Definition: ERF_AuxiliaryStage.H:46
double anchor_weight
Definition: ERF_AuxiliaryStage.H:43
double limiter_trial_interval
Definition: ERF_AuxiliaryStage.H:45
double input_weight
Definition: ERF_AuxiliaryStage.H:44
double completed_ledger_time
Definition: ERF_AuxiliaryStage.H:47
LimiterTrialBase limiter_trial_base
Definition: ERF_AuxiliaryStage.H:42
Definition: ERF_AuxiliaryStage.H:23
double time
Definition: ERF_AuxiliaryStage.H:26
const amrex::MultiFab * field
Definition: ERF_AuxiliaryStage.H:24
int component
Definition: ERF_AuxiliaryStage.H:25
Definition: ERF_AuxiliaryStage.H:35
const amrex::MultiFab * y
Definition: ERF_AuxiliaryStage.H:37
const amrex::MultiFab * x
Definition: ERF_AuxiliaryStage.H:36
const amrex::MultiFab * z
Definition: ERF_AuxiliaryStage.H:38
Definition: ERF_AuxiliaryStage.H:29
int component
Definition: ERF_AuxiliaryStage.H:31
double time
Definition: ERF_AuxiliaryStage.H:32
amrex::MultiFab * field
Definition: ERF_AuxiliaryStage.H:30