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);
187 pp.queryAdd(
"air_pressure",
Pair);
188 pp.queryAdd(
"air_temperature",
Tair);
189 pp.queryAdd(
"air_humidity",
Hair);
190 pp.queryAdd(
"surface_radiation_flux",
srflux);
192 pp.queryAdd(
"cloud",
cloud);
193 pp.queryAdd(
"rain",
rain);
194 pp.queryAdd(
"blk_ZQ",
blk_ZQ);
195 pp.queryAdd(
"blk_ZT",
blk_ZT);
196 pp.queryAdd(
"blk_ZW",
blk_ZW);
197 pp.queryAdd(
"eminusp",
eminusp);
210 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)");
213 amrex::Abort(
"Evaporation minus precipitation (E-P) requires bulk flux parametrizations (remora.bulk_fluxes=true)");
218 pp.queryAdd(
"theta_s",
theta_s);
219 pp.queryAdd(
"theta_b",
theta_b);
220 pp.queryAdd(
"tcline",
tcline);
226 pp.queryAdd(
"Akv_bak",
Akv_bak);
227 pp.queryAdd(
"Akt_bak",
Akt_bak);
230 static std::string grid_scale_type_string =
"constant";
231 pp.queryAdd(
"grid_scale_type",grid_scale_type_string);
233 if (amrex::toLower(grid_scale_type_string) ==
"constant") {
235 }
else if (amrex::toLower(grid_scale_type_string) ==
"custom") {
236 amrex::Warning(
"Initialization of grid scale from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
238 }
else if (amrex::toLower(grid_scale_type_string) ==
"analytic") {
241 amrex::Error(
"Don't know this grid_scale_type");
244 static std::string ic_type_string =
"analytic";
245 bool found_ic_bc = pp.queryAdd(
"ic_bc_type", ic_type_string);
246 pp.queryAdd(
"ic_type", ic_type_string);
249 amrex::Warning(
"remora.ic_bc_type is now called remora.ic_type, and will eventually be deprecated");
252 if ( amrex::toLower(ic_type_string) ==
"custom") {
253 amrex::Warning(
"Problem initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
255 }
else if ( amrex::toLower(ic_type_string) ==
"analytic") {
257 }
else if ( amrex::toLower(ic_type_string) ==
"netcdf") {
259 }
else if ( amrex::toLower(ic_type_string) ==
"real") {
260 amrex::Warning(
"Problem initialization from NetCDF (remora.ic_type) is now called 'netcdf'. 'real' will be deprecated");
263 amrex::Error(
"Don't know this ic_type");
267 static std::string coupling_type_string =
"TwoWay";
268 pp.queryAdd(
"coupling_type",coupling_type_string);
269 if (amrex::toLower(coupling_type_string) ==
"twoway" ||
270 amrex::toLower(coupling_type_string) ==
"two_way") {
272 }
else if (amrex::toLower(coupling_type_string) ==
"oneway" ||
273 amrex::toLower(coupling_type_string) ==
"one_way") {
276 amrex::Abort(
"Dont know this coupling_type");
281 static std::string coriolis_type_string =
"beta_plane";
282 pp.queryAdd(
"coriolis_type",coriolis_type_string);
283 if ( amrex::toLower(coriolis_type_string) ==
"custom") {
284 amrex::Warning(
"Coriolis initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
286 }
else if ( amrex::toLower(coriolis_type_string) ==
"analytic") {
288 }
else if ((amrex::toLower(coriolis_type_string) ==
"beta_plane") ||
289 (amrex::toLower(coriolis_type_string) ==
"betaplane")) {
291 }
else if ( (amrex::toLower(coriolis_type_string) ==
"netcdf")) {
293 }
else if ( (amrex::toLower(coriolis_type_string) ==
"real")) {
294 amrex::Warning(
"Coriolis initialization from NetCDF is now called 'netcdf'. 'real' will be deprecated");
297 amrex::Abort(
"Don't know this coriolis_type");
301 static std::string smflux_type_string =
"analytic";
302 int smflux_specified = pp.queryAdd(
"smflux_type",smflux_type_string);
303 if ( amrex::toLower(smflux_type_string) ==
"custom") {
304 amrex::Warning(
"Surface momentum flux initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
306 }
else if ( amrex::toLower(smflux_type_string) ==
"analytic") {
308 }
else if ( amrex::toLower(smflux_type_string) ==
"netcdf") {
311 amrex::Abort(
"Don't know this smflux_type");
314 static std::string wind_type_string =
"analytic";
315 int wind_specified = pp.queryAdd(
"wind_type",wind_type_string);
316 if ( amrex::toLower(wind_type_string) ==
"custom") {
317 amrex::Warning(
"Surface wind initialization from prob.cpp is now called 'analytic'. 'custom' will be deprecated");
319 }
else if ( amrex::toLower(wind_type_string) ==
"analytic") {
321 }
else if ( amrex::toLower(wind_type_string) ==
"netcdf") {
324 amrex::Abort(
"Don't know this smflux_type");
327 if (wind_specified && smflux_specified) {
328 amrex::Abort(
"Cannot specify both wind and surface momentum flux");
331 static std::string mask_type_string =
"none";
334 mask_type_string =
"netcdf";
336 pp.queryAdd(
"mask_type", mask_type_string);
337 if (amrex::toLower(mask_type_string) ==
"none") {
339 }
else if (amrex::toLower(mask_type_string) ==
"analytic") {
341 }
else if (amrex::toLower(mask_type_string) ==
"netcdf") {
344 amrex::Abort(
"Don't know this mask_type");
347 static std::string bottom_stress_type_string =
"linear";
348 pp.queryAdd(
"bottom_stress_type", bottom_stress_type_string);
349 if (amrex::toLower(bottom_stress_type_string) ==
"linear") {
351 }
else if (amrex::toLower(bottom_stress_type_string) ==
"quadratic") {
353 }
else if (amrex::toLower(bottom_stress_type_string) ==
"logarithmic") {
356 amrex::Abort(
"Don't know this bottom_stress_type");
359 amrex::Real tnu2_salt = amrex::Real(0.0);
360 amrex::Real tnu2_temp = amrex::Real(0.0);
361 amrex::Real tnu2_scalar = amrex::Real(0.0);
362 static std::string horiz_mixing_type_string =
"analytic";
363 pp.queryAdd(
"horizontal_mixing_type", horiz_mixing_type_string);
364 if (amrex::toLower(horiz_mixing_type_string) ==
"analytical" ||
365 amrex::toLower(horiz_mixing_type_string) ==
"analytic") {
367 }
else if (amrex::toLower(horiz_mixing_type_string) ==
"constant") {
370 amrex::Abort(
"Don't know this horizontal mixing type");
372 pp.queryAdd(
"visc2",
visc2);
373 pp.queryAdd(
"tnu2_salt",tnu2_salt);
374 pp.queryAdd(
"tnu2_temp",tnu2_temp);
375 pp.queryAdd(
"tnu2_scalar",tnu2_scalar);
380 tnu2[2] = tnu2_scalar;
383 tnu2[1] = tnu2_scalar;
386 pp.queryAdd(
"Akk_bak",
Akk_bak);
387 pp.queryAdd(
"Akp_bak",
Akp_bak);
388 static std::string vert_mixing_type_string =
"analytic";
389 static std::string gls_stability_type_string =
"Canuto_A";
390 pp.queryAdd(
"vertical_mixing_type", vert_mixing_type_string);
391 pp.queryAdd(
"gls_stability_type", gls_stability_type_string);
392 if (amrex::toLower(vert_mixing_type_string) ==
"analytical" ||
393 amrex::toLower(vert_mixing_type_string) ==
"analytic") {
395 }
else if (amrex::toLower(vert_mixing_type_string) ==
"gls") {
397 if (amrex::toLower(gls_stability_type_string) ==
"canuto_a") {
400 else if (amrex::toLower(gls_stability_type_string) ==
"canuto_b") {
403 else if (amrex::toLower(gls_stability_type_string) ==
"galperin") {
407 amrex::Abort(
"Don't know this GLS stability type");
410 amrex::Abort(
"Don't know this vertical mixing type");
414 pp.queryAdd(
"gls_P",
gls_p);
415 pp.queryAdd(
"gls_M",
gls_m);
416 pp.queryAdd(
"gls_N",
gls_n);
421 pp.queryAdd(
"gls_c1",
gls_c1);
422 pp.queryAdd(
"gls_c2",
gls_c2);
423 pp.queryAdd(
"gls_c3m",
gls_c3m);
424 pp.queryAdd(
"gls_c3p",
gls_c3p);
430 gls_L1 = amrex::Real(0.107);
431 gls_L2 = amrex::Real(0.0032);
432 gls_L3 = amrex::Real(0.0864);
433 gls_L4 = amrex::Real(0.12);
434 gls_L5 = amrex::Real(11.9);
435 gls_L6 = amrex::Real(0.4);
436 gls_L7 = amrex::Real(0.0);
437 gls_L8 = amrex::Real(0.48);
441 gls_L1 = amrex::Real(0.127);
442 gls_L2 = amrex::Real(0.00336);
443 gls_L3 = amrex::Real(0.0906);
444 gls_L4 = amrex::Real(0.101);
445 gls_L5 = amrex::Real(11.2);
446 gls_L6 = amrex::Real(0.4);
447 gls_L7 = amrex::Real(0.0);
448 gls_L8 = amrex::Real(0.318);
457 amrex::Real tnudg = amrex::Real(0.0);
458 amrex::Real znudg = amrex::Real(0.0);
459 amrex::Real m2nudg = amrex::Real(0.0);
460 amrex::Real m3nudg = amrex::Real(0.0);
461 pp.queryAdd(
"tnudg",tnudg);
462 pp.queryAdd(
"znudg",znudg);
463 pp.queryAdd(
"m2nudg",m2nudg);
464 pp.queryAdd(
"m3nudg",m3nudg);
465 pp.queryAdd(
"obcfac",
obcfac);
468 nudg_coeff[
BdyVars::u ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
469 nudg_coeff[
BdyVars::v ] = (m3nudg > 0.0) ? amrex::Real(1.0) / (m3nudg * amrex::Real(86400.0)) : 0.0;
470 nudg_coeff[
BdyVars::t ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
471 nudg_coeff[
BdyVars::s ] = ( tnudg > 0.0) ? amrex::Real(1.0) / ( tnudg * amrex::Real(86400.0)) : 0.0;
484#ifndef REMORA_USE_NETCDF
486 amrex::Abort(
"Climatology nudging requires building with NetCDF");