43 std::unique_ptr<MultiFab>&
mf_ubar,
44 std::unique_ptr<MultiFab>&
mf_vbar,
45 std::unique_ptr<MultiFab>&
mf_Akv,
46 std::unique_ptr<MultiFab>&
mf_Akt,
47 std::unique_ptr<MultiFab>&
mf_Hz,
48 std::unique_ptr<MultiFab>&
mf_Huon,
49 std::unique_ptr<MultiFab>&
mf_Hvom,
50 std::unique_ptr<MultiFab>&
mf_z_w,
52 MultiFab
const*
mf_pm,
53 MultiFab
const*
mf_pn,
73 const DistributionMapping&
dm =
mf_cons.DistributionMap();
105 Box
bx =
mfi.tilebox();
109 Box
xbx =
mfi.nodaltilebox(0);
110 Box
ybx =
mfi.nodaltilebox(1);
124 FArrayBox
fab_CF(
gbx21,1,amrex::The_Async_Arena());
125 FArrayBox
fab_W(
tbxp2,1,amrex::The_Async_Arena());
135 cff=Real(0.25)*
dt_lev*Real(3.0)/Real(2.0);
137 cff=Real(0.25)*
dt_lev*Real(23.0)/Real(12.0);
142 u(
i,
j,
k) +=
cff * (
pm(
i,
j,0)+
pm(
i-1,
j,0)) * (
pn(
i,
j,0)+
pn(
i-1,
j,0)) *
ru(
i,
j,
k,
nrhs);
148 v(
i,
j,
k) +=
cff * (
pm(
i,
j,0)+
pm(
i,
j-1,0)) * (
pn(
i,
j,0)+
pn(
i,
j-1,0)) *
rv(
i,
j,
k,
nrhs);
159 vert_visc_3d(
xbx,1,0,u,
Hz,
Hzk,
AK,
Akv,
BC,
DC,
FC,
CF,nnew,
N,
dt_lev);
165 vert_visc_3d(
ybx,0,1,v,
Hz,
Hzk,
AK,
Akv,
BC,
DC,
FC,
CF,nnew,
N,
dt_lev);
171 vert_mean_3d(
xbx,1,0,u,
Hz,
DU_avg1,
DC,
CF,
pn,
msku,nnew,
N);
177 vert_mean_3d(
ybx,0,1,v,
Hz,
DV_avg1,
DC,
CF,
pm,
mskv,nnew,
N);
184#ifdef REMORA_USE_NETCDF
224 FArrayBox
fab_FC(
gbx2,1,amrex::The_Async_Arena());
227#ifdef REMORA_USE_NETCDF
257 update_massflux_3d(
xbx,1,0,u,ubar,
Huon,
Hz,
pn,
DU_avg1,
DU_avg2,
DC,
FC,nnew);
263 update_massflux_3d(
ybx,0,1,v,vbar,
Hvom,
Hz,
pm,
DV_avg1,
DV_avg2,
DC,
FC,nnew);
270 update_massflux_3d(
lev,
gbx2,1,0,u,ubar,
Huon,
Hz,
pn,
DU_avg1,
DU_avg2,
DC,
FC,
msku,nnew);
275 update_massflux_3d(
lev,
gbx2,0,1,v,vbar,
Hvom,
Hz,
pm,
DV_avg1,
DV_avg2,
DC,
FC,
mskv,nnew);
298 Box
bx =
mfi.tilebox();
311 FArrayBox
fab_BC(
gbx2,1,amrex::The_Async_Arena());
312 FArrayBox
fab_CF(
gbx21,1,amrex::The_Async_Arena());
335 W(
i,
j,
k) =
W(
i,
j,
k-1) - (
Huon(
i+1,
j,
k-1)-
Huon(
i,
j,
k-1)) - (
Hvom(
i,
j+1,
k-1)-
Hvom(
i,
j,
k-1));
345 W(
i,
j,
k) =
W(
i,
j,
k)-
W(
i,
j,
N+1)*(z_w(
i,
j,
k)+
h(
i,
j,0,0));
353 const int nstp = (iic) % 2;
377 Box
bx =
mfi.tilebox();
389 FArrayBox
fab_BC(
gbx2,1,amrex::The_Async_Arena());
390 FArrayBox
fab_CF(
gbx21,1,amrex::The_Async_Arena());
401#ifdef REMORA_USE_NETCDF
414 Hz,
pn,
pm,
W,
FC,
mskr,
msku,
mskv,
river_pos,
river_source,
nrhs, nnew,
N,
dt_lev);
418 FillPatch(
lev,
t_old[
lev],
mf_cons,
cons_new,
BCVars::cons_bc,
BdyVars::t,0,
true,
false,0,0,
dt_lev,*
cons_old[
lev]);
428 Box
bx =
mfi.tilebox();
441 FArrayBox
fab_FC(
tbxp2,1,amrex::The_Async_Arena());
442 FArrayBox
fab_BC(
tbxp2,1,amrex::The_Async_Arena());
444 FArrayBox
fab_W(
tbxp2,1,amrex::The_Async_Arena());
455 FillPatch(
lev,
t_old[
lev], *
cons_new[
lev],
cons_new,
BCVars::cons_bc,
BdyVars::t,0,
true,
false,0,0,
dt_lev,*
cons_old[
lev]);
457#ifdef REMORA_USE_NETCDF
467 Box
bx =
mfi.growntilebox(IntVect(1,1,0));
475 apply_clim_nudg(
bx, 0, 0, cons, cons,
cons_clim,
cons_nudg_coeff,
Hz,
pm,
pn,
dt_lev);
constexpr amrex::Real two
constexpr amrex::Real one
constexpr amrex::Real zero
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int akt_comp(int icomp) noexcept
mf_h setVal(geomdata.ProbHi(2))
int ncons
Number of conserved scalars in the state (temperature + salt + passive scalars + biology tracers)
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.
int xvel_bc() const noexcept
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_pm
horizontal scaling factor: 1 / dx (2D)
amrex::Vector< amrex::MultiFab * > cons_new
multilevel data container for current step's scalar data: temperature, salinity, passive tracer
void stretch_transform(int lev)
Calculate vertical stretched coordinates.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_mskr
land/sea mask at cell centers (2D)
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.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_tke
Turbulent kinetic energy.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_gls
Turbulent generic length scale.
int yvel_bc() const noexcept
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.
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.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Hz
Width of cells in the vertical (z-) direction (3D, Hz in ROMS)
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akt
Vertical diffusion coefficient (3D)
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_msku
land/sea mask at x-faces (2D)
amrex::Vector< amrex::MultiFab * > xvel_old
multilevel data container for last step's x velocities (u in ROMS)
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_mskv
land/sea mask at y-faces (2D)
amrex::Vector< std::unique_ptr< REMORAPhysBCFunct > > physbcs
Vector (over level) of functors to apply physical boundary conditions.
amrex::Vector< int > istep
which step?
amrex::Vector< amrex::MultiFab * > yvel_old
multilevel data container for last step's y velocities (v in ROMS)
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.
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 SolverChoice solverChoice
Container for algorithmic choices.
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > vec_river_position
iMultiFab for river positions; contents are indices of rivers
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akk
Turbulent kinetic energy vertical diffusion coefficient.
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.
void advance_biology(int lev, amrex::MultiFab const &mf_cons_old, amrex::MultiFab &mf_cons_new, int N, amrex::Real dt_lev)
Apply biological tracer source/sink terms.
amrex::Gpu::DeviceVector< int > river_direction
Vector over rivers of river direction: 0: u-face; 1: v-face; 2: w-face.
amrex::Vector< amrex::MultiFab * > cons_old
multilevel data container for last step's scalar data: temperature, salinity, passive tracer
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.
amrex::Vector< std::unique_ptr< NCTimeSeries > > cons_clim_data_from_file
Vector over cons components of climatology data read from file.
amrex::Vector< std::unique_ptr< NCTimeSeriesRiver > > river_source_cons
Vector of data containers for scalar data in rivers.
std::unique_ptr< NCTimeSeriesRiver > river_source_transport
Data container for momentum transport in rivers.
amrex::Vector< amrex::Vector< std::unique_ptr< amrex::MultiFab > > > vec_nudg_coeff
Climatology nudging coefficients.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_pn
horizontal scaling factor: 1 / dy (2D)
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akv
Vertical viscosity coefficient (3D)
amrex::Vector< amrex::Real > t_old
old time at each level
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akp
Turbulent length scale vertical diffusion coefficient.
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.
static constexpr int cons_bc
static constexpr int t
cons component Temp_comp
int cons(int icomp) noexcept
amrex::Vector< int > do_rivers_cons
bool boundary_from_netcdf
VertMixingType vert_mixing_type
amrex::Vector< int > do_cons_clim_nudg