45 MultiFab
const* mf_rhoS,
46 MultiFab
const* mf_rhoA,
51 MultiFab * mf_Zt_avg1,
52 std::unique_ptr<MultiFab>& mf_DU_avg1,
53 std::unique_ptr<MultiFab>& mf_DU_avg2,
54 std::unique_ptr<MultiFab>& mf_DV_avg1,
55 std::unique_ptr<MultiFab>& mf_DV_avg2,
56 std::unique_ptr<MultiFab>& mf_rubar,
57 std::unique_ptr<MultiFab>& mf_rvbar,
58 std::unique_ptr<MultiFab>& mf_rzeta,
59 std::unique_ptr<MultiFab>& mf_ubar,
60 std::unique_ptr<MultiFab>& mf_vbar,
63 MultiFab
const* mf_pm,
64 MultiFab
const* mf_pn,
65 MultiFab
const* mf_fcor,
66 MultiFab
const* mf_visc2_p,
67 MultiFab
const* mf_visc2_r,
68 MultiFab
const* mf_mskr,
69 MultiFab
const* mf_msku,
70 MultiFab
const* mf_mskv,
71 MultiFab
const* mf_mskp,
73 bool predictor_2d_step,
74 bool first_2d_step,
int my_iif,
77 BL_PROFILE(
"REMORA::advance2d()");
84 int krhs = (my_iif + iic) % 2 + 1;
85 int kstp = my_iif <=1 ? iic % 2 + 1 : (iic % 2 + my_iif % 2 + 1) % 2 + 1;
87 if (predictor_2d_step) {
88 next_indx1 = 3 - indx1;
106 auto ba = mf_h->boxArray();
107 auto dm = mf_h->DistributionMap();
109 MultiFab mf_DUon(convert(ba,IntVect(1,0,0)),dm,1,IntVect(
NGROW,
NGROW,0));
110 MultiFab mf_DVom(convert(ba,IntVect(0,1,0)),dm,1,IntVect(
NGROW,
NGROW,0));
112 const auto dlo = amrex::lbound(Geom(lev).Domain());
113 const auto dhi = amrex::ubound(Geom(lev).Domain());
116 int fomn_comp = ncomp++;
117 int Drhs_comp = ncomp++;
118 int Dnew_comp = ncomp++;
119 int zwrk_comp = ncomp++;
120 int gzeta_comp = ncomp++;
121 int gzeta2_comp = ncomp++;
122 int gzetaSA_comp = ncomp++;
123 int Dstp_comp = ncomp++;
124 int rhs_ubar_comp = ncomp++;
125 int rhs_vbar_comp = ncomp++;
126 int rhs_zeta_comp = ncomp++;
127 int zeta_new_comp = ncomp++;
129 MultiFab mf(ba,dm,ncomp,IntVect(
NGROW+1,
NGROW+1,0));
131 for ( MFIter mfi(*mf_rhoS, TilingIfNotGPU()); mfi.isValid(); ++mfi )
133 Array4<Real >
const& ubar = mf_ubar->array(mfi);
134 Array4<Real >
const& vbar = mf_vbar->array(mfi);
135 Array4<Real >
const& zeta = mf_zeta->array(mfi);
136 Array4<Real const>
const& h = mf_h->const_array(mfi);
138 Array4<Real const>
const& pm = mf_pm->const_array(mfi);
139 Array4<Real const>
const& pn = mf_pn->const_array(mfi);
141 Box bx = mfi.tilebox();
142 Box gbx = mfi.growntilebox();
143 Box gbx1 = mfi.growntilebox(IntVect(
NGROW-1,
NGROW-1,0));
144 Box gbx2 = mfi.growntilebox(IntVect(
NGROW,
NGROW,0));
145 Box xgbx2 = mfi.grownnodaltilebox(0, IntVect(
NGROW,
NGROW,0));
146 Box ygbx2 = mfi.grownnodaltilebox(1, IntVect(
NGROW,
NGROW,0));
155 Box bxD = bx ; bxD.makeSlab(2,0);
156 Box gbxD = gbx ; gbxD.makeSlab(2,0);
157 Box gbx1D = gbx1; gbx1D.makeSlab(2,0);
158 Box gbx2D = gbx2; gbx2D.makeSlab(2,0);
161 tbxp2D.makeSlab(2,0);
164 FArrayBox fab_Drhs(makeSlab(tbxp3,2,0),1,The_Async_Arena());
165 auto Drhs=fab_Drhs.array();
167 auto DUon = mf_DUon.array(mfi);
168 auto DVom = mf_DVom.array(mfi);
170 ParallelFor(makeSlab(tbxp3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
172 Drhs(i,j,0)=zeta(i,j,0,krhs)+h(i,j,0);
175 ParallelFor(makeSlab(xgbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
177 Real on_u = 2.0_rt / (pn(i,j,0)+pn(i-1,j,0));
178 Real cff1= 0.5_rt * on_u *(Drhs(i,j,0)+Drhs(i-1,j,0));
179 DUon(i,j,0)=ubar(i,j,0,krhs)*cff1;
182 ParallelFor(makeSlab(ygbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
184 Real om_v = 2.0_rt / (pm(i,j,0)+pm(i,j-1,0));
185 Real cff1= 0.5_rt * om_v * (Drhs(i,j,0)+Drhs(i,j-1,0));
186 DVom(i,j,0)=vbar(i,j,0,krhs)*cff1;
191 mf_DUon.FillBoundary(geom[lev].periodicity());
192 mf_DVom.FillBoundary(geom[lev].periodicity());
194#ifdef REMORA_USE_NETCDF
201 for ( MFIter mfi(*mf_rhoS, TilingIfNotGPU()); mfi.isValid(); ++mfi )
203 Array4<Real const>
const& rhoS = mf_rhoS->const_array(mfi);
204 Array4<Real const>
const& rhoA = mf_rhoA->const_array(mfi);
205 Array4<Real const>
const& h = mf_h->const_array(mfi);
207 Array4<Real >
const& rufrc = mf_rufrc->array(mfi);
208 Array4<Real >
const& rvfrc = mf_rvfrc->array(mfi);
209 Array4<Real >
const& Zt_avg1 = mf_Zt_avg1->array(mfi);
210 Array4<Real >
const& ubar = mf_ubar->array(mfi);
211 Array4<Real >
const& vbar = mf_vbar->array(mfi);
212 Array4<Real >
const& zeta = mf_zeta->array(mfi);
213 Array4<Real >
const& DU_avg1 = (mf_DU_avg1)->array(mfi);
214 Array4<Real >
const& DU_avg2 = (mf_DU_avg2)->array(mfi);
215 Array4<Real >
const& DV_avg1 = (mf_DV_avg1)->array(mfi);
216 Array4<Real >
const& DV_avg2 = (mf_DV_avg2)->array(mfi);
217 Array4<Real >
const& ru2d = (mf_ru2d)->array(mfi);
218 Array4<Real >
const& rv2d = (mf_rv2d)->array(mfi);
219 Array4<Real >
const& rubar = (mf_rubar)->array(mfi);
220 Array4<Real >
const& rvbar = (mf_rvbar)->array(mfi);
221 Array4<Real >
const& rzeta = (mf_rzeta)->array(mfi);
222 Array4<Real const>
const& visc2_p = mf_visc2_p->const_array(mfi);
223 Array4<Real const>
const& visc2_r = mf_visc2_r->const_array(mfi);
225 Array4<Real const>
const& pm = mf_pm->const_array(mfi);
226 Array4<Real const>
const& pn = mf_pn->const_array(mfi);
227 Array4<Real const>
const& fcor = mf_fcor->const_array(mfi);
229 Array4<Real const>
const& mskr = mf_mskr->const_array(mfi);
230 Array4<Real const>
const& msku = mf_msku->const_array(mfi);
231 Array4<Real const>
const& mskv = mf_mskv->const_array(mfi);
232 Array4<Real const>
const& mskp = mf_mskp->const_array(mfi);
234 Box bx = mfi.tilebox();
235 Box gbx = mfi.growntilebox();
236 Box gbx1 = mfi.growntilebox(IntVect(
NGROW-1,
NGROW-1,0));
237 Box gbx2 = mfi.growntilebox(IntVect(
NGROW,
NGROW,0));
238 Box gbx3 = mfi.growntilebox(IntVect(
NGROW+1,
NGROW+1,0));
239 Box xgbx2 = mfi.grownnodaltilebox(0, IntVect(
NGROW,
NGROW,0));
240 Box ygbx2 = mfi.grownnodaltilebox(1, IntVect(
NGROW,
NGROW,0));
242 Box xbxD = mfi.nodaltilebox(0);
245 Box ybxD = mfi.nodaltilebox(1);
248 Box xbxD_adj = mfi.nodaltilebox(0);
249 xbxD_adj.makeSlab(2,0);
250 Box ybxD_adj = mfi.nodaltilebox(1);
251 ybxD_adj.makeSlab(2,0);
253 auto xbxD_lo = lbound(xbxD_adj);
254 auto xbxD_hi = ubound(xbxD_adj);
255 auto ybxD_lo = lbound(ybxD_adj);
256 auto ybxD_hi = ubound(ybxD_adj);
258 if (xbxD_lo.x == dlo.x) {
259 xbxD_adj.growLo(0,-1);
260 }
else if (xbxD_hi.x == dhi.x) {
261 xbxD_adj.growHi(0,-1);
264 if (ybxD_lo.y == dlo.y) {
265 ybxD_adj.growLo(1,-1);
266 }
else if (ybxD_hi.y == dhi.y) {
267 ybxD_adj.growHi(1,-1);
270 Box tbxp1 = bx; tbxp1.grow(IntVect(
NGROW-1,
NGROW-1,0));
271 Box tbxp2 = bx; tbxp2.grow(IntVect(
NGROW,
NGROW,0));
272 Box tbxp3 = bx; tbxp3.grow(IntVect(
NGROW+1,
NGROW+1,0));
274 Box bxD = bx; bxD.makeSlab(2,0);
275 Box gbxD = gbx; gbxD.makeSlab(2,0);
276 Box gbx1D = gbx1; gbx1D.makeSlab(2,0);
277 Box gbx2D = gbx2; gbx2D.makeSlab(2,0);
280 tbxp2D.makeSlab(2,0);
282 auto fomn = mf.array(mfi,fomn_comp);
283 auto Drhs = mf.array(mfi,Drhs_comp);
284 auto Drhs_const = mf.const_array(mfi,Drhs_comp);
285 auto Dnew = mf.array(mfi,Dnew_comp);
286 auto zwrk = mf.array(mfi,zwrk_comp);
287 auto gzeta = mf.array(mfi,gzeta_comp);
288 auto gzeta2 = mf.array(mfi,gzeta2_comp);
289 auto gzetaSA = mf.array(mfi,gzetaSA_comp);
290 auto Dstp = mf.array(mfi,Dstp_comp);
291 auto rhs_ubar = mf.array(mfi,rhs_ubar_comp);
292 auto rhs_vbar = mf.array(mfi,rhs_vbar_comp);
293 auto rhs_zeta = mf.array(mfi,rhs_zeta_comp);
294 auto zeta_new = mf.array(mfi,zeta_new_comp);
296 FArrayBox & fab_DUon=mf_DUon[mfi];
297 FArrayBox & fab_DVom=mf_DVom[mfi];
298 auto DUon=fab_DUon.array();
299 auto DVom=fab_DVom.array();
305 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
307 rhs_ubar(i,j,0)=0.0_rt;
310 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
312 rhs_vbar(i,j,0)=0.0_rt;
316 ParallelFor(tbxp2D, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
318 fomn(i,j,0) = fcor(i,j,0)*(1.0_rt/(pm(i,j,0)*pn(i,j,0)));
322 ParallelFor(makeSlab(tbxp3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
324 Drhs(i,j,0)=zeta(i,j,0,krhs)+h(i,j,0);
327 if(predictor_2d_step)
330 Real cff2=(-1.0_rt/12.0_rt)*weight2[my_iif+1];
331 ParallelFor(makeSlab(gbx3,2,0),
332 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
334 Zt_avg1(i,j,0)=0.0_rt;
336 ParallelFor(makeSlab(xgbx2,2,0),
337 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
339 DU_avg1(i,j,0)=0.0_rt;
340 DU_avg2(i,j,0)=cff2*DUon(i,j,0);
342 ParallelFor(makeSlab(ygbx2,2,0),
343 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
345 DV_avg1(i,j,0)=0.0_rt;
346 DV_avg2(i,j,0)=cff2*DVom(i,j,0);
350 Real cff1_wt1 = weight1[my_iif-1];
351 Real cff2_wt1 = (8.0_rt/12.0_rt)*weight2[my_iif]-
352 (1.0_rt/12.0_rt)*weight2[my_iif+1];
354 ParallelFor(makeSlab(gbx3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
356 Zt_avg1(i,j,0) += cff1_wt1*zeta(i,j,0,krhs);
359 ParallelFor(makeSlab(xgbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
361 DU_avg1(i,j,0) += cff1_wt1*DUon(i,j,0);
362 DU_avg2(i,j,0) += cff2_wt1*DUon(i,j,0);
365 ParallelFor(makeSlab(ygbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
367 DV_avg1(i,j,0) += cff1_wt1*DVom(i,j,0);
368 DV_avg2(i,j,0) += cff2_wt1*DVom(i,j,0);
376 cff2_wt2=weight2[my_iif];
378 cff2_wt2=5.0_rt/12.0_rt*weight2[my_iif];
381 ParallelFor(makeSlab(xgbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
383 DU_avg2(i,j,0)=DU_avg2(i,j,0)+cff2_wt2*DUon(i,j,0);
386 ParallelFor(makeSlab(ygbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
388 DV_avg2(i,j,0)=DV_avg2(i,j,0)+cff2_wt2*DVom(i,j,0);
413 Real fac=1000.0_rt/1025.0_rt;
416 Real cff1=dtfast_lev;
418 ParallelFor(makeSlab(tbxp1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
420 rhs_zeta(i,j,0) = (DUon(i,j,0)-DUon(i+1,j,0))+
421 (DVom(i,j,0)-DVom(i,j+1,0));
422 zeta_new(i,j,0) = (zeta(i,j,0,kstp)+ pm(i,j,0)*pn(i,j,0)*cff1*rhs_zeta(i,j,0)) * mskr(i,j,0);
423 Dnew(i,j,0) = zeta_new(i,j,0)+h(i,j,0);
426 zwrk(i,j,0)=0.5_rt*(zeta(i,j,0,kstp)+zeta_new(i,j,0));
427 gzeta(i,j,0)=(fac+rhoS(i,j,0))*zwrk(i,j,0);
428 gzeta2(i,j,0)=gzeta(i,j,0)*zwrk(i,j,0);
429 gzetaSA(i,j,0)=zwrk(i,j,0)*(rhoS(i,j,0)-rhoA(i,j,0));
432 }
else if (predictor_2d_step) {
434 Real cff1=2.0_rt * dtfast_lev;
435 Real cff4=4.0_rt / 25.0_rt;
436 Real cff5=1.0_rt - 2.0_rt*cff4;
438 ParallelFor(makeSlab(tbxp1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
440 rhs_zeta(i,j,0)=(DUon(i,j,0)-DUon(i+1,j,0))+
441 (DVom(i,j,0)-DVom(i,j+1,0));
442 zeta_new(i,j,0)=(zeta(i,j,0,kstp)+
443 pm(i,j,0)*pn(i,j,0)*cff1*rhs_zeta(i,j,0)) * mskr(i,j,0);
444 Dnew(i,j,0)=zeta_new(i,j,0)+h(i,j,0);
446 zwrk(i,j,0)=cff5*zeta(i,j,0,krhs)+
447 cff4*(zeta(i,j,0,kstp)+zeta_new(i,j,0));
448 gzeta(i,j,0)=(fac+rhoS(i,j,0))*zwrk(i,j,0);
449 gzeta2(i,j,0)=gzeta(i,j,0)*zwrk(i,j,0);
450 gzetaSA(i,j,0)=zwrk(i,j,0)*(rhoS(i,j,0)-rhoA(i,j,0));
453 }
else if (!predictor_2d_step) {
455 Real cff1=dtfast_lev * 5.0_rt/12.0_rt;
456 Real cff2=dtfast_lev * 8.0_rt/12.0_rt;
457 Real cff3=dtfast_lev * 1.0_rt/12.0_rt;
458 Real cff4=2.0_rt/5.0_rt;
459 Real cff5=1.0_rt-cff4;
461 ParallelFor(makeSlab(tbxp1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
463 Real cff=cff1*((DUon(i,j,0)-DUon(i+1,j,0))+
464 (DVom(i,j,0)-DVom(i,j+1,0)));
465 zeta_new(i,j,0)=zeta(i,j,0,kstp)+
466 pm(i,j,0)*pn(i,j,0)*(cff+
467 cff2*rzeta(i,j,0,kstp)-
468 cff3*rzeta(i,j,0,ptsk));
469 zeta_new(i,j,0) *= mskr(i,j,0);
470 Dnew(i,j,0)=zeta_new(i,j,0)+h(i,j,0);
472 zwrk(i,j,0)=cff5*zeta_new(i,j,0)+cff4*zeta(i,j,0,krhs);
473 gzeta(i,j,0)=(fac+rhoS(i,j,0))*zwrk(i,j,0);
474 gzeta2(i,j,0)=gzeta(i,j,0)*zwrk(i,j,0);
475 gzetaSA(i,j,0)=zwrk(i,j,0)*(rhoS(i,j,0)-rhoA(i,j,0));
484 ParallelFor(makeSlab(gbx1,2,0),
485 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
487 zeta(i,j,0,knew) = zeta_new(i,j,0);
493 if (predictor_2d_step) {
494 ParallelFor(makeSlab(gbx1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
496 rzeta(i,j,0,krhs)=rhs_zeta(i,j,0);
512 Real cff1 = 0.5_rt *
g;
513 Real cff2 = 1.0_rt / 3.0_rt;
515 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
517 Real on_u = 2.0_rt / (pn(i,j,0)+pn(i-1,j,0));
518 rhs_ubar(i,j,0)=cff1 * on_u *
519 (( h(i-1,j,0) + h(i,j,0))*
520 (gzeta(i-1,j,0) - gzeta(i,j,0))+
521 ( h(i-1,j,0) - h(i,j,0))*
522 ( gzetaSA(i-1,j,0) + gzetaSA(i,j,0)+
523 cff2*( rhoA(i-1,j,0) - rhoA(i,j,0))*
524 ( zwrk(i-1,j,0) - zwrk(i,j,0)))+
525 (gzeta2(i-1,j,0)- gzeta2(i ,j,0)));
529 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
531 Real om_v = 2.0_rt / (pm(i,j,0)+pm(i,j-1,0));
532 rhs_vbar(i,j,0) = cff1*om_v *
533 (( h(i,j-1,0) + h(i,j,0))*
534 (gzeta(i,j-1,0) - gzeta(i,j,0))+
535 ( h(i,j-1,0) - h(i,j,0))*
536 (gzetaSA(i,j-1,0)+ gzetaSA(i,j ,0)+
537 cff2*(rhoA(i,j-1,0)- rhoA(i,j ,0))*
538 (zwrk(i,j-1,0)- zwrk(i,j ,0)))+
539 (gzeta2(i,j-1,0)- gzeta2(i,j ,0)));
548 Array4<Real const>
const& ubar_const = mf_ubar->const_array(mfi);
549 Array4<Real const>
const& vbar_const = mf_vbar->const_array(mfi);
551 rhs_uv_2d(lev,xbxD, ybxD, ubar_const, vbar_const, rhs_ubar, rhs_vbar, DUon, DVom, krhs);
563 coriolis(xbxD, ybxD, ubar_const, vbar_const, rhs_ubar, rhs_vbar, Drhs, fomn, krhs, 0);
569 uv3dmix(xbxD, ybxD, ubar, vbar, ubar, vbar, rhs_ubar, rhs_vbar,
570 visc2_p, visc2_r, Drhs_const,
571 pm, pn, mskp, krhs, nnew, 0.0_rt);
573#ifdef REMORA_USE_NETCDF
575 Array4<Real >
const& ubar_krhs = mf_ubar->array(mfi, krhs);
576 Array4<Real >
const& vbar_krhs = mf_vbar->array(mfi, krhs);
582 apply_clim_nudg(xbxD_adj, 1, 0, rhs_ubar, ubar_krhs, ubar_clim, ubar_nudg_coeff, Drhs_const, pm, pn);
583 apply_clim_nudg(ybxD_adj, 0, 1, rhs_vbar, vbar_krhs, vbar_clim, vbar_nudg_coeff, Drhs_const, pm, pn);
590 if (first_2d_step&&predictor_2d_step)
593 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
595 rufrc(i,j,0) -= rhs_ubar(i,j,0);
596 rhs_ubar(i,j,0) += rufrc(i,j,0);
597 ru2d(i,j,0,nstp) = rufrc(i,j,0);
600 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
602 rvfrc(i,j,0) -= rhs_vbar(i,j,0);
603 rhs_vbar(i,j,0) += rvfrc(i,j,0);
604 rv2d(i,j,0,nstp) = rvfrc(i,j,0);
607 }
else if (iic==(ntfirst+1)) {
609 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
611 rufrc(i,j,0)=rufrc(i,j,0)-rhs_ubar(i,j,0);
612 rhs_ubar(i,j,0)=rhs_ubar(i,j,0)+1.5_rt*rufrc(i,j,0)-0.5_rt*ru2d(i,j,0,0);
613 ru2d(i,j,0,1)=rufrc(i,j,0);
614 Real r_swap= ru2d(i,j,0,1);
615 ru2d(i,j,0,1) = ru2d(i,j,0,0);
616 ru2d(i,j,0,0) = r_swap;
619 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
621 rvfrc(i,j,0)=rvfrc(i,j,0)-rhs_vbar(i,j,0);
622 rhs_vbar(i,j,0)=rhs_vbar(i,j,0)+1.5_rt*rvfrc(i,j,0)-0.5_rt*rv2d(i,j,0,0);
623 rv2d(i,j,0,1)=rvfrc(i,j,0);
624 Real r_swap= rv2d(i,j,0,1);
625 rv2d(i,j,0,1) = rv2d(i,j,0,0);
626 rv2d(i,j,0,0) = r_swap;
630 cff1=23.0_rt/12.0_rt;
631 cff2=16.0_rt/12.0_rt;
632 Real cff3= 5.0_rt/12.0_rt;
634 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
636 rufrc(i,j,0)=rufrc(i,j,0)-rhs_ubar(i,j,0);
637 rhs_ubar(i,j,0)=rhs_ubar(i,j,0)+
641 ru2d(i,j,0,1)=rufrc(i,j,0);
642 Real r_swap= ru2d(i,j,0,1);
643 ru2d(i,j,0,1) = ru2d(i,j,0,0);
644 ru2d(i,j,0,0) = r_swap;
647 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
649 rvfrc(i,j,0)=rvfrc(i,j,0)-rhs_vbar(i,j,0);
650 rhs_vbar(i,j,0)=rhs_vbar(i,j,0)+
654 rv2d(i,j,0,1)=rvfrc(i,j,0);
656 Real r_swap= rv2d(i,j,0,1);
657 rv2d(i,j,0,1) = rv2d(i,j,0,0);
658 rv2d(i,j,0,0) = r_swap;
662 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
664 rhs_ubar(i,j,0) += rufrc(i,j,0);
667 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
669 rhs_vbar(i,j,0) += rvfrc(i,j,0);
680 ParallelFor(makeSlab(tbxp3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
682 Dstp(i,j,0)=zeta(i,j,0,kstp)+h(i,j,0);
691 cff1=0.5_rt*dtfast_lev;
693 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
695 Real cff=(pm(i,j,0)+pm(i-1,j,0))*(pn(i,j,0)+pn(i-1,j,0));
696 Real Dnew_avg =1.0_rt/(Dnew(i,j,0)+Dnew(i-1,j,0));
697 ubar(i,j,0,knew)=(ubar(i,j,0,kstp)*
698 (Dstp(i,j,0)+Dstp(i-1,j,0))+
699 cff*cff1*rhs_ubar(i,j,0))*Dnew_avg * msku(i,j,0);
702 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
704 Real cff=(pm(i,j,0)+pm(i,j-1,0))*(pn(i,j,0)+pn(i,j-1,0));
705 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i,j-1,0));
706 vbar(i,j,0,knew)=(vbar(i,j,0,kstp)*
707 (Dstp(i,j,0)+Dstp(i,j-1,0))+
708 cff*cff1*rhs_vbar(i,j,0))*Dnew_avg * mskv(i,j,0);
711 }
else if (predictor_2d_step) {
715 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
717 Real cff=(pm(i,j,0)+pm(i-1,j,0))*(pn(i,j,0)+pn(i-1,j,0));
718 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i-1,j,0));
719 ubar(i,j,0,knew)=(ubar(i,j,0,kstp)*
720 (Dstp(i,j,0)+Dstp(i-1,j,0))+
721 cff*cff1*rhs_ubar(i,j,0))*Dnew_avg * msku(i,j,0);
724 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
726 Real cff=(pm(i,j,0)+pm(i,j-1,0))*(pn(i,j,0)+pn(i,j-1,0));
727 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i,j-1,0));
728 vbar(i,j,0,knew)=(vbar(i,j,0,kstp)*
729 (Dstp(i,j,0)+Dstp(i,j-1,0))+
730 cff*cff1*rhs_vbar(i,j,0))*Dnew_avg * mskv(i,j,0);
733 }
else if ((!predictor_2d_step)) {
735 cff1=0.5_rt*dtfast_lev*5.0_rt/12.0_rt;
736 cff2=0.5_rt*dtfast_lev*8.0_rt/12.0_rt;
737 Real cff3=0.5_rt*dtfast_lev*1.0_rt/12.0_rt;
739 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
741 Real cff=(pm(i,j,0)+pm(i-1,j,0))*(pn(i,j,0)+pn(i-1,j,0));
742 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i-1,j,0));
743 ubar(i,j,0,knew)=(ubar(i,j,0,kstp)*
744 (Dstp(i,j,0)+Dstp(i-1,j,0))+
745 cff*(cff1*rhs_ubar(i,j,0)+
746 cff2*rubar(i,j,0,kstp)-
747 cff3*rubar(i,j,0,ptsk)))*Dnew_avg * msku(i,j,0);
750 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
752 Real cff=(pm(i,j,0)+pm(i,j-1,0))*(pn(i,j,0)+pn(i,j-1,0));
753 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i,j-1,0));
754 vbar(i,j,0,knew)=(vbar(i,j,0,kstp)*
755 (Dstp(i,j,0)+Dstp(i,j-1,0))+
756 cff*(cff1*rhs_vbar(i,j,0)+
757 cff2*rvbar(i,j,0,kstp)-
758 cff3*rvbar(i,j,0,ptsk)))*Dnew_avg * mskv(i,j,0);
768 if (predictor_2d_step) {
769 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
771 rubar(i,j,0,krhs)=rhs_ubar(i,j,0);
773 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
775 rvbar(i,j,0,krhs)=rhs_vbar(i,j,0);
788 }
else if (predictor_2d_step) {
790 dt2d = 2.0_rt * dtfast_lev;
797 knew,
false,
true, 0,know, dt2d);
799 knew,
false,
true, 0,know, dt2d);
801 knew,
false,
false, 0,know, dt2d);
803#ifdef REMORA_USE_NETCDF
807 for ( MFIter mfi(*mf_rhoS, TilingIfNotGPU()); mfi.isValid(); ++mfi )
811 Array4<Real >
const& ubar = mf_ubar->array(mfi);
812 Array4<Real >
const& vbar = mf_vbar->array(mfi);
813 Array4<Real const>
const& zeta = mf_zeta->const_array(mfi);
814 Array4<Real const>
const& h = mf_h->const_array(mfi);
815 Array4<Real const>
const& pm = mf_pm->const_array(mfi);
816 Array4<Real const>
const& pn = mf_pn->const_array(mfi);
818 Box gbx1D = mfi.growntilebox(IntVect(
NGROW-1,
NGROW-1,0));
821 ParallelFor(gbx1D, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
823 int iriver = river_pos(i,j,0);
825 if (river_direction_d[iriver] == 0) {
826 Real on_u = 2.0_rt / (pn(i,j,0)+pn(i-1,j,0));
827 Real cff = 1.0_rt / (on_u * 0.5_rt * (zeta(i-1,j,0,knew) + h(i-1,j,0) +
828 zeta(i,j,0,knew) + h(i,j,0)));
829 ubar(i,j,0,knew) = river_transportbar(iriver,0,0) * cff;
831 Real om_v = 2.0_rt / (pm(i,j,0)+pm(i,j-1,0));
832 Real cff = 1.0_rt / (om_v * 0.5_rt * (zeta(i,j-1,0,knew) + h(i,j-1,0) +
833 zeta(i,j,0,knew) + h(i,j,0)));
834 vbar(i,j,0,knew) = river_transportbar(iriver,0,0) * cff;