REMORA
Regional Modeling of Oceans Refined Adaptively
Loading...
Searching...
No Matches
REMORA_prestep.cpp
Go to the documentation of this file.
1#include <REMORA.H>
2
3using namespace amrex;
4
5/**
6 * @param[in ] lev level to operate on
7 * @param[in ] mf_uold u-velocity from last time step
8 * @param[in ] mf_vold v-velocity from last time step
9 * @param[ out] mf_u u-velocity at current time step
10 * @param[ out] mf_v v-velocity at current time step
11 * @param[inout] mf_ru u-velocity RHS at current time step
12 * @param[inout] mf_rv v-velocity RHS at current time step
13 * @param[in ] S_old scalar variables at last time step
14 * @param[inout] S_new scalar variables at current time step
15 * @param[in ] mf_W vertical velocity
16 * @param mf_DC temporary variable container
17 * @param[in ] mf_z_r z coordinates at rho points (cell centers)
18 * @param[in ] mf_z_w z coordinates at w points
19 * @param[in ] mf_h bathymetry
20 * @param[in ] mf_pm 1/dx
21 * @param[in ] mf_pn 1/dy
22 * @param[in ] mf_sustr u-direction surface momentum flux
23 * @param[in ] mf_svstr v-direction surface momentum flux
24 * @param[in ] mf_bustr u-direction bottom stress
25 * @param[in ] mf_bvstr v-direction bottom stress
26 * @param[in ] mf_msku land-sea mask on u-points
27 * @param[in ] mf_mskv land-sea mask on v-points
28 * @param[in ] iic which time step we're on
29 * @param[in ] ntfirst what is the first time step?
30 * @param[in ] nnew index of time step to update
31 * @param[in ] nstp index of last time step
32 * @param[in ] nrhs index of RHS component
33 * @param[in ] N number of vertical levels
34 * @param[in ] dt_lev time step at this level
35 */
36
37void
39 MultiFab& mf_uold, MultiFab& mf_vold,
40 MultiFab& mf_u, MultiFab& mf_v,
41 MultiFab* mf_ru,
42 MultiFab* mf_rv,
43 MultiFab& S_old, MultiFab& S_new,
44 MultiFab& mf_W, MultiFab& mf_DC,
45 const MultiFab* mf_z_r,
46 const MultiFab* mf_z_w,
47 const MultiFab* mf_h,
48 const MultiFab* mf_pm,
49 const MultiFab* mf_pn,
50 const MultiFab* mf_sustr,
51 const MultiFab* mf_svstr,
52 const MultiFab* mf_bustr,
53 const MultiFab* mf_bvstr,
54 const MultiFab* mf_msku,
55 const MultiFab* mf_mskv,
56 const int iic, const int ntfirst,
57 const int nnew, int nstp, int nrhs,
58 int N, const Real dt_lev)
59{
60 const BoxArray& ba = S_old.boxArray();
61 const DistributionMapping& dm = S_old.DistributionMap();
62
63 // Maybe not the best way to do this, but need to cache salt and temp since
64 // they get rewritten by prestep_t
65 MultiFab mf_saltcache(ba,dm,1,IntVect(NGROW,NGROW,0));
66 MultiFab mf_tempcache(ba,dm,1,IntVect(NGROW,NGROW,0));
67
68 MultiFab mf_scalarcache(ba,dm,NCONS,IntVect(NGROW,NGROW,0));
69 MultiFab::Copy(mf_scalarcache,S_new,0,0,NCONS,IntVect(NGROW,NGROW,0));
70
71 MultiFab::Copy(mf_saltcache,S_new,Salt_comp,0,1,IntVect(NGROW,NGROW,0));
72 MultiFab::Copy(mf_tempcache,S_new,Temp_comp,0,1,IntVect(NGROW,NGROW,0));
73
74 for ( MFIter mfi(S_new, TilingIfNotGPU()); mfi.isValid(); ++mfi )
75 {
76 Array4<Real> const& DC = mf_DC.array(mfi);
77 Array4<Real> const& Akv = vec_Akv[lev]->array(mfi);
78 Array4<Real> const& Akt = vec_Akt[lev]->array(mfi);
79 Array4<Real> const& Hz = vec_Hz[lev]->array(mfi);
80 Array4<Real> const& Huon = vec_Huon[lev]->array(mfi);
81 Array4<Real> const& Hvom = vec_Hvom[lev]->array(mfi);
82 Array4<Real const> const& uold = mf_uold.const_array(mfi);
83 Array4<Real const> const& vold = mf_vold.const_array(mfi);
84 Array4<Real> const& u = (mf_u).array(mfi);
85 Array4<Real> const& v = (mf_v).array(mfi);
86
87 Array4<Real const> const& z_r = mf_z_r->const_array(mfi);
88 Array4<Real const> const& z_w = mf_z_w->const_array(mfi);
89 Array4<Real const> const& h = mf_h->const_array(mfi);
90 Array4<Real const> const& pm = mf_pm->const_array(mfi);
91 Array4<Real const> const& pn = mf_pn->const_array(mfi);
92
93 Array4<Real > const& ru = mf_ru->array(mfi);
94 Array4<Real > const& rv = mf_rv->array(mfi);
95 Array4<Real > const& W = (mf_W).array(mfi);
96 Array4<Real const> const& sustr = mf_sustr->const_array(mfi);
97 Array4<Real const> const& svstr = mf_svstr->const_array(mfi);
98 Array4<Real const> const& bustr = mf_bustr->const_array(mfi);
99 Array4<Real const> const& bvstr = mf_bvstr->const_array(mfi);
100 Array4<Real const> const& msku = mf_msku->const_array(mfi);
101 Array4<Real const> const& mskv = mf_mskv->const_array(mfi);
102
103 Real lambda = 1.0_rt;
104
105 Box bx = mfi.tilebox();
106 Box gbx = mfi.growntilebox();
107 Box gbx1 = mfi.growntilebox(IntVect(NGROW-1,NGROW-1,0));
108 Box gbx2 = mfi.growntilebox(IntVect(NGROW,NGROW,0));
109 //Box gbx11 = mfi.growntilebox(IntVect(NGROW-1,NGROW-1,NGROW-1));
110
111 //copy the tilebox
112 Box tbxp1 = bx;
113 Box tbxp11 = bx;
114 Box tbxp2 = bx;
115
116 //TODO: adjust for tiling
117 //Box gbx3uneven(IntVect(AMREX_D_DECL(bx.smallEnd(0)-3,bx.smallEnd(1)-3,bx.smallEnd(2))),
118 // IntVect(AMREX_D_DECL(bx.bigEnd(0)+2,bx.bigEnd(1)+2,bx.bigEnd(2))));
119 //Box gbx2uneven(IntVect(AMREX_D_DECL(bx.smallEnd(0)-2,bx.smallEnd(1)-2,bx.smallEnd(2))),
120 // IntVect(AMREX_D_DECL(bx.bigEnd(0)+1,bx.bigEnd(1)+1,bx.bigEnd(2))));
121 //make only gbx be grown to match multifabs
122 tbxp2.grow(IntVect(NGROW,NGROW,0));
123 tbxp1.grow(IntVect(NGROW-1,NGROW-1,0));
124 tbxp11.grow(IntVect(NGROW-1,NGROW-1,NGROW-1));
125
126 Box bxD = bx;
127 bxD.makeSlab(2,0);
128 Box gbx1D = gbx1;
129 gbx1D.makeSlab(2,0);
130 Box gbx2D = gbx2;
131 gbx2D.makeSlab(2,0);
132
133 Box tbxp1D = tbxp1;
134 tbxp1D.makeSlab(2,0);
135 Box tbxp2D = tbxp2;
136 tbxp2D.makeSlab(2,0);
137
138 FArrayBox fab_FC(convert(tbxp2,IntVect(0,0,1)),1,amrex::The_Async_Arena()); //3D
139
140 auto FC=fab_FC.array();
141
142
143 for (int i_comp=0; i_comp < NCONS; i_comp++) {
144 Array4<Real> const& sstore = (vec_sstore[lev])->array(mfi,i_comp);
145#ifdef REMORA_USE_NETCDF
146 FArrayBox* fab_river_source;
147 if (solverChoice.do_rivers_cons[i_comp]) {
148 river_source_cons[i_comp]->update_interpolated_to_time(t_old[lev]);
149 fab_river_source = river_source_cons[i_comp]->fab_interp;
150 }
151 const Array4<const int>& river_pos = (solverChoice.do_rivers) ? vec_river_position[lev]->const_array(mfi) : Array4<const int>();
152 const Array4<const Real>& river_source = (solverChoice.do_rivers_cons[i_comp]) ? fab_river_source->const_array() : Array4<const Real>();
153#else
154 const Array4<const int >& river_pos = Array4<const int>();
155 const Array4<const Real>& river_source = Array4<const Real>();
156#endif
157 prestep_t_advection(bx, gbx, S_old.array(mfi,i_comp),
158 mf_scalarcache.array(mfi,i_comp), Hz, Huon, Hvom,
159 W, DC, FC, sstore, z_w, h, pm, pn, msku, mskv, river_pos,
160 river_source, iic, ntfirst,
161 nrhs, N, dt_lev);
162 }
163
164 // Only do diffusion for salt and temperature, not other tracer(s)
165 for (int i_comp=0; i_comp < NCONS; i_comp++) {
166 const Array4<Real const>& stflx = vec_stflx[lev]->const_array(mfi,i_comp);
167 const Array4<Real const>& btflx = vec_btflx[lev]->const_array(mfi,i_comp);
168 prestep_diffusion(bx,gbx,0,0,S_new.array(mfi,i_comp), S_old.array(mfi,i_comp), ru,
169 Hz, Akt, DC, FC, stflx, btflx, z_r, pm, pn, iic, iic, nnew, nstp,
170 nrhs, N, lambda, dt_lev);
171 }
172
173 //
174 //-----------------------------------------------------------------------
175 // prestep_uv_3d
176 //-----------------------------------------------------------------------
177 //
178 //updates u,v,ru,rv (ru and rv have multiple components)
179
180 prestep_diffusion(tbxp1, gbx, 1, 0, u, uold, ru, Hz, Akv, DC, FC,
181 sustr, bustr, z_r, pm, pn, iic, ntfirst, nnew, nstp, nrhs, N, lambda, dt_lev);
182
183 prestep_diffusion(tbxp1, gbx, 0, 1, v, vold, rv, Hz, Akv, DC, FC,
184 svstr, bvstr, z_r, pm, pn, iic, ntfirst, nnew, nstp, nrhs, N, lambda, dt_lev);
185 }
186}
#define NGROW
#define Temp_comp
#define Salt_comp
#define NCONS
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 > &DC, 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.
amrex::Vector< NCTimeSeriesRiver * > river_source_cons
Vector of data containers for scalar data in rivers.
Definition REMORA.H:1029
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_stflx
Surface tracer flux; working arrays.
Definition REMORA.H:299
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_sstore
additional scratch space for calculations on temp, salt, etc
Definition REMORA.H:383
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Hz
Width of cells in the vertical (z-) direction (3D, Hz in ROMS)
Definition REMORA.H:232
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akt
Vertical diffusion coefficient (3D)
Definition REMORA.H:252
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.
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Huon
u-volume flux (3D)
Definition REMORA.H:234
static SolverChoice solverChoice
Container for algorithmic choices.
Definition REMORA.H:1221
amrex::Vector< std::unique_ptr< amrex::iMultiFab > > vec_river_position
iMultiFab for river positions; contents are indices of rivers
Definition REMORA.H:1036
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_Akv
Vertical viscosity coefficient (3D)
Definition REMORA.H:250
amrex::Vector< std::unique_ptr< amrex::MultiFab > > vec_btflx
Bottom tracer flux; working arrays.
Definition REMORA.H:303
amrex::Vector< amrex::Real > t_old
old time at each level
Definition REMORA.H:1100
void prestep_t_advection(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::Vector< std::unique_ptr< amrex::MultiFab > > vec_Hvom
v-volume flux (3D)
Definition REMORA.H:236
amrex::Vector< int > do_rivers_cons