23 const int ioff,
const int joff,
24 const Array4<Real >& phi,
25 const Array4<Real >& phibar,
26 const Array4<Real >& Hphi,
27 const Array4<Real const>& Hz,
28 const Array4<Real const>& pm_or_pn,
29 const Array4<Real const>& Dphi_avg1,
30 const Array4<Real const>& Dphi_avg2,
31 const Array4<Real >& DC,
32 const Array4<Real >& FC,
33 const Array4<Real const>& msk,
36 const Box& domain = geom[0].Domain();
37 const auto dlo = amrex::lbound(domain);
38 const auto dhi = amrex::ubound(domain);
40 GeometryData
const& geomdata = geom[0].data();
41 bool is_periodic_in_x = geomdata.isPeriodic(0);
42 bool is_periodic_in_y = geomdata.isPeriodic(1);
45 Vector<BCRec> bcrs_x(ncomp);
46 Vector<BCRec> bcrs_y(ncomp);
50 auto N = Geom(0).Domain().size()[2]-1;
55 bx_g1z.grow(IntVect(0,0,1));
57 FArrayBox fab_CF(bxD,1,amrex::The_Async_Arena()); fab_CF.template setVal<RunOn::Device>(0.);
58 auto CF=fab_CF.array();
64 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
66 Real om_v_or_on_u = 2.0_rt / (pm_or_pn(i,j,0) + pm_or_pn(i-ioff,j-joff,0));
68 DC(i,j,k) = 0.5_rt * om_v_or_on_u * (Hz(i,j,k)+Hz(i-ioff,j-joff,k));
71 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
73 for (
int k=0; k<=N; k++) {
74 DC(i,j,-1) += DC(i,j,k);
75 CF(i,j,0) += DC(i,j,k) * phi(i,j,k,nnew);
78 DC(i,j,-1) = 1.0_rt / DC(i,j,-1);
79 CF(i,j,0) = DC(i,j,-1) * (CF(i,j,0) - Dphi_avg1(i,j,0));
81 for (
int k=0; k<=N; k++) {
82 if (i == dlo.x-joff && !is_periodic_in_x) {
83 phi(i,j,k,nnew) -= CF(i,j,0);
84 phi(i,j,k,nnew) *= msk(i,j,0);
85 }
else if (i == dhi.x+1 && !is_periodic_in_x) {
86 phi(i,j,k,nnew) -= CF(i,j,0);
87 phi(i,j,k,nnew) *= msk(i,j,0);
88 }
else if (j == dlo.y-ioff && !is_periodic_in_y) {
89 phi(i,j,k,nnew) -= CF(i,j,0);
90 phi(i,j,k,nnew) *= msk(i,j,0);
91 }
else if (j == dhi.y+1 && !is_periodic_in_y) {
92 phi(i,j,k,nnew) -= CF(i,j,0);
93 phi(i,j,k,nnew) *= msk(i,j,0);
97 for (
int k=0; k<=N; k++) {
98 Hphi(i,j,k) = 0.5_rt * (Hphi(i,j,k)+phi(i,j,k,nnew)*DC(i,j,k));
99 FC(i,j,0) += Hphi(i,j,k);
102 FC(i,j,0) = DC(i,j,-1)*(FC(i,j,0)-Dphi_avg2(i,j,0));
105 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
107 Hphi(i,j,k) -= DC(i,j,k)*FC(i,j,0);
110 ParallelFor(bxD, [=] AMREX_GPU_DEVICE(
int i,
int j,
int )
112 phibar(i,j,0,0) = DC(i,j,-1) * Dphi_avg1(i,j,0);
113 phibar(i,j,0,1) = phibar(i,j,0,0);