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,
74 BL_PROFILE(
"REMORA::lin_eos()");
76 AMREX_ASSERT(bx.smallEnd(2) == 0 && bx.bigEnd(2) == N);
94 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
96 rho(i,j,k) = (R0 - R0*Tcoef*(state(i,j,k,
Temp_comp)-T0)
98 - 1000.0_rt) * mskr(i,j,0);
109 ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
111 Real cff0 = rho(i,j,N)*Hz(i,j,N);
112 rhoS(i,j,0) = 0.5_rt*cff0*Hz(i,j,N);
115 for (
int k = 1; k <= N; ++k) {
116 Real cff1=rho(i,j,N-k)*Hz(i,j,N-k);
117 rhoS(i,j,0) += Hz(i,j,N-k)*(rhoA(i,j,0)+0.5_rt*cff1);
121 Real cff11 =1.0_rt/(z_w(i,j,N+1)+h(i,j,0,0));
123 rhoA(i,j,0) *= cff2*cff11;
125 rhoS(i,j,0) *= 2.0_rt*cff11*cff11*cff2;
132 box_w.surroundingNodes(2);
133 box_w.grow(IntVect(0,0,-1));
135 ParallelFor(box_w, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
137 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));
159 const Array4<Real const>& state,
160 const Array4<Real >& rho,
161 const Array4<Real >& rhoA,
162 const Array4<Real >& rhoS,
163 const Array4<Real >& bvf,
164 const Array4<Real >& alpha,
165 const Array4<Real >& beta,
166 const Array4<Real const>& Hz,
167 const Array4<Real const>& z_w,
168 const Array4<Real const>& z_r,
169 const Array4<Real const>& h,
170 const Array4<Real const>& mskr,
173 BL_PROFILE(
"REMORA::nonlin_eos()");
175 AMREX_ASSERT(bx.smallEnd(2) == 0 && bx.bigEnd(2) == N);
177 FArrayBox fab_den1 (bx,1,amrex::The_Async_Arena());
auto den1 = fab_den1.array();
178 FArrayBox fab_den (bx,1,amrex::The_Async_Arena());
auto den = fab_den.array();
179 FArrayBox fab_bulk (bx,1,amrex::The_Async_Arena());
auto bulk = fab_bulk.array();
180 FArrayBox fab_bulk0(bx,1,amrex::The_Async_Arena());
auto bulk0 = fab_bulk0.array();
181 FArrayBox fab_bulk1(bx,1,amrex::The_Async_Arena());
auto bulk1 = fab_bulk1.array();
182 FArrayBox fab_bulk2(bx,1,amrex::The_Async_Arena());
auto bulk2 = fab_bulk2.array();
183 FArrayBox fab_DbulkDT(bx,1,amrex::The_Async_Arena());
auto DbulkDT = fab_DbulkDT.array();
184 FArrayBox fab_Dden1DT(bx,1,amrex::The_Async_Arena());
auto Dden1DT = fab_Dden1DT.array();
185 FArrayBox fab_DbulkDS(bx,1,amrex::The_Async_Arena());
auto DbulkDS = fab_DbulkDS.array();
186 FArrayBox fab_Dden1DS(bx,1,amrex::The_Async_Arena());
auto Dden1DS = fab_Dden1DS.array();
193 ParallelFor(bx, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
195 Real Tt = std::max(-2.5_rt, state(i,j,k,
Temp_comp));
196 Tt = std::min(40.0_rt, Tt);
197 Real Ts = std::max(0.0_rt, state(i,j,k,
Salt_comp));
198 Ts = std::min(100.0_rt, Ts);
199 Real sqrtTs = std::sqrt(Ts);
201 Real Tp = z_r(i,j,k);
202 Real Tpr10 = 0.1_rt*Tp;
209 Real dCdT0=
Q01+Tt*(2.0_rt*
Q02+Tt*(3.0_rt*
Q03+Tt*(4.0_rt*
Q04+
211 Real dCdT1=
U01+Tt*(2.0_rt*
U02+Tt*(3.0_rt*
U03+Tt*4.0_rt*
U04));
212 Real dCdT2=
V01+Tt*2.0_rt*
V02;
217 Dden1DS(i,j,k)=C1+1.5_rt*C2*sqrtTs+2.0_rt*
W00*Ts;
218 Dden1DT(i,j,k)=dCdT0+Ts*(dCdT1+sqrtTs*dCdT2);
221 den1(i,j,k) = C0 + Ts*(C1+sqrtTs*C2+Ts*
W00);
234 bulk0(i,j,k)=C3+Ts*(C4+sqrtTs*C5);
235 bulk1(i,j,k)=C6+Ts*(C7+sqrtTs*
G00);
236 bulk2(i,j,k)=C8+Ts*C9;
237 bulk (i,j,k)=bulk0(i,j,k)-Tp*(bulk1(i,j,k)-Tp*bulk2(i,j,k));
239 Real cff = 1.0_rt / (bulk(i,j,k) + Tpr10);
240 den(i,j,k) = (den1(i,j,k)*bulk(i,j,k)*cff - 1000.0_rt) * mskr(i,j,0);
242 rho(i,j,k) = den(i,j,k);
245 Real dCdT3=
A01+Tt*(2.0_rt*
A02+Tt*(3.0_rt*
A03+Tt*4.0_rt*
A04));
246 Real dCdT4=
B01+Tt*(2.0_rt*
B02+Tt*3.0_rt*
B03);
247 Real dCdT5=
D01+Tt*2.0_rt*
D02;
248 Real dCdT6=
E01+Tt*(2.0_rt*
E02+Tt*3.0_rt*
E03);
249 Real dCdT7=
F01+Tt*2.0_rt*
F02;
250 Real dCdT8=
G02+Tt*2.0_rt*
G03;
251 Real dCdT9=
H01+Tt*2.0_rt*
H02;
253 DbulkDS(i,j,k)=C4+sqrtTs*1.5_rt*C5-
254 Tp*(C7+sqrtTs*1.5_rt*
G00-Tp*C9);
255 DbulkDT(i,j,k)=dCdT3+Ts*(dCdT4+sqrtTs*dCdT5)-
257 Tp*(dCdT8+Ts*dCdT9));
269 ParallelFor(makeSlab(bx,2,0), [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
271 Real cff0 = den(i,j,N)*Hz(i,j,N);
272 rhoS(i,j,0) = 0.5_rt*cff0*Hz(i,j,N);
275 for (
int k = 1; k <= N; ++k) {
276 Real cff1=den(i,j,N-k)*Hz(i,j,N-k);
277 rhoS(i,j,0) += Hz(i,j,N-k)*(rhoA(i,j,0)+0.5_rt*cff1);
280 Real cff11 =1.0_rt/(z_w(i,j,N+1)+h(i,j,0,0));
281 rhoA(i,j,0) *= cff_rho*cff11;
282 rhoS(i,j,0) *= 2.0_rt*cff11*cff11*cff_rho;
286 Box bxD = bx; bxD.makeSlab(2,0);
288 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
291 bvf(i,j,N+1) = 0.0_rt;
292 for (
int k=0; k<=N-1; k++) {
293 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)));
294 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)));
295 Real cff1 = 1.0_rt / (bulk_up + 0.1_rt * z_w(i,j,k+1));
296 Real cff2 = 1.0_rt / (bulk_dn + 0.1_rt * z_w(i,j,k+1));
297 Real den_up = cff1 * (den1(i,j,k+1) * bulk_up);
298 Real den_dn = cff2 * (den1(i,j,k ) * bulk_dn);
299 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)));
304 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
306 Real Tp = z_r(i,j,N);
307 Real Tpr10 = 0.1_rt*Tp;
310 Real cff = bulk(i,j,N) + Tpr10;
311 Real cff1 = Tpr10 * den1(i,j,N);
312 Real cff2 = bulk(i,j,N) * cff;
313 Real wrk = (den(i,j,N) + 1000.0_rt) * cff * cff;
314 Real Tcof = -(DbulkDT(i,j,N) * cff1 + Dden1DT(i,j,N) * cff2);
315 Real Scof = (DbulkDS(i,j,N) * cff1 + Dden1DS(i,j,N) * cff2);
316 alpha(i,j,0) = Tcof / wrk;
317 beta(i,j,0) = Scof / wrk;