105 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
106 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
107 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
108 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
109 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
110 lmesh, elem, lmesh2d, elem2d )
122 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
123 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
124 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
125 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
126 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
127 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
128 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
129 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
130 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
131 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
132 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
133 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
134 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
135 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
136 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
137 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
138 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
139 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
140 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
141 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
142 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
143 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
145 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
146 real(rp) :: dpres_hyd(elem%np), gradphyd_x(elem%np), gradphyd_y(elem%np)
147 real(rp) :: del_flux(elem%nfptot,lmesh%ne,
prgvar_num)
148 real(rp) :: del_flux_hyd(elem%nfptot,lmesh%ne,2)
149 real(rp) :: rhot_(elem%np)
150 real(rp) :: rdens_(elem%np), u_(elem%np), v_(elem%np), w_(elem%np), wt_(elem%np)
151 real(rp) :: gsqrtv(elem%np), rgsqrtv(elem%np)
152 real(rp) :: cori(elem%np)
156 real(rp) :: gamm, rgamm
158 real(rp) :: rovp0, p0ovr
161 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
162 call get_ebnd_flux( &
163 del_flux, del_flux_hyd, &
164 ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, &
165 rtot, cvtot, cptot, &
166 lmesh%Gsqrt, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
167 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
168 lmesh%vmapM, lmesh%vmapP, &
169 lmesh, elem, lmesh2d, elem2d )
170 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
173 call prof_rapstart(
'cal_dyn_tend_interior', 3)
175 rgamm = cvdry / cpdry
176 rp0 = 1.0_rp / pres00
178 p0ovr = pres00 / rdry
185 do ke = lmesh%NeS, lmesh%NeE
187 ke2d = lmesh%EMap3Dto2D(ke)
188 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
190 gsqrtv(:) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
191 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
194 rhot_(:) = p0ovr * (pres_hyd(:,ke) * rp0)**rgamm + drhot_(:,ke)
198 rdens_(:) = 1.0_rp / (ddens_(:,ke) + dens_hyd(:,ke))
199 u_(:) = momx_(:,ke) * rdens_(:)
200 v_(:) = momy_(:,ke) * rdens_(:)
201 w_(:) = momz_(:,ke) * rdens_(:)
202 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
206 dpres_hyd(:) = pres_hyd(:,ke) - pres_hyd_ref(:,ke)
210 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,1), liftdelflx)
211 gradphyd_x(:) = lmesh%Escale(:,ke,1,1) * fx(:) &
212 + lmesh%Escale(:,ke,3,3) * fz(:) &
217 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,2), liftdelflx)
218 gradphyd_y(:) = lmesh%Escale(:,ke,2,2) * fy(:) &
219 + lmesh%Escale(:,ke,3,3) * fz(:) &
224 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,dens_vid), liftdelflx)
226 dens_dt(:,ke) = - ( &
227 lmesh%Escale(:,ke,1,1) * fx(:) &
228 + lmesh%Escale(:,ke,2,2) * fy(:) &
229 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
232 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * ( u_(:) * momx_(:,ke) + dpres_(:,ke) ), fx)
235 + lmesh%GI3(:,ke,1) * dpres_(:,ke) ), fz)
236 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momx_vid), liftdelflx)
239 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
240 + lmesh%Escale(:,ke,2,2) * fy(:) &
241 + lmesh%Escale(:,ke,3,3) * fz(:) &
242 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
243 - gradphyd_x(:) * rgsqrtv(:) &
244 + cori(:) * momy_(:,ke)
248 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * ( v_(:) * momy_(:,ke) + dpres_(:,ke) ), fy)
250 + lmesh%GI3(:,ke,2) * dpres_(:,ke) ), fz)
251 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momy_vid), liftdelflx)
254 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
255 + lmesh%Escale(:,ke,2,2) * fy(:) &
256 + lmesh%Escale(:,ke,3,3) * fz(:) &
257 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
258 - gradphyd_y(:) * rgsqrtv(:) &
259 - cori(:) * momx_(:,ke)
265 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momz_vid), liftdelflx)
268 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
269 + lmesh%Escale(:,ke,2,2) * fy(:) &
270 + lmesh%Escale(:,ke,3,3) * fz(:) &
271 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
276 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,rhot_vid), liftdelflx)
279 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
280 + lmesh%Escale(:,ke,2,2) * fy(:) &
281 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
283 call prof_rapend(
'cal_dyn_tend_interior', 3)
290 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
291 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
292 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
293 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
294 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
295 lmesh, elem, lmesh2d, elem2d )
299 use scale_const,
only: &
308 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
309 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
310 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
311 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
312 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
313 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
314 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
315 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
316 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
317 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
318 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
319 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
320 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
321 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
322 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
323 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
324 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
325 real(rp),
intent(in) :: rtot (elem%np,lmesh%nea)
326 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
327 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
328 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
329 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
331 real(rp) :: flux(elem%np,3,5), dflux(elem%np,4,5)
332 real(rp) :: del_flux(elem%nfptot,
prgvar_num,lmesh%ne)
333 real(rp) :: u_, v_, w_, pt_
334 real(rp) :: rhot_(elem%np)
335 real(rp) :: rdens_(elem%np), gsqrtv(elem%np), rgsqrtv(elem%np), rgsqrt(elem%np)
336 real(rp) :: gsqrt_, gsqrtdpres_, e11, e22, e33
342 real(rp) :: gamm, rgamm
344 real(rp) :: rovp0, p0ovr
347 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
348 call get_ebnd_flux( &
350 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
351 dens_hyd, pres_hyd, therm_hyd, rtot, cvtot, cptot, &
352 lmesh%Gsqrt, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
353 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
354 lmesh%vmapM, lmesh%vmapP, &
355 lmesh, elem, lmesh2d, elem2d )
356 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
359 call prof_rapstart(
'cal_dyn_tend_interior', 3)
361 rgamm = cvdry / cpdry
362 rp0 = 1.0_rp / pres00
364 p0ovr = pres00 / rdry
373 do ke = lmesh%NeS, lmesh%NeE
375 ke2d = lmesh%EMap3Dto2D(ke)
378 gsqrtv(p) = lmesh%Gsqrt(p,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D(p),ke2d)
379 rgsqrtv(p) = 1.0_rp / gsqrtv(p)
380 rgsqrt(p) = 1.0_rp / lmesh%Gsqrt(p,ke)
381 rdens_(p) = 1.0_rp / ( ddens_(p,ke) + dens_hyd(p,ke) )
386 gsqrt_ = lmesh%Gsqrt(p,ke)
387 flux(p,1,dens_vid) = gsqrt_ * momx_(p,ke)
388 flux(p,2,dens_vid) = gsqrt_ * momy_(p,ke)
389 flux(p,3,dens_vid) = gsqrt_ * ( &
390 momz_(p,ke) * rgsqrtv(p) &
391 + lmesh%GI3(p,ke,1) * momx_(p,ke) &
392 + lmesh%GI3(p,ke,2) * momy_(p,ke) )
395 pt_ = ( therm_hyd(p,ke) + drhot_(p,ke) ) * rdens_(p)
396 flux(p,1,rhot_vid) = flux(p,1,dens_vid) * pt_
397 flux(p,2,rhot_vid) = flux(p,2,dens_vid) * pt_
400 w_ = momz_(p,ke) * rdens_(p)
401 flux(p,1,momz_vid) = flux(p,1,dens_vid) * w_
402 flux(p,2,momz_vid) = flux(p,2,dens_vid) * w_
403 flux(p,3,momz_vid) = flux(p,3,dens_vid) * w_
407 gsqrtdpres_ = lmesh%Gsqrt(p,ke) * dpres_(p,ke)
408 u_ = momx_(p,ke) * rdens_(p)
409 v_ = momy_(p,ke) * rdens_(p)
411 flux(p,1,momx_vid) = flux(p,1,dens_vid) * u_ + gsqrtdpres_
412 flux(p,2,momx_vid) = flux(p,2,dens_vid) * u_
413 flux(p,3,momx_vid) = flux(p,3,dens_vid) * u_ + gsqrtdpres_ * lmesh%GI3(p,ke,1)
415 flux(p,1,momy_vid) = flux(p,1,dens_vid) * v_
416 flux(p,2,momy_vid) = flux(p,2,dens_vid) * v_ + gsqrtdpres_
417 flux(p,3,momy_vid) = flux(p,3,dens_vid) * v_ + gsqrtdpres_ * lmesh%GI3(p,ke,2)
420 call element3d_operation%Div_var5( &
421 flux, del_flux(:,:,ke), &
425 e11 = lmesh%Escale(p,ke,1,1)
426 e22 = lmesh%Escale(p,ke,2,2)
427 e33 = lmesh%Escale(p,ke,3,3)
429 dens_dt(p,ke) = - ( &
430 e11 * dflux(p,1,dens_vid) &
431 + e22 * dflux(p,2,dens_vid) &
432 + dflux(p,4,dens_vid) ) * rgsqrt(p)
434 rhot_dt(p,ke) = - ( &
435 e11 * dflux(p,1,rhot_vid) &
436 + e22 * dflux(p,2,rhot_vid) &
437 + dflux(p,4,rhot_vid) ) * rgsqrt(p)
441 e11 = lmesh%Escale(p,ke,1,1)
442 e22 = lmesh%Escale(p,ke,2,2)
443 e33 = lmesh%Escale(p,ke,3,3)
445 momz_dt(p,ke) = - ( &
446 e11 * dflux(p,1,momz_vid) &
447 + e22 * dflux(p,2,momz_vid) &
448 + e33 * dflux(p,3,momz_vid) &
449 + dflux(p,4,momz_vid) ) * rgsqrt(p)
454 cor = coriolis(elem%IndexH2Dto3D(p),ke2d)
455 momx_dt(p,ke) = - dphyddx(p,ke) &
457 momy_dt(p,ke) = - dphyddy(p,ke) &
462 e11 = lmesh%Escale(p,ke,1,1)
463 e22 = lmesh%Escale(p,ke,2,2)
464 e33 = lmesh%Escale(p,ke,3,3)
466 momx_dt(p,ke) = momx_dt(p,ke) - ( &
467 e11 * dflux(p,1,momx_vid) &
468 + e22 * dflux(p,2,momx_vid) &
469 + e33 * dflux(p,3,momx_vid) &
470 + dflux(p,4,momx_vid) ) * rgsqrt(p)
472 momy_dt(p,ke) = momy_dt(p,ke) - ( &
473 e11 * dflux(p,1,momy_vid) &
474 + e22 * dflux(p,2,momy_vid) &
475 + e33 * dflux(p,3,momy_vid) &
476 + dflux(p,4,momy_vid) ) * rgsqrt(p)
480 call prof_rapend(
'cal_dyn_tend_interior', 3)
488 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
489 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, &
490 ddens0_, momx0_, momy0_, momz0_, drhot0_, &
491 rtot, cvtot, cptot, &
492 element3d_operation, dz, lift, &
494 lmesh, elem, lmesh2d, elem2d )
509 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
510 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
511 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
512 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
513 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
514 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
515 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
516 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
517 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
518 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
519 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
520 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
521 real(rp),
intent(in) :: ddens0_(elem%np,lmesh%nea)
522 real(rp),
intent(in) :: momx0_(elem%np,lmesh%nea)
523 real(rp),
intent(in) :: momy0_(elem%np,lmesh%nea)
524 real(rp),
intent(in) :: momz0_(elem%np,lmesh%nea)
525 real(rp),
intent(in) :: drhot0_(elem%np,lmesh%nea)
526 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
527 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
528 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
531 real(rp),
intent(in) :: impl_fac
532 real(rp),
intent(in) :: dt
534 real(rp) :: prog_vars (elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
535 real(rp) :: prog_vars0(elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
536 real(rp) :: b1d(3,elem%nnode_v,lmesh%nez,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
537 integer :: ipiv(elem%nnode_v*3*lmesh%nez,elem%nnode_h1d**2)
538 real(rp) :: b1d_uv(elem%nnode_v,lmesh%nez,2,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
539 integer :: ipiv_uv(elem%nnode_v*1*lmesh%nez,elem%nnode_h1d**2)
540 real(rp) :: alph(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
541 real(rp) :: rtot_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
542 real(rp) :: cptot_ov_cvtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
543 real(rp) :: dens_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
544 real(rp) :: pres_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
545 real(rp) :: gnnm_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
546 real(rp) :: g13_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
547 real(rp) :: g23_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
548 real(rp) :: gsqrtv_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
549 real(rp) :: nz(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
550 integer :: vmapm(elem%nfptot,lmesh%nez)
551 integer :: vmapp(elem%nfptot,lmesh%nez)
552 integer :: colmask(elem%nnode_v)
553 integer :: ke_xy, ke_z, ke, ke2d, v
555 integer :: kl, ku, nz_1d
556 integer :: kl_uv, ku_uv, nz_1d_uv
558 logical :: is_converged
560 real(rp),
allocatable :: pmatbnd(:,:,:)
561 real(rp),
allocatable :: pmatbnd_uv(:,:,:)
562 integer :: info, info_uv
565 call prof_rapstart(
'hevi_cal_vi_prep', 3)
567 nz_1d = elem%Nnode_v * 3 * lmesh%NeZ
568 kl = ( elem%Nnode_v + 1 ) * 3 - 1
570 nz_1d_uv = elem%Nnode_v * 1 * lmesh%NeZ
573 allocate( pmatbnd(2*kl+ku+1,nz_1d,elem%Nnode_h1D**2) )
574 allocate( pmatbnd_uv(2*kl_uv+ku_uv+1,nz_1d_uv,elem%Nnode_h1D**2) )
576 call lmesh%GetVmapZ1D( vmapm, vmapp )
582 do ke_xy=1, lmesh%NeX*lmesh%NeY
584 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
585 ke2d = lmesh%EMap3Dto2D(ke)
587 prog_vars(:,ke_z,dens_vid,ke_xy) = ddens0_(:,ke)
588 prog_vars(:,ke_z,momx_vid,ke_xy) = momx0_(:,ke)
589 prog_vars(:,ke_z,momy_vid,ke_xy) = momy0_(:,ke)
590 prog_vars(:,ke_z,momz_vid,ke_xy) = momz0_(:,ke)
591 prog_vars(:,ke_z,rhot_vid,ke_xy) = drhot0_(:,ke)
593 dens_hyd_z(:,ke_z,ke_xy) = dens_hyd(:,ke)
594 pres_hyd_z(:,ke_z,ke_xy) = pres_hyd(:,ke)
596 rtot_z(:,ke_z,ke_xy) = rtot(:,ke)
597 cptot_ov_cvtot(:,ke_z,ke_xy) = cptot(:,ke) / cvtot(:,ke)
599 nz(:,ke_z,ke_xy) = lmesh%normal_fn(:,ke,3)
600 g13_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,1)
601 g23_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,2)
602 gsqrtv_z(:,ke_z,ke_xy) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
604 gnnm_z(:,ke_z,ke_xy) = ( 1.0_rp / gsqrtv_z(:,ke_z,ke_xy)**2 &
605 + g13_z(:,ke_z,ke_xy)**2 + g23_z(:,ke_z,ke_xy) )
610 prog_vars0(:,:,:,:) = prog_vars(:,:,:,:)
614 call prof_rapend(
'hevi_cal_vi_prep', 3)
618 if ( abs(impl_fac) > 0.0_rp )
then
619 call prof_rapstart(
'hevi_cal_vi_itr', 3)
624 call prof_rapstart(
'hevi_cal_vi_ax', 3)
626 call vi_eval_ax_uv( &
627 momx_dt(:,:), momy_dt(:,:), alph(:,:,:), &
628 prog_vars, prog_vars0, &
629 ddens_, momx_, momy_, momz_, drhot_, &
630 dens_hyd_z, pres_hyd_z, &
631 rtot_z, cptot_ov_cvtot, &
633 gnnm_z, g13_z, g23_z, gsqrtv_z, &
635 lmesh, elem, nz, vmapm, vmapp, &
638 call prof_rapend(
'hevi_cal_vi_ax', 3)
640 do ke_xy=1, lmesh%NeX * lmesh%NeY
641 call prof_rapstart(
'hevi_cal_vi_matbnd', 3)
643 call vi_construct_matbnd_uv( pmatbnd_uv(:,:,:), &
644 kl_uv, ku_uv, nz_1d_uv, &
645 prog_vars(:,:,:,ke_xy), &
646 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), &
647 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), &
649 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), &
652 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 )
654 call prof_rapend(
'hevi_cal_vi_matbnd', 3)
656 call prof_rapstart(
'hevi_cal_vi_lin', 3)
659 do ij=1, elem%Nnode_h1D**2
660 call linalgebra_solvelineq_bndmat( pmatbnd_uv(:,:,ij), b1d_uv(:,:,:,ij,ke_xy), ipiv_uv(:,ij), nz_1d_uv, kl_uv, ku_uv, 2,
vi_use_lapack_flag )
662 colmask(:) = elem%Colmask(:,ij)
664 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)
665 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)
670 call prof_rapend(
'hevi_cal_vi_lin', 3)
674 call prof_rapstart(
'hevi_cal_vi_ax', 3)
676 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
678 prog_vars, prog_vars0, &
679 ddens_, momx_, momy_, momz_, drhot_, &
680 dens_hyd_z, pres_hyd_z, &
681 rtot_z, cptot_ov_cvtot, &
683 gnnm_z, g13_z, g23_z, gsqrtv_z, &
685 lmesh, elem, nz, vmapm, vmapp, &
687 call prof_rapend(
'hevi_cal_vi_ax', 3)
689 do ke_xy=1, lmesh%NeX * lmesh%NeY
690 call prof_rapstart(
'hevi_cal_vi_matbnd', 3)
691 call vi_construct_matbnd( pmatbnd(:,:,:), &
693 prog_vars(:,:,:,ke_xy), &
694 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), &
695 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), &
697 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), &
700 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 )
702 call prof_rapend(
'hevi_cal_vi_matbnd', 3)
704 call prof_rapstart(
'hevi_cal_vi_lin', 3)
707 do ij=1, elem%Nnode_h1D**2
708 call linalgebra_solvelineq_bndmat( pmatbnd(:,:,ij), b1d(:,:,:,ij,ke_xy), ipiv(:,ij), nz_1d, kl, ku, 1,
vi_use_lapack_flag )
709 colmask(:) = elem%Colmask(:,ij)
711 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)
712 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)
713 prog_vars(colmask(:),ke_z,rhot_vid,ke_xy) = prog_vars(colmask(:),ke_z,rhot_vid,ke_xy) + b1d(3,:,ke_z,ij,ke_xy)
718 call prof_rapend(
'hevi_cal_vi_lin', 3)
723 call prof_rapend(
'hevi_cal_vi_itr', 3)
727 call prof_rapstart(
'hevi_cal_vi_retrun_var', 3)
728 if ( abs(impl_fac) > 0.0_rp)
then
730 do ke_xy=1, lmesh%NeX * lmesh%NeY
732 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
733 dens_dt(:,ke) = ( prog_vars(:,ke_z,dens_vid,ke_xy) - ddens_(:,ke) ) / impl_fac
734 momx_dt(:,ke) = ( prog_vars(:,ke_z,momx_vid,ke_xy) - momx_(:,ke) ) / impl_fac
735 momy_dt(:,ke) = ( prog_vars(:,ke_z,momy_vid,ke_xy) - momy_(:,ke) ) / impl_fac
736 momz_dt(:,ke) = ( prog_vars(:,ke_z,momz_vid,ke_xy) - momz_(:,ke) ) / impl_fac
737 rhot_dt(:,ke) = ( prog_vars(:,ke_z,rhot_vid,ke_xy) - drhot_(:,ke) ) / impl_fac
741 call vi_eval_ax_uv( &
742 momx_dt(:,:), momy_dt(:,:), &
744 prog_vars, prog_vars0, &
745 ddens_, momx_, momy_, momz_, drhot_, &
746 dens_hyd_z, pres_hyd_z, &
747 rtot_z, cptot_ov_cvtot, &
749 gnnm_z, g13_z, g23_z, gsqrtv_z, &
751 lmesh, elem, nz, vmapm, vmapp )
754 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
756 prog_vars, prog_vars0, &
757 ddens_, momx_, momy_, momz_, drhot_, &
758 dens_hyd_z, pres_hyd_z, &
759 rtot_z, cptot_ov_cvtot, &
761 gnnm_z, g13_z, g23_z, gsqrtv_z, &
763 lmesh, elem, nz, vmapm, vmapp )
765 call prof_rapend(
'hevi_cal_vi_retrun_var', 3)
773 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
774 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, &
775 ddens0_, momx0_, momy0_, momz0_, drhot0_, &
776 rtot, cvtot, cptot, &
777 element3d_operation, dz, lift, &
779 lmesh, elem, lmesh2d, elem2d )
795 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
796 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
797 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
798 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
799 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
800 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
801 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
802 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
803 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
804 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
805 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
806 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
807 real(rp),
intent(in) :: ddens0_(elem%np,lmesh%nea)
808 real(rp),
intent(in) :: momx0_(elem%np,lmesh%nea)
809 real(rp),
intent(in) :: momy0_(elem%np,lmesh%nea)
810 real(rp),
intent(in) :: momz0_(elem%np,lmesh%nea)
811 real(rp),
intent(in) :: drhot0_(elem%np,lmesh%nea)
812 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
813 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
814 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
817 real(rp),
intent(in) :: impl_fac
818 real(rp),
intent(in) :: dt
820 real(rp) :: prog_vars (elem%np,lmesh%nex*lmesh%ney,lmesh%nez,
prgvar_num)
821 real(rp) :: prog_vars0(elem%np,lmesh%nex*lmesh%ney,lmesh%nez,
prgvar_num)
822 real(rp) :: alph(elem%nfptot,lmesh%ne)
823 real(rp) :: gsqrtv(elem%np,lmesh%ne)
825 integer :: vmapm(elem%nfptot,lmesh%ne)
826 integer :: vmapp(elem%nfptot,lmesh%ne)
827 integer :: ke_xy, ke_z, ke, ke2d
830 integer :: ij, i, j, im, jm
831 logical :: is_converged
833 real(rp),
allocatable :: b_uv(:,:,:,:)
834 real(rp),
allocatable :: b (:,:,:)
836 real(rp) :: dens(elem%np,lmesh%ne)
837 real(rp) :: w(elem%np,lmesh%ne)
838 real(rp) :: wt(elem%np,lmesh%ne)
839 real(rp) :: pot(elem%np,lmesh%ne)
840 real(rp) :: dpdrhot(elem%np,lmesh%ne)
843 call prof_rapstart(
'hevi_cal_vi_prep', 3)
845 call lmesh%GetVmapZ3D( vmapm, vmapp )
852 do ke_z =1, lmesh%NeZ
853 do ke_xy=1, lmesh%NeX * lmesh%NeY
854 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
855 ke2d = lmesh%EMap3Dto2D(ke)
857 prog_vars(:,ke_xy,ke_z,dens_vid) = ddens0_(:,ke)
858 prog_vars(:,ke_xy,ke_z,momx_vid) = momx0_(:,ke)
859 prog_vars(:,ke_xy,ke_z,momy_vid) = momy0_(:,ke)
860 prog_vars(:,ke_xy,ke_z,momz_vid) = momz0_(:,ke)
861 prog_vars(:,ke_xy,ke_z,rhot_vid) = drhot0_(:,ke)
864 gsqrtv(p,ke) = lmesh%Gsqrt(p,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D(p),ke2d)
870 prog_vars0(:,:,:,:) = prog_vars(:,:,:,:)
873 call prof_rapend(
'hevi_cal_vi_prep', 3)
877 if ( abs(impl_fac) > 0.0_rp )
then
878 call prof_rapstart(
'hevi_cal_vi_itr', 3)
880 allocate( b_uv(im*elem%Nnode_v,2,jm,lmesh%Ne) )
881 allocate( b(im*3*elem%Nnode_v,jm,lmesh%Ne) )
886 call prof_rapstart(
'hevi_cal_vi_ax_uv', 3)
887 call vi_eval_ax_uv( &
888 momx_dt(:,:), momy_dt(:,:), alph(:,:), &
889 prog_vars, prog_vars0, &
890 ddens_, momx_, momy_, momz_, drhot_, &
891 dens_hyd, pres_hyd, &
892 rtot, cptot, cvtot, gsqrtv, &
894 lmesh, elem, vmapm, vmapp, &
895 element3d_operation, &
898 call prof_rapend(
'hevi_cal_vi_ax_uv', 3)
900 call vi_solve_uv( prog_vars, &
904 vmapm, vmapp, lmesh, elem, im, jm )
908 call prof_rapstart(
'hevi_cal_vi_ax', 3)
910 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
912 prog_vars, prog_vars0, ddens_, momx_, momy_, momz_, drhot_, &
913 dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, &
914 impl_fac, dt, lmesh, elem, vmapm, vmapp, &
915 element3d_operation, &
917 b, dens, w, wt, pot, dpdrhot )
918 call prof_rapend(
'hevi_cal_vi_ax', 3)
920 call vi_solve( prog_vars, &
921 b, dens, w, wt, pot, dpdrhot, alph, &
924 vmapm, vmapp, lmesh, elem, im, jm )
927 call prof_rapend(
'hevi_cal_vi_itr', 3)
930 call prof_rapstart(
'hevi_cal_vi_retrun_var', 3)
931 if ( abs(impl_fac) > 0.0_rp)
then
934 do ke_xy=1, lmesh%NeX * lmesh%NeY
935 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
936 dens_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,dens_vid) - ddens_(:,ke) ) / impl_fac
937 momx_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,momx_vid) - momx_(:,ke) ) / impl_fac
938 momy_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,momy_vid) - momy_(:,ke) ) / impl_fac
939 momz_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,momz_vid) - momz_(:,ke) ) / impl_fac
940 rhot_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,rhot_vid) - drhot_(:,ke) ) / impl_fac
944 call vi_eval_ax_uv( &
945 momx_dt(:,:), momy_dt(:,:), alph(:,:), &
946 prog_vars, prog_vars0, &
947 ddens_, momx_, momy_, momz_, drhot_, &
948 dens_hyd, pres_hyd, &
949 rtot, cptot, cvtot, gsqrtv, &
951 lmesh, elem, vmapm, vmapp, &
952 element3d_operation, im, jm )
955 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
957 prog_vars, prog_vars0, ddens_, momx_, momy_, momz_, drhot_, &
958 dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, &
959 impl_fac, dt, lmesh, elem, vmapm, vmapp, &
960 element3d_operation, im, jm )
962 call prof_rapend(
'hevi_cal_vi_retrun_var', 3)