1 #ifndef ERF_ADV_STRUCT_H_
2 #define ERF_ADV_STRUCT_H_
7 #include <AMReX_ParmParse.H>
8 #include <AMReX_Print.H>
10 #include <AMReX_Geometry.H>
27 amrex::ParmParse
pp(pp_prefix);
31 std::string dycore_horiz_adv_string =
"" ; std::string dycore_vert_adv_string =
"";
32 std::string dryscal_horiz_adv_string =
"" ; std::string dryscal_vert_adv_string =
"";
33 pp.queryAdd(
"dycore_horiz_adv_type" , dycore_horiz_adv_string);
34 pp.queryAdd(
"dycore_vert_adv_type" , dycore_vert_adv_string);
35 pp.queryAdd(
"dryscal_horiz_adv_type" , dryscal_horiz_adv_string);
36 pp.queryAdd(
"dryscal_vert_adv_type" , dryscal_vert_adv_string);
38 std::string moistscal_horiz_adv_string =
""; std::string moistscal_vert_adv_string =
"";
39 pp.queryAdd(
"moistscal_horiz_adv_type", moistscal_horiz_adv_string);
40 pp.queryAdd(
"moistscal_vert_adv_type" , moistscal_vert_adv_string);
43 amrex::Print() <<
"Using efficient advection scheme" << std::endl;
46 if ( (dycore_horiz_adv_string ==
"Blended_3rd4th") ||
47 (dycore_horiz_adv_string ==
"Blended_5th6th") )
51 "The dycore horizontal upwinding fraction must be between 0 and 1");
54 if ( (dycore_vert_adv_string ==
"Blended_3rd4th") ||
55 (dycore_vert_adv_string ==
"Blended_5th6th") )
59 "The dycore vertical upwinding fraction must be between 0 and 1");
62 if ( (dryscal_horiz_adv_string ==
"Blended_3rd4th") ||
63 (dryscal_horiz_adv_string ==
"Blended_5th6th") )
67 "The dry scalar horizontal upwinding fraction must be between 0 and 1");
70 if ( (dryscal_vert_adv_string ==
"Blended_3rd4th") ||
71 (dryscal_vert_adv_string ==
"Blended_5th6th") )
75 "The dry scalar vertical upwinding fraction must be between 0 and 1");
78 if ( (moistscal_horiz_adv_string ==
"Blended_3rd4th") ||
79 (moistscal_horiz_adv_string ==
"Blended_5th6th") )
83 "The moist scalar horizontal upwinding fraction must be between 0 and 1");
86 if ( (moistscal_vert_adv_string ==
"Blended_3rd4th") ||
87 (moistscal_vert_adv_string ==
"Blended_5th6th") )
91 "The moist scalar vertical upwinding fraction must be between 0 and 1");
94 if (dycore_horiz_adv_string !=
"") {
95 if ( (dycore_horiz_adv_string ==
"Centered_2nd") ||
96 (dycore_horiz_adv_string ==
"Upwind_3rd" ) ||
97 (dycore_horiz_adv_string ==
"Blended_3rd4th") ||
98 (dycore_horiz_adv_string ==
"Centered_4th") ||
99 (dycore_horiz_adv_string ==
"Upwind_5th" ) ||
100 (dycore_horiz_adv_string ==
"Blended_5th6th") ||
101 (dycore_horiz_adv_string ==
"Centered_6th") ||
102 (dycore_horiz_adv_string ==
"WENO3" ) ||
103 (dycore_horiz_adv_string ==
"WENOZ3" ) ||
104 (dycore_horiz_adv_string ==
"WENOMZQ3" ) ||
105 (dycore_horiz_adv_string ==
"WENO5" ) ||
106 (dycore_horiz_adv_string ==
"WENOZ5" ) ||
107 (dycore_horiz_adv_string ==
"WENO7" ) ||
108 (dycore_horiz_adv_string ==
"WENOZ7" ))
112 amrex::Error(
"Don't know this dycore_horiz_adv_string");
116 if (dycore_vert_adv_string !=
"") {
117 if ( (dycore_vert_adv_string ==
"Centered_2nd") ||
118 (dycore_vert_adv_string ==
"Upwind_3rd" ) ||
119 (dycore_vert_adv_string ==
"Blended_3rd4th") ||
120 (dycore_vert_adv_string ==
"Centered_4th") ||
121 (dycore_vert_adv_string ==
"Upwind_5th" ) ||
122 (dycore_vert_adv_string ==
"Blended_5th6th") ||
123 (dycore_vert_adv_string ==
"Centered_6th") ||
124 (dycore_vert_adv_string ==
"WENO3" ) ||
125 (dycore_vert_adv_string ==
"WENOZ3" ) ||
126 (dycore_vert_adv_string ==
"WENOMZQ3" ) ||
127 (dycore_vert_adv_string ==
"WENO5" ) ||
128 (dycore_vert_adv_string ==
"WENOZ5" ) ||
129 (dycore_vert_adv_string ==
"WENO7" ) ||
130 (dycore_vert_adv_string ==
"WENOZ7" ))
134 amrex::Error(
"Don't know this dycore_vert_adv_string");
138 if (dryscal_horiz_adv_string !=
"") {
139 if ( (dryscal_horiz_adv_string ==
"Centered_2nd") ||
140 (dryscal_horiz_adv_string ==
"Upwind_3rd" ) ||
141 (dryscal_horiz_adv_string ==
"Upwind_3rd_SL") ||
142 (dryscal_horiz_adv_string ==
"Blended_3rd4th") ||
143 (dryscal_horiz_adv_string ==
"Centered_4th") ||
144 (dryscal_horiz_adv_string ==
"Upwind_5th" ) ||
145 (dryscal_horiz_adv_string ==
"Blended_5th6th") ||
146 (dryscal_horiz_adv_string ==
"Centered_6th") ||
147 (dryscal_horiz_adv_string ==
"WENO3" ) ||
148 (dryscal_horiz_adv_string ==
"WENOZ3" ) ||
149 (dryscal_horiz_adv_string ==
"WENOMZQ3" ) ||
150 (dryscal_horiz_adv_string ==
"WENO5" ) ||
151 (dryscal_horiz_adv_string ==
"WENOZ5" ) ||
152 (dryscal_horiz_adv_string ==
"WENO7" ) ||
153 (dryscal_horiz_adv_string ==
"WENOZ7" ) )
157 amrex::Error(
"Don't know this dryscal_horiz_adv_string");
161 if (dryscal_vert_adv_string !=
"") {
162 if ( (dryscal_vert_adv_string ==
"Centered_2nd") ||
163 (dryscal_vert_adv_string ==
"Upwind_3rd" ) ||
164 (dryscal_vert_adv_string ==
"Upwind_3rd_SL") ||
165 (dryscal_vert_adv_string ==
"Blended_3rd4th") ||
166 (dryscal_vert_adv_string ==
"Centered_4th") ||
167 (dryscal_vert_adv_string ==
"Upwind_5th" ) ||
168 (dryscal_vert_adv_string ==
"Blended_5th6th") ||
169 (dryscal_vert_adv_string ==
"Centered_6th") ||
170 (dryscal_vert_adv_string ==
"WENO3" ) ||
171 (dryscal_vert_adv_string ==
"WENOZ3" ) ||
172 (dryscal_vert_adv_string ==
"WENOMZQ3" ) ||
173 (dryscal_vert_adv_string ==
"WENO5" ) ||
174 (dryscal_vert_adv_string ==
"WENOZ5" ) ||
175 (dryscal_vert_adv_string ==
"WENO7" ) ||
176 (dryscal_vert_adv_string ==
"WENOZ7" ))
180 amrex::Error(
"Don't know this dryscal_vert_adv_string");
184 if (moistscal_horiz_adv_string !=
"") {
185 if ( (moistscal_horiz_adv_string ==
"Centered_2nd") ||
186 (moistscal_horiz_adv_string ==
"Upwind_3rd" ) ||
187 (moistscal_horiz_adv_string ==
"Upwind_3rd_SL" ) ||
188 (moistscal_horiz_adv_string ==
"Blended_3rd4th") ||
189 (moistscal_horiz_adv_string ==
"Centered_4th") ||
190 (moistscal_horiz_adv_string ==
"Upwind_5th" ) ||
191 (moistscal_horiz_adv_string ==
"Blended_5th6th") ||
192 (moistscal_horiz_adv_string ==
"Centered_6th") ||
193 (moistscal_horiz_adv_string ==
"WENO3" ) ||
194 (moistscal_horiz_adv_string ==
"WENOZ3" ) ||
195 (moistscal_horiz_adv_string ==
"WENOMZQ3" ) ||
196 (moistscal_horiz_adv_string ==
"WENO5" ) ||
197 (moistscal_horiz_adv_string ==
"WENOZ5" ) ||
198 (moistscal_horiz_adv_string ==
"WENO7" ) ||
199 (moistscal_horiz_adv_string ==
"WENOZ7" ))
203 amrex::Error(
"Don't know this moistscal_horiz_adv_string");
207 if (moistscal_vert_adv_string !=
"") {
208 if ( (moistscal_vert_adv_string ==
"Centered_2nd") ||
209 (moistscal_vert_adv_string ==
"Upwind_3rd" ) ||
210 (moistscal_vert_adv_string ==
"Upwind_3rd_SL" ) ||
211 (moistscal_vert_adv_string ==
"Blended_3rd4th") ||
212 (moistscal_vert_adv_string ==
"Centered_4th") ||
213 (moistscal_vert_adv_string ==
"Upwind_5th" ) ||
214 (moistscal_vert_adv_string ==
"Blended_5th6th") ||
215 (moistscal_vert_adv_string ==
"Centered_6th") ||
216 (moistscal_vert_adv_string ==
"WENO3" ) ||
217 (moistscal_vert_adv_string ==
"WENOZ3" ) ||
218 (moistscal_vert_adv_string ==
"WENOMZQ3" ) ||
219 (moistscal_vert_adv_string ==
"WENO5" ) ||
220 (moistscal_vert_adv_string ==
"WENOZ5" ) ||
221 (moistscal_vert_adv_string ==
"WENO7" ) ||
222 (moistscal_vert_adv_string ==
"WENOZ7" ))
226 amrex::Error(
"Don't know this moistscal_vert_adv_string");
231 std::string terrain_type;
232 pp.queryAdd(
"terrain_type", terrain_type);
247 amrex::Print() <<
"Advection Choices: " << std::endl;
250 amrex::ParmParse
pp(pp_prefix);
251 std::string dycore_horiz_adv_string =
"" ; std::string dycore_vert_adv_string =
"";
252 std::string dryscal_horiz_adv_string =
"" ; std::string dryscal_vert_adv_string =
"";
253 pp.queryAdd(
"dycore_horiz_adv_type" , dycore_horiz_adv_string);
254 pp.queryAdd(
"dycore_vert_adv_type" , dycore_vert_adv_string);
255 pp.queryAdd(
"dryscal_horiz_adv_type" , dryscal_horiz_adv_string);
256 pp.queryAdd(
"dryscal_vert_adv_type" , dryscal_vert_adv_string);
257 std::string moistscal_horiz_adv_string =
""; std::string moistscal_vert_adv_string =
"";
258 pp.queryAdd(
"moistscal_horiz_adv_type", moistscal_horiz_adv_string);
259 pp.queryAdd(
"moistscal_vert_adv_type" , moistscal_vert_adv_string);
261 if (dycore_horiz_adv_string !=
"") {
262 amrex::Print() <<
" dycore_horiz_adv_type : " << dycore_horiz_adv_string;
266 if ( (dycore_horiz_adv_string ==
"Blended_3rd4th") ||
267 (dycore_horiz_adv_string ==
"Blended_5th6th") ) {
270 amrex::Print() << std::endl;
272 if (dycore_vert_adv_string !=
"") {
273 amrex::Print() <<
" dycore_vert_adv_type : " << dycore_vert_adv_string;
277 if ( (dycore_vert_adv_string ==
"Blended_3rd4th") ||
278 (dycore_vert_adv_string ==
"Blended_5th6th") ) {
281 amrex::Print() << std::endl;
283 if (dryscal_horiz_adv_string !=
"") {
284 amrex::Print() <<
" dryscal_horiz_adv_type : " << dryscal_horiz_adv_string;
288 if ( (dryscal_horiz_adv_string ==
"Blended_3rd4th") ||
289 (dryscal_horiz_adv_string ==
"Blended_5th6th") ) {
292 amrex::Print() << std::endl;
294 if (dryscal_vert_adv_string !=
"") {
295 amrex::Print() <<
" dryscal_vert_adv_type : " << dryscal_vert_adv_string;
299 if ( (dryscal_vert_adv_string ==
"Blended_3rd4th") ||
300 (dryscal_vert_adv_string ==
"Blended_5th6th") ) {
303 amrex::Print() << std::endl;
305 if (moistscal_horiz_adv_string !=
"") {
306 amrex::Print() <<
" moistscal_horiz_adv_type : " << moistscal_horiz_adv_string;
310 if ( (moistscal_horiz_adv_string ==
"Blended_3rd4th") ||
311 (moistscal_horiz_adv_string ==
"Blended_5th6th") ) {
314 amrex::Print() << std::endl;
316 if (moistscal_vert_adv_string !=
"") {
317 amrex::Print() <<
" moistscal_vert_adv_type : " << moistscal_vert_adv_string;
321 if ( (moistscal_vert_adv_string ==
"Blended_3rd4th") ||
322 (moistscal_vert_adv_string ==
"Blended_5th6th") ) {
325 amrex::Print() << std::endl;
337 return "Centered_2nd";
341 return "Upwind_3rd_SL";
343 return "Centered_4th";
347 return "Centered_6th";
374 if (adv_string ==
"Centered_2nd") {
376 }
else if ((adv_string ==
"Upwind_3rd") || (adv_string ==
"Blended_3rd4th")) {
378 }
else if (adv_string ==
"Upwind_3rd_SL") {
380 }
else if (adv_string ==
"Centered_4th") {
382 }
else if (adv_string ==
"Upwind_5th" || (adv_string ==
"Blended_5th6th")) {
384 }
else if (adv_string ==
"Centered_6th") {
386 }
else if (adv_string ==
"WENO3") {
388 }
else if (adv_string ==
"WENOZ3") {
390 }
else if (adv_string ==
"WENO5") {
392 }
else if (adv_string ==
"WENOZ5") {
394 }
else if (adv_string ==
"WENOMZQ3") {
396 }
else if (adv_string ==
"WENO7") {
398 }
else if (adv_string ==
"WENOZ7") {
412 bool using_weno_momentum =
429 amrex::ignore_unused(use_embedded_boundary, using_weno_momentum);
431 "WENO momentum advection schemes are not yet implemented for embedded boundaries. "
432 "Please use traditional momentum advection schemes when using embedded boundaries:\n"
AdvType
Definition: ERF_IndexDefines.H:352
Dimensionless numeric literals and pure mathematical constants.
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_ASSERT_WITH_MESSAGE(wbar_cutoff_min > wbar_cutoff_max, "ERROR: wbar_cutoff_min < wbar_cutoff_max")
Definition: ERF_AdvStruct.H:19
amrex::Real dryscal_horiz_upw_frac
Upwind blending fraction for horizontal dry scalar advection.
Definition: ERF_AdvStruct.H:455
void display(std::string &pp_prefix)
Print the configured advection choices.
Definition: ERF_AdvStruct.H:245
void init_params(std::string pp_prefix)
Read advection options from the input parameter database.
Definition: ERF_AdvStruct.H:25
bool have_zero_flux_faces
Whether any zero-flux thin immersed-body faces were specified.
Definition: ERF_AdvStruct.H:464
void validate_weno_momentum_compatibility(bool use_embedded_boundary)
Check whether the selected momentum WENO schemes are compatible with embedded boundaries.
Definition: ERF_AdvStruct.H:409
AdvType adv_type_convert_string_to_advtype(std::string adv_string)
Convert an input advection string to the corresponding enum value.
Definition: ERF_AdvStruct.H:372
AdvType dycore_vert_adv_type
Vertical advection scheme for dynamical-core variables.
Definition: ERF_AdvStruct.H:444
AdvType moistscal_vert_adv_type
Vertical advection scheme for moist scalar variables.
Definition: ERF_AdvStruct.H:448
amrex::Vector< amrex::IntVect > zero_yflux
Thin immersed-body y-face indices where fluxes are forced to zero.
Definition: ERF_AdvStruct.H:462
AdvType dryscal_horiz_adv_type
Horizontal advection scheme for dry scalar variables.
Definition: ERF_AdvStruct.H:445
amrex::Real moistscal_horiz_upw_frac
Upwind blending fraction for horizontal moist scalar advection.
Definition: ERF_AdvStruct.H:457
amrex::Vector< amrex::IntVect > zero_zflux
Thin immersed-body z-face indices where fluxes are forced to zero.
Definition: ERF_AdvStruct.H:463
bool use_efficient_advection
Whether to use the efficient advection implementation.
Definition: ERF_AdvStruct.H:442
amrex::Vector< amrex::IntVect > zero_xflux
Thin immersed-body x-face indices where fluxes are forced to zero.
Definition: ERF_AdvStruct.H:461
AdvType dycore_horiz_adv_type
Horizontal advection scheme for dynamical-core variables.
Definition: ERF_AdvStruct.H:443
AdvType moistscal_horiz_adv_type
Horizontal advection scheme for moist scalar variables.
Definition: ERF_AdvStruct.H:447
amrex::Real dycore_vert_upw_frac
Upwind blending fraction for vertical dynamical-core advection.
Definition: ERF_AdvStruct.H:454
amrex::Real moistscal_vert_upw_frac
Upwind blending fraction for vertical moist scalar advection.
Definition: ERF_AdvStruct.H:458
amrex::Real dycore_horiz_upw_frac
Upwind blending fraction for horizontal dynamical-core advection.
Definition: ERF_AdvStruct.H:453
std::string adv_type_convert_int_to_string(AdvType adv_int)
Convert an advection type enum to the corresponding input string.
Definition: ERF_AdvStruct.H:334
amrex::Real dryscal_vert_upw_frac
Upwind blending fraction for vertical dry scalar advection.
Definition: ERF_AdvStruct.H:456
AdvType dryscal_vert_adv_type
Vertical advection scheme for dry scalar variables.
Definition: ERF_AdvStruct.H:446