97 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, EnTot_dt, & ! (out)
98 ddens_, momx_, momy_, momz_, etot_, dpres_, &
99 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
100 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
101 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
102 lmesh, elem, lmesh2d, elem2d )
106 use scale_const,
only: &
115 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
116 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
117 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
118 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
119 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
120 real(rp),
intent(out) :: entot_dt(elem%np,lmesh%nea)
121 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
122 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
123 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
124 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
125 real(rp),
intent(in) :: etot_(elem%np,lmesh%nea)
126 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
127 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
128 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
129 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
130 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
131 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
132 real(rp),
intent(in) :: rtot (elem%np,lmesh%nea)
133 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
134 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
135 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
136 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
138 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
139 real(rp) :: dpres_hyd(elem%np), gradphyd_x(elem%np), gradphyd_y(elem%np)
140 real(rp) :: del_flux(elem%nfptot,lmesh%ne,
prgvar_num)
141 real(rp) :: del_flux_hyd(elem%nfptot,lmesh%ne,2)
142 real(rp) :: rdens_(elem%np), u_(elem%np), v_(elem%np), w_(elem%np), wt_(elem%np)
144 real(rp) :: g11(elem%np), g12(elem%np), g22(elem%np)
145 real(rp) :: gsqrtv(elem%np), rgsqrtv(elem%np)
146 real(rp) :: x2d(elem2d%np,lmesh2d%ne), y2d(elem2d%np,lmesh2d%ne)
147 real(rp) :: x(elem%np), y(elem%np), twoovdel2(elem%np)
148 real(rp) :: cori(elem%np,2)
149 logical :: is_panel1to4
153 integer :: p, p12, p3
155 real(rp) :: gamm, rgamm
157 real(rp) :: rovp0, p0ovr
159 real(rp) :: entot_(elem%np), enthalpy_(elem%np)
160 real(rp) :: u1_(elem%np), u2_(elem%np)
163 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
164 call get_ebnd_flux( &
165 del_flux, del_flux_hyd, &
166 ddens_, momx_, momy_, momz_, etot_, dpres_, dens_hyd, pres_hyd, &
167 rtot, cvtot, cptot, &
168 lmesh%Gsqrt, lmesh%GIJ(:,:,1,1), lmesh%GIJ(:,:,1,2), lmesh%GIJ(:,:,2,2), &
169 lmesh%G_ij(:,:,1,1), lmesh%G_ij(:,:,1,2), lmesh%G_ij(:,:,2,2), &
170 lmesh%GsqrtH, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), lmesh%zlev(:,:), &
171 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
172 lmesh%vmapM, lmesh%vmapP, elem%IndexH2Dto3D_bnd, &
173 lmesh, elem, lmesh2d, elem2d )
174 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
177 call prof_rapstart(
'cal_dyn_tend_interior', 3)
179 rgamm = cvdry / cpdry
180 rp0 = 1.0_rp / pres00
182 p0ovr = pres00 / rdry
185 is_panel1to4 = .true.
186 if ( lmesh%panelID == 5 )
then
187 is_panel1to4 = .false.
188 else if ( lmesh%panelID == 6 )
then
189 is_panel1to4 = .false.
203 do ke2d = lmesh2d%NeS, lmesh2d%NeE
204 x2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,1))
205 y2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,2))
209 do ke = lmesh%NeS, lmesh%NeE
211 ke2d = lmesh%EMap3Dto2D(ke)
212 g11(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,1)
213 g12(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,2)
214 g22(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,2,2)
215 gsqrtv(:) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
216 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
219 rdens_(:) = 1.0_rp / ( ddens_(:,ke) + dens_hyd(:,ke) )
220 u_(:) = momx_(:,ke) * rdens_(:)
221 v_(:) = momy_(:,ke) * rdens_(:)
222 w_(:) = momz_(:,ke) * rdens_(:)
223 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
224 u1_(:) = lmesh%G_ij(elem%IndexH2Dto3D(:),ke2d,1,1) * u_(:) + lmesh%G_ij(elem%IndexH2Dto3D(:),ke2d,2,1) * v_(:)
225 u2_(:) = lmesh%G_ij(elem%IndexH2Dto3D(:),ke2d,2,1) * u_(:) + lmesh%G_ij(elem%IndexH2Dto3D(:),ke2d,2,2) * v_(:)
232 enthalpy_(:) = etot_(:,ke) + pres_hyd(:,ke) + dpres_(:,ke)
234 x(:) = x2d(elem%IndexH2Dto3D,ke2d)
235 y(:) = y2d(elem%IndexH2Dto3D,ke2d)
236 twoovdel2(:) = 2.0_rp / ( 1.0_rp + x(:)**2 + y(:)**2 )
238 cori(:,1) = s * ohm * twoovdel2(:) * ( - x(:) * y(:) * momx_(:,ke) + (1.0_rp + y(:)**2) * momy_(:,ke) )
239 cori(:,2) = s * ohm * twoovdel2(:) * ( - (1.0_rp + x(:)**2) * momx_(:,ke) + x(:) * y(:) * momy_(:,ke) )
241 if ( is_panel1to4 )
then
242 cori(:,1) = s * y(:) * cori(:,1)
243 cori(:,2) = s * y(:) * cori(:,2)
248 dpres_hyd(:) = pres_hyd(:,ke) - pres_hyd_ref(:,ke)
252 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,1), liftdelflx)
253 gradphyd_x(:) = lmesh%Escale(:,ke,1,1) * fx(:) &
254 + lmesh%Escale(:,ke,3,3) * fz(:) &
259 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,2), liftdelflx)
260 gradphyd_y(:) = lmesh%Escale(:,ke,2,2) * fy(:) &
261 + lmesh%Escale(:,ke,3,3) * fz(:) &
267 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,dens_vid), liftdelflx)
269 dens_dt(:,ke) = - ( &
270 lmesh%Escale(:,ke,1,1) * fx(:) &
271 + lmesh%Escale(:,ke,2,2) * fy(:) &
272 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
275 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * ( u_(:) * momx_(:,ke) + g11(:) * dpres_(:,ke) ), fx)
276 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * ( v_(:) * momx_(:,ke) + g12(:) * dpres_(:,ke) ), fy)
278 + ( lmesh%GI3(:,ke,1) * g11(:) + lmesh%GI3(:,ke,2) * g12(:) ) * dpres_(:,ke) ), fz)
279 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momx_vid), liftdelflx)
282 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
283 + lmesh%Escale(:,ke,2,2) * fy(:) &
284 + lmesh%Escale(:,ke,3,3) * fz(:) &
285 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
286 + twoovdel2(:) * y(:) * &
287 ( - x(:) * y(:) * u_(:) + (1.0_rp + y(:)**2) * v_(:) ) * momx_(:,ke) &
288 - ( g11(:) * gradphyd_x(:) + g12(:) * gradphyd_y(:) ) * rgsqrtv(:) &
292 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * ( u_(:) * momy_(:,ke) + g12(:) * dpres_(:,ke) ), fx)
293 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * ( v_(:) * momy_(:,ke) + g22(:) * dpres_(:,ke) ), fy)
295 + ( lmesh%GI3(:,ke,1) * g12(:) + lmesh%GI3(:,ke,2) * g22(:) ) * dpres_(:,ke) ), fz)
296 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momy_vid), liftdelflx)
299 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
300 + lmesh%Escale(:,ke,2,2) * fy(:) &
301 + lmesh%Escale(:,ke,3,3) * fz(:) &
302 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
303 + twoovdel2(:) * x(:) * &
304 ( (1.0_rp + x(:)**2) * u_(:) - x(:) * y(:) * v_(:) ) * momy_(:,ke) &
305 - ( g12(:) * gradphyd_x(:) + g22(:) * gradphyd_y(:) ) * rgsqrtv(:) &
312 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momz_vid), liftdelflx)
315 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
316 + lmesh%Escale(:,ke,2,2) * fy(:) &
317 + lmesh%Escale(:,ke,3,3) * fz(:) &
318 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
323 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,etot_vid), liftdelflx)
326 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
327 + lmesh%Escale(:,ke,2,2) * fy(:) &
328 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
333 call prof_rapend(
'cal_dyn_tend_interior', 3)
340 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, ETOT_dt, & ! (out)
341 ddens_, momx_, momy_, momz_, etot_, dens_hyd, pres_hyd, &
342 ddens0_, momx0_, momy0_, momz0_, etot0_, &
343 rtot, cvtot, cptot, &
344 element3d_operation, dz, lift, &
346 lmesh, elem, lmesh2d, elem2d )
360 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
361 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
362 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
363 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
364 real(rp),
intent(out) :: etot_dt(elem%np,lmesh%nea)
365 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
366 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
367 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
368 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
369 real(rp),
intent(in) :: etot_(elem%np,lmesh%nea)
370 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
371 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
372 real(rp),
intent(in) :: ddens0_(elem%np,lmesh%nea)
373 real(rp),
intent(in) :: momx0_(elem%np,lmesh%nea)
374 real(rp),
intent(in) :: momy0_(elem%np,lmesh%nea)
375 real(rp),
intent(in) :: momz0_(elem%np,lmesh%nea)
376 real(rp),
intent(in) :: etot0_(elem%np,lmesh%nea)
377 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
378 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
379 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
382 real(rp),
intent(in) :: impl_fac
383 real(rp),
intent(in) :: dt
385 real(rp) :: prog_vars (elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
386 real(rp) :: dpres (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
387 real(rp) :: prog_vars0(elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
388 real(rp) :: dpres0 (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
389 real(rp) :: b1d(3,elem%nnode_v,lmesh%nez,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
390 real(rp) :: geopot (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
391 real(rp) :: kinhovdens(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
392 integer :: ipiv(elem%nnode_v*3*lmesh%nez,elem%nnode_h1d**2)
393 real(rp) :: b1d_uv(elem%nnode_v,lmesh%nez,2,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
394 integer :: ipiv_uv(elem%nnode_v*1*lmesh%nez,elem%nnode_h1d**2)
395 real(rp) :: alph(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
396 real(rp) :: rtot_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
397 real(rp) :: cptot_ov_cvtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
398 real(rp) :: dens_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
399 real(rp) :: pres_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
400 real(rp) :: gnnm_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
401 real(rp) :: g13_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
402 real(rp) :: g23_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
403 real(rp) :: gsqrtv_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
404 real(rp) :: nz(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
405 integer :: vmapm(elem%nfptot,lmesh%nez)
406 integer :: vmapp(elem%nfptot,lmesh%nez)
407 integer :: colmask(elem%nnode_v)
408 integer :: ke_xy, ke_z, ke, ke2d, v
410 integer :: kl, ku, nz_1d
411 integer :: kl_uv, ku_uv, nz_1d_uv
413 logical :: is_converged
415 real(rp),
allocatable :: pmatbnd(:,:,:)
416 real(rp),
allocatable :: pmatbnd_uv(:,:,:)
417 integer :: info, info_uv
419 real(rp) :: dens_(elem%np)
422 call prof_rapstart(
'hevi_cal_vi_prep', 3)
424 nz_1d = elem%Nnode_v * 3 * lmesh%NeZ
425 kl = ( elem%Nnode_v + 1 ) * 3 - 1
427 nz_1d_uv = elem%Nnode_v * 1 * lmesh%NeZ
430 allocate( pmatbnd(2*kl+ku+1,nz_1d,elem%Nnode_h1D**2) )
431 allocate( pmatbnd_uv(2*kl_uv+ku_uv+1,nz_1d_uv,elem%Nnode_h1D**2) )
433 call lmesh%GetVmapZ1D( vmapm, vmapp )
439 do ke_xy=1, lmesh%NeX*lmesh%NeY
441 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
442 ke2d = lmesh%EMap3Dto2D(ke)
444 prog_vars(:,ke_z,dens_vid,ke_xy) = ddens0_(:,ke)
445 prog_vars(:,ke_z,momx_vid,ke_xy) = momx0_(:,ke)
446 prog_vars(:,ke_z,momy_vid,ke_xy) = momy0_(:,ke)
447 prog_vars(:,ke_z,momz_vid,ke_xy) = momz0_(:,ke)
448 prog_vars(:,ke_z,etot_vid,ke_xy) = etot0_(:,ke)
450 dens_hyd_z(:,ke_z,ke_xy) = dens_hyd(:,ke)
451 pres_hyd_z(:,ke_z,ke_xy) = pres_hyd(:,ke)
452 geopot(:,ke_z,ke_xy) = grav * lmesh%zlev(:,ke)
454 dens_(:) = dens_hyd(:,ke) + ddens0_(:,ke)
455 kinhovdens(:,ke_z,ke_xy) = 0.5_rp * ( &
456 momx0_(:,ke) * ( lmesh%G_ij(elem%IndexH2Dto3D,ke2d,1,1) * momx0_(:,ke) + lmesh%G_ij(elem%IndexH2Dto3D,ke2d,2,1) * momy0_(:,ke) ) &
457 + momy0_(:,ke) * ( lmesh%G_ij(elem%IndexH2Dto3D,ke2d,2,1) * momx0_(:,ke) + lmesh%G_ij(elem%IndexH2Dto3D,ke2d,2,2) * momy0_(:,ke) ) &
460 rtot_z(:,ke_z,ke_xy) = rtot(:,ke)
461 cptot_ov_cvtot(:,ke_z,ke_xy) = cptot(:,ke) / cvtot(:,ke)
463 dpres(:,ke_z,ke_xy) = &
464 ( cptot_ov_cvtot(:,ke_z,ke_xy) - 1.0_rp ) &
465 * ( etot0_(:,ke) - ( dens_(:) * ( kinhovdens(:,ke_z,ke_xy) + geopot(:,ke_z,ke_xy) ) + 0.5_rp * momz0_(:,ke)**2 / dens_(:) ) ) &
468 nz(:,ke_z,ke_xy) = lmesh%normal_fn(:,ke,3)
469 g13_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,1)
470 g23_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,2)
471 gsqrtv_z(:,ke_z,ke_xy) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
473 gnnm_z(:,ke_z,ke_xy) = ( &
474 1.0_rp / gsqrtv_z(:,ke_z,ke_xy)**2 &
475 + g13_z(:,ke_z,ke_xy) * ( lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,1) * g13_z(:,ke_z,ke_xy) &
476 + lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,2) * g23_z(:,ke_z,ke_xy) ) &
477 + g23_z(:,ke_z,ke_xy) * ( lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,2) * g13_z(:,ke_z,ke_xy) &
478 + lmesh%GIJ(elem%IndexH2Dto3D,ke2d,2,2) * g23_z(:,ke_z,ke_xy) ) )
483 prog_vars0(:,:,:,:) = prog_vars(:,:,:,:)
484 dpres0(:,:,:) = dpres(:,:,:)
488 call prof_rapend(
'hevi_cal_vi_prep', 3)
492 if ( abs(impl_fac) > 0.0_rp )
then
493 call prof_rapstart(
'hevi_cal_vi_itr', 3)
498 call prof_rapstart(
'hevi_cal_vi_ax', 3)
500 call vi_eval_ax_uv( &
501 momx_dt(:,:), momy_dt(:,:), alph(:,:,:), &
502 prog_vars, dpres, prog_vars0, dpres0, &
503 ddens_, momx_, momy_, momz_, etot_, &
504 dens_hyd_z, pres_hyd_z, &
505 rtot_z, cptot_ov_cvtot, &
507 gnnm_z, g13_z, g23_z, gsqrtv_z, &
509 lmesh, elem, nz, vmapm, vmapp, &
512 call prof_rapend(
'hevi_cal_vi_ax', 3)
514 do ke_xy=1, lmesh%NeX * lmesh%NeY
515 call prof_rapstart(
'hevi_cal_vi_matbnd', 3)
516 call vi_construct_matbnd_uv( pmatbnd_uv(:,:,:), &
517 kl_uv, ku_uv, nz_1d_uv, &
518 prog_vars(:,:,:,ke_xy), kinhovdens(:,:,ke_xy), &
519 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), &
520 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), &
522 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), &
526 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 )
527 call prof_rapend(
'hevi_cal_vi_matbnd', 3)
529 call prof_rapstart(
'hevi_cal_vi_lin', 3)
532 do ij=1, elem%Nnode_h1D**2
533 call dgbsv( nz_1d_uv, kl_uv, ku_uv, 2, pmatbnd_uv(:,:,ij), 2*kl_uv+ku_uv+1, ipiv_uv(:,ij), b1d_uv(:,:,:,ij,ke_xy), nz_1d_uv, info)
535 colmask(:) = elem%Colmask(:,ij)
537 prog_vars(colmask(:),ke_z,momx_vid,ke_xy) = prog_vars(colmask(:),ke_z,momx_vid,ke_xy) + b1d_uv(:,ke_z,1,ij,ke_xy)
538 prog_vars(colmask(:),ke_z,momy_vid,ke_xy) = prog_vars(colmask(:),ke_z,momy_vid,ke_xy) + b1d_uv(:,ke_z,2,ij,ke_xy)
543 call prof_rapend(
'hevi_cal_vi_lin', 3)
547 call prof_rapstart(
'hevi_cal_vi_ax', 3)
549 dens_dt(:,:), momz_dt(:,:), etot_dt(:,:), &
551 prog_vars, dpres, prog_vars0, dpres0, &
552 ddens_, momx_, momy_, momz_, etot_, &
553 dens_hyd_z, pres_hyd_z, &
554 rtot_z, cptot_ov_cvtot, &
556 gnnm_z, g13_z, g23_z, gsqrtv_z, &
558 lmesh, elem, nz, vmapm, vmapp, &
560 call prof_rapend(
'hevi_cal_vi_ax', 3)
562 do ke_xy=1, lmesh%NeX * lmesh%NeY
563 call prof_rapstart(
'hevi_cal_vi_matbnd', 3)
564 call vi_construct_matbnd( pmatbnd(:,:,:), &
566 prog_vars(:,:,:,ke_xy), kinhovdens(:,:,ke_xy), &
567 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), &
568 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), &
570 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), &
574 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 )
575 call prof_rapend(
'hevi_cal_vi_matbnd', 3)
577 call prof_rapstart(
'hevi_cal_vi_lin', 3)
580 do ij=1, elem%Nnode_h1D**2
581 call dgbsv( nz_1d, kl, ku, 1, pmatbnd(:,:,ij), 2*kl+ku+1, ipiv(:,ij), b1d(:,:,:,ij,ke_xy), nz_1d, info)
583 colmask(:) = elem%Colmask(:,ij)
585 prog_vars(colmask(:),ke_z,dens_vid,ke_xy) = prog_vars(colmask(:),ke_z,dens_vid,ke_xy) + b1d(1,:,ke_z,ij,ke_xy)
586 prog_vars(colmask(:),ke_z,momz_vid,ke_xy) = prog_vars(colmask(:),ke_z,momz_vid,ke_xy) + b1d(2,:,ke_z,ij,ke_xy)
587 prog_vars(colmask(:),ke_z,etot_vid,ke_xy) = prog_vars(colmask(:),ke_z,etot_vid,ke_xy) + b1d(3,:,ke_z,ij,ke_xy)
593 dens_(:) = dens_hyd_z(:,ke_z,ke_xy) + prog_vars(:,ke_z,dens_vid,ke_xy)
594 dpres(:,ke_z,ke_xy) = &
595 ( cptot_ov_cvtot(:,ke_z,ke_xy) - 1.0_rp ) &
596 * ( prog_vars(:,ke_z,etot_vid,ke_xy) &
597 - ( dens_(:) * ( kinhovdens(:,ke_z,ke_xy) + geopot(:,ke_z,ke_xy) ) + 0.5_rp * prog_vars(:,ke_z,momz_vid,ke_xy)**2 / dens_(:) ) ) &
598 - pres_hyd_z(:,ke_z,ke_xy)
601 call prof_rapend(
'hevi_cal_vi_lin', 3)
606 call prof_rapend(
'hevi_cal_vi_itr', 3)
609 call prof_rapstart(
'hevi_cal_vi_retrun_var', 3)
610 if ( abs(impl_fac) > 0.0_rp)
then
612 do ke_xy=1, lmesh%NeX * lmesh%NeY
614 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
615 dens_dt(:,ke) = ( prog_vars(:,ke_z,dens_vid,ke_xy) - ddens_(:,ke) ) / impl_fac
616 momx_dt(:,ke) = ( prog_vars(:,ke_z,momx_vid,ke_xy) - momx_(:,ke) ) / impl_fac
617 momy_dt(:,ke) = ( prog_vars(:,ke_z,momy_vid,ke_xy) - momy_(:,ke) ) / impl_fac
618 momz_dt(:,ke) = ( prog_vars(:,ke_z,momz_vid,ke_xy) - momz_(:,ke) ) / impl_fac
619 etot_dt(:,ke) = ( prog_vars(:,ke_z,etot_vid,ke_xy) - etot_(:,ke) ) / impl_fac
623 call vi_eval_ax_uv( &
624 momx_dt(:,:), momy_dt(:,:), alph(:,:,:), &
625 prog_vars, dpres, prog_vars0, dpres0, &
626 ddens_, momx_, momy_, momz_, etot_, &
627 dens_hyd_z, pres_hyd_z, &
628 rtot_z, cptot_ov_cvtot, &
630 gnnm_z, g13_z, g23_z, gsqrtv_z, &
632 lmesh, elem, nz, vmapm, vmapp )
635 dens_dt(:,:), momz_dt(:,:), etot_dt(:,:), &
637 prog_vars, dpres, prog_vars0, dpres0, &
638 ddens_, momx_, momy_, momz_, etot_, &
639 dens_hyd_z, pres_hyd_z, &
640 rtot_z, cptot_ov_cvtot, &
642 gnnm_z, g13_z, g23_z, gsqrtv_z, &
644 lmesh, elem, nz, vmapm, vmapp )
646 call prof_rapend(
'hevi_cal_vi_retrun_var', 3)