62 const Array4<Real const>& state,
63 const Array4<Real >& rho,
64 const Array4<Real >& rhoA,
65 const Array4<Real >& rhoS,
66 const Array4<Real >& bvf,
67 const Array4<Real const>& Hz,
68 const Array4<Real const>& z_w,
69 const Array4<Real const>& z_r,
70 const Array4<Real const>& h,
71 const Array4<Real const>& mskr,
75 AMREX_ASSERT(bx.smallEnd(2) == 0 && bx.bigEnd(2) == N);
93 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
95 rho(i,j,k) = (R0 - R0*Tcoef*(state(i,j,k,
Temp_comp)-T0)
97 - 1000.0_rt) * mskr(i,j,0);
108 ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
110 Real cff0 = rho(i,j,N)*Hz(i,j,N);
111 rhoS(i,j,0) = 0.5_rt*cff0*Hz(i,j,N);
114 for (
int k = 1; k <= N; ++k) {
115 Real cff1=rho(i,j,N-k)*Hz(i,j,N-k);
116 rhoS(i,j,0) += Hz(i,j,N-k)*(rhoA(i,j,0)+0.5_rt*cff1);
120 Real cff11 =1.0_rt/(z_w(i,j,N+1)+h(i,j,0,0));
122 rhoA(i,j,0) *= cff2*cff11;
124 rhoS(i,j,0) *= 2.0_rt*cff11*cff11*cff2;
131 box_w.surroundingNodes(2);
132 box_w.grow(IntVect(0,0,-1));
134 ParallelFor(box_w, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
136 bvf(i,j,k) = -gorho0 * (rho(i,j,k)-rho(i,j,k-1)) / (z_r(i,j,k)-z_r(i,j,k-1));
158 const Array4<Real const>& state,
159 const Array4<Real >& rho,
160 const Array4<Real >& rhoA,
161 const Array4<Real >& rhoS,
162 const Array4<Real >& bvf,
163 const Array4<Real >& alpha,
164 const Array4<Real >& beta,
165 const Array4<Real const>& Hz,
166 const Array4<Real const>& z_w,
167 const Array4<Real const>& z_r,
168 const Array4<Real const>& h,
169 const Array4<Real const>& mskr,
173 AMREX_ASSERT(bx.smallEnd(2) == 0 && bx.bigEnd(2) == N);
175 FArrayBox fab_den1 (bx,1,amrex::The_Async_Arena());
auto den1 = fab_den1.array();
176 FArrayBox fab_den (bx,1,amrex::The_Async_Arena());
auto den = fab_den.array();
177 FArrayBox fab_bulk (bx,1,amrex::The_Async_Arena());
auto bulk = fab_bulk.array();
178 FArrayBox fab_bulk0(bx,1,amrex::The_Async_Arena());
auto bulk0 = fab_bulk0.array();
179 FArrayBox fab_bulk1(bx,1,amrex::The_Async_Arena());
auto bulk1 = fab_bulk1.array();
180 FArrayBox fab_bulk2(bx,1,amrex::The_Async_Arena());
auto bulk2 = fab_bulk2.array();
181 FArrayBox fab_DbulkDT(bx,1,amrex::The_Async_Arena());
auto DbulkDT = fab_DbulkDT.array();
182 FArrayBox fab_Dden1DT(bx,1,amrex::The_Async_Arena());
auto Dden1DT = fab_Dden1DT.array();
183 FArrayBox fab_DbulkDS(bx,1,amrex::The_Async_Arena());
auto DbulkDS = fab_DbulkDS.array();
184 FArrayBox fab_Dden1DS(bx,1,amrex::The_Async_Arena());
auto Dden1DS = fab_Dden1DS.array();
191 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
193 Real Tt = std::max(-2.5_rt, state(i,j,k,
Temp_comp));
194 Tt = std::min(40.0_rt, Tt);
195 Real Ts = std::max(0.0_rt, state(i,j,k,
Salt_comp));
196 Ts = std::min(100.0_rt, Ts);
197 Real sqrtTs = std::sqrt(Ts);
199 Real Tp = z_r(i,j,k);
200 Real Tpr10 = 0.1_rt*Tp;
207 Real dCdT0=
Q01+Tt*(2.0_rt*
Q02+Tt*(3.0_rt*
Q03+Tt*(4.0_rt*
Q04+
209 Real dCdT1=
U01+Tt*(2.0_rt*
U02+Tt*(3.0_rt*
U03+Tt*4.0_rt*
U04));
210 Real dCdT2=
V01+Tt*2.0_rt*
V02;
215 Dden1DS(i,j,k)=C1+1.5_rt*C2*sqrtTs+2.0_rt*
W00*Ts;
216 Dden1DT(i,j,k)=dCdT0+Ts*(dCdT1+sqrtTs*dCdT2);
219 den1(i,j,k) = C0 + Ts*(C1+sqrtTs*C2+Ts*
W00);
232 bulk0(i,j,k)=C3+Ts*(C4+sqrtTs*C5);
233 bulk1(i,j,k)=C6+Ts*(C7+sqrtTs*
G00);
234 bulk2(i,j,k)=C8+Ts*C9;
235 bulk (i,j,k)=bulk0(i,j,k)-Tp*(bulk1(i,j,k)-Tp*bulk2(i,j,k));
237 Real cff = 1.0_rt / (bulk(i,j,k) + Tpr10);
238 den(i,j,k) = (den1(i,j,k)*bulk(i,j,k)*cff - 1000.0_rt) * mskr(i,j,0);
240 rho(i,j,k) = den(i,j,k);
243 Real dCdT3=
A01+Tt*(2.0_rt*
A02+Tt*(3.0_rt*
A03+Tt*4.0_rt*
A04));
244 Real dCdT4=
B01+Tt*(2.0_rt*
B02+Tt*3.0_rt*
B03);
245 Real dCdT5=
D01+Tt*2.0_rt*
D02;
246 Real dCdT6=
E01+Tt*(2.0_rt*
E02+Tt*3.0_rt*
E03);
247 Real dCdT7=
F01+Tt*2.0_rt*
F02;
248 Real dCdT8=
G02+Tt*2.0_rt*
G03;
249 Real dCdT9=
H01+Tt*2.0_rt*
H02;
251 DbulkDS(i,j,k)=C4+sqrtTs*1.5_rt*C5-
252 Tp*(C7+sqrtTs*1.5_rt*
G00-Tp*C9);
253 DbulkDT(i,j,k)=dCdT3+Ts*(dCdT4+sqrtTs*dCdT5)-
255 Tp*(dCdT8+Ts*dCdT9));
267 ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
269 Real cff0 = den(i,j,N)*Hz(i,j,N);
270 rhoS(i,j,0) = 0.5_rt*cff0*Hz(i,j,N);
273 for (
int k = 1; k <= N; ++k) {
274 Real cff1=den(i,j,N-k)*Hz(i,j,N-k);
275 rhoS(i,j,0) += Hz(i,j,N-k)*(rhoA(i,j,0)+0.5_rt*cff1);
278 Real cff11 =1.0_rt/(z_w(i,j,N+1)+h(i,j,0,0));
279 rhoA(i,j,0) *= cff_rho*cff11;
280 rhoS(i,j,0) *= 2.0_rt*cff11*cff11*cff_rho;
284 Box bxD = bx; bxD.makeSlab(2,0);
286 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
289 bvf(i,j,N+1) = 0.0_rt;
290 for (
int k=0; k<=N-1; k++) {
291 Real bulk_up = bulk0(i,j,k+1) - (z_w(i,j,k+1) * (bulk1(i,j,k+1) - bulk2(i,j,k+1)*z_w(i,j,k+1)));
292 Real bulk_dn = bulk0(i,j,k ) - (z_w(i,j,k+1) * (bulk1(i,j,k ) - bulk2(i,j,k )*z_w(i,j,k+1)));
293 Real cff1 = 1.0_rt / (bulk_up + 0.1_rt * z_w(i,j,k+1));
294 Real cff2 = 1.0_rt / (bulk_dn + 0.1_rt * z_w(i,j,k+1));
295 Real den_up = cff1 * (den1(i,j,k+1) * bulk_up);
296 Real den_dn = cff2 * (den1(i,j,k ) * bulk_dn);
297 bvf(i,j,k+1) = -
g * (den_up - den_dn) / (0.5_rt * (den_up+den_dn) * (z_r(i,j,k+1) - z_r(i,j,k)));
302 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
304 Real Tp = z_r(i,j,N);
305 Real Tpr10 = 0.1_rt*Tp;
308 Real cff = bulk(i,j,N) + Tpr10;
309 Real cff1 = Tpr10 * den1(i,j,N);
310 Real cff2 = bulk(i,j,N) * cff;
311 Real wrk = (den(i,j,N) + 1000.0_rt) * cff * cff;
312 Real Tcof = -(DbulkDT(i,j,N) * cff1 + Dden1DT(i,j,N) * cff2);
313 Real Scof = (DbulkDS(i,j,N) * cff1 + Dden1DS(i,j,N) * cff2);
314 alpha(i,j,0) = Tcof / wrk;
315 beta(i,j,0) = Scof / wrk;