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);
164 for (
int icomp =
Tracer_comp; icomp < ncons; ++icomp) {
174 static std::string eos_type_string =
"linear";
175 pp.queryAdd(
"eos_type",eos_type_string);
176 if (eos_type_string ==
"linear" || eos_type_string ==
"Linear" ||
177 eos_type_string ==
"lin" || eos_type_string ==
"Lin") {
179 pp.queryAdd(
"Tcoef",
Tcoef);
180 pp.queryAdd(
"Scoef",
Scoef);
181 }
else if (eos_type_string ==
"nonlinear" || eos_type_string ==
"Nonlinear" ||
182 eos_type_string ==
"non-linear" || eos_type_string ==
"Non-linear" ||
183 eos_type_string ==
"nonlin" || eos_type_string ==
"Nonlin") {
186 amrex::Abort(
"Dont know this eos_type");
188 pp.queryAdd(
"R0",
R0);
189 pp.queryAdd(
"S0",
S0);
190 pp.queryAdd(
"T0",
T0);
191 pp.queryAdd(
"rho0",
rho0);
196 amrex::ParmParse pp_driver(
"driver");
197 std::string driver_atm2ocn_mode =
"state";
198 pp_driver.query(
"atm2ocn_mode", driver_atm2ocn_mode);
199 if (amrex::toLower(driver_atm2ocn_mode) ==
"flux") {
209 pp.queryAdd(
"air_pressure",
Pair);
210 pp.queryAdd(
"air_temperature",
Tair);
211 pp.queryAdd(
"air_humidity",
Hair);
212 pp.queryAdd(
"surface_radiation_flux",
srflux);
218 pp.queryAdd(
"cloud",
cloud);
219 pp.queryAdd(
"rain",
rain);
220 pp.queryAdd(
"blk_ZQ",
blk_ZQ);
221 pp.queryAdd(
"blk_ZT",
blk_ZT);
222 pp.queryAdd(
"blk_ZW",
blk_ZW);
223 pp.queryAdd(
"eminusp",
eminusp);
241 amrex::Warning(
"remora.longwave_netcdf_varname is set but remora.longwave_down_from_netcdf is false; the value will be ignored.");
245 amrex::Abort(
"If evaporation minus precipitation (E-P) sea surface height correction is on, bulk fluxes must be on as well (remora.bulk_fluxes=true)");
248 amrex::Abort(
"Evaporation minus precipitation (E-P) requires bulk flux parametrizations (remora.bulk_fluxes=true)");
252 static bool printed_ep_source =
false;
253 if (!printed_ep_source) {
254 printed_ep_source =
true;
256 amrex::Print() <<
"[REMORA] Active E-P source: NetCDF EminusP (remora.EminusP_from_netcdf=true).\n";
258 amrex::Print() <<
"[REMORA] Active E-P source: bulk evap-rain diagnostic.\n";
265 pp.queryAdd(
"theta_s",
theta_s);
266 pp.queryAdd(
"theta_b",
theta_b);
267 pp.queryAdd(
"tcline",
tcline);
273 pp.queryAdd(
"Akv_bak",
Akv_bak);
274 pp.queryAdd(
"Akt_bak",
Akt_bak);
277 static std::string grid_scale_type_string =
"constant";
278 pp.queryAdd(
"grid_scale_type",grid_scale_type_string);
280 if (amrex::toLower(grid_scale_type_string) ==
"constant") {
282 }
else if (amrex::toLower(grid_scale_type_string) ==
"custom") {
283 amrex::Warning(
"Initialization of grid scale from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
285 }
else if (amrex::toLower(grid_scale_type_string) ==
"analytic") {
288 amrex::Error(
"Don't know this grid_scale_type");
291 static std::string ic_type_string =
"analytic";
292 bool found_ic_bc = pp.queryAdd(
"ic_bc_type", ic_type_string);
293 pp.queryAdd(
"ic_type", ic_type_string);
296 amrex::Warning(
"remora.ic_bc_type is now called remora.ic_type, and will eventually be deprecated");
299 if ( amrex::toLower(ic_type_string) ==
"custom") {
300 amrex::Warning(
"Problem initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
302 }
else if ( amrex::toLower(ic_type_string) ==
"analytic") {
304 }
else if ( amrex::toLower(ic_type_string) ==
"netcdf") {
306 }
else if ( amrex::toLower(ic_type_string) ==
"real") {
307 amrex::Warning(
"Problem initialization from NetCDF (remora.ic_type) is now called 'netcdf'. 'real' will be deprecated");
310 amrex::Error(
"Don't know this ic_type");
314 static std::string coupling_type_string =
"TwoWay";
315 pp.queryAdd(
"coupling_type",coupling_type_string);
316 if (amrex::toLower(coupling_type_string) ==
"twoway" ||
317 amrex::toLower(coupling_type_string) ==
"two_way") {
319 }
else if (amrex::toLower(coupling_type_string) ==
"oneway" ||
320 amrex::toLower(coupling_type_string) ==
"one_way") {
323 amrex::Abort(
"Dont know this coupling_type");
328 static std::string coriolis_type_string =
"beta_plane";
329 pp.queryAdd(
"coriolis_type",coriolis_type_string);
330 if ( amrex::toLower(coriolis_type_string) ==
"custom") {
331 amrex::Warning(
"Coriolis initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
333 }
else if ( amrex::toLower(coriolis_type_string) ==
"analytic") {
335 }
else if ((amrex::toLower(coriolis_type_string) ==
"beta_plane") ||
336 (amrex::toLower(coriolis_type_string) ==
"betaplane")) {
338 }
else if ( (amrex::toLower(coriolis_type_string) ==
"netcdf")) {
340 }
else if ( (amrex::toLower(coriolis_type_string) ==
"real")) {
341 amrex::Warning(
"Coriolis initialization from NetCDF is now called 'netcdf'. 'real' will be deprecated");
344 amrex::Abort(
"Don't know this coriolis_type");
348 static std::string smflux_type_string =
"analytic";
349 int smflux_specified = pp.queryAdd(
"smflux_type",smflux_type_string);
350 if ( amrex::toLower(smflux_type_string) ==
"custom") {
351 amrex::Warning(
"Surface momentum flux initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
353 }
else if ( amrex::toLower(smflux_type_string) ==
"analytic") {
355 }
else if ( amrex::toLower(smflux_type_string) ==
"netcdf") {
358 amrex::Abort(
"Don't know this smflux_type");
361 static std::string wind_type_string =
"analytic";
362 int wind_specified = pp.queryAdd(
"wind_type",wind_type_string);
363 if ( amrex::toLower(wind_type_string) ==
"custom") {
364 amrex::Warning(
"Surface wind initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
366 }
else if ( amrex::toLower(wind_type_string) ==
"analytic") {
368 }
else if ( amrex::toLower(wind_type_string) ==
"netcdf") {
371 amrex::Abort(
"Don't know this smflux_type");
374 if (wind_specified && smflux_specified) {
375 amrex::Abort(
"Cannot specify both wind and surface momentum flux");
378 static std::string mask_type_string =
"none";
381 mask_type_string =
"netcdf";
383 pp.queryAdd(
"mask_type", mask_type_string);
384 if (amrex::toLower(mask_type_string) ==
"none") {
386 }
else if (amrex::toLower(mask_type_string) ==
"analytic") {
388 }
else if (amrex::toLower(mask_type_string) ==
"netcdf") {
391 amrex::Abort(
"Don't know this mask_type");
394 static std::string bottom_stress_type_string =
"linear";
395 pp.queryAdd(
"bottom_stress_type", bottom_stress_type_string);
396 if (amrex::toLower(bottom_stress_type_string) ==
"linear") {
398 }
else if (amrex::toLower(bottom_stress_type_string) ==
"quadratic") {
400 }
else if (amrex::toLower(bottom_stress_type_string) ==
"logarithmic") {
403 amrex::Abort(
"Don't know this bottom_stress_type");
406 amrex::Real tnu2_salt = amrex::Real(0.0);
407 amrex::Real tnu2_temp = amrex::Real(0.0);
408 amrex::Real tnu2_scalar = amrex::Real(0.0);
409 static std::string horiz_mixing_type_string =
"analytic";
410 pp.queryAdd(
"horizontal_mixing_type", horiz_mixing_type_string);
411 if (amrex::toLower(horiz_mixing_type_string) ==
"analytical" ||
412 amrex::toLower(horiz_mixing_type_string) ==
"analytic") {
414 }
else if (amrex::toLower(horiz_mixing_type_string) ==
"constant") {
416 }
else if (amrex::toLower(horiz_mixing_type_string) ==
"scaled_to_grid") {
419 amrex::Abort(
"Don't know this horizontal mixing type");
421 pp.queryAdd(
"visc2",
visc2);
422 pp.queryAdd(
"tnu2_salt",tnu2_salt);
423 pp.queryAdd(
"tnu2_temp",tnu2_temp);
424 pp.queryAdd(
"tnu2_scalar",tnu2_scalar);
428 static std::string scaled_to_grid_amr_scaling_string =
"none";
429 pp.queryAdd(
"scaled_to_grid_amr_scaling", scaled_to_grid_amr_scaling_string);
430 if (amrex::toLower(scaled_to_grid_amr_scaling_string) ==
"none") {
432 }
else if (amrex::toLower(scaled_to_grid_amr_scaling_string) ==
"linear") {
435 amrex::Abort(
"Don't know this scaled_to_grid_amr_scaling option");
438 tnu2.assign(ncons, tnu2_scalar);
446 static std::string harmonic_mixing_type_string =
"s";
447 pp.queryAdd(
"harmonic_mixing_type", harmonic_mixing_type_string);
448 if (amrex::toLower(harmonic_mixing_type_string) ==
"s") {
450 }
else if (amrex::toLower(harmonic_mixing_type_string) ==
"geopotential" ||
451 amrex::toLower(harmonic_mixing_type_string) ==
"geo") {
454 amrex::Abort(
"Don't know this harmonic_mixing_type");
457 pp.queryAdd(
"Akk_bak",
Akk_bak);
458 pp.queryAdd(
"Akp_bak",
Akp_bak);
459 static std::string vert_mixing_type_string =
"analytic";
460 static std::string gls_stability_type_string =
"Canuto_A";
461 pp.queryAdd(
"vertical_mixing_type", vert_mixing_type_string);
462 pp.queryAdd(
"gls_stability_type", gls_stability_type_string);
463 if (amrex::toLower(vert_mixing_type_string) ==
"analytical" ||
464 amrex::toLower(vert_mixing_type_string) ==
"analytic") {
466 }
else if (amrex::toLower(vert_mixing_type_string) ==
"gls") {
468 if (amrex::toLower(gls_stability_type_string) ==
"canuto_a") {
471 else if (amrex::toLower(gls_stability_type_string) ==
"canuto_b") {
474 else if (amrex::toLower(gls_stability_type_string) ==
"galperin") {
478 amrex::Abort(
"Don't know this GLS stability type");
481 amrex::Abort(
"Don't know this vertical mixing type");
485 pp.queryAdd(
"gls_P",
gls_p);
486 pp.queryAdd(
"gls_M",
gls_m);
487 pp.queryAdd(
"gls_N",
gls_n);
492 pp.queryAdd(
"gls_c1",
gls_c1);
493 pp.queryAdd(
"gls_c2",
gls_c2);
494 pp.queryAdd(
"gls_c3m",
gls_c3m);
495 pp.queryAdd(
"gls_c3p",
gls_c3p);
501 gls_L1 = amrex::Real(0.107);
502 gls_L2 = amrex::Real(0.0032);
503 gls_L3 = amrex::Real(0.0864);
504 gls_L4 = amrex::Real(0.12);
505 gls_L5 = amrex::Real(11.9);
506 gls_L6 = amrex::Real(0.4);
507 gls_L7 = amrex::Real(0.0);
508 gls_L8 = amrex::Real(0.48);
512 gls_L1 = amrex::Real(0.127);
513 gls_L2 = amrex::Real(0.00336);
514 gls_L3 = amrex::Real(0.0906);
515 gls_L4 = amrex::Real(0.101);
516 gls_L5 = amrex::Real(11.2);
517 gls_L6 = amrex::Real(0.4);
518 gls_L7 = amrex::Real(0.0);
519 gls_L8 = amrex::Real(0.318);
528 amrex::Real tnudg = amrex::Real(0.0);
529 amrex::Real znudg = amrex::Real(0.0);
530 amrex::Real m2nudg = amrex::Real(0.0);
531 amrex::Real m3nudg = amrex::Real(0.0);
532 pp.queryAdd(
"tnudg",tnudg);
533 pp.queryAdd(
"znudg",znudg);
534 pp.queryAdd(
"m2nudg",m2nudg);
535 pp.queryAdd(
"m3nudg",m3nudg);
536 pp.queryAdd(
"obcfac",
obcfac);
539 nudg_coeff[
BdyVars::u ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
540 nudg_coeff[
BdyVars::v ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
541 nudg_coeff[
BdyVars::t ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
542 nudg_coeff[
BdyVars::s ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
555#ifndef REMORA_USE_NETCDF
557 amrex::Abort(
"Climatology nudging requires building with NetCDF");