10#include "scaleFElib.h"
20 use scale_const,
only: &
85 private :: cal_bnd_flux
86 private :: cal_bnd_flux_grad_qtrc
87 private :: cal_bnd_flux_qtrc
89 private :: fact, p1, p2, p3
94 tends, auxvars, diagvars, & ! (inout)
95 tends_manager, auxvar_manager, diagvar_manager, &
96 tends_num_tot, mesh3d )
97 use scale_tracer,
only: &
98 qa, tracer_name, tracer_desc, tracer_unit
102 integer,
intent(in) :: tends_num_tot
103 type(
meshfield3d),
intent(inout) :: tends(tends_num_tot)
116 DATA atmos_phy_tb_aux_vinfo / &
118 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
120 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
122 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
124 'm2/s.K/m', 3,
'XYZ',
'' ), &
126 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
128 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
130 'm2/s.K/m', 3,
'XYZ',
'' ), &
132 'm2/s.K/m', 3,
'XYZ',
'' ), &
134 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
136 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
138 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ), &
140 'kg.m-3.m2.s-2', 3,
'XYZ',
'' ) /
143 DATA atmos_phy_tb_diag_vinfo / &
145 'm2/s2', 3,
'XYZ',
'' ), &
147 'm2/s', 3,
'XYZ',
'' ), &
149 'm2/s', 3,
'XYZ',
'' ) /
152 DATA atmos_phy_tb_tend_vinfo / &
154 'kg/m2/s2', 3,
'XYZ',
'' ), &
156 'kg/m2/s2', 3,
'XYZ',
'' ), &
158 'kg/m2/s2', 3,
'XYZ',
'' ), &
160 'kg/m3.K/s', 3,
'XYZ',
'' ) /
162 type(variableinfo) :: qtrc_vinfo_tmp
166 logical :: reg_file_hist
175 reg_file_hist = .true.
177 call tends_manager%Regist( &
178 atmos_phy_tb_tend_vinfo(iv), mesh3d, &
179 tends(iv), reg_file_hist, &
183 qtrc_vinfo_tmp%ndims = 3
184 qtrc_vinfo_tmp%dim_type =
'XYZ'
185 qtrc_vinfo_tmp%STDNAME =
''
189 qtrc_vinfo_tmp%keyID = iv
190 qtrc_vinfo_tmp%NAME =
'TB_'//trim(tracer_name(iq))//
'_t'
191 qtrc_vinfo_tmp%DESC =
'tendency of '//trim(tracer_desc(iq))//
' in TB process'
192 qtrc_vinfo_tmp%UNIT = trim(tracer_unit(iq))//
'/s'
194 call tends_manager%Regist( &
195 qtrc_vinfo_tmp, mesh3d, &
196 tends(iv), reg_file_hist, &
202 reg_file_hist = .true.
204 call auxvar_manager%Regist( &
205 atmos_phy_tb_aux_vinfo(iv), mesh3d, &
206 auxvars(iv), reg_file_hist, &
212 reg_file_hist = .true.
214 call diagvar_manager%Regist( &
215 atmos_phy_tb_diag_vinfo(iv), mesh3d, &
216 diagvars(iv), reg_file_hist, &
225 cs, filter_fac, lmesh, elem, lmesh2d, elem2d )
227 use scale_const,
only: &
228 karman => const_karman
235 real(rp),
intent(out) :: lambda(elem%np,lmesh%ne)
236 real(rp),
intent(in) :: cs
237 real(rp),
intent(in) :: filter_fac
244 real(rp) :: zs(elem2d%np)
245 real(rp) :: z1(elem2d%np)
246 real(rp) :: dz(elem %np)
248 real(rp) :: elem_aspect_eff
250 real(rp),
parameter :: oneoverthree = 1.0_rp / 3.0_rp
255 do ke=lmesh%NeS, lmesh%NeE
256 vol = sum( elem%IntWeight_lgl(:) * lmesh%J(:,ke) * lmesh%Gsqrt(:,ke) )
257 he = ( vol / ( dble(elem%PolyOrder_h+1)**2 * dble(elem%PolyOrder_v+1) ) )**oneoverthree
259 fz = lmesh%zlev(elem%Colmask(elem%Nnode_v,1),ke) - lmesh%zlev(elem%Colmask(1,1),ke)
260 elem_aspect_eff = fact( fz/dble(elem%PolyOrder_v+1), sqrt(vol/fz)/dble(elem%PolyOrder_h+1), sqrt(vol/fz)/dble(elem%PolyOrder_h+1) )
261 lambda0 = elem_aspect_eff * cs * filter_fac * he
263 zs(:) = lmesh%zlev(elem%Hslice(:,1),lmesh%EMap3Dto2D(ke))
264 z1(:) = lmesh%zlev(elem%Hslice(:,2),lmesh%EMap3Dto2D(ke))
265 dz(:) = max( lmesh%zlev(:,ke) - zs(elem%IndexH2Dto3D(:)), he )
268 lambda(:,ke) = sqrt( 1.0_rp / (1.0_rp / lambda0**2 + 1.0_rp / ( karman * ( dz(:) + 1.0e-4_rp ) )**2 ) )
279 DFQ1, DFQ2, DFQ3, & ! (out)
281 kh, qtrc, ddens, dens_hyd, &
282 dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, &
283 is_bound, cal_grad_dens )
291 real(rp),
intent(out) :: dfq1(elem%np,lmesh%nea)
292 real(rp),
intent(out) :: dfq2(elem%np,lmesh%nea)
293 real(rp),
intent(out) :: dfq3(elem%np,lmesh%nea)
294 real(rp),
intent(inout) :: drdx(elem%np,lmesh%nea)
295 real(rp),
intent(inout) :: drdy(elem%np,lmesh%nea)
296 real(rp),
intent(inout) :: drdz(elem%np,lmesh%nea)
297 real(rp),
intent(in) :: kh(elem%np,lmesh%nea)
298 real(rp),
intent(in) :: qtrc(elem%np,lmesh%nea)
299 real(rp),
intent(in) :: ddens(elem%np,lmesh%nea)
300 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
301 type(
sparsemat),
intent(in) :: dx, dy, dz
302 type(
sparsemat),
intent(in) :: sx, sy, sz
304 logical,
intent(in) :: is_bound(elem%nfptot,lmesh%ne)
305 logical,
intent(in) :: cal_grad_dens
307 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
308 real(rp) :: bnd_flux(elem%nfptot,lmesh%ne,3)
309 real(rp) :: bnd_flux_rho (elem%nfptot,lmesh%ne,3)
311 real(rp) :: dens(elem%np), rdens(elem%np)
312 real(rp) :: rhoxqtrc(elem%np)
318 call cal_bnd_flux_grad_qtrc( bnd_flux, bnd_flux_rho, &
319 qtrc, ddens, dens_hyd, &
320 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
321 lmesh%vmapM, lmesh%vmapP, &
322 lmesh, elem, is_bound, cal_grad_dens )
327 if ( cal_grad_dens )
then
329 do ke=lmesh%NeS, lmesh%NeE
330 dens(:) = dens_hyd(:,ke) + ddens(:,ke)
333 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux_rho(:,ke,1), liftdelflx )
334 drdx(:,ke) = lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:)
337 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux_rho(:,ke,2), liftdelflx )
338 drdy(:,ke) = lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:)
341 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux_rho(:,ke,3), liftdelflx )
342 drdz(:,ke) = lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
348 do ke=lmesh%NeS, lmesh%NeE
349 dens(:) = dens_hyd(:,ke) + ddens(:,ke)
350 rdens(:) = 1.0_rp / dens(:)
351 rhoxqtrc(:) = dens(:) * qtrc(:,ke)
355 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux(:,ke,1), liftdelflx )
356 dfq1(:,ke) = kh(:,ke) * ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - qtrc(:,ke) * drdx(:,ke) ) * rdens(:)
359 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux(:,ke,2), liftdelflx )
360 dfq2(:,ke) = kh(:,ke) * ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - qtrc(:,ke) * drdy(:,ke) ) * rdens(:)
363 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux(:,ke,3), liftdelflx )
364 dfq3(:,ke) = kh(:,ke) * ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - qtrc(:,ke) * drdz(:,ke) ) * rdens(:)
376 MOMX_t, MOMY_t, MOMZ_t, RHOT_t, & ! (out)
377 t11, t12, t13, t21, t22, t23, t31, t32, t33, &
380 ddens_, momx_, momy_, momz_, drhot_, &
381 dens_hyd, pres_hyd, pres_, pt_, &
382 dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, &
391 real(rp),
intent(out) :: momx_t(elem%np,lmesh%nea)
392 real(rp),
intent(out) :: momy_t(elem%np,lmesh%nea)
393 real(rp),
intent(out) :: momz_t(elem%np,lmesh%nea)
394 real(rp),
intent(out) :: rhot_t(elem%np,lmesh%nea)
395 real(rp),
intent(in) :: t11(elem%np,lmesh%nea)
396 real(rp),
intent(in) :: t12(elem%np,lmesh%nea)
397 real(rp),
intent(in) :: t13(elem%np,lmesh%nea)
398 real(rp),
intent(in) :: t21(elem%np,lmesh%nea)
399 real(rp),
intent(in) :: t22(elem%np,lmesh%nea)
400 real(rp),
intent(in) :: t23(elem%np,lmesh%nea)
401 real(rp),
intent(in) :: t31(elem%np,lmesh%nea)
402 real(rp),
intent(in) :: t32(elem%np,lmesh%nea)
403 real(rp),
intent(in) :: t33(elem%np,lmesh%nea)
404 real(rp),
intent(in) :: df1(elem%np,lmesh%nea)
405 real(rp),
intent(in) :: df2(elem%np,lmesh%nea)
406 real(rp),
intent(in) :: df3(elem%np,lmesh%nea)
407 real(rp),
intent(in) :: nu (elem%np,lmesh%nea)
408 real(rp),
intent(in) :: kh (elem%np,lmesh%nea)
409 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
410 real(rp),
intent(in) :: momx_ (elem%np,lmesh%nea)
411 real(rp),
intent(in) :: momy_ (elem%np,lmesh%nea)
412 real(rp),
intent(in) :: momz_ (elem%np,lmesh%nea)
413 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
414 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
415 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
416 real(rp),
intent(in) :: pres_(elem%np,lmesh%nea)
417 real(rp),
intent(in) :: pt_ (elem%np,lmesh%nea)
418 type(
sparsemat),
intent(in) :: dx, dy, dz
419 type(
sparsemat),
intent(in) :: sx, sy, sz
421 logical,
intent(in) :: is_bound(elem%nfptot,lmesh%ne)
425 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
426 real(rp) :: dens(elem%np)
427 real(rp) :: bnd_flux_mom(elem%nfptot,lmesh%ne,3)
428 real(rp) :: bnd_flux_rhot(elem%nfptot,lmesh%ne)
431 call cal_bnd_flux( bnd_flux_mom, bnd_flux_rhot, &
432 t11, t12, t13, t21, t22, t23, t31, t32, t33, &
435 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, &
436 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
437 lmesh%vmapM, lmesh%vmapP, lmesh, elem, is_bound )
442 do ke=lmesh%NeS, lmesh%NeE
443 dens(:) = dens_hyd(:,ke) + ddens_(:,ke)
449 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux_mom(:,ke,1), liftdelflx )
451 momx_t(:,ke) = lmesh%Escale(:,ke,1,1) * fx(:) + lmesh%Escale(:,ke,2,2) * fy(:) &
452 + lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
458 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux_mom(:,ke,2), liftdelflx )
460 momy_t(:,ke) = lmesh%Escale(:,ke,1,1) * fx(:) + lmesh%Escale(:,ke,2,2) * fy(:) &
461 + lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
467 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux_mom(:,ke,3), liftdelflx )
469 momz_t(:,ke) = lmesh%Escale(:,ke,1,1) * fx(:) + lmesh%Escale(:,ke,2,2) * fy(:) &
470 + lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
476 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * bnd_flux_rhot(:,ke), liftdelflx )
478 rhot_t(:,ke) = ( lmesh%Escale(:,ke,1,1) * fx(:) &
479 + lmesh%Escale(:,ke,2,2) * fy(:) &
480 + lmesh%Escale(:,ke,3,3) * fz(:) &
481 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
494 kh, ddens_,dens_hyd, &
495 dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, &
504 real(rp),
intent(out) :: rhoq_t(elem%np,lmesh%nea)
505 real(rp),
intent(in) :: dfq1(elem%np,lmesh%nea)
506 real(rp),
intent(in) :: dfq2(elem%np,lmesh%nea)
507 real(rp),
intent(in) :: dfq3(elem%np,lmesh%nea)
508 real(rp),
intent(in) :: kh (elem%np,lmesh%nea)
509 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
510 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
511 type(
sparsemat),
intent(in) :: dx, dy, dz
512 type(
sparsemat),
intent(in) :: sx, sy, sz
514 logical,
intent(in) :: is_bound(elem%nfptot,lmesh%ne)
518 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
519 real(rp) :: dens(elem%np), rhot(elem%np)
520 real(rp) :: del_flux(elem%nfptot,lmesh%ne)
523 call cal_bnd_flux_qtrc( del_flux, &
525 kh, ddens_, dens_hyd, &
526 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
527 lmesh%vmapM, lmesh%vmapP, &
528 lmesh, elem, is_bound )
533 do ke=lmesh%NeS, lmesh%NeE
534 dens(:) = dens_hyd(:,ke) + ddens_(:,ke)
540 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux(:,ke), liftdelflx )
542 rhoq_t(:,ke) = lmesh%Escale(:,ke,1,1) * fx(:) + lmesh%Escale(:,ke,2,2) * fy(:) &
543 + lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
553 subroutine cal_bnd_flux_grad_qtrc( bnd_flux, bnd_flux_rho, & ! (out)
554 qtrc_, ddens_, dens_hyd_, &
555 nx, ny, nz, vmapm, vmapp, lmesh, elem, is_bound, &
562 real(rp),
intent(out) :: bnd_flux(elem%nfptot*lmesh%ne,3)
563 real(rp),
intent(out) :: bnd_flux_rho(elem%nfptot*lmesh%ne,3)
564 real(rp),
intent(in) :: qtrc_(elem%np*lmesh%nea)
565 real(rp),
intent(in) :: ddens_(elem%np*lmesh%nea)
566 real(rp),
intent(in) :: dens_hyd_(elem%np*lmesh%nea)
567 real(rp),
intent(in) :: nx(elem%nfptot*lmesh%ne)
568 real(rp),
intent(in) :: ny(elem%nfptot*lmesh%ne)
569 real(rp),
intent(in) :: nz(elem%nfptot*lmesh%ne)
570 integer,
intent(in) :: vmapm(elem%nfptot*lmesh%ne)
571 integer,
intent(in) :: vmapp(elem%nfptot*lmesh%ne)
572 logical,
intent(in) :: is_bound(elem%nfptot*lmesh%ne)
573 logical,
intent(in) :: cal_grad_dens
577 real(rp) :: facx, facy, facz
578 real(rp) :: densm, densp
584 do i=1, elem%NfpTot * lmesh%Ne
585 im = vmapm(i); ip = vmapp(i)
588 if ( is_bound(i) )
then
601 densm = ddens_(im) + dens_hyd_(im)
602 densp = ddens_(ip) + dens_hyd_(ip)
604 if ( cal_grad_dens )
then
605 del = 0.5_rp * ( densp - densm )
607 bnd_flux_rho(i,1) = facx * del * nx(i)
608 bnd_flux_rho(i,2) = facy * del * ny(i)
609 bnd_flux_rho(i,3) = facz * del * nz(i)
612 del = 0.5_rp * ( densp * qtrc_(ip) - densm * qtrc_(im) )
613 bnd_flux(i,1) = facx * del * nx(i)
614 bnd_flux(i,2) = facy * del * ny(i)
615 bnd_flux(i,3) = facz * del * nz(i)
619 end subroutine cal_bnd_flux_grad_qtrc
622 subroutine cal_bnd_flux( bnd_flux_mom, bnd_flux_rhot, & ! (out)
623 t11, t12, t13, t21, t22, t23, t31, t32, t33, &
626 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, &
627 nx, ny, nz, vmapm, vmapp, lmesh, elem, is_bound )
633 real(rp),
intent(out) :: bnd_flux_mom (elem%nfptot*lmesh%ne,3)
634 real(rp),
intent(out) :: bnd_flux_rhot(elem%nfptot*lmesh%ne)
635 real(rp),
intent(in) :: t11(elem%np*lmesh%nea), t12(elem%np*lmesh%nea), t13(elem%np*lmesh%nea)
636 real(rp),
intent(in) :: t21(elem%np*lmesh%nea), t22(elem%np*lmesh%nea), t23(elem%np*lmesh%nea)
637 real(rp),
intent(in) :: t31(elem%np*lmesh%nea), t32(elem%np*lmesh%nea), t33(elem%np*lmesh%nea)
638 real(rp),
intent(in) :: df1(elem%np*lmesh%nea)
639 real(rp),
intent(in) :: df2(elem%np*lmesh%nea)
640 real(rp),
intent(in) :: df3(elem%np*lmesh%nea)
641 real(rp),
intent(in) :: nu (elem%np*lmesh%nea)
642 real(rp),
intent(in) :: kh (elem%np*lmesh%nea)
643 real(rp),
intent(in) :: ddens_(elem%np*lmesh%nea)
644 real(rp),
intent(in) :: momx_(elem%np*lmesh%nea)
645 real(rp),
intent(in) :: momy_(elem%np*lmesh%nea)
646 real(rp),
intent(in) :: momz_(elem%np*lmesh%nea)
647 real(rp),
intent(in) :: drhot_(elem%np*lmesh%nea)
648 real(rp),
intent(in) :: dens_hyd(elem%np*lmesh%nea)
649 real(rp),
intent(in) :: pres_hyd(elem%np*lmesh%nea)
650 real(rp),
intent(in) :: nx(elem%nfptot*lmesh%ne)
651 real(rp),
intent(in) :: ny(elem%nfptot*lmesh%ne)
652 real(rp),
intent(in) :: nz(elem%nfptot*lmesh%ne)
653 integer,
intent(in) :: vmapm(elem%nfptot*lmesh%ne)
654 integer,
intent(in) :: vmapp(elem%nfptot*lmesh%ne)
655 logical,
intent(in) :: is_bound(elem%nfptot*lmesh%ne)
658 real(rp) :: densm, densp
659 real(rp) :: taum_x, taup_x
660 real(rp) :: taum_y, taup_y
661 real(rp) :: taum_z, taup_z
662 real(rp) :: nx_, ny_, nz_
667 do i=1, elem%NfpTot * lmesh%Ne
668 im = vmapm(i); ip = vmapp(i)
670 densm = ddens_(im) + dens_hyd(im)
671 densp = ddens_(ip) + dens_hyd(ip)
673 if ( ip > elem%Np * lmesh%Ne .and. abs(nz(i)) > eps )
then
686 taum_x = t11(im) * nx_ + t12(im) * ny_ + t13(im) * nz_
687 taup_x = t11(ip) * nx_ + t12(ip) * ny_ + t13(ip) * nz_
689 taum_y = t21(im) * nx_ + t22(im) * ny_ + t23(im) * nz_
690 taup_y = t21(ip) * nx_ + t22(ip) * ny_ + t23(ip) * nz_
692 taum_z = t31(im) * nx_ + t32(im) * ny_ + t33(im) * nz_
693 taup_z = t31(ip) * nx_ + t32(ip) * ny_ + t33(ip) * nz_
695 bnd_flux_mom(i,1) = 0.5_rp * ( taup_x - taum_x )
696 bnd_flux_mom(i,2) = 0.5_rp * ( taup_y - taum_y )
697 bnd_flux_mom(i,3) = 0.5_rp * ( taup_z - taum_z )
698 bnd_flux_rhot(i) = 0.5_rp * ( densp * ( df1(ip) * nx_ + df2(ip) * ny_ + df3(ip) * nz_ ) &
699 - densm * ( df1(im) * nx_ + df2(im) * ny_ + df3(im) * nz_ ) )
703 end subroutine cal_bnd_flux
706 subroutine cal_bnd_flux_qtrc( bnd_flux, & ! (out)
708 kh, ddens_, dens_hyd, &
709 nx, ny, nz, vmapm, vmapp, lmesh, elem, is_bound )
715 real(rp),
intent(out) :: bnd_flux(elem%nfptot*lmesh%ne)
716 real(rp),
intent(in) :: dfq1(elem%np*lmesh%nea)
717 real(rp),
intent(in) :: dfq2(elem%np*lmesh%nea)
718 real(rp),
intent(in) :: dfq3(elem%np*lmesh%nea)
719 real(rp),
intent(in) :: kh (elem%np*lmesh%nea)
720 real(rp),
intent(in) :: ddens_(elem%np*lmesh%nea)
721 real(rp),
intent(in) :: dens_hyd(elem%np*lmesh%nea)
722 real(rp),
intent(in) :: nx(elem%nfptot*lmesh%ne)
723 real(rp),
intent(in) :: ny(elem%nfptot*lmesh%ne)
724 real(rp),
intent(in) :: nz(elem%nfptot*lmesh%ne)
725 integer,
intent(in) :: vmapm(elem%nfptot*lmesh%ne)
726 integer,
intent(in) :: vmapp(elem%nfptot*lmesh%ne)
727 logical,
intent(in) :: is_bound(elem%nfptot*lmesh%ne)
730 real(rp) :: densm, densp
731 real(rp) :: nx_, ny_, nz_
736 do i=1, elem%NfpTot * lmesh%Ne
737 im = vmapm(i); ip = vmapp(i)
739 densm = ddens_(im) + dens_hyd(im)
740 densp = ddens_(ip) + dens_hyd(ip)
742 if ( ip > elem%Np * lmesh%Ne .and. abs(nz(i)) > eps )
then
755 if ( is_bound(i) )
then
756 bnd_flux(i) = - densm * ( dfq1(im) * nx_ + dfq2(im) * ny_ + dfq3(im) * nz_ )
758 bnd_flux(i) = 0.5_rp * ( densp * ( dfq1(ip) * nx_ + dfq2(ip) * ny_ + dfq3(ip) * nz_ ) &
759 - densm * ( dfq1(im) * nx_ + dfq2(im) * ny_ + dfq3(im) * nz_ ) )
764 end subroutine cal_bnd_flux_qtrc
767 elemental function fact(dz, dx, dy)
769 real(rp),
intent(in) :: dz
770 real(rp),
intent(in) :: dx
771 real(rp),
intent(in) :: dy
774 real(rp),
parameter :: oot = -1.0_rp/3.0_rp
775 real(rp),
parameter :: fot = 5.0_rp/3.0_rp
776 real(rp),
parameter :: eot = 11.0_rp/3.0_rp
777 real(rp),
parameter :: tof = -3.0_rp/4.0_rp
778 real(rp) :: a1, a2, b1, b2, dmax
781 dmax = max(dz, dx, dy)
782 if ( dz == dmax )
then
785 else if ( dx == dmax )
then
795 fact = 1.736_rp * (a1*a2)**oot &
796 * ( 4.0_rp*p1(b1)*a1**oot + 0.222_rp*p2(b1)*a1**fot + 0.077*p3(b1)*a1**eot - 3.0_rp*b1 &
797 + 4.0_rp*p1(b2)*a2**oot + 0.222_rp*p2(b2)*a2**fot + 0.077*p3(b2)*a2**eot - 3.0_rp*b2 &
802 elemental function p1(z)
804 real(rp),
intent(in) :: z
807 real(rp),
parameter :: twooverthree = 2.0_rp / 3.0_rp
810 p1 = 2.5_rp * p2(z) - 1.5_rp * sin(z) * cos(z)**twooverthree
814 elemental function p2(z)
816 real(rp),
intent(in) :: z
820 p2 = 0.986_rp * z + 0.073_rp * z**2 - 0.418_rp * z**3 + 0.120_rp * z**4
824 elemental function p3(z)
826 real(rp),
intent(in) :: z
830 p3 = 0.976_rp * z + 0.188_rp * z**2 - 1.169_rp * z**3 + 0.755_rp * z**4 - 0.151_rp * z**5
module FElib / Fluid dyn solver / Atmosphere / Physics turbulence / Common
integer, parameter, public atmos_phy_tb_aux_t21_id
integer, parameter, public atmos_phy_tb_aux_scalar_num
integer, parameter, public atmos_phy_tb_aux_diffflx3_id
subroutine, public atm_phy_tb_dgm_common_cal_tend(momx_t, momy_t, momz_t, rhot_t, t11, t12, t13, t21, t22, t23, t31, t32, t33, df1, df2, df3, nu, kh, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, pres_, pt_, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, is_bound)
Calculate tendecies with turbulent model.
integer, parameter, public atmos_phy_tb_aux_hvec_num
integer, parameter, public atmos_phy_tb_diag_num
subroutine, public atm_phy_tb_dgm_common_setup_variables(tends, auxvars, diagvars, tends_manager, auxvar_manager, diagvar_manager, tends_num_tot, mesh3d)
subroutine, public atm_phy_tb_dgm_common_calc_lambda(lambda, cs, filter_fac, lmesh, elem, lmesh2d, elem2d)
integer, parameter, public atmos_phy_tb_aux_t33_id
integer, parameter, public atmos_phy_tb_tends_num1
integer, parameter, public atmos_phy_tb_diag_kh_id
integer, parameter, public atmos_phy_tb_momy_t_id
subroutine, public atm_phy_tb_dgm_common_cal_grad_qtrc(dfq1, dfq2, dfq3, drdx, drdy, drdz, kh, qtrc, ddens, dens_hyd, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, is_bound, cal_grad_dens)
Calculate parameterized diffusive mass flux of tracer with turbulent model.
integer, parameter, public atmos_phy_tb_aux_t12_id
integer, parameter, public atmos_phy_tb_aux_htensor_num
subroutine, public atm_phy_tb_dgm_common_cal_tend_qtrc(rhoq_t, dfq1, dfq2, dfq3, kh, ddens_, dens_hyd, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, is_bound)
Calculate tendecies of tracer density with turbulent model.
integer, parameter, public atmos_phy_tb_diag_nu_id
integer, parameter, public atmos_phy_tb_aux_num
integer, parameter, public atmos_phy_tb_momz_t_id
integer, parameter, public atmos_phy_tb_aux_t23_id
integer, parameter, public atmos_phy_tb_diag_tke_id
integer, parameter, public atmos_phy_tb_aux_t31_id
integer, parameter, public atmos_phy_tb_aux_t11_id
integer, parameter, public atmos_phy_tb_aux_t22_id
integer, parameter, public atmos_phy_tb_aux_t13_id
integer, parameter, public atmos_phy_tb_rhot_t_id
integer, parameter, public atmos_phy_tb_momx_t_id
integer, parameter, public atmos_phy_tb_aux_t32_id
integer, parameter, public atmos_phy_tb_aux_diffflx1_id
integer, parameter, public atmos_phy_tb_aux_diffflx2_id
module FElib / Element / Base
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Mesh / Base 3D
module FElib / Data / base
FElib / model framework / variable manager.
Module common / sparsemat.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type to manage a computational mesh (base type for 3D domain)
Derived type representing a field with 3D mesh.
Derived type to manage a sparse matrix.