21 MultiFab& mf_W, MultiFab* mf_msku, MultiFab* mf_mskv,
22 const int nstp,
const int nnew,
23 const int iic,
const int ntfirst,
const int N,
const Real dt_lev)
26 for ( MFIter mfi(*mf_gls, TilingIfNotGPU()); mfi.isValid(); ++mfi) {
27 Array4<Real>
const& gls = mf_gls->array(mfi);
28 Array4<Real>
const& tke = mf_tke->array(mfi);
29 Array4<Real const>
const& W = mf_W.const_array(mfi);
31 Array4<Real const>
const& Huon =
vec_Huon[lev]->const_array(mfi);
32 Array4<Real const>
const& Hvom =
vec_Hvom[lev]->const_array(mfi);
33 Array4<Real const>
const& Hz =
vec_Hz[lev]->const_array(mfi);
34 Array4<Real const>
const& pm =
vec_pm[lev]->const_array(mfi);
35 Array4<Real const>
const& pn =
vec_pn[lev]->const_array(mfi);
36 Array4<Real const>
const& msku = mf_msku->const_array(mfi);
37 Array4<Real const>
const& mskv = mf_mskv->const_array(mfi);
39 Box bx = mfi.tilebox();
40 Box xbx = surroundingNodes(bx,0);
41 Box ybx = surroundingNodes(bx,1);
43 Box xbx_hi = growHi(xbx,0,1);
45 Box ybx_hi = growHi(ybx,0,1);
47 const Box& domain = geom[0].Domain();
48 const auto dlo = amrex::lbound(domain);
49 const auto dhi = amrex::ubound(domain);
51 GeometryData
const& geomdata = geom[0].data();
52 bool is_periodic_in_x = geomdata.isPeriodic(0);
53 bool is_periodic_in_y = geomdata.isPeriodic(1);
56 Vector<BCRec> bcrs_x(ncomp);
57 Vector<BCRec> bcrs_y(ncomp);
61 FArrayBox fab_XF(xbx_hi, 1, amrex::The_Async_Arena()); fab_XF.template setVal<RunOn::Device>(0.);
62 FArrayBox fab_FX(xbx_hi, 1, amrex::The_Async_Arena()); fab_FX.template setVal<RunOn::Device>(0.);
63 FArrayBox fab_FXL(xbx_hi, 1, amrex::The_Async_Arena()); fab_FXL.template setVal<RunOn::Device>(0.);
64 FArrayBox fab_EF(ybx_hi, 1, amrex::The_Async_Arena()); fab_EF.template setVal<RunOn::Device>(0.);
65 FArrayBox fab_FE(ybx_hi, 1, amrex::The_Async_Arena()); fab_FE.template setVal<RunOn::Device>(0.);
66 FArrayBox fab_FEL(ybx_hi, 1, amrex::The_Async_Arena()); fab_FEL.template setVal<RunOn::Device>(0.);
67 FArrayBox fab_Hz_half(bx, 1, amrex::The_Async_Arena()); fab_Hz_half.template setVal<RunOn::Device>(0.);
68 FArrayBox fab_CF(convert(bx,IntVect(0,0,0)), 1, amrex::The_Async_Arena()); fab_CF.template setVal<RunOn::Device>(0.);
69 FArrayBox fab_FC(convert(bx,IntVect(0,0,0)), 1, amrex::The_Async_Arena()); fab_FC.template setVal<RunOn::Device>(0.);
70 FArrayBox fab_FCL(convert(bx,IntVect(0,0,0)), 1, amrex::The_Async_Arena()); fab_FCL.template setVal<RunOn::Device>(0.);
72 auto XF = fab_XF.array();
73 auto FX = fab_FX.array();
74 auto FXL = fab_FXL.array();
75 auto EF = fab_EF.array();
76 auto FE = fab_FE.array();
77 auto FEL = fab_FEL.array();
78 auto Hz_half = fab_Hz_half.array();
79 auto CF = fab_CF.array();
80 auto FC = fab_FC.array();
81 auto FCL = fab_FCL.array();
84 ParallelFor(grow(xbx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
86 Real grad_im1 = (tke(i-1,j,k,nstp) - tke(i-2,j,k,nstp)) * msku(i-1,j,0);
87 Real grad_ip1 = (tke(i+1,j,k,nstp) - tke(i ,j,k,nstp)) * msku(i+1,j,0);
89 Real gradL_im1 = (gls(i-1,j,k,nstp) - gls(i-2,j,k,nstp)) * msku(i-1,j,0);
90 Real gradL_ip1 = (gls(i+1,j,k,nstp) - gls(i ,j,k,nstp)) * msku(i+1,j,0);
94 if (i == dlo.x-1 && !is_periodic_in_x) {
95 grad_im1 = tke(i,j,k,nstp) - tke(i-1,j,k,nstp);
96 gradL_im1 = gls(i,j,k,nstp) - gls(i-1,j,k,nstp);
98 else if (i == dhi.x+1 && !is_periodic_in_x) {
99 grad_ip1 = tke(i,j,k,nstp) - tke(i-1,j,k,nstp);
100 gradL_ip1 = gls(i,j,k,nstp) - gls(i-1,j,k,nstp);
102 Real cff = 1.0_rt/6.0_rt;
103 XF(i,j,k) = 0.5_rt * (Huon(i,j,k) + Huon(i,j,k-1));
104 FX(i,j,k) = XF(i,j,k) * 0.5_rt * (tke(i-1,j,k,nstp) + tke(i,j,k,nstp) -
105 cff * (grad_ip1 - grad_im1));
106 FXL(i,j,k) = XF(i,j,k) * 0.5_rt * (gls(i-1,j,k,nstp) + gls(i,j,k,nstp) -
107 cff * (gradL_ip1 - gradL_im1));
111 ParallelFor(grow(ybx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
113 Real grad_jm1 = (tke(i,j-1,k,nstp) - tke(i,j-2,k,nstp)) * mskv(i,j-1,0);
114 Real grad_jp1 = (tke(i,j+1,k,nstp) - tke(i,j ,k,nstp)) * mskv(i,j+1,0);
116 Real gradL_jm1 = (gls(i,j-1,k,nstp) - gls(i,j-2,k,nstp)) * mskv(i,j-1,0);
117 Real gradL_jp1 = (gls(i,j+1,k,nstp) - gls(i,j ,k,nstp)) * mskv(i,j+1,0);
121 if (j == dlo.y-1 && !is_periodic_in_y) {
122 grad_jm1 = tke(i,j,k,nstp) - tke(i,j-1,k,nstp);
123 gradL_jm1 = gls(i,j,k,nstp) - gls(i,j-1,k,nstp);
125 else if (j == dhi.y+1 && !is_periodic_in_y) {
126 grad_jp1 = tke(i,j,k,nstp) - tke(i,j-1,k,nstp);
127 gradL_jp1 = gls(i,j,k,nstp) - gls(i,j-1,k,nstp);
129 Real cff = 1.0_rt/6.0_rt;
130 EF(i,j,k) = 0.5_rt * (Hvom(i,j,k) + Hvom(i,j,k-1));
131 FE(i,j,k) = EF(i,j,k) * 0.5_rt * (tke(i,j-1,k,nstp) + tke(i,j,k,nstp) -
132 cff * (grad_jp1 - grad_jm1));
133 FEL(i,j,k) = EF(i,j,k) * 0.5_rt * (gls(i,j-1,k,nstp) + gls(i,j,k,nstp) -
134 cff * (gradL_jp1 - gradL_jm1));
137 Real gamma = 1.0_rt / 6.0_rt;
138 Real cff1, cff2, cff3;
141 if (iic == ntfirst) {
144 cff3 = 0.5_rt * dt_lev;
147 cff1 = 0.5_rt + gamma;
148 cff2 = 0.5_rt - gamma;
149 cff3 = (1.0_rt - gamma) * dt_lev;
156 ParallelFor(grow(bx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
158 Real cff = 0.5_rt * (Hz(i,j,k) + Hz(i,j,k-1));
159 Real cff4 = cff3 * pm(i,j,0) * pn(i,j,0);
160 Hz_half(i,j,k) = cff - cff4 * (XF(i+1,j,k)-XF(i,j,k)+EF(i,j+1,k)-EF(i,j,k));
161 tke(i,j,k,2) = cff * (cff1*tke(i,j,k,nstp) + cff2*tke(i,j,k,indx)) -
162 cff4 * (FX(i+1,j,k)-FX(i,j,k)+FE(i,j+1,k)-FE(i,j,k));
163 gls(i,j,k,2) = cff * (cff1 * gls(i,j,k,nstp) + cff2 * gls(i,j,k,indx)) -
164 cff4 * (FXL(i+1,j,k)-FXL(i,j,k)+FEL(i,j+1,k)-FEL(i,j,k));
165 tke(i,j,k,nnew) = cff * tke(i,j,k,nstp);
166 gls(i,j,k,nnew) = cff * gls(i,j,k,nstp);
171 ParallelFor(convert(bx,IntVect(0,0,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
174 CF(i,j,k) = 0.5_rt * (W(i,j,k+1) + W(i,j,k));
176 Real cff1_vadv = 1.0_rt / 3.0_rt;
177 Real cff2_vadv = 5.0_rt / 6.0_rt;
178 Real cff3_vadv = 1.0_rt / 6.0_rt;
179 FC(i,j,k) = CF(i,j,k) * (cff1_vadv * tke(i,j,0,nstp) +
180 cff2_vadv * tke(i,j,1,nstp) -
181 cff3_vadv * tke(i,j,2,nstp));
182 FCL(i,j,k) = CF(i,j,k) * (cff1_vadv * gls(i,j,0,nstp) +
183 cff2_vadv * gls(i,j,1,nstp) -
184 cff3_vadv * gls(i,j,2,nstp));
186 Real cff1_vadv = 1.0_rt / 3.0_rt;
187 Real cff2_vadv = 5.0_rt / 6.0_rt;
188 Real cff3_vadv = 1.0_rt / 6.0_rt;
189 FC(i,j,k) = CF(i,j,k) * (cff1_vadv * tke(i,j,k+1, nstp) +
190 cff2_vadv * tke(i,j,k ,nstp)-
191 cff3_vadv * tke(i,j,k-1,nstp));
192 FCL(i,j,k) = CF(i,j,k) * (cff1_vadv * gls(i,j,k+1,nstp) +
193 cff2_vadv * gls(i,j,k ,nstp)-
194 cff3_vadv * gls(i,j,k-1,nstp));
196 Real cff1_vadv = 7.0_rt / 12.0_rt;
197 Real cff2_vadv = 1.0_rt / 12.0_rt;
198 FC(i,j,k) = CF(i,j,k) * (cff1_vadv * (tke(i,j,k ,nstp) + tke(i,j,k+1,nstp)) -
199 cff2_vadv * (tke(i,j,k-1,nstp) + tke(i,j,k+2,nstp)));
200 FCL(i,j,k) = CF(i,j,k) * (cff1_vadv * (gls(i,j,k ,nstp) + gls(i,j,k+1,nstp)) -
201 cff2_vadv * (gls(i,j,k-1,nstp) + gls(i,j,k+2,nstp)));
206 if (iic == ntfirst) {
207 cff3 = 0.5_rt * dt_lev;
209 cff3 = (1.0_rt - gamma) * dt_lev;
212 ParallelFor(grow(bx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
214 Real cff4 = cff3 * pm(i,j,0) * pn(i,j,0);
215 Hz_half(i,j,k) = Hz_half(i,j,k) - cff4 * (CF(i,j,k)-CF(i,j,k-1));
216 Real cff1_loc = 1.0_rt / Hz_half(i,j,k);
217 tke(i,j,k,2) = cff1_loc * (tke(i,j,k,2) - cff4 * (FC (i,j,k) - FC (i,j,k-1)));
218 gls(i,j,k,2) = cff1_loc * (gls(i,j,k,2) - cff4 * (FCL(i,j,k) - FCL(i,j,k-1)));
222 for (
int icomp=0; icomp<3; icomp++) {
247 MultiFab& mf_W, MultiFab* mf_Akv, MultiFab* mf_Akt,
248 MultiFab* mf_Akk, MultiFab* mf_Akp,
250 MultiFab* mf_msku, MultiFab* mf_mskv,
251 const int nstp,
const int nnew,
252 const int N,
const Real dt_lev)
263 Real ogls_sigp = 1.0_rt/gls_sigp_cb;
288 Real sqrt2 = std::sqrt(2.0_rt);
307 Real gls_s0, gls_s1, gls_s2, gls_s4, gls_s5, gls_s6;
308 Real gls_b0, gls_b1, gls_b2, gls_b3, gls_b4, gls_b5;
309 Real my_Sm2, my_Sh1, my_Sh2, my_Sm3, my_Sm4;
372 Real Zos_eff = Zos_min;
373 Real Gadv = 1.0_rt/3.0_rt;
374 Real eps = 1.0e-10_rt;
376 const BoxArray& ba =
cons_old[lev]->boxArray();
377 const DistributionMapping& dm =
cons_old[lev]->DistributionMap();
378 MultiFab mf_dU(convert(ba,IntVect(0,0,1)),dm,1,IntVect(
NGROW,
NGROW,0));
379 MultiFab mf_dV(convert(ba,IntVect(0,0,1)),dm,1,IntVect(
NGROW,
NGROW,0));
381 MultiFab mf_CF(convert(ba,IntVect(0,0,1)),dm,1,IntVect(
NGROW,
NGROW,0));
383 MultiFab mf_shear2(ba,dm,1,IntVect(
NGROW,
NGROW,0));
384 MultiFab mf_shear2_cached(ba,dm,1,IntVect(
NGROW,
NGROW,0));
386 MultiFab mf_buoy2(ba,dm,1,IntVect(
NGROW,
NGROW,0));
387 MultiFab mf_tmp_buoy(ba,dm,1,IntVect(
NGROW,
NGROW,0));
388 MultiFab mf_tmp_shear(ba,dm,1,IntVect(
NGROW,
NGROW,0));
389 MultiFab mf_curvK(ba,dm,1,IntVect(
NGROW,
NGROW,0));
390 MultiFab mf_curvP(ba,dm,1,IntVect(
NGROW,
NGROW,0));
392 MultiFab mf_FXK(ba,dm,1,IntVect(
NGROW,
NGROW,0));
393 MultiFab mf_FXP(ba,dm,1,IntVect(
NGROW,
NGROW,0));
394 MultiFab mf_FEK(ba,dm,1,IntVect(
NGROW,
NGROW,0));
395 MultiFab mf_FEP(ba,dm,1,IntVect(
NGROW,
NGROW,0));
396 MultiFab mf_FCK(ba,dm,1,IntVect(
NGROW,
NGROW,0));
397 MultiFab mf_FCP(ba,dm,1,IntVect(
NGROW,
NGROW,0));
398 MultiFab mf_BCK(ba,dm,1,IntVect(
NGROW,
NGROW,0));
399 MultiFab mf_BCP(ba,dm,1,IntVect(
NGROW,
NGROW,0));
401 const Box& domain = geom[0].Domain();
402 const auto dlo = amrex::lbound(domain);
403 const auto dhi = amrex::ubound(domain);
405 GeometryData
const& geomdata = geom[0].data();
406 bool is_periodic_in_x = geomdata.isPeriodic(0);
407 bool is_periodic_in_y = geomdata.isPeriodic(1);
410 for ( MFIter mfi(*mf_gls, TilingIfNotGPU()); mfi.isValid(); ++mfi )
412 Box bx = mfi.tilebox();
413 Box gbx1 = mfi.growntilebox(IntVect(
NGROW-1,
NGROW-1,0));
420 Array4<Real>
const& Hz =
vec_Hz[lev]->array(mfi);
421 Array4<Real>
const& u =
xvel_old[lev]->array(mfi);
422 Array4<Real>
const& v =
yvel_old[lev]->array(mfi);
424 auto dU = mf_dU.array(mfi);
425 auto dV = mf_dV.array(mfi);
426 auto CF = mf_CF.array(mfi);
427 auto shear2_cached = mf_shear2_cached.array(mfi);
429 ParallelFor(gbx1D, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
434 for (
int k=1; k<=N; k++) {
435 Real cff = 1.0_rt / (2.0_rt * Hz(i,j,k) + Hz(i,j,k-1)*(2.0_rt - CF(i,j,k-1)));
436 CF(i,j,k) = cff * Hz(i,j,k);
437 dU(i,j,k)=cff*(3.0_rt*(u(i ,j,k)-u(i, j,k-1)+
438 u(i+1,j,k)-u(i+1,j,k-1))-Hz(i,j,k-1)*dU(i,j,k-1));
439 dV(i,j,k)=cff*(3.0_rt*(v(i,j ,k)-v(i,j ,k-1)+
440 v(i,j+1,k)-v(i,j+1,k-1))-Hz(i,j,k-1)*dV(i,j,k-1));
442 dU(i,j,N+1) = 0.0_rt;
443 dV(i,j,N+1) = 0.0_rt;
444 for (
int k=N; k>=1; k--) {
445 dU(i,j,k) = dU(i,j,k) - CF(i,j,k) * dU(i,j,k+1);
446 dV(i,j,k) = dV(i,j,k) - CF(i,j,k) * dV(i,j,k+1);
448 shear2_cached(i,j,0) = 0.0_rt;
449 for (
int k=1; k<=N; k++) {
450 shear2_cached(i,j,k) = dU(i,j,k) * dU(i,j,k) + dV(i,j,k) * dV(i,j,k);
458 mf_CF.setVal(0.0_rt);
460 for ( MFIter mfi(*mf_gls, TilingIfNotGPU()); mfi.isValid(); ++mfi )
462 Box bx = mfi.tilebox();
463 Box xbx = surroundingNodes(bx,0);
464 Box ybx = surroundingNodes(bx,1);
465 Box gbx1 = grow(bx,IntVect(
NGROW-1,
NGROW-1,0));
468 bx_rho.convert(IntVect(0,0,0));
470 Box xbx_int = grow(xbx,IntVect(0,0,-1));
471 Box ybx_int = grow(ybx,IntVect(0,0,-1));
472 Box bx_growloxy = growLo(growLo(grow(bx,IntVect(0,0,-1)),0,1),1,1);
480 Vector<BCRec> bcrs_x(ncomp);
481 Vector<BCRec> bcrs_y(ncomp);
485 Array4<Real const>
const& W = mf_W.const_array(mfi);
486 Array4<Real>
const& Hz =
vec_Hz[lev]->array(mfi);
487 Array4<Real>
const& pm =
vec_pm[lev]->array(mfi);
488 Array4<Real>
const& pn =
vec_pn[lev]->array(mfi);
489 Array4<Real>
const& Lscale =
vec_Lscale[lev]->array(mfi);
491 Array4<Real>
const& Huon =
vec_Huon[lev]->array(mfi);
492 Array4<Real>
const& Hvom =
vec_Hvom[lev]->array(mfi);
493 Array4<Real>
const& z_w =
vec_z_w[lev]->array(mfi);
495 Array4<Real>
const& tke = mf_tke->array(mfi);
496 Array4<Real>
const& gls = mf_gls->array(mfi);
498 Array4<Real const>
const& sustr =
vec_sustr[lev]->const_array(mfi);
499 Array4<Real const>
const& svstr =
vec_svstr[lev]->const_array(mfi);
500 Array4<Real const>
const& bustr =
vec_bustr[lev]->const_array(mfi);
501 Array4<Real const>
const& bvstr =
vec_bvstr[lev]->const_array(mfi);
502 Array4<Real const>
const& msku = mf_msku->const_array(mfi);
503 Array4<Real const>
const& mskv = mf_mskv->const_array(mfi);
505 Array4<Real>
const& ZoBot =
vec_ZoBot[lev]->array(mfi);
507 FArrayBox fab_tmp_buoy(bx_growloxy,1, amrex::The_Async_Arena()); fab_tmp_buoy.template setVal<RunOn::Device>(0.);
508 FArrayBox fab_tmp_shear(bx_growloxy,1, amrex::The_Async_Arena()); fab_tmp_shear.template setVal<RunOn::Device>(0.);
510 FArrayBox fab_curvK(gbx1,1, amrex::The_Async_Arena()); fab_curvK.template setVal<RunOn::Device>(0.);
511 FArrayBox fab_curvP(gbx1,1, amrex::The_Async_Arena()); fab_curvP.template setVal<RunOn::Device>(0.);
513 FArrayBox fab_FXK(xbx_int,1,amrex::The_Async_Arena()); fab_FXK.template setVal<RunOn::Device>(0.);
514 FArrayBox fab_FXP(xbx_int,1,amrex::The_Async_Arena()); fab_FXP.template setVal<RunOn::Device>(0.);
515 FArrayBox fab_FEK(ybx_int,1,amrex::The_Async_Arena()); fab_FEK.template setVal<RunOn::Device>(0.);
516 FArrayBox fab_FEP(ybx_int,1,amrex::The_Async_Arena()); fab_FEP.template setVal<RunOn::Device>(0.);
518 FArrayBox fab_FCK(bx_rho,1,amrex::The_Async_Arena()); fab_FCK.template setVal<RunOn::Device>(0.);
519 FArrayBox fab_FCP(bx_rho,1,amrex::The_Async_Arena()); fab_FCP.template setVal<RunOn::Device>(0.);
520 FArrayBox fab_BCK(bx_rho,1,amrex::The_Async_Arena()); fab_BCK.template setVal<RunOn::Device>(0.);
521 FArrayBox fab_BCP(bx_rho,1,amrex::The_Async_Arena()); fab_BCP.template setVal<RunOn::Device>(0.);
523 auto CF = mf_CF.array(mfi);
524 auto shear2 = mf_shear2.array(mfi);
525 auto shear2_cached = mf_shear2_cached.array(mfi);
526 auto buoy2 = mf_buoy2.array(mfi);
527 Array4<Real>
const& bvf =
vec_bvf[lev]->array(mfi);
529 auto tmp_buoy = fab_tmp_buoy.array();
530 auto tmp_shear = fab_tmp_shear.array();
531 auto curvK = fab_curvK.array();
532 auto curvP = fab_curvP.array();
533 auto FXK = fab_FXK.array();
534 auto FXP = fab_FXP.array();
535 auto FEK = fab_FEK.array();
536 auto FEP = fab_FEP.array();
537 auto FCK = fab_FCK.array();
538 auto FCP = fab_FCP.array();
539 auto BCK = fab_BCK.array();
540 auto BCP = fab_BCP.array();
542 auto Akt = mf_Akt->array(mfi);
543 auto Akv = mf_Akv->array(mfi);
544 auto Akp = mf_Akp->array(mfi);
545 auto Akk = mf_Akk->array(mfi);
547 ParallelFor(bx_growloxy, [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
549 tmp_buoy(i,j,k)=0.25_rt * (bvf(i,j,k) + bvf(i+1,j,k) + bvf(i,j+1,k)+bvf(i+1,j+1,k));
550 tmp_shear(i,j,k)=0.25_rt * (shear2_cached(i,j,k) + shear2_cached(i+1,j,k) + shear2_cached(i,j+1,k)+shear2_cached(i+1,j+1,k));
553 ParallelFor(grow(bx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
555 buoy2(i,j,k)=0.25_rt * (tmp_buoy(i,j,k) + tmp_buoy(i-1,j,k) + tmp_buoy(i,j-1,k)+tmp_buoy(i-1,j-1,k));
556 shear2(i,j,k)=0.25_rt * (tmp_shear(i,j,k) + tmp_shear(i-1,j,k) + tmp_shear(i,j-1,k)+tmp_shear(i-1,j-1,k));
560 ParallelFor(growLo(grow(xbx,IntVect(0,0,-1)),0,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
562 Real gradK, gradK_ip1, gradP, gradP_ip1;
564 if (i == dlo.x-1 && !is_periodic_in_x) {
565 gradK_ip1 = tke(i+1,j,k,2)-tke(i ,j,k,2);
567 gradP_ip1 = gls(i+1,j,k,2)-gls(i ,j,k,2);
569 }
else if (i == dhi.x+1 && !is_periodic_in_x) {
570 gradK = tke(i ,j,k,2)-tke(i-1,j,k,2);
572 gradP = gls(i ,j,k,2)-gls(i-1,j,k,2);
575 gradK = (tke(i ,j,k,2)-tke(i-1,j,k,2)) * msku(i ,j,0);
576 gradK_ip1 = (tke(i+1,j,k,2)-tke(i ,j,k,2)) * msku(i+1,j,0);
577 gradP = (gls(i ,j,k,2)-gls(i-1,j,k,2)) * msku(i ,j,0);
578 gradP_ip1 = (gls(i+1,j,k,2)-gls(i ,j,k,2)) * msku(i+1,j,0);
581 curvK(i,j,k) = gradK_ip1 - gradK;
582 curvP(i,j,k) = gradP_ip1 - gradP;
584 ParallelFor(grow(xbx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
586 Real cff = 0.5_rt * (Huon(i,j,k) + Huon(i,j,k-1));
587 Real cff1 = (cff > 0.0) ? curvK(i-1,j,k) : curvK(i,j,k);
588 Real cff2 = (cff > 0.0) ? curvP(i-1,j,k) : curvP(i,j,k);
590 FXK(i,j,k) = cff * 0.5_rt * (tke(i-1,j,k,2)+tke(i,j,k,2)-Gadv*cff1);
591 FXP(i,j,k) = cff * 0.5_rt * (gls(i-1,j,k,2)+gls(i,j,k,2)-Gadv*cff2);
595 ParallelFor(growLo(grow(ybx,IntVect(0,0,-1)),1,1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
597 Real gradK = (tke(i,j ,k,2)-tke(i,j-1,k,2)) * mskv(i,j ,0);
598 Real gradK_jp1 = (tke(i,j+1,k,2)-tke(i,j ,k,2)) * mskv(i,j+1,0);
599 Real gradP = (gls(i,j ,k,2)-gls(i,j-1,k,2)) * mskv(i,j ,0);
600 Real gradP_jp1 = (gls(i,j+1,k,2)-gls(i,j ,k,2)) * mskv(i,j+1,0);
602 if (j == dlo.y-1 && !is_periodic_in_y) {
606 else if (j == dhi.y+1 && !is_periodic_in_y) {
611 curvK(i,j,k) = gradK_jp1 - gradK;
612 curvP(i,j,k) = gradP_jp1 - gradP;
614 ParallelFor(grow(ybx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
616 Real cff = 0.5_rt * (Hvom(i,j,k) + Hvom(i,j,k-1));
617 Real cff1 = (cff > 0.0) ? curvK(i,j-1,k) : curvK(i,j,k);
618 Real cff2 = (cff > 0.0) ? curvP(i,j-1,k) : curvP(i,j,k);
620 FEK(i,j,k) = cff * 0.5_rt * (tke(i,j-1,k,2)+tke(i,j,k,2)-Gadv*cff1);
621 FEP(i,j,k) = cff * 0.5_rt * (gls(i,j-1,k,2)+gls(i,j,k,2)-Gadv*cff2);
626 ParallelFor(grow(bx,IntVect(0,0,-1)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
628 Real cff = dt_lev * pm(i,j,0) * pn(i,j,0);
629 tke(i,j,k,nnew) = tke(i,j,k,nnew) - cff * (FXK(i+1,j ,k)-FXK(i,j,k)+
630 FEK(i ,j+1,k)-FEK(i,j,k));
631 tke(i,j,k,nnew) = std::max(tke(i,j,k,nnew), gls_Kmin);
633 gls(i,j,k,nnew) = gls(i,j,k,nnew) - cff * (FXP(i+1,j ,k)-FXP(i,j,k)+
634 FEP(i ,j+1,k)-FEP(i,j,k));
635 gls(i,j,k,nnew) = std::max(gls(i,j,k,nnew), gls_Pmin);
640 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
642 Real cff1 = 7.0_rt / 12.0_rt;
643 Real cff2 = 1.0_rt / 12.0_rt;
644 for (
int k=1; k<=N-1; k++) {
645 Real cff = 0.5_rt * (W(i,j,k+1)+W(i,j,k));
646 FCK(i,j,k) = cff * (cff1 * (tke(i,j,k ,2)+tke(i,j,k+1,2))-
647 cff2 * (tke(i,j,k-1,2)+tke(i,j,k+2,2)));
648 FCP(i,j,k) = cff * (cff1 * (gls(i,j,k ,2)+gls(i,j,k+1,2))-
649 cff2 * (gls(i,j,k-1,2)+gls(i,j,k+2,2)));
651 cff1 = 1.0_rt/3.0_rt;
652 cff2 = 5.0_rt/6.0_rt;
653 Real cff3 = 1.0_rt / 6.0_rt;
654 Real cff = 0.5_rt * (W(i,j,0)+W(i,j,1));
655 FCK(i,j,0) = cff * (cff1 * tke(i,j,0,2)+cff2 * tke(i,j,1,2)-cff3 * tke(i,j,2,2));
656 FCP(i,j,0) = cff * (cff1 * gls(i,j,0,2)+cff2 * gls(i,j,1,2)-cff3 * gls(i,j,2,2));
657 cff = 0.5_rt * (W(i,j,N+1)+W(i,j,N));
658 FCK(i,j,N) = cff * (cff1 * tke(i,j,N+1,2)+cff2*tke(i,j,N,2)-cff3*tke(i,j,N-1,2));
659 FCP(i,j,N) = cff * (cff1 * gls(i,j,N+1,2)+cff2*gls(i,j,N,2)-cff3*gls(i,j,N-1,2));
661 ParallelFor(grow(bx,2,-1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
663 Real cff = dt_lev * pm(i,j,0) * pn(i,j,0);
664 tke(i,j,k,nnew) = tke(i,j,k,nnew) - cff*(FCK(i,j,k )-FCK(i,j,k-1));
665 tke(i,j,k,nnew) = std::max(tke(i,j,k,nnew),gls_Kmin);
666 gls(i,j,k,nnew) = gls(i,j,k,nnew) - cff*(FCP(i,j,k )-FCP(i,j,k-1));
667 gls(i,j,k,nnew) = std::max(gls(i,j,k,nnew),gls_Pmin);
673 Real cff = -0.5 * dt_lev;
674 ParallelFor(convert(bx,IntVect(0,0,0)), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
680 FCK(i,j,k) = cff * (Akk(i,j,k) + Akk(i,j,k+1)) / Hz(i,j,k);
681 FCP(i,j,k) = cff * (Akp(i,j,k) + Akp(i,j,k+1)) / Hz(i,j,k);
685 ParallelFor(grow(bx,2,-1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
689 Real strat2 = buoy2(i,j,k);
690 Real gls_c3 = (strat2 > 0.0) ? gls_c3m : gls_c3p;
691 Real Kprod = shear2(i,j,k) * (Akv(i,j,k)-Akv_bak) -
693 Real Pprod = gls_c1 * shear2(i,j,k) * (Akv(i,j,k)-Akv_bak) -
694 gls_c3 * strat2 * (Akt(i,j,k,
Temp_comp)-Akt_bak);
698 Real cff1 = (Kprod < 0.0_rt) ? 0.0_rt : 1.0_rt;
699 Real cff2 = (Pprod < 0.0_rt) ? 0.0_rt : 1.0_rt;
700 if (Kprod < 0.0_rt) {
701 Kprod = Kprod + strat2*(Akt(i,j,k,
Temp_comp)-Akt_bak);
703 if (Pprod < 0.0_rt) {
704 Pprod = Pprod + gls_c3*strat2*(Akt(i,j,k,
Temp_comp)-Akt_bak);
707 Real cff_Hz = 0.5_rt * (Hz(i,j,k) + Hz(i,j,k-1));
708 tke(i,j,k,nnew) = tke(i,j,k,nnew)+dt_lev * cff_Hz * Kprod;
709 gls(i,j,k,nnew) = gls(i,j,k,nnew)+dt_lev
710 *cff_Hz*Pprod*gls(i,j,k,nstp) / std::max(tke(i,j,k,nstp),gls_Kmin);
713 Real wall_fac = 1.0_rt;
717 std::pow(std::pow(gls(i,j,k,nstp),( gls_exp1))*cmu_fac1*
718 std::pow(tke(i,j,k,nstp),-tke_exp1)*
719 (1.0_rt/ (z_w(i,j,k)-z_w(i,j,0))),2)+
721 std::pow(std::pow(gls(i,j,k,nstp), gls_exp1)*cmu_fac1*
722 std::pow(tke(i,j,k,nstp),-tke_exp1)*
723 (1.0_rt/ (z_w(i,j,N+1)-z_w(i,j,k))),2);
725 BCK(i,j,k)=cff_Hz*(1.0_rt+dt_lev*
726 std::pow(gls(i,j,k,nstp),(-gls_exp1))*cmu_fac2*
727 std::pow(tke(i,j,k,nstp), tke_exp2)+
728 dt_lev*(1.0_rt-cff1)*strat2*
731 FCK(i,j,k)-FCK(i,j,k-1);
732 BCP(i,j,k)=cff_Hz*(1.0_rt+dt_lev*gls_c2*wall_fac*
733 std::pow(gls(i,j,k,nstp),-gls_exp1)*cmu_fac2*
734 std::pow(tke(i,j,k,nstp), tke_exp2)+
735 dt_lev*(1.0_rt-cff2)*gls_c3*strat2*
738 FCP(i,j,k)-FCP(i,j,k-1);
741 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
743 Real Zob_min = std::max(ZoBot(i,j,0), 0.0001_rt);
753 tke(i,j,N+1,nnew)=std::max(cmu_fac3*0.5_rt*
754 std::sqrt((sustr(i,j,0)+sustr(i+1,j,0))*(sustr(i,j,0)+sustr(i+1,j,0))+
755 (svstr(i,j,0)+svstr(i,j+1,0))*(svstr(i,j,0)+svstr(i,j+1,0))),
757 tke(i,j,0,nnew)=std::max(cmu_fac3*0.5_rt*
758 std::sqrt((bustr(i,j,0)+bustr(i+1,j,0))*(bustr(i,j,0)+bustr(i+1,j,0))+
759 (bvstr(i,j,0)+bvstr(i,j+1,0))*(bvstr(i,j,0)+bvstr(i,j+1,0))),
762 gls(i,j,N+1,nnew)=std::max(std::pow(gls_cmu0,gls_p)*
763 std::pow(tke(i,j,N+1,nnew),gls_m)*
764 std::pow(L_sft*Zos_eff,gls_n), gls_Pmin);
765 Real cff_gls = gls_fac4*std::pow(
vonKar*Zob_min,gls_n);
766 gls(i,j,0,nnew)=std::max(cff_gls*std::pow(tke(i,j,0,nnew),(gls_m)), gls_Pmin);
770 Real tke_fluxt = 0.0_rt;
771 Real tke_fluxb = 0.0_rt;
772 Real cff_BCK = 1.0_rt/BCK(i,j,N);
773 CF(i,j,N)=cff_BCK*FCK(i,j,N-1);
774 tke(i,j,N,nnew)=cff_BCK*(tke(i,j,N,nnew)+tke_fluxt);
775 for (
int k=N-1;k>=1;k--) {
776 cff_BCK = 1.0_rt / (BCK(i,j,k)-CF(i,j,k+1)*FCK(i,j,k));
777 CF(i,j,k) = cff_BCK * FCK(i,j,k-1);
778 tke(i,j,k,nnew) = cff_BCK * (tke(i,j,k,nnew) - FCK(i,j,k) * tke(i,j,k+1,nnew));
780 tke(i,j,1,nnew) = tke(i,j,1,nnew) - cff_BCK * tke_fluxb;
781 tke(i,j,1,nnew) = std::max(tke(i,j,1,nnew),gls_Kmin);
782 for (
int k=2;k<=N;k++) {
783 tke(i,j,k,nnew) = tke(i,j,k,nnew) - CF(i,j,k) * tke(i,j,k-1,nnew);
784 tke(i,j,k,nnew) = std::max(tke(i,j,k,nnew), gls_Kmin);
788 Real cff_tke = 0.5_rt * (tke(i,j,N+1,nnew) + tke(i,j,N,nnew));
789 Real gls_fluxt = dt_lev*gls_fac3*std::pow(cff_tke,gls_m)*
790 std::pow(L_sft,(gls_n))*
791 std::pow(Zos_eff+0.5_rt*Hz(i,j,N),gls_n-1.0_rt)*
792 0.5_rt*(Akp(i,j,N+1)+Akp(i,j,N));
793 cff_tke=0.5_rt*(tke(i,j,0,nnew)+tke(i,j,1,nnew));
794 Real gls_fluxb = dt_lev*gls_fac2*std::pow(cff_tke,gls_m)*
795 std::pow(0.5_rt*Hz(i,j,0)+Zob_min,gls_n-1.0_rt)*
796 0.5_rt*(Akp(i,j,0)+Akp(i,j,1));
797 Real cff_BCP = 1.0_rt / BCP(i,j,N);
798 CF(i,j,N) = cff_BCP * FCP(i,j,N-1);
799 gls(i,j,N,nnew)=cff_BCP*(gls(i,j,N,nnew)-gls_fluxt);
800 for (
int k=N-1;k>=1;k--) {
801 cff_BCP = 1.0_rt / (BCP(i,j,k)-CF(i,j,k+1)*FCP(i,j,k));
802 CF(i,j,k) = cff_BCP * FCP(i,j,k-1);
803 gls(i,j,k,nnew) = cff_BCP * (gls(i,j,k,nnew) - FCP(i,j,k)*gls(i,j,k+1,nnew));
805 gls(i,j,1,nnew) = gls(i,j,1,nnew)-cff_BCP*gls_fluxb;
806 for (
int k=2; k<=N; k++) {
807 gls(i,j,k,nnew) = gls(i,j,k,nnew) - CF(i,j,k) * gls(i,j,k-1,nnew);
812 ParallelFor(grow(bx,2,-1), [=] AMREX_GPU_DEVICE (
int i,
int j,
int k)
814 tke(i,j,k,nnew) = std::max(tke(i,j,k,nnew),gls_Kmin);
815 gls(i,j,k,nnew) = std::max(gls(i,j,k,nnew),gls_Pmin);
816 if (gls_n >= 0.0_rt) {
817 gls(i,j,k,nnew)=std::min(gls(i,j,k,nnew),gls_fac5*
818 std::pow(tke(i,j,k,nnew),tke_exp4)*
819 std::pow(std::sqrt(std::max(0.0_rt,
820 buoy2(i,j,k)))+eps,-gls_n));
822 gls(i,j,k,nnew)=std::max(gls(i,j,k,nnew), gls_fac5*
823 std::pow(tke(i,j,k,nnew),(tke_exp4))*
824 std::pow((std::sqrt(std::max(0.0_rt,
825 buoy2(i,j,k)))+eps),(-gls_n)));
828 Real Ls_unlmt=std::max(eps,
829 std::pow(gls(i,j,k,nnew),( gls_exp1))*cmu_fac1*
830 std::pow(tke(i,j,k,nnew),(-tke_exp1)));
833 if (buoy2(i,j,k) > 0.0_rt) {
834 Ls_lmt=std::min(Ls_unlmt,
835 std::sqrt(0.56_rt*tke(i,j,k,nnew)/
836 (std::max(0.0_rt,buoy2(i,j,k))+eps)));
843 gls(i,j,k,nnew)=std::max(std::pow(gls_cmu0,gls_p)*
844 std::pow(tke(i,j,k,nnew),gls_m)*
845 std::pow(Ls_lmt,gls_n), gls_Pmin);
850 Real Gh=std::min(gls_Gh0,-buoy2(i,j,k)*Ls_lmt*Ls_lmt/
851 (2.0_rt*tke(i,j,k,nnew)));
852 Gh=std::min(Gh,Gh-(Gh-gls_Ghcri)*(Gh-gls_Ghcri)/
853 (Gh+gls_Gh0-2.0_rt*gls_Ghcri));
854 Gh=std::max(Gh,gls_Ghmin);
861 Real Gm=(gls_b0/gls_fac6-gls_b1*Gh+gls_b3*gls_fac6*(Gh*Gh))/
862 (gls_b2-gls_b4*gls_fac6*Gh);
863 Gm=std::min(Gm,shear2(i,j,k)*Ls_lmt*Ls_lmt/
864 (2.0_rt*tke(i,j,k,nnew)));
869 Real stab_cff=gls_b0-gls_b1*gls_fac6*Gh+gls_b2*gls_fac6*Gm+
870 gls_b3*gls_fac6*gls_fac6*Gh*Gh-gls_b4*gls_fac6*gls_fac6*Gh*Gm+
871 gls_b5*gls_fac6*gls_fac6*Gm*Gm;
872 Sm=(gls_s0-gls_s1*gls_fac6*Gh+gls_s2*gls_fac6*Gm)/stab_cff;
873 Sh=(gls_s4-gls_s5*gls_fac6*Gh+gls_s6*gls_fac6*Gm)/stab_cff;
874 Sm=std::max(Sm,0.0_rt);
875 Sh=std::max(Sh,0.0_rt);
880 Real gls_cmu0_cube = gls_cmu0 * gls_cmu0 * gls_cmu0;
881 Sm=Sm*sqrt2/(gls_cmu0_cube);
882 Sh=Sh*sqrt2/gls_cmu0_cube;
884 Real cff_galperin = 1.0_rt - my_Sh2*Gh;
885 Sh = my_Sh1 / cff_galperin;
886 Sm = (my_Sm3+Sh*Gh*my_Sm4)/(1.0_rt-my_Sm2*Gh);
893 Real ql=sqrt2*0.5_rt*(Ls_lmt*std::sqrt(tke(i,j,k,nnew))+
894 Lscale(i,j,k)*std::sqrt(tke(i,j,k,nstp)));
895 Akv(i,j,k)=Akv_bak+Sm*ql;
896 for (
int n=0; n<
NCONS; n++) {
897 Akt(i,j,k,n)=Akt_bak+Sh*ql;
903 Akk(i,j,k)=Akk_bak+Sm*ql/gls_sigk;
904 Akp(i,j,k)=Akp_bak+Sm*ql*ogls_sigp;
907 Lscale(i,j,k)=Ls_lmt;
909 ParallelFor(bxD, [=] AMREX_GPU_DEVICE (
int i,
int j,
int )
911 Real Zob_min = std::max(ZoBot(i,j,0), 0.0001_rt);
912 Akv(i,j,N+1)=Akv_bak+L_sft*Zos_eff*gls_cmu0*
913 std::sqrt(tke(i,j,N+1,nnew));
914 Akv(i,j,0)=Akv_bak+
vonKar*Zob_min*gls_cmu0*
915 std::sqrt(tke(i,j,0,nnew));
917 Akk(i,j,N+1)=Akk_bak+Akv(i,j,N+1)/gls_sigk;
918 Akk(i,j,0)=Akk_bak+Akv(i,j,0)/gls_sigk;
919 Akp(i,j,N+1)=Akp_bak+Akv(i,j,N+1)*ogls_sigp;
920 Akp(i,j,0)=Akp_bak+Akv(i,j,0)/gls_sigp_cb;
922 for (
int n=0; n<
NCONS; n++) {
923 Akt(i,j,N+1,n) = Akt_bak;
924 Akt(i,j,0,n) = Akt_bak;
929 for (
int icomp=0; icomp<3; icomp++) {
933 for (
int icomp=0; icomp<
NCONS; icomp++) {