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 - Real(1000.0)) * 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) = Real(0.5)*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)+Real(0.5)*cff1);
121 Real cff11 =
one/(z_w(i,j,N+1)+h(i,j,0,0));
123 rhoA(i,j,0) *= cff2*cff11;
125 rhoS(i,j,0) *=
two*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(Real(-2.5), state(i,j,k,
Temp_comp));
196 Tt = std::min(Real(40.0), Tt);
197 Real Ts = std::max(Real(0.0), state(i,j,k,
Salt_comp));
198 Ts = std::min(Real(100.0), Ts);
199 Real sqrtTs = std::sqrt(Ts);
201 Real Tp = z_r(i,j,k);
202 Real Tpr10 = Real(0.1)*Tp;
217 Dden1DS(i,j,k)=C1+Real(1.5)*C2*sqrtTs+
two*
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 =
one / (bulk(i,j,k) + Tpr10);
240 den(i,j,k) = (den1(i,j,k)*bulk(i,j,k)*cff - Real(1000.0)) * mskr(i,j,0);
242 rho(i,j,k) = den(i,j,k);
253 DbulkDS(i,j,k)=C4+sqrtTs*Real(1.5)*C5-
254 Tp*(C7+sqrtTs*Real(1.5)*
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) = Real(0.5)*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)+Real(0.5)*cff1);
280 Real cff11 =
one/(z_w(i,j,N+1)+h(i,j,0,0));
281 rhoA(i,j,0) *= cff_rho*cff11;
282 rhoS(i,j,0) *=
two*cff11*cff11*cff_rho;
286 Box bxD = bx; bxD.makeSlab(2,0);
288 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
290 bvf(i,j,0) = Real(0.0);
291 bvf(i,j,N+1) = Real(0.0);
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 =
one / (bulk_up + Real(0.1) * z_w(i,j,k+1));
296 Real cff2 =
one / (bulk_dn + Real(0.1) * 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) / (Real(0.5) * (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 = Real(0.1)*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) + Real(1000.0)) * 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;