29 const Array4<Real const>& uold ,
30 const Array4<Real const>& vold,
31 const Array4<Real >& ru,
32 const Array4<Real >& rv,
33 const Array4<Real >& rufrc,
34 const Array4<Real >& rvfrc,
35 const Array4<Real const>& sustr,
36 const Array4<Real const>& svstr,
37 const Array4<Real const>& bustr,
38 const Array4<Real const>& bvstr,
39 const Array4<Real const>& Huon,
40 const Array4<Real const>& Hvom,
41 const Array4<Real const>& pm,
42 const Array4<Real const>& pn,
43 const Array4<Real const>& W ,
44 const Array4<Real >& FC,
47 const Box& domain = geom[0].Domain();
48 const auto dlo = amrex::lbound(domain);
49 const auto dhi = amrex::ubound(domain);
51 GeometryData
const& geomdata = geom[0].data();
52 bool is_periodic_in_x = geomdata.isPeriodic(0);
53 bool is_periodic_in_y = geomdata.isPeriodic(1);
58 FArrayBox fab_UFx(growLo(xbx,0,1),1,amrex::The_Async_Arena()); fab_UFx.template setVal<RunOn::Device>(0.);
59 FArrayBox fab_UFe(growHi(xbx,1,1),1,amrex::The_Async_Arena()); fab_UFe.template setVal<RunOn::Device>(0.);
60 FArrayBox fab_VFe(growLo(ybx,1,1),1,amrex::The_Async_Arena()); fab_VFe.template setVal<RunOn::Device>(0.);
61 FArrayBox fab_VFx(growHi(ybx,0,1),1,amrex::The_Async_Arena()); fab_VFx.template setVal<RunOn::Device>(0.);
63 auto UFx=fab_UFx.array();
64 auto UFe=fab_UFe.array();
65 auto VFx=fab_VFx.array();
66 auto VFe=fab_VFe.array();
71 const Real Gadv = -0.25_rt;
92 ParallelFor(growLo(xbx,0,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
94 Real cff1 = uold(i,j,k,nrhs)+uold(i+1,j,k,nrhs);
96 Real uxx_i = uold(i-1,j,k,nrhs)-2.0_rt*uold(i ,j,k,nrhs)+uold(i+1,j,k,nrhs);
97 Real uxx_ip1 = uold(i ,j,k,nrhs)-2.0_rt*uold(i+1,j,k,nrhs)+uold(i+2,j,k,nrhs);
100 Real Huxx_i = Huon(i-1,j,k)-2.0_rt*Huon(i ,j,k)+Huon(i+1,j,k);
101 Real Huxx_ip1 = Huon(i ,j,k)-2.0_rt*Huon(i+1,j,k)+Huon(i+2,j,k);
103 if (i == dlo.x && !is_periodic_in_x) {
107 else if (i == dhi.x && !is_periodic_in_x) {
112 Real cff = (cff1 > 0.0_rt) ? uxx_i : uxx_ip1;
114 Real Huon_avg = (Huon(i,j,k) + Huon(i+1,j,k));
116 UFx(i,j,k) = 0.25_rt*(cff1+Gadv*cff) * ( Huon_avg + 0.5_rt*Gadv*(Huxx_i + Huxx_ip1) );
122 ParallelFor(growHi(xbx,1,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
124 Real cff1 = uold(i,j,k,nrhs) + uold(i ,j-1,k,nrhs);
125 Real cff2 = Hvom(i,j,k) + Hvom(i-1,j ,k);
127 Real uee_jm1 = uold(i,j-2,k,nrhs) - 2.0_rt*uold(i,j-1,k,nrhs) + uold(i ,j,k,nrhs);
128 Real uee_j = uold(i,j-1,k,nrhs) - 2.0_rt*uold(i,j ,k,nrhs) + uold(i,j+1,k,nrhs);
130 if (j == dlo.y and !is_periodic_in_y) {
132 }
else if (j == dhi.y+1 and !is_periodic_in_y) {
137 Real cff = (cff2 > 0.0_rt) ? uee_jm1 : uee_j;
139 Real Hvxx_i = Hvom(i-1,j,k)-2.0_rt*Hvom(i ,j,k)+Hvom(i+1,j,k);
140 Real Hvxx_im1 = Hvom(i-2,j,k)-2.0_rt*Hvom(i-1,j,k)+Hvom(i ,j,k);
142 UFe(i,j,k) = 0.25_rt * (cff1+Gadv*cff)* (cff2+Gadv*0.5_rt*(Hvxx_i + Hvxx_im1));
145 ParallelFor(growLo(xbx,0,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
147 UFx(i,j,k) = 0.25_rt * (uold(i,j,k,nrhs) + uold(i+1,j,k,nrhs)) * (Huon(i,j,k)+Huon(i+1,j,k));
149 ParallelFor(growHi(xbx,1,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
151 UFe(i,j,k) = 0.25_rt * (uold(i,j-1,k,nrhs) + uold(i,j,k,nrhs)) * (Hvom(i-1,j,k)+Hvom(i,j,k));
158 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
160 ru(i,j,k,nrhs) -= ( (UFx(i,j,k)-UFx(i-1,j,k)) + (UFe(i,j+1,k)-UFe(i ,j,k)) );
164 ParallelFor(surroundingNodes(xbx,2), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
169 Real cff1=9.0_rt/16.0_rt;
170 Real cff2=1.0_rt/16.0_rt;
174 FC(i,j,k)=( cff1*(uold(i ,j,k-1,nrhs)+ uold(i,j,k ,nrhs))
175 -cff2*(uold(i ,j,k-2,nrhs)+ uold(i,j,k+1,nrhs)) )*
176 ( cff1*( W(i ,j,k)+ W(i-1,j,k))
177 -cff2*( W(i+1,j,k)+ W(i-2,j,k)) );
183 FC(i,j,N)=( cff1*(uold(i ,j,N-1,nrhs)+ uold(i,j,N ,nrhs))
184 -cff2*(uold(i ,j,N-2,nrhs)+ uold(i,j,N ,nrhs)) )*
185 ( cff1*( W(i ,j,N)+ W(i-1,j,N))
186 -cff2*( W(i+1,j,N)+ W(i-2,j,N)) );
188 FC(i,j,1)=( cff1*(uold(i ,j,0,nrhs)+ uold(i,j,1,nrhs))
189 -cff2*(uold(i ,j,0,nrhs)+ uold(i,j,2,nrhs)) )*
190 ( cff1*( W(i ,j,1)+ W(i-1,j,1))
191 -cff2*( W(i+1,j,1)+ W(i-2,j,1)) );
196 ParallelFor(surroundingNodes(xbx,2), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
199 FC(i,j,k) = 0.25_rt * (uold(i,j,k-1,nrhs)+uold(i,j,k,nrhs)) * (W(i,j,k) + W(i-1,j,k));
207 ParallelFor(xbx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
209 Real cff = FC(i,j,k+1)-FC(i,j,k);
211 ru(i,j,k,nrhs) -= cff;
216 AMREX_ASSERT(xbx.smallEnd(2) == 0 && xbx.bigEnd(2) == N);
217 ParallelFor(makeSlab(xbx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
219 for (
int k = 0; k <= N; ++k)
221 rufrc(i,j,0) += ru(i,j,k,nrhs);
223 Real om_u = 2.0_rt / (pm(i-1,j,0)+pm(i,j,0));
224 Real on_u = 2.0_rt / (pn(i-1,j,0)+pn(i,j,0));
225 Real cff = om_u * on_u;
227 Real cff1 = (k == N) ? sustr(i,j,0)*cff : 0.0_rt;
228 Real cff2 = (k == 0) ? -bustr(i,j,0)*cff : 0.0_rt;
230 rufrc(i,j,0) += cff1+cff2;
250 ParallelFor(growHi(ybx,0,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
252 Real cff1 = vold(i,j,k,nrhs) + vold(i-1,j ,k,nrhs);
253 Real cff2 = Huon(i,j,k) + Huon(i ,j-1,k);
255 Real vxx_im1 = vold(i-2,j,k,nrhs)-2.0_rt*vold(i-1,j,k,nrhs)+vold(i ,j,k,nrhs);
256 Real vxx_i = vold(i-1,j,k,nrhs)-2.0_rt*vold(i ,j,k,nrhs)+vold(i+1,j,k,nrhs);
258 if (i == dlo.x and !is_periodic_in_x) {
260 }
else if (i == dhi.x+1 and !is_periodic_in_x) {
265 Real cff = (cff2 > 0.0_rt) ? vxx_im1 : vxx_i;
268 Real Huee_j = Huon(i,j-1,k)-2.0_rt*Huon(i,j ,k)+Huon(i,j+1,k);
269 Real Huee_jm1 = Huon(i,j-2,k)-2.0_rt*Huon(i,j-1,k)+Huon(i,j ,k);
271 VFx(i,j,k) = 0.25_rt*(cff1+Gadv*cff)* (cff2+Gadv*0.5_rt*(Huee_j + Huee_jm1));
275 ParallelFor(growLo(ybx,1,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
277 Real cff1=vold(i,j,k,nrhs)+vold(i,j+1,k,nrhs);
280 Real vee_j = vold(i,j-1,k,nrhs)-2.0_rt*vold(i,j ,k,nrhs)+ vold(i,j+1,k,nrhs);
281 Real vee_jp1 = vold(i,j ,k,nrhs)-2.0_rt*vold(i,j+1,k,nrhs)+ vold(i,j+2,k,nrhs);
283 Real Hvee_j = Hvom(i,j-1,k)-2.0_rt*Hvom(i,j ,k)+Hvom(i,j+1,k);
284 Real Hvee_jp1 = Hvom(i,j ,k)-2.0_rt*Hvom(i,j+1,k)+Hvom(i,j+2,k);
286 if (j == dlo.y and !is_periodic_in_y) {
290 else if (j == dhi.y and !is_periodic_in_y) {
294 Real cff = (cff1 > 0.0_rt) ? vee_j : vee_jp1;
296 VFe(i,j,k) = 0.25_rt * (cff1+Gadv*cff) * ( Hvom(i,j ,k)+ Hvom(i,j+1,k) + 0.5_rt * Gadv * (Hvee_j + Hvee_jp1) );
299 ParallelFor(growHi(ybx,0,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
301 VFx(i,j,k) = 0.25_rt * (vold(i-1,j,k,nrhs) + vold(i,j,k,nrhs)) * (Huon(i,j-1,k)+Huon(i,j,k));
303 ParallelFor(growLo(ybx,1,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
305 VFe(i,j,k) = 0.25_rt * (vold(i,j,k,nrhs) + vold(i,j+1,k,nrhs)) * (Hvom(i,j,k)+Hvom(i,j+1,k));
309 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
311 rv(i,j,k,nrhs) -= ( (VFx(i+1,j,k)-VFx(i,j,k)) + (VFe(i,j,k)-VFe(i,j-1,k)) );
315 ParallelFor(surroundingNodes(ybx,2), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
317 Real cff1=9.0_rt/16.0_rt;
318 Real cff2=1.0_rt/16.0_rt;
322 FC(i,j,k)=( cff1*(vold(i,j,k-1,nrhs)+ vold(i,j,k ,nrhs))
323 -cff2*(vold(i,j,k-2,nrhs)+ vold(i,j,k+1,nrhs)) )*
324 ( cff1*(W(i,j ,k)+ W(i,j-1,k))
325 -cff2*(W(i,j+1,k)+ W(i,j-2,k)) );
330 FC(i,j,N)=( cff1*(vold(i,j,N-1,nrhs)+ vold(i,j,N ,nrhs))
331 -cff2*(vold(i,j,N-2,nrhs)+ vold(i,j,N ,nrhs)) )*
332 ( cff1*(W(i,j ,N)+ W(i,j-1,N))
333 -cff2*(W(i,j+1,N)+ W(i,j-2,N)) );
334 FC(i,j,1)=( cff1*(vold(i,j,0,nrhs)+ vold(i,j,1,nrhs))
335 -cff2*(vold(i,j,0,nrhs)+ vold(i,j,2,nrhs)) )*
336 ( cff1*(W(i,j ,1)+ W(i,j-1,1))
337 -cff2*(W(i,j+1,1)+ W(i,j-2,1)) );
343 ParallelFor(surroundingNodes(ybx,2), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
346 FC(i,j,k) = 0.25_rt * (vold(i,j,k-1,nrhs)+vold(i,j,k,nrhs)) * (W(i,j,k) + W(i,j-1,k));
355 ParallelFor(ybx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
357 Real cff = FC(i,j,k+1)-FC(i,j,k);
359 rv(i,j,k,nrhs) -= cff;
364 AMREX_ASSERT(ybx.smallEnd(2) == 0 && ybx.bigEnd(2) == N);
365 ParallelFor(makeSlab(ybx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
367 for (
int k = 0; k <= N; ++k)
369 rvfrc(i,j,0) += rv(i,j,k,nrhs);
371 Real om_v = 2.0_rt / (pm(i,j-1,0)+pm(i,j,0));
372 Real on_v = 2.0_rt / (pn(i,j-1,0)+pn(i,j,0));
373 Real cff = om_v * on_v;
375 Real cff1 = (k == N) ? svstr(i,j,0)*cff : 0.0_rt;
376 Real cff2 = (k == 0) ? -bvstr(i,j,0)*cff : 0.0_rt;
378 rvfrc(i,j,0) += cff1+cff2;