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,
83 int krhs = (my_iif + iic) % 2 + 1;
84 int kstp = my_iif <=1 ? iic % 2 + 1 : (iic % 2 + my_iif % 2 + 1) % 2 + 1;
86 if (predictor_2d_step) {
87 next_indx1 = 3 - indx1;
105 auto ba = mf_h->boxArray();
106 auto dm = mf_h->DistributionMap();
108 MultiFab mf_DUon(convert(ba,IntVect(1,0,0)),dm,1,IntVect(
NGROW,
NGROW,0));
109 MultiFab mf_DVom(convert(ba,IntVect(0,1,0)),dm,1,IntVect(
NGROW,
NGROW,0));
111 const auto dlo = amrex::lbound(Geom(lev).Domain());
112 const auto dhi = amrex::ubound(Geom(lev).Domain());
114 for ( MFIter mfi(*mf_rhoS, TilingIfNotGPU()); mfi.isValid(); ++mfi )
116 Array4<Real >
const& ubar = mf_ubar->array(mfi);
117 Array4<Real >
const& vbar = mf_vbar->array(mfi);
118 Array4<Real >
const& zeta = mf_zeta->array(mfi);
119 Array4<Real const>
const& h = mf_h->const_array(mfi);
121 Array4<Real const>
const& pm = mf_pm->const_array(mfi);
122 Array4<Real const>
const& pn = mf_pn->const_array(mfi);
124 Box bx = mfi.tilebox();
125 Box gbx = mfi.growntilebox();
126 Box gbx1 = mfi.growntilebox(IntVect(
NGROW-1,
NGROW-1,0));
127 Box gbx2 = mfi.growntilebox(IntVect(
NGROW,
NGROW,0));
128 Box xgbx2 = mfi.grownnodaltilebox(0, IntVect(
NGROW,
NGROW,0));
129 Box ygbx2 = mfi.grownnodaltilebox(1, IntVect(
NGROW,
NGROW,0));
140 Box bxD = bx ; bxD.makeSlab(2,0);
141 Box gbxD = gbx ; gbxD.makeSlab(2,0);
142 Box gbx1D = gbx1; gbx1D.makeSlab(2,0);
143 Box gbx2D = gbx2; gbx2D.makeSlab(2,0);
146 tbxp2D.makeSlab(2,0);
149 FArrayBox fab_Drhs(makeSlab(tbxp3,2,0),1,The_Async_Arena());
150 auto Drhs=fab_Drhs.array();
152 auto DUon = mf_DUon.array(mfi);
153 auto DVom = mf_DVom.array(mfi);
155 ParallelFor(makeSlab(tbxp3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
157 Drhs(i,j,0)=zeta(i,j,0,krhs)+h(i,j,0);
160 ParallelFor(makeSlab(xgbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
162 Real on_u = 2.0_rt / (pn(i,j,0)+pn(i-1,j,0));
163 Real cff1= 0.5_rt * on_u *(Drhs(i,j,0)+Drhs(i-1,j,0));
164 DUon(i,j,0)=ubar(i,j,0,krhs)*cff1;
167 ParallelFor(makeSlab(ygbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
169 Real om_v = 2.0_rt / (pm(i,j,0)+pm(i,j-1,0));
170 Real cff1= 0.5_rt * om_v * (Drhs(i,j,0)+Drhs(i,j-1,0));
171 DVom(i,j,0)=vbar(i,j,0,krhs)*cff1;
176 mf_DUon.FillBoundary(geom[lev].periodicity());
177 mf_DVom.FillBoundary(geom[lev].periodicity());
179#ifdef REMORA_USE_NETCDF
186 for ( MFIter mfi(*mf_rhoS, TilingIfNotGPU()); mfi.isValid(); ++mfi )
188 Array4<Real const>
const& rhoS = mf_rhoS->const_array(mfi);
189 Array4<Real const>
const& rhoA = mf_rhoA->const_array(mfi);
190 Array4<Real const>
const& h = mf_h->const_array(mfi);
192 Array4<Real >
const& rufrc = mf_rufrc->array(mfi);
193 Array4<Real >
const& rvfrc = mf_rvfrc->array(mfi);
194 Array4<Real >
const& Zt_avg1 = mf_Zt_avg1->array(mfi);
195 Array4<Real >
const& ubar = mf_ubar->array(mfi);
196 Array4<Real >
const& vbar = mf_vbar->array(mfi);
197 Array4<Real >
const& ubar_krhs = mf_ubar->array(mfi, krhs);
198 Array4<Real >
const& vbar_krhs = mf_vbar->array(mfi, krhs);
199 Array4<Real >
const& zeta = mf_zeta->array(mfi);
200 Array4<Real >
const& DU_avg1 = (mf_DU_avg1)->array(mfi);
201 Array4<Real >
const& DU_avg2 = (mf_DU_avg2)->array(mfi);
202 Array4<Real >
const& DV_avg1 = (mf_DV_avg1)->array(mfi);
203 Array4<Real >
const& DV_avg2 = (mf_DV_avg2)->array(mfi);
204 Array4<Real >
const& ru2d = (mf_ru2d)->array(mfi);
205 Array4<Real >
const& rv2d = (mf_rv2d)->array(mfi);
206 Array4<Real >
const& rubar = (mf_rubar)->array(mfi);
207 Array4<Real >
const& rvbar = (mf_rvbar)->array(mfi);
208 Array4<Real >
const& rzeta = (mf_rzeta)->array(mfi);
209 Array4<Real const>
const& visc2_p = mf_visc2_p->const_array(mfi);
210 Array4<Real const>
const& visc2_r = mf_visc2_r->const_array(mfi);
212 Array4<Real const>
const& pm = mf_pm->const_array(mfi);
213 Array4<Real const>
const& pn = mf_pn->const_array(mfi);
214 Array4<Real const>
const& fcor = mf_fcor->const_array(mfi);
216 Array4<Real const>
const& mskr = mf_mskr->const_array(mfi);
217 Array4<Real const>
const& msku = mf_msku->const_array(mfi);
218 Array4<Real const>
const& mskv = mf_mskv->const_array(mfi);
219 Array4<Real const>
const& mskp = mf_mskp->const_array(mfi);
221 Box bx = mfi.tilebox();
222 Box gbx = mfi.growntilebox();
223 Box gbx1 = mfi.growntilebox(IntVect(
NGROW-1,
NGROW-1,0));
224 Box gbx2 = mfi.growntilebox(IntVect(
NGROW,
NGROW,0));
225 Box gbx3 = mfi.growntilebox(IntVect(
NGROW+1,
NGROW+1,0));
226 Box xgbx2 = mfi.grownnodaltilebox(0, IntVect(
NGROW,
NGROW,0));
227 Box ygbx2 = mfi.grownnodaltilebox(1, IntVect(
NGROW,
NGROW,0));
229 Box xbxD = mfi.nodaltilebox(0);
232 Box ybxD = mfi.nodaltilebox(1);
235 Box xbxD_adj = mfi.nodaltilebox(0);
236 xbxD_adj.makeSlab(2,0);
237 Box ybxD_adj = mfi.nodaltilebox(1);
238 ybxD_adj.makeSlab(2,0);
240 auto xbxD_lo = lbound(xbxD_adj);
241 auto xbxD_hi = ubound(xbxD_adj);
242 auto ybxD_lo = lbound(ybxD_adj);
243 auto ybxD_hi = ubound(ybxD_adj);
245 if (xbxD_lo.x == dlo.x) {
246 xbxD_adj.growLo(0,-1);
247 }
else if (xbxD_hi.x == dhi.x) {
248 xbxD_adj.growHi(0,-1);
251 if (ybxD_lo.y == dlo.y) {
252 ybxD_adj.growLo(1,-1);
253 }
else if (ybxD_hi.y == dhi.y) {
254 ybxD_adj.growHi(1,-1);
257 Box tbxp1 = bx; tbxp1.grow(IntVect(
NGROW-1,
NGROW-1,0));
259 Box tbxp2 = bx; tbxp2.grow(IntVect(
NGROW,
NGROW,0));
260 Box tbxp3 = bx; tbxp3.grow(IntVect(
NGROW+1,
NGROW+1,0));
262 Box bxD = bx; bxD.makeSlab(2,0);
263 Box gbxD = gbx; gbxD.makeSlab(2,0);
264 Box gbx1D = gbx1; gbx1D.makeSlab(2,0);
265 Box gbx2D = gbx2; gbx2D.makeSlab(2,0);
268 tbxp2D.makeSlab(2,0);
270 FArrayBox fab_fomn(tbxp2,1,The_Async_Arena());
273 FArrayBox fab_Drhs(tbxp3,1,The_Async_Arena());
274 FArrayBox fab_Dnew(tbxp2,1,The_Async_Arena());
275 FArrayBox fab_zwrk(tbxp1,1,The_Async_Arena());
276 FArrayBox fab_gzeta(tbxp1,1,The_Async_Arena());
277 FArrayBox fab_gzeta2(tbxp1,1,The_Async_Arena());
278 FArrayBox fab_gzetaSA(tbxp1,1,The_Async_Arena());
279 FArrayBox fab_Dstp(tbxp3,1,The_Async_Arena());
280 FArrayBox & fab_DUon=mf_DUon[mfi];
281 FArrayBox & fab_DVom=mf_DVom[mfi];
282 FArrayBox fab_rhs_ubar(xbxD,1,The_Async_Arena());
283 FArrayBox fab_rhs_vbar(ybxD,1,The_Async_Arena());
284 FArrayBox fab_rhs_zeta(tbxp1,1,The_Async_Arena());
285 FArrayBox fab_zeta_new(tbxp1,1,The_Async_Arena());
287 auto fomn=fab_fomn.array();
289 auto Drhs = fab_Drhs.array();
290 auto Drhs_const = fab_Drhs.const_array();
291 auto Dnew=fab_Dnew.array();
292 auto zwrk=fab_zwrk.array();
293 auto gzeta=fab_gzeta.array();
294 auto gzeta2=fab_gzeta2.array();
295 auto gzetaSA=fab_gzetaSA.array();
296 auto Dstp=fab_Dstp.array();
297 auto DUon=fab_DUon.array();
298 auto DVom=fab_DVom.array();
299 auto rhs_ubar=fab_rhs_ubar.array();
300 auto rhs_vbar=fab_rhs_vbar.array();
301 auto rhs_zeta=fab_rhs_zeta.array();
302 auto zeta_new=fab_zeta_new.array();
308 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
310 rhs_ubar(i,j,0)=0.0_rt;
313 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
315 rhs_vbar(i,j,0)=0.0_rt;
319 ParallelFor(tbxp2D, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
321 fomn(i,j,0) = fcor(i,j,0)*(1.0_rt/(pm(i,j,0)*pn(i,j,0)));
325 ParallelFor(makeSlab(tbxp3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
327 Drhs(i,j,0)=zeta(i,j,0,krhs)+h(i,j,0);
330 if(predictor_2d_step)
333 Real cff2=(-1.0_rt/12.0_rt)*weight2[my_iif+1];
334 ParallelFor(makeSlab(gbx3,2,0),
335 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
337 Zt_avg1(i,j,0)=0.0_rt;
339 ParallelFor(makeSlab(xgbx2,2,0),
340 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
342 DU_avg1(i,j,0)=0.0_rt;
343 DU_avg2(i,j,0)=cff2*DUon(i,j,0);
345 ParallelFor(makeSlab(ygbx2,2,0),
346 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
348 DV_avg1(i,j,0)=0.0_rt;
349 DV_avg2(i,j,0)=cff2*DVom(i,j,0);
353 Real cff1_wt1 = weight1[my_iif-1];
354 Real cff2_wt1 = (8.0_rt/12.0_rt)*weight2[my_iif]-
355 (1.0_rt/12.0_rt)*weight2[my_iif+1];
357 ParallelFor(makeSlab(gbx3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
359 Zt_avg1(i,j,0) += cff1_wt1*zeta(i,j,0,krhs);
362 ParallelFor(makeSlab(xgbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
364 DU_avg1(i,j,0) += cff1_wt1*DUon(i,j,0);
365 DU_avg2(i,j,0) += cff2_wt1*DUon(i,j,0);
368 ParallelFor(makeSlab(ygbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
370 DV_avg1(i,j,0) += cff1_wt1*DVom(i,j,0);
371 DV_avg2(i,j,0) += cff2_wt1*DVom(i,j,0);
379 cff2_wt2=weight2[my_iif];
381 cff2_wt2=5.0_rt/12.0_rt*weight2[my_iif];
384 ParallelFor(makeSlab(xgbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
386 DU_avg2(i,j,0)=DU_avg2(i,j,0)+cff2_wt2*DUon(i,j,0);
389 ParallelFor(makeSlab(ygbx2,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
391 DV_avg2(i,j,0)=DV_avg2(i,j,0)+cff2_wt2*DVom(i,j,0);
416 Real fac=1000.0_rt/1025.0_rt;
419 Real cff1=dtfast_lev;
421 ParallelFor(makeSlab(tbxp1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
423 rhs_zeta(i,j,0) = (DUon(i,j,0)-DUon(i+1,j,0))+
424 (DVom(i,j,0)-DVom(i,j+1,0));
425 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);
426 Dnew(i,j,0) = zeta_new(i,j,0)+h(i,j,0);
429 zwrk(i,j,0)=0.5_rt*(zeta(i,j,0,kstp)+zeta_new(i,j,0));
430 gzeta(i,j,0)=(fac+rhoS(i,j,0))*zwrk(i,j,0);
431 gzeta2(i,j,0)=gzeta(i,j,0)*zwrk(i,j,0);
432 gzetaSA(i,j,0)=zwrk(i,j,0)*(rhoS(i,j,0)-rhoA(i,j,0));
435 }
else if (predictor_2d_step) {
437 Real cff1=2.0_rt * dtfast_lev;
438 Real cff4=4.0_rt / 25.0_rt;
439 Real cff5=1.0_rt - 2.0_rt*cff4;
441 ParallelFor(makeSlab(tbxp1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
443 rhs_zeta(i,j,0)=(DUon(i,j,0)-DUon(i+1,j,0))+
444 (DVom(i,j,0)-DVom(i,j+1,0));
445 zeta_new(i,j,0)=(zeta(i,j,0,kstp)+
446 pm(i,j,0)*pn(i,j,0)*cff1*rhs_zeta(i,j,0)) * mskr(i,j,0);
447 Dnew(i,j,0)=zeta_new(i,j,0)+h(i,j,0);
449 zwrk(i,j,0)=cff5*zeta(i,j,0,krhs)+
450 cff4*(zeta(i,j,0,kstp)+zeta_new(i,j,0));
451 gzeta(i,j,0)=(fac+rhoS(i,j,0))*zwrk(i,j,0);
452 gzeta2(i,j,0)=gzeta(i,j,0)*zwrk(i,j,0);
453 gzetaSA(i,j,0)=zwrk(i,j,0)*(rhoS(i,j,0)-rhoA(i,j,0));
456 }
else if (!predictor_2d_step) {
458 Real cff1=dtfast_lev * 5.0_rt/12.0_rt;
459 Real cff2=dtfast_lev * 8.0_rt/12.0_rt;
460 Real cff3=dtfast_lev * 1.0_rt/12.0_rt;
461 Real cff4=2.0_rt/5.0_rt;
462 Real cff5=1.0_rt-cff4;
464 ParallelFor(makeSlab(tbxp1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
466 Real cff=cff1*((DUon(i,j,0)-DUon(i+1,j,0))+
467 (DVom(i,j,0)-DVom(i,j+1,0)));
468 zeta_new(i,j,0)=zeta(i,j,0,kstp)+
469 pm(i,j,0)*pn(i,j,0)*(cff+
470 cff2*rzeta(i,j,0,kstp)-
471 cff3*rzeta(i,j,0,ptsk));
472 zeta_new(i,j,0) *= mskr(i,j,0);
473 Dnew(i,j,0)=zeta_new(i,j,0)+h(i,j,0);
475 zwrk(i,j,0)=cff5*zeta_new(i,j,0)+cff4*zeta(i,j,0,krhs);
476 gzeta(i,j,0)=(fac+rhoS(i,j,0))*zwrk(i,j,0);
477 gzeta2(i,j,0)=gzeta(i,j,0)*zwrk(i,j,0);
478 gzetaSA(i,j,0)=zwrk(i,j,0)*(rhoS(i,j,0)-rhoA(i,j,0));
487 ParallelFor(makeSlab(gbx1,2,0),
488 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
490 zeta(i,j,0,knew) = zeta_new(i,j,0);
496 if (predictor_2d_step) {
497 ParallelFor(makeSlab(gbx1,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
499 rzeta(i,j,0,krhs)=rhs_zeta(i,j,0);
516 Real cff1 = 0.5_rt *
g;
517 Real cff2 = 1.0_rt / 3.0_rt;
519 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
521 Real on_u = 2.0_rt / (pn(i,j,0)+pn(i-1,j,0));
522 rhs_ubar(i,j,0)=cff1 * on_u *
523 (( h(i-1,j,0) + h(i,j,0))*
524 (gzeta(i-1,j,0) - gzeta(i,j,0))+
525 ( h(i-1,j,0) - h(i,j,0))*
526 ( gzetaSA(i-1,j,0) + gzetaSA(i,j,0)+
527 cff2*( rhoA(i-1,j,0) - rhoA(i,j,0))*
528 ( zwrk(i-1,j,0) - zwrk(i,j,0)))+
529 (gzeta2(i-1,j,0)- gzeta2(i ,j,0)));
533 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
535 Real om_v = 2.0_rt / (pm(i,j,0)+pm(i,j-1,0));
536 rhs_vbar(i,j,0) = cff1*om_v *
537 (( h(i,j-1,0) + h(i,j,0))*
538 (gzeta(i,j-1,0) - gzeta(i,j,0))+
539 ( h(i,j-1,0) - h(i,j,0))*
540 (gzetaSA(i,j-1,0)+ gzetaSA(i,j ,0)+
541 cff2*(rhoA(i,j-1,0)- rhoA(i,j ,0))*
542 (zwrk(i,j-1,0)- zwrk(i,j ,0)))+
543 (gzeta2(i,j-1,0)- gzeta2(i,j ,0)));
552 Array4<Real const>
const& ubar_const = mf_ubar->const_array(mfi);
553 Array4<Real const>
const& vbar_const = mf_vbar->const_array(mfi);
555 rhs_uv_2d(xbxD, ybxD, ubar_const, vbar_const, rhs_ubar, rhs_vbar, DUon, DVom, krhs);
567 coriolis(xbxD, ybxD, ubar_const, vbar_const, rhs_ubar, rhs_vbar, Drhs, fomn, krhs, 0);
573 uv3dmix(xbxD, ybxD, ubar, vbar, ubar, vbar, rhs_ubar, rhs_vbar,
574 visc2_p, visc2_r, Drhs_const,
575 pm, pn, mskp, krhs, nnew, 0.0_rt);
577#ifdef REMORA_USE_NETCDF
584 apply_clim_nudg(xbxD_adj, 1, 0, rhs_ubar, ubar_krhs, ubar_clim, ubar_nudg_coeff, Drhs_const, pm, pn);
585 apply_clim_nudg(ybxD_adj, 0, 1, rhs_vbar, vbar_krhs, vbar_clim, vbar_nudg_coeff, Drhs_const, pm, pn);
592 if (first_2d_step&&predictor_2d_step)
595 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
597 rufrc(i,j,0) -= rhs_ubar(i,j,0);
598 rhs_ubar(i,j,0) += rufrc(i,j,0);
599 ru2d(i,j,0,nstp) = rufrc(i,j,0);
602 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
604 rvfrc(i,j,0) -= rhs_vbar(i,j,0);
605 rhs_vbar(i,j,0) += rvfrc(i,j,0);
606 rv2d(i,j,0,nstp) = rvfrc(i,j,0);
609 }
else if (iic==(ntfirst+1)) {
611 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
613 rufrc(i,j,0)=rufrc(i,j,0)-rhs_ubar(i,j,0);
614 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);
615 ru2d(i,j,0,1)=rufrc(i,j,0);
616 Real r_swap= ru2d(i,j,0,1);
617 ru2d(i,j,0,1) = ru2d(i,j,0,0);
618 ru2d(i,j,0,0) = r_swap;
621 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
623 rvfrc(i,j,0)=rvfrc(i,j,0)-rhs_vbar(i,j,0);
624 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);
625 rv2d(i,j,0,1)=rvfrc(i,j,0);
626 Real r_swap= rv2d(i,j,0,1);
627 rv2d(i,j,0,1) = rv2d(i,j,0,0);
628 rv2d(i,j,0,0) = r_swap;
632 cff1=23.0_rt/12.0_rt;
633 cff2=16.0_rt/12.0_rt;
634 Real cff3= 5.0_rt/12.0_rt;
636 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
638 rufrc(i,j,0)=rufrc(i,j,0)-rhs_ubar(i,j,0);
639 rhs_ubar(i,j,0)=rhs_ubar(i,j,0)+
643 ru2d(i,j,0,1)=rufrc(i,j,0);
644 Real r_swap= ru2d(i,j,0,1);
645 ru2d(i,j,0,1) = ru2d(i,j,0,0);
646 ru2d(i,j,0,0) = r_swap;
649 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
651 rvfrc(i,j,0)=rvfrc(i,j,0)-rhs_vbar(i,j,0);
652 rhs_vbar(i,j,0)=rhs_vbar(i,j,0)+
656 rv2d(i,j,0,1)=rvfrc(i,j,0);
658 Real r_swap= rv2d(i,j,0,1);
659 rv2d(i,j,0,1) = rv2d(i,j,0,0);
660 rv2d(i,j,0,0) = r_swap;
664 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
666 rhs_ubar(i,j,0) += rufrc(i,j,0);
669 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
671 rhs_vbar(i,j,0) += rvfrc(i,j,0);
682 ParallelFor(makeSlab(tbxp3,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
684 Dstp(i,j,0)=zeta(i,j,0,kstp)+h(i,j,0);
693 cff1=0.5_rt*dtfast_lev;
695 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
697 Real cff=(pm(i,j,0)+pm(i-1,j,0))*(pn(i,j,0)+pn(i-1,j,0));
698 Real Dnew_avg =1.0_rt/(Dnew(i,j,0)+Dnew(i-1,j,0));
699 ubar(i,j,0,knew)=(ubar(i,j,0,kstp)*
700 (Dstp(i,j,0)+Dstp(i-1,j,0))+
701 cff*cff1*rhs_ubar(i,j,0))*Dnew_avg * msku(i,j,0);
704 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
706 Real cff=(pm(i,j,0)+pm(i,j-1,0))*(pn(i,j,0)+pn(i,j-1,0));
707 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i,j-1,0));
708 vbar(i,j,0,knew)=(vbar(i,j,0,kstp)*
709 (Dstp(i,j,0)+Dstp(i,j-1,0))+
710 cff*cff1*rhs_vbar(i,j,0))*Dnew_avg * mskv(i,j,0);
713 }
else if (predictor_2d_step) {
717 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
719 Real cff=(pm(i,j,0)+pm(i-1,j,0))*(pn(i,j,0)+pn(i-1,j,0));
720 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i-1,j,0));
721 ubar(i,j,0,knew)=(ubar(i,j,0,kstp)*
722 (Dstp(i,j,0)+Dstp(i-1,j,0))+
723 cff*cff1*rhs_ubar(i,j,0))*Dnew_avg * msku(i,j,0);
726 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
728 Real cff=(pm(i,j,0)+pm(i,j-1,0))*(pn(i,j,0)+pn(i,j-1,0));
729 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i,j-1,0));
730 vbar(i,j,0,knew)=(vbar(i,j,0,kstp)*
731 (Dstp(i,j,0)+Dstp(i,j-1,0))+
732 cff*cff1*rhs_vbar(i,j,0))*Dnew_avg * mskv(i,j,0);
735 }
else if ((!predictor_2d_step)) {
737 cff1=0.5_rt*dtfast_lev*5.0_rt/12.0_rt;
738 cff2=0.5_rt*dtfast_lev*8.0_rt/12.0_rt;
739 Real cff3=0.5_rt*dtfast_lev*1.0_rt/12.0_rt;
741 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
743 Real cff=(pm(i,j,0)+pm(i-1,j,0))*(pn(i,j,0)+pn(i-1,j,0));
744 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i-1,j,0));
745 ubar(i,j,0,knew)=(ubar(i,j,0,kstp)*
746 (Dstp(i,j,0)+Dstp(i-1,j,0))+
747 cff*(cff1*rhs_ubar(i,j,0)+
748 cff2*rubar(i,j,0,kstp)-
749 cff3*rubar(i,j,0,ptsk)))*Dnew_avg * msku(i,j,0);
752 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
754 Real cff=(pm(i,j,0)+pm(i,j-1,0))*(pn(i,j,0)+pn(i,j-1,0));
755 Real Dnew_avg=1.0_rt/(Dnew(i,j,0)+Dnew(i,j-1,0));
756 vbar(i,j,0,knew)=(vbar(i,j,0,kstp)*
757 (Dstp(i,j,0)+Dstp(i,j-1,0))+
758 cff*(cff1*rhs_vbar(i,j,0)+
759 cff2*rvbar(i,j,0,kstp)-
760 cff3*rvbar(i,j,0,ptsk)))*Dnew_avg * mskv(i,j,0);
770 if (predictor_2d_step) {
771 ParallelFor(xbxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
773 rubar(i,j,0,krhs)=rhs_ubar(i,j,0);
775 ParallelFor(ybxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
777 rvbar(i,j,0,krhs)=rhs_vbar(i,j,0);
790 }
else if (predictor_2d_step) {
792 dt2d = 2.0_rt * dtfast_lev;
799 knew,
false,
true, 0,know, dt2d);
801 knew,
false,
true, 0,know, dt2d);
803 knew,
false,
false, 0,know, dt2d);
805#ifdef REMORA_USE_NETCDF
809 for ( MFIter mfi(*mf_rhoS, TilingIfNotGPU()); mfi.isValid(); ++mfi )
813 Array4<Real >
const& ubar = mf_ubar->array(mfi);
814 Array4<Real >
const& vbar = mf_vbar->array(mfi);
815 Array4<Real const>
const& zeta = mf_zeta->const_array(mfi);
816 Array4<Real const>
const& h = mf_h->const_array(mfi);
817 Array4<Real const>
const& pm = mf_pm->const_array(mfi);
818 Array4<Real const>
const& pn = mf_pn->const_array(mfi);
820 Box gbx1D = mfi.growntilebox(IntVect(
NGROW-1,
NGROW-1,0));
823 ParallelFor(gbx1D, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
825 int iriver = river_pos(i,j,0);
827 if (river_direction_d[iriver] == 0) {
828 Real on_u = 2.0_rt / (pn(i,j,0)+pn(i-1,j,0));
829 Real cff = 1.0_rt / (on_u * 0.5_rt * (zeta(i-1,j,0,knew) + h(i-1,j,0) +
830 zeta(i,j,0,knew) + h(i,j,0)));
831 ubar(i,j,0,knew) = river_transportbar(iriver,0,0) * cff;
833 Real om_v = 2.0_rt / (pm(i,j,0)+pm(i,j-1,0));
834 Real cff = 1.0_rt / (om_v * 0.5_rt * (zeta(i,j-1,0,knew) + h(i,j-1,0) +
835 zeta(i,j,0,knew) + h(i,j,0)));
836 vbar(i,j,0,knew) = river_transportbar(iriver,0,0) * cff;