98 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
99 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
100 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
101 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
102 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
103 lmesh, elem, lmesh2d, elem2d )
116 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
117 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
118 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
119 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
120 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
121 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
122 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
123 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
124 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
125 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
126 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
127 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
128 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
129 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
130 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
131 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
132 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
133 real(rp),
intent(in) :: rtot (elem%np,lmesh%nea)
134 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
135 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
136 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
137 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
140 real(rp) :: tend_tmp(elem%nnode_h1d**2,5,elem%nnode_v,lmesh%ne)
141 real(rp) :: flux2d(elem%nnode_h1d**2,5,elem%nnode_v,lmesh%ne,2)
142 real(rp) :: fluxz_store(elem%nnode_h1d**2,5,elem%nnode_v,lmesh%ne)
143 real(rp) :: del_flux(elem%nfptot,
prgvar_num,lmesh%ne)
144 real(rp) :: drho(elem%np,lmesh%ne)
146 integer :: indexh2dto3d(elem%np)
148 integer :: nes, nee, nnode_h1d, nnode_v
151 indexh2dto3d(:) = elem%IndexH2Dto3D(:)
152 call element3d_operation_driver%Init( element3d_operation )
155 nnode_h1d = elem%Nnode_h1D
156 nnode_v = elem%Nnode_v
164 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
165 call get_ebnd_flux( &
167 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
168 dens_hyd, pres_hyd, therm_hyd, rtot, cvtot, cptot, &
169 lmesh%Gsqrt, lmesh%GIJ(:,:,1,1), lmesh%GIJ(:,:,1,2), lmesh%GIJ(:,:,2,2), &
170 lmesh%GsqrtH, lmesh%gam, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
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 )
175 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
178 call prof_rapstart(
'cal_dyn_tend_interior', 3)
179 call cal_tend_interior_gpu( &
180 dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, &
181 ddens_, momx_, momy_, momz_, drhot_, dpres_, del_flux, &
182 dens_hyd, therm_hyd, dphyddx, dphyddy, &
183 lmesh%Gsqrt,lmesh%GsqrtH,lmesh%GI3(:,:,1),lmesh%GI3(:,:,2), &
184 lmesh%Escale(:,:,1,1), lmesh%Escale(:,:,2,2), lmesh%Escale(:,:,3,3), &
185 lmesh2d%pos_en(:,:,1), lmesh2d%pos_en(:,:,2), &
186 flux2d, fluxz_store, tend_tmp, drho, &
187 element3d_operation_driver, lmesh%EMap3Dto2D, indexh2dto3d, &
188 lmesh,elem, lmesh%NeS, lmesh%NeE, lmesh%NeA, lmesh%Ne2DA, elem%Nnode_h1D, elem%Nnode_v )
190 call prof_rapend(
'cal_dyn_tend_interior', 3)
194 call element3d_operation_driver%Final()
400 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
401 ddens_, momx_, momy_, momz_, drhot_, dpres_, &
402 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
403 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
404 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
405 lmesh, elem, lmesh2d, elem2d )
409 use scale_const,
only: &
418 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
419 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
420 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
421 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
422 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
423 real(rp),
intent(out) :: rhot_dt(elem%np,lmesh%nea)
424 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
425 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
426 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
427 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
428 real(rp),
intent(in) :: drhot_(elem%np,lmesh%nea)
429 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
430 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
431 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
432 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
433 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
434 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
435 real(rp),
intent(in) :: rtot (elem%np,lmesh%nea)
436 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
437 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
438 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
439 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
441 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
442 real(rp) :: dpres_hyd(elem%np), gradphyd_x(elem%np), gradphyd_y(elem%np)
443 real(rp) :: del_flux(elem%nfptot,lmesh%ne,
prgvar_num)
444 real(rp) :: del_flux_hyd(elem%nfptot,lmesh%ne,2)
445 real(rp) :: rhot_(elem%np)
446 real(rp) :: rdens_(elem%np), u_(elem%np), v_(elem%np), w_(elem%np), wt_(elem%np), drho(elem%np)
448 real(rp) :: g11(elem%np), g12(elem%np), g22(elem%np)
449 real(rp) :: gsqrtv(elem%np), rgsqrtv(elem%np), rgam2(elem%np)
450 real(rp) :: x2d(elem2d%np,lmesh2d%ne), y2d(elem2d%np,lmesh2d%ne)
451 real(rp) :: x(elem%np), y(elem%np), twoovdel2(elem%np)
452 real(rp) :: om1(elem%np), om2(elem%np), om3(elem%np), del(elem%np), r(elem%np)
453 logical :: is_panel1to4
464 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
465 call get_ebnd_flux( &
466 del_flux, del_flux_hyd, &
467 ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, &
468 rtot, cvtot, cptot, &
469 lmesh%Gsqrt, lmesh%GIJ(:,:,1,1), lmesh%GIJ(:,:,1,2), lmesh%GIJ(:,:,2,2), &
470 lmesh%GsqrtH, lmesh%gam, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), &
471 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
472 lmesh%vmapM, lmesh%vmapP, elem%IndexH2Dto3D_bnd, &
473 lmesh, elem, lmesh2d, elem2d )
474 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
477 call prof_rapstart(
'cal_dyn_tend_interior', 3)
478 rgamm = cvdry / cpdry
479 rp0 = 1.0_rp / pres00
480 p0ovr = pres00 / rdry
483 is_panel1to4 = .true.
484 if ( lmesh%panelID == 5 )
then
485 is_panel1to4 = .false.
486 else if ( lmesh%panelID == 6 )
then
487 is_panel1to4 = .false.
500 do ke2d = lmesh2d%NeS, lmesh2d%NeE
501 x2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,1))
502 y2d(:,ke2d) = tan(lmesh2d%pos_en(:,ke2d,2))
506 do ke = lmesh%NeS, lmesh%NeE
508 ke2d = lmesh%EMap3Dto2D(ke)
509 rgam2(:) = 1.0_rp / lmesh%gam(:,ke)**2
510 g11(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,1) * rgam2(:)
511 g12(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,1,2) * rgam2(:)
512 g22(:) = lmesh%GIJ(elem%IndexH2Dto3D,ke2d,2,2) * rgam2(:)
513 gsqrtv(:) = lmesh%Gsqrt(:,ke) * rgam2(:) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
514 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
517 rhot_(:) = p0ovr * ( pres_hyd(:,ke) * rp0 )**rgamm + drhot_(:,ke)
521 rdens_(:) = 1.0_rp / ( ddens_(:,ke) + dens_hyd(:,ke) )
522 u_(:) = momx_(:,ke) * rdens_(:)
523 v_(:) = momy_(:,ke) * rdens_(:)
524 w_(:) = momz_(:,ke) * rdens_(:)
525 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
527 x(:) = x2d(elem%IndexH2Dto3D,ke2d)
528 y(:) = y2d(elem%IndexH2Dto3D,ke2d)
529 del(:) = sqrt( 1.0_rp + x(:)**2 + y(:)**2 )
530 twoovdel2(:) = 2.0_rp / ( 1.0_rp + x(:)**2 + y(:)**2 )
532 r(:) = rplanet * lmesh%gam(:,ke)
536 if ( is_panel1to4 )
then
538 om2(:) = s * del(:) / ( r(:) * ( 1.0_rp + y(:)**2 ) )
539 om3(:) = s * y(:) / del(:)
541 om1(:) = - s * x(:) * del(:) / ( r(:) * ( 1.0_rp + x(:)**2 ) )
542 om2(:) = - s * y(:) * del(:) / ( r(:) * ( 1.0_rp + y(:)**2 ) )
550 dpres_hyd(:) = pres_hyd(:,ke) - pres_hyd_ref(:,ke)
554 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,1), liftdelflx)
555 gradphyd_x(:) = lmesh%Escale(:,ke,1,1) * fx(:) &
556 + lmesh%Escale(:,ke,3,3) * fz(:) &
561 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,2), liftdelflx)
562 gradphyd_y(:) = lmesh%Escale(:,ke,2,2) * fy(:) &
563 + lmesh%Escale(:,ke,3,3) * fz(:) &
569 call sparsemat_matmul(dz, lmesh%Gsqrt(:,ke) * ( ddens_(:,ke) + dens_hyd(:,ke) ) * wt_(:), fz)
570 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,dens_vid), liftdelflx)
572 dens_dt(:,ke) = - ( &
573 lmesh%Escale(:,ke,1,1) * fx(:) &
574 + lmesh%Escale(:,ke,2,2) * fy(:) &
575 + lmesh%Escale(:,ke,3,3) * fz(:) &
576 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
579 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * ( u_(:) * momx_(:,ke) + g11(:) * dpres_(:,ke) ), fx)
580 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * ( v_(:) * momx_(:,ke) + g12(:) * dpres_(:,ke) ), fy)
582 + ( lmesh%GI3(:,ke,1) * g11(:) + lmesh%GI3(:,ke,2) * g12(:) ) * dpres_(:,ke) ), fz)
583 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momx_vid), liftdelflx)
586 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
587 + lmesh%Escale(:,ke,2,2) * fy(:) &
588 + lmesh%Escale(:,ke,3,3) * fz(:) &
589 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
590 - twoovdel2(:) * y(:) * &
591 ( x(:) * y(:) * u_(:) - ( 1.0_rp + y(:)**2 ) * v_(:) ) * momx_(:,ke) &
592 - 2.0_rp * u_(:) * momz_(:,ke) / r(:) &
593 - ( g11(:) * gradphyd_x(:) + g12(:) * gradphyd_y(:) ) * rgsqrtv(:) &
594 - lmesh%Gsqrt(:,ke) * ( g11(:) * ( om2(:) * momz_(:,ke) - om3(:) * momy_(:,ke) ) &
595 - g12(:) * ( om1(:) * momz_(:,ke) - om3(:) * momx_(:,ke) ) )
598 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * ( u_(:) * momy_(:,ke) + g12(:) * dpres_(:,ke) ), fx)
599 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * ( v_(:) * momy_(:,ke) + g22(:) * dpres_(:,ke) ), fy)
601 + ( lmesh%GI3(:,ke,1) * g12(:) + lmesh%GI3(:,ke,2) * g22(:) ) * dpres_(:,ke) ), fz)
602 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momy_vid), liftdelflx)
605 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
606 + lmesh%Escale(:,ke,2,2) * fy(:) &
607 + lmesh%Escale(:,ke,3,3) * fz(:) &
608 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
609 - twoovdel2(:) * x(:) * &
610 ( - (1.0_rp + x(:)**2) * u_(:) + x(:) * y(:) * v_(:) ) * momy_(:,ke) &
611 - 2.0_rp * v_(:) * momz_(:,ke) / r(:) &
612 - ( g12(:) * gradphyd_x(:) + g22(:) * gradphyd_y(:) ) * rgsqrtv(:) &
613 - lmesh%Gsqrt(:,ke) * ( g12(:) * ( om2(:) * momz_(:,ke) - om3(:) * momy_(:,ke) ) &
614 - g22(:) * ( om1(:) * momz_(:,ke) - om3(:) * momx_(:,ke) ) )
619 call sparsemat_matmul(dz, lmesh%Gsqrt(:,ke) * ( wt_(:) * momz_(:,ke) + rgsqrtv(:) * dpres_(:,ke) ), fz)
620 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momz_vid), liftdelflx)
623 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
624 + lmesh%Escale(:,ke,2,2) * fy(:) &
625 + lmesh%Escale(:,ke,3,3) * fz(:) &
626 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
627 - 0.25_rp * r(:) * twoovdel2(:)**2 * ( 1.0_rp * x(:)**2 ) * ( 1.0_rp * y(:)**2 ) &
628 * ( - ( 1.0_rp + x(:)**2 ) * momx_(:,ke) * u_(:) &
629 + 2.0_rp * x(:) * y(:) * momx_(:,ke) * v_(:) &
630 - ( 1.0_rp + y(:)**2 ) * momy_(:,ke) * v_(:) ) &
631 + 2.0_rp * dpres_(:,ke) / r(:) &
632 - lmesh%Gsqrt(:,ke) * ( om1(:) * momy_(:,ke) - om2(:) * momx_(:,ke) ) &
633 - grav * rgam2(:) * drho(:)
639 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,rhot_vid), liftdelflx)
642 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
643 + lmesh%Escale(:,ke,2,2) * fy(:) &
644 + lmesh%Escale(:,ke,3,3) * fz(:) &
645 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
649 call prof_rapend(
'cal_dyn_tend_interior', 3)