ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_ShocDriver.H
Go to the documentation of this file.
1 #ifndef ERF_SHOC_DRIVER_H_
2 #define ERF_SHOC_DRIVER_H_
3 
4 #include "ERF_ShocDiagnostics.H"
5 #include "ERF_ShocTypes.H"
6 #include "ERF_ShocPreprocess.H"
7 #include "ERF_ShocColumnData.H"
8 
9 #include <AMReX_BoxArray.H>
10 #include <AMReX_Geometry.H>
11 #include <AMReX_MultiFab.H>
12 
13 #include <memory>
14 
15 bool shoc_boxarray_spans_full_height (const amrex::BoxArray& ba,
16  const amrex::Box& domain);
17 
18 void shoc_fill_physical_boundary_ghosts (amrex::MultiFab& mf,
19  const amrex::Geometry& geom,
20  int comp,
21  int ncomp);
22 
23 inline bool
25  int ncomp) noexcept
26 {
27  return shoc_valid_comp(indices.nc, ncomp) || shoc_valid_comp(indices.ni, ncomp);
28 }
29 
30 inline bool
32  MoistureType moisture_type,
33  std::string& error_message)
34 {
35  if (!shoc_uses_host_diffusion(opts.transport_mode) || moisture_type == MoistureType::None) {
36  return true;
37  }
38 
39  error_message =
40  "Native SHOC host_diffusion with moisture is not yet supported because SHOC does not own cloud macrophysics in this mode while SHOC-family microphysics condensation is suppressed. Use state_update for moist SHOC runs, or run host_diffusion only for dry cases until a transport-aware microphysics ownership predicate is implemented.";
41  return false;
42 }
43 
44 inline bool
46  const MoistureComponentIndices& indices,
47  int ncomp,
48  std::string& error_message)
49 {
51  !shoc_layout_requires_number_closure(indices, ncomp)) {
52  return true;
53  }
54 
55  error_message =
56  "Native SHOC state_update does not yet support number-aware microphysics layouts with cloud/ice number concentrations. A number closure is required before SHOC can update cloud mass in these layouts.";
57  return false;
58 }
59 
61 {
62 public:
63  explicit ShocDriver (int lev, const SolverChoice& solver_choice);
64 
65  void advance (amrex::MultiFab& cons,
66  amrex::MultiFab& xvel,
67  amrex::MultiFab& yvel,
68  amrex::MultiFab& zvel,
69  amrex::MultiFab* tau13,
70  amrex::MultiFab* tau23,
71  amrex::MultiFab* hfx3,
72  amrex::MultiFab* qfx3,
73  amrex::MultiFab* eddy_diffs,
74  amrex::MultiFab& z_phys_nd,
75  const amrex::Geometry& geom,
76  double dt);
77 
78  void set_eddy_diffs () const;
79  void set_diff_stresses () const;
80  void add_fast_tend (amrex::Vector<amrex::MultiFab>& S_rhs) const;
81  void add_slow_tend (const amrex::MFIter& mfi,
82  const amrex::Box& tbx,
83  const amrex::Array4<amrex::Real>& cell_rhs) const;
84  bool uses_state_update () const;
85  bool uses_host_diffusion () const;
86  bool uses_momentum_state_update () const;
87  bool uses_momentum_host_diffusion () const;
88  bool disables_momentum_transport () const;
89  bool owns_scalar_surface_fluxes () const;
90  bool owns_momentum_surface_stresses () const;
92  bool owns_surface_fluxes () const;
93  bool debug_summary_enabled () const { return m_opts.debug_summary; }
94  bool has_native_diagnostics () const { return m_eddy_coeffs_cc.isDefined(); }
96  {
97  return m_consumed_sens_flux_cc.isDefined() && m_consumed_laten_flux_cc.isDefined();
98  }
99  const amrex::MultiFab& native_diagnostics () const { return m_eddy_coeffs_cc; }
100  // Native SHOC pblh is diagnosed in meters above local ground (AGL).
101  const amrex::MultiFab& pblh_diagnostics () const { return m_pblh_cc; }
102  // Diagnostic-only provenance of the scalar fluxes consumed by native SHOC.
103  const amrex::MultiFab& consumed_sens_flux_diagnostics () const
104  {
106  }
107  const amrex::MultiFab& consumed_laten_flux_diagnostics () const
108  {
110  }
111  const amrex::MultiFab& shoc_ustar_diagnostics () const { return m_shoc_ustar_cc; }
112  const amrex::MultiFab& shoc_olen_diagnostics () const { return m_shoc_olen_cc; }
113  const amrex::MultiFab& shoc_cldfrac_diagnostics () const { return m_shoc_cldfrac_cc; }
114  const amrex::MultiFab& shoc_ql_diagnostics () const { return m_shoc_ql_cc; }
115  const amrex::MultiFab& shoc_ql2_diagnostics () const { return m_shoc_ql2_cc; }
116  const amrex::MultiFab& shoc_cond_diagnostics () const { return m_shoc_cond_cc; }
117  const amrex::MultiFab& w_sec_diagnostics () const { return m_w_sec_cc; }
118  const amrex::MultiFab& wqls_sec_diagnostics () const { return m_wqls_sec_cc; }
119  const amrex::MultiFab& wthv_sec_diagnostics () const { return m_wthv_sec_cc; }
120  const amrex::MultiFab& thl_sec_diagnostics () const { return m_thl_sec_cc; }
121  const amrex::MultiFab& qw_sec_diagnostics () const { return m_qw_sec_cc; }
122  const amrex::MultiFab& qwthl_sec_diagnostics () const { return m_qwthl_sec_cc; }
123  const amrex::MultiFab& wthl_sec_diagnostics () const { return m_wthl_sec_cc; }
124  const amrex::MultiFab& wqw_sec_diagnostics () const { return m_wqw_sec_cc; }
125  const amrex::MultiFab& w3_diagnostics () const { return m_w3_cc; }
126  const amrex::MultiFab& brunt_diagnostics () const { return m_brunt_cc; }
127  const amrex::MultiFab& isotropy_diagnostics () const { return m_isotropy_cc; }
128  const amrex::MultiFab& shear_prod_diagnostics () const { return m_shear_prod_cc; }
129  const amrex::MultiFab& buoy_prod_diagnostics () const { return m_buoy_prod_cc; }
130  const amrex::MultiFab& diss_tke_diagnostics () const { return m_diss_tke_cc; }
131 
132 private:
133  int m_lev;
135  MoistureType m_moisture_type;
137 
138  amrex::MultiFab m_theta_tend_cc;
139  amrex::MultiFab m_qv_tend_cc;
140  amrex::MultiFab m_qc_tend_cc;
141  amrex::MultiFab m_qi_tend_cc;
142  amrex::MultiFab m_tke_tend_cc;
143  amrex::MultiFab m_u_tend_cc;
144  amrex::MultiFab m_v_tend_cc;
145  amrex::MultiFab m_u_tend_fc;
146  amrex::MultiFab m_v_tend_fc;
147  amrex::MultiFab m_eddy_coeffs_cc;
148  amrex::MultiFab m_prev_turb_cc;
149  amrex::MultiFab m_prev_wthv_sec_cc;
150  amrex::MultiFab m_consumed_sens_flux_cc;
151  amrex::MultiFab m_consumed_laten_flux_cc;
152  amrex::MultiFab m_pblh_cc;
153  amrex::MultiFab m_shoc_ustar_cc;
154  amrex::MultiFab m_shoc_olen_cc;
155  amrex::MultiFab m_shoc_cldfrac_cc;
156  amrex::MultiFab m_shoc_ql_cc;
157  amrex::MultiFab m_shoc_ql2_cc;
158  amrex::MultiFab m_shoc_cond_cc;
159  amrex::MultiFab m_w_sec_cc;
160  amrex::MultiFab m_wqls_sec_cc;
161  amrex::MultiFab m_wthv_sec_cc;
162  amrex::MultiFab m_thl_sec_cc;
163  amrex::MultiFab m_qw_sec_cc;
164  amrex::MultiFab m_qwthl_sec_cc;
165  amrex::MultiFab m_wthl_sec_cc;
166  amrex::MultiFab m_wqw_sec_cc;
167  amrex::MultiFab m_w3_cc;
168  amrex::MultiFab m_brunt_cc;
169  amrex::MultiFab m_isotropy_cc;
170  amrex::MultiFab m_shear_prod_cc;
171  amrex::MultiFab m_buoy_prod_cc;
172  amrex::MultiFab m_diss_tke_cc;
173  amrex::MultiFab* m_cons_ptr = nullptr;
174  amrex::MultiFab* m_hfx3_ptr = nullptr;
175  amrex::MultiFab* m_qfx3_ptr = nullptr;
176  amrex::MultiFab* m_tau13_ptr = nullptr;
177  amrex::MultiFab* m_tau23_ptr = nullptr;
178  amrex::MultiFab* m_eddy_diffs_ptr = nullptr;
179  amrex::Vector<std::unique_ptr<ShocColumnWorkspace>> m_column_workspaces;
180  const amrex::Geometry* m_geom_ptr = nullptr;
182  bool m_prev_turb_valid = false;
183 
184  void ensure_storage (const amrex::MultiFab& cons,
185  const amrex::MultiFab& xvel,
186  const amrex::MultiFab& yvel,
187  const amrex::MultiFab& eddy_diffs);
189  const amrex::MFIter& mfi,
190  const amrex::MultiFab& cons,
191  const amrex::MultiFab& eddy_diffs) const;
192  void store_carried_turbulence (const ShocColumnData& col,
193  const amrex::MFIter& mfi);
195  const amrex::MFIter& mfi) const;
197  const amrex::MFIter& mfi);
198  void apply_state_update (amrex::MultiFab& cons,
199  amrex::MultiFab& xvel,
200  amrex::MultiFab& yvel,
201  double dt) const;
202  void debug_check_bad_column (const ShocColumnData& col,
203  const amrex::MFIter& mfi,
204  const amrex::MultiFab& z_phys_nd,
205  const amrex::MultiFab* hfx3,
206  const amrex::MultiFab* qfx3,
207  const amrex::MultiFab* tau13,
208  const amrex::MultiFab* tau23,
209  const amrex::Geometry& geom,
210  double dt) const;
211  void print_debug_summary (double dt) const;
212 };
213 #endif
@ tau23
Definition: ERF_DataStruct.H:38
@ tau13
Definition: ERF_DataStruct.H:38
bool shoc_boxarray_spans_full_height(const amrex::BoxArray &ba, const amrex::Box &domain)
bool shoc_driver_host_diffusion_moisture_supported(const ShocRuntimeOptions &opts, MoistureType moisture_type, std::string &error_message)
Definition: ERF_ShocDriver.H:31
bool shoc_layout_requires_number_closure(const MoistureComponentIndices &indices, int ncomp) noexcept
Definition: ERF_ShocDriver.H:24
void shoc_fill_physical_boundary_ghosts(amrex::MultiFab &mf, const amrex::Geometry &geom, int comp, int ncomp)
bool shoc_driver_state_update_layout_supported(const ShocRuntimeOptions &opts, const MoistureComponentIndices &indices, int ncomp, std::string &error_message)
Definition: ERF_ShocDriver.H:45
bool shoc_uses_host_diffusion(ShocTransportMode mode)
Definition: ERF_ShocTypes.H:57
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool shoc_valid_comp(int comp, int ncomp)
Definition: ERF_ShocTypes.H:374
bool shoc_uses_state_update(ShocTransportMode mode)
Definition: ERF_ShocTypes.H:51
Definition: ERF_ShocDriver.H:61
amrex::MultiFab * m_cons_ptr
Definition: ERF_ShocDriver.H:173
amrex::MultiFab m_shoc_ql_cc
Definition: ERF_ShocDriver.H:156
const amrex::MultiFab & shoc_ql2_diagnostics() const
Definition: ERF_ShocDriver.H:115
void print_debug_summary(double dt) const
Definition: ERF_ShocDriver.cpp:1544
bool has_consumed_surface_flux_diagnostics() const
Definition: ERF_ShocDriver.H:95
ShocRuntimeOptions m_opts
Definition: ERF_ShocDriver.H:134
bool m_prev_turb_valid
Definition: ERF_ShocDriver.H:182
const amrex::MultiFab & w3_diagnostics() const
Definition: ERF_ShocDriver.H:125
void advance(amrex::MultiFab &cons, amrex::MultiFab &xvel, amrex::MultiFab &yvel, amrex::MultiFab &zvel, amrex::MultiFab *tau13, amrex::MultiFab *tau23, amrex::MultiFab *hfx3, amrex::MultiFab *qfx3, amrex::MultiFab *eddy_diffs, amrex::MultiFab &z_phys_nd, const amrex::Geometry &geom, double dt)
Definition: ERF_ShocDriver.cpp:519
void debug_check_bad_column(const ShocColumnData &col, const amrex::MFIter &mfi, const amrex::MultiFab &z_phys_nd, const amrex::MultiFab *hfx3, const amrex::MultiFab *qfx3, const amrex::MultiFab *tau13, const amrex::MultiFab *tau23, const amrex::Geometry &geom, double dt) const
Definition: ERF_ShocDriver.cpp:1010
bool uses_momentum_host_diffusion() const
Definition: ERF_ShocDriver.cpp:948
amrex::MultiFab m_qw_sec_cc
Definition: ERF_ShocDriver.H:163
amrex::MultiFab m_diss_tke_cc
Definition: ERF_ShocDriver.H:172
amrex::MultiFab m_qwthl_sec_cc
Definition: ERF_ShocDriver.H:164
bool uses_host_diffusion() const
Definition: ERF_ShocDriver.cpp:930
void set_diff_stresses() const
Definition: ERF_ShocDriver.cpp:872
const amrex::MultiFab & consumed_laten_flux_diagnostics() const
Definition: ERF_ShocDriver.H:107
const amrex::MultiFab & shoc_ql_diagnostics() const
Definition: ERF_ShocDriver.H:114
const amrex::MultiFab & shoc_cond_diagnostics() const
Definition: ERF_ShocDriver.H:116
amrex::MultiFab * m_qfx3_ptr
Definition: ERF_ShocDriver.H:175
int m_advance_calls
Definition: ERF_ShocDriver.H:181
void apply_state_update(amrex::MultiFab &cons, amrex::MultiFab &xvel, amrex::MultiFab &yvel, double dt) const
Definition: ERF_ShocDriver.cpp:984
const amrex::MultiFab & qw_sec_diagnostics() const
Definition: ERF_ShocDriver.H:121
amrex::MultiFab m_pblh_cc
Definition: ERF_ShocDriver.H:152
amrex::MultiFab m_eddy_coeffs_cc
Definition: ERF_ShocDriver.H:147
const amrex::Geometry * m_geom_ptr
Definition: ERF_ShocDriver.H:180
const amrex::MultiFab & diss_tke_diagnostics() const
Definition: ERF_ShocDriver.H:130
const amrex::MultiFab & brunt_diagnostics() const
Definition: ERF_ShocDriver.H:126
amrex::MultiFab m_buoy_prod_cc
Definition: ERF_ShocDriver.H:171
amrex::MultiFab m_wthl_sec_cc
Definition: ERF_ShocDriver.H:165
amrex::MultiFab m_prev_wthv_sec_cc
Definition: ERF_ShocDriver.H:149
amrex::MultiFab m_u_tend_fc
Definition: ERF_ShocDriver.H:145
const amrex::MultiFab & shoc_cldfrac_diagnostics() const
Definition: ERF_ShocDriver.H:113
const amrex::MultiFab & shear_prod_diagnostics() const
Definition: ERF_ShocDriver.H:128
bool owns_scalar_surface_fluxes() const
Definition: ERF_ShocDriver.cpp:960
amrex::MultiFab m_wqls_sec_cc
Definition: ERF_ShocDriver.H:160
amrex::MultiFab * m_tau13_ptr
Definition: ERF_ShocDriver.H:176
bool has_native_diagnostics() const
Definition: ERF_ShocDriver.H:94
bool needs_host_surface_momentum_stresses() const
Definition: ERF_ShocDriver.cpp:972
const amrex::MultiFab & wthl_sec_diagnostics() const
Definition: ERF_ShocDriver.H:123
void add_fast_tend(amrex::Vector< amrex::MultiFab > &S_rhs) const
Definition: ERF_ShocDriver.cpp:913
amrex::MultiFab m_v_tend_fc
Definition: ERF_ShocDriver.H:146
void seed_carried_buoyancy_flux(ShocColumnData &col, const amrex::MFIter &mfi) const
Definition: ERF_ShocDriver.cpp:491
amrex::MultiFab m_w3_cc
Definition: ERF_ShocDriver.H:167
const amrex::MultiFab & shoc_olen_diagnostics() const
Definition: ERF_ShocDriver.H:112
bool owns_surface_fluxes() const
Definition: ERF_ShocDriver.cpp:978
const amrex::MultiFab & isotropy_diagnostics() const
Definition: ERF_ShocDriver.H:127
amrex::MultiFab m_shoc_ustar_cc
Definition: ERF_ShocDriver.H:153
void seed_carried_turbulence(ShocColumnData &col, const amrex::MFIter &mfi, const amrex::MultiFab &cons, const amrex::MultiFab &eddy_diffs) const
Definition: ERF_ShocDriver.cpp:459
amrex::MultiFab m_theta_tend_cc
Definition: ERF_ShocDriver.H:138
amrex::MultiFab m_qc_tend_cc
Definition: ERF_ShocDriver.H:140
const amrex::MultiFab & shoc_ustar_diagnostics() const
Definition: ERF_ShocDriver.H:111
ShocDriver(int lev, const SolverChoice &solver_choice)
Definition: ERF_ShocDriver.cpp:346
const amrex::MultiFab & consumed_sens_flux_diagnostics() const
Definition: ERF_ShocDriver.H:103
amrex::MultiFab m_wqw_sec_cc
Definition: ERF_ShocDriver.H:166
const amrex::MultiFab & w_sec_diagnostics() const
Definition: ERF_ShocDriver.H:117
const amrex::MultiFab & wqw_sec_diagnostics() const
Definition: ERF_ShocDriver.H:124
amrex::MultiFab m_shoc_olen_cc
Definition: ERF_ShocDriver.H:154
bool disables_momentum_transport() const
Definition: ERF_ShocDriver.cpp:954
amrex::MultiFab m_prev_turb_cc
Definition: ERF_ShocDriver.H:148
bool debug_summary_enabled() const
Definition: ERF_ShocDriver.H:93
amrex::MultiFab m_consumed_laten_flux_cc
Definition: ERF_ShocDriver.H:151
amrex::MultiFab m_brunt_cc
Definition: ERF_ShocDriver.H:168
amrex::MultiFab m_wthv_sec_cc
Definition: ERF_ShocDriver.H:161
amrex::MultiFab m_shear_prod_cc
Definition: ERF_ShocDriver.H:170
amrex::MultiFab m_w_sec_cc
Definition: ERF_ShocDriver.H:159
void store_carried_buoyancy_flux(const ShocColumnData &col, const amrex::MFIter &mfi)
Definition: ERF_ShocDriver.cpp:507
const amrex::MultiFab & qwthl_sec_diagnostics() const
Definition: ERF_ShocDriver.H:122
void store_carried_turbulence(const ShocColumnData &col, const amrex::MFIter &mfi)
Definition: ERF_ShocDriver.cpp:478
bool uses_state_update() const
Definition: ERF_ShocDriver.cpp:936
void ensure_storage(const amrex::MultiFab &cons, const amrex::MultiFab &xvel, const amrex::MultiFab &yvel, const amrex::MultiFab &eddy_diffs)
Definition: ERF_ShocDriver.cpp:362
bool uses_momentum_state_update() const
Definition: ERF_ShocDriver.cpp:942
MoistureComponentIndices m_moisture_indices
Definition: ERF_ShocDriver.H:136
amrex::MultiFab m_shoc_cldfrac_cc
Definition: ERF_ShocDriver.H:155
amrex::MultiFab m_tke_tend_cc
Definition: ERF_ShocDriver.H:142
amrex::MultiFab m_qi_tend_cc
Definition: ERF_ShocDriver.H:141
void set_eddy_diffs() const
Definition: ERF_ShocDriver.cpp:839
amrex::MultiFab m_thl_sec_cc
Definition: ERF_ShocDriver.H:162
bool owns_momentum_surface_stresses() const
Definition: ERF_ShocDriver.cpp:966
const amrex::MultiFab & wqls_sec_diagnostics() const
Definition: ERF_ShocDriver.H:118
amrex::MultiFab * m_tau23_ptr
Definition: ERF_ShocDriver.H:177
const amrex::MultiFab & native_diagnostics() const
Definition: ERF_ShocDriver.H:99
const amrex::MultiFab & thl_sec_diagnostics() const
Definition: ERF_ShocDriver.H:120
int m_lev
Definition: ERF_ShocDriver.H:133
amrex::MultiFab * m_eddy_diffs_ptr
Definition: ERF_ShocDriver.H:178
amrex::MultiFab m_consumed_sens_flux_cc
Definition: ERF_ShocDriver.H:150
const amrex::MultiFab & pblh_diagnostics() const
Definition: ERF_ShocDriver.H:101
amrex::MultiFab m_isotropy_cc
Definition: ERF_ShocDriver.H:169
const amrex::MultiFab & wthv_sec_diagnostics() const
Definition: ERF_ShocDriver.H:119
MoistureType m_moisture_type
Definition: ERF_ShocDriver.H:135
amrex::MultiFab m_u_tend_cc
Definition: ERF_ShocDriver.H:143
amrex::MultiFab m_v_tend_cc
Definition: ERF_ShocDriver.H:144
const amrex::MultiFab & buoy_prod_diagnostics() const
Definition: ERF_ShocDriver.H:129
void add_slow_tend(const amrex::MFIter &mfi, const amrex::Box &tbx, const amrex::Array4< amrex::Real > &cell_rhs) const
Definition: ERF_ShocDriver.cpp:921
amrex::MultiFab m_shoc_ql2_cc
Definition: ERF_ShocDriver.H:157
amrex::MultiFab m_shoc_cond_cc
Definition: ERF_ShocDriver.H:158
amrex::MultiFab m_qv_tend_cc
Definition: ERF_ShocDriver.H:139
amrex::MultiFab * m_hfx3_ptr
Definition: ERF_ShocDriver.H:174
amrex::Vector< std::unique_ptr< ShocColumnWorkspace > > m_column_workspaces
Definition: ERF_ShocDriver.H:179
@ xvel
Definition: ERF_IndexDefines.H:177
@ cons
Definition: ERF_IndexDefines.H:176
@ zvel
Definition: ERF_IndexDefines.H:179
@ yvel
Definition: ERF_IndexDefines.H:178
Component indices for moisture species in the conserved state.
Definition: ERF_DataStruct.H:166
Definition: ERF_ShocTypes.H:204
Definition: ERF_ShocTypes.H:81
ShocTransportMode transport_mode
Definition: ERF_ShocTypes.H:107
bool debug_summary
Definition: ERF_ShocTypes.H:104
Definition: ERF_DataStruct.H:241