76 DENS_t, MOMZ_t, ETOT_t, & ! (out)
78 prog_vars, dpres, prog_vars0, dpres0, &
79 ddens00, momx00, momy00, momz00, entot00, &
81 rtot, cptot_ov_cvtot, &
83 gnnm, g13, g23, gsqrtv, &
93 real(rp),
intent(out) :: dens_t(elem%np,lmesh%nea)
94 real(rp),
intent(out) :: momz_t(elem%np,lmesh%nea)
95 real(rp),
intent(out) :: etot_t(elem%np,lmesh%nea)
96 real(rp),
intent(out) :: alph(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
97 real(rp),
intent(in) :: prog_vars (elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
98 real(rp),
intent(in) :: dpres (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
99 real(rp),
intent(in) :: prog_vars0 (elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
100 real(rp),
intent(in) :: dpres0 (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
101 real(rp),
intent(in) :: ddens00(elem%np,lmesh%nea)
102 real(rp),
intent(in) :: momx00 (elem%np,lmesh%nea)
103 real(rp),
intent(in) :: momy00 (elem%np,lmesh%nea)
104 real(rp),
intent(in) :: momz00 (elem%np,lmesh%nea)
105 real(rp),
intent(in) :: entot00(elem%np,lmesh%nea)
106 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
107 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
108 real(rp),
intent(in) :: rtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
109 real(rp),
intent(in) :: cptot_ov_cvtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
112 real(rp),
intent(in) :: gnnm(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
113 real(rp),
intent(in) :: g13 (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
114 real(rp),
intent(in) :: g23 (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
115 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
116 real(rp),
intent(in) :: impl_fac
117 real(rp),
intent(in) :: dt
118 real(rp),
intent(in) :: nz(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
119 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%nez)
120 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%nez)
121 real(rp),
intent(out),
optional :: b1d_ij(3,elem%nnode_v,lmesh%nez,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
123 real(rp) :: rgsqrtv(elem%np)
124 real(rp) :: fscale(elem%nfptot), escale33(elem%np)
125 real(rp) :: fz(elem%np), liftdelflx(elem%np)
126 real(rp) :: del_flux(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney,
prgvar_num)
127 real(rp) :: momz(elem%np), ddens(elem%np), enthalpy(elem%np)
128 real(rp) :: momw(elem%np)
129 integer :: ke_xy, ke_z
133 integer :: colmask(elem%nnode_v)
135 real(rp) :: drho(elem%np)
137 integer :: kk, kkk, p, pp
143 call vi_cal_del_flux_dyn( del_flux, &
144 alph, prog_vars, prog_vars0, dpres, dpres0, &
145 dens_hyd, pres_hyd, &
146 gnnm, g13, g23, gsqrtv, nz, vmapm, vmapp, &
155 do ke_xy=1, lmesh%NeX*lmesh%NeY
157 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
158 ke2d = lmesh%EMap3Dto2D(ke)
160 ddens(:) = prog_vars(:,ke_z,dens_vid,ke_xy)
163 momz(:) = prog_vars(:,ke_z,momz_vid,ke_xy)
164 enthalpy(:) = prog_vars(:,ke_z,etot_vid,ke_xy) &
165 + pres_hyd(:,ke_z,ke_xy) + dpres(:,ke_z,ke_xy)
167 rgsqrtv(:) = 1.0_rp / gsqrtv(:,ke_z,ke_xy)
168 fscale(:) = lmesh%Fscale(:,ke)
169 escale33(:) = lmesh%Escale(:,ke,3,3)
172 + gsqrtv(:,ke_z,ke_xy) * g13(:,ke_z,ke_xy) * prog_vars(:,ke_z,momx_vid,ke_xy) &
173 + gsqrtv(:,ke_z,ke_xy) * g23(:,ke_z,ke_xy) * prog_vars(:,ke_z,momy_vid,ke_xy)
177 call sparsemat_matmul(lift, fscale(:) * del_flux(:,ke_z,ke_xy,dens_vid), liftdelflx)
178 dens_t(:,ke) = - ( escale33(:) * fz(:) + liftdelflx(:) ) * rgsqrtv(:)
183 call sparsemat_matmul(lift, fscale(:) * del_flux(:,ke_z,ke_xy,momz_vid), liftdelflx)
184 momz_t(:,ke) = - ( escale33(:) * fz(:) + liftdelflx(:) ) * rgsqrtv(:) &
188 call sparsemat_matmul(dz, enthalpy(:) * momw(:) / ( dens_hyd(:,ke_z,ke_xy) + ddens(:) ), fz)
189 call sparsemat_matmul(lift, fscale(:) * del_flux(:,ke_z,ke_xy,etot_vid), liftdelflx)
190 etot_t(:,ke) = - ( escale33(:) * fz(:) + liftdelflx(:) ) * rgsqrtv(:)
196 if (
present( b1d_ij ) )
then
198 do ke_xy=1, lmesh%NeX*lmesh%NeY
200 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
202 do ij=1, elem%Nnode_h1D**2
203 colmask(:) = elem%Colmask(:,ij)
204 b1d_ij(1,:,ke_z,ij,ke_xy) = impl_fac * dens_t(colmask(:),ke) &
205 - prog_vars(colmask(:),ke_z,dens_vid,ke_xy) &
206 + ddens00(colmask(:),ke)
207 b1d_ij(2,:,ke_z,ij,ke_xy) = impl_fac * momz_t(colmask(:),ke) &
208 - prog_vars(colmask(:),ke_z,momz_vid,ke_xy) &
209 + momz00(colmask(:),ke)
210 b1d_ij(3,:,ke_z,ij,ke_xy) = impl_fac * etot_t(colmask(:),ke) &
211 - prog_vars(colmask(:),ke_z,etot_vid,ke_xy) &
212 + entot00(colmask(:),ke)
225 MOMX_t, MOMY_t, & ! (out)
227 prog_vars, dpres, prog_vars0, dpres0, &
228 ddens00, momx00, momy00, momz00, entot00, &
229 dens_hyd, pres_hyd, &
230 rtot, cptot_ov_cvtot, &
232 gnnm, g13, g23, gsqrtv, &
242 real(rp),
intent(out) :: momx_t(elem%np,lmesh%nea)
243 real(rp),
intent(out) :: momy_t(elem%np,lmesh%nea)
244 real(rp),
intent(out) :: alph(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
245 real(rp),
intent(in) :: prog_vars (elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
246 real(rp),
intent(in) :: dpres (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
247 real(rp),
intent(in) :: prog_vars0 (elem%np,lmesh%nez,
prgvar_num,lmesh%nex*lmesh%ney)
248 real(rp),
intent(in) :: dpres0 (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
249 real(rp),
intent(in) :: ddens00(elem%np,lmesh%nea)
250 real(rp),
intent(in) :: momx00 (elem%np,lmesh%nea)
251 real(rp),
intent(in) :: momy00 (elem%np,lmesh%nea)
252 real(rp),
intent(in) :: momz00 (elem%np,lmesh%nea)
253 real(rp),
intent(in) :: entot00(elem%np,lmesh%nea)
254 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
255 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
256 real(rp),
intent(in) :: rtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
257 real(rp),
intent(in) :: cptot_ov_cvtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
260 real(rp),
intent(in) :: gnnm(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
261 real(rp),
intent(in) :: g13 (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
262 real(rp),
intent(in) :: g23 (elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
263 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
264 real(rp),
intent(in) :: impl_fac
265 real(rp),
intent(in) :: dt
266 real(rp),
intent(in) :: nz(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
267 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%nez)
268 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%nez)
269 real(rp),
intent(out),
optional :: b1d_ij_uv(elem%nnode_v,lmesh%nez,2,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
271 real(rp) :: rgsqrtv(elem%np)
272 real(rp) :: fscale(elem%nfptot)
273 real(rp) :: fz(elem%np), liftdelflx(elem%np)
274 real(rp) :: del_flux(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney,
prgvar_num)
275 integer :: ke_xy, ke_z
279 integer :: colmask(elem%nnode_v)
282 integer :: kk, kkk, p, pp
288 call vi_cal_del_flux_dyn_uv( del_flux, alph, &
289 prog_vars, prog_vars0, dpres, dpres0, &
290 dens_hyd, pres_hyd, &
291 gnnm, g13, g23, gsqrtv, nz, vmapm, vmapp, &
300 do ke_xy=1, lmesh%NeX*lmesh%NeY
302 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
303 ke2d = lmesh%EMap3Dto2D(ke)
305 rgsqrtv(:) = 1.0_rp / gsqrtv(:,ke_z,ke_xy)
306 fscale(:) = lmesh%Fscale(:,ke)
309 call sparsemat_matmul(lift, fscale(:) * del_flux(:,ke_z,ke_xy,momx_vid), liftdelflx)
310 momx_t(:,ke) = - liftdelflx(:) * rgsqrtv(:)
313 call sparsemat_matmul(lift, fscale(:) * del_flux(:,ke_z,ke_xy,momy_vid), liftdelflx)
314 momy_t(:,ke) = - liftdelflx(:) * rgsqrtv(:)
320 if (
present( b1d_ij_uv ) )
then
322 do ke_xy=1, lmesh%NeX*lmesh%NeY
324 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
326 do ij=1, elem%Nnode_h1D**2
327 colmask(:) = elem%Colmask(:,ij)
328 b1d_ij_uv(:,ke_z,1,ij,ke_xy) = impl_fac * momx_t(colmask(:),ke) &
329 - prog_vars(colmask(:),ke_z,momx_vid,ke_xy) &
330 + momx00(colmask(:),ke)
331 b1d_ij_uv(:,ke_z,2,ij,ke_xy) = impl_fac * momy_t(colmask(:),ke) &
332 - prog_vars(colmask(:),ke_z,momy_vid,ke_xy) &
333 + momy00(colmask(:),ke)
348 prog_vars0, kinhovdens00, dens_hyd, pres_hyd, &
349 g13, g23, gsqrtv, alph, &
350 rtot, cptot_ov_cvtot, geopot, &
354 nz, vmapm, vmapp, ke_x, ke_y )
360 integer,
intent(in) :: kl, ku, nz_1d
361 real(rp),
intent(out) :: pmatbnd(2*kl+ku+1,3,elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
362 real(rp),
intent(in) :: prog_vars0(elem%np,lmesh%nez,
prgvar_num)
363 real(rp),
intent(in) :: kinhovdens00(elem%np,lmesh%nez)
364 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nez)
365 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nez)
366 real(rp),
intent(in) :: g13(elem%np,lmesh%nez)
367 real(rp),
intent(in) :: g23(elem%np,lmesh%nez)
368 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%nez)
369 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%nez)
370 real(rp),
intent(in) :: rtot(elem%np,lmesh%nez)
371 real(rp),
intent(in) :: cptot_ov_cvtot(elem%np,lmesh%nez)
372 real(rp),
intent(in) :: geopot(elem%np,lmesh%nez)
375 real(rp),
intent(in) :: impl_fac
376 real(rp),
intent(in) :: dt
377 real(rp),
intent(in) :: nz(elem%nfptot,lmesh%nez)
378 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%nez)
379 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%nez)
380 integer,
intent(in) :: ke_x, ke_y
382 real(rp) :: gamm_minus_one(elem%nnode_v)
383 real(rp) :: enthalpyovdens0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
384 real(rp) :: dpresdetot0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
385 real(rp) :: dpresddens0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
386 real(rp) :: dpresdmomz0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
387 real(rp) :: w0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
388 real(rp) :: wt0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
389 real(rp) :: dens0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
391 real(rp) :: geopot0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
393 integer :: ke_z, ke_z2
394 integer :: v, ke, p, f1, f2, fp, fp2, fmv
395 real(rp) :: gamm, rgamm
396 real(rp) :: fac_dz_p(elem%nnode_v)
397 real(rp) :: pmatd(elem%nnode_v,elem%nnode_v,3,3)
398 real(rp) :: pmatl(elem%nnode_v,elem%nnode_v,3,3)
399 real(rp) :: pmatu(elem%nnode_v,elem%nnode_v,3,3)
401 integer :: colmask(elem%nnode_v)
402 real(rp) :: id(elem%nnode_v,elem%nnode_v)
403 real(rp) :: dd(elem%nnode_v)
406 integer :: ij, v1, v2, pv1, pv2, g_kj, g_kjp1, g_kjm1, pb1
408 logical :: eval_flag(3,3)
410 integer,
parameter :: dens_vid_lc = 1
411 integer,
parameter :: momz_vid_lc = 2
412 integer,
parameter :: entot_vid_lc = 3
419 eval_flag(:,:) = .false.
421 eval_flag(v,v) = .true.
423 eval_flag(dens_vid_lc,momz_vid_lc) = .true.
424 eval_flag(momz_vid_lc,dens_vid_lc) = .true.
425 eval_flag(momz_vid_lc,entot_vid_lc) = .true.
426 eval_flag(entot_vid_lc,momz_vid_lc) = .true.
427 eval_flag(entot_vid_lc,dens_vid_lc) = .true.
436 pmatd(:,:,:,:) = 0.0_rp
437 pmatl(:,:,:,:) = 0.0_rp
438 pmatu(:,:,:,:) = 0.0_rp
441 do ij=1, elem%Nnode_h1D**2
442 pmatbnd(:,:,:,:,ij) = 0.0_rp
445 do ij=1, elem%Nnode_h1D**2
447 colmask(:) = elem%Colmask(:,ij)
449 gamm_minus_one(:) = cptot_ov_cvtot(colmask(:),ke_z) - 1.0_rp
451 dens0(:,ke_z,ij) = dens_hyd(colmask(:),ke_z) + prog_vars0(colmask(:),ke_z,dens_vid)
452 w0(:,ke_z,ij) = prog_vars0(colmask(:),ke_z,momz_vid) / dens0(:,ke_z,ij)
454 wt0(:,ke_z,ij) = w0(:,ke_z,ij) + gsqrtv(colmask(:),ke_z) * ( &
455 g13(colmask(:),ke_z) * prog_vars0(colmask(:),ke_z,momx_vid) &
456 + g23(colmask(:),ke_z) * prog_vars0(colmask(:),ke_z,momy_vid) ) / dens0(:,ke_z,ij)
458 enthalpyovdens0(:,ke_z,ij) =&
459 prog_vars0(colmask(:),ke_z,etot_vid) / dens0(:,ke_z,ij) &
460 + gamm_minus_one(:) * ( prog_vars0(colmask(:),ke_z,etot_vid) / dens0(:,ke_z,ij) &
461 - ( kinhovdens00(colmask(:),ke_z) + 0.5_rp * w0(:,ke_z,ij)**2 ) &
462 - geopot(colmask(:),ke_z) )
464 dpresdetot0(:,ke_z,ij) = gamm_minus_one(:)
465 dpresddens0(:,ke_z,ij) = gamm_minus_one(:) * ( ( kinhovdens00(colmask(:),ke_z) + 0.5_rp * w0(:,ke_z,ij)**2 ) - geopot(colmask(:),ke_z) )
466 dpresdmomz0(:,ke_z,ij) = gamm_minus_one(:) * ( - w0(:,ke_z,ij) )
478 do ij=1, elem%Nnode_h1D**2
480 ke = ke_x + (ke_y-1)*lmesh%NeX + (ke_z-1)*lmesh%NeX*lmesh%NeY
481 colmask(:) = elem%Colmask(:,ij)
485 fac_dz_p(:) = impl_fac * lmesh%Escale(colmask(:),ke,3,3) / gsqrtv(colmask(:),ke_z) &
486 * elem%Dx3(colmask(:),colmask(p))
491 pmatd(:,p,dens_vid_lc,dens_vid_lc) = dd(:)
492 pmatd(:,p,dens_vid_lc,momz_vid_lc) = fac_dz_p(:)
495 pmatd(:,p,momz_vid_lc,momz_vid_lc) = dd(:) &
496 + fac_dz_p(:) * dpresdmomz0(p,ke_z,ij)
497 pmatd(:,p,momz_vid_lc,dens_vid_lc) = impl_fac * grav *
intrpmat_vpordm1(colmask(:),colmask(p)) &
498 + fac_dz_p(:) * dpresddens0(p,ke_z,ij)
499 pmatd(:,p,momz_vid_lc,entot_vid_lc) = fac_dz_p(:) * dpresdetot0(p,ke_z,ij)
502 pmatd(:,p,entot_vid_lc,dens_vid_lc) = fac_dz_p(:) * ( dpresddens0(p,ke_z,ij) - enthalpyovdens0(p,ke_z,ij) ) * w0(p,ke_z,ij)
503 pmatd(:,p,entot_vid_lc,momz_vid_lc) = fac_dz_p(:) * ( enthalpyovdens0(p,ke_z,ij) + dpresdmomz0(p,ke_z,ij) * w0(p,ke_z,ij) )
504 pmatd(:,p,entot_vid_lc,entot_vid_lc) = dd(:) + fac_dz_p(:) * ( 1.0_rp + dpresdetot0(p,ke_z,ij) ) * w0(p,ke_z,ij)
509 ke_z2 = max(ke_z-1,1)
510 pv1 = 1; pv2 = elem%Nnode_v
513 ke_z2 = min(ke_z+1,lmesh%NeZ)
514 pv1 = elem%Nnode_v; pv2 = 1
517 fac = 0.5_rp * impl_fac / gsqrtv(colmask(pv1),ke_z)
518 if ( (ke_z == 1 .and. f1==1) .or. (ke_z == lmesh%NeZ .and. f1==elem%Nfaces_v) )
then
525 fmv = elem%Fmask_v(ij,f1)
526 fp = elem%Nfp_h * elem%Nfaces_h + (f1-1)*elem%Nfp_v + ij
527 fp2 = elem%Nfp_h * elem%Nfaces_h + (f2-1)*elem%Nfp_v + ij
530 tmp1 = fac * elem%Lift(fmv,fp) * lmesh%Fscale(fp,ke) &
531 * max( alph(fp,ke_z), alph(fp2,ke_z2) )
533 pmatd(pv1,pv1,momz_vid_lc,momz_vid_lc) = pmatd(pv1,pv1,momz_vid_lc,momz_vid_lc) + 2.0_rp * tmp1
536 pmatd(pv1,pv1,v,v) = pmatd(pv1,pv1,v,v) + tmp1
538 pmatl(pv1,pv2,v,v) = - tmp1
540 pmatu(pv1,pv2,v,v) = - tmp1
546 tmp1 = fac * elem%Lift(fmv,fp) * lmesh%Fscale(fp,ke) * nz(fp,ke_z)
549 pmatd(pv1,pv1,dens_vid_lc,momz_vid_lc ) = pmatd(pv1,pv1,dens_vid_lc,momz_vid_lc ) - 2.0_rp * tmp1
550 pmatd(pv1,pv1,entot_vid_lc,momz_vid_lc ) = pmatd(pv1,pv1,entot_vid_lc,momz_vid_lc ) - 2.0_rp * tmp1 * ( enthalpyovdens0(pv1,ke_z,ij) + dpresdmomz0(pv1,ke_z,ij) * wt0(pv1,ke_z,ij) )
551 pmatd(pv1,pv1,entot_vid_lc,dens_vid_lc ) = pmatd(pv1,pv1,entot_vid_lc,dens_vid_lc ) - 2.0_rp * tmp1 * ( dpresddens0(pv1,ke_z,ij) - enthalpyovdens0(pv1,ke_z,ij) ) * wt0(pv1,ke_z,ij)
552 pmatd(pv1,pv1,entot_vid_lc,entot_vid_lc) = pmatd(pv1,pv1,entot_vid_lc,entot_vid_lc) - 2.0_rp * tmp1 * ( 1.0_rp + dpresdetot0(pv1,ke_z,ij) ) * wt0(pv1,ke_z,ij)
554 pmatd(pv1,pv1,dens_vid_lc,momz_vid_lc) = pmatd(pv1,pv1,dens_vid_lc,momz_vid_lc) - tmp1
556 pmatd(pv1,pv1,momz_vid_lc,dens_vid_lc ) = pmatd(pv1,pv1,momz_vid_lc,dens_vid_lc ) - tmp1 * dpresddens0(pv1,ke_z,ij)
557 pmatd(pv1,pv1,momz_vid_lc,momz_vid_lc ) = pmatd(pv1,pv1,momz_vid_lc,momz_vid_lc ) - tmp1 * dpresdmomz0(pv1,ke_z,ij)
558 pmatd(pv1,pv1,momz_vid_lc,entot_vid_lc) = pmatd(pv1,pv1,momz_vid_lc,entot_vid_lc) - tmp1 * dpresdetot0(pv1,ke_z,ij)
560 pmatd(pv1,pv1,entot_vid_lc,momz_vid_lc ) = pmatd(pv1,pv1,entot_vid_lc,momz_vid_lc ) - tmp1 * ( enthalpyovdens0(pv1,ke_z,ij) + dpresdmomz0(pv1,ke_z,ij) * wt0(pv1,ke_z,ij) )
561 pmatd(pv1,pv1,entot_vid_lc,dens_vid_lc ) = pmatd(pv1,pv1,entot_vid_lc,dens_vid_lc ) - tmp1 * ( dpresddens0(pv1,ke_z,ij) - enthalpyovdens0(pv1,ke_z,ij) ) * wt0(pv1,ke_z,ij)
562 pmatd(pv1,pv1,entot_vid_lc,entot_vid_lc) = pmatd(pv1,pv1,entot_vid_lc,entot_vid_lc) - tmp1 * ( 1.0_rp + dpresdetot0(pv1,ke_z,ij) ) * wt0(pv1,ke_z,ij)
565 pmatl(pv1,pv2,dens_vid_lc,momz_vid_lc) = + tmp1
567 pmatl(pv1,pv2,momz_vid_lc,dens_vid_lc ) = + tmp1 * dpresddens0(pv2,ke_z2,ij)
568 pmatl(pv1,pv2,momz_vid_lc,momz_vid_lc ) = pmatl(pv1,pv2,momz_vid_lc,momz_vid_lc ) &
569 + tmp1 * dpresdmomz0(pv2,ke_z2,ij)
570 pmatl(pv1,pv2,momz_vid_lc,entot_vid_lc) = + tmp1 * dpresdetot0(pv2,ke_z2,ij)
572 pmatl(pv1,pv2,entot_vid_lc,momz_vid_lc) = tmp1 * ( enthalpyovdens0(pv2,ke_z2,ij) + dpresdmomz0(pv2,ke_z2,ij) * wt0(pv2,ke_z2,ij) )
573 pmatl(pv1,pv2,entot_vid_lc,dens_vid_lc) = tmp1 * ( dpresddens0(pv2,ke_z2,ij) - enthalpyovdens0(pv2,ke_z2,ij) ) * wt0(pv2,ke_z2,ij)
574 pmatl(pv1,pv2,entot_vid_lc,entot_vid_lc) = pmatl(pv1,pv2,entot_vid_lc,entot_vid_lc) &
575 + tmp1 * ( 1.0_rp + dpresdetot0(pv2,ke_z2,ij) ) * wt0(pv2,ke_z2,ij)
577 pmatu(pv1,pv2,dens_vid_lc,momz_vid_lc) = + tmp1
579 pmatu(pv1,pv2,momz_vid_lc,dens_vid_lc ) = tmp1 * dpresddens0(pv2,ke_z2,ij)
580 pmatu(pv1,pv2,momz_vid_lc,momz_vid_lc ) = pmatu(pv1,pv2,momz_vid_lc,momz_vid_lc ) &
581 + tmp1 * dpresdmomz0(pv2,ke_z2,ij)
582 pmatu(pv1,pv2,momz_vid_lc,entot_vid_lc) = + tmp1 * dpresdetot0(pv2,ke_z2,ij)
584 pmatu(pv1,pv2,entot_vid_lc,momz_vid_lc ) = tmp1 * ( enthalpyovdens0(pv2,ke_z2,ij) + dpresdmomz0(pv2,ke_z2,ij) * wt0(pv2,ke_z2,ij) )
585 pmatu(pv1,pv2,entot_vid_lc,dens_vid_lc ) = tmp1 * ( dpresddens0(pv2,ke_z2,ij) - enthalpyovdens0(pv2,ke_z2,ij) ) * wt0(pv2,ke_z2,ij)
586 pmatu(pv1,pv2,entot_vid_lc,entot_vid_lc) = pmatu(pv1,pv2,entot_vid_lc,entot_vid_lc) &
587 + tmp1 * ( 1.0_rp + dpresdetot0(pv2,ke_z2,ij) ) * wt0(pv2,ke_z2,ij)
594 if ( eval_flag(v1,v2) )
then
595 do pv2=1, elem%Nnode_v
596 g_kj = v2 + (pv2-1)*3 + (ke_z-1)*elem%Nnode_v*3
597 g_kjm1 = v2 + (pv2-1)*3 + (ke_z-2)*elem%Nnode_v*3
598 g_kjp1 = v2 + (pv2-1)*3 + (ke_z )*elem%Nnode_v*3
600 do pv1=1, elem%Nnode_v
601 pb1 = v1 + (pv1-1)*3 + (ke_z-1)*elem%Nnode_v*3
603 if (ke_z > 1 .and. pv2 == elem%Nnode_v )
then
604 pmatbnd(kl+ku+1+pb1-g_kjm1, v2,pv2,ke_z-1, ij) = pmatl(pv1,pv2,v1,v2)
606 pmatbnd(kl+ku+1+pb1-g_kj, v2,pv2,ke_z, ij) = pmatd(pv1,pv2,v1,v2)
607 if (ke_z < lmesh%NeZ .and. pv2 == 1 )
then
608 pmatbnd(kl+ku+1+pb1-g_kjp1, v2,pv2,ke_z+1, ij) = pmatu(pv1,pv2,v1,v2)
626 PmatBnd_uv, & ! (out)
627 kl_uv, ku_uv, nz_1d_uv, &
628 prog_vars0, kinhovdens00, dens_hyd, pres_hyd, &
629 g13, g23, gsqrtv, alph, &
630 rtot, cptot_ov_cvtot, geopot, &
634 nz, vmapm, vmapp, ke_x, ke_y )
640 integer,
intent(in) :: kl_uv, ku_uv, nz_1d_uv
641 real(rp),
intent(out) :: pmatbnd_uv(2*kl_uv+ku_uv+1,elem%nnode_v,1,lmesh%nez,elem%nnode_h1d**2)
642 real(rp),
intent(in) :: prog_vars0(elem%np,lmesh%nez,
prgvar_num)
643 real(rp),
intent(in) :: kinhovdens00(elem%np,lmesh%nez)
644 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nez)
645 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nez)
646 real(rp),
intent(in) :: g13(elem%np,lmesh%nez)
647 real(rp),
intent(in) :: g23(elem%np,lmesh%nez)
648 real(rp),
intent(in) :: gsqrtv(elem%np,lmesh%nez)
649 real(rp),
intent(in) :: alph(elem%nfptot,lmesh%nez)
650 real(rp),
intent(in) :: rtot(elem%np,lmesh%nez)
651 real(rp),
intent(in) :: cptot_ov_cvtot(elem%np,lmesh%nez)
652 real(rp),
intent(in) :: geopot(elem%np,lmesh%nez)
655 real(rp),
intent(in) :: impl_fac
656 real(rp),
intent(in) :: dt
657 real(rp),
intent(in) :: nz(elem%nfptot,lmesh%nez)
658 integer,
intent(in) :: vmapm(elem%nfptot,lmesh%nez)
659 integer,
intent(in) :: vmapp(elem%nfptot,lmesh%nez)
660 integer,
intent(in) :: ke_x, ke_y
662 real(rp) :: gamm_minus_one(elem%nnode_v)
663 real(rp) :: enthalpyovdens0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
664 real(rp) :: dpresdetot0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
665 real(rp) :: dpresddens0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
666 real(rp) :: dpresdmomz0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
667 real(rp) :: w0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
668 real(rp) :: dens0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
670 real(rp) :: geopot0(elem%nnode_v,lmesh%nez,elem%nnode_h1d**2)
672 integer :: ke_z, ke_z2
673 integer :: v, ke, p, f1, f2, fp, fp2, fmv
675 real(rp) :: pmatd_uv(elem%nnode_v,elem%nnode_v)
676 real(rp) :: pmatl_uv(elem%nnode_v,elem%nnode_v)
677 real(rp) :: pmatu_uv(elem%nnode_v,elem%nnode_v)
679 integer :: colmask(elem%nnode_v)
680 real(rp) :: id(elem%nnode_v,elem%nnode_v)
681 real(rp) :: dd(elem%nnode_v)
684 integer :: ij, v1, v2, pv1, pv2, g_kj, g_kjp1, g_kjm1, pb1
695 pmatd_uv(:,:) = 0.0_rp
696 pmatl_uv(:,:) = 0.0_rp
697 pmatu_uv(:,:) = 0.0_rp
700 do ij=1, elem%Nnode_h1D**2
701 pmatbnd_uv(:,:,:,:,ij) = 0.0_rp
712 do ij=1, elem%Nnode_h1D**2
714 ke = ke_x + (ke_y-1)*lmesh%NeX + (ke_z-1)*lmesh%NeX*lmesh%NeY
715 colmask(:) = elem%Colmask(:,ij)
722 pmatd_uv(:,p) = dd(:)
727 ke_z2 = max(ke_z-1,1)
728 pv1 = 1; pv2 = elem%Nnode_v
731 ke_z2 = min(ke_z+1,lmesh%NeZ)
732 pv1 = elem%Nnode_v; pv2 = 1
735 fac = 0.5_rp * impl_fac / gsqrtv(colmask(pv1),ke_z)
736 if ( (ke_z == 1 .and. f1==1) .or. (ke_z == lmesh%NeZ .and. f1==elem%Nfaces_v) )
then
743 fmv = elem%Fmask_v(ij,f1)
744 fp = elem%Nfp_h * elem%Nfaces_h + (f1-1)*elem%Nfp_v + ij
745 fp2 = elem%Nfp_h * elem%Nfaces_h + (f2-1)*elem%Nfp_v + ij
748 tmp1 = fac * elem%Lift(fmv,fp) * lmesh%Fscale(fp,ke) &
749 * max( alph(fp,ke_z), alph(fp2,ke_z2) )
752 pmatd_uv(pv1,pv1) = pmatd_uv(pv1,pv1) + tmp1
754 pmatl_uv(pv1,pv2) = - tmp1
756 pmatu_uv(pv1,pv2) = - tmp1
762 do pv2=1, elem%Nnode_v
763 g_kj = pv2 + (ke_z-1)*elem%Nnode_v
764 g_kjm1 = pv2 + (ke_z-2)*elem%Nnode_v
765 g_kjp1 = pv2 + (ke_z )*elem%Nnode_v
767 do pv1=1, elem%Nnode_v
768 pb1 = pv1 + (ke_z-1)*elem%Nnode_v
769 if (ke_z > 1 .and. pv2 == elem%Nnode_v )
then
770 pmatbnd_uv(kl_uv+ku_uv+1+pb1-g_kjm1, pv2,1,ke_z-1, ij) = pmatl_uv(pv1,pv2)
772 pmatbnd_uv(kl_uv+ku_uv+1+pb1-g_kj, pv2,1,ke_z, ij) = pmatd_uv(pv1,pv2)
773 if (ke_z < lmesh%NeZ .and. pv2 == 1)
then
774 pmatbnd_uv(kl_uv+ku_uv+1+pb1-g_kjp1, pv2,1,ke_z+1, ij) = pmatu_uv(pv1,pv2)