19 const Array4<Real const>& ubar,
20 const Array4<Real const>& vbar,
21 const Array4<Real >& rhs_ubar ,
22 const Array4<Real >& rhs_vbar,
23 const Array4<Real const>& DUon,
24 const Array4<Real const>& DVom,
27 BL_PROFILE(
"REMORA::rhs_uv_2d()");
28 const Box& domain = geom[lev].Domain();
29 const auto dlo = amrex::lbound(domain);
30 const auto dhi = amrex::ubound(domain);
32 GeometryData
const& geomdata = geom[0].data();
33 bool is_periodic_in_x = geomdata.isPeriodic(0);
34 bool is_periodic_in_y = geomdata.isPeriodic(1);
37 Vector<BCRec> bcrs_x(ncompbc);
38 Vector<BCRec> bcrs_y(ncompbc);
46 Box bx = enclosedCells(xbx);
48 int UFx_comp = ncomp++;
49 int UFe_comp = ncomp++;
50 int VFe_comp = ncomp++;
51 int VFx_comp = ncomp++;
52 FArrayBox fab(grow(bx,IntVect(2,2,0)),ncomp,amrex::The_Async_Arena());
54 auto UFx=fab.array(UFx_comp);
55 auto UFe=fab.array(UFe_comp);
56 auto VFx=fab.array(VFx_comp);
57 auto VFe=fab.array(VFe_comp);
80 ParallelFor(growLo(xbx,0,1),
81 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
83 Real uxx_i = ubar(i-1,j,0,krhs)-2.0_rt*ubar(i ,j,0,krhs)+ubar(i+1,j,0,krhs);
84 Real uxx_ip1 = ubar(i ,j,0,krhs)-2.0_rt*ubar(i+1,j,0,krhs)+ubar(i+2,j,0,krhs);
86 Real Huxx_i = DUon(i-1,j,0)-2.0_rt*DUon(i ,j,0)+DUon(i+1,j,0);
87 Real Huxx_ip1 = DUon(i ,j,0)-2.0_rt*DUon(i+1,j,0)+DUon(i+2,j,0);
89 if (i == dlo.x && !is_periodic_in_x) {
93 else if (i == dhi.x && !is_periodic_in_x) {
98 Real cff=1.0_rt/6.0_rt;
99 Real ubar_avg = ubar(i ,j,0,krhs)+ubar(i+1,j,0,krhs);
101 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));
107 ParallelFor(growHi(xbx,1,1),
108 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
111 Real uee_j = ubar(i,j-1,0,krhs)-2.0_rt*ubar(i,j ,0,krhs)+ubar(i,j+1,0,krhs);
112 Real uee_jm1 = ubar(i,j-2,0,krhs)-2.0_rt*ubar(i,j-1,0,krhs)+ubar(i,j ,0,krhs);
114 Real Hvxx_i = DVom(i-1,j,0)-2.0_rt*DVom(i ,j,0)+DVom(i+1,j,0);
115 Real Hvxx_im1 = DVom(i-2,j,0)-2.0_rt*DVom(i-1,j,0)+DVom(i ,j,0);
117 if (j == dlo.y and !is_periodic_in_y) {
119 }
else if (j == dhi.y+1 and !is_periodic_in_y) {
123 Real cff=1.0_rt/6.0_rt;
124 Real cff1=ubar(i,j ,0,krhs)+ubar(i,j-1,0,krhs);
125 Real cff2=DVom(i,j,0)+DVom(i-1,j,0);
127 UFe(i,j,0)=0.25_rt*(cff1-(uee_j+uee_jm1)*cff)*
128 (cff2-cff*(Hvxx_i+Hvxx_im1));
131 ParallelFor(growLo(xbx,0,1),
132 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
134 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));
137 ParallelFor(growHi(xbx,1,1),
138 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
140 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));
147 ParallelFor(makeSlab(xbx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
149 Real cff1=UFx(i,j ,0)-UFx(i-1,j,0);
150 Real cff2=UFe(i,j+1,0)-UFe(i ,j,0);
152 rhs_ubar(i,j,0) -= (cff1 + cff2);
171 ParallelFor(growHi(ybx,0,1),
172 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
174 Real cff=1.0_rt/6.0_rt;
175 Real vxx_i = vbar(i-1,j,0,krhs)-2.0_rt*vbar(i ,j,0,krhs)+vbar(i+1,j,0,krhs);
176 Real vxx_im1 = vbar(i-2,j,0,krhs)-2.0_rt*vbar(i-1,j,0,krhs)+vbar(i ,j,0,krhs);
178 Real Huee_j = DUon(i,j-1,0)-2.0_rt*DUon(i,j ,0)+DUon(i,j+1,0);
179 Real Huee_jm1 = DUon(i,j-2,0)-2.0_rt*DUon(i,j-1,0)+DUon(i,j ,0);
181 if (i == dlo.x and !is_periodic_in_x) {
183 }
else if (i == dhi.x + 1 and !is_periodic_in_x) {
187 Real cff1=vbar(i ,j,0,krhs)+vbar(i-1,j,0,krhs);
188 Real cff2=DUon(i,j,0)+DUon(i,j-1,0);
190 VFx(i,j,0)=0.25_rt*(cff1-(vxx_i + vxx_im1)*cff)* (cff2-cff*(Huee_j+ Huee_jm1));
193 ParallelFor(growLo(ybx,1,1),
194 [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
196 Real vee_j = vbar(i,j-1,0,krhs)-2.0_rt*vbar(i,j ,0,krhs)+vbar(i,j+1,0,krhs);
197 Real vee_jp1 = vbar(i,j ,0,krhs)-2.0_rt*vbar(i,j+1,0,krhs)+vbar(i,j+2,0,krhs);
199 Real Hvee_j = DVom(i,j-1,0)-2.0_rt*DVom(i,j ,0)+DVom(i,j+1,0);
200 Real Hvee_jp1 = DVom(i,j ,0)-2.0_rt*DVom(i,j+1,0)+DVom(i,j+2,0);
202 if (j == dlo.y and !is_periodic_in_y) {
206 else if (j == dhi.y and !is_periodic_in_y) {
211 Real cff=1.0_rt/6.0_rt;
212 Real cff1=vbar(i,j ,0,krhs)+vbar(i,j+1,0,krhs);
214 VFe(i,j,0) = 0.25_rt * (cff1-(vee_j + vee_jp1)*cff) * (DVom(i,j ,0)+ DVom(i,j+1,0) -
215 cff * (Hvee_j+ Hvee_jp1));
218 ParallelFor(growHi(ybx,0,1),
219 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
221 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));
223 ParallelFor(growLo(ybx,1,1),
224 [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
226 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));
230 ParallelFor(makeSlab(ybx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int)
232 Real cff1=VFx(i+1,j,0)-VFx(i ,j,0);
233 Real cff2=VFe(i ,j,0)-VFe(i,j-1,0);
235 rhs_vbar(i,j,0) -= (cff1 + cff2);