56 const Array4<Real >& state,
57 const Array4<Real >& state_rhs,
58 const Array4<Real const>& diff2,
59 const Array4<Real const>& Hz,
60 const Array4<Real const>& pm,
61 const Array4<Real const>& pn,
62 const Array4<Real const>& msku,
63 const Array4<Real const>& mskv,
64 const Real dt_lev,
const int ncomp)
66 BL_PROFILE(
"REMORA::t3dmix2_s()");
71 Box xbx(bx); xbx.surroundingNodes(0);
72 Box ybx(bx); ybx.surroundingNodes(1);
74 FArrayBox fab_FX(xbx,ncomp,The_Async_Arena());
75 FArrayBox fab_FE(ybx,ncomp,The_Async_Arena());
77 auto FX=fab_FX.array();
78 auto FE=fab_FE.array();
80 ParallelFor(xbx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
82 const Real pmon_u = (pm(i-1,j,0)+pm(i,j,0))/(pn(i-1,j,0)+pn(i,j,0));
84 const Real cff = 0.25_rt * (diff2(i,j,0,n) + diff2(i-1,j,0,n)) * pmon_u;
85 FX(i,j,k,n) = cff * (Hz(i,j,k) + Hz(i-1,j,k)) * (state_rhs(i,j,k,n)-state_rhs(i-1,j,k,n));
86 FX(i,j,k,n) *= msku(i,j,0);
89 ParallelFor(ybx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
91 const Real pnom_v = (pn(i,j-1,0)+pn(i,j,0))/(pm(i,j-1,0)+pm(i,j,0));
93 const Real cff = 0.25_rt*(diff2(i,j,0,n)+diff2(i,j-1,0,n)) * pnom_v;
94 FE(i,j,k,n) = cff * (Hz(i,j,k) + Hz(i,j-1,k)) * (state_rhs(i,j,k,n) - state_rhs(i,j-1,k,n));
95 FE(i,j,k,n) *= mskv(i,j,0);
101 ParallelFor(bx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
103 const Real cff = dt_lev*pm(i,j,0)*pn(i,j,0);
105 state(i,j,k,n) += cff * ( (FX(i+1,j ,k,n)-FX(i,j,k,n))
106 +(FE(i ,j+1,k,n)-FE(i,j,k,n)) );
127 const Array4<Real >& state,
128 const Array4<Real >& state_rhs,
129 const Array4<Real const>& diff2,
130 const Array4<Real const>& Hz,
131 const Array4<Real const>& z_r,
132 const Array4<Real const>& pm,
133 const Array4<Real const>& pn,
134 const Array4<Real const>& msku,
135 const Array4<Real const>& mskv,
136 const Real dt_lev,
const int ncomp,
const int N)
138 BL_PROFILE(
"REMORA::t3dmix2_geo()");
143 Box xbx(bx); xbx.surroundingNodes(0);
144 Box ybx(bx); ybx.surroundingNodes(1);
145 Box zbx(bx); zbx.surroundingNodes(2);
147 FArrayBox fab_dZdx(xbx,ncomp,The_Async_Arena());
148 FArrayBox fab_dTdx(xbx,ncomp,The_Async_Arena());
149 FArrayBox fab_dZde(ybx,ncomp,The_Async_Arena());
150 FArrayBox fab_dTde(ybx,ncomp,The_Async_Arena());
151 FArrayBox fab_dTdz(grow(zbx,IntVect(1,1,0)),ncomp,The_Async_Arena());
152 FArrayBox fab_FS(grow(zbx,IntVect(1,1,0)),ncomp,The_Async_Arena());
153 FArrayBox fab_FX(xbx,ncomp,The_Async_Arena());
154 FArrayBox fab_FE(ybx,ncomp,The_Async_Arena());
156 auto dZdx = fab_dZdx.array();
157 auto dTdx = fab_dTdx.array();
158 auto dZde = fab_dZde.array();
159 auto dTde = fab_dTde.array();
160 auto dTdz = fab_dTdz.array();
161 auto FS = fab_FS.array();
162 auto FX = fab_FX.array();
163 auto FE = fab_FE.array();
165 ParallelFor(xbx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
167 Real cff = 0.5_rt * (pm(i,j,0) + pm(i-1,j,0)) * msku(i,j,0);
168 dZdx(i,j,k,n) = cff * (z_r(i,j,k) - z_r(i-1,j,k));
169 dTdx(i,j,k,n)=cff*(state_rhs(i ,j,k,n)-state_rhs(i-1,j,k,n));
171 ParallelFor(ybx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
173 Real cff = 0.5_rt * (pn(i,j,0) + pn(i,j-1,0)) * mskv(i,j,0);
174 dZde(i,j,k,n) = cff * (z_r(i,j,k) - z_r(i,j-1,k));
175 dTde(i,j,k,n)=cff*(state_rhs(i,j,k,n)-state_rhs(i,j-1,k,n));
177 ParallelFor(makeSlab(grow(bx,IntVect(1,1,0)),2,0), ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int ,
int n)
179 dTdz(i,j,0,n) = 0.0_rt;
180 dTdz(i,j,N+1,n) = 0.0_rt;
181 FS(i,j,0,n) = 0.0_rt;
182 FS(i,j,N+1,n) = 0.0_rt;
184 ParallelFor(grow(zbx,IntVect(1,1,-1)), ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
186 Real cff = 1.0_rt / (z_r(i,j,k)-z_r(i,j,k-1));
187 dTdz(i,j,k,n) = cff * (state_rhs(i,j,k,n) - state_rhs(i,j,k-1,n));
192 ParallelFor(xbx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
194 Real on_u = 2.0_rt / (pn(i,j,0) + pn(i-1,j,0));
195 Real cff = 0.25_rt * (diff2(i,j,0,n)+diff2(i-1,j,0,n)) * on_u;
197 (Hz(i,j,k)+Hz(i-1,j,k))*
199 0.5_rt*(std::min(dZdx(i,j,k,n),0.0_rt)*
202 std::max(dZdx(i,j,k,n),0.0_rt)*
206 ParallelFor(ybx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
208 Real om_v = 2.0_rt / (pm(i,j,0) + pm(i,j-1,0));
209 Real cff = 0.25_rt * (diff2(i,j,0,n)+diff2(i,j-1,0,n)) * om_v;
211 (Hz(i,j,k)+Hz(i,j-1,k))*
213 0.5_rt*(std::min(dZde(i,j,k,n),0.0_rt)*
216 std::max(dZde(i,j,k,n),0.0_rt)*
220 ParallelFor(grow(zbx,IntVect(0,0,-1)), ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
222 Real cff = 0.5_rt * diff2(i,j,0,n);
223 Real cff1=std::min(dZdx(i ,j,k-1,n),0.0_rt);
224 Real cff2=std::min(dZdx(i+1,j,k ,n),0.0_rt);
225 Real cff3=std::max(dZdx(i ,j,k ,n),0.0_rt);
226 Real cff4=std::max(dZdx(i+1,j,k-1,n),0.0_rt);
228 (cff1*(cff1*dTdz(i,j,k,n)-dTdx(i ,j,k-1,n))+
229 cff2*(cff2*dTdz(i,j,k,n)-dTdx(i+1,j,k ,n))+
230 cff3*(cff3*dTdz(i,j,k,n)-dTdx(i ,j,k ,n))+
231 cff4*(cff4*dTdz(i,j,k,n)-dTdx(i+1,j,k-1,n)));
232 cff1=std::min(dZde(i,j ,k-1,n),0.0_rt);
233 cff2=std::min(dZde(i,j+1,k ,n),0.0_rt);
234 cff3=std::max(dZde(i,j ,k ,n),0.0_rt);
235 cff4=std::max(dZde(i,j+1,k-1,n),0.0_rt);
236 FS(i,j,k,n)=FS(i,j,k,n)+
238 (cff1*(cff1*dTdz(i,j,k,n)-dTde(i,j ,k-1,n))+
239 cff2*(cff2*dTdz(i,j,k,n)-dTde(i,j+1,k ,n))+
240 cff3*(cff3*dTdz(i,j,k,n)-dTde(i,j ,k ,n))+
241 cff4*(cff4*dTdz(i,j,k,n)-dTde(i,j+1,k-1,n)));
246 ParallelFor(bx, ncomp, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k,
int n)
248 Real cff=dt_lev*pm(i,j,0)*pn(i,j,0);
249 Real cff1=cff*(FX(i+1,j ,k,n)-FX(i,j,k,n));
250 Real cff2=cff*(FE(i ,j+1,k,n)-FE(i,j,k,n));
251 Real cff3=dt_lev*(FS(i,j,k+1,n)-FS(i,j,k,n));
252 Real cff4=cff1+cff2+cff3;
253 state(i,j,k,n)=state(i,j,k,n)+cff4;