107 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
108 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
109 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
110 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
111 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
112 lmesh, elem, lmesh2d, elem2d )
116 use scale_const,
only: &
125 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
126 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
127 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
128 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
129 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
130 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
131 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
132 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
133 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
134 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
135 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
136 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
137 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
138 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
139 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
140 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
141 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
142 real(rp),
intent(in) :: rtot (elem%np,lmesh%nea)
143 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
144 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
145 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
146 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
148 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
149 real(rp) :: dpres_hyd(elem%np), gradphyd_x(elem%np), gradphyd_y(elem%np)
150 real(rp) :: del_flux(elem%nfptot,lmesh%ne,
prgvar_num)
151 real(rp) :: del_flux_hyd(elem%nfptot,lmesh%ne,2)
152 real(rp) :: rhot_(elem%np)
153 real(rp) :: rdens_(elem%np), u_(elem%np), v_(elem%np), w_(elem%np), wt_(elem%np)
155 real(rp) :: g11(elem%np), g12(elem%np), g22(elem%np), rgam2(elem%np)
156 real(rp) :: gsqrtv(elem%np), rgsqrtv(elem%np)
157 real(rp) :: x2d(elem2d%np,lmesh2d%ne), y2d(elem2d%np,lmesh2d%ne)
158 real(rp) :: x(elem%np), y(elem%np), twoovdel2(elem%np)
159 real(rp) :: cori(elem%np,2)
160 logical :: is_panel1to4
165 real(rp) :: gamm, rgamm
167 real(rp) :: rovp0, p0ovr
170 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
171 call get_ebnd_flux( &
172 del_flux, del_flux_hyd, &
173 ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, &
174 rtot, cvtot, cptot, &
175 lmesh%Gsqrt, lmesh%GIJ(:,:,1,1), lmesh%GIJ(:,:,1,2), lmesh%GIJ(:,:,2,2), &
176 lmesh%GsqrtH, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
177 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
178 lmesh%vmapM, lmesh%vmapP, elem%IndexH2Dto3D_bnd, &
179 lmesh, elem, lmesh2d, elem2d )
180 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
183 call prof_rapstart(
'cal_dyn_tend_interior', 3)
185 rgamm = cvdry / cpdry
186 rp0 = 1.0_rp / pres00
188 p0ovr = pres00 / rdry
191 is_panel1to4 = .true.
192 if ( lmesh%panelID == 5 )
then
193 is_panel1to4 = .false.
194 else if ( lmesh%panelID == 6 )
then
195 is_panel1to4 = .false.
208 do ke2d = lmesh2d%NeS, lmesh2d%NeE
209 x2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,1))
210 y2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,2))
214 do ke = lmesh%NeS, lmesh%NeE
216 ke2d = lmesh%EMap3Dto2D(ke)
217 rgam2(:) = 1.0_rp / lmesh%gam(:,ke)**2
218 g11(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,1) * rgam2(:)
219 g12(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,2) * rgam2(:)
220 g22(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,2,2) * rgam2(:)
221 gsqrtv(:) = lmesh%Gsqrt(:,ke) * rgam2(:) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
222 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
225 rhot_(:) = p0ovr * ( pres_hyd(:,ke) * rp0 )**rgamm + drhot_(:,ke)
229 rdens_(:) = 1.0_rp / ( ddens_(:,ke) + dens_hyd(:,ke) )
230 u_(:) = momx_(:,ke) * rdens_(:)
231 v_(:) = momy_(:,ke) * rdens_(:)
232 w_(:) = momz_(:,ke) * rdens_(:)
233 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
235 x(:) = x2d(elem%IndexH2Dto3D,ke2d)
236 y(:) = y2d(elem%IndexH2Dto3D,ke2d)
237 twoovdel2(:) = 2.0_rp / ( 1.0_rp + x(:)**2 + y(:)**2 )
239 cori(:,1) = s * ohm * twoovdel2(:) * ( - x(:) * y(:) * momx_(:,ke) + (1.0_rp + y(:)**2) * momy_(:,ke) )
240 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,rhot_vid), liftdelflx)
326 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
327 + lmesh%Escale(:,ke,2,2) * fy(:) &
328 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
331 call prof_rapend(
'cal_dyn_tend_interior', 3)
338 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
339 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
340 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
341 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
342 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
343 lmesh, elem, lmesh2d, elem2d )
347 use scale_const,
only: &
356 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
357 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
358 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
359 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
360 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
361 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
362 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
363 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
364 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
365 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
366 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
367 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
368 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
369 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
370 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
371 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
372 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
373 real(rp),
intent(in) :: rtot (elem%np,lmesh%nea)
374 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
375 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
376 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
377 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
379 real(rp) :: flux(elem%np,3,5), dflux(elem%np,4,5)
380 real(rp) :: del_flux(elem%nfptot,
prgvar_num,lmesh%ne)
381 real(rp) :: u_, v_, w_, pt_
382 real(rp) :: rhot_(elem%np)
383 real(rp) :: rdens_(elem%np), gsqrtv(elem%np), rgsqrtv(elem%np), rgsqrt(elem%np)
384 real(rp) :: gsqrt_, gsqrtdpres_, e11, e22, e33
386 real(rp) :: g11(elem%np), g12(elem%np), g22(elem%np), rgam2(elem%np)
387 real(rp) :: x2d(elem2d%np,lmesh2d%ne), y2d(elem2d%np,lmesh2d%ne)
388 real(rp) :: x(elem%np), y(elem%np), twoovdel2(elem%np)
389 real(rp) :: cori(elem%np,2)
390 logical :: is_panel1to4
396 real(rp) :: gamm, rgamm
398 real(rp) :: rovp0, p0ovr
401 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
402 call get_ebnd_flux( &
404 ddens_, momx_, momy_, momz_, drhot_, &
405 dpres_, dens_hyd, pres_hyd, therm_hyd, rtot, cvtot, cptot, &
406 lmesh%Gsqrt, lmesh%GIJ(:,:,1,1), lmesh%GIJ(:,:,1,2), lmesh%GIJ(:,:,2,2), &
407 lmesh%GsqrtH, lmesh%gam, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
408 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
409 lmesh%vmapM, lmesh%vmapP, elem%IndexH2Dto3D_bnd, &
410 lmesh, elem, lmesh2d, elem2d )
411 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
414 call prof_rapstart(
'cal_dyn_tend_interior', 3)
416 rgamm = cvdry / cpdry
417 rp0 = 1.0_rp / pres00
419 p0ovr = pres00 / rdry
422 is_panel1to4 = .true.
423 if ( lmesh%panelID == 5 )
then
424 is_panel1to4 = .false.
425 else if ( lmesh%panelID == 6 )
then
426 is_panel1to4 = .false.
438 do ke2d = lmesh2d%NeS, lmesh2d%NeE
439 x2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,1))
440 y2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,2))
444 do ke = lmesh%NeS, lmesh%NeE
446 ke2d = lmesh%EMap3Dto2D(ke)
448 rgam2(p) = 1.0_rp / lmesh%gam(p,ke)**2
449 g11(p) = lmesh%GIJ(elem%IndexH2Dto3D(p),ke2d,1,1) * rgam2(p)
450 g12(p) = lmesh%GIJ(elem%IndexH2Dto3D(p),ke2d,1,2) * rgam2(p)
451 g22(p) = lmesh%GIJ(elem%IndexH2Dto3D(p),ke2d,2,2) * rgam2(p)
454 gsqrtv(p) = lmesh%Gsqrt(p,ke) * rgam2(p) / lmesh%GsqrtH(elem%IndexH2Dto3D(p),ke2d)
455 rgsqrtv(p) = 1.0_rp / gsqrtv(p)
456 rgsqrt(p) = 1.0_rp / lmesh%Gsqrt(p,ke)
457 rdens_(p) = 1.0_rp / ( ddens_(p,ke) + dens_hyd(p,ke) )
462 gsqrt_ = lmesh%Gsqrt(p,ke)
463 flux(p,1,dens_vid) = gsqrt_ * momx_(p,ke)
464 flux(p,2,dens_vid) = gsqrt_ * momy_(p,ke)
465 flux(p,3,dens_vid) = gsqrt_ * ( &
466 momz_(p,ke) * rgsqrtv(p) &
467 + lmesh%GI3(p,ke,1) * momx_(p,ke) &
468 + lmesh%GI3(p,ke,2) * momy_(p,ke) )
471 pt_ = ( therm_hyd(p,ke) + drhot_(p,ke) ) * rdens_(p)
472 flux(p,1,rhot_vid) = flux(p,1,dens_vid) * pt_
473 flux(p,2,rhot_vid) = flux(p,2,dens_vid) * pt_
476 w_ = momz_(p,ke) * rdens_(p)
477 flux(p,1,momz_vid) = flux(p,1,dens_vid) * w_
478 flux(p,2,momz_vid) = flux(p,2,dens_vid) * w_
479 flux(p,3,momz_vid) = flux(p,3,dens_vid) * w_
482 gsqrtdpres_ = lmesh%Gsqrt(p,ke) * dpres_(p,ke)
484 u_ = momx_(p,ke) * rdens_(p)
485 v_ = momy_(p,ke) * rdens_(p)
487 flux(p,1,momx_vid) = flux(p,1,dens_vid) * u_ + g11(p) * gsqrtdpres_
488 flux(p,2,momx_vid) = flux(p,2,dens_vid) * u_ + g12(p) * gsqrtdpres_
489 flux(p,3,momx_vid) = flux(p,3,dens_vid) * u_ + gsqrtdpres_ * ( g11(p) * lmesh%GI3(p,ke,1) + g12(p) * lmesh%GI3(p,ke,2) )
491 flux(p,1,momy_vid) = flux(p,1,dens_vid) * v_ + g12(p) * gsqrtdpres_
492 flux(p,2,momy_vid) = flux(p,2,dens_vid) * v_ + g22(p) * gsqrtdpres_
493 flux(p,3,momy_vid) = flux(p,3,dens_vid) * v_ + gsqrtdpres_ * ( g12(p) * lmesh%GI3(p,ke,1) + g22(p) * lmesh%GI3(p,ke,2) )
496 call element3d_operation%Div_var5( &
497 flux, del_flux(:,:,ke), &
501 e11 = lmesh%Escale(p,ke,1,1)
502 e22 = lmesh%Escale(p,ke,2,2)
503 e33 = lmesh%Escale(p,ke,3,3)
505 dens_dt(p,ke) = - ( &
506 e11 * dflux(p,1,dens_vid) &
507 + e22 * dflux(p,2,dens_vid) &
508 + dflux(p,4,dens_vid) ) * rgsqrt(p)
510 rhot_dt(p,ke) = - ( &
511 e11 * dflux(p,1,rhot_vid) &
512 + e22 * dflux(p,2,rhot_vid) &
513 + dflux(p,4,rhot_vid) ) * rgsqrt(p)
517 e11 = lmesh%Escale(p,ke,1,1)
518 e22 = lmesh%Escale(p,ke,2,2)
519 e33 = lmesh%Escale(p,ke,3,3)
521 momz_dt(p,ke) = - ( &
522 e11 * dflux(p,1,momz_vid) &
523 + e22 * dflux(p,2,momz_vid) &
524 + e33 * dflux(p,3,momz_vid) &
525 + dflux(p,4,momz_vid) ) * rgsqrt(p)
530 x(p) = x2d(elem%IndexH2Dto3D(p),ke2d)
531 y(p) = y2d(elem%IndexH2Dto3D(p),ke2d)
532 twoovdel2(p) = 2.0_rp / ( 1.0_rp + x(p)**2 + y(p)**2 )
536 cori(p,1) = s * ohm * twoovdel2(p) * ( - x(p) * y(p) * momx_(p,ke) + ( 1.0_rp + y(p)**2 ) * momy_(p,ke) )
537 cori(p,2) = s * ohm * twoovdel2(p) * ( - ( 1.0_rp + x(p)**2 ) * momx_(p,ke) + x(p) * y(p) * momy_(p,ke) )
539 if ( is_panel1to4 )
then
541 cori(p,1) = s * y(p) * cori(p,1)
542 cori(p,2) = s * y(p) * cori(p,2)
547 u_ = momx_(p,ke) * rdens_(p)
548 v_ = momy_(p,ke) * rdens_(p)
550 momx_dt(p,ke) = - ( g11(p) * dphyddx(p,ke) + g12(p) * dphyddy(p,ke) ) &
551 - twoovdel2(p) * y(p) * &
552 ( x(p) * y(p) * u_ - (1.0_rp + y(p)**2) * v_ ) * momx_(p,ke) &
555 momy_dt(p,ke) = - ( g12(p) * dphyddx(p,ke) + g22(p) * dphyddy(p,ke) ) &
556 - twoovdel2(p) * x(p) * &
557 ( - (1.0_rp + x(p)**2) * u_ + x(p) * y(p) * v_ ) * momy_(p,ke) &
562 e11 = lmesh%Escale(p,ke,1,1)
563 e22 = lmesh%Escale(p,ke,2,2)
564 e33 = lmesh%Escale(p,ke,3,3)
566 momx_dt(p,ke) = momx_dt(p,ke) - ( &
567 e11 * dflux(p,1,momx_vid) &
568 + e22 * dflux(p,2,momx_vid) &
569 + e33 * dflux(p,3,momx_vid) &
570 + dflux(p,4,momx_vid) ) * rgsqrt(p)
572 momy_dt(p,ke) = momy_dt(p,ke) - ( &
573 e11 * dflux(p,1,momy_vid) &
574 + e22 * dflux(p,2,momy_vid) &
575 + e33 * dflux(p,3,momy_vid) &
576 + dflux(p,4,momy_vid) ) * rgsqrt(p)
580 call prof_rapend(
'cal_dyn_tend_interior', 3)
587 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
588 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, &
589 ddens0_, momx0_, momy0_, momz0_, drhot0_, &
590 rtot, cvtot, cptot, &
591 element3d_operation, dz, lift, &
593 lmesh, elem, lmesh2d, elem2d )
609 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
610 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
611 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
612 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
613 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
614 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
615 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
616 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
617 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
618 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
619 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
620 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
621 real(rp),
intent(in) :: ddens0_(elem%np,lmesh%nea)
622 real(rp),
intent(in) :: momx0_(elem%np,lmesh%nea)
623 real(rp),
intent(in) :: momy0_(elem%np,lmesh%nea)
624 real(rp),
intent(in) :: momz0_(elem%np,lmesh%nea)
625 real(rp),
intent(in) :: drhot0_(elem%np,lmesh%nea)
626 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
627 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
628 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
631 real(rp),
intent(in) :: impl_fac
632 real(rp),
intent(in) :: dt
634 real(rp) :: prog_vars (elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
635 real(rp) :: prog_vars0(elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
636 real(rp) :: b1d(3,elem%nnode_v,lmesh%nez,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
637 integer :: ipiv(elem%nnode_v*3*lmesh%nez,elem%nnode_h1d**2)
638 real(rp) :: b1d_uv(elem%nnode_v,lmesh%nez,2,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
639 integer :: ipiv_uv(elem%nnode_v*1*lmesh%nez,elem%nnode_h1d**2)
640 real(rp) :: alph(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
641 real(rp) :: rtot_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
642 real(rp) :: cptot_ov_cvtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
643 real(rp) :: dens_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
644 real(rp) :: pres_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
645 real(rp) :: gnnm_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
646 real(rp) :: g13_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
647 real(rp) :: g23_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
648 real(rp) :: gsqrtv_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
649 real(rp) :: nz(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
650 integer :: vmapm(elem%nfptot,lmesh%nez)
651 integer :: vmapp(elem%nfptot,lmesh%nez)
652 integer :: colmask(elem%nnode_v)
653 integer :: ke_xy, ke_z, ke, ke2d, v
655 integer :: kl, ku, nz_1d
656 integer :: kl_uv, ku_uv, nz_1d_uv
658 logical :: is_converged
660 real(rp),
allocatable :: pmatbnd(:,:,:)
661 real(rp),
allocatable :: pmatbnd_uv(:,:,:)
662 integer :: info, info_uv
665 call prof_rapstart(
'hevi_cal_vi_prep', 3)
667 nz_1d = elem%Nnode_v * 3 * lmesh%NeZ
668 kl = ( elem%Nnode_v + 1 ) * 3 - 1
670 nz_1d_uv = elem%Nnode_v * 1 * lmesh%NeZ
673 allocate( pmatbnd(2*kl+ku+1,nz_1d,elem%Nnode_h1D**2) )
674 allocate( pmatbnd_uv(2*kl_uv+ku_uv+1,nz_1d_uv,elem%Nnode_h1D**2) )
676 call lmesh%GetVmapZ1D( vmapm, vmapp )
682 do ke_xy=1, lmesh%NeX*lmesh%NeY
684 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
685 ke2d = lmesh%EMap3Dto2D(ke)
687 prog_vars(:,ke_z,dens_vid,ke_xy) = ddens0_(:,ke)
688 prog_vars(:,ke_z,momx_vid,ke_xy) = momx0_(:,ke)
689 prog_vars(:,ke_z,momy_vid,ke_xy) = momy0_(:,ke)
690 prog_vars(:,ke_z,momz_vid,ke_xy) = momz0_(:,ke)
691 prog_vars(:,ke_z,rhot_vid,ke_xy) = drhot0_(:,ke)
693 dens_hyd_z(:,ke_z,ke_xy) = dens_hyd(:,ke)
694 pres_hyd_z(:,ke_z,ke_xy) = pres_hyd(:,ke)
696 rtot_z(:,ke_z,ke_xy) = rtot(:,ke)
697 cptot_ov_cvtot(:,ke_z,ke_xy) = cptot(:,ke) / cvtot(:,ke)
699 nz(:,ke_z,ke_xy) = lmesh%normal_fn(:,ke,3)
700 g13_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,1)
701 g23_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,2)
702 gsqrtv_z(:,ke_z,ke_xy) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
704 gnnm_z(:,ke_z,ke_xy) = ( &
705 1.0_rp / gsqrtv_z(:,ke_z,ke_xy)**2 &
706 + g13_z(:,ke_z,ke_xy) * ( lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,1) * g13_z(:,ke_z,ke_xy) &
707 + lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,2) * g23_z(:,ke_z,ke_xy) ) &
708 + g23_z(:,ke_z,ke_xy) * ( lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,2) * g13_z(:,ke_z,ke_xy) &
709 + lmesh%GIJ(elem%IndexH2Dto3D,ke2d,2,2) * g23_z(:,ke_z,ke_xy) ) )
714 prog_vars0(:,:,:,:) = prog_vars(:,:,:,:)
718 call prof_rapend(
'hevi_cal_vi_prep', 3)
722 if ( abs(impl_fac) > 0.0_rp )
then
723 call prof_rapstart(
'hevi_cal_vi_itr', 3)
728 call prof_rapstart(
'hevi_cal_vi_ax_uv', 3)
730 call vi_eval_ax_uv( &
731 momx_dt(:,:), momy_dt(:,:), alph(:,:,:), &
732 prog_vars, prog_vars0, &
733 ddens_, momx_, momy_, momz_, drhot_, &
734 dens_hyd_z, pres_hyd_z, &
735 rtot_z, cptot_ov_cvtot, &
737 gnnm_z, g13_z, g23_z, gsqrtv_z, &
739 lmesh, elem, nz, vmapm, vmapp, &
742 call prof_rapend(
'hevi_cal_vi_ax_uv', 3)
744 do ke_xy=1, lmesh%NeX * lmesh%NeY
745 call prof_rapstart(
'hevi_cal_vi_matbnd_uv', 3)
747 call vi_construct_matbnd_uv( pmatbnd_uv(:,:,:), &
748 kl_uv, ku_uv, nz_1d_uv, &
749 prog_vars(:,:,:,ke_xy), &
750 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), &
751 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), &
753 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), &
756 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 )
758 call prof_rapend(
'hevi_cal_vi_matbnd_uv', 3)
760 call prof_rapstart(
'hevi_cal_vi_lin_uv', 3)
763 do ij=1, elem%Nnode_h1D**2
764 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 )
766 colmask(:) = elem%Colmask(:,ij)
768 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)
769 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)
774 call prof_rapend(
'hevi_cal_vi_lin_uv', 3)
777 call prof_rapstart(
'hevi_cal_vi_ax', 3)
779 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
781 prog_vars, prog_vars0, &
782 ddens_, momx_, momy_, momz_, drhot_, &
783 dens_hyd_z, pres_hyd_z, &
784 rtot_z, cptot_ov_cvtot, &
786 gnnm_z, g13_z, g23_z, gsqrtv_z, &
788 lmesh, elem, nz, vmapm, vmapp, &
790 call prof_rapend(
'hevi_cal_vi_ax', 3)
792 do ke_xy=1, lmesh%NeX * lmesh%NeY
793 call prof_rapstart(
'hevi_cal_vi_matbnd', 3)
794 call vi_construct_matbnd( pmatbnd(:,:,:), &
796 prog_vars(:,:,:,ke_xy), &
797 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), &
798 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), &
800 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), &
803 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 )
805 call prof_rapend(
'hevi_cal_vi_matbnd', 3)
807 call prof_rapstart(
'hevi_cal_vi_lin', 3)
810 do ij=1, elem%Nnode_h1D**2
811 call linalgebra_solvelineq_bndmat( pmatbnd(:,:,ij), b1d(:,:,:,ij,ke_xy), ipiv(:,ij), nz_1d, kl, ku, 1,
vi_use_lapack_flag )
813 colmask(:) = elem%Colmask(:,ij)
815 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)
816 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)
817 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)
822 call prof_rapend(
'hevi_cal_vi_lin', 3)
827 call prof_rapend(
'hevi_cal_vi_itr', 3)
830 call prof_rapstart(
'hevi_cal_vi_retrun_var', 3)
831 if ( abs(impl_fac) > 0.0_rp)
then
833 do ke_xy=1, lmesh%NeX * lmesh%NeY
835 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
836 dens_dt(:,ke) = ( prog_vars(:,ke_z,dens_vid,ke_xy) - ddens_(:,ke) ) / impl_fac
837 momx_dt(:,ke) = ( prog_vars(:,ke_z,momx_vid,ke_xy) - momx_(:,ke) ) / impl_fac
838 momy_dt(:,ke) = ( prog_vars(:,ke_z,momy_vid,ke_xy) - momy_(:,ke) ) / impl_fac
839 momz_dt(:,ke) = ( prog_vars(:,ke_z,momz_vid,ke_xy) - momz_(:,ke) ) / impl_fac
840 rhot_dt(:,ke) = ( prog_vars(:,ke_z,rhot_vid,ke_xy) - drhot_(:,ke) ) / impl_fac
844 call vi_eval_ax_uv( &
845 momx_dt(:,:), momy_dt(:,:), &
847 prog_vars, prog_vars0, &
848 ddens_, momx_, momy_, momz_, drhot_, &
849 dens_hyd_z, pres_hyd_z, &
850 rtot_z, cptot_ov_cvtot, &
852 gnnm_z, g13_z, g23_z, gsqrtv_z, &
854 lmesh, elem, nz, vmapm, vmapp )
857 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
859 prog_vars, prog_vars0, &
860 ddens_, momx_, momy_, momz_, drhot_, &
861 dens_hyd_z, pres_hyd_z, &
862 rtot_z, cptot_ov_cvtot, &
864 gnnm_z, g13_z, g23_z, gsqrtv_z, &
866 lmesh, elem, nz, vmapm, vmapp )
868 call prof_rapend(
'hevi_cal_vi_retrun_var', 3)
874 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
875 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, &
876 ddens0_, momx0_, momy0_, momz0_, drhot0_, &
877 rtot, cvtot, cptot, &
878 element3d_operation, dz, lift, &
880 lmesh, elem, lmesh2d, elem2d )
896 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
897 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
898 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
899 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
900 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
901 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
902 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
903 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
904 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
905 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
906 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
907 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
908 real(rp),
intent(in) :: ddens0_(elem%np,lmesh%nea)
909 real(rp),
intent(in) :: momx0_(elem%np,lmesh%nea)
910 real(rp),
intent(in) :: momy0_(elem%np,lmesh%nea)
911 real(rp),
intent(in) :: momz0_(elem%np,lmesh%nea)
912 real(rp),
intent(in) :: drhot0_(elem%np,lmesh%nea)
913 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
914 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
915 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
918 real(rp),
intent(in) :: impl_fac
919 real(rp),
intent(in) :: dt
921 real(rp) :: prog_vars (elem%np,lmesh%nex*lmesh%ney,lmesh%nez,
prgvar_num)
922 real(rp) :: prog_vars0(elem%np,lmesh%nex*lmesh%ney,lmesh%nez,
prgvar_num)
923 real(rp) :: alph(elem%nfptot,lmesh%ne)
924 real(rp) :: gsqrtv(elem%np,lmesh%ne)
926 integer :: vmapm(elem%nfptot,lmesh%ne)
927 integer :: vmapp(elem%nfptot,lmesh%ne)
928 integer :: ke_xy, ke_z, ke, ke2d
931 integer :: ij, i, j, im, jm
932 logical :: is_converged
934 real(rp),
allocatable :: b_uv(:,:,:,:)
935 real(rp),
allocatable :: b (:,:,:)
937 real(rp) :: dens(elem%np,lmesh%ne)
938 real(rp) :: w(elem%np,lmesh%ne)
939 real(rp) :: wt(elem%np,lmesh%ne)
940 real(rp) :: pot(elem%np,lmesh%ne)
941 real(rp) :: dpdrhot(elem%np,lmesh%ne)
944 call prof_rapstart(
'hevi_cal_vi_prep', 3)
946 call lmesh%GetVmapZ3D( vmapm, vmapp )
953 do ke_z =1, lmesh%NeZ
954 do ke_xy=1, lmesh%NeX * lmesh%NeY
955 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
956 ke2d = lmesh%EMap3Dto2D(ke)
958 prog_vars(:,ke_xy,ke_z,dens_vid) = ddens0_(:,ke)
959 prog_vars(:,ke_xy,ke_z,momx_vid) = momx0_(:,ke)
960 prog_vars(:,ke_xy,ke_z,momy_vid) = momy0_(:,ke)
961 prog_vars(:,ke_xy,ke_z,momz_vid) = momz0_(:,ke)
962 prog_vars(:,ke_xy,ke_z,rhot_vid) = drhot0_(:,ke)
965 gsqrtv(p,ke) = lmesh%Gsqrt(p,ke) / ( lmesh%gam(p,ke)**2 * lmesh%GsqrtH(elem%IndexH2Dto3D(p),ke2d) )
971 prog_vars0(:,:,:,:) = prog_vars(:,:,:,:)
974 call prof_rapend(
'hevi_cal_vi_prep', 3)
978 if ( abs(impl_fac) > 0.0_rp )
then
979 call prof_rapstart(
'hevi_cal_vi_itr', 3)
981 allocate( b_uv(im*elem%Nnode_v,2,jm,lmesh%Ne) )
982 allocate( b(im*3*elem%Nnode_v,jm,lmesh%Ne) )
987 call prof_rapstart(
'hevi_cal_vi_ax_uv', 3)
988 call vi_eval_ax_uv( &
989 momx_dt(:,:), momy_dt(:,:), alph(:,:), &
990 prog_vars, prog_vars0, &
991 ddens_, momx_, momy_, momz_, drhot_, &
992 dens_hyd, pres_hyd, &
993 rtot, cptot, cvtot, gsqrtv, &
995 lmesh, elem, vmapm, vmapp, &
996 element3d_operation, &
999 call prof_rapend(
'hevi_cal_vi_ax_uv', 3)
1001 call vi_solve_uv( prog_vars, &
1005 vmapm, vmapp, lmesh, elem, im, jm )
1009 call prof_rapstart(
'hevi_cal_vi_ax', 3)
1011 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
1013 prog_vars, prog_vars0, ddens_, momx_, momy_, momz_, drhot_, &
1014 dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, &
1015 impl_fac, dt, lmesh, elem, vmapm, vmapp, &
1016 element3d_operation, &
1018 b, dens, w, wt, pot, dpdrhot )
1019 call prof_rapend(
'hevi_cal_vi_ax', 3)
1021 call vi_solve( prog_vars, &
1022 b, dens, w, wt, pot, dpdrhot, alph, &
1025 vmapm, vmapp, lmesh, elem, im, jm )
1028 call prof_rapend(
'hevi_cal_vi_itr', 3)
1031 call prof_rapstart(
'hevi_cal_vi_retrun_var', 3)
1032 if ( abs(impl_fac) > 0.0_rp)
then
1034 do ke_z=1, lmesh%NeZ
1035 do ke_xy=1, lmesh%NeX * lmesh%NeY
1036 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
1037 dens_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,dens_vid) - ddens_(:,ke) ) / impl_fac
1038 momx_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,momx_vid) - momx_(:,ke) ) / impl_fac
1039 momy_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,momy_vid) - momy_(:,ke) ) / impl_fac
1040 momz_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,momz_vid) - momz_(:,ke) ) / impl_fac
1041 rhot_dt(:,ke) = ( prog_vars(:,ke_xy,ke_z,rhot_vid) - drhot_(:,ke) ) / impl_fac
1045 call vi_eval_ax_uv( &
1046 momx_dt(:,:), momy_dt(:,:), alph(:,:), &
1047 prog_vars, prog_vars0, &
1048 ddens_, momx_, momy_, momz_, drhot_, &
1049 dens_hyd, pres_hyd, &
1050 rtot, cptot, cvtot, gsqrtv, &
1052 lmesh, elem, vmapm, vmapp, &
1053 element3d_operation, im, jm )
1056 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), &
1058 prog_vars, prog_vars0, ddens_, momx_, momy_, momz_, drhot_, &
1059 dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, &
1060 impl_fac, dt, lmesh, elem, vmapm, vmapp, &
1061 element3d_operation, im, jm )
1063 call prof_rapend(
'hevi_cal_vi_retrun_var', 3)