18 const Array4<Real const>& ubar,
19 const Array4<Real const>& vbar,
20 const Array4<Real >& rhs_ubar ,
21 const Array4<Real >& rhs_vbar,
22 const Array4<Real const>& DUon,
23 const Array4<Real const>& DVom,
26 const Box& domain = geom[0].Domain();
27 const auto dlo = amrex::lbound(domain);
28 const auto dhi = amrex::ubound(domain);
30 GeometryData
const& geomdata = geom[0].data();
31 bool is_periodic_in_x = geomdata.isPeriodic(0);
32 bool is_periodic_in_y = geomdata.isPeriodic(1);
35 Vector<BCRec> bcrs_x(ncomp);
36 Vector<BCRec> bcrs_y(ncomp);
43 FArrayBox fab_UFx(growLo(xbx,0,1),1,amrex::The_Async_Arena()); fab_UFx.template setVal<RunOn::Device>(0.);
44 FArrayBox fab_UFe(growHi(xbx,1,1),1,amrex::The_Async_Arena()); fab_UFe.template setVal<RunOn::Device>(0.);
45 FArrayBox fab_VFe(growLo(ybx,1,1),1,amrex::The_Async_Arena()); fab_VFe.template setVal<RunOn::Device>(0.);
46 FArrayBox fab_VFx(growHi(ybx,0,1),1,amrex::The_Async_Arena()); fab_VFx.template setVal<RunOn::Device>(0.);
48 auto UFx=fab_UFx.array();
49 auto UFe=fab_UFe.array();
50 auto VFx=fab_VFx.array();
51 auto VFe=fab_VFe.array();
74 ParallelFor(growLo(xbx,0,1),
75 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
77 Real uxx_i = ubar(i-1,j,0,krhs)-2.0_rt*ubar(i ,j,0,krhs)+ubar(i+1,j,0,krhs);
78 Real uxx_ip1 = ubar(i ,j,0,krhs)-2.0_rt*ubar(i+1,j,0,krhs)+ubar(i+2,j,0,krhs);
80 Real Huxx_i = DUon(i-1,j,0)-2.0_rt*DUon(i ,j,0)+DUon(i+1,j,0);
81 Real Huxx_ip1 = DUon(i ,j,0)-2.0_rt*DUon(i+1,j,0)+DUon(i+2,j,0);
83 if (i == dlo.x && !is_periodic_in_x) {
87 else if (i == dhi.x && !is_periodic_in_x) {
92 Real cff=1.0_rt/6.0_rt;
93 Real ubar_avg = ubar(i ,j,0,krhs)+ubar(i+1,j,0,krhs);
95 UFx(i,j,0)=0.25_rt*(ubar_avg-cff*(uxx_i+uxx_ip1)) * (DUon(i,j,0)+ DUon(i+1,j,0)-cff*(Huxx_i+ Huxx_ip1));
101 ParallelFor(growHi(xbx,1,1),
102 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
105 Real uee_j = ubar(i,j-1,0,krhs)-2.0_rt*ubar(i,j ,0,krhs)+ubar(i,j+1,0,krhs);
106 Real uee_jm1 = ubar(i,j-2,0,krhs)-2.0_rt*ubar(i,j-1,0,krhs)+ubar(i,j ,0,krhs);
108 Real Hvxx_i = DVom(i-1,j,0)-2.0_rt*DVom(i ,j,0)+DVom(i+1,j,0);
109 Real Hvxx_im1 = DVom(i-2,j,0)-2.0_rt*DVom(i-1,j,0)+DVom(i ,j,0);
111 if (j == dlo.y and !is_periodic_in_y) {
113 }
else if (j == dhi.y+1 and !is_periodic_in_y) {
117 Real cff=1.0_rt/6.0_rt;
118 Real cff1=ubar(i,j ,0,krhs)+ubar(i,j-1,0,krhs);
119 Real cff2=DVom(i,j,0)+DVom(i-1,j,0);
121 UFe(i,j,0)=0.25_rt*(cff1-(uee_j+uee_jm1)*cff)*
122 (cff2-cff*(Hvxx_i+Hvxx_im1));
125 ParallelFor(growLo(xbx,0,1),
126 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
128 UFx(i,j,0) = 0.25_rt * (DUon(i,j,0)+DUon(i+1,j,0)) * (ubar(i,j,0,krhs)+ubar(i+1,j,0,krhs));
131 ParallelFor(growHi(xbx,1,1),
132 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
134 UFe(i,j,0) = 0.25_rt * (DVom(i,j,0)+DVom(i-1,j,0)) * (ubar(i,j,0,krhs)+ubar(i,j-1,0,krhs));
141 ParallelFor(makeSlab(xbx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
143 Real cff1=UFx(i,j ,0)-UFx(i-1,j,0);
144 Real cff2=UFe(i,j+1,0)-UFe(i ,j,0);
146 rhs_ubar(i,j,0) -= (cff1 + cff2);
165 ParallelFor(growHi(ybx,0,1),
166 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
168 Real cff=1.0_rt/6.0_rt;
169 Real vxx_i = vbar(i-1,j,0,krhs)-2.0_rt*vbar(i ,j,0,krhs)+vbar(i+1,j,0,krhs);
170 Real vxx_im1 = vbar(i-2,j,0,krhs)-2.0_rt*vbar(i-1,j,0,krhs)+vbar(i ,j,0,krhs);
172 Real Huee_j = DUon(i,j-1,0)-2.0_rt*DUon(i,j ,0)+DUon(i,j+1,0);
173 Real Huee_jm1 = DUon(i,j-2,0)-2.0_rt*DUon(i,j-1,0)+DUon(i,j ,0);
175 if (i == dlo.x and !is_periodic_in_x) {
177 }
else if (i == dhi.x + 1 and !is_periodic_in_x) {
181 Real cff1=vbar(i ,j,0,krhs)+vbar(i-1,j,0,krhs);
182 Real cff2=DUon(i,j,0)+DUon(i,j-1,0);
184 VFx(i,j,0)=0.25_rt*(cff1-(vxx_i + vxx_im1)*cff)* (cff2-cff*(Huee_j+ Huee_jm1));
187 ParallelFor(growLo(ybx,1,1),
188 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
190 Real vee_j = vbar(i,j-1,0,krhs)-2.0_rt*vbar(i,j ,0,krhs)+vbar(i,j+1,0,krhs);
191 Real vee_jp1 = vbar(i,j ,0,krhs)-2.0_rt*vbar(i,j+1,0,krhs)+vbar(i,j+2,0,krhs);
193 Real Hvee_j = DVom(i,j-1,0)-2.0_rt*DVom(i,j ,0)+DVom(i,j+1,0);
194 Real Hvee_jp1 = DVom(i,j ,0)-2.0_rt*DVom(i,j+1,0)+DVom(i,j+2,0);
196 if (j == dlo.y and !is_periodic_in_y) {
200 else if (j == dhi.y and !is_periodic_in_y) {
205 Real cff=1.0_rt/6.0_rt;
206 Real cff1=vbar(i,j ,0,krhs)+vbar(i,j+1,0,krhs);
208 VFe(i,j,0) = 0.25_rt * (cff1-(vee_j + vee_jp1)*cff) * (DVom(i,j ,0)+ DVom(i,j+1,0) -
209 cff * (Hvee_j+ Hvee_jp1));
212 ParallelFor(growHi(ybx,0,1),
213 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
215 VFx(i,j,0) = 0.25_rt * (DUon(i,j,0) + DUon(i,j-1,0))*(vbar(i,j,0,krhs)+vbar(i-1,j,0,krhs));
217 ParallelFor(growLo(ybx,1,1),
218 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
220 VFe(i,j,0) = 0.25_rt * (DVom(i,j,0) + DVom(i,j+1,0))*(vbar(i,j,0,krhs)+vbar(i,j+1,0,krhs));
224 ParallelFor(makeSlab(ybx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
226 Real cff1=VFx(i+1,j,0)-VFx(i ,j,0);
227 Real cff2=VFe(i ,j,0)-VFe(i,j-1,0);
229 rhs_vbar(i,j,0) -= (cff1 + cff2);