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