REMORA
Regional Modeling of Oceans Refined Adaptively
Loading...
Searching...
No Matches
REMORA.H
Go to the documentation of this file.
1#ifndef REMORA_H_
2#define REMORA_H_
3
4#include <string>
5#include <limits>
6#include <array>
7#include <memory>
8
9#ifdef _OPENMP
10#include <omp.h>
11#endif
12
13#include <AMReX_AmrCore.H>
14#include <AMReX_BCRec.H>
15#include <AMReX_InterpFaceRegister.H>
16
17#include <AMReX_ParallelDescriptor.H>
18#include <AMReX_ParmParse.H>
19#include <AMReX_MultiFabUtil.H>
20#include <AMReX_FillPatchUtil.H>
21#include <AMReX_VisMF.H>
22#include <AMReX_PhysBCFunct.H>
23#include <AMReX_YAFluxRegister.H>
24#include <AMReX_ErrorList.H>
25
26#ifdef AMREX_MEM_PROFILING
27#include <AMReX_MemProfiler.H>
28#endif
29
30#include <REMORA_Math.H>
31#include <REMORA_PhysBCFunct.H>
32#include <REMORA_FillPatcher.H>
33
34#include <REMORA_IndexDefines.H>
36#include <REMORA_DataStruct.H>
37#include <REMORA_Derive.H>
38#include "REMORA_prob_common.H"
39
40#ifdef REMORA_USE_PARTICLES
41#include "REMORA_ParticleData.H"
42#endif
43
44#ifdef REMORA_USE_NETCDF
45#include "REMORA_NCInterface.H"
46#include "REMORA_NCTimeSeries.H"
49#endif
50
51#ifdef REMORA_USE_MOAB
52#include "REMORA_MOAB.H"
53#endif
55#include <iostream>
57#ifdef AMREX_LAZY
58#include <AMReX_Lazy.H>
59#endif
60
61#ifndef AMREX_USE_MPI
62using amrex::MPI_COMM_WORLD;
63using amrex::MPI_Comm;
64#endif
65
77
78// Forward declarations to resolve circular dependency
79class ProblemBase;
80#ifdef REMORA_USE_NETCDF
81class NCTimeSeries;
84#endif
85
86/*!
87 * \brief Class that stores all relevant simulation state data with methods for time stepping
88 */
89class REMORA
90 : public amrex::AmrCore
91{
92public:
93
94 REMORA ();
95 REMORA (const amrex::RealBox& rb, int max_level_in, const amrex::Vector<int>& n_cell_in, int coord, const amrex::Vector<amrex::IntVect>& ref_ratio, const amrex::Array<int,AMREX_SPACEDIM>& is_per, std::string prefix);
96 virtual ~REMORA ();
97
98 /** \brief Advance solution to final time */
99 void Evolve ();
100
101 /** \brief Write checkpoint and plotfiles at end of simulation */
102 void WriteAtFinalTime ();
103
104 /** \brief Write checkpoint and plotfiles at intermediate point of simulation, if needed */
105 void WriteAtIntermediateTime (int step, amrex::Real cur_time);
106
107 /** \brief Tag cells for refinement */
108 virtual void ErrorEst (int lev, amrex::TagBoxArray& tags, amrex::Real time, int ngrow) override;
109
110 /** \brief Initialize multilevel data */
111 void InitData ();
112 amrex::Real EvolveOneStep (amrex::Real time, amrex::Real dt_request);
113
114 /** \brief Init (NOT restart or regrid) */
115 void init_only (int lev, amrex::Real time);
116
117 /** \briefRestart */
118 void restart ();
119
120 /** \brief Called after every level 0 timestep */
121 void post_timestep (int nstep, amrex::Real time, amrex::Real dt_lev);
122
123 /**
124 * \brief Extracts SST from the 3D conservative state for the atmospheric driver.
125 *
126 * Reads Temp_comp at the top water-column cell (k_sfc), converts from
127 * Celsius to Kelvin, and copies the result into state[SSTIndex].
128 *
129 * @param[in,out] state OCN2ATM slab buffer sized by the driver (one MultiFab
130 * per ocean-to-atmosphere export layer). state[SSTIndex]
131 * (index 0) is overwritten with sea-surface temperature
132 * (SST) sampled from the Temp_comp tracer at the uppermost
133 * sigma level (k = Nz) and converted from degrees Celsius
134 * to Kelvin for the atmospheric driver. An empty vector or
135 * null state[0] is treated as a no-op.
136 * @param[in ] time Current ocean model time (unused; retained for driver
137 * interface conformance).
138 */
139 void PackSurfaceState (amrex::Vector<amrex::MultiFab*>& state, amrex::Real time);
140
141 /**
142 * \brief Receives atmospheric states from the driver and applies unit conversions.
143 *
144 * Fills REMORA's internal forcing MultiFabs from states and records which
145 * lanes were successfully updated in driver_atmos_state_from_driver.
146 * Unit conversions applied: Pair Pa to mb; Tair K to Celsius.
147 *
148 * @param[in] states ATM2OCN forcing slab buffer from the driver (Warner et al.
149 * 2010, Block B state-passing contract), indexed by AtmosState.
150 * Expected units per lane:
151 * Uwind/Vwind: 10-m winds [m/s];
152 * Pair: mean sea-level pressure [Pa, converted to mb];
153 * Qair: near-surface specific humidity [kg/kg];
154 * Tair: 2-m air temperature [K, converted to degC];
155 * Cloud: cloud fraction [0-1];
156 * Rain: precipitation rate [kg/m^2/s];
157 * SWrad/LWrad: downwelling shortwave/longwave radiation [W/m^2].
158 * Missing lanes (null pointer or index out of range) are skipped;
159 * driver_atmos_state_from_driver tracks populated lanes for the
160 * bulk-flux parameterization fallback logic.
161 * @param[in] time Current ocean model time (unused; retained for driver
162 * interface conformance).
163 */
164 void ApplyAtmosphericStates (const amrex::Vector<amrex::MultiFab*>& states, amrex::Real time);
165
166 /**
167 * \brief Receives atmospheric flux lanes from the driver and assembles REMORA flux inputs.
168 *
169 * Expected active-lane order matches the driver FluxPassing contract:
170 * tau_x, tau_y, SHflux, LHflux, SWrad, LWrad, rain, evap.
171 *
172 * This routine copies imported forcing lanes into REMORA's existing flux arrays
173 * and assembles vec_stflux directly from those imported values. It intentionally
174 * leaves the downstream salt_old multiplication to setup_step().
175 */
176 void ApplyAtmosphericFluxes (const amrex::Vector<amrex::MultiFab*>& states, amrex::Real time);
177
178 // Diagnostics
179
180 /** \brief Integrate conserved quantities for diagnostics */
181 void sum_integrated_quantities (amrex::Real time);
182
183 /** \brief Perform the volume-weighted sum */
184 amrex::Real
185 volWgtSumMF (int lev,
186 const amrex::MultiFab& mf, int comp, bool local, bool finemask);
187
188 /** \brief Decide if it is time to take an action */
189 bool is_it_time_for_action (int nstep, amrex::Real time, amrex::Real dt,
190 int action_interval, amrex::Real action_per);
191
192 /** \brief Make a new level using provided BoxArray and DistributionMapping and
193 * fill with interpolated coarse level data.
194 * Overrides the pure virtual function in AmrCore
195 */
196 virtual void MakeNewLevelFromCoarse (int lev, amrex::Real time, const amrex::BoxArray& ba,
197 const amrex::DistributionMapping& dm) override;
198
199 /** \brief Remake an existing level using provided BoxArray and DistributionMapping and
200 * fill with existing fine and coarse data.
201 * Overrides the pure virtual function in AmrCore
202 */
203 virtual void RemakeLevel (int lev, amrex::Real time, const amrex::BoxArray& ba,
204 const amrex::DistributionMapping& dm) override;
205
206 /** \brief Delete level data
207 * Overrides the pure virtual function in AmrCore
208 */
209 virtual void ClearLevel (int lev) override;
210
211 /** \brief Make a new level from scratch using provided BoxArray and DistributionMapping.
212 * Only used during initialization.
213 * Overrides the pure virtual function in AmrCore
214 */
215 virtual void MakeNewLevelFromScratch (int lev, amrex::Real time, const amrex::BoxArray& ba,
216 const amrex::DistributionMapping& dm) override;
217
218 /** \brief Set pm and pn arrays and x/y coords on level lev */
219 void set_grid_scale (int lev);
220
221 /** \brief Set x/y coords on level lev based on pm and pn */
222 void set_grid_coords_from_grid_scale (int lev);
223
224 /** \brief Set curvilinear derivative terms on level lev based on pm and pn */
226
227 /** \brief Set pm/pn by averaging down from higher-resolution grid */
228 void set_grid_vars_averaged_down (int lev);
229
230 /** \brief Set zeta components to be equal to time-averaged Zt_avg1 */
231 void set_zeta_to_Ztavg (int lev);
232
233 /** \brief Calculate u-, v-, and psi-point masks based on rho-point masks after analytic initialization */
234 void calculate_nodal_masks (int lev);
235
236 /** \brief Copy maskr to all z levels */
237 void fill_3d_masks (int lev);
238
239 /** \brief Set psi-point mask to be consistent with rho-point mask */
240 void update_mskp (int lev);
241
242 /** \brief compute dt from CFL considerations */
243 amrex::Real estTimeStep (int lev) const;
244
245 /** \brief Interface for advancing the data at one level by one "slow" timestep */
246 void remora_advance(int level,
247 amrex::MultiFab& cons_old, amrex::MultiFab& cons_new,
248 amrex::MultiFab& xvel_old, amrex::MultiFab& yvel_old, amrex::MultiFab& zvel_old,
249 amrex::MultiFab& xvel_new, amrex::MultiFab& yvel_new, amrex::MultiFab& zvel_new,
250 amrex::MultiFab& source,
251 const amrex::Geometry fine_geom,
252 const amrex::Real dt, const amrex::Real time);
253
254 /** \brief Make mask to zero out covered cells (for mesh refinement) */
255 amrex::MultiFab& build_fine_mask(int lev);
256
257 /** \brief main driver for writing AMReX plotfiles */
258 void WritePlotFile (int istep);
259
260 /** \brief write out particular data to an AMReX plotfile */
261 void WriteMultiLevelPlotfileWithBathymetry (const std::string &plotfilename,
262 int nlevels,
263 const amrex::Vector<const amrex::MultiFab*> &mf,
264 const amrex::Vector<const amrex::MultiFab*> &mf_nd,
265 const amrex::Vector<const amrex::MultiFab*> &mf_u,
266 const amrex::Vector<const amrex::MultiFab*> &mf_v,
267 const amrex::Vector<const amrex::MultiFab*> &mf_w,
268 const amrex::Vector<const amrex::MultiFab*> &mf_2d_rho,
269 const amrex::Vector<const amrex::MultiFab*> &mf_2d_u,
270 const amrex::Vector<const amrex::MultiFab*> &mf_2d_v,
271 const amrex::Vector<std::string> &varnames_3d,
272 const amrex::Vector<std::string> &varnames_2d_rho,
273 const amrex::Vector<std::string> &varnames_2d_u,
274 const amrex::Vector<std::string> &varnames_2d_v,
275 const amrex::Vector<amrex::Geometry>& my_geom,
276 amrex::Real time,
277 const amrex::Vector<int> &level_steps,
278 const amrex::Vector<amrex::IntVect>& rr,
279 const std::string &versionName = "HyperCLaw-V1.1",
280 const std::string &levelPrefix = "Level_",
281 const std::string &mfPrefix = "Cell",
282 const amrex::Vector<std::string>& extra_dirs = amrex::Vector<std::string>()) const;
283
284
285
286 /** \brief write out header data for an AMReX plotfile */
287 void WriteGenericPlotfileHeaderWithBathymetry (std::ostream &HeaderFile,
288 int nlevels,
289 const amrex::Vector<amrex::BoxArray> &bArray,
290 const amrex::Vector<std::string> &varnames_3d,
291 const amrex::Vector<std::string> &varnames_2d_rho,
292 const amrex::Vector<std::string> &varnames_2d_u,
293 const amrex::Vector<std::string> &varnames_2d_v,
294 const amrex::Vector<amrex::Geometry>& my_geom,
295 amrex::Real time,
296 const amrex::Vector<int> &level_steps,
297 const amrex::Vector<amrex::IntVect>& rr,
298 const std::string &versionName,
299 const std::string &levelPrefix,
300 const std::string &mfPrefix) const;
301
302 /** \brief default prefix for input file parameters */
303 std::string pp_prefix {"remora"};
304
305 /** \brief multilevel data container for last step's scalar data: temperature, salinity, passive tracer */
306 amrex::Vector<amrex::MultiFab*> cons_old;
307 /** \brief multilevel data container for last step's x velocities (u in ROMS) */
308 amrex::Vector<amrex::MultiFab*> xvel_old;
309 /** \brief multilevel data container for last step's y velocities (v in ROMS) */
310 amrex::Vector<amrex::MultiFab*> yvel_old;
311 /** \brief multilevel data container for last step's z velocities (largely unused; W stored separately) */
312 amrex::Vector<amrex::MultiFab*> zvel_old;
313
314 /** \brief multilevel data container for current step's scalar data: temperature, salinity, passive tracer */
315 amrex::Vector<amrex::MultiFab*> cons_new;
316 /** \brief multilevel data container for current step's x velocities (u in ROMS) */
317 amrex::Vector<amrex::MultiFab*> xvel_new;
318 /** \brief multilevel data container for current step's y velocities (v in ROMS) */
319 amrex::Vector<amrex::MultiFab*> yvel_new;
320 /** \brief multilevel data container for current step's z velocities (largely unused; W stored separately) */
321 amrex::Vector<amrex::MultiFab*> zvel_new;
322
323 /** \brief multilevel data container for high res initial data: temperature, salinity, passive tracer */
324 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_cons_full_domain;
325 /** \brief multilevel data container for high res initial x velocities (u in ROMS) */
326 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_xvel_full_domain;
327 /** \brief multilevel data container for high res initial y velocities (v in ROMS) */
328 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_yvel_full_domain;
329 /** \brief multilevel data container for current step's z velocities (largely unused; W stored separately) */
330
331 // Program state data is represented by vectors of pointers to AMReX Multifabs.
332 // There is one pointer per level
333
334 /** \brief Bathymetry data (2D, positive valued, h in ROMS) **/
335 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_h;
336
337 /** \brief Bathymetry data on the whole domain at each potential level **/
338 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_h_full_domain;
339
340 /** \brief Width of cells in the vertical (z-) direction (3D, Hz in ROMS) */
341 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Hz;
342 /** \brief u-volume flux (3D) */
343 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Huon;
344 /** \brief v-volume flux (3D) */
345 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Hvom;
346 /** \brief u velocity RHS (3D, includes horizontal and vertical advection) */
347 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_ru;
348 /** \brief v velocity RHS (3D, includes horizontal and vertical advection) */
349 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rv;
350 /** \brief u velocity RHS (2D, includes horizontal and vertical advection) */
351 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_ru2d;
352 /** \brief v velocity RHS (2D, includes horizontal and vertical advection) */
353 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rv2d;
354 /** \brief u velocity RHS, integrated, including advection and bottom/surface stresses (2D) */
355 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rufrc;
356 /** \brief v velocity RHS, integrated, including advection and bottom/surface stresses (2D) */
357 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rvfrc;
358 /** \brief Vertical viscosity coefficient (3D) */
359 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Akv;
360 /** \brief Vertical diffusion coefficient (3D) */
361 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Akt;
362 /** \brief Harmonic viscosity defined on the psi points (corners of horizontal grid cells) */
363 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_visc2_p;
364 /** \brief Harmonic viscosity defined on the rho points (centers) */
365 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_visc2_r;
366 /** \brief Harmonic diffusivity for temperature / salinity */
367 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_diff2;
368
369 /** \brief z coordinates at rho points (cell centers) */
370 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_z_r;
371
372 /** \brief z coordinates at w points (faces between z-cells) */
373 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_z_w;
374 /** \brief Scaled vertical coordinate (range [0,1]) that transforms to z, defined at rho points (cell centers) */
375 amrex::Gpu::DeviceVector<amrex::Real> s_r;
376 /** \brief Scaled vertical coordinate (range [0,1]) that transforms to z, defined at w-points (cell faces) */
377 amrex::Gpu::DeviceVector<amrex::Real> s_w;
378
379 //amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_s_r;
380 //amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_s_w;
381 //amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Cs_r;
382 //amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Cs_w;
383
384 /** \brief Stretching coefficients at rho points */
385 amrex::Gpu::DeviceVector<amrex::Real> Cs_r;
386 /** \brief Stretching coefficients at w points */
387 amrex::Gpu::DeviceVector<amrex::Real> Cs_w;
388
389 /** \brief z coordinates at psi points (cell nodes) **/
390 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_z_phys_nd;
391
392 /** \brief Average of the free surface, zeta (2D) */
393 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Zt_avg1;
394
395 /** \brief Surface stress in the u direction */
396 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_sustr;
397 /** \brief Surface stress in the v direction */
398 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_svstr;
399
400 /** \brief Wind in the u direction, defined at rho-points */
401 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_uwind;
402 /** \brief Wind in the v direction, defined at rho-points */
403 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_vwind;
404 /** \brief Air temperature [°C], defined at rho-points */
405 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Tair;
406 /** \brief Specific humidity [kg/kg], defined at rho-points */
407 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_qair;
408 /** \brief Air pressure [mb], defined at rho-points */
409 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Pair;
410
411 /** \brief Shortwave radiation flux [W/m²], defined at rho-points */
412 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_srflx;
413 /** \brief longwave radiation */
414 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_lrflx;
415 /** \brief Downward longwave radiation */
416 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_longwave_down;
417 /** \brief latent heat flux */
418 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_lhflx;
419 /** \brief sensible heat flux */
420 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_shflx;
421
422 /** \brief Surface tracer flux; working arrays */
423 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_stflx;
424 /** \brief Surface tracer flux; input arrays */
425 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_stflux;
426 /** \brief Bottom tracer flux; working arrays */
427 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_btflx;
428 /** \brief Bottom tracer flux; input arrays */
429 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_btflux;
430
431 /** \brief precipitation rate [kg/m^2/s] */
432 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rain;
433 /** \brief evaporation rate [kg/m^2/s] */
434 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_evap;
435 /** \brief cloud cover fraction [0-1], defined at rho-points */
436 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_cloud;
437 /** \brief evaporation minus precipitation [kg/m^2/s], defined at rho-points */
438 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_EminusP;
439
440 /** \brief provenance flags for driver-supplied atmospheric forcing lanes */
441 std::array<bool, AtmosState::NumTypes> driver_atmos_state_from_driver {};
442
443 /** \brief Linear drag coefficient [m/s], defined at rho points */
444 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rdrag;
445 /** \brief Quadratic drag coefficient [unitless], defined at rho points */
446 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rdrag2;
447 /** \brief Bottom roughness length [m], defined at rho points */
448 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_ZoBot;
449
450 /** \brief Bottom stress in the u direction */
451 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_bustr;
452 /** \brief Bottom stress in the v direction */
453 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_bvstr;
454
455 /** \brief time average of barotropic x velocity flux (2D) */
456 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_DU_avg1;
457 /** \brief correct time average of barotropic x velocity flux for coupling (2D) */
458 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_DU_avg2;
459 /** \brief time average of barotropic y velocity flux */
460 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_DV_avg1;
461 /** \brief correct time average of barotropic y velocity flux for coupling (2D) */
462 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_DV_avg2;
463 /** \brief barotropic x velocity for the RHS (2D) */
464 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rubar;
465 /** \brief barotropic y velocity for the RHS (2D) */
466 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rvbar;
467 /** \brief free surface height for the RHS (2D) */
468 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rzeta;
469 /** \brief barotropic x velocity (2D) */
470 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_ubar;
471 /** \brief barotropic y velocity (2D) */
472 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_vbar;
473 /** \brief free surface height (2D) */
474 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_zeta;
475
476 /** \brief high resolution initial free surface height (2D) */
477 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_zeta_full_domain;
478
479 /** \brief land/sea mask at cell centers (2D) */
480 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_mskr;
481 /** \brief land/sea mask at x-faces (2D) */
482 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_msku;
483 /** \brief land/sea mask at y-faces (2D) */
484 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_mskv;
485 /** \brief land/sea mask at cell corners (2D) */
486 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_mskp;
487 /** \brief land/sea mask at cell centers, copied to all z levels (3D) */
488 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_mskr3d;
489
490 /** \brief horizontal scaling factor: 1 / dx (2D) */
491 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_pm;
492 /** \brief horizontal scaling factor: 1 / dy (2D) */
493 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_pn;
494 /** \brief horizontal scaling factor: 1 / dx (2D) on whole domain */
495 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_pm_full_domain;
496 /** \brief horizontal scaling factor: 1 / dy (2D) on whole domain */
497 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_pn_full_domain;
498
499 /** \brief coriolis factor (2D) */
500 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_fcor;
501
502 /** \brief x_grid on rho points (2D) */
503 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_xr;
504 /** \brief y_grid on rho points (2D) */
505 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_yr;
506
507 /** \brief x_grid on u-points (2D) */
508 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_xu;
509 /** \brief y_grid on u-points (2D) */
510 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_yu;
511
512 /** \brief x_grid on v-points (2D) */
513 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_xv;
514 /** \brief y_grid on v-points (2D) */
515 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_yv;
516
517 /** \brief x_grid on psi-points (2D) */
518 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_xp;
519 /** \brief y_grid on psi-points (2D) */
520 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_yp;
521
522 /** \brief d(1/n)/d(xi) */
523 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_dndx;
524 /** \brief d(1/m)/d(eta) */
525 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_dmde;
526
527 /** \brief additional scratch space for calculations on temp, salt, etc */
528 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_sstore;
529
530 /** \brief density perturbation */
531 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rhoS;
532 /** \brief vertically-averaged density */
533 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_rhoA;
534 /** \brief Brunt-Vaisala frequency (3D) */
535 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_bvf;
536 /** \brief Thermal expansion coefficient (3D) */
537 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_alpha;
538 /** \brief Saline contraction coefficient (3D) */
539 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_beta;
540
541 /** \brief Weights for calculating avg1 in 2D advance */
542 amrex::Vector<amrex::Real> vec_weight1;
543 /** \brief Weights for calculating avg2 in 2D advance */
544 amrex::Vector<amrex::Real> vec_weight2;
545
546 // GLS
547 /** \brief Turbulent kinetic energy */
548 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_tke;
549 /** \brief Turbulent generic length scale */
550 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_gls;
551 /** \brief Vertical mixing turbulent length scale */
552 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Lscale;
553 /** \brief Turbulent kinetic energy vertical diffusion coefficient */
554 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Akk;
555 /** \brief Turbulent length scale vertical diffusion coefficient */
556 amrex::Vector<std::unique_ptr<amrex::MultiFab>> vec_Akp;
557
558 /** \brief Climatology nudging coefficients */
559 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab>>> vec_nudg_coeff;
560
561 /** \brief advance a single level for a single time step */
562 void Advance (int lev, amrex::Real time, amrex::Real dt_lev, int iteration, int ncycle);
563
564 /** \brief Set everything up for a step on a level */
565 void setup_step(int lev, amrex::Real time, amrex::Real dt_lev);
566
567 /** \brief 3D advance on a single level */
568 void advance_3d_ml (int lev, amrex::Real dt_lev);
569
570 /** \brief 2D advance, one predictor/corrector step */
571 void advance_2d_onestep (int lev, amrex::Real dt_lev, amrex::Real dtfast_lev, int my_iif, int nfast_counter);
572
573 /** \brief Perform a 2D predictor (predictor_2d_step=True) or corrector (predictor_2d_step=False) step */
574 void advance_2d (int lev,
575 amrex::MultiFab const* mf_rhoS,
576 amrex::MultiFab const* mf_rhoA,
577 amrex::MultiFab * mf_ru2d,
578 amrex::MultiFab * mf_rv2d,
579 amrex::MultiFab * mf_rufrc,
580 amrex::MultiFab * mf_rvfrc,
581 amrex::MultiFab * mf_Zt_avg1,
582 std::unique_ptr<amrex::MultiFab>& mf_DU_avg1,
583 std::unique_ptr<amrex::MultiFab>& mf_DU_avg2,
584 std::unique_ptr<amrex::MultiFab>& mf_DV_avg1,
585 std::unique_ptr<amrex::MultiFab>& mf_DV_avg2,
586 std::unique_ptr<amrex::MultiFab>& mf_rubar,
587 std::unique_ptr<amrex::MultiFab>& mf_rvbar,
588 std::unique_ptr<amrex::MultiFab>& mf_rzeta,
589 std::unique_ptr<amrex::MultiFab>& mf_ubar,
590 std::unique_ptr<amrex::MultiFab>& mf_vbar,
591 amrex::MultiFab * mf_zeta,
592 amrex::MultiFab const* mf_h,
593 amrex::MultiFab const* mf_pm,
594 amrex::MultiFab const* mf_pn,
595 amrex::MultiFab const* mf_fcor,
596 amrex::MultiFab const* mf_visc2_p,
597 amrex::MultiFab const* mf_visc2_r,
598 amrex::MultiFab const* mf_mskr,
599 amrex::MultiFab const* mf_msku,
600 amrex::MultiFab const* mf_mskv,
601 amrex::MultiFab const* mf_mskp,
602 amrex::Real dtfast_lev,
603 bool predictor_2d_step,
604 bool first_2d_step, int my_iif,
605 int & next_indx1);
606
607 /** \brief Advance the 3D variables */
608 void advance_3d (int lev,
609 amrex::MultiFab& mf_cons,
610 amrex::MultiFab& mf_u , amrex::MultiFab& mf_v,
611 amrex::MultiFab* mf_sstore,
612 amrex::MultiFab* mf_ru , amrex::MultiFab* mf_rv,
613 std::unique_ptr<amrex::MultiFab>& mf_DU_avg1,
614 std::unique_ptr<amrex::MultiFab>& mf_DU_avg2,
615 std::unique_ptr<amrex::MultiFab>& mf_DV_avg1,
616 std::unique_ptr<amrex::MultiFab>& mf_DV_avg2,
617 std::unique_ptr<amrex::MultiFab>& mf_ubar,
618 std::unique_ptr<amrex::MultiFab>& mf_vbar,
619 std::unique_ptr<amrex::MultiFab>& mf_Akv,
620 std::unique_ptr<amrex::MultiFab>& mf_Akt,
621 std::unique_ptr<amrex::MultiFab>& mf_Hz,
622 std::unique_ptr<amrex::MultiFab>& mf_Huon,
623 std::unique_ptr<amrex::MultiFab>& mf_Hvom,
624 std::unique_ptr<amrex::MultiFab>& mf_z_w,
625 amrex::MultiFab const* mf_h,
626 amrex::MultiFab const* mf_pm,
627 amrex::MultiFab const* mf_pn,
628 amrex::MultiFab const* mf_mskr,
629 amrex::MultiFab const* mf_msku,
630 amrex::MultiFab const* mf_mskv,
631 const int N,
632 const amrex::Real dt_lev);
633
634 /** \brief Calculate bulk temperature, salinity, wind fluxes */
635 void bulk_fluxes (int lev,
636 amrex::MultiFab* mf_cons,
637 amrex::MultiFab* mf_uwind,
638 amrex::MultiFab* mf_vwind,
639 amrex::MultiFab* mf_Tair,
640 amrex::MultiFab* mf_qair,
641 amrex::MultiFab* mf_Pair,
642 amrex::MultiFab* mf_srflx,
643 amrex::MultiFab* mf_longwave_down,
644 amrex::MultiFab* mf_evap,
645 amrex::MultiFab* mf_sustr,
646 amrex::MultiFab* mf_svstr,
647 amrex::MultiFab* mf_stflux,
648 amrex::MultiFab* mf_lrflx,
649 amrex::MultiFab* mf_lhflx,
650 amrex::MultiFab* mf_shflx,
651 const int N);
652
653 /** \brief Wrapper function for prestep */
654 void prestep (int lev,
655 amrex::MultiFab& mf_uold, amrex::MultiFab& mf_vold,
656 amrex::MultiFab& mf_u, amrex::MultiFab& mf_v,
657 amrex::MultiFab* mf_ru,
658 amrex::MultiFab* mf_rv,
659 amrex::MultiFab& S_old,
660 amrex::MultiFab& S_new,
661 amrex::MultiFab& mf_W, amrex::MultiFab& mf_DC,
662 /* MF mf_FC? */
663 const amrex::MultiFab* mf_z_r,
664 const amrex::MultiFab* mf_z_w,
665 const amrex::MultiFab* mf_h,
666 const amrex::MultiFab* mf_pm,
667 const amrex::MultiFab* mf_pn,
668 const amrex::MultiFab* mf_sustr,
669 const amrex::MultiFab* mf_svstr,
670 const amrex::MultiFab* mf_bustr,
671 const amrex::MultiFab* mf_bvstr,
672 const amrex::MultiFab* mf_msku,
673 const amrex::MultiFab* mf_mskv,
674 const int iic, const int nfirst,
675 const int nnew, int nstp, int nrhs,
676 int N, const amrex::Real dt_lev);
677
678 /** \brief Prestep advection calculations for the tracers */
679 void prestep_t_advection (int lev, const amrex::Box& tbx,
680 const amrex::Box& gbx,
681 const amrex::Array4<amrex::Real >& tempold,
682 const amrex::Array4<amrex::Real >& tempcache,
683 const amrex::Array4<amrex::Real >& Hz,
684 const amrex::Array4<amrex::Real >& Huon,
685 const amrex::Array4<amrex::Real >& Hvom,
686 const amrex::Array4<amrex::Real >& W,
687 const amrex::Array4<amrex::Real >& DC,
688 const amrex::Array4<amrex::Real >& FC,
689 const amrex::Array4<amrex::Real >& sstore,
690 const amrex::Array4<amrex::Real const>& z_w,
691 const amrex::Array4<amrex::Real const>& h,
692 const amrex::Array4<amrex::Real const>& pm,
693 const amrex::Array4<amrex::Real const>& pn,
694 const amrex::Array4<amrex::Real const>& msku,
695 const amrex::Array4<amrex::Real const>& mskv,
696 const amrex::Array4<int const>& river_pos,
697 const amrex::Array4<amrex::Real const>& river_source,
698 int iic, int ntfirst, int nrhs, int N,
699 const amrex::Real dt_lev);
700
701 /** \brief RHS terms for tracer */
702 void rhs_t_3d (int lev,
703 const amrex::Box& bx,
704 const amrex::Array4<amrex::Real >& t,
705 const amrex::Array4<amrex::Real const>& tempstore,
706 const amrex::Array4<amrex::Real const>& Huon,
707 const amrex::Array4<amrex::Real const>& Hvom,
708 const amrex::Array4<amrex::Real const>& Hz,
709 const amrex::Array4<amrex::Real const>& pn,
710 const amrex::Array4<amrex::Real const>& pm,
711 const amrex::Array4<amrex::Real const>& W,
712 const amrex::Array4<amrex::Real >& FC,
713 const amrex::Array4<amrex::Real const>& mskr,
714 const amrex::Array4<amrex::Real const>& msku,
715 const amrex::Array4<amrex::Real const>& mskv,
716 const amrex::Array4<int const>& river_pos,
717 const amrex::Array4<amrex::Real const>& river_source,
718 int nrhs, int nnew, int N, const amrex::Real dt_lev);
719
720 /** \brief RHS terms for 3D momentum */
721 void rhs_uv_3d (int lev,
722 const amrex::Box& xbx,
723 const amrex::Box& ybx,
724 const amrex::Array4<amrex::Real const>& uold,
725 const amrex::Array4<amrex::Real const>& vold,
726 const amrex::Array4<amrex::Real >& ru,
727 const amrex::Array4<amrex::Real >& rv,
728 const amrex::Array4<amrex::Real >& rufrc,
729 const amrex::Array4<amrex::Real >& rvfrc,
730 const amrex::Array4<amrex::Real const>& sustr,
731 const amrex::Array4<amrex::Real const>& svstr,
732 const amrex::Array4<amrex::Real const>& bustr,
733 const amrex::Array4<amrex::Real const>& bvstr,
734 const amrex::Array4<amrex::Real const>& Huon,
735 const amrex::Array4<amrex::Real const>& Hvom,
736 const amrex::Array4<amrex::Real const>& pm,
737 const amrex::Array4<amrex::Real const>& pn,
738 const amrex::Array4<amrex::Real const>& W,
739 const amrex::Array4<amrex::Real >& FC,
740 int nrhs, int N);
741
742 /** \brief RHS terms for 2D momentum */
743 void rhs_uv_2d (int lev,
744 const amrex::Box& xbx,
745 const amrex::Box& ybx,
746 const amrex::Array4<amrex::Real const>& uold,
747 const amrex::Array4<amrex::Real const>& vold,
748 const amrex::Array4<amrex::Real >& ru,
749 const amrex::Array4<amrex::Real >& rv,
750 const amrex::Array4<amrex::Real const>& Duon,
751 const amrex::Array4<amrex::Real const>& Dvom,
752 const int nrhs);
753
754 /** \brief Wrapper around equation of state calculation */
755 void rho_eos (const amrex::Box& bx,
756 const amrex::Array4<amrex::Real const>& state,
757 const amrex::Array4<amrex::Real >& rho,
758 const amrex::Array4<amrex::Real >& rhoA,
759 const amrex::Array4<amrex::Real >& rhoS,
760 const amrex::Array4<amrex::Real >& bvf,
761 const amrex::Array4<amrex::Real >& alpha,
762 const amrex::Array4<amrex::Real >& beta,
763 const amrex::Array4<amrex::Real const>& Hz,
764 const amrex::Array4<amrex::Real const>& z_w,
765 const amrex::Array4<amrex::Real const>& z_r,
766 const amrex::Array4<amrex::Real const>& h,
767 const amrex::Array4<amrex::Real const>& mskr,
768 const int N);
769
770 /** \brief Calculate density and related quantities from linear equation of state */
771 void lin_eos (const amrex::Box& bx,
772 const amrex::Array4<amrex::Real const>& state,
773 const amrex::Array4<amrex::Real >& rho,
774 const amrex::Array4<amrex::Real >& rhoA,
775 const amrex::Array4<amrex::Real >& rhoS,
776 const amrex::Array4<amrex::Real >& bvf,
777 const amrex::Array4<amrex::Real const>& Hz,
778 const amrex::Array4<amrex::Real const>& z_w,
779 const amrex::Array4<amrex::Real const>& z_r,
780 const amrex::Array4<amrex::Real const>& h,
781 const amrex::Array4<amrex::Real const>& mskr,
782 const int N);
783
784 /** \brief Calculate density and related quantities from nonlinear equation of state */
785 void nonlin_eos (const amrex::Box& bx,
786 const amrex::Array4<amrex::Real const>& state,
787 const amrex::Array4<amrex::Real >& rho,
788 const amrex::Array4<amrex::Real >& rhoA,
789 const amrex::Array4<amrex::Real >& rhoS,
790 const amrex::Array4<amrex::Real >& bvf,
791 const amrex::Array4<amrex::Real >& alpha,
792 const amrex::Array4<amrex::Real >& beta,
793 const amrex::Array4<amrex::Real const>& Hz,
794 const amrex::Array4<amrex::Real const>& z_w,
795 const amrex::Array4<amrex::Real const>& z_r,
796 const amrex::Array4<amrex::Real const>& h,
797 const amrex::Array4<amrex::Real const>& mskr,
798 const int N);
799
800 /** \brief Calculate pressure gradient */
801 void prsgrd (const amrex::Box& bx,
802 const amrex::Box& gbx,
803 const amrex::Box& utbx,
804 const amrex::Box& vtbx,
805 const amrex::Array4<amrex::Real >& ru,
806 const amrex::Array4<amrex::Real >& rv,
807 const amrex::Array4<amrex::Real const>& pn,
808 const amrex::Array4<amrex::Real const>& pm,
809 const amrex::Array4<amrex::Real const>& rho,
810 const amrex::Array4<amrex::Real >& FC,
811 const amrex::Array4<amrex::Real const>& Hz,
812 const amrex::Array4<amrex::Real const>& z_r,
813 const amrex::Array4<amrex::Real const>& z_w,
814 const amrex::Array4<amrex::Real const>& msku,
815 const amrex::Array4<amrex::Real const>& mskv,
816 const int nrhs, const int N);
817
818 /** \brief Update velocities or tracers with diffusion/viscosity
819 * as the last part of the prestep */
820 void prestep_diffusion (const amrex::Box& bx,
821 const amrex::Box& gbx,
822 const int ioff, const int joff,
823 const amrex::Array4<amrex::Real >& vel,
824 const amrex::Array4<amrex::Real const>& vel_old,
825 const amrex::Array4<amrex::Real >& rvel,
826 const amrex::Array4<amrex::Real const>& Hz,
827 const amrex::Array4<amrex::Real const>& Akv,
828 const amrex::Array4<amrex::Real >& FC,
829 const amrex::Array4<amrex::Real const>& sstr,
830 const amrex::Array4<amrex::Real const>& bstr,
831 const amrex::Array4<amrex::Real const>& z_r,
832 const amrex::Array4<amrex::Real const>& pm,
833 const amrex::Array4<amrex::Real const>& pn,
834 const int iic, const int ntfirst, const int nnew, int nstp, int nrhs, int N,
835 const amrex::Real lambda, const amrex::Real dt_lev);
836
837 /** \brief Calculate effects of vertical viscosity or diffusivity */
838 void vert_visc_3d (const amrex::Box& bx,
839 const int ioff, const int joff,
840 const amrex::Array4<amrex::Real >& phi,
841 const amrex::Array4<amrex::Real const>& Hz,
842 const amrex::Array4<amrex::Real >& Hzk,
843 const amrex::Array4<amrex::Real >& AK,
844 const amrex::Array4<amrex::Real const>& Akv,
845 const amrex::Array4<amrex::Real >& BC,
846 const amrex::Array4<amrex::Real >& DC,
847 const amrex::Array4<amrex::Real >& FC,
848 const amrex::Array4<amrex::Real >& CF,
849 const int nnew, const int N,
850 const amrex::Real dt_lev);
851
852 /** \brief Correct mass flux */
853 void update_massflux_3d (int lev, const amrex::Box& bx,
854 const int ioff, const int joff,
855 const amrex::Array4<amrex::Real >& phi,
856 const amrex::Array4<amrex::Real >& phibar,
857 const amrex::Array4<amrex::Real >& Hphi,
858 const amrex::Array4<amrex::Real const>& Hz,
859 const amrex::Array4<amrex::Real const>& pm_or_pn,
860 const amrex::Array4<amrex::Real const>& Dphi1,
861 const amrex::Array4<amrex::Real const>& Dphi2,
862 const amrex::Array4<amrex::Real >& DC,
863 const amrex::Array4<amrex::Real >& FC,
864 const amrex::Array4<amrex::Real const>& msk,
865 const int nnew);
866
867 /** \brief Adjust 3D momentum variables based on vertical mean momentum */
868 void vert_mean_3d (const amrex::Box& bx,
869 const int ioff, const int joff,
870 const amrex::Array4<amrex::Real >& phi,
871 const amrex::Array4<amrex::Real const>& Hz,
872 const amrex::Array4<amrex::Real const>& Dphi_avg1,
873 const amrex::Array4<amrex::Real >& DC,
874 const amrex::Array4<amrex::Real >& CF,
875 const amrex::Array4<amrex::Real const>& pm_or_pn,
876 const amrex::Array4<amrex::Real const>& msk,
877 const int nnew, const int N);
878
879 /** \brief Harmonic viscosity */
880 void uv3dmix (const amrex::Box& xbx,
881 const amrex::Box& ybx,
882 const amrex::Array4<amrex::Real >& u,
883 const amrex::Array4<amrex::Real >& v,
884 const amrex::Array4<amrex::Real const>& uold,
885 const amrex::Array4<amrex::Real const>& vold,
886 const amrex::Array4<amrex::Real >& rufrc,
887 const amrex::Array4<amrex::Real >& rvfrc,
888 const amrex::Array4<amrex::Real const>& visc2_p,
889 const amrex::Array4<amrex::Real const>& visc2_r,
890 const amrex::Array4<amrex::Real const>& Hz,
891 const amrex::Array4<amrex::Real const>& pm,
892 const amrex::Array4<amrex::Real const>& pn,
893 const amrex::Array4<amrex::Real const>& mskp,
894 int nrhs, int nnew,
895 const amrex::Real dt_lev);
896
897 /** \brief Wrapper for harmonic diffusivity for tracers */
898 void t3dmix2 (const amrex::Box& bx,
899 const amrex::Array4<amrex::Real >& state,
900 const amrex::Array4<amrex::Real >& state_rhs,
901 const amrex::Array4<amrex::Real const>& diff2,
902 const amrex::Array4<amrex::Real const>& Hz,
903 const amrex::Array4<amrex::Real const>& z_r,
904 const amrex::Array4<amrex::Real const>& pm,
905 const amrex::Array4<amrex::Real const>& pn,
906 const amrex::Array4<amrex::Real const>& msku,
907 const amrex::Array4<amrex::Real const>& mskv,
908 const amrex::Real dt_lev,
909 const int ncomp, const int N);
910
911 /** \brief Harmonic diffusivity for tracers along S-coordinate level surfaces */
912 void t3dmix2_s(const amrex::Box& bx,
913 const amrex::Array4<amrex::Real >& state,
914 const amrex::Array4<amrex::Real >& state_rhs,
915 const amrex::Array4<amrex::Real const>& diff2,
916 const amrex::Array4<amrex::Real const>& Hz,
917 const amrex::Array4<amrex::Real const>& pm,
918 const amrex::Array4<amrex::Real const>& pn,
919 const amrex::Array4<amrex::Real const>& msku,
920 const amrex::Array4<amrex::Real const>& mskv,
921 const amrex::Real dt_lev, const int ncomp);
922
923 /** \brief Harmonic diffusivity for tracers along geopotential surfaces */
924 void t3dmix2_geo (const amrex::Box& bx,
925 const amrex::Array4<amrex::Real >& state,
926 const amrex::Array4<amrex::Real >& state_rhs,
927 const amrex::Array4<amrex::Real const>& diff2,
928 const amrex::Array4<amrex::Real const>& Hz,
929 const amrex::Array4<amrex::Real const>& z_r,
930 const amrex::Array4<amrex::Real const>& pm,
931 const amrex::Array4<amrex::Real const>& pn,
932 const amrex::Array4<amrex::Real const>& msku,
933 const amrex::Array4<amrex::Real const>& mskv,
934 const amrex::Real dt_lev,
935 const int ncomp, const int N);
936
937 /** \brief Calculate Coriolis terms */
938 void coriolis (const amrex::Box& xbx,
939 const amrex::Box& ybx,
940 const amrex::Array4<amrex::Real const>& uold,
941 const amrex::Array4<amrex::Real const>& vold,
942 const amrex::Array4<amrex::Real >& ru,
943 const amrex::Array4<amrex::Real >& rv,
944 const amrex::Array4<amrex::Real const>& Hz,
945 const amrex::Array4<amrex::Real const>& fomn,
946 int nrhs, int nr);
947
948 /** \brief Calculate curvilinear advection terms */
949 void curvilinear (const amrex::Box& bx,
950 const amrex::Box& xbx,
951 const amrex::Box& ybx,
952 const amrex::Array4<amrex::Real const>& uold,
953 const amrex::Array4<amrex::Real const>& vold,
954 const amrex::Array4<amrex::Real >& ru,
955 const amrex::Array4<amrex::Real >& rv,
956 const amrex::Array4<amrex::Real const>& Hz,
957 const amrex::Array4<amrex::Real const>& dndx,
958 const amrex::Array4<amrex::Real const>& dmde,
959 int nrhs, int nr);
960
961 /** \brief Apply climatology nudging */
962 void apply_clim_nudg (const amrex::Box& bx,
963 int ioff, int joff,
964 const amrex::Array4<amrex::Real >& var,
965 const amrex::Array4<amrex::Real const>& var_old,
966 const amrex::Array4<amrex::Real const>& var_clim,
967 const amrex::Array4<amrex::Real const>& clim_coeff,
968 const amrex::Array4<amrex::Real const>& Hz,
969 const amrex::Array4<amrex::Real const>& pm,
970 const amrex::Array4<amrex::Real const>& pn,
971 const amrex::Real dt_lev = amrex::Real(0.0));
972
973 /** \brief Set 2D momentum arrays from 3D momentum */
974 void set_2darrays (int lev);
975
976 /** \brief Set Zt_avg1 to zeta */
977 void set_zeta_average (int lev);
978
979 /** \brief Initialize zeta from file or analytic */
980 void set_zeta (int lev);
981
982 /** \brief Copy over zeta data that has been averaged down from high res */
983 void set_zeta_averaged_down (int lev);
984
985 /** \brief Initialize bathymetry from file or analytic */
986 void set_bathymetry (int lev);
987
988 /** \brief Copy over bathymetry data that has been averaged down from high resolution
989 * input netcdf file */
990 void set_bathymetry_averaged_down (int lev);
991
992 /** \brief Initialize Coriolis factor from file or analytic */
993 void set_coriolis (int lev);
994
995 /** \brief Initialize land-sea masks from file or analytic */
996 void set_masks (int lev);
997
998 /** \brief Calculate vertical stretched coordinates */
999 void stretch_transform (int lev);
1000
1001 /** \brief Initialize vertical mixing coefficients from file or analytic */
1002 void init_set_vmix (int lev);
1003 /** \brief Set vertical mixing coefficients from analytic */
1004 void set_analytic_vmix (int lev);
1005 /** \brief Initialize GLS variables */
1006 void init_gls_vmix (int lev, SolverChoice solver_choice);
1007 /** \brief Prestep for GLS calculation */
1008 void gls_prestep (int lev, amrex::MultiFab* mf_gls, amrex::MultiFab* mf_tke,
1009 amrex::MultiFab& mf_W,
1010 amrex::MultiFab* mf_msku, amrex::MultiFab* mf_mskv,
1011 const int nstp, const int nnew, const int iic, const int ntfirst,
1012 const int N, const amrex::Real dt_lev);
1013 /** \brief Corrector step for GLS calculation */
1014 void gls_corrector (int lev, amrex::MultiFab* mf_gls, amrex::MultiFab* mf_tke,
1015 amrex::MultiFab& mf_W, amrex::MultiFab* mf_Akv, amrex::MultiFab* mf_Akt,
1016 amrex::MultiFab* mf_Akk, amrex::MultiFab* mf_Akp,
1017 amrex::MultiFab* mf_mskr,
1018 amrex::MultiFab* mf_msku, amrex::MultiFab* mf_mskv,
1019 const int nstp, const int nnew,
1020 const int N, const amrex::Real dt_lev);
1021
1022 /** \brief Scale RHS momentum variables by 1/cell area, needed before FillPatch to different levels*/
1023 void scale_rhs_vars ();
1024 /** \brief Scale RHS momentum variables by cell area, needed after FillPatch to different levels*/
1025 void scale_rhs_vars_inv ();
1026
1027 /** \brief Initialize or calculate surface momentum flux from file or analytic */
1028 void set_smflux (int lev);
1029
1030 /** \brief Initialize or calculate wind speed from file or analytic */
1031 void set_wind (int lev);
1032
1033 /** \brief Initialize horizontal mixing coefficients */
1034 void set_hmixcoef (int lev);
1035
1036 /** \brief Initialize flat bathymetry to value from problo */
1037 void init_flat_bathymetry (int lev);
1038
1039 /** \brief Initialize or calculate bottom drag */
1040 void set_drag (int lev);
1041
1042 /** \brief Set weights for averaging 3D variables to 2D */
1043 void set_weights (int lev);
1044
1045 /** \brief Fill the physical boundary conditions for cell-centered velocity (diagnostic only) */
1046 void FillBdyCCVels (int lev, amrex::MultiFab& mf_cc_vel);
1047
1048 /** \brief Fill a new MultiFab by copying in phi from valid region and filling ghost cells */
1049 void FillPatch (int lev, amrex::Real time,
1050 amrex::MultiFab& mf_to_be_filled,
1051 amrex::Vector<amrex::MultiFab*> const& mfs,
1052 const int bccomp,
1053 const int bdy_var_type = BdyVars::null,
1054 const int icomp=0,
1055 const bool fill_all=true,
1056 const bool fill_set=true,
1057 const int n_not_fill=0,
1058 const int icomp_calc=0,
1059 const amrex::Real dt = amrex::Real(0.0),
1060 const amrex::MultiFab& mf_calc = amrex::MultiFab());
1061
1062 /** \brief Fill a new MultiFab by copying in phi from valid region and filling ghost cells without applying boundary conditions */
1063 void FillPatchNoBC (int lev, amrex::Real time,
1064 amrex::MultiFab& mf_to_be_filled,
1065 amrex::Vector<amrex::MultiFab*> const& mfs,
1066 const int bdy_var_type = BdyVars::null,
1067 const int icomp=0,
1068 const bool fill_all=true,
1069 const bool fill_set=true);
1070 /** \brief Fill boundary data from netcdf file */
1071 void fill_from_bdyfiles (int lev,
1072 amrex::MultiFab& mf_to_fill,
1073 const amrex::MultiFab& mf_mask,
1074 const amrex::Real time,
1075 const int bccomp,
1076 const int bdy_var_type,
1077 const int icomp_to_fill,
1078 const int icomp_calc = 0,
1079 const amrex::MultiFab& mf_calc = amrex::MultiFab(),
1080 const amrex::Real = amrex::Real(0.0));
1081
1082 /** \brief fill an entire multifab by interpolating from the coarser level
1083 * using the piecewise constant interpolater */
1084 void FillCoarsePatchPC (int lev, amrex::Real time, amrex::MultiFab* mf_fine,
1085 amrex::MultiFab* mf_crse,
1086 const int bccomp,
1087 const int bdy_var_type = BdyVars::null,
1088 const int icomp = 0,
1089 const bool fill_all = true,
1090 const int n_not_fill=0,
1091 const int icomp_calc=0,
1092 const amrex::Real dt = amrex::Real(0.0),
1093 const amrex::MultiFab& mf_calc = amrex::MultiFab());
1094
1095 /** \brief fill an entire multifab by interpolating from the coarser level */
1096 void FillCoarsePatch (int lev, amrex::Real time, amrex::MultiFab* mf_fine,
1097 amrex::MultiFab* mf_crse,
1098 const int bccomp,
1099 const int bdy_var_type = BdyVars::null,
1100 const int icomp = 0,
1101 const bool fill_all = true,
1102 const int n_not_fill=0,
1103 const int icomp_calc=0,
1104 const amrex::Real dt = amrex::Real(0.0),
1105 const amrex::MultiFab& mf_calc = amrex::MultiFab());
1106
1107 /** \brief fill an entire multifab by interpolating from the coarser level,
1108 * explicitly specifying interpolator to use */
1109 void FillCoarsePatchMap (int lev, amrex::Real time, amrex::MultiFab* mf_fine,
1110 amrex::MultiFab* mf_crse,
1111 const int bccomp,
1112 const int bdy_var_type = BdyVars::null,
1113 const int icomp = 0,
1114 const bool fill_all = true,
1115 const int n_not_fill=0,
1116 const int icomp_calc=0,
1117 const amrex::Real dt = amrex::Real(0.0),
1118 const amrex::MultiFab& mf_calc = amrex::MultiFab(),
1119 amrex::Interpolater* mapper = nullptr);
1120
1121 /** \brief initialize and calculate stretch coefficients */
1122 void init_stretch_coeffs ();
1123 /** \brief calculate vertical stretch coefficients */
1124 void calc_stretch_coeffs ();
1125
1126 /** \brief Calculate Coriolis parameters from beta plane parametrization */
1127 void init_beta_plane_coriolis (int lev);
1128
1129 /** \brief Full domain bathymetry data initialization from analytic */
1131
1132 /** \brief Problem initialization from averaged-down high resolution data */
1133 void set_init_data_averaged_down (int lev);
1134 /** \brief Problem initialization from NetCDF file */
1135 void init_data_from_netcdf (int lev);
1136 /** \brief High resolution roblem initialization from NetCDF file */
1138 /** \brief Boundary data initialization from NetCDF file */
1139 void init_bdry_from_netcdf (int lev);
1140 /** \brief Mask data initialization from NetCDF file */
1141 void init_masks_from_netcdf (int lev);
1142 /** \brief Bathymetry data initialization from NetCDF file */
1143 void init_bathymetry_from_netcdf (int lev);
1144 /** \brief Full domain high-res bathymetry data initialization from NetCDF file */
1146
1147 /** \brief Grid variable initialization from NetCDF file */
1148 void init_grid_vars_from_netcdf (int lev);
1149 /** \brief Full domain high-res grid variable initialization from NetCDF file */
1151
1152 /** \brief Extrapolate grid metrics to edge of MultiFab */
1153 void extrapolate_metric_to_physical_boundaries(amrex::MultiFab& mf, const amrex::Geometry& geom);
1154
1155 /** \brief Sea-surface height data initialization from NetCDF file */
1156 void init_zeta_from_netcdf (int lev);
1157 /** \brief Full-domain high res sea-surface height data initialization from NetCDF file */
1159 /** \brief Coriolis parameter data initialization from NetCDF file */
1160 void init_coriolis_from_netcdf (int lev);
1161 /** \brief Climatology nudging coefficient initialization from NetCDF file */
1162 void init_clim_nudg_coeff_from_netcdf (int lev);
1163 /** \brief Wrapper to initialize climatology nudging coefficient */
1164 void init_clim_nudg_coeff (int lev);
1165 void init_riv_pos_from_netcdf (int lev);
1166
1167 /** \brief Allocate multifabs for storing full-domain bathymetry and grid vars data */
1169 /** \brief Allocate multifabs for storing full-domain high resolution initial data */
1171
1172 /** \brief Convert data in a multifab from inverse days to inverse seconds */
1173 void convert_inv_days_to_inv_s (amrex::MultiFab*);
1174
1175 /** \brief Mask data arrays before writing output */
1176 void mask_arrays_for_write (int lev, amrex::Real fill_value, amrex::Real fill_where);
1177
1178 /** \brief Average down from level lev+1 to lev in mf, including grow cells */
1179 void average_down_with_grow_cells(int lev, amrex::Vector<std::unique_ptr<amrex::MultiFab>>& mf);
1180
1181 int xvel_bc () const noexcept { return BCVars::xvel_bc(ncons); }
1182 int yvel_bc () const noexcept { return BCVars::yvel_bc(ncons); }
1183 int zvel_bc () const noexcept { return BCVars::zvel_bc(ncons); }
1184 int ubar_bc () const noexcept { return BCVars::ubar_bc(ncons); }
1185 int vbar_bc () const noexcept { return BCVars::vbar_bc(ncons); }
1186 int zeta_bc () const noexcept { return BCVars::zeta_bc(ncons); }
1187 int tke_bc () const noexcept { return BCVars::tke_bc(ncons); }
1189 int foextrap_bc () const noexcept { return BCVars::foextrap_bc(ncons); }
1190 int u2d_simple_bc () const noexcept { return BCVars::u2d_simple_bc(ncons); }
1191 int v2d_simple_bc () const noexcept { return BCVars::v2d_simple_bc(ncons); }
1192 int num_bc_vars () const noexcept { return BCVars::NumTypes(ncons); }
1193
1194
1195#ifdef REMORA_USE_NETCDF
1197#endif
1198
1199private:
1200
1201 ///////////////////////////
1202 // private member functions
1203 ///////////////////////////
1204
1205 /** \brief read in some parameters from inputs file */
1206 void ReadParameters();
1207
1208 /** \brief Build runtime scalar names after nscalar is known */
1209 void init_scalar_metadata();
1210
1211 /** \brief set covered coarse cells to be the average of overlying fine cells */
1212 void AverageDown ();
1213
1214 /** \brief Read in boundary parameters from input file and set up data structures */
1215 void init_bcs();
1216
1217 /** \brief Initialize initial problem data from analytic functions */
1218 void init_analytic(int lev);
1219 /** \brief Initialize high resolution initial problem data from analytic functions */
1221
1222 /** \brief Initialize high resolution initial sea surface height from analytic functions */
1224
1225 /** \brief Allocate MultiFabs for state and evolution variables */
1226 void init_stuff (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm);
1227
1228 /** \brief Allocate MultiFabs for masks */
1229 void init_masks (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm);
1230
1231 /** \brief Resize variable containers to accommodate data on levels 0 to max_lev */
1232 void resize_stuff (int lev);
1233
1234 /** \brief more flexible version of AverageDown() that lets you average down across multiple levels */
1235 void AverageDownTo (int crse_lev);
1236
1237 /** \brief Construct FillPatchers */
1238 void Construct_REMORAFillPatchers (int lev);
1239
1240 /** \brief Define FillPatchers */
1241 void Define_REMORAFillPatchers (int lev);
1242
1243 /** \brief utility to copy in data from old and/or new state into another multifab */
1244 TimeInterpolatedData GetDataAtTime (int lev, amrex::Real time);
1245
1246 /** \brief advance a level by dt, includes a recursive call for finer levels */
1247 void timeStep (int lev, amrex::Real time, int iteration);
1248
1249 /** \brief advance all levels by dt, loops over finer levels */
1250 void timeStepML (amrex::Real time, int iteration);
1251
1252 /** \brief a wrapper for estTimeStep() */
1253 void ComputeDt ();
1254
1255 /** \brief get plotfile name */
1256 std::string PlotFileName (int lev) const;
1257
1258 /* set which variables and derived quantities go into plotfiles */
1259 void set2DPlotVariables (const std::string& pp_plot_var_names_2d);
1260 void set3DPlotVariables (const std::string& pp_plot_var_names_3d);
1261
1262 /* append variables to plot */
1263 void append2DPlotVariables (const std::string& pp_plot_var_names_2d);
1264 void append3DPlotVariables (const std::string& pp_plot_var_names_3d);
1265
1266#ifdef REMORA_USE_NETCDF
1267 /** \brief Write plotfile using NetCDF (wrapper) */
1268 void WriteNCPlotFile (int istep, amrex::MultiFab const* plotMF);
1269
1270 /** \brief Write a particular NetCDF plotfile */
1271 void WriteNCPlotFile_which (int lev, int which_subdomain,
1272 amrex::MultiFab const* plotMF,
1273 bool write_header, ncutils::NCFile& ncf,
1274 bool is_history);
1275
1276 /** \brief Write MultiFab in NetCDF format */
1277 void WriteNCMultiFab (const amrex::FabArray<amrex::FArrayBox> &fab,
1278 const std::string& name,
1279 bool set_ghost = false) const;
1280
1281 /** \brief Read MultiFab in NetCDF format */
1282 void ReadNCMultiFab (amrex::FabArray<amrex::FArrayBox> &fab,
1283 const std::string &name,
1284 int coordinatorProc = amrex::ParallelDescriptor::IOProcessorNumber(),
1285 int allow_empty_mf = 0);
1286
1287 /** \brief Start time in the time series of boundary data */
1288 amrex::Real start_bdy_time;
1289 /** \brief Interval between boundary data times */
1291
1292 /** \brief Whether to output NetCDF files as a single history file with several time steps */
1294
1295 /** \brief Data container for u-component surface momentum flux read from file */
1296 std::unique_ptr<NCTimeSeries> sustr_data_from_file;
1297 /** \brief Data container for v-component surface momentum flux read from file */
1298 std::unique_ptr<NCTimeSeries> svstr_data_from_file;
1299 /** \brief Data container for u-direction wind read from file */
1300 std::unique_ptr<NCTimeSeries> Uwind_data_from_file;
1301 /** \brief Data container for v-direction wind read from file */
1302 std::unique_ptr<NCTimeSeries> Vwind_data_from_file;
1303 /** \brief Data container for air temperature read from file */
1304 std::unique_ptr<NCTimeSeries> Tair_data_from_file;
1305 /** \brief Data container for specific humidity read from file */
1306 std::unique_ptr<NCTimeSeries> qair_data_from_file;
1307 /** \brief Data container for air pressure read from file */
1308 std::unique_ptr<NCTimeSeries> Pair_data_from_file;
1309 /** \brief Data container for shortwave radiation flux read from file */
1310 std::unique_ptr<NCTimeSeries> srflx_data_from_file;
1311 /** \brief Data container for downward longwave radiation flux read from file */
1312 std::unique_ptr<NCTimeSeries> longwave_down_data_from_file;
1313 /** \brief Data container for precipitation rate read from file */
1314 std::unique_ptr<NCTimeSeries> rain_data_from_file;
1315 /** \brief Data container for cloud cover fraction read from file */
1316 std::unique_ptr<NCTimeSeries> cloud_data_from_file;
1317 /** \brief Data container for evaporation minus precipitation read from file */
1318 std::unique_ptr<NCTimeSeries> EminusP_data_from_file;
1319
1320 /** \brief Data container for ubar climatology data read from file */
1321 std::unique_ptr<NCTimeSeries> ubar_clim_data_from_file;
1322 /** \brief Data container for vbar climatology data read from file */
1323 std::unique_ptr<NCTimeSeries> vbar_clim_data_from_file;
1324 /** \brief Data container for u-velocity climatology data read from file */
1325 std::unique_ptr<NCTimeSeries> u_clim_data_from_file;
1326 /** \brief Data container for v-velocity climatology data read from file */
1327 std::unique_ptr<NCTimeSeries> v_clim_data_from_file;
1328 /** \brief Data container for temperature climatology data read from file */
1329 std::unique_ptr<NCTimeSeries> temp_clim_data_from_file;
1330 /** \brief Data container for salinity climatology data read from file */
1331 std::unique_ptr<NCTimeSeries> salt_clim_data_from_file;
1332
1333 /** \brief Vector of data containers for scalar data in rivers */
1334 amrex::Vector<std::unique_ptr<NCTimeSeriesRiver>> river_source_cons;
1335 /** \brief Data container for momentum transport in rivers */
1336 std::unique_ptr<NCTimeSeriesRiver> river_source_transport;
1337 /** \brief Data container for vertically integrated momentum transport in rivers */
1338 std::unique_ptr<NCTimeSeriesRiver> river_source_transportbar;
1339
1340 /** \brief Vector over BdyVars of boundary series data containers */
1341 amrex::Vector<amrex::Vector<std::unique_ptr<NCTimeSeriesBoundary>>> boundary_series;
1342
1343#endif // REMORA_USE_NETCDF
1344 /** \brief iMultiFab for river positions; contents are indices of rivers */
1345 amrex::Vector<std::unique_ptr<amrex::iMultiFab>> vec_river_position;
1346 /** \brief Vector over rivers of river direction: 0: u-face; 1: v-face; 2: w-face */
1347 amrex::Gpu::DeviceVector<int> river_direction;
1348
1349
1350#ifdef REMORA_USE_MOAB
1351 /** \brief Initialize connection to MOAB */
1352 void InitMOABMesh();
1353#endif
1354 /** \brief Nudging width at coarse-fine interface */
1355 int cf_width{0};
1356 /** \brief Width for fixing values at coarse-fine interface */
1358 // Fillpatcher classes for coarse-fine boundaries
1359 /** \brief Vector over levels of FillPatchers for scalars */
1360 amrex::Vector<REMORAFillPatcher> FPr_c;
1361 /** \brief Vector over levels of FillPatchers for u (3D) */
1362 amrex::Vector<REMORAFillPatcher> FPr_u;
1363 /** \brief Vector over levels of FillPatchers for v (3D) */
1364 amrex::Vector<REMORAFillPatcher> FPr_v;
1365 /** \brief Vector over levels of FillPatchers for w */
1366 amrex::Vector<REMORAFillPatcher> FPr_w;
1367
1368 // Fillpatcher classes for 2d velocity variables
1369 /** \brief Vector over levels of FillPatchers for ubar (2D) */
1370 amrex::Vector<REMORAFillPatcher> FPr_ubar;
1371 /** \brief Vector over levels of FillPatchers for vbar (2D) */
1372 amrex::Vector<REMORAFillPatcher> FPr_vbar;
1373
1374 /** \brief write checkpoint file to disk */
1375 void WriteCheckpointFile ();
1376
1377 /** \brief read checkpoint file from disk */
1378 void ReadCheckpointFile ();
1379
1380 /** \brief Read the file passed to remora.restart and use it as an initial condition for the current simulation */
1382
1383 /** \brief Initialize the new-time data at a level from the initial_data MultiFab */
1384 void InitializeLevelFromData (int lev, const amrex::MultiFab& initial_data);
1385
1386 /** \brief utility to skip to next line in Header */
1387 static void GotoNextLine (std::istream& is);
1388
1389 ////////////////
1390 // private data members
1391
1392 /** \brief Pointer to container of analytical functions for problem definition */
1393 std::unique_ptr<ProblemBase> prob = nullptr;
1394
1395 /** \brief how many boxes specified at each level by tagging criteria */
1396 amrex::Vector<int> num_boxes_at_level;
1397 /** \brief how many netcdf input files specified at each level */
1398 amrex::Vector<int> num_files_at_level;
1399 /** \brief the boxes specified at each level by tagging criteria */
1400 amrex::Vector<amrex::Vector<amrex::Box>> boxes_at_level;
1401
1402 /** \brief which step? */
1403 amrex::Vector<int> istep;
1404 /** \brief How many substeps on each level? */
1405 amrex::Vector<int> nsubsteps;
1406 /** \brief new time at each level */
1407 amrex::Vector<amrex::Real> t_new;
1408 /** \brief old time at each level */
1409 amrex::Vector<amrex::Real> t_old;
1410 /** \brief time step at each level */
1411 amrex::Vector<amrex::Real> dt;
1412
1413 /** \brief whether to set boundary conditions by variable rather than just by side */
1415
1416 /** \brief Vector (over level) of functors to apply physical boundary conditions */
1417 amrex::Vector<std::unique_ptr<REMORAPhysBCFunct>> physbcs;
1418
1419 /** \brief array of flux registers for refluxing in multilevel */
1420 amrex::Vector<std::unique_ptr<amrex::YAFluxRegister>> advflux_reg;
1421
1422 ////////////////
1423 // boundary data members
1424
1425 // A BCRec is essentially a 2*DIM integer array storing the boundary
1426 // condition type at each lo/hi walls in each direction. We have one BCRec
1427 // for each component of the cell-centered variables and each velocity component.
1428 /** \brief vector (over BCVars) of BCRecs */
1429 amrex::Vector <amrex::BCRec> domain_bcs_type;
1430 /** \brief GPU vector (over BCVars) of BCRecs */
1431 amrex::Gpu::DeviceVector<amrex::BCRec> domain_bcs_type_d;
1432
1433 /** \brief Array of strings describing domain boundary conditions */
1434 amrex::Array<std::string,2*AMREX_SPACEDIM> domain_bc_type;
1435
1436 /** \brief Array holding the Dirichlet values at walls which need them */
1437 amrex::Vector<amrex::GpuArray<amrex::Real, AMREX_SPACEDIM*2>> m_bc_extdir_vals;
1438
1439 /** \brief Array holding the "physical" boundary condition types (e.g. "inflow") */
1440 amrex::Vector<amrex::GpuArray<REMORA_BC, AMREX_SPACEDIM*2>> phys_bc_type;
1441
1442 /** \brief These are flags that indicate whether we need to read in boundary data from file */
1443 amrex::GpuArray<amrex::GpuArray<bool, AMREX_SPACEDIM*2>,BdyVars::NumTypes+1> phys_bc_need_data;
1444
1445 /** \brief Container to connect boundary data being read in boundary condition containers.
1446 *
1447 * Needed for phys_bc_need_data to work correctly
1448 */
1449 amrex::Vector<int> bdy_index;
1450
1451 /** \brief Step when we last output a plotfile */
1453 /** \brief Simulation time when we last output a plotfile */
1455
1456 /** \brief Step when we last output a checkpoint file */
1458 /** \brief Simulation time when we last output a checkpoint file */
1460 /** \brief Whether to output a plotfile on restart from checkpoint */
1462
1463 ////////////////
1464 // runtime parameters
1465
1466 /** \brief maximum number of steps */
1467 int max_step = std::numeric_limits<int>::max();
1468 /** \brief Time to stop */
1469 amrex::Real stop_time = std::numeric_limits<amrex::Real>::max();
1470
1471 /** \brief Time of the start of the simulation, in seconds */
1472 amrex::Real start_time = 0.0;
1473
1474 /** \brief If set, restart from this checkpoint file */
1475 std::string restart_chkfile = "";
1476
1477 /** \brief Number of passive scalars carried in the state */
1478 int nscalar = 1;
1479 /** \brief Number of conserved scalars in the state (temperature + salt + passive scalars) */
1481
1482 // Time step controls
1483 /** \brief CFL condition */
1484 static amrex::Real cfl;
1485 /** \brief Fraction maximum change in subsequent time steps */
1486 static amrex::Real change_max;
1487 /** \brief User specified fixed baroclinic time step */
1488 static amrex::Real fixed_dt;
1489 /** \brief User specified fixed barotropic time step */
1490 static amrex::Real fixed_fast_dt;
1491 /** \brief User specified, number of barotropic steps per baroclinic step */
1493 /** \brief Number of fast steps to take */
1495
1496 /** \brief Whether to substep fine levels in time */
1497 int do_substep = 0;
1498
1499 /** \brief how often each level regrids the higher levels of refinement (after a level advances that many time steps) */
1500 int regrid_int = 2;
1501
1502 // I/O controls
1503 /** \brief Plotfile prefix */
1504 std::string plot_file_name {"plt_"};
1505 /** \brief Plotfile output interval in iterations */
1506 int plot_int = -1;
1507 /** \brief Plotfile output interval in seconds */
1508 amrex::Real plot_int_time = amrex::Real(-1.0);
1509 /** \brief Checkpoint file prefix */
1510 std::string check_file {"chk"};
1511 /** \brief Checkpoint output interval in iterations */
1512 int check_int = -1;
1513 /** \brief Checkpoint output interval in seconds */
1514 amrex::Real check_int_time = amrex::Real(-1.0);
1515
1516 /** \brief Whether to chunk netcdf history file */
1518 /** \brief Number of time steps per netcdf history file.
1519 *
1520 -1 is the default and means code will automatically compute
1521 number of steps per file based on grid size to keep files < 2 GB */
1523 /** \brief Counter for which time index we are writing to in the netcdf history file */
1525
1526 /** \brief Names of 3D variables to output to AMReX plotfile */
1527 amrex::Vector<std::string> plot_var_names_3d;
1528 /** \brief Names of 2D variables to output to AMReX plotfile */
1529 amrex::Vector<std::string> plot_var_names_2d;
1530 /** \brief Names of scalars for plotfile output */
1531 amrex::Vector<std::string> cons_names {"temp", "salt", "tracer"};
1532 // Note that the order of variable names here must match the order in PlotFile.cpp
1533 /** \brief Names of derived fields for plotfiles */
1534 const amrex::Vector<std::string> derived_names {"vorticity"};
1535
1536 /** \brief Container for algorithmic choices */
1538
1539 /** \brief whether plotfile variables should be expanded to a uniform refinement ratio */
1541
1542 /** \brief fill value for masked arrays in amrex plotfiles */
1543 amrex::Real plotfile_fill_value = amrex::Real(0.0);
1544 /** \brief fill value for masked arrays in netcdf output */
1545 amrex::Real netcdf_fill_value = amrex::Real(1.0e37);
1546
1547
1548#ifdef REMORA_USE_PARTICLES
1549 /** \brief Particle container with all particle species */
1550 ParticleData particleData;
1551
1552 // variables and functions for tracers particles
1553 /** \brief tracer particles that advect with flow */
1554 bool m_use_tracer_particles;
1555 /** \brief tracer particles that fall with gravity */
1556 bool m_use_hydro_particles;
1557
1558 /** \brief Read tracer and hydro particles parameters */
1559 void readTracersParams();
1560
1561 /** \brief Initialize tracer and hydro particles */
1562 void initializeTracers ( amrex::ParGDBBase*,
1563 const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& );
1564
1565 /** \brief Evolve tracers and hydro particles */
1566 void evolveTracers( int lev,
1567 amrex::Real dt,
1568 amrex::Vector<amrex::MultiFab const*>& flow_vel,
1569 const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& );
1570
1571#endif
1572 /** \brief Verbosity level of output */
1573 static int verbose;
1574
1575 /** \brief Diagnostic sum output interval in number of steps */
1576 static int sum_interval;
1577 /** \brief Diagnostic sum output interval in time */
1578 static amrex::Real sum_per;
1579
1580 /** \brief Minimum number of digits in plotfile name or chunked history file */
1582
1583 /** \brief Whether to write the staggered velocities (not averaged to cell centers) */
1585
1586 /** \brief Whether to write nodal data (Nu_nd) to plotfiles */
1587 static bool plot_nodal_data;
1588
1589 /** \brief Native or NetCDF plotfile output */
1591
1592 /** \brief NetCDF initialization file */
1593 static amrex::Vector<amrex::Vector<std::string>> nc_init_file;
1594 /** \brief NetCDF grid file */
1595 static amrex::Vector<amrex::Vector<std::string>> nc_grid_file;
1596 /** \brief NetCDF boundary data */
1597 static amrex::Vector<std::string> nc_bdry_file;
1598
1599 /** \brief Which level the high resolution bathymetry is at */
1601 /** \brief Grid file for high resolution bathymetry */
1603 /** \brief Box for the full domain at nc_hires_grid_level */
1605
1606 /** \brief Which level the high resolution initialization data is at */
1608 /** \brief Init file for high resolution */
1610 /** \brief Box for the full domain at nc_hires_init_level */
1612
1613 /** \brief Cumulative refinement ratio between level 0 and level i */
1614 amrex::Vector<amrex::IntVect> cum_ref_ratios;
1615
1616 /** \brief NetCDF forcing file(s) */
1617 amrex::Vector<std::string> nc_frc_file;
1618 /** \brief NetCDF river file(s) */
1619 amrex::Vector<std::string> nc_riv_file;
1620
1621 /** \brief NetCDF climatology history file(s) */
1622 amrex::Vector<std::string> nc_clim_his_file;
1623 /** \brief NetCDF climatology coefficient file */
1625
1626 /** \brief Default name of time field for boundary data */
1627 std::string bdry_time_varname = "ocean_time";
1628 /** \brief Name of time fields for boundary data */
1629 amrex::Vector<std::string> bdry_time_name_byvar;
1630
1631 /** \brief Name of time field for ubar climatology data */
1632 std::string clim_ubar_time_varname = "ocean_time";
1633 /** \brief Name of time field for vbar climatology data */
1634 std::string clim_vbar_time_varname = "ocean_time";
1635 /** \brief Name of time field for u climatology data */
1636 std::string clim_u_time_varname = "ocean_time";
1637 /** \brief Name of time field for v climatology data */
1638 std::string clim_v_time_varname = "ocean_time";
1639 /** \brief Name of time field for salinity climatology data */
1640 std::string clim_salt_time_varname = "ocean_time";
1641 /** \brief Name of time field for temperature climatology data */
1642 std::string clim_temp_time_varname = "ocean_time";
1643 /** \brief Name of time field for river time */
1644 std::string riv_time_varname = "river_time";
1645 /** \brief Name of time field for forcing data */
1646 std::string frc_time_varname = "";
1647
1648 /** \brief Set refinement criteria */
1650
1651 /** \brief Holds info for dynamically generated tagging criteria */
1652 static amrex::Vector<amrex::AMRErrorTag> ref_tags;
1653
1654 /** \brief Mask that zeroes out values on a coarse level underlying grids on the next finest level */
1655 amrex::MultiFab fine_mask;
1656
1657 /** \brief Helper function to determine number of ghost cells */
1658 AMREX_FORCE_INLINE
1659 int
1660 ComputeGhostCells(const int& spatial_order) {
1661 int nGhostCells = 0;
1662 switch (spatial_order) {
1663 case 2:
1664 nGhostCells = 2; // We need this many to compute the eddy viscosity in the ghost cells
1665 break;
1666 case 3:
1667 nGhostCells = 2;
1668 break;
1669 case 4:
1670 nGhostCells = 2;
1671 break;
1672 case 5:
1673 nGhostCells = 3;
1674 break;
1675 case 6:
1676 nGhostCells = 3;
1677 break;
1678 default:
1679 amrex::Error("Must specify spatial order to be 2,3,4,5 or 6");
1680 }
1681
1682 return nGhostCells;
1683 }
1684
1685 /** \brief Helper function for IO stream */
1686 AMREX_FORCE_INLINE
1687 std::ostream&
1688 DataLog (int i)
1689 {
1690 return *datalog[i];
1691 }
1692
1693 AMREX_FORCE_INLINE
1694 int
1695 NumDataLogs () noexcept
1696 {
1697 return datalog.size();
1698 }
1699
1700 /** \brief Variable for CPU timing */
1701 static amrex::Real startCPUTime;
1702 /** \brief Accumulator variable for CPU time used thusfar */
1703 static amrex::Real previousCPUTimeUsed;
1704
1705 /** \brief Get CPU time used */
1706 amrex::Real
1708 {
1709 int numCores = amrex::ParallelDescriptor::NProcs();
1710#ifdef _OPENMP
1711 numCores = numCores * omp_get_max_threads();
1712#endif
1713
1714 amrex::Real T =
1715 numCores * (amrex::Real(amrex::ParallelDescriptor::second()) - startCPUTime) +
1717
1718 return T;
1719 }
1720
1721 void setRecordDataInfo (int i, const std::string& filename)
1722 {
1723 if (amrex::ParallelDescriptor::IOProcessor())
1724 {
1725 datalog[i] = std::make_unique<std::fstream>();
1726 datalog[i]->open(filename.c_str(),std::ios::out|std::ios::app);
1727 if (!datalog[i]->good()) {
1728 amrex::FileOpenFailed(filename);
1729 }
1730 }
1731 amrex::ParallelDescriptor::Barrier("REMORA::setRecordDataInfo");
1732 }
1733
1734 amrex::Vector<std::unique_ptr<std::fstream> > datalog;
1735 amrex::Vector<std::string> datalogname;
1736
1737 /** \brief The filename of the ith datalog file. */
1738 const std::string DataLogName (int i) const noexcept { return datalogname[i]; }
1739
1740public:
1741 /** \brief Write job info to stdout */
1742 void writeJobInfo (const std::string& dir) const;
1743 /** \brief Write build info to os */
1744 static void writeBuildInfo (std::ostream& os);
1745
1746 static void print_banner(MPI_Comm /*comm*/, std::ostream& /*out*/);
1747 static void print_usage(MPI_Comm /*comm*/, std::ostream& /*out*/);
1748 static void print_error(MPI_Comm /*comm*/, const std::string& msg);
1749 static void print_summary(std::ostream&);
1750 static void print_tpls(std::ostream& /*out*/);
1751
1752 /** \brief Accessor method for t_old to expose to outside classes */
1753 amrex::Real get_t_old(int lev) const;
1754
1755 /** \brief Evaluate stability function psi for wind speed */
1756 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
1757 static amrex::Real bulk_psiu(amrex::Real ZoL) {
1758 // Compute stability function, psi
1759 using namespace amrex;
1760
1761 Real psiu;
1762 if (ZoL < 0.0_rt) {
1763 // Unstable conditions.
1764 Real x = std::pow(1.0_rt-15.0_rt*ZoL,0.25_rt);
1765 Real psik = 2.0_rt*std::log(0.5_rt*(1.0_rt+x))+
1766 std::log(0.5_rt*(1.0_rt+x*x))-
1767 2.0_rt*std::atan(x)+0.5_rt*PI;
1768 // For very unstable conditions, use free-convection (Fairall).
1769 Real sqrt3 = std::sqrt(3.0_rt);
1770 Real y = std::pow(1.0_rt-10.15_rt*ZoL,1.0_rt/3.0_rt);
1771 Real psic = 1.5_rt*std::log(1.0_rt/3.0_rt*(1.0_rt+y+y*y))-
1772 sqrt3*std::atan((1.0_rt+2.0_rt*y)/sqrt3)+PI/sqrt3;
1773 // Match Kansas and free-convection forms with weighting Fw.
1774 Real Zol2 = ZoL*ZoL;
1775 Real Fw = Zol2/(1.0_rt+Zol2);
1776
1777 psiu = (1.0_rt-Fw)*psik+Fw*psic;
1778 } else {
1779 // Stable conditions
1780 Real cff=std::min(50.0_rt,0.35_rt*ZoL);
1781 psiu = -((1.0_rt+ZoL)+0.6667_rt*(ZoL-14.28_rt)/
1782 std::exp(cff)+8.525_rt);
1783 }
1784 return psiu;
1785 }
1786
1787 /** \brief Evaluate stability function psi for moisture and heat */
1788 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
1789 static amrex::Real bulk_psit(amrex::Real ZoL) {
1790 // Compute stability function, psi
1791 using namespace amrex;
1792
1793 Real psit;
1794 if (ZoL < 0.0_rt) {
1795 // Unstable conditions.
1796 Real x = std::pow(1.0_rt-15.0_rt*ZoL,0.5_rt);
1797 Real psik = 2.0_rt*std::log(0.5_rt*(1.0_rt+x));
1798 // For very unstable conditions, use free-convection (Fairall).
1799 Real sqrt3=std::sqrt(3.0_rt);
1800 Real y=std::pow(1.0_rt-34.15_rt*ZoL,1.0_rt/3.0_rt);
1801 Real psic=1.5_rt*std::log(1.0_rt/3.0_rt*(1.0_rt+y+y*y))-
1802 sqrt3*std::atan((1.0_rt+2.0_rt*y)/sqrt3)+PI/sqrt3;
1803
1804 // Match Kansas and free-convection forms with weighting Fw.
1805 Real ZoL2=ZoL*ZoL;
1806 Real Fw=ZoL2/(1.0_rt+ZoL2);
1807 psit = (1.0_rt-Fw)*psik+Fw*psic;
1808 } else {
1809 // Stable conditions.
1810 Real cff=std::min(50.0_rt,0.35_rt*ZoL);
1811 psit=-(std::pow(1.0_rt+2.0_rt*ZoL,1.5_rt)+
1812 0.6667_rt*(ZoL-14.28_rt)/std::exp(cff)+8.525_rt);
1813 }
1814 return psit;
1815 }
1816};
1817
1818#endif
constexpr amrex::Real PI
PlotfileType
plotfile format
#define Tracer_comp
A class to hold and interpolate time series data read from a NetCDF file.
A class to hold and interpolate time series data read from a NetCDF file.
Class that stores all relevant simulation state data with methods for time stepping.
Definition REMORA.H:91
static PlotfileType plotfile_type
Native or NetCDF plotfile output.
Definition REMORA.H:1590
std::string nc_grid_file_hires
Grid file for high resolution bathymetry.
Definition REMORA.H:1602
void FillCoarsePatchPC(int lev, amrex::Real time, amrex::MultiFab *mf_fine, amrex::MultiFab *mf_crse, const int bccomp, const int bdy_var_type=BdyVars::null, const int icomp=0, const bool fill_all=true, const int n_not_fill=0, const int icomp_calc=0, const amrex::Real dt=amrex::Real(0.0), const amrex::MultiFab &mf_calc=amrex::MultiFab())
fill an entire multifab by interpolating from the coarser level using the piecewise constant interpol...
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_EminusP
evaporation minus precipitation [kg/m^2/s], defined at rho-points
Definition REMORA.H:438
amrex::Vector< std::string > nc_riv_file
NetCDF river file(s)
Definition REMORA.H:1619
void set_grid_vars_averaged_down(int lev)
Set pm/pn by averaging down from higher-resolution grid.
Definition REMORA.cpp:699
std::string riv_time_varname
Name of time field for river time.
Definition REMORA.H:1644
void PackSurfaceState(amrex::Vector< amrex::MultiFab * > &state, amrex::Real time)
Extracts SST from the 3D conservative state for the atmospheric driver.
int foextrap_periodic_bc() const noexcept
Definition REMORA.H:1188
static void GotoNextLine(std::istream &is)
utility to skip to next line in Header
int nfast
Number of fast steps to take.
Definition REMORA.H:1494
amrex::Vector< std::string > nc_clim_his_file
NetCDF climatology history file(s)
Definition REMORA.H:1622
int ncons
Number of conserved scalars in the state (temperature + salt + passive scalars)
Definition REMORA.H:1480
void WriteNCMultiFab(const amrex::FabArray< amrex::FArrayBox > &fab, const std::string &name, bool set_ghost=false) const
Write MultiFab in NetCDF format.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_zeta_full_domain
high resolution initial free surface height (2D)
Definition REMORA.H:477
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rv2d
v velocity RHS (2D, includes horizontal and vertical advection)
Definition REMORA.H:353
std::string nc_init_file_hires
Init file for high resolution.
Definition REMORA.H:1609
void prsgrd(const amrex::Box &bx, const amrex::Box &gbx, const amrex::Box &utbx, const amrex::Box &vtbx, const amrex::Array4< amrex::Real > &ru, const amrex::Array4< amrex::Real > &rv, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &rho, const amrex::Array4< amrex::Real > &FC, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &z_w, const amrex::Array4< amrex::Real const > &msku, const amrex::Array4< amrex::Real const > &mskv, const int nrhs, const int N)
Calculate pressure gradient.
static amrex::Real fixed_dt
User specified fixed baroclinic time step.
Definition REMORA.H:1488
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_evap
evaporation rate [kg/m^2/s]
Definition REMORA.H:434
amrex::Real last_plot_file_time
Simulation time when we last output a plotfile.
Definition REMORA.H:1454
void update_massflux_3d(int lev, const amrex::Box &bx, const int ioff, const int joff, const amrex::Array4< amrex::Real > &phi, const amrex::Array4< amrex::Real > &phibar, const amrex::Array4< amrex::Real > &Hphi, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &pm_or_pn, const amrex::Array4< amrex::Real const > &Dphi1, const amrex::Array4< amrex::Real const > &Dphi2, const amrex::Array4< amrex::Real > &DC, const amrex::Array4< amrex::Real > &FC, const amrex::Array4< amrex::Real const > &msk, const int nnew)
Correct mass flux.
void scale_rhs_vars()
Scale RHS momentum variables by 1/cell area, needed before FillPatch to different levels.
int zvel_bc() const noexcept
Definition REMORA.H:1183
void init_full_domain_zeta_from_analytic()
Initialize high resolution initial sea surface height from analytic functions.
static bool plot_staggered_vels
Whether to write the staggered velocities (not averaged to cell centers)
Definition REMORA.H:1584
void init_bathymetry_from_netcdf(int lev)
Bathymetry data initialization from NetCDF file.
void init_bcs()
Read in boundary parameters from input file and set up data structures.
int xvel_bc() const noexcept
Definition REMORA.H:1181
amrex::Vector< amrex::BCRec > domain_bcs_type
vector (over BCVars) of BCRecs
Definition REMORA.H:1429
bool set_bcs_by_var
whether to set boundary conditions by variable rather than just by side
Definition REMORA.H:1414
void set_zeta_averaged_down(int lev)
Copy over zeta data that has been averaged down from high res.
Definition REMORA.cpp:717
void calculate_nodal_masks(int lev)
Calculate u-, v-, and psi-point masks based on rho-point masks after analytic initialization.
std::unique_ptr< NCTimeSeries > qair_data_from_file
Data container for specific humidity read from file.
Definition REMORA.H:1306
static amrex::Real previousCPUTimeUsed
Accumulator variable for CPU time used thusfar.
Definition REMORA.H:1703
amrex::Vector< std::string > cons_names
Names of scalars for plotfile output.
Definition REMORA.H:1531
amrex::Vector< std::unique_ptr< amrex::YAFluxRegister > > advflux_reg
array of flux registers for refluxing in multilevel
Definition REMORA.H:1420
std::unique_ptr< NCTimeSeries > sustr_data_from_file
Data container for u-component surface momentum flux read from file.
Definition REMORA.H:1296
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_fcor
coriolis factor (2D)
Definition REMORA.H:500
void allocate_init_full_domain()
Allocate multifabs for storing full-domain high resolution initial data.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_btflux
Bottom tracer flux; input arrays.
Definition REMORA.H:429
void init_gls_vmix(int lev, SolverChoice solver_choice)
Initialize GLS variables.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rubar
barotropic x velocity for the RHS (2D)
Definition REMORA.H:464
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_xvel_full_domain
multilevel data container for high res initial x velocities (u in ROMS)
Definition REMORA.H:326
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_h
multilevel data container for current step's z velocities (largely unused; W stored separately)
Definition REMORA.H:335
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_pm
horizontal scaling factor: 1 / dx (2D)
Definition REMORA.H:491
amrex::MultiFab fine_mask
Mask that zeroes out values on a coarse level underlying grids on the next finest level.
Definition REMORA.H:1655
void set2DPlotVariables(const std::string &pp_plot_var_names_2d)
amrex::Vector< REMORAFillPatcher > FPr_v
Vector over levels of FillPatchers for v (3D)
Definition REMORA.H:1364
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_ZoBot
Bottom roughness length [m], defined at rho points.
Definition REMORA.H:448
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_DU_avg2
correct time average of barotropic x velocity flux for coupling (2D)
Definition REMORA.H:458
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_lrflx
longwave radiation
Definition REMORA.H:414
void init_zeta_full_domain_from_netcdf()
Full-domain high res sea-surface height data initialization from NetCDF file.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_yv
y_grid on v-points (2D)
Definition REMORA.H:515
static void print_error(MPI_Comm, const std::string &msg)
amrex::Vector< amrex::MultiFab * > cons_new
multilevel data container for current step's scalar data: temperature, salinity, passive tracer
Definition REMORA.H:315
static bool write_history_file
Whether to output NetCDF files as a single history file with several time steps.
Definition REMORA.H:1293
virtual void MakeNewLevelFromCoarse(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Make a new level using provided BoxArray and DistributionMapping and fill with interpolated coarse le...
void FillCoarsePatch(int lev, amrex::Real time, amrex::MultiFab *mf_fine, amrex::MultiFab *mf_crse, const int bccomp, const int bdy_var_type=BdyVars::null, const int icomp=0, const bool fill_all=true, const int n_not_fill=0, const int icomp_calc=0, const amrex::Real dt=amrex::Real(0.0), const amrex::MultiFab &mf_calc=amrex::MultiFab())
fill an entire multifab by interpolating from the coarser level
int tke_bc() const noexcept
Definition REMORA.H:1187
void stretch_transform(int lev)
Calculate vertical stretched coordinates.
std::unique_ptr< NCTimeSeries > rain_data_from_file
Data container for precipitation rate read from file.
Definition REMORA.H:1314
void set_curvilinear_terms_from_grid_scale(int lev)
Set curvilinear derivative terms on level lev based on pm and pn.
amrex::Gpu::DeviceVector< amrex::Real > s_w
Scaled vertical coordinate (range [0,1]) that transforms to z, defined at w-points (cell faces)
Definition REMORA.H:377
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_vwind
Wind in the v direction, defined at rho-points.
Definition REMORA.H:403
std::unique_ptr< ProblemBase > prob
Pointer to container of analytical functions for problem definition.
Definition REMORA.H:1393
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_mskr
land/sea mask at cell centers (2D)
Definition REMORA.H:480
void Construct_REMORAFillPatchers(int lev)
Construct FillPatchers.
Definition REMORA.cpp:481
void advance_3d(int lev, amrex::MultiFab &mf_cons, amrex::MultiFab &mf_u, amrex::MultiFab &mf_v, amrex::MultiFab *mf_sstore, amrex::MultiFab *mf_ru, amrex::MultiFab *mf_rv, std::unique_ptr< amrex::MultiFab > &mf_DU_avg1, std::unique_ptr< amrex::MultiFab > &mf_DU_avg2, std::unique_ptr< amrex::MultiFab > &mf_DV_avg1, std::unique_ptr< amrex::MultiFab > &mf_DV_avg2, std::unique_ptr< amrex::MultiFab > &mf_ubar, std::unique_ptr< amrex::MultiFab > &mf_vbar, std::unique_ptr< amrex::MultiFab > &mf_Akv, std::unique_ptr< amrex::MultiFab > &mf_Akt, std::unique_ptr< amrex::MultiFab > &mf_Hz, std::unique_ptr< amrex::MultiFab > &mf_Huon, std::unique_ptr< amrex::MultiFab > &mf_Hvom, std::unique_ptr< amrex::MultiFab > &mf_z_w, amrex::MultiFab const *mf_h, amrex::MultiFab const *mf_pm, amrex::MultiFab const *mf_pn, amrex::MultiFab const *mf_mskr, amrex::MultiFab const *mf_msku, amrex::MultiFab const *mf_mskv, const int N, const amrex::Real dt_lev)
Advance the 3D variables.
void init_grid_vars_from_netcdf(int lev)
Grid variable initialization from NetCDF file.
static int sum_interval
Diagnostic sum output interval in number of steps.
Definition REMORA.H:1576
int history_count
Counter for which time index we are writing to in the netcdf history file.
Definition REMORA.H:1524
amrex::Real stop_time
Time to stop.
Definition REMORA.H:1469
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rain
precipitation rate [kg/m^2/s]
Definition REMORA.H:432
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_tke
Turbulent kinetic energy.
Definition REMORA.H:548
void rho_eos(const amrex::Box &bx, const amrex::Array4< amrex::Real const > &state, const amrex::Array4< amrex::Real > &rho, const amrex::Array4< amrex::Real > &rhoA, const amrex::Array4< amrex::Real > &rhoS, const amrex::Array4< amrex::Real > &bvf, const amrex::Array4< amrex::Real > &alpha, const amrex::Array4< amrex::Real > &beta, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &z_w, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &h, const amrex::Array4< amrex::Real const > &mskr, const int N)
Wrapper around equation of state calculation.
static void print_summary(std::ostream &)
int do_substep
Whether to substep fine levels in time.
Definition REMORA.H:1497
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_stflx
Surface tracer flux; working arrays.
Definition REMORA.H:423
void Evolve()
Advance solution to final time.
Definition REMORA.cpp:247
void t3dmix2(const amrex::Box &bx, const amrex::Array4< amrex::Real > &state, const amrex::Array4< amrex::Real > &state_rhs, const amrex::Array4< amrex::Real const > &diff2, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &msku, const amrex::Array4< amrex::Real const > &mskv, const amrex::Real dt_lev, const int ncomp, const int N)
Wrapper for harmonic diffusivity for tracers.
std::string bdry_time_varname
Default name of time field for boundary data.
Definition REMORA.H:1627
amrex::Real plotfile_fill_value
fill value for masked arrays in amrex plotfiles
Definition REMORA.H:1543
void ReadCheckpointFile()
read checkpoint file from disk
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_gls
Turbulent generic length scale.
Definition REMORA.H:550
bool chunk_history_file
Whether to chunk netcdf history file.
Definition REMORA.H:1517
void writeJobInfo(const std::string &dir) const
Write job info to stdout.
int num_bc_vars() const noexcept
Definition REMORA.H:1192
void ApplyAtmosphericFluxes(const amrex::Vector< amrex::MultiFab * > &states, amrex::Real time)
Receives atmospheric flux lanes from the driver and assembles REMORA flux inputs.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_sustr
Surface stress in the u direction.
Definition REMORA.H:396
amrex::Real get_t_old(int lev) const
Accessor method for t_old to expose to outside classes.
Definition REMORA.cpp:1884
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_yp
y_grid on psi-points (2D)
Definition REMORA.H:520
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_xr
x_grid on rho points (2D)
Definition REMORA.H:503
int yvel_bc() const noexcept
Definition REMORA.H:1182
std::unique_ptr< NCTimeSeries > longwave_down_data_from_file
Data container for downward longwave radiation flux read from file.
Definition REMORA.H:1312
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_ru2d
u velocity RHS (2D, includes horizontal and vertical advection)
Definition REMORA.H:351
virtual void ClearLevel(int lev) override
Delete level data Overrides the pure virtual function in AmrCore.
amrex::Vector< std::string > datalogname
Definition REMORA.H:1735
amrex::Vector< amrex::MultiFab * > zvel_new
multilevel data container for current step's z velocities (largely unused; W stored separately)
Definition REMORA.H:321
AMREX_FORCE_INLINE int ComputeGhostCells(const int &spatial_order)
Helper function to determine number of ghost cells.
Definition REMORA.H:1660
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_sstore
additional scratch space for calculations on temp, salt, etc
Definition REMORA.H:528
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_xv
x_grid on v-points (2D)
Definition REMORA.H:513
void WriteAtIntermediateTime(int step, amrex::Real cur_time)
Write checkpoint and plotfiles at intermediate point of simulation, if needed.
Definition REMORA.cpp:319
void init_only(int lev, amrex::Real time)
Init (NOT restart or regrid)
Definition REMORA.cpp:1254
void init_set_vmix(int lev)
Initialize vertical mixing coefficients from file or analytic.
Definition REMORA.cpp:774
amrex::Real EvolveOneStep(amrex::Real time, amrex::Real dt_request)
std::unique_ptr< NCTimeSeries > v_clim_data_from_file
Data container for v-velocity climatology data read from file.
Definition REMORA.H:1327
std::string clim_u_time_varname
Name of time field for u climatology data.
Definition REMORA.H:1636
void rhs_uv_3d(int lev, const amrex::Box &xbx, const amrex::Box &ybx, const amrex::Array4< amrex::Real const > &uold, const amrex::Array4< amrex::Real const > &vold, const amrex::Array4< amrex::Real > &ru, const amrex::Array4< amrex::Real > &rv, const amrex::Array4< amrex::Real > &rufrc, const amrex::Array4< amrex::Real > &rvfrc, const amrex::Array4< amrex::Real const > &sustr, const amrex::Array4< amrex::Real const > &svstr, const amrex::Array4< amrex::Real const > &bustr, const amrex::Array4< amrex::Real const > &bvstr, const amrex::Array4< amrex::Real const > &Huon, const amrex::Array4< amrex::Real const > &Hvom, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &W, const amrex::Array4< amrex::Real > &FC, int nrhs, int N)
RHS terms for 3D momentum.
void set_grid_scale(int lev)
Set pm and pn arrays and x/y coords on level lev.
void set_coriolis(int lev)
Initialize Coriolis factor from file or analytic.
Definition REMORA.cpp:745
int foextrap_bc() const noexcept
Definition REMORA.H:1189
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Lscale
Vertical mixing turbulent length scale.
Definition REMORA.H:552
amrex::Vector< REMORAFillPatcher > FPr_u
Vector over levels of FillPatchers for u (3D)
Definition REMORA.H:1362
std::string clim_temp_time_varname
Name of time field for temperature climatology data.
Definition REMORA.H:1642
amrex::Vector< amrex::Vector< amrex::Box > > boxes_at_level
the boxes specified at each level by tagging criteria
Definition REMORA.H:1400
void prestep_diffusion(const amrex::Box &bx, const amrex::Box &gbx, const int ioff, const int joff, const amrex::Array4< amrex::Real > &vel, const amrex::Array4< amrex::Real const > &vel_old, const amrex::Array4< amrex::Real > &rvel, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &Akv, const amrex::Array4< amrex::Real > &FC, const amrex::Array4< amrex::Real const > &sstr, const amrex::Array4< amrex::Real const > &bstr, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const int iic, const int ntfirst, const int nnew, int nstp, int nrhs, int N, const amrex::Real lambda, const amrex::Real dt_lev)
Update velocities or tracers with diffusion/viscosity as the last part of the prestep.
void vert_mean_3d(const amrex::Box &bx, const int ioff, const int joff, const amrex::Array4< amrex::Real > &phi, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &Dphi_avg1, const amrex::Array4< amrex::Real > &DC, const amrex::Array4< amrex::Real > &CF, const amrex::Array4< amrex::Real const > &pm_or_pn, const amrex::Array4< amrex::Real const > &msk, const int nnew, const int N)
Adjust 3D momentum variables based on vertical mean momentum.
static amrex::Vector< amrex::AMRErrorTag > ref_tags
Holds info for dynamically generated tagging criteria.
Definition REMORA.H:1652
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Hz
Width of cells in the vertical (z-) direction (3D, Hz in ROMS)
Definition REMORA.H:341
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akt
Vertical diffusion coefficient (3D)
Definition REMORA.H:361
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_msku
land/sea mask at x-faces (2D)
Definition REMORA.H:482
std::unique_ptr< NCTimeSeriesRiver > river_source_transportbar
Data container for vertically integrated momentum transport in rivers.
Definition REMORA.H:1338
std::array< bool, AtmosState::NumTypes > driver_atmos_state_from_driver
provenance flags for driver-supplied atmospheric forcing lanes
Definition REMORA.H:441
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rvfrc
v velocity RHS, integrated, including advection and bottom/surface stresses (2D)
Definition REMORA.H:357
int v2d_simple_bc() const noexcept
Definition REMORA.H:1191
void extrapolate_metric_to_physical_boundaries(amrex::MultiFab &mf, const amrex::Geometry &geom)
Extrapolate grid metrics to edge of MultiFab.
std::string clim_ubar_time_varname
Name of time field for ubar climatology data.
Definition REMORA.H:1632
std::unique_ptr< NCTimeSeries > u_clim_data_from_file
Data container for u-velocity climatology data read from file.
Definition REMORA.H:1325
std::string check_file
Checkpoint file prefix.
Definition REMORA.H:1510
void FillPatchNoBC(int lev, amrex::Real time, amrex::MultiFab &mf_to_be_filled, amrex::Vector< amrex::MultiFab * > const &mfs, const int bdy_var_type=BdyVars::null, const int icomp=0, const bool fill_all=true, const bool fill_set=true)
Fill a new MultiFab by copying in phi from valid region and filling ghost cells without applying boun...
static amrex::Real startCPUTime
Variable for CPU timing.
Definition REMORA.H:1701
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_pm_full_domain
horizontal scaling factor: 1 / dx (2D) on whole domain
Definition REMORA.H:495
amrex::Vector< amrex::MultiFab * > xvel_old
multilevel data container for last step's x velocities (u in ROMS)
Definition REMORA.H:308
amrex::Real start_time
Time of the start of the simulation, in seconds.
Definition REMORA.H:1472
void init_data_from_netcdf(int lev)
Problem initialization from NetCDF file.
void init_masks_from_netcdf(int lev)
Mask data initialization from NetCDF file.
amrex::Vector< amrex::MultiFab * > yvel_new
multilevel data container for current step's y velocities (v in ROMS)
Definition REMORA.H:319
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_uwind
Wind in the u direction, defined at rho-points.
Definition REMORA.H:401
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rufrc
u velocity RHS, integrated, including advection and bottom/surface stresses (2D)
Definition REMORA.H:355
static bool plot_nodal_data
Whether to write nodal data (Nu_nd) to plotfiles.
Definition REMORA.H:1587
static amrex::Real fixed_fast_dt
User specified fixed barotropic time step.
Definition REMORA.H:1490
int regrid_int
how often each level regrids the higher levels of refinement (after a level advances that many time s...
Definition REMORA.H:1500
amrex::Real check_int_time
Checkpoint output interval in seconds.
Definition REMORA.H:1514
amrex::Box nc_hires_init_box
Box for the full domain at nc_hires_init_level.
Definition REMORA.H:1611
amrex::Real bdy_time_interval
Interval between boundary data times.
Definition REMORA.H:1290
void gls_prestep(int lev, amrex::MultiFab *mf_gls, amrex::MultiFab *mf_tke, amrex::MultiFab &mf_W, amrex::MultiFab *mf_msku, amrex::MultiFab *mf_mskv, const int nstp, const int nnew, const int iic, const int ntfirst, const int N, const amrex::Real dt_lev)
Prestep for GLS calculation.
void init_scalar_metadata()
Build runtime scalar names after nscalar is known.
Definition REMORA.cpp:234
amrex::Real start_bdy_time
Start time in the time series of boundary data.
Definition REMORA.H:1288
int zeta_bc() const noexcept
Definition REMORA.H:1186
amrex::Vector< amrex::GpuArray< REMORA_BC, AMREX_SPACEDIM *2 > > phys_bc_type
Array holding the "physical" boundary condition types (e.g. "inflow")
Definition REMORA.H:1440
amrex::Vector< amrex::Real > vec_weight2
Weights for calculating avg2 in 2D advance.
Definition REMORA.H:544
amrex::Vector< int > bdy_index
Container to connect boundary data being read in boundary condition containers.
Definition REMORA.H:1449
amrex::Gpu::DeviceVector< amrex::Real > s_r
Scaled vertical coordinate (range [0,1]) that transforms to z, defined at rho points (cell centers)
Definition REMORA.H:375
void Define_REMORAFillPatchers(int lev)
Define FillPatchers.
Definition REMORA.cpp:530
amrex::Vector< amrex::IntVect > cum_ref_ratios
Cumulative refinement ratio between level 0 and level i.
Definition REMORA.H:1614
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_shflx
sensible heat flux
Definition REMORA.H:420
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_visc2_p
Harmonic viscosity defined on the psi points (corners of horizontal grid cells)
Definition REMORA.H:363
void set_drag(int lev)
Initialize or calculate bottom drag.
amrex::MultiFab & build_fine_mask(int lev)
Make mask to zero out covered cells (for mesh refinement)
amrex::Real plot_int_time
Plotfile output interval in seconds.
Definition REMORA.H:1508
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_dmde
d(1/m)/d(eta)
Definition REMORA.H:525
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rvbar
barotropic y velocity for the RHS (2D)
Definition REMORA.H:466
amrex::Vector< int > num_files_at_level
how many netcdf input files specified at each level
Definition REMORA.H:1398
void advance_2d_onestep(int lev, amrex::Real dt_lev, amrex::Real dtfast_lev, int my_iif, int nfast_counter)
2D advance, one predictor/corrector step
amrex::Vector< REMORAFillPatcher > FPr_vbar
Vector over levels of FillPatchers for vbar (2D)
Definition REMORA.H:1372
void AverageDownTo(int crse_lev)
more flexible version of AverageDown() that lets you average down across multiple levels
Definition REMORA.cpp:1822
int steps_per_history_file
Number of time steps per netcdf history file.
Definition REMORA.H:1522
void post_timestep(int nstep, amrex::Real time, amrex::Real dt_lev)
Called after every level 0 timestep.
Definition REMORA.cpp:344
int max_step
maximum number of steps
Definition REMORA.H:1467
amrex::Vector< amrex::MultiFab * > zvel_old
multilevel data container for last step's z velocities (largely unused; W stored separately)
Definition REMORA.H:312
std::unique_ptr< NCTimeSeries > svstr_data_from_file
Data container for v-component surface momentum flux read from file.
Definition REMORA.H:1298
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_z_r
z coordinates at rho points (cell centers)
Definition REMORA.H:370
amrex::Vector< std::string > nc_frc_file
NetCDF forcing file(s)
Definition REMORA.H:1617
amrex::Vector< int > num_boxes_at_level
how many boxes specified at each level by tagging criteria
Definition REMORA.H:1396
amrex::Vector< amrex::MultiFab * > xvel_new
multilevel data container for current step's x velocities (u in ROMS)
Definition REMORA.H:317
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_lhflx
latent heat flux
Definition REMORA.H:418
void refinement_criteria_setup()
Set refinement criteria.
int u2d_simple_bc() const noexcept
Definition REMORA.H:1190
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_mskp
land/sea mask at cell corners (2D)
Definition REMORA.H:486
void remora_advance(int level, amrex::MultiFab &cons_old, amrex::MultiFab &cons_new, amrex::MultiFab &xvel_old, amrex::MultiFab &yvel_old, amrex::MultiFab &zvel_old, amrex::MultiFab &xvel_new, amrex::MultiFab &yvel_new, amrex::MultiFab &zvel_new, amrex::MultiFab &source, const amrex::Geometry fine_geom, const amrex::Real dt, const amrex::Real time)
Interface for advancing the data at one level by one "slow" timestep.
int last_check_file_step
Step when we last output a checkpoint file.
Definition REMORA.H:1457
void prestep(int lev, amrex::MultiFab &mf_uold, amrex::MultiFab &mf_vold, amrex::MultiFab &mf_u, amrex::MultiFab &mf_v, amrex::MultiFab *mf_ru, amrex::MultiFab *mf_rv, amrex::MultiFab &S_old, amrex::MultiFab &S_new, amrex::MultiFab &mf_W, amrex::MultiFab &mf_DC, const amrex::MultiFab *mf_z_r, const amrex::MultiFab *mf_z_w, const amrex::MultiFab *mf_h, const amrex::MultiFab *mf_pm, const amrex::MultiFab *mf_pn, const amrex::MultiFab *mf_sustr, const amrex::MultiFab *mf_svstr, const amrex::MultiFab *mf_bustr, const amrex::MultiFab *mf_bvstr, const amrex::MultiFab *mf_msku, const amrex::MultiFab *mf_mskv, const int iic, const int nfirst, const int nnew, int nstp, int nrhs, int N, const amrex::Real dt_lev)
Wrapper function for prestep.
void init_beta_plane_coriolis(int lev)
Calculate Coriolis parameters from beta plane parametrization.
std::string clim_vbar_time_varname
Name of time field for vbar climatology data.
Definition REMORA.H:1634
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_bvf
Brunt-Vaisala frequency (3D)
Definition REMORA.H:535
virtual void RemakeLevel(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Remake an existing level using provided BoxArray and DistributionMapping and fill with existing fine ...
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_mskv
land/sea mask at y-faces (2D)
Definition REMORA.H:484
void init_masks(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Allocate MultiFabs for masks.
amrex::Vector< int > nsubsteps
How many substeps on each level?
Definition REMORA.H:1405
amrex::Vector< std::unique_ptr< REMORAPhysBCFunct > > physbcs
Vector (over level) of functors to apply physical boundary conditions.
Definition REMORA.H:1417
void ComputeDt()
a wrapper for estTimeStep()
void fill_3d_masks(int lev)
Copy maskr to all z levels.
static void writeBuildInfo(std::ostream &os)
Write build info to os.
std::unique_ptr< NCTimeSeries > EminusP_data_from_file
Data container for evaporation minus precipitation read from file.
Definition REMORA.H:1318
virtual void ErrorEst(int lev, amrex::TagBoxArray &tags, amrex::Real time, int ngrow) override
Tag cells for refinement.
int plot_int
Plotfile output interval in iterations.
Definition REMORA.H:1506
void FillPatch(int lev, amrex::Real time, amrex::MultiFab &mf_to_be_filled, amrex::Vector< amrex::MultiFab * > const &mfs, const int bccomp, const int bdy_var_type=BdyVars::null, const int icomp=0, const bool fill_all=true, const bool fill_set=true, const int n_not_fill=0, const int icomp_calc=0, const amrex::Real dt=amrex::Real(0.0), const amrex::MultiFab &mf_calc=amrex::MultiFab())
Fill a new MultiFab by copying in phi from valid region and filling ghost cells.
std::unique_ptr< NCTimeSeries > cloud_data_from_file
Data container for cloud cover fraction read from file.
Definition REMORA.H:1316
amrex::Real getCPUTime() const
Get CPU time used.
Definition REMORA.H:1707
void WriteAtFinalTime()
Write checkpoint and plotfiles at end of simulation.
Definition REMORA.cpp:304
void InitData()
Initialize multilevel data.
Definition REMORA.cpp:376
void set3DPlotVariables(const std::string &pp_plot_var_names_3d)
amrex::Vector< int > istep
which step?
Definition REMORA.H:1403
void apply_clim_nudg(const amrex::Box &bx, int ioff, int joff, const amrex::Array4< amrex::Real > &var, const amrex::Array4< amrex::Real const > &var_old, const amrex::Array4< amrex::Real const > &var_clim, const amrex::Array4< amrex::Real const > &clim_coeff, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const amrex::Real dt_lev=amrex::Real(0.0))
Apply climatology nudging.
void uv3dmix(const amrex::Box &xbx, const amrex::Box &ybx, const amrex::Array4< amrex::Real > &u, const amrex::Array4< amrex::Real > &v, const amrex::Array4< amrex::Real const > &uold, const amrex::Array4< amrex::Real const > &vold, const amrex::Array4< amrex::Real > &rufrc, const amrex::Array4< amrex::Real > &rvfrc, const amrex::Array4< amrex::Real const > &visc2_p, const amrex::Array4< amrex::Real const > &visc2_r, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &mskp, int nrhs, int nnew, const amrex::Real dt_lev)
Harmonic viscosity.
void WriteCheckpointFile()
write checkpoint file to disk
std::string nc_clim_coeff_file
NetCDF climatology coefficient file.
Definition REMORA.H:1624
void lin_eos(const amrex::Box &bx, const amrex::Array4< amrex::Real const > &state, const amrex::Array4< amrex::Real > &rho, const amrex::Array4< amrex::Real > &rhoA, const amrex::Array4< amrex::Real > &rhoS, const amrex::Array4< amrex::Real > &bvf, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &z_w, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &h, const amrex::Array4< amrex::Real const > &mskr, const int N)
Calculate density and related quantities from linear equation of state.
void setRecordDataInfo(int i, const std::string &filename)
Definition REMORA.H:1721
void advance_3d_ml(int lev, amrex::Real dt_lev)
3D advance on a single level
const std::string DataLogName(int i) const noexcept
The filename of the ith datalog file.
Definition REMORA.H:1738
void WriteMultiLevelPlotfileWithBathymetry(const std::string &plotfilename, int nlevels, const amrex::Vector< const amrex::MultiFab * > &mf, const amrex::Vector< const amrex::MultiFab * > &mf_nd, const amrex::Vector< const amrex::MultiFab * > &mf_u, const amrex::Vector< const amrex::MultiFab * > &mf_v, const amrex::Vector< const amrex::MultiFab * > &mf_w, const amrex::Vector< const amrex::MultiFab * > &mf_2d_rho, const amrex::Vector< const amrex::MultiFab * > &mf_2d_u, const amrex::Vector< const amrex::MultiFab * > &mf_2d_v, const amrex::Vector< std::string > &varnames_3d, const amrex::Vector< std::string > &varnames_2d_rho, const amrex::Vector< std::string > &varnames_2d_u, const amrex::Vector< std::string > &varnames_2d_v, const amrex::Vector< amrex::Geometry > &my_geom, amrex::Real time, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &rr, const std::string &versionName="HyperCLaw-V1.1", const std::string &levelPrefix="Level_", const std::string &mfPrefix="Cell", const amrex::Vector< std::string > &extra_dirs=amrex::Vector< std::string >()) const
write out particular data to an AMReX plotfile
void set_analytic_vmix(int lev)
Set vertical mixing coefficients from analytic.
Definition REMORA.cpp:791
void mask_arrays_for_write(int lev, amrex::Real fill_value, amrex::Real fill_where)
Mask data arrays before writing output.
void init_flat_bathymetry(int lev)
Initialize flat bathymetry to value from problo.
Definition REMORA.cpp:1118
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rhoS
density perturbation
Definition REMORA.H:531
std::unique_ptr< NCTimeSeries > temp_clim_data_from_file
Data container for temperature climatology data read from file.
Definition REMORA.H:1329
amrex::Vector< std::string > bdry_time_name_byvar
Name of time fields for boundary data.
Definition REMORA.H:1629
void rhs_uv_2d(int lev, const amrex::Box &xbx, const amrex::Box &ybx, const amrex::Array4< amrex::Real const > &uold, const amrex::Array4< amrex::Real const > &vold, const amrex::Array4< amrex::Real > &ru, const amrex::Array4< amrex::Real > &rv, const amrex::Array4< amrex::Real const > &Duon, const amrex::Array4< amrex::Real const > &Dvom, const int nrhs)
RHS terms for 2D momentum.
static int file_min_digits
Minimum number of digits in plotfile name or chunked history file.
Definition REMORA.H:1581
void init_riv_pos_from_netcdf(int lev)
static amrex::Vector< std::string > nc_bdry_file
NetCDF boundary data.
Definition REMORA.H:54
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_visc2_r
Harmonic viscosity defined on the rho points (centers)
Definition REMORA.H:365
void update_mskp(int lev)
Set psi-point mask to be consistent with rho-point mask.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_yvel_full_domain
multilevel data container for high res initial y velocities (v in ROMS)
Definition REMORA.H:328
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_svstr
Surface stress in the v direction.
Definition REMORA.H:398
std::unique_ptr< NCTimeSeries > srflx_data_from_file
Data container for shortwave radiation flux read from file.
Definition REMORA.H:1310
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Huon
u-volume flux (3D)
Definition REMORA.H:343
REMORA()
Definition REMORA.cpp:65
void FillBdyCCVels(int lev, amrex::MultiFab &mf_cc_vel)
Fill the physical boundary conditions for cell-centered velocity (diagnostic only)
void set_zeta(int lev)
Initialize zeta from file or analytic.
Definition REMORA.cpp:590
static amrex::Real change_max
Fraction maximum change in subsequent time steps.
Definition REMORA.H:1486
void calc_stretch_coeffs()
calculate vertical stretch coefficients
void init_zeta_from_netcdf(int lev)
Sea-surface height data initialization from NetCDF file.
void set_zeta_average(int lev)
Set Zt_avg1 to zeta.
void init_coriolis_from_netcdf(int lev)
Coriolis parameter data initialization from NetCDF file.
static void print_usage(MPI_Comm, std::ostream &)
void fill_from_bdyfiles(int lev, amrex::MultiFab &mf_to_fill, const amrex::MultiFab &mf_mask, const amrex::Real time, const int bccomp, const int bdy_var_type, const int icomp_to_fill, const int icomp_calc=0, const amrex::MultiFab &mf_calc=amrex::MultiFab(), const amrex::Real=amrex::Real(0.0))
Fill boundary data from netcdf file.
std::string pp_prefix
default prefix for input file parameters
Definition REMORA.H:303
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_h_full_domain
Bathymetry data on the whole domain at each potential level.
Definition REMORA.H:338
void set_bathymetry(int lev)
Initialize bathymetry from file or analytic.
Definition REMORA.cpp:629
amrex::Vector< amrex::MultiFab * > yvel_old
multilevel data container for last step's y velocities (v in ROMS)
Definition REMORA.H:310
std::unique_ptr< NCTimeSeries > ubar_clim_data_from_file
Data container for ubar climatology data read from file.
Definition REMORA.H:1321
void init_stuff(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm)
Allocate MultiFabs for state and evolution variables.
void init_full_domain_from_analytic()
Initialize high resolution initial problem data from analytic functions.
TimeInterpolatedData GetDataAtTime(int lev, amrex::Real time)
utility to copy in data from old and/or new state into another multifab
void Advance(int lev, amrex::Real time, amrex::Real dt_lev, int iteration, int ncycle)
advance a single level for a single time step
void init_data_full_domain_from_netcdf()
High resolution roblem initialization from NetCDF file.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rhoA
vertically-averaged density
Definition REMORA.H:533
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_DV_avg1
time average of barotropic y velocity flux
Definition REMORA.H:460
amrex::Vector< REMORAFillPatcher > FPr_c
Vector over levels of FillPatchers for scalars.
Definition REMORA.H:1360
int hires_init_level
Which level the high resolution initialization data is at.
Definition REMORA.H:1607
void WriteNCPlotFile(int istep, amrex::MultiFab const *plotMF)
Write plotfile using NetCDF (wrapper)
std::unique_ptr< NCTimeSeries > Tair_data_from_file
Data container for air temperature read from file.
Definition REMORA.H:1304
void rhs_t_3d(int lev, const amrex::Box &bx, const amrex::Array4< amrex::Real > &t, const amrex::Array4< amrex::Real const > &tempstore, const amrex::Array4< amrex::Real const > &Huon, const amrex::Array4< amrex::Real const > &Hvom, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &W, const amrex::Array4< amrex::Real > &FC, const amrex::Array4< amrex::Real const > &mskr, const amrex::Array4< amrex::Real const > &msku, const amrex::Array4< amrex::Real const > &mskv, const amrex::Array4< int const > &river_pos, const amrex::Array4< amrex::Real const > &river_source, int nrhs, int nnew, int N, const amrex::Real dt_lev)
RHS terms for tracer.
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real bulk_psiu(amrex::Real ZoL)
Evaluate stability function psi for wind speed.
Definition REMORA.H:1757
static void print_banner(MPI_Comm, std::ostream &)
int nscalar
Number of passive scalars carried in the state.
Definition REMORA.H:1478
std::string clim_v_time_varname
Name of time field for v climatology data.
Definition REMORA.H:1638
void scale_rhs_vars_inv()
Scale RHS momentum variables by cell area, needed after FillPatch to different levels.
amrex::Vector< REMORAFillPatcher > FPr_w
Vector over levels of FillPatchers for w.
Definition REMORA.H:1366
void average_down_with_grow_cells(int lev, amrex::Vector< std::unique_ptr< amrex::MultiFab > > &mf)
Average down from level lev+1 to lev in mf, including grow cells.
Definition REMORA.cpp:1850
std::string clim_salt_time_varname
Name of time field for salinity climatology data.
Definition REMORA.H:1640
amrex::Gpu::DeviceVector< amrex::Real > Cs_r
Stretching coefficients at rho points.
Definition REMORA.H:385
std::unique_ptr< NCTimeSeries > Uwind_data_from_file
Data container for u-direction wind read from file.
Definition REMORA.H:1300
std::unique_ptr< NCTimeSeries > Pair_data_from_file
Data container for air pressure read from file.
Definition REMORA.H:1308
amrex::Vector< amrex::Real > t_new
new time at each level
Definition REMORA.H:1407
void init_stretch_coeffs()
initialize and calculate stretch coefficients
void init_bdry_from_netcdf(int lev)
Boundary data initialization from NetCDF file.
static SolverChoice solverChoice
Container for algorithmic choices.
Definition REMORA.H:1537
void ApplyAtmosphericStates(const amrex::Vector< amrex::MultiFab * > &states, amrex::Real time)
Receives atmospheric states from the driver and applies unit conversions.
void set_grid_coords_from_grid_scale(int lev)
Set x/y coords on level lev based on pm and pn.
void resize_stuff(int lev)
Resize variable containers to accommodate data on levels 0 to max_lev.
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > vec_river_position
iMultiFab for river positions; contents are indices of rivers
Definition REMORA.H:1345
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akk
Turbulent kinetic energy vertical diffusion coefficient.
Definition REMORA.H:554
void set_masks(int lev)
Initialize land-sea masks from file or analytic.
Definition REMORA.cpp:807
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rdrag2
Quadratic drag coefficient [unitless], defined at rho points.
Definition REMORA.H:446
amrex::Vector< amrex::Vector< std::unique_ptr< NCTimeSeriesBoundary > > > boundary_series
Vector over BdyVars of boundary series data containers.
Definition REMORA.H:1341
int cf_set_width
Width for fixing values at coarse-fine interface.
Definition REMORA.H:1357
void ReadParameters()
read in some parameters from inputs file
Definition REMORA.cpp:1544
static void print_tpls(std::ostream &)
void WriteGenericPlotfileHeaderWithBathymetry(std::ostream &HeaderFile, int nlevels, const amrex::Vector< amrex::BoxArray > &bArray, const amrex::Vector< std::string > &varnames_3d, const amrex::Vector< std::string > &varnames_2d_rho, const amrex::Vector< std::string > &varnames_2d_u, const amrex::Vector< std::string > &varnames_2d_v, const amrex::Vector< amrex::Geometry > &my_geom, amrex::Real time, const amrex::Vector< int > &level_steps, const amrex::Vector< amrex::IntVect > &rr, const std::string &versionName, const std::string &levelPrefix, const std::string &mfPrefix) const
write out header data for an AMReX plotfile
void vert_visc_3d(const amrex::Box &bx, const int ioff, const int joff, const amrex::Array4< amrex::Real > &phi, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real > &Hzk, const amrex::Array4< amrex::Real > &AK, const amrex::Array4< amrex::Real const > &Akv, const amrex::Array4< amrex::Real > &BC, const amrex::Array4< amrex::Real > &DC, const amrex::Array4< amrex::Real > &FC, const amrex::Array4< amrex::Real > &CF, const int nnew, const int N, const amrex::Real dt_lev)
Calculate effects of vertical viscosity or diffusivity.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_ru
u velocity RHS (3D, includes horizontal and vertical advection)
Definition REMORA.H:347
void sum_integrated_quantities(amrex::Real time)
Integrate conserved quantities for diagnostics.
static int total_nc_plot_file_step
Definition REMORA.H:1196
amrex::Vector< amrex::Real > vec_weight1
Weights for calculating avg1 in 2D advance.
Definition REMORA.H:542
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_xp
x_grid on psi-points (2D)
Definition REMORA.H:518
static amrex::Vector< amrex::Vector< std::string > > nc_grid_file
NetCDF grid file.
Definition REMORA.H:56
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_longwave_down
Downward longwave radiation.
Definition REMORA.H:416
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_zeta
free surface height (2D)
Definition REMORA.H:474
int ubar_bc() const noexcept
Definition REMORA.H:1184
amrex::Gpu::DeviceVector< int > river_direction
Vector over rivers of river direction: 0: u-face; 1: v-face; 2: w-face.
Definition REMORA.H:1347
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_vbar
barotropic y velocity (2D)
Definition REMORA.H:472
void ReadNCMultiFab(amrex::FabArray< amrex::FArrayBox > &fab, const std::string &name, int coordinatorProc=amrex::ParallelDescriptor::IOProcessorNumber(), int allow_empty_mf=0)
Read MultiFab in NetCDF format.
amrex::Box nc_hires_grid_box
Box for the full domain at nc_hires_grid_level.
Definition REMORA.H:1604
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_DU_avg1
time average of barotropic x velocity flux (2D)
Definition REMORA.H:456
amrex::Gpu::DeviceVector< amrex::Real > Cs_w
Stretching coefficients at w points.
Definition REMORA.H:387
void set_zeta_to_Ztavg(int lev)
Set zeta components to be equal to time-averaged Zt_avg1.
bool expand_plotvars_to_unif_rr
whether plotfile variables should be expanded to a uniform refinement ratio
Definition REMORA.H:1540
void advance_2d(int lev, amrex::MultiFab const *mf_rhoS, amrex::MultiFab const *mf_rhoA, amrex::MultiFab *mf_ru2d, amrex::MultiFab *mf_rv2d, amrex::MultiFab *mf_rufrc, amrex::MultiFab *mf_rvfrc, amrex::MultiFab *mf_Zt_avg1, std::unique_ptr< amrex::MultiFab > &mf_DU_avg1, std::unique_ptr< amrex::MultiFab > &mf_DU_avg2, std::unique_ptr< amrex::MultiFab > &mf_DV_avg1, std::unique_ptr< amrex::MultiFab > &mf_DV_avg2, std::unique_ptr< amrex::MultiFab > &mf_rubar, std::unique_ptr< amrex::MultiFab > &mf_rvbar, std::unique_ptr< amrex::MultiFab > &mf_rzeta, std::unique_ptr< amrex::MultiFab > &mf_ubar, std::unique_ptr< amrex::MultiFab > &mf_vbar, amrex::MultiFab *mf_zeta, amrex::MultiFab const *mf_h, amrex::MultiFab const *mf_pm, amrex::MultiFab const *mf_pn, amrex::MultiFab const *mf_fcor, amrex::MultiFab const *mf_visc2_p, amrex::MultiFab const *mf_visc2_r, amrex::MultiFab const *mf_mskr, amrex::MultiFab const *mf_msku, amrex::MultiFab const *mf_mskv, amrex::MultiFab const *mf_mskp, amrex::Real dtfast_lev, bool predictor_2d_step, bool first_2d_step, int my_iif, int &next_indx1)
Perform a 2D predictor (predictor_2d_step=True) or corrector (predictor_2d_step=False) step.
int plot_file_on_restart
Whether to output a plotfile on restart from checkpoint.
Definition REMORA.H:1461
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_alpha
Thermal expansion coefficient (3D)
Definition REMORA.H:537
void set_2darrays(int lev)
Set 2D momentum arrays from 3D momentum.
void FillCoarsePatchMap(int lev, amrex::Real time, amrex::MultiFab *mf_fine, amrex::MultiFab *mf_crse, const int bccomp, const int bdy_var_type=BdyVars::null, const int icomp=0, const bool fill_all=true, const int n_not_fill=0, const int icomp_calc=0, const amrex::Real dt=amrex::Real(0.0), const amrex::MultiFab &mf_calc=amrex::MultiFab(), amrex::Interpolater *mapper=nullptr)
fill an entire multifab by interpolating from the coarser level, explicitly specifying interpolator t...
void init_analytic(int lev)
Initialize initial problem data from analytic functions.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_ubar
barotropic x velocity (2D)
Definition REMORA.H:470
void InitializeLevelFromData(int lev, const amrex::MultiFab &initial_data)
Initialize the new-time data at a level from the initial_data MultiFab.
amrex::Vector< amrex::MultiFab * > cons_old
multilevel data container for last step's scalar data: temperature, salinity, passive tracer
Definition REMORA.H:306
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_bustr
Bottom stress in the u direction.
Definition REMORA.H:451
AMREX_FORCE_INLINE int NumDataLogs() noexcept
Definition REMORA.H:1695
amrex::Real volWgtSumMF(int lev, const amrex::MultiFab &mf, int comp, bool local, bool finemask)
Perform the volume-weighted sum.
std::string frc_time_varname
Name of time field for forcing data.
Definition REMORA.H:1646
void set_wind(int lev)
Initialize or calculate wind speed from file or analytic.
Definition REMORA.cpp:1147
void init_clim_nudg_coeff_from_netcdf(int lev)
Climatology nudging coefficient initialization from NetCDF file.
amrex::Vector< REMORAFillPatcher > FPr_ubar
Vector over levels of FillPatchers for ubar (2D)
Definition REMORA.H:1370
bool is_it_time_for_action(int nstep, amrex::Real time, amrex::Real dt, int action_interval, amrex::Real action_per)
Decide if it is time to take an action.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_cons_full_domain
multilevel data container for high res initial data: temperature, salinity, passive tracer
Definition REMORA.H:324
int vbar_bc() const noexcept
Definition REMORA.H:1185
std::unique_ptr< NCTimeSeries > Vwind_data_from_file
Data container for v-direction wind read from file.
Definition REMORA.H:1302
std::string PlotFileName(int lev) const
get plotfile name
void init_bathymetry_full_domain_from_netcdf()
Full domain high-res bathymetry data initialization from NetCDF file.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_DV_avg2
correct time average of barotropic y velocity flux for coupling (2D)
Definition REMORA.H:462
void set_hmixcoef(int lev)
Initialize horizontal mixing coefficients.
Definition REMORA.cpp:833
amrex::Array< std::string, 2 *AMREX_SPACEDIM > domain_bc_type
Array of strings describing domain boundary conditions.
Definition REMORA.H:1434
amrex::Vector< std::unique_ptr< NCTimeSeriesRiver > > river_source_cons
Vector of data containers for scalar data in rivers.
Definition REMORA.H:1334
amrex::Real estTimeStep(int lev) const
compute dt from CFL considerations
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_yu
y_grid on u-points (2D)
Definition REMORA.H:510
void WriteNCPlotFile_which(int lev, int which_subdomain, amrex::MultiFab const *plotMF, bool write_header, ncutils::NCFile &ncf, bool is_history)
Write a particular NetCDF plotfile.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_dndx
d(1/n)/d(xi)
Definition REMORA.H:523
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_bvstr
Bottom stress in the v direction.
Definition REMORA.H:453
void timeStep(int lev, amrex::Real time, int iteration)
advance a level by dt, includes a recursive call for finer levels
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rzeta
free surface height for the RHS (2D)
Definition REMORA.H:468
std::unique_ptr< NCTimeSeriesRiver > river_source_transport
Data container for momentum transport in rivers.
Definition REMORA.H:1336
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_z_phys_nd
z coordinates at psi points (cell nodes)
Definition REMORA.H:390
void init_grid_vars_full_domain_from_netcdf()
Full domain high-res grid variable initialization from NetCDF file.
void AverageDown()
set covered coarse cells to be the average of overlying fine cells
Definition REMORA.cpp:1809
static int fixed_ndtfast_ratio
User specified, number of barotropic steps per baroclinic step.
Definition REMORA.H:1492
amrex::Real netcdf_fill_value
fill value for masked arrays in netcdf output
Definition REMORA.H:1545
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_xu
x_grid on u-points (2D)
Definition REMORA.H:508
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_pn_full_domain
horizontal scaling factor: 1 / dy (2D) on whole domain
Definition REMORA.H:497
void timeStepML(amrex::Real time, int iteration)
advance all levels by dt, loops over finer levels
amrex::GpuArray< amrex::GpuArray< bool, AMREX_SPACEDIM *2 >, BdyVars::NumTypes+1 > phys_bc_need_data
These are flags that indicate whether we need to read in boundary data from file.
Definition REMORA.H:1443
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > vec_nudg_coeff
Climatology nudging coefficients.
Definition REMORA.H:559
void set_weights(int lev)
Set weights for averaging 3D variables to 2D.
void prestep_t_advection(int lev, const amrex::Box &tbx, const amrex::Box &gbx, const amrex::Array4< amrex::Real > &tempold, const amrex::Array4< amrex::Real > &tempcache, const amrex::Array4< amrex::Real > &Hz, const amrex::Array4< amrex::Real > &Huon, const amrex::Array4< amrex::Real > &Hvom, const amrex::Array4< amrex::Real > &W, const amrex::Array4< amrex::Real > &DC, const amrex::Array4< amrex::Real > &FC, const amrex::Array4< amrex::Real > &sstore, const amrex::Array4< amrex::Real const > &z_w, const amrex::Array4< amrex::Real const > &h, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &msku, const amrex::Array4< amrex::Real const > &mskv, const amrex::Array4< int const > &river_pos, const amrex::Array4< amrex::Real const > &river_source, int iic, int ntfirst, int nrhs, int N, const amrex::Real dt_lev)
Prestep advection calculations for the tracers.
AMREX_FORCE_INLINE std::ostream & DataLog(int i)
Helper function for IO stream.
Definition REMORA.H:1688
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_pn
horizontal scaling factor: 1 / dy (2D)
Definition REMORA.H:493
void curvilinear(const amrex::Box &bx, const amrex::Box &xbx, const amrex::Box &ybx, const amrex::Array4< amrex::Real const > &uold, const amrex::Array4< amrex::Real const > &vold, const amrex::Array4< amrex::Real > &ru, const amrex::Array4< amrex::Real > &rv, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &dndx, const amrex::Array4< amrex::Real const > &dmde, int nrhs, int nr)
Calculate curvilinear advection terms.
amrex::Vector< std::unique_ptr< std::fstream > > datalog
Definition REMORA.H:1734
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akv
Vertical viscosity coefficient (3D)
Definition REMORA.H:359
static amrex::Real cfl
CFL condition.
Definition REMORA.H:1484
void append3DPlotVariables(const std::string &pp_plot_var_names_3d)
void allocate_bathymetry_grid_vars_full_domain()
Allocate multifabs for storing full-domain bathymetry and grid vars data.
virtual void MakeNewLevelFromScratch(int lev, amrex::Real time, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm) override
Make a new level from scratch using provided BoxArray and DistributionMapping. Only used during initi...
amrex::Vector< std::string > plot_var_names_3d
Names of 3D variables to output to AMReX plotfile.
Definition REMORA.H:1527
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_stflux
Surface tracer flux; input arrays.
Definition REMORA.H:425
void set_init_data_averaged_down(int lev)
Problem initialization from averaged-down high resolution data.
Definition REMORA.cpp:728
static int verbose
Verbosity level of output.
Definition REMORA.H:1573
void setup_step(int lev, amrex::Real time, amrex::Real dt_lev)
Set everything up for a step on a level.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rdrag
Linear drag coefficient [m/s], defined at rho points.
Definition REMORA.H:444
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_cloud
cloud cover fraction [0-1], defined at rho-points
Definition REMORA.H:436
void nonlin_eos(const amrex::Box &bx, const amrex::Array4< amrex::Real const > &state, const amrex::Array4< amrex::Real > &rho, const amrex::Array4< amrex::Real > &rhoA, const amrex::Array4< amrex::Real > &rhoS, const amrex::Array4< amrex::Real > &bvf, const amrex::Array4< amrex::Real > &alpha, const amrex::Array4< amrex::Real > &beta, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &z_w, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &h, const amrex::Array4< amrex::Real const > &mskr, const int N)
Calculate density and related quantities from nonlinear equation of state.
void t3dmix2_geo(const amrex::Box &bx, const amrex::Array4< amrex::Real > &state, const amrex::Array4< amrex::Real > &state_rhs, const amrex::Array4< amrex::Real const > &diff2, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &z_r, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &msku, const amrex::Array4< amrex::Real const > &mskv, const amrex::Real dt_lev, const int ncomp, const int N)
Harmonic diffusivity for tracers along geopotential surfaces.
std::string plot_file_name
Plotfile prefix.
Definition REMORA.H:1504
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Zt_avg1
Average of the free surface, zeta (2D)
Definition REMORA.H:393
std::unique_ptr< NCTimeSeries > salt_clim_data_from_file
Data container for salinity climatology data read from file.
Definition REMORA.H:1331
int check_int
Checkpoint output interval in iterations.
Definition REMORA.H:1512
void set_smflux(int lev)
Initialize or calculate surface momentum flux from file or analytic.
Definition REMORA.cpp:1128
void WritePlotFile(int istep)
main driver for writing AMReX plotfiles
std::string restart_chkfile
If set, restart from this checkpoint file.
Definition REMORA.H:1475
void init_clim_nudg_coeff(int lev)
Wrapper to initialize climatology nudging coefficient.
void init_bathymetry_full_domain_from_analytic()
Full domain bathymetry data initialization from analytic.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_rv
v velocity RHS (3D, includes horizontal and vertical advection)
Definition REMORA.H:349
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_btflx
Bottom tracer flux; working arrays.
Definition REMORA.H:427
int cf_width
Nudging width at coarse-fine interface.
Definition REMORA.H:1355
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real bulk_psit(amrex::Real ZoL)
Evaluate stability function psi for moisture and heat.
Definition REMORA.H:1789
static amrex::Vector< amrex::Vector< std::string > > nc_init_file
NetCDF initialization file.
Definition REMORA.H:55
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_beta
Saline contraction coefficient (3D)
Definition REMORA.H:539
int last_plot_file_step
Step when we last output a plotfile.
Definition REMORA.H:1452
amrex::Vector< std::string > plot_var_names_2d
Names of 2D variables to output to AMReX plotfile.
Definition REMORA.H:1529
void bulk_fluxes(int lev, amrex::MultiFab *mf_cons, amrex::MultiFab *mf_uwind, amrex::MultiFab *mf_vwind, amrex::MultiFab *mf_Tair, amrex::MultiFab *mf_qair, amrex::MultiFab *mf_Pair, amrex::MultiFab *mf_srflx, amrex::MultiFab *mf_longwave_down, amrex::MultiFab *mf_evap, amrex::MultiFab *mf_sustr, amrex::MultiFab *mf_svstr, amrex::MultiFab *mf_stflux, amrex::MultiFab *mf_lrflx, amrex::MultiFab *mf_lhflx, amrex::MultiFab *mf_shflx, const int N)
Calculate bulk temperature, salinity, wind fluxes.
void t3dmix2_s(const amrex::Box &bx, const amrex::Array4< amrex::Real > &state, const amrex::Array4< amrex::Real > &state_rhs, const amrex::Array4< amrex::Real const > &diff2, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &pm, const amrex::Array4< amrex::Real const > &pn, const amrex::Array4< amrex::Real const > &msku, const amrex::Array4< amrex::Real const > &mskv, const amrex::Real dt_lev, const int ncomp)
Harmonic diffusivity for tracers along S-coordinate level surfaces.
const amrex::Vector< std::string > derived_names
Names of derived fields for plotfiles.
Definition REMORA.H:1534
amrex::Vector< amrex::Real > t_old
old time at each level
Definition REMORA.H:1409
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_mskr3d
land/sea mask at cell centers, copied to all z levels (3D)
Definition REMORA.H:488
amrex::Vector< amrex::GpuArray< amrex::Real, AMREX_SPACEDIM *2 > > m_bc_extdir_vals
Array holding the Dirichlet values at walls which need them.
Definition REMORA.H:1437
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_srflx
Shortwave radiation flux [W/m²], defined at rho-points.
Definition REMORA.H:412
amrex::Real last_check_file_time
Simulation time when we last output a checkpoint file.
Definition REMORA.H:1459
void append2DPlotVariables(const std::string &pp_plot_var_names_2d)
void set_bathymetry_averaged_down(int lev)
Copy over bathymetry data that has been averaged down from high resolution input netcdf file.
Definition REMORA.cpp:682
amrex::Vector< amrex::Real > dt
time step at each level
Definition REMORA.H:1411
static amrex::Real sum_per
Diagnostic sum output interval in time.
Definition REMORA.H:1578
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Pair
Air pressure [mb], defined at rho-points.
Definition REMORA.H:409
void InitializeFromFile()
Read the file passed to remora.restart and use it as an initial condition for the current simulation.
void coriolis(const amrex::Box &xbx, const amrex::Box &ybx, const amrex::Array4< amrex::Real const > &uold, const amrex::Array4< amrex::Real const > &vold, const amrex::Array4< amrex::Real > &ru, const amrex::Array4< amrex::Real > &rv, const amrex::Array4< amrex::Real const > &Hz, const amrex::Array4< amrex::Real const > &fomn, int nrhs, int nr)
Calculate Coriolis terms.
amrex::Gpu::DeviceVector< amrex::BCRec > domain_bcs_type_d
GPU vector (over BCVars) of BCRecs.
Definition REMORA.H:1431
virtual ~REMORA()
Definition REMORA.cpp:229
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_qair
Specific humidity [kg/kg], defined at rho-points.
Definition REMORA.H:407
int hires_grid_level
Which level the high resolution bathymetry is at.
Definition REMORA.H:1600
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_z_w
z coordinates at w points (faces between z-cells)
Definition REMORA.H:373
void restart()
Definition REMORA.cpp:577
std::unique_ptr< NCTimeSeries > vbar_clim_data_from_file
Data container for vbar climatology data read from file.
Definition REMORA.H:1323
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Tair
Air temperature [°C], defined at rho-points.
Definition REMORA.H:405
void convert_inv_days_to_inv_s(amrex::MultiFab *)
Convert data in a multifab from inverse days to inverse seconds.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_yr
y_grid on rho points (2D)
Definition REMORA.H:505
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Hvom
v-volume flux (3D)
Definition REMORA.H:345
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akp
Turbulent length scale vertical diffusion coefficient.
Definition REMORA.H:556
void gls_corrector(int lev, amrex::MultiFab *mf_gls, amrex::MultiFab *mf_tke, amrex::MultiFab &mf_W, amrex::MultiFab *mf_Akv, amrex::MultiFab *mf_Akt, amrex::MultiFab *mf_Akk, amrex::MultiFab *mf_Akp, amrex::MultiFab *mf_mskr, amrex::MultiFab *mf_msku, amrex::MultiFab *mf_mskv, const int nstp, const int nnew, const int N, const amrex::Real dt_lev)
Corrector step for GLS calculation.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_diff2
Harmonic diffusivity for temperature / salinity.
Definition REMORA.H:367
int NumTypes(int ncons) noexcept
int xvel_bc(int ncons) noexcept
int zvel_bc(int ncons) noexcept
int yvel_bc(int ncons) noexcept
int vbar_bc(int ncons) noexcept
int foextrap_bc(int ncons) noexcept
int v2d_simple_bc(int ncons) noexcept
int u2d_simple_bc(int ncons) noexcept
int zeta_bc(int ncons) noexcept
int ubar_bc(int ncons) noexcept
int tke_bc(int ncons) noexcept
int foextrap_periodic_bc(int ncons) noexcept
@ CellConservativeQuartic
Definition REMORA.H:74
@ CellBilinear
Definition REMORA.H:71
@ PCInterp
Definition REMORA.H:68
@ NodeBilinear
Definition REMORA.H:69
@ CellConservativeLinear
Definition REMORA.H:70
@ CellQuadratic
Definition REMORA.H:72
@ CellConservativeProtected
Definition REMORA.H:73