ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_ShocTypes.H
Go to the documentation of this file.
1 #ifndef ERF_SHOC_TYPES_H_
2 #define ERF_SHOC_TYPES_H_
3 
4 #include "ERF_DataStruct.H"
5 
6 #include <AMReX_FArrayBox.H>
7 #include <AMReX_Geometry.H>
8 #include <AMReX_GpuQualifiers.H>
9 #include <AMReX_ParmParse.H>
10 #include <AMReX_Vector.H>
11 
12 #include <algorithm>
13 #include <cctype>
14 #include <string>
15 
17 {
22 
27 
34 
35  bool shoc_1p5tke = false;
36  bool extra_shoc_diags = false;
37  bool apply_tms = false;
38  bool check_flux_state = false;
40  bool debug_summary = false;
42  bool signed_tke_production = false;
45  bool debug_bad_column = false;
57 };
58 
60 {
61  int nx = 0;
62  int ny = 0;
63  int ncell = 0;
64  int nlev = 0;
65  int imin = 0;
66  int jmin = 0;
67  int kmin = 0;
68  int kmax = -1;
69 };
70 
72 {
74 
75  // Absolute physical cell-center and interface heights [m].
76  amrex::FArrayBox zt;
77  amrex::FArrayBox zi;
78  amrex::FArrayBox dz;
79  amrex::FArrayBox p_mid;
80  amrex::FArrayBox p_int;
81  amrex::FArrayBox rho;
82  amrex::FArrayBox theta;
83  amrex::FArrayBox exner;
84  amrex::FArrayBox theta_v;
85  amrex::FArrayBox thetal;
86  amrex::FArrayBox qv;
87  amrex::FArrayBox qc;
88  amrex::FArrayBox qi;
89  amrex::FArrayBox qw;
90  amrex::FArrayBox tabs;
91  amrex::FArrayBox tke;
92  amrex::FArrayBox u;
93  amrex::FArrayBox v;
94  amrex::FArrayBox w;
95  amrex::FArrayBox host_dse;
96 
97  // Native SHOC PBL height in meters above local ground (AGL).
98  amrex::FArrayBox pblh;
99  amrex::FArrayBox obklen;
100  amrex::FArrayBox ustar;
101  amrex::FArrayBox shoc_mix;
102  amrex::FArrayBox brunt;
103  amrex::FArrayBox isotropy;
104  amrex::FArrayBox tk;
105  amrex::FArrayBox tkh;
106  amrex::FArrayBox shear_prod;
107  amrex::FArrayBox buoy_prod;
108  amrex::FArrayBox diss_tke;
109  amrex::FArrayBox wthv_sec;
110  amrex::FArrayBox shoc_cldfrac;
111  amrex::FArrayBox shoc_ql;
112  amrex::FArrayBox shoc_ql2;
113  amrex::FArrayBox wqls_sec;
114  amrex::FArrayBox shoc_cond;
115  amrex::FArrayBox shoc_evap;
116 
117  amrex::FArrayBox thl_sec;
118  amrex::FArrayBox qw_sec;
119  amrex::FArrayBox qwthl_sec;
120  amrex::FArrayBox wthl_sec;
121  amrex::FArrayBox wqw_sec;
122  amrex::FArrayBox uw_sec;
123  amrex::FArrayBox vw_sec;
124  amrex::FArrayBox wtke_sec;
125  amrex::FArrayBox w3;
126  amrex::FArrayBox w_sec;
127 
128  amrex::FArrayBox thetal_base;
129  amrex::FArrayBox theta_base;
130  amrex::FArrayBox qv_base;
131  amrex::FArrayBox qc_base;
132  amrex::FArrayBox qi_base;
133  amrex::FArrayBox u_base;
134  amrex::FArrayBox v_base;
135  amrex::FArrayBox tke_base_state;
136 
137  amrex::FArrayBox theta_tend;
138  amrex::FArrayBox qv_tend;
139  amrex::FArrayBox qc_tend;
140  amrex::FArrayBox qi_tend;
141  amrex::FArrayBox u_tend;
142  amrex::FArrayBox v_tend;
143  amrex::FArrayBox tke_tend;
144  amrex::FArrayBox surf_sens_flux;
145  amrex::FArrayBox surf_lat_flux;
146  amrex::FArrayBox surf_tau_u;
147  amrex::FArrayBox surf_tau_v;
148 };
149 
150 inline void
152 {
153  amrex::ParmParse pp("erf.shoc");
154 
155  pp.query("lambda_low", opts.lambda_low);
156  pp.query("lambda_high", opts.lambda_high);
157  pp.query("lambda_slope", opts.lambda_slope);
158  pp.query("lambda_thresh", opts.lambda_thresh);
159  pp.query("thl2tune", opts.thl2tune);
160  pp.query("qw2tune", opts.qw2tune);
161  pp.query("qwthl2tune", opts.qwthl2tune);
162  pp.query("w2tune", opts.w2tune);
163  pp.query("length_fac", opts.length_fac);
164  pp.query("c_diag_3rd_mom", opts.c_diag_3rd_mom);
165  pp.query("coeff_kh", opts.coeff_kh);
166  pp.query("coeff_km", opts.coeff_km);
167  pp.query("top_taper_depth", opts.top_taper_depth);
168  pp.query("top_taper_min_factor", opts.top_taper_min_factor);
169  pp.query("shoc_1p5tke", opts.shoc_1p5tke);
170  pp.query("extra_shoc_diags", opts.extra_shoc_diags);
171  pp.query("apply_tms", opts.apply_tms);
172  pp.query("check_flux_state", opts.check_flux_state);
173  pp.query("column_conservation_check", opts.column_conservation_check);
174  pp.query("debug_summary", opts.debug_summary);
175  pp.query("allow_tendency_microphysics_overlap", opts.allow_tendency_microphysics_overlap);
176  pp.query("signed_tke_production", opts.signed_tke_production);
177  pp.query("debug_bad_column", opts.debug_bad_column);
178  pp.query("debug_bad_column_abort", opts.debug_bad_column_abort);
179  pp.query("debug_bad_column_max_reports", opts.debug_bad_column_max_reports);
180  pp.query("debug_bad_column_theta_tend_threshold", opts.debug_bad_column_theta_tend_threshold);
181  pp.query("debug_bad_column_q_tend_threshold", opts.debug_bad_column_q_tend_threshold);
182  pp.query("debug_bad_column_brunt_threshold", opts.debug_bad_column_brunt_threshold);
183  pp.query("debug_bad_column_min_dz", opts.debug_bad_column_min_dz);
184  pp.query("debug_bad_column_scalar_moment_threshold", opts.debug_bad_column_scalar_moment_threshold);
185  pp.query("debug_disable_pdf_cloud_increment", opts.debug_disable_pdf_cloud_increment);
186  pp.query("debug_disable_theta_state_update", opts.debug_disable_theta_state_update);
187  pp.query("debug_disable_moisture_state_update", opts.debug_disable_moisture_state_update);
188  pp.query("debug_disable_tke_state_update", opts.debug_disable_tke_state_update);
189 
190  // SolverChoice parses these too, since the dycore must know which component
191  // owns vertical diffusion before any SHOC driver exists. Both go through the
192  // same reader so the two views of the inputs cannot diverge.
194 }
195 
196 inline void
198 {
199  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(opts.lambda_low > 0.0, "erf.shoc.lambda_low must be positive");
201  "erf.shoc.lambda_high must be >= lambda_low");
202  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(opts.length_fac > 0.0, "erf.shoc.length_fac must be positive");
203  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(opts.coeff_kh >= 0.0, "erf.shoc.coeff_kh must be non-negative");
204  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(opts.coeff_km >= 0.0, "erf.shoc.coeff_km must be non-negative");
206  "erf.shoc.top_taper_depth must be non-negative");
208  opts.top_taper_min_factor <= 1.0,
209  "erf.shoc.top_taper_min_factor must be in [0, 1]");
211  "erf.shoc.debug_bad_column_max_reports must be positive");
213  "erf.shoc.debug_bad_column_theta_tend_threshold must be positive");
215  "erf.shoc.debug_bad_column_q_tend_threshold must be positive");
217  "erf.shoc.debug_bad_column_brunt_threshold must be positive");
219  "erf.shoc.debug_bad_column_min_dz must be positive");
221  "erf.shoc.debug_bad_column_scalar_moment_threshold must be positive");
222 }
223 
224 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
225 bool
226 shoc_valid_comp (int comp, int ncomp)
227 {
228  return comp >= 0 && comp < ncomp;
229 }
230 
231 template <typename T>
232 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
233 T
234 shoc_clamp (T value, T lo, T hi)
235 {
236  return amrex::max(lo, amrex::min(value, hi));
237 }
238 
239 #endif
ParmParse pp("prob")
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
amrex::Real Real
Definition: ERF_ShocInterface.H:19
ShocMomentumTransport
Definition: ERF_ShocTransportStruct.H:16
void read_shoc_transport_modes(ShocTransportMode &transport_mode, ShocMomentumTransport &momentum_transport)
Read the native SHOC transport modes from the erf.shoc input namespace.
Definition: ERF_ShocTransportStruct.H:118
ShocTransportMode
Definition: ERF_ShocTransportStruct.H:11
void validate_shoc_runtime_options(const ShocRuntimeOptions &opts)
Definition: ERF_ShocTypes.H:197
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool shoc_valid_comp(int comp, int ncomp)
Definition: ERF_ShocTypes.H:226
void read_shoc_runtime_options(ShocRuntimeOptions &opts)
Definition: ERF_ShocTypes.H:151
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T shoc_clamp(T value, T lo, T hi)
Definition: ERF_ShocTypes.H:234
@ T
Definition: ERF_IndexDefines.H:128
Definition: ERF_ShocTypes.H:72
amrex::FArrayBox theta_v
Definition: ERF_ShocTypes.H:84
amrex::FArrayBox theta
Definition: ERF_ShocTypes.H:82
amrex::FArrayBox qc_tend
Definition: ERF_ShocTypes.H:139
amrex::FArrayBox theta_base
Definition: ERF_ShocTypes.H:129
amrex::FArrayBox v_tend
Definition: ERF_ShocTypes.H:142
amrex::FArrayBox shoc_cond
Definition: ERF_ShocTypes.H:114
amrex::FArrayBox qi
Definition: ERF_ShocTypes.H:88
amrex::FArrayBox buoy_prod
Definition: ERF_ShocTypes.H:107
amrex::FArrayBox dz
Definition: ERF_ShocTypes.H:78
amrex::FArrayBox diss_tke
Definition: ERF_ShocTypes.H:108
amrex::FArrayBox w_sec
Definition: ERF_ShocTypes.H:126
amrex::FArrayBox tk
Definition: ERF_ShocTypes.H:104
amrex::FArrayBox w3
Definition: ERF_ShocTypes.H:125
amrex::FArrayBox vw_sec
Definition: ERF_ShocTypes.H:123
amrex::FArrayBox surf_lat_flux
Definition: ERF_ShocTypes.H:145
amrex::FArrayBox ustar
Definition: ERF_ShocTypes.H:100
amrex::FArrayBox shoc_evap
Definition: ERF_ShocTypes.H:115
amrex::FArrayBox shoc_mix
Definition: ERF_ShocTypes.H:101
amrex::FArrayBox v_base
Definition: ERF_ShocTypes.H:134
amrex::FArrayBox wthv_sec
Definition: ERF_ShocTypes.H:109
amrex::FArrayBox shear_prod
Definition: ERF_ShocTypes.H:106
amrex::FArrayBox rho
Definition: ERF_ShocTypes.H:81
amrex::FArrayBox tke_base_state
Definition: ERF_ShocTypes.H:135
amrex::FArrayBox wqw_sec
Definition: ERF_ShocTypes.H:121
amrex::FArrayBox qv_base
Definition: ERF_ShocTypes.H:130
amrex::FArrayBox shoc_ql
Definition: ERF_ShocTypes.H:111
amrex::FArrayBox uw_sec
Definition: ERF_ShocTypes.H:122
amrex::FArrayBox w
Definition: ERF_ShocTypes.H:94
amrex::FArrayBox host_dse
Definition: ERF_ShocTypes.H:95
amrex::FArrayBox pblh
Definition: ERF_ShocTypes.H:98
amrex::FArrayBox qc
Definition: ERF_ShocTypes.H:87
amrex::FArrayBox surf_tau_v
Definition: ERF_ShocTypes.H:147
amrex::FArrayBox isotropy
Definition: ERF_ShocTypes.H:103
amrex::FArrayBox tke
Definition: ERF_ShocTypes.H:91
amrex::FArrayBox p_int
Definition: ERF_ShocTypes.H:80
amrex::FArrayBox qw_sec
Definition: ERF_ShocTypes.H:118
amrex::FArrayBox qi_base
Definition: ERF_ShocTypes.H:132
amrex::FArrayBox tkh
Definition: ERF_ShocTypes.H:105
amrex::FArrayBox exner
Definition: ERF_ShocTypes.H:83
amrex::FArrayBox u_base
Definition: ERF_ShocTypes.H:133
amrex::FArrayBox tke_tend
Definition: ERF_ShocTypes.H:143
amrex::FArrayBox qi_tend
Definition: ERF_ShocTypes.H:140
amrex::FArrayBox qc_base
Definition: ERF_ShocTypes.H:131
amrex::FArrayBox u_tend
Definition: ERF_ShocTypes.H:141
ShocColumnLayout layout
Definition: ERF_ShocTypes.H:73
amrex::FArrayBox zi
Definition: ERF_ShocTypes.H:77
amrex::FArrayBox tabs
Definition: ERF_ShocTypes.H:90
amrex::FArrayBox surf_sens_flux
Definition: ERF_ShocTypes.H:144
amrex::FArrayBox qw
Definition: ERF_ShocTypes.H:89
amrex::FArrayBox v
Definition: ERF_ShocTypes.H:93
amrex::FArrayBox zt
Definition: ERF_ShocTypes.H:76
amrex::FArrayBox qv
Definition: ERF_ShocTypes.H:86
amrex::FArrayBox p_mid
Definition: ERF_ShocTypes.H:79
amrex::FArrayBox wtke_sec
Definition: ERF_ShocTypes.H:124
amrex::FArrayBox u
Definition: ERF_ShocTypes.H:92
amrex::FArrayBox theta_tend
Definition: ERF_ShocTypes.H:137
amrex::FArrayBox obklen
Definition: ERF_ShocTypes.H:99
amrex::FArrayBox wqls_sec
Definition: ERF_ShocTypes.H:113
amrex::FArrayBox surf_tau_u
Definition: ERF_ShocTypes.H:146
amrex::FArrayBox qv_tend
Definition: ERF_ShocTypes.H:138
amrex::FArrayBox wthl_sec
Definition: ERF_ShocTypes.H:120
amrex::FArrayBox thl_sec
Definition: ERF_ShocTypes.H:117
amrex::FArrayBox shoc_ql2
Definition: ERF_ShocTypes.H:112
amrex::FArrayBox thetal_base
Definition: ERF_ShocTypes.H:128
amrex::FArrayBox qwthl_sec
Definition: ERF_ShocTypes.H:119
amrex::FArrayBox brunt
Definition: ERF_ShocTypes.H:102
amrex::FArrayBox shoc_cldfrac
Definition: ERF_ShocTypes.H:110
amrex::FArrayBox thetal
Definition: ERF_ShocTypes.H:85
Definition: ERF_ShocTypes.H:60
int imin
Definition: ERF_ShocTypes.H:65
int nlev
Definition: ERF_ShocTypes.H:64
int kmax
Definition: ERF_ShocTypes.H:68
int ncell
Definition: ERF_ShocTypes.H:63
int jmin
Definition: ERF_ShocTypes.H:66
int ny
Definition: ERF_ShocTypes.H:62
int nx
Definition: ERF_ShocTypes.H:61
int kmin
Definition: ERF_ShocTypes.H:67
Definition: ERF_ShocTypes.H:17
int debug_bad_column_max_reports
Definition: ERF_ShocTypes.H:47
ShocTransportMode transport_mode
Definition: ERF_ShocTypes.H:43
bool debug_disable_moisture_state_update
Definition: ERF_ShocTypes.H:55
bool shoc_1p5tke
Definition: ERF_ShocTypes.H:35
amrex::Real debug_bad_column_q_tend_threshold
Definition: ERF_ShocTypes.H:49
amrex::Real coeff_kh
Definition: ERF_ShocTypes.H:30
amrex::Real top_taper_depth
Definition: ERF_ShocTypes.H:32
amrex::Real debug_bad_column_scalar_moment_threshold
Definition: ERF_ShocTypes.H:52
amrex::Real lambda_high
Definition: ERF_ShocTypes.H:19
amrex::Real w2tune
Definition: ERF_ShocTypes.H:26
amrex::Real debug_bad_column_min_dz
Definition: ERF_ShocTypes.H:51
amrex::Real qwthl2tune
Definition: ERF_ShocTypes.H:25
bool debug_disable_pdf_cloud_increment
Definition: ERF_ShocTypes.H:53
amrex::Real c_diag_3rd_mom
Definition: ERF_ShocTypes.H:29
ShocMomentumTransport momentum_transport
Definition: ERF_ShocTypes.H:44
bool column_conservation_check
Definition: ERF_ShocTypes.H:39
amrex::Real lambda_thresh
Definition: ERF_ShocTypes.H:21
bool extra_shoc_diags
Definition: ERF_ShocTypes.H:36
amrex::Real coeff_km
Definition: ERF_ShocTypes.H:31
bool debug_disable_theta_state_update
Definition: ERF_ShocTypes.H:54
amrex::Real debug_bad_column_theta_tend_threshold
Definition: ERF_ShocTypes.H:48
amrex::Real lambda_slope
Definition: ERF_ShocTypes.H:20
amrex::Real lambda_low
Definition: ERF_ShocTypes.H:18
bool debug_bad_column
Definition: ERF_ShocTypes.H:45
bool signed_tke_production
Definition: ERF_ShocTypes.H:42
amrex::Real debug_bad_column_brunt_threshold
Definition: ERF_ShocTypes.H:50
bool debug_disable_tke_state_update
Definition: ERF_ShocTypes.H:56
bool apply_tms
Definition: ERF_ShocTypes.H:37
bool debug_bad_column_abort
Definition: ERF_ShocTypes.H:46
bool allow_tendency_microphysics_overlap
Definition: ERF_ShocTypes.H:41
bool check_flux_state
Definition: ERF_ShocTypes.H:38
amrex::Real length_fac
Definition: ERF_ShocTypes.H:28
amrex::Real top_taper_min_factor
Definition: ERF_ShocTypes.H:33
amrex::Real thl2tune
Definition: ERF_ShocTypes.H:23
amrex::Real qw2tune
Definition: ERF_ShocTypes.H:24
bool debug_summary
Definition: ERF_ShocTypes.H:40