26 const Array4<Real >& u,
27 const Array4<Real >& v,
28 const Array4<Real const>& uold,
29 const Array4<Real const>& vold,
30 const Array4<Real >& rufrc,
31 const Array4<Real >& rvfrc,
32 const Array4<Real const>& visc2_p,
33 const Array4<Real const>& visc2_r,
34 const Array4<Real const>& Hz,
35 const Array4<Real const>& pm,
36 const Array4<Real const>& pn,
37 const Array4<Real const>& mskp,
41 BL_PROFILE(
"REMORA::uv3dmix()");
47 int UFx_comp = ncomp++;
48 int UFe_comp = ncomp++;
49 int VFe_comp = ncomp++;
50 int VFx_comp = ncomp++;
52 Box bx = enclosedCells(xbx);
53 FArrayBox fab(grow(bx,IntVect(2,2,0)),ncomp,amrex::The_Async_Arena()); fab.template setVal<RunOn::Device>(0.);
55 auto UFx=fab.array(UFx_comp);
56 auto UFe=fab.array(UFe_comp);
57 auto VFx=fab.array(VFx_comp);
58 auto VFe=fab.array(VFe_comp);
60 auto N = xbx.hiVect()[2] - ybx.loVect()[2];
72 ParallelFor(growLo(xbx,0,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
74 const Real cff = 0.5_rt*Hz(i,j,k) * ( pm(i,j,0) / pn(i,j,0) *
75 ( (pn(i ,j,0) + pn(i+1,j,0)) * uold(i+1,j,k,nrhs)-
76 (pn(i-1,j,0) + pn(i ,j,0)) * uold(i ,j,k,nrhs) )-
77 pn(i,j,0) / pm(i,j,0) *
78 ( (pm(i,j ,0) + pm(i,j+1,0)) * vold(i,j+1,k,nrhs)-
79 (pm(i,j-1,0) + pm(i,j ,0)) * vold(i,j ,k,nrhs) ) );
81 Real on_r = 1.0_rt / pn(i,j,0);
82 UFx(i,j,k) = on_r * on_r * visc2_r(i,j,0) * cff;
85 ParallelFor(growHi(xbx,1,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
87 const Real pmon_p = (pm(i-1,j-1,0)+pm(i-1,j,0)+pm(i,j-1,0)+pm(i,j,0)) /
88 (pn(i-1,j-1,0)+pn(i-1,j,0)+pn(i,j-1,0)+pn(i,j,0));
89 const Real pnom_p = (pn(i-1,j-1,0)+pn(i-1,j,0)+pn(i,j-1,0)+pn(i,j,0)) /
90 (pm(i-1,j-1,0)+pm(i-1,j,0)+pm(i,j-1,0)+pm(i,j,0));
91 const Real cff = mskp(i,j,0) * 0.125_rt *
92 (Hz(i-1,j ,k) + Hz(i,j ,k)+ Hz(i-1,j-1,k) + Hz(i,j-1,k))*
94 ((pn(i ,j-1,0)+pn(i ,j,0))*vold(i ,j,k,nrhs)-
95 (pn(i-1,j-1,0)+pn(i-1,j,0))*vold(i-1,j,k,nrhs))+
97 ((pm(i-1,j ,0)+pm(i,j ,0))*uold(i,j ,k,nrhs)-
98 (pm(i-1,j-1,0)+pm(i,j-1,0))*uold(i,j-1,k,nrhs)));
100 const Real om_p = 4.0_rt / (pm(i-1,j-1,0)+pm(i-1,j,0)+pm(i,j-1,0)+pm(i,j,0));
101 UFe(i,j,k) = om_p*om_p*visc2_p(i,j,0)*cff;
104 ParallelFor(makeSlab(xbx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
106 for (
int k=0; k<=N; k++) {
107 const Real cff=dt_lev*0.25_rt*(pm(i-1,j,0)+pm(i,j,0))*(pn(i-1,j,0)+pn(i,j,0));
108 const Real cff1=0.5_rt*(pn(i-1,j,0)+pn(i,j,0))*(UFx(i,j ,k)-UFx(i-1,j,k));
109 const Real cff2=0.5_rt*(pm(i-1,j,0)+pm(i,j,0))*(UFe(i,j+1,k)-UFe(i ,j,k));
110 const Real cff3=cff*(cff1+cff2);
111 u(i,j,k,nnew)=u(i,j,k,nnew)+cff3;
112 rufrc(i,j,0) += cff1+cff2;
127 ParallelFor(growLo(ybx,1,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
130 const Real cff = 0.5_rt*Hz(i,j,k) * (pm(i,j,0) / pn(i,j,0) *
131 ((pn(i, j,0) + pn(i+1,j,0)) * uold(i+1,j,k,nrhs)-
132 (pn(i-1,j,0) + pn(i, j,0)) * uold(i ,j,k,nrhs))-
133 pn(i,j,0) / pm(i,j,0) *
134 ((pm(i,j ,0)+pm(i,j+1,0))*vold(i,j+1,k,nrhs)-
135 (pm(i,j-1,0)+pm(i,j ,0))*vold(i,j ,k,nrhs)));
137 Real om_r = 1.0_rt / pm(i,j,0);
138 VFe(i,j,k) = om_r * om_r * visc2_r(i,j,0) * cff;
141 ParallelFor(growHi(ybx,0,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
143 const Real pmon_p = (pm(i-1,j-1,0)+pm(i-1,j,0)+pm(i,j-1,0)+pm(i,j,0)) /
144 (pn(i-1,j-1,0)+pn(i-1,j,0)+pn(i,j-1,0)+pn(i,j,0));
145 const Real pnom_p = (pn(i-1,j-1,0)+pn(i-1,j,0)+pn(i,j-1,0)+pn(i,j,0)) /
146 (pm(i-1,j-1,0)+pm(i-1,j,0)+pm(i,j-1,0)+pm(i,j,0));
147 const Real cff = mskp(i,j,0) * 0.125_rt * (Hz(i-1,j ,k)+Hz(i,j ,k)+
148 Hz(i-1,j-1,k)+Hz(i,j-1,k))*
150 ((pn(i ,j-1,0)+pn(i ,j,0))*vold(i ,j,k,nrhs)-
151 (pn(i-1,j-1,0)+pn(i-1,j,0))*vold(i-1,j,k,nrhs))+
153 ((pm(i-1,j ,0)+pm(i,j ,0))*uold(i,j ,k,nrhs)-
154 (pm(i-1,j-1,0)+pm(i,j-1,0))*uold(i,j-1,k,nrhs)));
156 const Real on_p = 4.0_rt / (pn(i-1,j-1,0)+pn(i-1,j,0)+pn(i,j-1,0)+pn(i,j,0));
157 VFx(i,j,k) = on_p*on_p*visc2_p(i,j,0)*cff;
160 ParallelFor(makeSlab(ybx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
162 for (
int k=0; k<=N; k++) {
163 const Real cff=dt_lev*0.25_rt*(pm(i,j,0)+pm(i,j-1,0))*(pn(i,j,0)+pn(i,j-1,0));
164 const Real cff1=0.5_rt*(pn(i,j-1,0)+pn(i,j,0))*(VFx(i+1,j,k)-VFx(i,j ,k));
165 const Real cff2=0.5_rt*(pm(i,j-1,0)+pm(i,j,0))*(VFe(i ,j,k)-VFe(i,j-1,k));
166 const Real cff3=cff*(cff1-cff2);
168 v(i,j,k,nnew)=v(i,j,k,nnew)+cff3;
169 rvfrc(i,j,0) += cff1-cff2;