109 static std::string tracer_hadv_string =
"upstream3";
110 pp.queryAdd(
"tracer_horizontal_advection_scheme",tracer_hadv_string);
111 if (tracer_hadv_string ==
"centered4")
113 else if (tracer_hadv_string ==
"upstream3")
116 amrex::Error(
"Advection scheme unknown.");
119 static std::string uv_hadv_string =
"upstream3";
120 pp.queryAdd(
"uv_horizontal_advection_scheme",uv_hadv_string);
121 if (uv_hadv_string ==
"upstream3")
123 else if (uv_hadv_string ==
"centered2")
126 amrex::Error(
"UV advection scheme unknown.");
128 pp.queryAdd(
"rdrag",
rdrag);
129 pp.queryAdd(
"rdrag2",
rdrag2);
130 pp.queryAdd(
"Zos",
Zos);
131 pp.queryAdd(
"Zob",
Zob);
132 pp.queryAdd(
"Cdb_max",
Cdb_max);
133 pp.queryAdd(
"Cdb_min",
Cdb_min);
162 for (
int icomp =
Tracer_comp; icomp < ncons; ++icomp) {
172 static std::string eos_type_string =
"linear";
173 pp.queryAdd(
"eos_type",eos_type_string);
174 if (eos_type_string ==
"linear" || eos_type_string ==
"Linear" ||
175 eos_type_string ==
"lin" || eos_type_string ==
"Lin") {
177 pp.queryAdd(
"Tcoef",
Tcoef);
178 pp.queryAdd(
"Scoef",
Scoef);
179 }
else if (eos_type_string ==
"nonlinear" || eos_type_string ==
"Nonlinear" ||
180 eos_type_string ==
"non-linear" || eos_type_string ==
"Non-linear" ||
181 eos_type_string ==
"nonlin" || eos_type_string ==
"Nonlin") {
184 amrex::Abort(
"Dont know this eos_type");
186 pp.queryAdd(
"R0",
R0);
187 pp.queryAdd(
"S0",
S0);
188 pp.queryAdd(
"T0",
T0);
189 pp.queryAdd(
"rho0",
rho0);
198 pp.queryAdd(
"air_pressure",
Pair);
199 pp.queryAdd(
"air_temperature",
Tair);
200 pp.queryAdd(
"air_humidity",
Hair);
201 pp.queryAdd(
"surface_radiation_flux",
srflux);
207 pp.queryAdd(
"cloud",
cloud);
208 pp.queryAdd(
"rain",
rain);
209 pp.queryAdd(
"blk_ZQ",
blk_ZQ);
210 pp.queryAdd(
"blk_ZT",
blk_ZT);
211 pp.queryAdd(
"blk_ZW",
blk_ZW);
212 pp.queryAdd(
"eminusp",
eminusp);
230 amrex::Warning(
"remora.longwave_netcdf_varname is set but remora.longwave_down_from_netcdf is false; the value will be ignored.");
234 amrex::Abort(
"If evaporation minus precipitation (E-P) sea surface height correct in is on, E-P must be on as well (remora.eminusp=true)");
237 amrex::Abort(
"Evaporation minus precipitation (E-P) requires bulk flux parametrizations (remora.bulk_fluxes=true)");
242 pp.queryAdd(
"theta_s",
theta_s);
243 pp.queryAdd(
"theta_b",
theta_b);
244 pp.queryAdd(
"tcline",
tcline);
250 pp.queryAdd(
"Akv_bak",
Akv_bak);
251 pp.queryAdd(
"Akt_bak",
Akt_bak);
254 static std::string grid_scale_type_string =
"constant";
255 pp.queryAdd(
"grid_scale_type",grid_scale_type_string);
257 if (amrex::toLower(grid_scale_type_string) ==
"constant") {
259 }
else if (amrex::toLower(grid_scale_type_string) ==
"custom") {
260 amrex::Warning(
"Initialization of grid scale from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
262 }
else if (amrex::toLower(grid_scale_type_string) ==
"analytic") {
265 amrex::Error(
"Don't know this grid_scale_type");
268 static std::string ic_type_string =
"analytic";
269 bool found_ic_bc = pp.queryAdd(
"ic_bc_type", ic_type_string);
270 pp.queryAdd(
"ic_type", ic_type_string);
273 amrex::Warning(
"remora.ic_bc_type is now called remora.ic_type, and will eventually be deprecated");
276 if ( amrex::toLower(ic_type_string) ==
"custom") {
277 amrex::Warning(
"Problem initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
279 }
else if ( amrex::toLower(ic_type_string) ==
"analytic") {
281 }
else if ( amrex::toLower(ic_type_string) ==
"netcdf") {
283 }
else if ( amrex::toLower(ic_type_string) ==
"real") {
284 amrex::Warning(
"Problem initialization from NetCDF (remora.ic_type) is now called 'netcdf'. 'real' will be deprecated");
287 amrex::Error(
"Don't know this ic_type");
291 static std::string coupling_type_string =
"TwoWay";
292 pp.queryAdd(
"coupling_type",coupling_type_string);
293 if (amrex::toLower(coupling_type_string) ==
"twoway" ||
294 amrex::toLower(coupling_type_string) ==
"two_way") {
296 }
else if (amrex::toLower(coupling_type_string) ==
"oneway" ||
297 amrex::toLower(coupling_type_string) ==
"one_way") {
300 amrex::Abort(
"Dont know this coupling_type");
305 static std::string coriolis_type_string =
"beta_plane";
306 pp.queryAdd(
"coriolis_type",coriolis_type_string);
307 if ( amrex::toLower(coriolis_type_string) ==
"custom") {
308 amrex::Warning(
"Coriolis initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
310 }
else if ( amrex::toLower(coriolis_type_string) ==
"analytic") {
312 }
else if ((amrex::toLower(coriolis_type_string) ==
"beta_plane") ||
313 (amrex::toLower(coriolis_type_string) ==
"betaplane")) {
315 }
else if ( (amrex::toLower(coriolis_type_string) ==
"netcdf")) {
317 }
else if ( (amrex::toLower(coriolis_type_string) ==
"real")) {
318 amrex::Warning(
"Coriolis initialization from NetCDF is now called 'netcdf'. 'real' will be deprecated");
321 amrex::Abort(
"Don't know this coriolis_type");
325 static std::string smflux_type_string =
"analytic";
326 int smflux_specified = pp.queryAdd(
"smflux_type",smflux_type_string);
327 if ( amrex::toLower(smflux_type_string) ==
"custom") {
328 amrex::Warning(
"Surface momentum flux initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
330 }
else if ( amrex::toLower(smflux_type_string) ==
"analytic") {
332 }
else if ( amrex::toLower(smflux_type_string) ==
"netcdf") {
335 amrex::Abort(
"Don't know this smflux_type");
338 static std::string wind_type_string =
"analytic";
339 int wind_specified = pp.queryAdd(
"wind_type",wind_type_string);
340 if ( amrex::toLower(wind_type_string) ==
"custom") {
341 amrex::Warning(
"Surface wind initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
343 }
else if ( amrex::toLower(wind_type_string) ==
"analytic") {
345 }
else if ( amrex::toLower(wind_type_string) ==
"netcdf") {
348 amrex::Abort(
"Don't know this smflux_type");
351 if (wind_specified && smflux_specified) {
352 amrex::Abort(
"Cannot specify both wind and surface momentum flux");
355 static std::string mask_type_string =
"none";
358 mask_type_string =
"netcdf";
360 pp.queryAdd(
"mask_type", mask_type_string);
361 if (amrex::toLower(mask_type_string) ==
"none") {
363 }
else if (amrex::toLower(mask_type_string) ==
"analytic") {
365 }
else if (amrex::toLower(mask_type_string) ==
"netcdf") {
368 amrex::Abort(
"Don't know this mask_type");
371 static std::string bottom_stress_type_string =
"linear";
372 pp.queryAdd(
"bottom_stress_type", bottom_stress_type_string);
373 if (amrex::toLower(bottom_stress_type_string) ==
"linear") {
375 }
else if (amrex::toLower(bottom_stress_type_string) ==
"quadratic") {
377 }
else if (amrex::toLower(bottom_stress_type_string) ==
"logarithmic") {
380 amrex::Abort(
"Don't know this bottom_stress_type");
383 amrex::Real tnu2_salt = amrex::Real(0.0);
384 amrex::Real tnu2_temp = amrex::Real(0.0);
385 amrex::Real tnu2_scalar = amrex::Real(0.0);
386 static std::string horiz_mixing_type_string =
"analytic";
387 pp.queryAdd(
"horizontal_mixing_type", horiz_mixing_type_string);
388 if (amrex::toLower(horiz_mixing_type_string) ==
"analytical" ||
389 amrex::toLower(horiz_mixing_type_string) ==
"analytic") {
391 }
else if (amrex::toLower(horiz_mixing_type_string) ==
"constant") {
393 }
else if (amrex::toLower(horiz_mixing_type_string) ==
"scaled_to_grid") {
396 amrex::Abort(
"Don't know this horizontal mixing type");
398 pp.queryAdd(
"visc2",
visc2);
399 pp.queryAdd(
"tnu2_salt",tnu2_salt);
400 pp.queryAdd(
"tnu2_temp",tnu2_temp);
401 pp.queryAdd(
"tnu2_scalar",tnu2_scalar);
405 static std::string scaled_to_grid_amr_scaling_string =
"none";
406 pp.queryAdd(
"scaled_to_grid_amr_scaling", scaled_to_grid_amr_scaling_string);
407 if (amrex::toLower(scaled_to_grid_amr_scaling_string) ==
"none") {
409 }
else if (amrex::toLower(scaled_to_grid_amr_scaling_string) ==
"linear") {
412 amrex::Abort(
"Don't know this scaled_to_grid_amr_scaling option");
415 tnu2.assign(ncons, tnu2_scalar);
423 static std::string harmonic_mixing_type_string =
"s";
424 pp.queryAdd(
"harmonic_mixing_type", harmonic_mixing_type_string);
425 if (amrex::toLower(harmonic_mixing_type_string) ==
"s") {
427 }
else if (amrex::toLower(harmonic_mixing_type_string) ==
"geopotential" ||
428 amrex::toLower(harmonic_mixing_type_string) ==
"geo") {
431 amrex::Abort(
"Don't know this harmonic_mixing_type");
434 pp.queryAdd(
"Akk_bak",
Akk_bak);
435 pp.queryAdd(
"Akp_bak",
Akp_bak);
436 static std::string vert_mixing_type_string =
"analytic";
437 static std::string gls_stability_type_string =
"Canuto_A";
438 pp.queryAdd(
"vertical_mixing_type", vert_mixing_type_string);
439 pp.queryAdd(
"gls_stability_type", gls_stability_type_string);
440 if (amrex::toLower(vert_mixing_type_string) ==
"analytical" ||
441 amrex::toLower(vert_mixing_type_string) ==
"analytic") {
443 }
else if (amrex::toLower(vert_mixing_type_string) ==
"gls") {
445 if (amrex::toLower(gls_stability_type_string) ==
"canuto_a") {
448 else if (amrex::toLower(gls_stability_type_string) ==
"canuto_b") {
451 else if (amrex::toLower(gls_stability_type_string) ==
"galperin") {
455 amrex::Abort(
"Don't know this GLS stability type");
458 amrex::Abort(
"Don't know this vertical mixing type");
462 pp.queryAdd(
"gls_P",
gls_p);
463 pp.queryAdd(
"gls_M",
gls_m);
464 pp.queryAdd(
"gls_N",
gls_n);
469 pp.queryAdd(
"gls_c1",
gls_c1);
470 pp.queryAdd(
"gls_c2",
gls_c2);
471 pp.queryAdd(
"gls_c3m",
gls_c3m);
472 pp.queryAdd(
"gls_c3p",
gls_c3p);
478 gls_L1 = amrex::Real(0.107);
479 gls_L2 = amrex::Real(0.0032);
480 gls_L3 = amrex::Real(0.0864);
481 gls_L4 = amrex::Real(0.12);
482 gls_L5 = amrex::Real(11.9);
483 gls_L6 = amrex::Real(0.4);
484 gls_L7 = amrex::Real(0.0);
485 gls_L8 = amrex::Real(0.48);
489 gls_L1 = amrex::Real(0.127);
490 gls_L2 = amrex::Real(0.00336);
491 gls_L3 = amrex::Real(0.0906);
492 gls_L4 = amrex::Real(0.101);
493 gls_L5 = amrex::Real(11.2);
494 gls_L6 = amrex::Real(0.4);
495 gls_L7 = amrex::Real(0.0);
496 gls_L8 = amrex::Real(0.318);
505 amrex::Real tnudg = amrex::Real(0.0);
506 amrex::Real znudg = amrex::Real(0.0);
507 amrex::Real m2nudg = amrex::Real(0.0);
508 amrex::Real m3nudg = amrex::Real(0.0);
509 pp.queryAdd(
"tnudg",tnudg);
510 pp.queryAdd(
"znudg",znudg);
511 pp.queryAdd(
"m2nudg",m2nudg);
512 pp.queryAdd(
"m3nudg",m3nudg);
513 pp.queryAdd(
"obcfac",
obcfac);
516 nudg_coeff[
BdyVars::u ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
517 nudg_coeff[
BdyVars::v ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
518 nudg_coeff[
BdyVars::t ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
519 nudg_coeff[
BdyVars::s ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
532#ifndef REMORA_USE_NETCDF
534 amrex::Abort(
"Climatology nudging requires building with NetCDF");