24 const int ioff,
const int joff,
25 const Array4<Real >& phi,
26 const Array4<Real >& phibar,
27 const Array4<Real >& Hphi,
28 const Array4<Real const>& Hz,
29 const Array4<Real const>& pm_or_pn,
30 const Array4<Real const>& Dphi_avg1,
31 const Array4<Real const>& Dphi_avg2,
32 const Array4<Real >& DC,
33 const Array4<Real >& FC,
34 const Array4<Real const>& msk,
37 BL_PROFILE(
"REMORA::update_massflux_3d()");
38 const Box& domain = geom[lev].Domain();
39 const auto dlo = amrex::lbound(domain);
40 const auto dhi = amrex::ubound(domain);
42 GeometryData
const& geomdata = geom[0].data();
43 bool is_periodic_in_x = geomdata.isPeriodic(0);
44 bool is_periodic_in_y = geomdata.isPeriodic(1);
47 Vector<BCRec> bcrs_x(ncomp);
48 Vector<BCRec> bcrs_y(ncomp);
52 auto N = Geom(0).Domain().size()[2]-1;
57 bx_g1z.grow(IntVect(0,0,1));
59 FArrayBox fab_CF(bxD,1,amrex::The_Async_Arena()); fab_CF.template setVal<RunOn::Device>(0.);
60 auto CF=fab_CF.array();
66 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
68 Real om_v_or_on_u = 2.0_rt / (pm_or_pn(i,j,0) + pm_or_pn(i-ioff,j-joff,0));
70 DC(i,j,k) = 0.5_rt * om_v_or_on_u * (Hz(i,j,k)+Hz(i-ioff,j-joff,k));
73 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
75 for (
int k=0; k<=N; k++) {
76 DC(i,j,-1) += DC(i,j,k);
77 CF(i,j,0) += DC(i,j,k) * phi(i,j,k,nnew);
80 DC(i,j,-1) = 1.0_rt / DC(i,j,-1);
81 CF(i,j,0) = DC(i,j,-1) * (CF(i,j,0) - Dphi_avg1(i,j,0));
83 for (
int k=0; k<=N; k++) {
84 if (i == dlo.x-joff && !is_periodic_in_x) {
85 phi(i,j,k,nnew) -= CF(i,j,0);
86 phi(i,j,k,nnew) *= msk(i,j,0);
87 }
else if (i == dhi.x+1 && !is_periodic_in_x) {
88 phi(i,j,k,nnew) -= CF(i,j,0);
89 phi(i,j,k,nnew) *= msk(i,j,0);
90 }
else if (j == dlo.y-ioff && !is_periodic_in_y) {
91 phi(i,j,k,nnew) -= CF(i,j,0);
92 phi(i,j,k,nnew) *= msk(i,j,0);
93 }
else if (j == dhi.y+1 && !is_periodic_in_y) {
94 phi(i,j,k,nnew) -= CF(i,j,0);
95 phi(i,j,k,nnew) *= msk(i,j,0);
99 for (
int k=0; k<=N; k++) {
100 Hphi(i,j,k) = 0.5_rt * (Hphi(i,j,k)+phi(i,j,k,nnew)*DC(i,j,k));
101 FC(i,j,0) += Hphi(i,j,k);
104 FC(i,j,0) = DC(i,j,-1)*(FC(i,j,0)-Dphi_avg2(i,j,0));
107 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
109 Hphi(i,j,k) -= DC(i,j,k)*FC(i,j,0);
112 ParallelFor(bxD, [=] AMREX_GPU_DEVICE(
int i,
int j,
int )
114 phibar(i,j,0,0) = DC(i,j,-1) * Dphi_avg1(i,j,0);
115 phibar(i,j,0,1) = phibar(i,j,0,0);