11#include "scaleFElib.h"
21 use scale_const,
only: &
24 cpdry => const_cpdry, &
25 cvdry => const_cvdry, &
77 private :: vi_cal_del_flux_dyn
78 private :: vi_cal_del_flux_dyn_uv
84 namelist / param_atmos_dyn_nonhydro3d_rhot_hevi_common / &
92 read(io_fid_conf,nml=param_atmos_dyn_nonhydro3d_rhot_hevi_common,iostat=ierr)
94 log_info(
"ATMOS_DYN_nonhydro3d_rhot_hevi_common_setup",*)
'Not found namelist. Default used.'
95 elseif( ierr > 0 )
then
96 log_error(
"ATMOS_DYN_nonhydro3d_rhot_hevi_common_setup",*)
'Not appropriate names in namelist PARAM_ATMOS_DYN_NONHYDRO3D_RHOT_HEVI_COMMON. Check!'
99 log_nml(param_atmos_dyn_nonhydro3d_rhot_hevi_common)
112 DENS_t, MOMZ_t, RHOT_t, & ! (out)
114 prog_vars, prog_vars0, &
115 ddens00, momx00, momy00, momz00, drhot00, &
116 dens_hyd, pres_hyd, &
117 rtot, cptot, cvtot, gsqrtv, &
121 element3d_operation, &
124 dens, w, wt, pot, dpdrhot )
130 integer,
intent(in) :: im, jm
131 real(rp),
intent(out) :: dens_t(elem%np,lmesh%nea)
132 real(rp),
intent(out) :: momz_t(elem%np,lmesh%nea)
133 real(rp),
intent(out) :: rhot_t(elem%np,lmesh%nea)
134 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%nex*lmesh%ney,lmesh%nez)
135 real(rp),
intent(in) :: prog_vars (elem%np,lmesh%nex*lmesh%ney*lmesh%nez,
prgvar_num)
136 real(rp),
intent(in) :: prog_vars0 (elem%np,lmesh%nex*lmesh%ney*lmesh%nez,
prgvar_num)
137 real(rp),
intent(in) :: ddens00(elem%np,lmesh%nea)
138 real(rp),
intent(in) :: momx00 (elem%np,lmesh%nea)
139 real(rp),
intent(in) :: momy00 (elem%np,lmesh%nea)
140 real(rp),
intent(in) :: momz00 (elem%np,lmesh%nea)
141 real(rp),
intent(in) :: drhot00(elem%np,lmesh%nea)
142 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
143 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
144 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
145 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
146 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
147 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%ne)
148 real(rp),
intent(in) :: impl_fac
149 real(rp),
intent(in) :: dt
150 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%ne)
151 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%ne)
153 real(rp),
intent(out),
optional :: b(im,3,elem%nnode_v,jm,lmesh%ne)
154 real(rp),
intent(out),
optional :: dens(im,elem%nnode_v,jm,lmesh%ne)
155 real(rp),
intent(out),
optional :: w(im,elem%nnode_v,jm,lmesh%ne)
156 real(rp),
intent(out),
optional :: wt(im,elem%nnode_v,jm,lmesh%ne)
157 real(rp),
intent(out),
optional :: pot(im,elem%nnode_v,jm,lmesh%ne)
158 real(rp),
intent(out),
optional :: dpdrhot(im,elem%nnode_v,jm,lmesh%ne)
160 real(rp) :: flux(elem%np,3), dflux(elem%np,2,3)
161 real(rp) :: del_flux(elem%nfptot,
prgvar_num,lmesh%ne)
162 real(rp) :: dpres(elem%np), rhot(elem%np)
164 real(rp) :: rdens_, u_, v_, w_, pt_
165 real(rp) :: rgsqrtv(elem%np), rgsqrt(elem%np)
166 real(rp) :: gsqrt_, gsqrtdpres_, e33
168 integer :: ke_xy, ke_z
171 real(rp) :: drho(elem%np)
173 real(rp) :: gamm, rgamm
175 real(rp) :: rovp0, p0ovr
177 integer :: i, j, p, pp, pv
179 real(rp) :: cptot_ov_cvtot
181 logical :: flag_cal_b
185 rgamm = cvdry / cpdry
186 rp0 = 1.0_rp / pres00
188 p0ovr = pres00 / rdry
192 if (
present(b) )
then
198 call vi_cal_del_flux_dyn( del_flux, &
199 alph, prog_vars, prog_vars0, &
200 dens_hyd, pres_hyd, rtot, cptot, cvtot, &
201 lmesh%Gsqrt, lmesh%GsqrtH, lmesh%gam, gsqrtv, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
202 lmesh%normal_fn(:,:,3), vmapm, vmapp, elem%IndexH2Dto3D_bnd, &
203 lmesh, elem, lmesh%lcmesh2D, lmesh%lcmesh2D%refElem2D )
211 do ke_xy=1, lmesh%NeX*lmesh%NeY
212 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
213 ke2d = lmesh%EMap3Dto2D(ke)
216 rgsqrtv(p) = 1.0_rp / gsqrtv(p,ke)
221 flux(p,dens_vid) = prog_vars(p,ke,momz_vid) &
222 + gsqrtv(p,ke) * lmesh%GI3(p,ke,1) * prog_vars(p,ke,momx_vid) &
223 + gsqrtv(p,ke) * lmesh%GI3(p,ke,2) * prog_vars(p,ke,momy_vid)
226 rhot(:) = p0ovr * (pres_hyd(:,ke)/pres00)**rgamm &
227 + prog_vars(:,ke,rhot_vid)
229 pt_ = rhot(p) / ( prog_vars(p,ke,dens_vid) + dens_hyd(p,ke) )
230 flux(p,rhot_vid) = pt_ * flux(p,dens_vid)
234 flux(p,momz_vid) = pres00 * ( rtot(p,ke) * rp0 * rhot(p) )**(cptot(p,ke) / cvtot(p,ke)) &
239 call element3d_operation%Dz( flux(:,dens_vid), dflux(:,1,dens_vid) )
240 call element3d_operation%Lift( del_flux(:,dens_vid,ke), dflux(:,2,dens_vid) )
242 call element3d_operation%Dz( flux(:,rhot_vid), dflux(:,1,rhot_vid) )
243 call element3d_operation%Lift( del_flux(:,rhot_vid,ke), dflux(:,2,rhot_vid) )
245 call element3d_operation%Dz( flux(:,momz_vid), dflux(:,1,momz_vid) )
246 call element3d_operation%Lift( del_flux(:,momz_vid,ke), dflux(:,2,momz_vid) )
250 e33 = lmesh%Escale(p,ke,3,3)
253 e33 * dflux(p,1,dens_vid) &
254 + dflux(p,2,dens_vid) ) * rgsqrtv(p)
257 e33 * dflux(p,1,rhot_vid) &
258 + dflux(p,2,rhot_vid) ) * rgsqrtv(p)
261 call element3d_operation%VFilterPM1( prog_vars(:,ke,dens_vid), &
264 e33 = lmesh%Escale(p,ke,3,3)
267 e33 * dflux(p,1,momz_vid) &
268 + dflux(p,2,momz_vid) ) * rgsqrtv(p) &
272 if ( flag_cal_b )
then
274 do pv=1, elem%Nnode_v
276 p = i + (j-1)*im + (pv-1)*im*jm
277 dens(i,pv,j,ke) = dens_hyd(p,ke) + prog_vars(p,ke,dens_vid)
278 pot(i,pv,j,ke) = rhot(p) / dens(i,pv,j,ke)
279 w(i,pv,j,ke) = prog_vars(p,ke,momz_vid) / dens(i,pv,j,ke)
280 wt(i,pv,j,ke) = flux(p,dens_vid) / dens(i,pv,j,ke)
285 do pv=1, elem%Nnode_v
287 p = i + (j-1)*im + (pv-1)*im*jm
288 cptot_ov_cvtot = cptot(p,ke) / cvtot(p,ke)
289 dpdrhot(i,pv,j,ke) = cptot_ov_cvtot &
290 * pres00 * ( rtot(p,ke) / pres00 * rhot(p) )**cptot_ov_cvtot &
301 if ( flag_cal_b )
then
304 do pv=1, elem%Nnode_v
307 p = i + (j-1)*im + (pv-1)*im*jm
308 b(i,1,pv,j,ke) = impl_fac * dens_t(p,ke) &
309 - prog_vars(p,ke,dens_vid) &
311 b(i,2,pv,j,ke) = impl_fac * momz_t(p,ke) &
312 - prog_vars(p,ke,momz_vid) &
314 b(i,3,pv,j,ke) = impl_fac * rhot_t(p,ke) &
315 - prog_vars(p,ke,rhot_vid) &
330 b, DENS, W, WT, POT, DPDRHOT, alph, &
331 GsqrtV, IntrpMat_VPOrdM1, &
333 vmapM, vmapP, lmesh, elem, im, jm )
340 integer,
intent(in) :: im
341 integer,
intent(in) :: jm
342 real(rp),
intent(inout) :: prog_vars (elem%nnode_h1d**2,elem%nnode_v,lmesh%nex*lmesh%ney,lmesh%nez,
prgvar_num)
343 real(rp),
intent(inout) :: b(im,3*elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
344 real(rp),
intent(in) :: dens(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
345 real(rp),
intent(in) :: w(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
346 real(rp),
intent(in) :: wt(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
347 real(rp),
intent(in) :: pot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
348 real(rp),
intent(in) :: dpdrhot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
349 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%ne)
350 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%ne)
352 real(rp),
intent(in) :: impl_fac
353 real(rp),
intent(in) :: dt
354 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%ne)
355 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%ne)
357 real(rp) :: tmp_v3(3)
358 real(rp) :: bndmatd(im,3*elem%nnode_v,3*elem%nnode_v,jm,lmesh%ne2d)
359 real(rp) :: bndmatl(im,3*elem%nnode_v,3,jm,lmesh%ne2d)
360 real(rp) :: g(im,3*elem%nnode_v,3,jm,lmesh%ne2d,lmesh%nez)
361 integer :: ipiv(im,3*elem%nnode_v)
363 integer :: colmask(elem%nnode_v)
364 real(rp) :: intrpmat_vpordm1_(elem%nnode_v,elem%nnode_v)
365 real(rp) :: dx3(elem%nnode_v,elem%nnode_v)
366 real(rp) :: id(elem%nnode_v,elem%nnode_v)
368 integer :: ke_xy, ke_z
369 integer :: i, j, ij, pv, pv2
372 integer :: p, p1, p2, p3
376 colmask(:) = elem%Colmask(:,ij)
377 do pv2=1, elem%Nnode_v
378 do pv=1, elem%Nnode_v
379 p = ij + (pv-1)*elem%Nnode_h1D**2
380 dx3(pv,pv2) = impl_fac * elem%Dx3(p,colmask(pv2))
381 intrpmat_vpordm1_(pv,pv2) = impl_fac * grav *
intrpmat_vpordm1(p,colmask(pv2))
386 do pv=1, elem%Nnode_v
392 bndmatl, bndmatd, g(:,:,:,:,:,ke_z), &
393 dens, w, wt, pot, dpdrhot, alph, &
394 gsqrtv, lmesh%normal_fn(:,:,3), id, dx3, intrpmat_vpordm1_, &
395 impl_fac, dt, lmesh, elem, im, jm, ke_z )
397 call prof_rapstart(
'hevi_cal_vi_lin', 3)
401 do ke_xy=1, lmesh%NeX * lmesh%NeY
403 do pv=1, 3*elem%Nnode_v
405 p1 = 1 + (elem%Nnode_v-1)*3
409 tmp_v3(:) = bndmatl(i,pv,:,j,ke_xy)
410 bndmatd(i,pv,1,j,ke_xy) = bndmatd(i,pv,1,j,ke_xy) &
411 - tmp_v3(1) * g(i,p1,1,j,ke_xy,ke_z-1) &
412 - tmp_v3(2) * g(i,p2,1,j,ke_xy,ke_z-1) &
413 - tmp_v3(3) * g(i,p3,1,j,ke_xy,ke_z-1)
414 bndmatd(i,pv,2,j,ke_xy) = bndmatd(i,pv,2,j,ke_xy) &
415 - tmp_v3(1) * g(i,p1,2,j,ke_xy,ke_z-1) &
416 - tmp_v3(2) * g(i,p2,2,j,ke_xy,ke_z-1) &
417 - tmp_v3(3) * g(i,p3,2,j,ke_xy,ke_z-1)
418 bndmatd(i,pv,3,j,ke_xy) = bndmatd(i,pv,3,j,ke_xy) &
419 - tmp_v3(1) * g(i,p1,3,j,ke_xy,ke_z-1) &
420 - tmp_v3(2) * g(i,p2,3,j,ke_xy,ke_z-1) &
421 - tmp_v3(3) * g(i,p3,3,j,ke_xy,ke_z-1)
422 b(i,pv,j,ke_xy,ke_z) = b(i,pv,j,ke_xy,ke_z) &
423 - tmp_v3(1) * b(i,p1,j,ke_xy,ke_z-1) &
424 - tmp_v3(2) * b(i,p2,j,ke_xy,ke_z-1) &
425 - tmp_v3(3) * b(i,p3,j,ke_xy,ke_z-1)
433 call prof_rapstart(
'hevi_cal_vi_lin_core', 3)
434 call linkernel_solve_var3( bndmatd, b(:,:,:,:,ke_z), g(:,:,:,:,:,ke_z), &
435 elem%Nnode_v, im, jm, lmesh%Ne2D, ke_z == lmesh%NeZ )
437 call prof_rapend(
'hevi_cal_vi_lin_core', 3)
438 call prof_rapend(
'hevi_cal_vi_lin', 3)
441 call prof_rapstart(
'hevi_cal_vi_lin', 3)
443 do ke_z=lmesh%NeZ-1, 1, -1
445 do ke_xy=1, lmesh%NeX * lmesh%NeY
447 do pv=1, 3*elem%Nnode_v
449 tmp_v3(:) = g(i,pv,:,j,ke_xy,ke_z)
450 b(i,pv,j,ke_xy,ke_z) = b(i,pv,j,ke_xy,ke_z) &
451 - tmp_v3(1) * b(i,1,j,ke_xy,ke_z+1) &
452 - tmp_v3(2) * b(i,2,j,ke_xy,ke_z+1) &
453 - tmp_v3(3) * b(i,3,j,ke_xy,ke_z+1)
461 do ke_xy=1, lmesh%NeX * lmesh%NeY
463 do pv=1, elem%Nnode_v
467 prog_vars(pp,pv,ke_xy,ke_z,dens_vid) = prog_vars(pp,pv,ke_xy,ke_z,dens_vid) + b(i,p1 ,j,ke_xy,ke_z)
468 prog_vars(pp,pv,ke_xy,ke_z,momz_vid) = prog_vars(pp,pv,ke_xy,ke_z,momz_vid) + b(i,p1+1,j,ke_xy,ke_z)
469 prog_vars(pp,pv,ke_xy,ke_z,rhot_vid) = prog_vars(pp,pv,ke_xy,ke_z,rhot_vid) + b(i,p1+2,j,ke_xy,ke_z)
476 call prof_rapend(
'hevi_cal_vi_lin', 3)
483 MOMX_t, MOMY_t, & ! (out)
485 prog_vars, prog_vars0, &
486 ddens00, momx00, momy00, momz00, drhot00, &
487 dens_hyd, pres_hyd, &
488 rtot, cptot, cvtot, gsqrtv, &
492 element3d_operation, &
500 real(rp),
intent(out) :: momx_t(elem%np,lmesh%nea)
501 real(rp),
intent(out) :: momy_t(elem%np,lmesh%nea)
502 real(rp),
intent(out) :: alph(elem%nfptot,lmesh%ne)
503 real(rp),
intent(in) :: prog_vars (elem%np,lmesh%ne,
prgvar_num)
504 real(rp),
intent(in) :: prog_vars0 (elem%np,lmesh%ne,
prgvar_num)
505 real(rp),
intent(in) :: ddens00(elem%np,lmesh%nea)
506 real(rp),
intent(in) :: momx00 (elem%np,lmesh%nea)
507 real(rp),
intent(in) :: momy00 (elem%np,lmesh%nea)
508 real(rp),
intent(in) :: momz00 (elem%np,lmesh%nea)
509 real(rp),
intent(in) :: drhot00(elem%np,lmesh%nea)
510 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
511 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
512 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
513 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
514 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
515 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%ne)
516 real(rp),
intent(in) :: impl_fac
517 real(rp),
intent(in) :: dt
518 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%ne)
519 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%ne)
521 integer,
intent(in) :: im, jm
522 real(rp),
intent(out),
optional :: b1d_ij_uv(im*elem%nnode_v,2,jm,lmesh%ne)
525 real(rp) :: liftdelflx(elem%np,2)
526 real(rp) :: del_flux(elem%nfptot,2,lmesh%ne)
527 integer :: ke_xy, ke_z
531 integer :: i, j, p, pp, pv
534 call vi_cal_del_flux_dyn_uv( del_flux, alph, &
535 prog_vars, prog_vars0, &
536 dens_hyd, pres_hyd, rtot, cptot, cvtot, &
537 lmesh%Gsqrt, lmesh%GIJ(:,:,1,1), lmesh%GIJ(:,:,1,2), lmesh%GIJ(:,:,2,2), &
538 lmesh%GsqrtH, lmesh%gam, gsqrtv, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
539 lmesh%normal_fn(:,:,3), vmapm, vmapp, elem%IndexH2Dto3D_bnd, &
540 lmesh, elem, lmesh%lcmesh2D, lmesh%lcmesh2D%refElem2D )
547 do ke_xy=1, lmesh%NeX*lmesh%NeY
548 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
549 ke2d = lmesh%EMap3Dto2D(ke)
551 call element3d_operation%Lift( del_flux(:,1,ke), liftdelflx(:,1) )
552 call element3d_operation%Lift( del_flux(:,2,ke), liftdelflx(:,2) )
555 rgsqrtv = 1.0_rp / gsqrtv(fp,ke)
556 momx_t(fp,ke) = - liftdelflx(fp,1) * rgsqrtv
557 momy_t(fp,ke) = - liftdelflx(fp,2) * rgsqrtv
563 if (
present( b1d_ij_uv ) )
then
566 do pv=1, elem%Nnode_v
570 p = i + (j-1)*im + (pv-1)*im*jm
571 b1d_ij_uv(pp,1,j,ke) = impl_fac * momx_t(p,ke) &
572 - prog_vars(p,ke,momx_vid) &
574 b1d_ij_uv(pp,2,j,ke) = impl_fac * momy_t(p,ke) &
575 - prog_vars(p,ke,momy_vid) &
593 vmapM, vmapP, lmesh, elem, im, jm )
599 integer,
intent(in) :: im
600 integer,
intent(in) :: jm
601 real(rp),
intent(inout) :: prog_vars(elem%nnode_h1d**2,elem%nnode_v,lmesh%nex*lmesh%ney,lmesh%nez,
prgvar_num)
602 real(rp),
intent(inout) :: b_uv(im*elem%nnode_v,2,jm,lmesh%ne2d,lmesh%nez)
603 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%ne)
604 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%ne)
605 real(rp),
intent(in) :: impl_fac
606 real(rp),
intent(in) :: dt
607 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%ne)
608 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%ne)
611 real(rp) :: bndmatd_uv(im*elem%nnode_v,elem%nnode_v,jm,lmesh%ne2d)
612 real(rp) :: bndmatl_uv(im*elem%nnode_v,jm,lmesh%ne2d)
613 real(rp) :: g_uv(im*elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
614 integer :: ipiv_uv(im*elem%nnode_v)
616 integer :: ke_xy, ke_z
620 integer :: p1, p2, p3
625 bndmatl_uv, bndmatd_uv, g_uv(:,:,:,ke_z), &
626 alph, gsqrtv, impl_fac, dt, lmesh, elem, im, jm, vmapm, vmapp, &
629 call prof_rapstart(
'hevi_cal_vi_lin_uv', 3)
632 do ke_xy=1, lmesh%NeX * lmesh%NeY
634 do pv=1, elem%Nnode_v
637 p2 = i + (elem%Nnode_v-1)*im
638 tmp = bndmatl_uv(pp,j,ke_xy)
639 bndmatd_uv(pp,1,j,ke_xy) = bndmatd_uv(pp,1,j,ke_xy) - tmp * g_uv(p2,j,ke_xy,ke_z-1)
640 b_uv(pp,1,j,ke_xy,ke_z) = b_uv(pp,1,j,ke_xy,ke_z) - tmp * b_uv(p2,1,j,ke_xy,ke_z-1)
641 b_uv(pp,2,j,ke_xy,ke_z) = b_uv(pp,2,j,ke_xy,ke_z) - tmp * b_uv(p2,2,j,ke_xy,ke_z-1)
648 call linkernel_solve_uv( bndmatd_uv, b_uv(:,:,:,:,ke_z), g_uv(:,:,:,ke_z), &
649 elem%Nnode_v, im, jm, lmesh%Ne2D, ke_z==lmesh%NeZ )
651 call prof_rapend(
'hevi_cal_vi_lin_uv', 3)
653 call prof_rapstart(
'hevi_cal_vi_lin_uv', 3)
654 do ke_z=lmesh%NeZ-1, 1, -1
656 do ke_xy=1, lmesh%NeX * lmesh%NeY
658 do pv=1, elem%Nnode_v
662 tmp = g_uv(pp,j,ke_xy,ke_z)
663 b_uv(pp,1,j,ke_xy,ke_z) = b_uv(pp,1,j,ke_xy,ke_z) - tmp * b_uv(p2,1,j,ke_xy,ke_z+1)
664 b_uv(pp,2,j,ke_xy,ke_z) = b_uv(pp,2,j,ke_xy,ke_z) - tmp * b_uv(p2,2,j,ke_xy,ke_z+1)
672 do ke_xy=1, lmesh%NeX * lmesh%NeY
674 do pv=1, elem%Nnode_v
678 prog_vars(pp,pv,ke_xy,ke_z,momx_vid) = prog_vars(pp,pv,ke_xy,ke_z,momx_vid) + b_uv(p,1,j,ke_xy,ke_z)
679 prog_vars(pp,pv,ke_xy,ke_z,momy_vid) = prog_vars(pp,pv,ke_xy,ke_z,momy_vid) + b_uv(p,2,j,ke_xy,ke_z)
686 call prof_rapend(
'hevi_cal_vi_lin_uv', 3)
694 BndMatL, BndMatD, BndMatU, & ! (out)
695 dens, w, wt, pot, dpdrhot, &
697 id, fac_dx3, fac_intrpmat_vpordm1, &
699 lmesh, elem, im, jm, &
704 integer,
intent(in) :: im, jm
705 real(rp),
intent(out) :: bndmatl(im,3,elem%nnode_v,3,jm,lmesh%ne2d)
706 real(rp),
intent(out) :: bndmatd(im,3,elem%nnode_v,3,elem%nnode_v,jm,lmesh%ne2d)
707 real(rp),
intent(out) :: bndmatu(im,3,elem%nnode_v,3,jm,lmesh%ne2d)
708 real(rp),
intent(in) :: dens(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
709 real(rp),
intent(in) :: w(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
710 real(rp),
intent(in) :: wt(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
711 real(rp),
intent(in) :: pot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
712 real(rp),
intent(in) :: dpdrhot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
713 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%ne)
714 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%ne)
715 real(rp),
intent(in) :: nz(elem%nfptot,lmesh%ne)
716 real(rp),
intent(in) :: id(elem%nnode_v,elem%nnode_v)
717 real(rp),
intent(in) :: fac_dx3(elem%nnode_v,elem%nnode_v)
718 real(rp),
intent(in) :: fac_intrpmat_vpordm1(elem%nnode_v,elem%nnode_v)
719 real(rp),
intent(in) :: impl_fac
720 real(rp),
intent(in) :: dt
721 integer,
intent(in) :: ke_z
723 real(rp) :: fac_dz(im,elem%nnode_v,elem%nnode_v)
724 real(rp) :: tmp1(im,elem%nnode_v)
725 real(rp) :: tmp2(im,elem%nnode_v)
727 integer :: p, p2, pv, pv1, pv2
730 integer :: ke_z2, ke_2
738 integer,
parameter :: dens_vid_lc = 1
739 integer,
parameter :: momz_vid_lc = 2
740 integer,
parameter :: rhot_vid_lc = 3
744 call prof_rapstart(
'hevi_cal_vi_matbnd', 3)
749 do ke2d=1, lmesh%Ne2D
751 ke = ke2d + (ke_z-1)*lmesh%Ne2D
753 do pv2=1, elem%Nnode_v
754 do pv=1, elem%Nnode_v
757 p = ij + (pv-1)*im*jm
758 fac_dz(i,pv,pv2) = lmesh%Escale(p,ke,3,3) / gsqrtv(p,ke) * fac_dx3(pv,pv2)
763 do pv2=1, elem%Nnode_v
764 do pv=1, elem%Nnode_v
767 bndmatd(i,dens_vid_lc,pv,dens_vid_lc,pv2,j,ke2d) = id(pv,pv2)
768 bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv2,j,ke2d) = fac_dz(i,pv,pv2)
769 bndmatd(i,dens_vid_lc,pv,rhot_vid_lc,pv2,j,ke2d) = 0.0_rp
772 bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv2,j,ke2d) = id(pv,pv2)
774 bndmatd(i,momz_vid_lc,pv,dens_vid_lc,pv2,j,ke2d) = fac_intrpmat_vpordm1(pv,pv2)
776 bndmatd(i,momz_vid_lc,pv,rhot_vid_lc,pv2,j,ke2d) = fac_dz(i,pv,pv2) * dpdrhot(i,pv2,j,ke2d,ke_z)
779 bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv2,j,ke2d) = - fac_dz(i,pv,pv2) * pot(i,pv2,j,ke2d,ke_z) * wt(i,pv2,j,ke2d,ke_z)
780 bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv2,j,ke2d) = fac_dz(i,pv,pv2) * pot(i,pv2,j,ke2d,ke_z)
781 bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv2,j,ke2d) = id(pv,pv2) + fac_dz(i,pv,pv2) * wt(i,pv2,j,ke2d,ke_z)
788 ke_z2 = max(ke_z-1,1)
789 pv1 = 1; pv2 = elem%Nnode_v; f2 = 2
791 ke_z2 = min(ke_z+1,lmesh%NeZ)
792 pv1 = elem%Nnode_v; pv2 = 1; f2 = 1
794 ke_2 = ke2d + (ke_z2-1)*lmesh%Ne2D
796 if ( (ke_z == 1 .and. f1==1) .or. (ke_z == lmesh%NeZ .and. f1==elem%Nfaces_v) )
then
803 do pv=1, elem%Nnode_v
806 fp = elem%Nfp_h * elem%Nfaces_h + (f1-1)*elem%Nfp_v + ij
807 fp2 = elem%Nfp_h * elem%Nfaces_h + (f2-1)*elem%Nfp_v + ij
808 p = ij + (pv-1)*im*jm
811 fac = 0.5_rp * impl_fac / gsqrtv(p,ke) * elem%Lift(p,fp) * lmesh%Fscale(fp,ke)
812 tmp1(i,pv) = fac * max( alph(fp,ke), alph(fp2,ke_2) )
813 tmp2(i,pv) = fac * nz(fp,ke)
820 do pv=1, elem%Nnode_v
823 bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) + 2.0_rp * tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z) * wt(i,pv1,j,ke2d,ke_z)
826 bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - 2.0_rp * tmp2(i,pv)
827 bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) + 2.0_rp * tmp1(i,pv)
828 bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - 2.0_rp * tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z)
831 bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) - 2.0_rp * tmp2(i,pv) * wt(i,pv1,j,ke2d,ke_z)
836 do pv=1, elem%Nnode_v
839 bndmatd(i,dens_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) = bndmatd(i,dens_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) + tmp1(i,pv)
840 bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) + tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z) * wt(i,pv1,j,ke2d,ke_z)
843 bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - tmp2(i,pv)
844 bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) + tmp1(i,pv)
845 bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z)
848 bndmatd(i,momz_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) = bndmatd(i,momz_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) - tmp2(i,pv) * dpdrhot(i,pv1,j,ke2d,ke_z)
849 bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) + tmp1(i,pv) &
850 - tmp2(i,pv) * wt(i,pv1,j,ke2d,ke_z)
854 do pv=1, elem%Nnode_v
857 bndmatl(i,dens_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp1(i,pv)
858 bndmatl(i,momz_vid_lc,pv,dens_vid_lc,j,ke2d) = 0.0_rp
859 bndmatl(i,rhot_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2) * wt(i,pv2,j,ke2d,ke_z2)
861 bndmatl(i,dens_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv)
862 bndmatl(i,momz_vid_lc,pv,momz_vid_lc,j,ke2d) = - tmp1(i,pv)
863 bndmatl(i,rhot_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2)
865 bndmatl(i,dens_vid_lc,pv,rhot_vid_lc,j,ke2d) = 0.0_rp
866 bndmatl(i,momz_vid_lc,pv,rhot_vid_lc,j,ke2d) = + tmp2(i,pv) * dpdrhot(i,pv2,j,ke2d,ke_z2)
867 bndmatl(i,rhot_vid_lc,pv,rhot_vid_lc,j,ke2d) = - tmp1(i,pv) &
868 + tmp2(i,pv) * wt(i,pv2,j,ke2d,ke_z2)
872 do pv=1, elem%Nnode_v
875 bndmatu(i,dens_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp1(i,pv)
876 bndmatu(i,momz_vid_lc,pv,dens_vid_lc,j,ke2d) = 0.0_rp
877 bndmatu(i,rhot_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2) * wt(i,pv2,j,ke2d,ke_z2)
879 bndmatu(i,dens_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv)
880 bndmatu(i,momz_vid_lc,pv,momz_vid_lc,j,ke2d) = - tmp1(i,pv)
881 bndmatu(i,rhot_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2)
883 bndmatu(i,dens_vid_lc,pv,rhot_vid_lc,j,ke2d) = 0.0_rp
884 bndmatu(i,momz_vid_lc,pv,rhot_vid_lc,j,ke2d) = + tmp2(i,pv) * dpdrhot(i,pv2,j,ke2d,ke_z2)
885 bndmatu(i,rhot_vid_lc,pv,rhot_vid_lc,j,ke2d) = - tmp1(i,pv) &
886 + tmp2(i,pv) * wt(i,pv2,j,ke2d,ke_z2)
898 call prof_rapend(
'hevi_cal_vi_matbnd', 3)
905 BndMatL_uv, BndMatD_uv, BndMatU_uv, & ! (out)
908 lmesh, elem, im, jm, &
913 integer,
intent(in) :: im, jm
914 real(rp),
intent(out) :: bndmatl_uv(im,elem%nnode_v,jm,lmesh%ne2d)
915 real(rp),
intent(out) :: bndmatd_uv(im,elem%nnode_v,elem%nnode_v,jm,lmesh%ne2d)
916 real(rp),
intent(out) :: bndmatu_uv(im,elem%nnode_v,jm,lmesh%ne2d)
917 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%ne)
918 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%ne)
919 real(rp),
intent(in) :: impl_fac
920 real(rp),
intent(in) :: dt
921 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%ne)
922 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%ne)
923 integer,
intent(in) :: ke_z
925 integer :: colmask(elem%nnode_v)
926 real(rp) :: id(elem%nnode_v,elem%nnode_v)
927 real(rp) :: dd(elem%nnode_v)
928 real(rp) :: tmp1(im,elem%nnode_v)
930 integer :: p, pv, pv1, pv2
933 integer :: ke_z2, ke_2
941 call prof_rapstart(
'hevi_cal_vi_matbnd_uv', 3)
950 do ke2d=1, lmesh%Ne2D
952 ke = ke2d + (ke_z-1)*lmesh%Ne2D
954 do pv2=1, elem%Nnode_v
955 do pv=1, elem%Nnode_v
957 bndmatd_uv(i,pv,pv2,j,ke2d) = id(pv,pv2)
964 ke_z2 = max(ke_z-1,1)
967 ke_z2 = min(ke_z+1,lmesh%NeZ)
968 pv1 = elem%Nnode_v; f2 = 1
970 ke_2 = ke2d + (ke_z2-1)*lmesh%Ne2D
972 if ( (ke_z == 1 .and. f1==1) .or. (ke_z == lmesh%NeZ .and. f1==elem%Nfaces_v) )
then
979 do pv=1, elem%Nnode_v
982 fp = elem%Nfp_h * elem%Nfaces_h + (f1-1)*elem%Nfp_v + ij
983 fp2 = elem%Nfp_h * elem%Nfaces_h + (f2-1)*elem%Nfp_v + ij
984 p = ij + (pv-1)*im*jm
987 fac = 0.5_rp * impl_fac / gsqrtv(p,ke)
988 tmp1(i,pv) = fac * elem%Lift(p,fp) * lmesh%Fscale(fp,ke) &
989 * max( alph(fp,ke), alph(fp2,ke_2) )
995 bndmatd_uv(:,:,pv1,j,ke2d) = bndmatd_uv(:,:,pv1,j,ke2d) + tmp1(:,:)
997 bndmatl_uv(:,:,j,ke2d) = - tmp1(:,:)
999 bndmatu_uv(:,:,j,ke2d) = - tmp1(:,:)
1008 call prof_rapend(
'hevi_cal_vi_matbnd_uv', 3)
1016 subroutine vi_cal_del_flux_dyn_uv( del_flux, alph, & ! (out)
1018 dens_hyd, pres_hyd, rtot, cptot, cvtot, &
1019 gsqrt, g11, g12, g22, gsqrth, gam, gsqrtv, g13, g23, &
1020 nz, vmapm, vmapp, im2dto3d, lmesh, elem, lmesh2d, elem2d )
1028 real(rp),
intent(out) :: del_flux(elem%nfptot,2,lmesh%ne)
1029 real(rp),
intent(out) :: alph(elem%nfptot,lmesh%ne)
1030 real(rp),
intent(in) :: pvars_ (elem%np*lmesh%ne,
prgvar_num)
1031 real(rp),
intent(in) :: pvars0_(elem%np*lmesh%ne,
prgvar_num)
1032 real(rp),
intent(in) :: dens_hyd(elem%np*lmesh%nea)
1033 real(rp),
intent(in) :: pres_hyd(elem%np*lmesh%nea)
1034 real(rp),
intent(in) :: rtot(elem%np*lmesh%nea)
1035 real(rp),
intent(in) :: cptot(elem%np*lmesh%nea)
1036 real(rp),
intent(in) :: cvtot(elem%np*lmesh%nea)
1037 real(rp),
intent(in) :: gsqrt(elem%np*lmesh%nea)
1038 real(rp),
intent(in) :: g11(elem2d%np,lmesh2d%ne)
1039 real(rp),
intent(in) :: g12(elem2d%np,lmesh2d%ne)
1040 real(rp),
intent(in) :: g22(elem2d%np,lmesh2d%ne)
1041 real(rp),
intent(in) :: gsqrth(elem2d%np,lmesh2d%ne)
1042 real(rp),
intent(in) :: gam(elem%np*lmesh%nea)
1043 real(rp),
intent(in) :: gsqrtv(elem%np*lmesh%ne)
1044 real(rp),
intent(in) :: g13(elem%np*lmesh%nea)
1045 real(rp),
intent(in) :: g23(elem%np*lmesh%nea)
1046 real(rp),
intent(in) :: nz(elem%nfptot,lmesh%ne)
1047 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%ne)
1048 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%ne)
1049 integer,
intent(in) :: im2dto3d(elem%nfptot)
1051 integer :: fp, ke, ke2d
1052 integer :: ip(elem%nfptot), im(elem%nfptot)
1053 real(rp) :: momx0(elem%nfptot,2)
1054 real(rp) :: momy0(elem%nfptot,2)
1055 real(rp) :: drhot0(elem%nfptot,2)
1056 real(rp) :: rhot_hyd(elem%nfptot,2)
1057 real(rp) :: cptot_ov_cvtot(elem%nfptot,2)
1058 real(rp) :: rtot_(elem%nfptot,2)
1059 real(rp) :: wt0(elem%nfptot,2)
1060 real(rp) :: pres0(elem%nfptot,2)
1061 real(rp) :: rdens0(elem%nfptot,2)
1063 real(rp) :: gsqrt_(elem%nfptot,2)
1064 real(rp) :: gsqrtv_(elem%nfptot,2)
1065 real(rp) :: rgsqrtv(elem%nfptot,2)
1066 real(rp) :: rgam2(elem%nfptot,2)
1067 real(rp) :: g13_(elem%nfptot,2)
1068 real(rp) :: g23_(elem%nfptot,2)
1069 real(rp) :: gxz_(elem%nfptot,2)
1070 real(rp) :: gyz_(elem%nfptot,2)
1071 real(rp) :: g11_, g12_, g22_
1072 real(rp) :: gnn_m, gnn_p
1076 real(rp) :: gamm, rgamm, pres0ovrdry, rp0
1078 integer,
parameter :: in = 1
1079 integer,
parameter :: ex = 2
1082 gamm = cpdry / cvdry
1083 rgamm = cvdry / cpdry
1084 pres0ovrdry = pres00 / rdry
1085 rp0 = 1.0_rp / pres00
1095 do ke=lmesh%NeS, lmesh%NeE
1096 ke2d = lmesh%EMap3Dto2D(ke)
1097 im(:) = vmapm(:,ke); ip(:) = vmapp(:,ke)
1099 gsqrt_(:,in) = gsqrt(im)
1100 gsqrt_(:,ex) = gsqrt(ip)
1102 rgam2(:,in) = 1.0_rp / gam(im)**2
1103 rgam2(:,ex) = 1.0_rp / gam(ip)**2
1104 gsqrtv_(:,in) = gsqrtv(im)
1105 gsqrtv_(:,ex) = gsqrtv(ip)
1106 rgsqrtv(:,:) = 1.0_rp / gsqrtv_(:,:)
1108 g13_(:,in) = g13(im)
1109 g13_(:,ex) = g13(ip)
1110 g23_(:,in) = g23(im)
1111 g23_(:,ex) = g23(ip)
1113 momx0(:,in) = pvars0_(im(:),momx_vid)
1114 momx0(:,ex) = pvars0_(ip(:),momx_vid)
1115 momy0(:,in) = pvars0_(im(:),momy_vid)
1116 momy0(:,ex) = pvars0_(ip(:),momy_vid)
1117 drhot0(:,in) = pvars0_(im(:),rhot_vid)
1118 drhot0(:,ex) = pvars0_(ip(:),rhot_vid)
1120 rtot_(:,in) = rtot(im(:))
1121 rtot_(:,ex) = rtot(ip(:))
1122 cptot_ov_cvtot(:,in) = cptot(im(:)) / cvtot(im(:))
1123 cptot_ov_cvtot(:,ex) = cptot(ip(:)) / cvtot(ip(:))
1126 rdens0(:,in) = 1.0_rp / ( dens_hyd(im) + pvars0_(im,dens_vid) )
1127 rdens0(:,ex) = 1.0_rp / ( dens_hyd(ip) + pvars0_(ip,dens_vid) )
1129 wt0(:,in) = ( pvars0_(im(:),momz_vid) * rgsqrtv(:,in) + g13_(:,in) * momx0(:,in) &
1130 + g23_(:,in) * momy0(:,in) ) * rdens0(:,in)
1131 wt0(:,ex) = ( pvars0_(ip(:),momz_vid) * rgsqrtv(:,ex) + g13_(:,ex) * momx0(:,ex) &
1132 + g23_(:,ex) * momy0(:,ex) ) * rdens0(:,ex)
1134 rhot_hyd(:,in) = pres0ovrdry * (pres_hyd(im(:))/pres00)**rgamm
1135 rhot_hyd(:,ex) = pres0ovrdry * (pres_hyd(ip(:))/pres00)**rgamm
1136 pres0(:,:) = pres00 * ( rtot_(:,:) * rp0 * ( rhot_hyd(:,:) + drhot0(:,:) ) )**cptot_ov_cvtot(:,:)
1139 do fp=1, elem%NfpTot
1140 g11_ = g11(im2dto3d(fp),ke2d); g12_ = g12(im2dto3d(fp),ke2d); g22_ = g22(im2dto3d(fp),ke2d)
1142 gxz_(fp,in) = rgam2(fp,in) * ( g11_ * g13_(fp,in) + g12_ * g23_(fp,in) )
1143 gxz_(fp,ex) = rgam2(fp,ex) * ( g11_ * g13_(fp,ex) + g12_ * g23_(fp,ex) )
1145 gyz_(fp,in) = rgam2(fp,in) * ( g12_ * g13_(fp,in) + g22_ * g23_(fp,in) )
1146 gyz_(fp,ex) = rgam2(fp,ex) * ( g12_ * g13_(fp,ex) + g22_ * g23_(fp,ex) )
1149 do fp=1, elem%NfpTot
1150 gnn_m = ( 1.0_rp * rgsqrtv(fp,in)**2 + g13_(fp,in) * gxz_(fp,in) + g23_(fp,in) * gyz_(fp,in) ) * abs( nz(fp,ke) )
1151 gnn_p = ( 1.0_rp * rgsqrtv(fp,ex)**2 + g13_(fp,ex) * gxz_(fp,ex) + g23_(fp,ex) * gyz_(fp,ex) ) * abs( nz(fp,ke) )
1153 alph(fp,ke) = nz(fp,ke)**2 * max( abs( wt0(fp,in) ) + sqrt( gnn_m * gamm * pres0(fp,in) * rdens0(fp,in) ), &
1154 abs( wt0(fp,ex) ) + sqrt( gnn_p * gamm * pres0(fp,ex) * rdens0(fp,ex) ) )
1158 do fp=1, elem%NfpTot
1159 tmp1 = - 0.5_rp * lmesh%Fscale(fp,ke) * alph(fp,ke)
1160 del_flux(fp,1,ke) = tmp1 * ( pvars_(ip(fp),momx_vid) - pvars_(im(fp),momx_vid) )
1161 del_flux(fp,2,ke) = tmp1 * ( pvars_(ip(fp),momy_vid) - pvars_(im(fp),momy_vid) )
1168 end subroutine vi_cal_del_flux_dyn_uv
1171 subroutine vi_cal_del_flux_dyn( del_flux, alph, & ! (out)
1173 dens_hyd, pres_hyd, rtot, cptot, cvtot, &
1174 gsqrt, gsqrth, gam, gsqrtv, g13, g23, &
1175 nz, vmapm, vmapp, im2dto3d, lmesh, elem, lmesh2d, elem2d )
1183 real(rp),
intent(out) :: del_flux(elem%nfptot,
prgvar_num,lmesh%ne)
1184 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%ne)
1185 real(rp),
intent(in) :: pvars_ (elem%np*lmesh%ne,
prgvar_num)
1186 real(rp),
intent(in) :: pvars0_(elem%np*lmesh%ne,
prgvar_num)
1187 real(rp),
intent(in) :: dens_hyd(elem%np*lmesh%nea)
1188 real(rp),
intent(in) :: pres_hyd(elem%np*lmesh%nea)
1189 real(rp),
intent(in) :: rtot(elem%np*lmesh%nea)
1190 real(rp),
intent(in) :: cptot(elem%np*lmesh%nea)
1191 real(rp),
intent(in) :: cvtot(elem%np*lmesh%nea)
1192 real(rp),
intent(in) :: gsqrt(elem%np*lmesh%nea)
1193 real(rp),
intent(in) :: gsqrth(elem2d%np,lmesh2d%ne)
1194 real(rp),
intent(in) :: gam(elem%np*lmesh%nea)
1195 real(rp),
intent(in) :: gsqrtv(elem%np*lmesh%ne)
1196 real(rp),
intent(in) :: g13(elem%np*lmesh%nea)
1197 real(rp),
intent(in) :: g23(elem%np*lmesh%nea)
1198 real(rp),
intent(in) :: nz(elem%nfptot,lmesh%ne)
1199 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%ne)
1200 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%ne)
1201 integer,
intent(in) :: im2dto3d(elem%nfptot)
1203 integer :: fp, ke, ke2d, ke_z, ke_xy
1204 integer :: ip(elem%nfptot), im(elem%nfptot)
1205 real(rp) :: ddens(elem%nfptot,2)
1206 real(rp) :: momz(elem%nfptot,2)
1207 real(rp) :: momw(elem%nfptot,2)
1208 real(rp) :: drhot(elem%nfptot,2)
1209 real(rp) :: rhot_hyd(elem%nfptot,2)
1210 real(rp) :: cptot_ov_cvtot(elem%nfptot,2)
1211 real(rp) :: rtot_(elem%nfptot,2)
1212 real(rp) :: pott(elem%nfptot,2)
1213 real(rp) :: dpres(elem%nfptot,2)
1214 real(rp) :: dens(elem%nfptot,2)
1216 real(rp) :: gsqrt_(elem%nfptot,2)
1217 real(rp) :: gsqrtv_(elem%nfptot,2)
1218 real(rp) :: rgam2(elem%nfptot,2)
1219 real(rp) :: g13_(elem%nfptot,2)
1220 real(rp) :: g23_(elem%nfptot,2)
1224 real(rp) :: rgamm, pres0ovrdry, rp0
1226 integer,
parameter :: in = 1
1227 integer,
parameter :: ex = 2
1230 rgamm = cvdry / cpdry
1231 pres0ovrdry = pres00 / rdry
1232 rp0 = 1.0_rp / pres00
1240 do ke_z=1, lmesh%NeZ
1241 do ke_xy=1, lmesh%Ne2D
1242 ke = ke_xy + (ke_z-1)*lmesh%Ne2D
1243 ke2d = lmesh%EMap3Dto2D(ke)
1245 im(:) = vmapm(:,ke); ip(:) = vmapp(:,ke)
1247 gsqrt_(:,in) = gsqrt(im)
1248 gsqrt_(:,ex) = gsqrt(ip)
1250 rgam2(:,in) = 1.0_rp / gam(im)**2
1251 rgam2(:,ex) = 1.0_rp / gam(ip)**2
1252 gsqrtv_(:,in) = gsqrtv(im)
1253 gsqrtv_(:,ex) = gsqrtv(ip)
1255 g13_(:,in) = g13(im)
1256 g13_(:,ex) = g13(ip)
1257 g23_(:,in) = g23(im)
1258 g23_(:,ex) = g23(ip)
1260 ddens(:,in) = pvars_(im(:),dens_vid)
1261 ddens(:,ex) = pvars_(ip(:),dens_vid)
1262 momz(:,in) = pvars_(im(:),momz_vid)
1263 momz(:,ex) = pvars_(ip(:),momz_vid)
1264 drhot(:,in) = pvars_(im(:),rhot_vid)
1265 drhot(:,ex) = pvars_(ip(:),rhot_vid)
1267 rtot_(:,in) = rtot(im(:))
1268 rtot_(:,ex) = rtot(ip(:))
1269 cptot_ov_cvtot(:,in) = cptot(im(:)) / cvtot(im(:))
1270 cptot_ov_cvtot(:,ex) = cptot(ip(:)) / cvtot(ip(:))
1273 dens(:,in) = dens_hyd(im(:)) + ddens(:,in)
1274 dens(:,ex) = dens_hyd(ip(:)) + ddens(:,ex)
1276 rhot_hyd(:,in) = pres0ovrdry * (pres_hyd(im(:))/pres00)**rgamm
1277 rhot_hyd(:,ex) = pres0ovrdry * (pres_hyd(ip(:))/pres00)**rgamm
1278 pott(:,:) = ( rhot_hyd(:,:) + drhot(:,:) ) / dens(:,:)
1280 dpres(:,:) = pres00 * ( rtot_(:,:) * rp0 * dens(:,:) * pott(:,:) )**cptot_ov_cvtot(:,:)
1281 dpres(:,in) = dpres(:,in) - pres_hyd(im(:))
1282 dpres(:,ex) = dpres(:,ex) - pres_hyd(ip(:))
1285 momw(:,in) = momz(:,in) &
1286 + gsqrtv_(:,in) * g13_(:,in) * pvars_(im,momx_vid) &
1287 + gsqrtv_(:,in) * g23_(:,in) * pvars_(im,momy_vid)
1288 momw(:,ex) = momz(:,ex) &
1289 + gsqrtv_(:,ex) * g13_(:,ex) * pvars_(ip,momx_vid) &
1290 + gsqrtv_(:,ex) * g23_(:,ex) * pvars_(ip,momy_vid)
1294 if ( ke_z == 1 .or. ke_z == lmesh%NeZ)
then
1295 do fp=1, elem%NfpTot
1296 if ( im(fp) == ip(fp) )
then
1297 momz(fp,ex) = - momz(fp,in) &
1298 - 2.0_rp * gsqrtv_(fp,in) * ( g13_(fp,in) * pvars_(im(fp),momx_vid) &
1299 + g23_(fp,in) * pvars_(im(fp),momy_vid) )
1300 momw(fp,ex) = - momw(fp,in)
1306 do fp=1, elem%NfpTot
1307 tmp1 = 0.5_rp * lmesh%Fscale(fp,ke)
1309 del_flux(fp,dens_vid,ke) = tmp1 * ( &
1310 + ( momw(fp,ex) - momw(fp,in) ) * nz(fp,ke) &
1311 - alph(fp,ke) * ( ddens(fp,ex) - ddens(fp,in) ) )
1314 del_flux(fp,momz_vid,ke) = tmp1 * ( &
1315 + ( dpres(fp,ex) - dpres(fp,in) ) * nz(fp,ke) &
1316 - alph(fp,ke) * ( momz(fp,ex) - momz(fp,in) ) )
1318 del_flux(fp,rhot_vid,ke) = tmp1 * ( &
1319 + ( pott(fp,ex) * momw(fp,ex) - pott(fp,in) * momw(fp,in) ) * nz(fp,ke) &
1320 - alph(fp,ke) * ( drhot(fp,ex) - drhot(fp,in) ) )
1328 end subroutine vi_cal_del_flux_dyn
module FElib / Fluid dyn solver / Atmosphere / HEVI / Common
subroutine, public atm_dyn_dgm_hevi_common_linalgebra_solve_var3(d, b, g, nnode_v, im, jm, ne2d, is_top)
subroutine, public atm_dyn_dgm_hevi_common_linalgebra_solve_uv(d, b, g, nnode_v, im, jm, ne2d, is_top)
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / Common
integer, parameter, public prgvar_momy_id
integer, parameter, public prgvar_ddens_id
integer, parameter, public prgvar_momz_id
integer, parameter, public prgvar_momx_id
integer, parameter, public prgvar_drhot_id
integer, parameter, public prgvar_num
real(rp), dimension(:,:), allocatable, public intrpmat_vpordm1
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVI / Common
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_solve(prog_vars, b, dens, w, wt, pot, dpdrhot, alph, gsqrtv, intrpmat_vpordm1, impl_fac, dt, vmapm, vmapp, lmesh, elem, im, jm)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_init
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_eval_ax(dens_t, momz_t, rhot_t, alph, prog_vars, prog_vars0, ddens00, momx00, momy00, momz00, drhot00, dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, impl_fac, dt, lmesh, elem, vmapm, vmapp, element3d_operation, im, jm, b, dens, w, wt, pot, dpdrhot)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_final
logical, public vi_use_lapack_flag
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_construct_matbnd_uv(bndmatl_uv, bndmatd_uv, bndmatu_uv, alph, gsqrtv, impl_fac, dt, lmesh, elem, im, jm, vmapm, vmapp, ke_z)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_construct_matbnd(bndmatl, bndmatd, bndmatu, dens, w, wt, pot, dpdrhot, alph, gsqrtv, nz, id, fac_dx3, fac_intrpmat_vpordm1, impl_fac, dt, lmesh, elem, im, jm, ke_z)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_solve_uv(prog_vars, b_uv, alph, gsqrtv, impl_fac, dt, vmapm, vmapp, lmesh, elem, im, jm)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_eval_ax_uv(momx_t, momy_t, alph, prog_vars, prog_vars0, ddens00, momx00, momy00, momz00, drhot00, dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, impl_fac, dt, lmesh, elem, vmapm, vmapp, element3d_operation, im, jm, b1d_ij_uv)
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element/ ModalFilter
module FElib / Element / Operation / Base
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Data / base
module FElib / Mesh / Base 3D
module FElib / Data / base
Module common / sparsemat.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a modal filter.
Base type for elementwise operations.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type representing a field with 3D local mesh.
Derived type to manage a computational mesh (base type for 3D domain)
Derived type representing a field with 3D mesh.