154 Nu, Kh, TKE, & ! (out)
155 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, &
157 dz, lift, lmesh, elem, is_bound )
161 real(rp),
intent(out) :: nu(elem%np,lmesh%nea)
162 real(rp),
intent(out) :: kh(elem%np,lmesh%nea)
163 real(rp),
intent(out) :: tke(elem%np,lmesh%nea)
164 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
165 real(rp),
intent(in) :: momx_ (elem%np,lmesh%nea)
166 real(rp),
intent(in) :: momy_ (elem%np,lmesh%nea)
167 real(rp),
intent(in) :: momz_ (elem%np,lmesh%nea)
168 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
169 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
170 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
171 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
172 real(rp),
intent(in) :: pres(elem%np,lmesh%nea)
173 real(rp),
intent(in) :: pt(elem%np,lmesh%nea)
175 logical,
intent(in) :: is_bound(elem%nfptot,lmesh%ne)
177 real(rp) :: fz(elem%np), liftdelflx(elem%np)
178 real(rp) :: dens(elem%np), rdens(elem%np), rhot(elem%np), q(elem%np)
179 real(rp) :: ddensdz(elem%np), dveldz(elem%np,3), dptdz(elem%np), drtotdz(elem%np)
181 real(rp) :: del_flux_rho (elem%nfptot,lmesh%ne)
182 real(rp) :: del_flux_mom (elem%nfptot,lmesh%ne,3)
183 real(rp) :: del_flux_rhot(elem%nfptot,lmesh%ne)
184 real(rp) :: del_flux_rtot(elem%nfptot,lmesh%ne)
186 real(rp) :: s2(elem%np)
189 real(rp) :: rf(elem%np)
195 real(rp) :: discriminant
198 real(rp) :: s_m(elem%np), s_h(elem%np)
200 real(rp) :: mixlen(elem%np)
201 real(rp) :: zsfc(elem%nnode_h1d**2,lmesh%ne2d)
202 real(rp) :: dz1(elem%nnode_h1d**2,lmesh%ne2d)
203 integer :: hslice_b(elem%nnode_h1d**2)
204 integer :: hslice_t(elem%nnode_h1d**2)
213 real(rp),
parameter :: eps_rf = 1.0e-10_rp
214 real(rp),
parameter :: eps_disc = 1.0e-14_rp
222 f1 = b1 * ( g1 - c1 ) &
223 + 2.0_rp * a1 * ( 3.0_rp - 2.0_rp * c2 ) &
224 + 3.0_rp * a2_loc * ( 1.0_rp - c3 ) * ( 1.0_rp - c5 )
226 rf1 = b1 * ( g1 - c1 ) / f1
228 af12 = a1 * f1 / ( a2_loc * f2 )
230 lmesh2d => lmesh%lcmesh2D
231 elem2d => lmesh2d%refElem2D
233 hslice_b(:) = elem%Hslice(:,1)
234 hslice_t(:) = elem%Hslice(:,elem%Nnode_v)
238 call cal_del_flux_grad( del_flux_rho, del_flux_mom, del_flux_rhot, del_flux_rtot, &
239 ddens_, momx_, momy_, momz_, drhot_, rtot, dens_hyd, pres_hyd, pt, &
240 lmesh%normal_fn(:,:,3), lmesh%Fscale, lmesh%vmapM, lmesh%vmapP, &
241 lmesh, elem, is_bound )
248 do ke2d=lmesh2d%NeS, lmesh2d%NeE
249 zsfc(:,ke2d) = lmesh%zlev(hslice_b,ke2d)
250 dz1(:,ke2d) = ( lmesh%zlev(hslice_t,ke2d) - lmesh%zlev(hslice_b,ke2d) ) / real(elem%Nnode_v,kind=rp) * 0.5_rp
254 do ke=lmesh%NeS, lmesh%NeE
255 dens(:) = dens_hyd(:,ke) + ddens_(:,ke)
256 rdens(:) = 1.0_rp / dens(:)
257 rhot(:) = dens(:) * pt(:,ke)
262 ddensdz(:) = lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
265 q(:) = momx_(:,ke) * rdens(:)
268 dveldz(:,1) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdz(:) ) * rdens(:)
271 q(:) = momy_(:,ke) * rdens(:)
274 dveldz(:,2) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdz(:) ) * rdens(:)
277 q(:) = rhot(:) * rdens(:)
280 dptdz(:) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdz(:) ) * rdens(:)
285 drtotdz(:) = lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
289 n2 = grav * ( dptdz(p) / pt(p,ke) + drtotdz(p) / rtot(p,ke) )
291 s2(p) = dveldz(p,1)**2 + dveldz(p,2)**2
292 ri = n2 / max(s2(p), eps)
294 discriminant = ri * ri &
295 + 2.0_rp * af12 * ( rf1 - 2.0_rp * rf2 ) * ri &
297 discriminant = max( discriminant, 0.0_rp )
299 rf(p) = 0.5_rp / af12 * ( ri + af12 * rf1 - sqrt(discriminant) )
300 rf(p) = min( rf(p), rfc - eps_rf )
305 denom_h = max( 1.0_rp - rf(p), eps_rf )
306 s_h(p) = 3.0_rp * a2_loc * ( g1 + g2 ) * ( rfc - rf(p) ) / denom_h
308 denom_m = rf2 - rf(p)
309 if ( abs(denom_m) < eps_rf )
then
310 denom_m = sign(eps_rf, denom_m)
312 s_m(p) = s_h(p) * af12 * ( rf1 - rf(p) ) / denom_m
314 s_m(p) = max( s_m(p), 0.0_rp )
315 s_h(p) = max( s_h(p), 0.0_rp )
320 ke2d = lmesh%EMap3Dto2D(ke)
321 do pz=1, elem%Nnode_v
322 do ph=1, elem%Nnode_h1D**2
323 p = ph + (pz-1)*elem%Nnode_h1D**2
324 kz = karman * max( lmesh%zlev(p,ke) - zsfc(ph,ke2d), dz1(ph,ke2d) )
326 mixlen(p) = kz * l_inf / max( kz + l_inf, l_min )
333 q(p) = b1 * mixlen(p)**2 &
334 * s_m(p) * max( 1.0_rp - rf(p), 0.0_rp ) * s2(p)
335 tke(p,ke) = 0.5_rp * max( q(p), 0.0_rp )
337 q(p) = sqrt( 2.0_rp * tke(p,ke) )
338 kh(p,ke) = mixlen(p) * q(p) * s_h(p)
339 nu(p,ke) = mixlen(p) * q(p) * s_m(p)