17 std::unique_ptr<MultiFab>& mf_z_w =
vec_z_w[lev];
18 std::unique_ptr<MultiFab>& mf_z_r =
vec_z_r[lev];
19 std::unique_ptr<MultiFab>& mf_s_r =
vec_s_r[lev];
20 std::unique_ptr<MultiFab>& mf_s_w =
vec_s_w[lev];
21 std::unique_ptr<MultiFab>& mf_Cs_r =
vec_Cs_r[lev];
22 std::unique_ptr<MultiFab>& mf_Cs_w =
vec_Cs_w[lev];
23 std::unique_ptr<MultiFab>& mf_Hz =
vec_Hz[lev];
25 std::unique_ptr<MultiFab>& mf_Zt_avg1 =
vec_Zt_avg1[lev];
27 auto N_loop = Geom(lev).Domain().size()[2];
29 for ( MFIter mfi(*
cons_new[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi )
31 Array4<Real>
const& z_w = (mf_z_w)->array(mfi);
32 Array4<Real>
const& z_r = (mf_z_r)->array(mfi);
33 Array4<Real>
const& s_r = (mf_s_r)->array(mfi);
34 Array4<Real>
const& s_w = (mf_s_w)->array(mfi);
35 Array4<Real>
const& Cs_r_arr = (mf_Cs_r)->array(mfi);
36 Array4<Real>
const& Cs_w_arr = (mf_Cs_w)->array(mfi);
37 Array4<Real>
const& Hz = (mf_Hz)->array(mfi);
38 Array4<Real>
const& h = (mf_h)->array(mfi);
39 Array4<Real>
const& Zt_avg1 = (mf_Zt_avg1)->array(mfi);
40 Box bx = mfi.tilebox();
50 wgbx3.surroundingNodes(2);
52 const auto & geomdata = Geom(lev).data();
54 int nz = geom[lev].Domain().length(2);
62 amrex::ParallelFor(wgbx3, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
64 z_w(i,j,k) = h(i,j,0);
68 Gpu::streamSynchronize();
70 amrex::ParallelFor(gbx3D, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
72 for (
int k=0; k<=N_loop; k++) {
88 Real ds = 1.0_rt / Real(N);
90 Real cff_r, cff_w, cff1_r, cff1_w, cff2_r, cff2_w, Csur, Cbot;
91 Real sc_r,sc_w,Cs_r,Cs_w;
107 if (local_theta_s > 0.0_rt) {
108 Csur=(1.0_rt-std::cosh(local_theta_s*sc_w))/
109 (std::cosh(local_theta_s)-1.0_rt);
114 if (local_theta_b > 0.0_rt) {
115 Cbot=(std::exp(local_theta_b*Csur)-1.0_rt)/
116 (1.0_rt-std::exp(-local_theta_b));
130 sc_r=ds*(k-N+0.5_rt);
132 if (local_theta_s > 0.0_rt) {
133 Csur=(1.0_rt-std::cosh(local_theta_s*sc_r))/
134 (std::cosh(local_theta_s)-1.0_rt);
139 if (local_theta_b > 0.0_rt) {
140 Cbot=(std::exp(local_theta_b*Csur)-1.0_rt)/
141 (1.0_rt-std::exp(-local_theta_b));
148 if (i==0&&j==0&&k<N&&k>=0) {
150 Cs_r_arr(0,0,k) = Cs_r;
152 if (i==0&&j==0&&k<=N&&k>=0) {
154 Cs_w_arr(0,0,k) = Cs_w;
161 Real hwater=h(i,j,0);
176 Real hinv=1.0_rt/(hc+hwater);
177 cff2_r=(cff_r+cff1_r*hwater)*hinv;
178 cff2_w=(cff_w+cff1_w*hwater)*hinv;
182 z_w(i,j,N)=Zt_avg1(i,j,0);
185 h(i,j,0,1) = Zt_avg1(i,j,0)+(Zt_avg1(i,j,0)+hwater)*cff2_w;
186 z_w(i,j,0) = h(i,j,0,1);
189 z_w(i,j,k)=Zt_avg1(i,j,0)+(Zt_avg1(i,j,0)+hwater)*cff2_w;
194 z_r(i,j,k)=Zt_avg1(i,j,0)+(Zt_avg1(i,j,0)+hwater)*cff2_r;
199 Gpu::streamSynchronize();
201 amrex::ParallelFor(gbx3, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
203 Hz(i,j,k)=z_w(i,j,k+1)-z_w(i,j,k);
207 vec_z_w[lev]->FillBoundary(geom[lev].periodicity());
208 vec_z_r[lev]->FillBoundary(geom[lev].periodicity());
209 vec_s_r[lev]->FillBoundary(geom[lev].periodicity());
210 vec_Hz[lev]->FillBoundary(geom[lev].periodicity());
213 for ( MFIter mfi(*
cons_new[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi )
215 Array4<Real>
const& z_w = (mf_z_w)->array(mfi);
216 Array4<Real>
const& z_phys_nd = (mf_z_phys_nd)->array(mfi);
218 Box z_w_box = Box(z_w);
219 auto const lo = amrex::lbound(z_w_box);
220 auto const hi = amrex::ubound(z_w_box);
230 Box bx = Box(z_phys_nd); bx.grow(2,-1);
232 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
236 if ( i >= lo.x && i <= hi.x-1 && j >= lo.y && j <= hi.y-1 )
238 z_phys_nd(i,j,k)=0.25_rt*( z_w(i,j ,k) + z_w(i+1,j ,k) +
239 z_w(i,j+1,k) + z_w(i+1,j+1,k) );
241 int ii = std::min(std::max(i, lo.x), hi.x);
242 int jj = std::min(std::max(j, lo.y), hi.y);
243 z_phys_nd(i,j,k) = z_w(ii,jj,k);
249 ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
251 z_phys_nd(i,j,klo) = 2.0_rt * z_phys_nd(i,j,klo+1) - z_phys_nd(i,j,klo+2);