99 static std::string tracer_hadv_string =
"upstream3";
100 pp.queryAdd(
"tracer_horizontal_advection_scheme",tracer_hadv_string);
101 if (tracer_hadv_string ==
"centered4")
103 else if (tracer_hadv_string ==
"upstream3")
106 amrex::Error(
"Advection scheme unknown.");
109 static std::string uv_hadv_string =
"upstream3";
110 pp.queryAdd(
"uv_horizontal_advection_scheme",uv_hadv_string);
111 if (uv_hadv_string ==
"upstream3")
113 else if (uv_hadv_string ==
"centered2")
116 amrex::Error(
"UV advection scheme unknown.");
118 pp.queryAdd(
"rdrag",
rdrag);
119 pp.queryAdd(
"rdrag2",
rdrag2);
120 pp.queryAdd(
"Zos",
Zos);
121 pp.queryAdd(
"Zob",
Zob);
122 pp.queryAdd(
"Cdb_max",
Cdb_max);
123 pp.queryAdd(
"Cdb_min",
Cdb_min);
163 static std::string eos_type_string =
"linear";
164 pp.queryAdd(
"eos_type",eos_type_string);
165 if (eos_type_string ==
"linear" || eos_type_string ==
"Linear" ||
166 eos_type_string ==
"lin" || eos_type_string ==
"Lin") {
168 pp.queryAdd(
"Tcoef",
Tcoef);
169 pp.queryAdd(
"Scoef",
Scoef);
170 }
else if (eos_type_string ==
"nonlinear" || eos_type_string ==
"Nonlinear" ||
171 eos_type_string ==
"non-linear" || eos_type_string ==
"Non-linear" ||
172 eos_type_string ==
"nonlin" || eos_type_string ==
"Nonlin") {
175 amrex::Abort(
"Dont know this eos_type");
177 pp.queryAdd(
"R0",
R0);
178 pp.queryAdd(
"S0",
S0);
179 pp.queryAdd(
"T0",
T0);
180 pp.queryAdd(
"rho0",
rho0);
189 pp.queryAdd(
"air_pressure",
Pair);
190 pp.queryAdd(
"air_temperature",
Tair);
191 pp.queryAdd(
"air_humidity",
Hair);
192 pp.queryAdd(
"surface_radiation_flux",
srflux);
198 pp.queryAdd(
"cloud",
cloud);
199 pp.queryAdd(
"rain",
rain);
200 pp.queryAdd(
"blk_ZQ",
blk_ZQ);
201 pp.queryAdd(
"blk_ZT",
blk_ZT);
202 pp.queryAdd(
"blk_ZW",
blk_ZW);
203 pp.queryAdd(
"eminusp",
eminusp);
221 amrex::Warning(
"remora.longwave_netcdf_varname is set but remora.longwave_down_from_netcdf is false; the value will be ignored.");
225 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)");
228 amrex::Abort(
"Evaporation minus precipitation (E-P) requires bulk flux parametrizations (remora.bulk_fluxes=true)");
233 pp.queryAdd(
"theta_s",
theta_s);
234 pp.queryAdd(
"theta_b",
theta_b);
235 pp.queryAdd(
"tcline",
tcline);
241 pp.queryAdd(
"Akv_bak",
Akv_bak);
242 pp.queryAdd(
"Akt_bak",
Akt_bak);
245 static std::string grid_scale_type_string =
"constant";
246 pp.queryAdd(
"grid_scale_type",grid_scale_type_string);
248 if (amrex::toLower(grid_scale_type_string) ==
"constant") {
250 }
else if (amrex::toLower(grid_scale_type_string) ==
"custom") {
251 amrex::Warning(
"Initialization of grid scale from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
253 }
else if (amrex::toLower(grid_scale_type_string) ==
"analytic") {
256 amrex::Error(
"Don't know this grid_scale_type");
259 static std::string ic_type_string =
"analytic";
260 bool found_ic_bc = pp.queryAdd(
"ic_bc_type", ic_type_string);
261 pp.queryAdd(
"ic_type", ic_type_string);
264 amrex::Warning(
"remora.ic_bc_type is now called remora.ic_type, and will eventually be deprecated");
267 if ( amrex::toLower(ic_type_string) ==
"custom") {
268 amrex::Warning(
"Problem initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
270 }
else if ( amrex::toLower(ic_type_string) ==
"analytic") {
272 }
else if ( amrex::toLower(ic_type_string) ==
"netcdf") {
274 }
else if ( amrex::toLower(ic_type_string) ==
"real") {
275 amrex::Warning(
"Problem initialization from NetCDF (remora.ic_type) is now called 'netcdf'. 'real' will be deprecated");
278 amrex::Error(
"Don't know this ic_type");
282 static std::string coupling_type_string =
"TwoWay";
283 pp.queryAdd(
"coupling_type",coupling_type_string);
284 if (amrex::toLower(coupling_type_string) ==
"twoway" ||
285 amrex::toLower(coupling_type_string) ==
"two_way") {
287 }
else if (amrex::toLower(coupling_type_string) ==
"oneway" ||
288 amrex::toLower(coupling_type_string) ==
"one_way") {
291 amrex::Abort(
"Dont know this coupling_type");
296 static std::string coriolis_type_string =
"beta_plane";
297 pp.queryAdd(
"coriolis_type",coriolis_type_string);
298 if ( amrex::toLower(coriolis_type_string) ==
"custom") {
299 amrex::Warning(
"Coriolis initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
301 }
else if ( amrex::toLower(coriolis_type_string) ==
"analytic") {
303 }
else if ((amrex::toLower(coriolis_type_string) ==
"beta_plane") ||
304 (amrex::toLower(coriolis_type_string) ==
"betaplane")) {
306 }
else if ( (amrex::toLower(coriolis_type_string) ==
"netcdf")) {
308 }
else if ( (amrex::toLower(coriolis_type_string) ==
"real")) {
309 amrex::Warning(
"Coriolis initialization from NetCDF is now called 'netcdf'. 'real' will be deprecated");
312 amrex::Abort(
"Don't know this coriolis_type");
316 static std::string smflux_type_string =
"analytic";
317 int smflux_specified = pp.queryAdd(
"smflux_type",smflux_type_string);
318 if ( amrex::toLower(smflux_type_string) ==
"custom") {
319 amrex::Warning(
"Surface momentum flux initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
321 }
else if ( amrex::toLower(smflux_type_string) ==
"analytic") {
323 }
else if ( amrex::toLower(smflux_type_string) ==
"netcdf") {
326 amrex::Abort(
"Don't know this smflux_type");
329 static std::string wind_type_string =
"analytic";
330 int wind_specified = pp.queryAdd(
"wind_type",wind_type_string);
331 if ( amrex::toLower(wind_type_string) ==
"custom") {
332 amrex::Warning(
"Surface wind initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
334 }
else if ( amrex::toLower(wind_type_string) ==
"analytic") {
336 }
else if ( amrex::toLower(wind_type_string) ==
"netcdf") {
339 amrex::Abort(
"Don't know this smflux_type");
342 if (wind_specified && smflux_specified) {
343 amrex::Abort(
"Cannot specify both wind and surface momentum flux");
346 static std::string mask_type_string =
"none";
349 mask_type_string =
"netcdf";
351 pp.queryAdd(
"mask_type", mask_type_string);
352 if (amrex::toLower(mask_type_string) ==
"none") {
354 }
else if (amrex::toLower(mask_type_string) ==
"analytic") {
356 }
else if (amrex::toLower(mask_type_string) ==
"netcdf") {
359 amrex::Abort(
"Don't know this mask_type");
362 static std::string bottom_stress_type_string =
"linear";
363 pp.queryAdd(
"bottom_stress_type", bottom_stress_type_string);
364 if (amrex::toLower(bottom_stress_type_string) ==
"linear") {
366 }
else if (amrex::toLower(bottom_stress_type_string) ==
"quadratic") {
368 }
else if (amrex::toLower(bottom_stress_type_string) ==
"logarithmic") {
371 amrex::Abort(
"Don't know this bottom_stress_type");
374 amrex::Real tnu2_salt = amrex::Real(0.0);
375 amrex::Real tnu2_temp = amrex::Real(0.0);
376 amrex::Real tnu2_scalar = amrex::Real(0.0);
377 static std::string horiz_mixing_type_string =
"analytic";
378 pp.queryAdd(
"horizontal_mixing_type", horiz_mixing_type_string);
379 if (amrex::toLower(horiz_mixing_type_string) ==
"analytical" ||
380 amrex::toLower(horiz_mixing_type_string) ==
"analytic") {
382 }
else if (amrex::toLower(horiz_mixing_type_string) ==
"constant") {
385 amrex::Abort(
"Don't know this horizontal mixing type");
387 pp.queryAdd(
"visc2",
visc2);
388 pp.queryAdd(
"tnu2_salt",tnu2_salt);
389 pp.queryAdd(
"tnu2_temp",tnu2_temp);
390 pp.queryAdd(
"tnu2_scalar",tnu2_scalar);
395 tnu2[2] = tnu2_scalar;
398 tnu2[1] = tnu2_scalar;
401 pp.queryAdd(
"Akk_bak",
Akk_bak);
402 pp.queryAdd(
"Akp_bak",
Akp_bak);
403 static std::string vert_mixing_type_string =
"analytic";
404 static std::string gls_stability_type_string =
"Canuto_A";
405 pp.queryAdd(
"vertical_mixing_type", vert_mixing_type_string);
406 pp.queryAdd(
"gls_stability_type", gls_stability_type_string);
407 if (amrex::toLower(vert_mixing_type_string) ==
"analytical" ||
408 amrex::toLower(vert_mixing_type_string) ==
"analytic") {
410 }
else if (amrex::toLower(vert_mixing_type_string) ==
"gls") {
412 if (amrex::toLower(gls_stability_type_string) ==
"canuto_a") {
415 else if (amrex::toLower(gls_stability_type_string) ==
"canuto_b") {
418 else if (amrex::toLower(gls_stability_type_string) ==
"galperin") {
422 amrex::Abort(
"Don't know this GLS stability type");
425 amrex::Abort(
"Don't know this vertical mixing type");
429 pp.queryAdd(
"gls_P",
gls_p);
430 pp.queryAdd(
"gls_M",
gls_m);
431 pp.queryAdd(
"gls_N",
gls_n);
436 pp.queryAdd(
"gls_c1",
gls_c1);
437 pp.queryAdd(
"gls_c2",
gls_c2);
438 pp.queryAdd(
"gls_c3m",
gls_c3m);
439 pp.queryAdd(
"gls_c3p",
gls_c3p);
445 gls_L1 = amrex::Real(0.107);
446 gls_L2 = amrex::Real(0.0032);
447 gls_L3 = amrex::Real(0.0864);
448 gls_L4 = amrex::Real(0.12);
449 gls_L5 = amrex::Real(11.9);
450 gls_L6 = amrex::Real(0.4);
451 gls_L7 = amrex::Real(0.0);
452 gls_L8 = amrex::Real(0.48);
456 gls_L1 = amrex::Real(0.127);
457 gls_L2 = amrex::Real(0.00336);
458 gls_L3 = amrex::Real(0.0906);
459 gls_L4 = amrex::Real(0.101);
460 gls_L5 = amrex::Real(11.2);
461 gls_L6 = amrex::Real(0.4);
462 gls_L7 = amrex::Real(0.0);
463 gls_L8 = amrex::Real(0.318);
472 amrex::Real tnudg = amrex::Real(0.0);
473 amrex::Real znudg = amrex::Real(0.0);
474 amrex::Real m2nudg = amrex::Real(0.0);
475 amrex::Real m3nudg = amrex::Real(0.0);
476 pp.queryAdd(
"tnudg",tnudg);
477 pp.queryAdd(
"znudg",znudg);
478 pp.queryAdd(
"m2nudg",m2nudg);
479 pp.queryAdd(
"m3nudg",m3nudg);
480 pp.queryAdd(
"obcfac",
obcfac);
483 nudg_coeff[
BdyVars::u ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
484 nudg_coeff[
BdyVars::v ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
485 nudg_coeff[
BdyVars::t ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
486 nudg_coeff[
BdyVars::s ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
499#ifndef REMORA_USE_NETCDF
501 amrex::Abort(
"Climatology nudging requires building with NetCDF");