FE-Project
Loading...
Searching...
No Matches
scale_atm_dyn_dgm_nonhydro3d_rhot_hevi_common_2.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVI / Common
3!!
4!! @par Description
5!! HEVI DGM scheme for Atmospheric dynamical process
6!! As the thermodynamics equation, a density * potential temperature equation is used.
7!!
8!! @author Yuta Kawai, Team SCALE
9!<
10!-------------------------------------------------------------------------------
11#include "scaleFElib.h"
13 !-----------------------------------------------------------------------------
14 !
15 !++ Used modules
16 !
17 use scale_precision
18 use scale_io
19 use scale_prc
20 use scale_prof
21 use scale_const, only: &
22 grav => const_grav, &
23 rdry => const_rdry, &
24 cpdry => const_cpdry, &
25 cvdry => const_cvdry, &
26 pres00 => const_pre00
27
29 use scale_element_base, only: &
38
40
42 dens_vid => prgvar_ddens_id, rhot_vid => prgvar_drhot_id, &
43 momx_vid => prgvar_momx_id, momy_vid => prgvar_momy_id, &
44 momz_vid => prgvar_momz_id, &
46
47 !-----------------------------------------------------------------------------
48 implicit none
49 private
50 !-----------------------------------------------------------------------------
51 !
52 !++ Public procedures
53 !
56
60
64
65 !-----------------------------------------------------------------------------
66 !
67 !++ Public parameters & variables
68 !
69 logical, public :: vi_use_lapack_flag = .true.
70
71 !-----------------------------------------------------------------------------
72 !
73 !++ Private procedures & variables
74 !
75 !-------------------
76
77 private :: vi_cal_del_flux_dyn
78 private :: vi_cal_del_flux_dyn_uv
79
80contains
81 !------------------------------------------------
83 implicit none
84 namelist / param_atmos_dyn_nonhydro3d_rhot_hevi_common / &
86
87 integer :: ierr
88 !---------------------------------------------------------
89
90 !--- read namelist
91 rewind(io_fid_conf)
92 read(io_fid_conf,nml=param_atmos_dyn_nonhydro3d_rhot_hevi_common,iostat=ierr)
93 if( ierr < 0 ) then !--- missing
94 log_info("ATMOS_DYN_nonhydro3d_rhot_hevi_common_setup",*) 'Not found namelist. Default used.'
95 elseif( ierr > 0 ) then !--- fatal error
96 log_error("ATMOS_DYN_nonhydro3d_rhot_hevi_common_setup",*) 'Not appropriate names in namelist PARAM_ATMOS_DYN_NONHYDRO3D_RHOT_HEVI_COMMON. Check!'
97 call prc_abort
98 endif
99 log_nml(param_atmos_dyn_nonhydro3d_rhot_hevi_common)
100
101 return
103
105 implicit none
106 !---------------------------------------------------------
107 return
109
110!OCL SERIAL
112 DENS_t, MOMZ_t, RHOT_t, & ! (out)
113 alph, & ! (in)
114 prog_vars, prog_vars0, & ! (in)
115 ddens00, momx00, momy00, momz00, drhot00, & ! (in)
116 dens_hyd, pres_hyd, & ! (in)
117 rtot, cptot, cvtot, gsqrtv, & ! (in)
118 impl_fac, dt, & ! (in)
119 lmesh, elem, & ! (in)
120 vmapm, vmapp, & ! (in)
121 element3d_operation, & ! (in)
122 im, jm, & ! (in)
123 b, & ! (out)
124 dens, w, wt, pot, dpdrhot ) ! (out)
125
126 implicit none
127
128 class(localmesh3d), intent(in) :: lmesh
129 class(elementbase3d), intent(in) :: elem
130 integer, intent(in) :: im, jm
131 real(rp), intent(out) :: dens_t(elem%np,lmesh%nea)
132 real(rp), intent(out) :: momz_t(elem%np,lmesh%nea)
133 real(rp), intent(out) :: rhot_t(elem%np,lmesh%nea)
134 real(rp), intent(in) :: alph(elem%nfptot,lmesh%nex*lmesh%ney,lmesh%nez)
135 real(rp), intent(in) :: prog_vars (elem%np,lmesh%nex*lmesh%ney*lmesh%nez,prgvar_num)
136 real(rp), intent(in) :: prog_vars0 (elem%np,lmesh%nex*lmesh%ney*lmesh%nez,prgvar_num)
137 real(rp), intent(in) :: ddens00(elem%np,lmesh%nea)
138 real(rp), intent(in) :: momx00 (elem%np,lmesh%nea)
139 real(rp), intent(in) :: momy00 (elem%np,lmesh%nea)
140 real(rp), intent(in) :: momz00 (elem%np,lmesh%nea)
141 real(rp), intent(in) :: drhot00(elem%np,lmesh%nea)
142 real(rp), intent(in) :: dens_hyd(elem%np,lmesh%nea)
143 real(rp), intent(in) :: pres_hyd(elem%np,lmesh%nea)
144 real(rp), intent(in) :: rtot(elem%np,lmesh%nea)
145 real(rp), intent(in) :: cptot(elem%np,lmesh%nea)
146 real(rp), intent(in) :: cvtot(elem%np,lmesh%nea)
147 real(rp), intent(in) :: gsqrtv(elem%np,lmesh%ne)
148 real(rp), intent(in) :: impl_fac
149 real(rp), intent(in) :: dt
150 integer, intent(in) :: vmapm(elem%nfptot,lmesh%ne)
151 integer, intent(in) :: vmapp(elem%nfptot,lmesh%ne)
152 class(elementoperationbase3d), intent(in) :: element3d_operation
153 real(rp), intent(out), optional :: b(im,3,elem%nnode_v,jm,lmesh%ne)
154 real(rp), intent(out), optional :: dens(im,elem%nnode_v,jm,lmesh%ne)
155 real(rp), intent(out), optional :: w(im,elem%nnode_v,jm,lmesh%ne)
156 real(rp), intent(out), optional :: wt(im,elem%nnode_v,jm,lmesh%ne)
157 real(rp), intent(out), optional :: pot(im,elem%nnode_v,jm,lmesh%ne)
158 real(rp), intent(out), optional :: dpdrhot(im,elem%nnode_v,jm,lmesh%ne)
159
160 real(rp) :: flux(elem%np,3), dflux(elem%np,2,3)
161 real(rp) :: del_flux(elem%nfptot,prgvar_num,lmesh%ne)
162 real(rp) :: dpres(elem%np), rhot(elem%np)
163
164 real(rp) :: rdens_, u_, v_, w_, pt_
165 real(rp) :: rgsqrtv(elem%np), rgsqrt(elem%np)
166 real(rp) :: gsqrt_, gsqrtdpres_, e33
167
168 integer :: ke_xy, ke_z
169 integer :: ke, ke2d
170 real(rp) :: rdt
171 real(rp) :: drho(elem%np)
172
173 real(rp) :: gamm, rgamm
174 real(rp) :: rp0
175 real(rp) :: rovp0, p0ovr
176
177 integer :: i, j, p, pp, pv
178
179 real(rp) :: cptot_ov_cvtot
180
181 logical :: flag_cal_b
182 !--------------------------------------------------------
183
184 gamm = cpdry / cvdry
185 rgamm = cvdry / cpdry
186 rp0 = 1.0_rp / pres00
187 rovp0 = rdry * rp0
188 p0ovr = pres00 / rdry
189
190 rdt = 1.0_rp / dt
191
192 if ( present(b) ) then
193 flag_cal_b = .true.
194 else
195 flag_cal_b = .false.
196 end if
197
198 call vi_cal_del_flux_dyn( del_flux, & ! (out)
199 alph, prog_vars, prog_vars0, & ! (in)
200 dens_hyd, pres_hyd, rtot, cptot, cvtot, & ! (in)
201 lmesh%Gsqrt, lmesh%GsqrtH, lmesh%gam, gsqrtv, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), & ! (in)
202 lmesh%normal_fn(:,:,3), vmapm, vmapp, elem%IndexH2Dto3D_bnd, & ! (in)
203 lmesh, elem, lmesh%lcmesh2D, lmesh%lcmesh2D%refElem2D ) ! (in)
204
205 !$omp parallel private( ke_xy, ke_z, ke, ke2d, p, i,j,pv, &
206 !$omp DPRES, RHOT, drho, pt_, Flux, DFlux, &
207 !$omp E33, RGsqrtV, CPtot_ov_CVtot )
208
209 !$omp do collapse(2)
210 do ke_z=1, lmesh%NeZ
211 do ke_xy=1, lmesh%NeX*lmesh%NeY
212 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
213 ke2d = lmesh%EMap3Dto2D(ke)
214
215 do p=1, elem%Np
216 rgsqrtv(p) = 1.0_rp / gsqrtv(p,ke)
217 end do
218
219 !-
220 do p=1, elem%Np
221 flux(p,dens_vid) = prog_vars(p,ke,momz_vid) &
222 + gsqrtv(p,ke) * lmesh%GI3(p,ke,1) * prog_vars(p,ke,momx_vid) &
223 + gsqrtv(p,ke) * lmesh%GI3(p,ke,2) * prog_vars(p,ke,momy_vid)
224 end do
225
226 rhot(:) = p0ovr * (pres_hyd(:,ke)/pres00)**rgamm &
227 + prog_vars(:,ke,rhot_vid)
228 do p=1, elem%Np
229 pt_ = rhot(p) / ( prog_vars(p,ke,dens_vid) + dens_hyd(p,ke) )
230 flux(p,rhot_vid) = pt_ * flux(p,dens_vid)
231 end do
232
233 do p=1, elem%Np
234 flux(p,momz_vid) = pres00 * ( rtot(p,ke) * rp0 * rhot(p) )**(cptot(p,ke) / cvtot(p,ke)) &
235 - pres_hyd(p,ke)
236 end do
237
238 !-
239 call element3d_operation%Dz( flux(:,dens_vid), dflux(:,1,dens_vid) )
240 call element3d_operation%Lift( del_flux(:,dens_vid,ke), dflux(:,2,dens_vid) )
241
242 call element3d_operation%Dz( flux(:,rhot_vid), dflux(:,1,rhot_vid) )
243 call element3d_operation%Lift( del_flux(:,rhot_vid,ke), dflux(:,2,rhot_vid) )
244
245 call element3d_operation%Dz( flux(:,momz_vid), dflux(:,1,momz_vid) )
246 call element3d_operation%Lift( del_flux(:,momz_vid,ke), dflux(:,2,momz_vid) )
247
248 !-
249 do p=1, elem%Np
250 e33 = lmesh%Escale(p,ke,3,3)
251
252 dens_t(p,ke) = - ( &
253 e33 * dflux(p,1,dens_vid) &
254 + dflux(p,2,dens_vid) ) * rgsqrtv(p)
255
256 rhot_t(p,ke) = - ( &
257 e33 * dflux(p,1,rhot_vid) &
258 + dflux(p,2,rhot_vid) ) * rgsqrtv(p)
259 end do
260
261 call element3d_operation%VFilterPM1( prog_vars(:,ke,dens_vid), &
262 drho )
263 do p=1, elem%Np
264 e33 = lmesh%Escale(p,ke,3,3)
265
266 momz_t(p,ke) = - ( &
267 e33 * dflux(p,1,momz_vid) &
268 + dflux(p,2,momz_vid) ) * rgsqrtv(p) &
269 - grav * drho(p)
270 end do
271
272 if ( flag_cal_b ) then
273 do j=1, jm
274 do pv=1, elem%Nnode_v
275 do i=1, im
276 p = i + (j-1)*im + (pv-1)*im*jm
277 dens(i,pv,j,ke) = dens_hyd(p,ke) + prog_vars(p,ke,dens_vid)
278 pot(i,pv,j,ke) = rhot(p) / dens(i,pv,j,ke)
279 w(i,pv,j,ke) = prog_vars(p,ke,momz_vid) / dens(i,pv,j,ke)
280 wt(i,pv,j,ke) = flux(p,dens_vid) / dens(i,pv,j,ke)
281 end do
282 end do
283 end do
284 do j=1, jm
285 do pv=1, elem%Nnode_v
286 do i=1, im
287 p = i + (j-1)*im + (pv-1)*im*jm
288 cptot_ov_cvtot = cptot(p,ke) / cvtot(p,ke)
289 dpdrhot(i,pv,j,ke) = cptot_ov_cvtot &
290 * pres00 * ( rtot(p,ke) / pres00 * rhot(p) )**cptot_ov_cvtot &
291 / rhot(p)
292 end do
293 end do
294 end do
295 end if
296
297 end do
298 end do
299 !$omp end do
300
301 if ( flag_cal_b ) then
302 !$omp do collapse(2)
303 do ke=1, lmesh%Ne
304 do pv=1, elem%Nnode_v
305 do j=1, jm
306 do i=1, im
307 p = i + (j-1)*im + (pv-1)*im*jm
308 b(i,1,pv,j,ke) = impl_fac * dens_t(p,ke) &
309 - prog_vars(p,ke,dens_vid) &
310 + ddens00(p,ke)
311 b(i,2,pv,j,ke) = impl_fac * momz_t(p,ke) &
312 - prog_vars(p,ke,momz_vid) &
313 + momz00(p,ke)
314 b(i,3,pv,j,ke) = impl_fac * rhot_t(p,ke) &
315 - prog_vars(p,ke,rhot_vid) &
316 + drhot00(p,ke)
317 end do
318 end do
319 end do
320 end do
321 !$omp end do
322 end if
323 !$omp end parallel
324
325 return
327
328!OCL SERIAL
330 b, DENS, W, WT, POT, DPDRHOT, alph, &
331 GsqrtV, IntrpMat_VPOrdM1, &
332 impl_fac, dt, &
333 vmapM, vmapP, lmesh, elem, im, jm )
336
337 implicit none
338 class(localmesh3d), intent(in) :: lmesh
339 class(elementbase3d), intent(in) :: elem
340 integer, intent(in) :: im
341 integer, intent(in) :: jm
342 real(rp), intent(inout) :: prog_vars (elem%nnode_h1d**2,elem%nnode_v,lmesh%nex*lmesh%ney,lmesh%nez,prgvar_num)
343 real(rp), intent(inout) :: b(im,3*elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
344 real(rp), intent(in) :: dens(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
345 real(rp), intent(in) :: w(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
346 real(rp), intent(in) :: wt(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
347 real(rp), intent(in) :: pot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
348 real(rp), intent(in) :: dpdrhot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
349 real(rp), intent(in) :: alph(elem%nfptot,lmesh%ne)
350 real(rp), intent(in) :: gsqrtv(elem%np,lmesh%ne)
351 real(rp), intent(in) :: intrpmat_vpordm1(elem%np,elem%np)
352 real(rp), intent(in) :: impl_fac
353 real(rp), intent(in) :: dt
354 integer, intent(in) :: vmapm(elem%nfptot,lmesh%ne)
355 integer, intent(in) :: vmapp(elem%nfptot,lmesh%ne)
356
357 real(rp) :: tmp_v3(3)
358 real(rp) :: bndmatd(im,3*elem%nnode_v,3*elem%nnode_v,jm,lmesh%ne2d)
359 real(rp) :: bndmatl(im,3*elem%nnode_v,3,jm,lmesh%ne2d)
360 real(rp) :: g(im,3*elem%nnode_v,3,jm,lmesh%ne2d,lmesh%nez)
361 integer :: ipiv(im,3*elem%nnode_v)
362
363 integer :: colmask(elem%nnode_v)
364 real(rp) :: intrpmat_vpordm1_(elem%nnode_v,elem%nnode_v)
365 real(rp) :: dx3(elem%nnode_v,elem%nnode_v)
366 real(rp) :: id(elem%nnode_v,elem%nnode_v)
367
368 integer :: ke_xy, ke_z
369 integer :: i, j, ij, pv, pv2
370 integer :: v
371 integer :: pp
372 integer :: p, p1, p2, p3
373 !-----------------------------------------------------------------
374
375 ij = 1
376 colmask(:) = elem%Colmask(:,ij)
377 do pv2=1, elem%Nnode_v
378 do pv=1, elem%Nnode_v
379 p = ij + (pv-1)*elem%Nnode_h1D**2
380 dx3(pv,pv2) = impl_fac * elem%Dx3(p,colmask(pv2))
381 intrpmat_vpordm1_(pv,pv2) = impl_fac * grav * intrpmat_vpordm1(p,colmask(pv2))
382 end do
383 end do
384
385 id(:,:) = 0.0_rp
386 do pv=1, elem%Nnode_v
387 id(pv,pv) = 1.0_rp
388 end do
389
390 do ke_z=1,lmesh%NeZ
392 bndmatl, bndmatd, g(:,:,:,:,:,ke_z), & ! (out)
393 dens, w, wt, pot, dpdrhot, alph, &
394 gsqrtv, lmesh%normal_fn(:,:,3), id, dx3, intrpmat_vpordm1_, &
395 impl_fac, dt, lmesh, elem, im, jm, ke_z )
396
397 call prof_rapstart( 'hevi_cal_vi_lin', 3)
398! call PROF_rapstart( 'hevi_cal_vi_lin_pre', 3)
399 if ( ke_z > 1 ) then
400 !$omp parallel do private( ke_xy,j,pv,i,v, p1,p2,p3,tmp_v3 ) collapse(2)
401 do ke_xy=1, lmesh%NeX * lmesh%NeY
402 do j=1, jm
403 do pv=1, 3*elem%Nnode_v
404 do i=1, im
405 p1 = 1 + (elem%Nnode_v-1)*3
406 p2 = p1 + 1
407 p3 = p1 + 2
408
409 tmp_v3(:) = bndmatl(i,pv,:,j,ke_xy)
410 bndmatd(i,pv,1,j,ke_xy) = bndmatd(i,pv,1,j,ke_xy) &
411 - tmp_v3(1) * g(i,p1,1,j,ke_xy,ke_z-1) &
412 - tmp_v3(2) * g(i,p2,1,j,ke_xy,ke_z-1) &
413 - tmp_v3(3) * g(i,p3,1,j,ke_xy,ke_z-1)
414 bndmatd(i,pv,2,j,ke_xy) = bndmatd(i,pv,2,j,ke_xy) &
415 - tmp_v3(1) * g(i,p1,2,j,ke_xy,ke_z-1) &
416 - tmp_v3(2) * g(i,p2,2,j,ke_xy,ke_z-1) &
417 - tmp_v3(3) * g(i,p3,2,j,ke_xy,ke_z-1)
418 bndmatd(i,pv,3,j,ke_xy) = bndmatd(i,pv,3,j,ke_xy) &
419 - tmp_v3(1) * g(i,p1,3,j,ke_xy,ke_z-1) &
420 - tmp_v3(2) * g(i,p2,3,j,ke_xy,ke_z-1) &
421 - tmp_v3(3) * g(i,p3,3,j,ke_xy,ke_z-1)
422 b(i,pv,j,ke_xy,ke_z) = b(i,pv,j,ke_xy,ke_z) &
423 - tmp_v3(1) * b(i,p1,j,ke_xy,ke_z-1) &
424 - tmp_v3(2) * b(i,p2,j,ke_xy,ke_z-1) &
425 - tmp_v3(3) * b(i,p3,j,ke_xy,ke_z-1)
426 end do
427 end do
428 end do
429 end do
430 end if
431! call PROF_rapend( 'hevi_cal_vi_lin_pre', 3)
432
433 call prof_rapstart( 'hevi_cal_vi_lin_core', 3)
434 call linkernel_solve_var3( bndmatd, b(:,:,:,:,ke_z), g(:,:,:,:,:,ke_z), &
435 elem%Nnode_v, im, jm, lmesh%Ne2D, ke_z == lmesh%NeZ )
436
437 call prof_rapend( 'hevi_cal_vi_lin_core', 3)
438 call prof_rapend( 'hevi_cal_vi_lin', 3)
439 end do
440
441 call prof_rapstart( 'hevi_cal_vi_lin', 3)
442! call PROF_rapstart( 'hevi_cal_vi_lin_post', 3)
443 do ke_z=lmesh%NeZ-1, 1, -1
444 !$omp parallel do private( ke_xy,j,pv,i, tmp_v3 ) collapse(2)
445 do ke_xy=1, lmesh%NeX * lmesh%NeY
446 do j=1, jm
447 do pv=1, 3*elem%Nnode_v
448 do i=1, im
449 tmp_v3(:) = g(i,pv,:,j,ke_xy,ke_z)
450 b(i,pv,j,ke_xy,ke_z) = b(i,pv,j,ke_xy,ke_z) &
451 - tmp_v3(1) * b(i,1,j,ke_xy,ke_z+1) &
452 - tmp_v3(2) * b(i,2,j,ke_xy,ke_z+1) &
453 - tmp_v3(3) * b(i,3,j,ke_xy,ke_z+1)
454 end do
455 end do
456 end do
457 end do
458 end do
459 !$omp parallel do collapse(3) private(pv,i,j,p1,pp)
460 do ke_z=1, lmesh%NeZ
461 do ke_xy=1, lmesh%NeX * lmesh%NeY
462 do j=1, jm
463 do pv=1, elem%Nnode_v
464 do i=1, im
465 p1 = 1 + (pv-1)*3
466 pp = i + (j-1)*im
467 prog_vars(pp,pv,ke_xy,ke_z,dens_vid) = prog_vars(pp,pv,ke_xy,ke_z,dens_vid) + b(i,p1 ,j,ke_xy,ke_z)
468 prog_vars(pp,pv,ke_xy,ke_z,momz_vid) = prog_vars(pp,pv,ke_xy,ke_z,momz_vid) + b(i,p1+1,j,ke_xy,ke_z)
469 prog_vars(pp,pv,ke_xy,ke_z,rhot_vid) = prog_vars(pp,pv,ke_xy,ke_z,rhot_vid) + b(i,p1+2,j,ke_xy,ke_z)
470 end do
471 end do
472 end do
473 end do
474 end do
475! call PROF_rapend( 'hevi_cal_vi_lin_post', 3)
476 call prof_rapend( 'hevi_cal_vi_lin', 3)
477
478 return
480
481!OCL SERIAL
483 MOMX_t, MOMY_t, & ! (out)
484 alph, & ! (out)
485 prog_vars, prog_vars0, & ! (in)
486 ddens00, momx00, momy00, momz00, drhot00, & ! (in)
487 dens_hyd, pres_hyd, & ! (in)
488 rtot, cptot, cvtot, gsqrtv, & ! (in)
489 impl_fac, dt, & ! (in)
490 lmesh, elem, & ! (in)
491 vmapm, vmapp, & ! (in)
492 element3d_operation, & ! (in)
493 im, jm, & ! (in)
494 b1d_ij_uv ) ! (out)
495
496 implicit none
497
498 class(localmesh3d), intent(in) :: lmesh
499 class(elementbase3d), intent(in) :: elem
500 real(rp), intent(out) :: momx_t(elem%np,lmesh%nea)
501 real(rp), intent(out) :: momy_t(elem%np,lmesh%nea)
502 real(rp), intent(out) :: alph(elem%nfptot,lmesh%ne)
503 real(rp), intent(in) :: prog_vars (elem%np,lmesh%ne,prgvar_num)
504 real(rp), intent(in) :: prog_vars0 (elem%np,lmesh%ne,prgvar_num)
505 real(rp), intent(in) :: ddens00(elem%np,lmesh%nea)
506 real(rp), intent(in) :: momx00 (elem%np,lmesh%nea)
507 real(rp), intent(in) :: momy00 (elem%np,lmesh%nea)
508 real(rp), intent(in) :: momz00 (elem%np,lmesh%nea)
509 real(rp), intent(in) :: drhot00(elem%np,lmesh%nea)
510 real(rp), intent(in) :: dens_hyd(elem%np,lmesh%nea)
511 real(rp), intent(in) :: pres_hyd(elem%np,lmesh%nea)
512 real(rp), intent(in) :: rtot(elem%np,lmesh%nea)
513 real(rp), intent(in) :: cptot(elem%np,lmesh%nea)
514 real(rp), intent(in) :: cvtot(elem%np,lmesh%nea)
515 real(rp), intent(in) :: gsqrtv(elem%np,lmesh%ne)
516 real(rp), intent(in) :: impl_fac
517 real(rp), intent(in) :: dt
518 integer, intent(in) :: vmapm(elem%nfptot,lmesh%ne)
519 integer, intent(in) :: vmapp(elem%nfptot,lmesh%ne)
520 class(elementoperationbase3d), intent(in) :: element3d_operation
521 integer, intent(in) :: im, jm
522 real(rp), intent(out), optional :: b1d_ij_uv(im*elem%nnode_v,2,jm,lmesh%ne)
523
524 real(rp) :: rgsqrtv
525 real(rp) :: liftdelflx(elem%np,2)
526 real(rp) :: del_flux(elem%nfptot,2,lmesh%ne)
527 integer :: ke_xy, ke_z
528 integer :: ke, ke2d
529 integer :: fp
530
531 integer :: i, j, p, pp, pv
532 !--------------------------------------------------------
533
534 call vi_cal_del_flux_dyn_uv( del_flux, alph, & ! (out)
535 prog_vars, prog_vars0, & ! (in)
536 dens_hyd, pres_hyd, rtot, cptot, cvtot, & ! (in)
537 lmesh%Gsqrt, lmesh%GIJ(:,:,1,1), lmesh%GIJ(:,:,1,2), lmesh%GIJ(:,:,2,2), & ! (in)
538 lmesh%GsqrtH, lmesh%gam, gsqrtv, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), & ! (in)
539 lmesh%normal_fn(:,:,3), vmapm, vmapp, elem%IndexH2Dto3D_bnd, & ! (in)
540 lmesh, elem, lmesh%lcmesh2D, lmesh%lcmesh2D%refElem2D ) ! (in)
541
542 !$omp parallel private( ke_xy, ke_z, ke, ke2D, fp, pv, i, j, p, pp, &
543 !$omp LiftDelFlx, RGsqrtV )
544
545 !$omp do collapse(2)
546 do ke_z=1, lmesh%NeZ
547 do ke_xy=1, lmesh%NeX*lmesh%NeY
548 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
549 ke2d = lmesh%EMap3Dto2D(ke)
550
551 call element3d_operation%Lift( del_flux(:,1,ke), liftdelflx(:,1) )
552 call element3d_operation%Lift( del_flux(:,2,ke), liftdelflx(:,2) )
553
554 do fp=1, elem%Np
555 rgsqrtv = 1.0_rp / gsqrtv(fp,ke)
556 momx_t(fp,ke) = - liftdelflx(fp,1) * rgsqrtv
557 momy_t(fp,ke) = - liftdelflx(fp,2) * rgsqrtv
558 end do
559 end do
560 end do
561 !$omp end do
562
563 if ( present( b1d_ij_uv ) ) then
564 !$omp do collapse(2)
565 do ke=1, lmesh%Ne
566 do pv=1, elem%Nnode_v
567 do j=1, jm
568 do i=1, im
569 pp = i + (pv-1)*im
570 p = i + (j-1)*im + (pv-1)*im*jm
571 b1d_ij_uv(pp,1,j,ke) = impl_fac * momx_t(p,ke) &
572 - prog_vars(p,ke,momx_vid) &
573 + momx00(p,ke)
574 b1d_ij_uv(pp,2,j,ke) = impl_fac * momy_t(p,ke) &
575 - prog_vars(p,ke,momy_vid) &
576 + momy00(p,ke)
577 end do
578 end do
579 end do
580 end do
581 !$omp end do
582 end if
583 !$omp end parallel
584
585 return
587
588!OCL SERIAL
590 b_uv, alph, &
591 GsqrtV, &
592 impl_fac, dt, &
593 vmapM, vmapP, lmesh, elem, im, jm )
596 implicit none
597 class(localmesh3d), intent(in) :: lmesh
598 class(elementbase3d), intent(in) :: elem
599 integer, intent(in) :: im
600 integer, intent(in) :: jm
601 real(rp), intent(inout) :: prog_vars(elem%nnode_h1d**2,elem%nnode_v,lmesh%nex*lmesh%ney,lmesh%nez,prgvar_num)
602 real(rp), intent(inout) :: b_uv(im*elem%nnode_v,2,jm,lmesh%ne2d,lmesh%nez)
603 real(rp), intent(in) :: alph(elem%nfptot,lmesh%ne)
604 real(rp), intent(in) :: gsqrtv(elem%np,lmesh%ne)
605 real(rp), intent(in) :: impl_fac
606 real(rp), intent(in) :: dt
607 integer, intent(in) :: vmapm(elem%nfptot,lmesh%ne)
608 integer, intent(in) :: vmapp(elem%nfptot,lmesh%ne)
609
610 real(rp) :: tmp
611 real(rp) :: bndmatd_uv(im*elem%nnode_v,elem%nnode_v,jm,lmesh%ne2d)
612 real(rp) :: bndmatl_uv(im*elem%nnode_v,jm,lmesh%ne2d)
613 real(rp) :: g_uv(im*elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
614 integer :: ipiv_uv(im*elem%nnode_v)
615
616 integer :: ke_xy, ke_z
617 integer :: i, pv, j
618 integer :: v
619 integer :: p, pp
620 integer :: p1, p2, p3
621 !-----------------------------------------------------------------
622
623 do ke_z=1, lmesh%NeZ
625 bndmatl_uv, bndmatd_uv, g_uv(:,:,:,ke_z), & ! (out)
626 alph, gsqrtv, impl_fac, dt, lmesh, elem, im, jm, vmapm, vmapp, & ! (in)
627 ke_z ) ! (in)
628
629 call prof_rapstart( 'hevi_cal_vi_lin_uv', 3)
630 if ( ke_z > 1 ) then
631 !$omp parallel do private( ke_xy,j,pv,i, pp,p2,tmp ) collapse(2)
632 do ke_xy=1, lmesh%NeX * lmesh%NeY
633 do j=1, jm
634 do pv=1, elem%Nnode_v
635 do i=1, im
636 pp = i + (pv-1)*im
637 p2 = i + (elem%Nnode_v-1)*im
638 tmp = bndmatl_uv(pp,j,ke_xy)
639 bndmatd_uv(pp,1,j,ke_xy) = bndmatd_uv(pp,1,j,ke_xy) - tmp * g_uv(p2,j,ke_xy,ke_z-1)
640 b_uv(pp,1,j,ke_xy,ke_z) = b_uv(pp,1,j,ke_xy,ke_z) - tmp * b_uv(p2,1,j,ke_xy,ke_z-1)
641 b_uv(pp,2,j,ke_xy,ke_z) = b_uv(pp,2,j,ke_xy,ke_z) - tmp * b_uv(p2,2,j,ke_xy,ke_z-1)
642 end do
643 end do
644 end do
645 end do
646 end if
647
648 call linkernel_solve_uv( bndmatd_uv, b_uv(:,:,:,:,ke_z), g_uv(:,:,:,ke_z), &
649 elem%Nnode_v, im, jm, lmesh%Ne2D, ke_z==lmesh%NeZ )
650
651 call prof_rapend( 'hevi_cal_vi_lin_uv', 3)
652 end do
653 call prof_rapstart( 'hevi_cal_vi_lin_uv', 3)
654 do ke_z=lmesh%NeZ-1, 1, -1
655 !$omp parallel do private( ke_xy,j,pv,i, pp,p2,tmp ) collapse(2)
656 do ke_xy=1, lmesh%NeX * lmesh%NeY
657 do j=1, jm
658 do pv=1, elem%Nnode_v
659 do i=1, im
660 pp = i + (pv-1)*im
661 p2 = i ! + (1-1)*im
662 tmp = g_uv(pp,j,ke_xy,ke_z)
663 b_uv(pp,1,j,ke_xy,ke_z) = b_uv(pp,1,j,ke_xy,ke_z) - tmp * b_uv(p2,1,j,ke_xy,ke_z+1)
664 b_uv(pp,2,j,ke_xy,ke_z) = b_uv(pp,2,j,ke_xy,ke_z) - tmp * b_uv(p2,2,j,ke_xy,ke_z+1)
665 end do
666 end do
667 end do
668 end do
669 end do
670 !$omp parallel do private(ke_z,ke_xy,j,pv,i,pp,p) collapse(2)
671 do ke_z=1, lmesh%NeZ
672 do ke_xy=1, lmesh%NeX * lmesh%NeY
673 do j=1, jm
674 do pv=1, elem%Nnode_v
675 do i=1, im
676 p = i + (pv-1)*im
677 pp = i + (j-1)*im
678 prog_vars(pp,pv,ke_xy,ke_z,momx_vid) = prog_vars(pp,pv,ke_xy,ke_z,momx_vid) + b_uv(p,1,j,ke_xy,ke_z)
679 prog_vars(pp,pv,ke_xy,ke_z,momy_vid) = prog_vars(pp,pv,ke_xy,ke_z,momy_vid) + b_uv(p,2,j,ke_xy,ke_z)
680 end do
681 end do
682 end do
683 end do
684 end do
685
686 call prof_rapend( 'hevi_cal_vi_lin_uv', 3)
687
688 return
690
691!--
692!OCL SERIAL
694 BndMatL, BndMatD, BndMatU, & ! (out)
695 dens, w, wt, pot, dpdrhot, & ! (in)
696 alph, gsqrtv, nz, & ! (in)
697 id, fac_dx3, fac_intrpmat_vpordm1, & ! (in)
698 impl_fac, dt, & ! (in)
699 lmesh, elem, im, jm, & ! (in)
700 ke_z ) ! (in)
701
702 class(localmesh3d), intent(in) :: lmesh
703 class(elementbase3d), intent(in) :: elem
704 integer, intent(in) :: im, jm
705 real(rp), intent(out) :: bndmatl(im,3,elem%nnode_v,3,jm,lmesh%ne2d)
706 real(rp), intent(out) :: bndmatd(im,3,elem%nnode_v,3,elem%nnode_v,jm,lmesh%ne2d)
707 real(rp), intent(out) :: bndmatu(im,3,elem%nnode_v,3,jm,lmesh%ne2d)
708 real(rp), intent(in) :: dens(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
709 real(rp), intent(in) :: w(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
710 real(rp), intent(in) :: wt(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
711 real(rp), intent(in) :: pot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
712 real(rp), intent(in) :: dpdrhot(im,elem%nnode_v,jm,lmesh%ne2d,lmesh%nez)
713 real(rp), intent(in) :: alph(elem%nfptot,lmesh%ne)
714 real(rp), intent(in) :: gsqrtv(elem%np,lmesh%ne)
715 real(rp), intent(in) :: nz(elem%nfptot,lmesh%ne)
716 real(rp), intent(in) :: id(elem%nnode_v,elem%nnode_v)
717 real(rp), intent(in) :: fac_dx3(elem%nnode_v,elem%nnode_v)
718 real(rp), intent(in) :: fac_intrpmat_vpordm1(elem%nnode_v,elem%nnode_v)
719 real(rp), intent(in) :: impl_fac
720 real(rp), intent(in) :: dt
721 integer, intent(in) :: ke_z
722
723 real(rp) :: fac_dz(im,elem%nnode_v,elem%nnode_v)
724 real(rp) :: tmp1(im,elem%nnode_v)
725 real(rp) :: tmp2(im,elem%nnode_v)
726
727 integer :: p, p2, pv, pv1, pv2
728 integer :: fp,fp2
729 integer :: ke, ke2d
730 integer :: ke_z2, ke_2
731 integer :: ij, i, j
732 integer :: f1, f2
733 integer :: v
734
735 real(rp) :: fac
736 logical :: bc_flag
737
738 integer, parameter :: dens_vid_lc = 1
739 integer, parameter :: momz_vid_lc = 2
740 integer, parameter :: rhot_vid_lc = 3
741
742 !---------------------------------------------------------------------------
743
744 call prof_rapstart( 'hevi_cal_vi_matbnd', 3)
745
746 !$omp parallel private(ke2D,j,ke, pv,pv1,pv2, p,p2, fp,fp2, ke_z2,ke_2, i,ij, f1,f2, v, fac, bc_flag, &
747 !$omp fac_dz, tmp1, tmp2 )
748 !$omp do collapse(2)
749 do ke2d=1, lmesh%Ne2D
750 do j=1, jm
751 ke = ke2d + (ke_z-1)*lmesh%Ne2D
752
753 do pv2=1, elem%Nnode_v
754 do pv=1, elem%Nnode_v
755 do i=1, im
756 ij = i + (j-1)*im
757 p = ij + (pv-1)*im*jm
758 fac_dz(i,pv,pv2) = lmesh%Escale(p,ke,3,3) / gsqrtv(p,ke) * fac_dx3(pv,pv2)
759 end do
760 end do
761 end do
762
763 do pv2=1, elem%Nnode_v
764 do pv=1, elem%Nnode_v
765 do i=1, im
766 ! DDENS
767 bndmatd(i,dens_vid_lc,pv,dens_vid_lc,pv2,j,ke2d) = id(pv,pv2)
768 bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv2,j,ke2d) = fac_dz(i,pv,pv2)
769 bndmatd(i,dens_vid_lc,pv,rhot_vid_lc,pv2,j,ke2d) = 0.0_rp
770
771 ! MOMZ
772 bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv2,j,ke2d) = id(pv,pv2) ! &
773 !+ fac_dz_p(i,pv,pv2,j) * 2.0_RP * W0(i,pv2,j) [ <- d_MOMZ ( MOMZ x MOMZ / DENS ) ]
774 bndmatd(i,momz_vid_lc,pv,dens_vid_lc,pv2,j,ke2d) = fac_intrpmat_vpordm1(pv,pv2) ! &
775 !- fac_dz_p(i,pv,pv2,j) * W0(i,pv2,j)**2 [ <- d_DENS ( MOMZ x MOMZ / DENS ) ]
776 bndmatd(i,momz_vid_lc,pv,rhot_vid_lc,pv2,j,ke2d) = fac_dz(i,pv,pv2) * dpdrhot(i,pv2,j,ke2d,ke_z)
777
778 ! DRHOT
779 bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv2,j,ke2d) = - fac_dz(i,pv,pv2) * pot(i,pv2,j,ke2d,ke_z) * wt(i,pv2,j,ke2d,ke_z)
780 bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv2,j,ke2d) = fac_dz(i,pv,pv2) * pot(i,pv2,j,ke2d,ke_z)
781 bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv2,j,ke2d) = id(pv,pv2) + fac_dz(i,pv,pv2) * wt(i,pv2,j,ke2d,ke_z)
782 end do
783 end do
784 end do
785
786 do f1=1, 2
787 if (f1==1) then
788 ke_z2 = max(ke_z-1,1)
789 pv1 = 1; pv2 = elem%Nnode_v; f2 = 2
790 else
791 ke_z2 = min(ke_z+1,lmesh%NeZ)
792 pv1 = elem%Nnode_v; pv2 = 1; f2 = 1
793 end if
794 ke_2 = ke2d + (ke_z2-1)*lmesh%Ne2D
795
796 if ( (ke_z == 1 .and. f1==1) .or. (ke_z == lmesh%NeZ .and. f1==elem%Nfaces_v) ) then
797 bc_flag = .true.
798 pv2 = pv1; f2 = f1
799 else
800 bc_flag = .false.
801 end if
802
803 do pv=1, elem%Nnode_v
804 do i=1, im
805 ij = i + (j-1)*im
806 fp = elem%Nfp_h * elem%Nfaces_h + (f1-1)*elem%Nfp_v + ij
807 fp2 = elem%Nfp_h * elem%Nfaces_h + (f2-1)*elem%Nfp_v + ij
808 p = ij + (pv-1)*im*jm
809
810 !--
811 fac = 0.5_rp * impl_fac / gsqrtv(p,ke) * elem%Lift(p,fp) * lmesh%Fscale(fp,ke)
812 tmp1(i,pv) = fac * max( alph(fp,ke), alph(fp2,ke_2) )
813 tmp2(i,pv) = fac * nz(fp,ke)
814 end do
815 end do
816
817 !--
818
819 if ( bc_flag ) then
820 do pv=1, elem%Nnode_v
821 do i=1, im
822 ! d ( Eqs. ) / d DENS
823 bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) + 2.0_rp * tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z) * wt(i,pv1,j,ke2d,ke_z)
824
825 ! d ( Eqs. ) / d MOMZ
826 bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - 2.0_rp * tmp2(i,pv)
827 bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) + 2.0_rp * tmp1(i,pv)
828 bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - 2.0_rp * tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z)
829
830 ! d ( Eqs. ) / d RHOT
831 bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) - 2.0_rp * tmp2(i,pv) * wt(i,pv1,j,ke2d,ke_z)
832
833 end do
834 end do
835 else
836 do pv=1, elem%Nnode_v
837 do i=1, im
838 ! d ( Eqs. ) / d DENS
839 bndmatd(i,dens_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) = bndmatd(i,dens_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) + tmp1(i,pv)
840 bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,dens_vid_lc,pv1,j,ke2d) + tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z) * wt(i,pv1,j,ke2d,ke_z)
841
842 ! d ( Eqs. ) / d MOMZ
843 bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,dens_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - tmp2(i,pv)
844 bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,momz_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) + tmp1(i,pv)
845 bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,momz_vid_lc,pv1,j,ke2d) - tmp2(i,pv) * pot(i,pv1,j,ke2d,ke_z)
846
847 ! d ( Eqs. ) / d RHOT
848 bndmatd(i,momz_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) = bndmatd(i,momz_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) - tmp2(i,pv) * dpdrhot(i,pv1,j,ke2d,ke_z)
849 bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) = bndmatd(i,rhot_vid_lc,pv,rhot_vid_lc,pv1,j,ke2d) + tmp1(i,pv) &
850 - tmp2(i,pv) * wt(i,pv1,j,ke2d,ke_z)
851 end do
852 end do
853 if ( f1 == 1 ) then
854 do pv=1, elem%Nnode_v
855 do i=1, im
856 ! d ( Eqs. ) / d DENS
857 bndmatl(i,dens_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp1(i,pv)
858 bndmatl(i,momz_vid_lc,pv,dens_vid_lc,j,ke2d) = 0.0_rp
859 bndmatl(i,rhot_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2) * wt(i,pv2,j,ke2d,ke_z2)
860 ! d ( Eqs. ) / d MOMZ
861 bndmatl(i,dens_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv)
862 bndmatl(i,momz_vid_lc,pv,momz_vid_lc,j,ke2d) = - tmp1(i,pv)
863 bndmatl(i,rhot_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2)
864 ! d ( Eqs. ) / d RHOT
865 bndmatl(i,dens_vid_lc,pv,rhot_vid_lc,j,ke2d) = 0.0_rp
866 bndmatl(i,momz_vid_lc,pv,rhot_vid_lc,j,ke2d) = + tmp2(i,pv) * dpdrhot(i,pv2,j,ke2d,ke_z2)
867 bndmatl(i,rhot_vid_lc,pv,rhot_vid_lc,j,ke2d) = - tmp1(i,pv) &
868 + tmp2(i,pv) * wt(i,pv2,j,ke2d,ke_z2)
869 end do
870 end do
871 else
872 do pv=1, elem%Nnode_v
873 do i=1, im
874 ! d ( Eqs. ) / d DENS
875 bndmatu(i,dens_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp1(i,pv)
876 bndmatu(i,momz_vid_lc,pv,dens_vid_lc,j,ke2d) = 0.0_rp
877 bndmatu(i,rhot_vid_lc,pv,dens_vid_lc,j,ke2d) = - tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2) * wt(i,pv2,j,ke2d,ke_z2)
878 ! d ( Eqs. ) / d MOMZ
879 bndmatu(i,dens_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv)
880 bndmatu(i,momz_vid_lc,pv,momz_vid_lc,j,ke2d) = - tmp1(i,pv)
881 bndmatu(i,rhot_vid_lc,pv,momz_vid_lc,j,ke2d) = + tmp2(i,pv) * pot(i,pv2,j,ke2d,ke_z2)
882 ! d ( Eqs. ) / d RHOT
883 bndmatu(i,dens_vid_lc,pv,rhot_vid_lc,j,ke2d) = 0.0_rp
884 bndmatu(i,momz_vid_lc,pv,rhot_vid_lc,j,ke2d) = + tmp2(i,pv) * dpdrhot(i,pv2,j,ke2d,ke_z2)
885 bndmatu(i,rhot_vid_lc,pv,rhot_vid_lc,j,ke2d) = - tmp1(i,pv) &
886 + tmp2(i,pv) * wt(i,pv2,j,ke2d,ke_z2)
887 end do
888 end do
889 end if
890 end if
891
892 end do ! end do for f
893 end do ! end for j
894 end do ! end do for ke2D
895 !$omp end do
896 !$omp end parallel
897
898 call prof_rapend( 'hevi_cal_vi_matbnd', 3)
899
900 return
902
903!OCL SERIAL
905 BndMatL_uv, BndMatD_uv, BndMatU_uv, & ! (out)
906 alph, gsqrtv, & ! (in)
907 impl_fac, dt, & ! (in)
908 lmesh, elem, im, jm, & ! (in)
909 vmapm, vmapp, ke_z ) ! (in)
910
911 class(localmesh3d), intent(in) :: lmesh
912 class(elementbase3d), intent(in) :: elem
913 integer, intent(in) :: im, jm
914 real(rp), intent(out) :: bndmatl_uv(im,elem%nnode_v,jm,lmesh%ne2d)
915 real(rp), intent(out) :: bndmatd_uv(im,elem%nnode_v,elem%nnode_v,jm,lmesh%ne2d)
916 real(rp), intent(out) :: bndmatu_uv(im,elem%nnode_v,jm,lmesh%ne2d)
917 real(rp), intent(in) :: alph(elem%nfptot,lmesh%ne)
918 real(rp), intent(in) :: gsqrtv(elem%np,lmesh%ne)
919 real(rp), intent(in) :: impl_fac
920 real(rp), intent(in) :: dt
921 integer, intent(in) :: vmapm(elem%nfptot,lmesh%ne)
922 integer, intent(in) :: vmapp(elem%nfptot,lmesh%ne)
923 integer, intent(in) :: ke_z
924
925 integer :: colmask(elem%nnode_v)
926 real(rp) :: id(elem%nnode_v,elem%nnode_v)
927 real(rp) :: dd(elem%nnode_v)
928 real(rp) :: tmp1(im,elem%nnode_v)
929
930 integer :: p, pv, pv1, pv2
931 integer :: fp,fp2
932 integer :: ke, ke2d
933 integer :: ke_z2, ke_2
934 integer :: ij, i, j
935 integer :: f1, f2
936
937 real(rp) :: fac
938 logical :: bc_flag
939 !---------------------------------------------------------------------------
940
941 call prof_rapstart( 'hevi_cal_vi_matbnd_uv', 3)
942
943 id(:,:) = 0.0_rp
944 do p=1, elem%Nnode_v
945 id(p,p) = 1.0_rp
946 end do
947
948 !$omp parallel private(ke2D,j,ke, pv2,pv,i, f1, ke_z2, pv1,f2, bc_flag, ij,fp,fp2,p, fac,tmp1)
949 !$omp do collapse(2)
950 do ke2d=1, lmesh%Ne2D
951 do j=1, jm
952 ke = ke2d + (ke_z-1)*lmesh%Ne2D
953
954 do pv2=1, elem%Nnode_v
955 do pv=1, elem%Nnode_v
956 do i=1, im
957 bndmatd_uv(i,pv,pv2,j,ke2d) = id(pv,pv2)
958 end do
959 end do
960 end do
961
962 do f1=1, 2
963 if (f1==1) then
964 ke_z2 = max(ke_z-1,1)
965 pv1 = 1; f2 = 2
966 else
967 ke_z2 = min(ke_z+1,lmesh%NeZ)
968 pv1 = elem%Nnode_v; f2 = 1
969 end if
970 ke_2 = ke2d + (ke_z2-1)*lmesh%Ne2D
971
972 if ( (ke_z == 1 .and. f1==1) .or. (ke_z == lmesh%NeZ .and. f1==elem%Nfaces_v) ) then
973 bc_flag = .true.
974 f2 = f1
975 else
976 bc_flag = .false.
977 end if
978
979 do pv=1, elem%Nnode_v
980 do i=1, im
981 ij = i + (j-1)*im
982 fp = elem%Nfp_h * elem%Nfaces_h + (f1-1)*elem%Nfp_v + ij
983 fp2 = elem%Nfp_h * elem%Nfaces_h + (f2-1)*elem%Nfp_v + ij
984 p = ij + (pv-1)*im*jm
985
986 !--
987 fac = 0.5_rp * impl_fac / gsqrtv(p,ke)
988 tmp1(i,pv) = fac * elem%Lift(p,fp) * lmesh%Fscale(fp,ke) &
989 * max( alph(fp,ke), alph(fp2,ke_2) )
990 end do
991 end do
992
993 if (bc_flag) then
994 else
995 bndmatd_uv(:,:,pv1,j,ke2d) = bndmatd_uv(:,:,pv1,j,ke2d) + tmp1(:,:)
996 if (f1 == 1) then
997 bndmatl_uv(:,:,j,ke2d) = - tmp1(:,:)
998 else
999 bndmatu_uv(:,:,j,ke2d) = - tmp1(:,:)
1000 end if
1001 end if
1002 end do ! end do for f
1003
1004 end do ! end do for j
1005 end do ! end do for ke2D
1006 !$omp end do
1007 !$omp end parallel
1008 call prof_rapend( 'hevi_cal_vi_matbnd_uv', 3)
1009
1010 return
1012
1013!-- private ----------------
1014
1015!OCL SERIAL
1016 subroutine vi_cal_del_flux_dyn_uv( del_flux, alph, & ! (out)
1017 pvars_, pvars0_, & ! (in)
1018 dens_hyd, pres_hyd, rtot, cptot, cvtot, & ! (in)
1019 gsqrt, g11, g12, g22, gsqrth, gam, gsqrtv, g13, g23, & ! (in)
1020 nz, vmapm, vmapp, im2dto3d, lmesh, elem, lmesh2d, elem2d ) ! (in)
1021
1022 implicit none
1023
1024 class(localmesh3d), intent(in) :: lmesh
1025 class(elementbase3d), intent(in) :: elem
1026 class(localmesh2d), intent(in) :: lmesh2d
1027 class(elementbase2d), intent(in) :: elem2d
1028 real(rp), intent(out) :: del_flux(elem%nfptot,2,lmesh%ne)
1029 real(rp), intent(out) :: alph(elem%nfptot,lmesh%ne)
1030 real(rp), intent(in) :: pvars_ (elem%np*lmesh%ne,prgvar_num)
1031 real(rp), intent(in) :: pvars0_(elem%np*lmesh%ne,prgvar_num)
1032 real(rp), intent(in) :: dens_hyd(elem%np*lmesh%nea)
1033 real(rp), intent(in) :: pres_hyd(elem%np*lmesh%nea)
1034 real(rp), intent(in) :: rtot(elem%np*lmesh%nea)
1035 real(rp), intent(in) :: cptot(elem%np*lmesh%nea)
1036 real(rp), intent(in) :: cvtot(elem%np*lmesh%nea)
1037 real(rp), intent(in) :: gsqrt(elem%np*lmesh%nea)
1038 real(rp), intent(in) :: g11(elem2d%np,lmesh2d%ne)
1039 real(rp), intent(in) :: g12(elem2d%np,lmesh2d%ne)
1040 real(rp), intent(in) :: g22(elem2d%np,lmesh2d%ne)
1041 real(rp), intent(in) :: gsqrth(elem2d%np,lmesh2d%ne)
1042 real(rp), intent(in) :: gam(elem%np*lmesh%nea)
1043 real(rp), intent(in) :: gsqrtv(elem%np*lmesh%ne)
1044 real(rp), intent(in) :: g13(elem%np*lmesh%nea)
1045 real(rp), intent(in) :: g23(elem%np*lmesh%nea)
1046 real(rp), intent(in) :: nz(elem%nfptot,lmesh%ne)
1047 integer, intent(in) :: vmapm(elem%nfptot,lmesh%ne)
1048 integer, intent(in) :: vmapp(elem%nfptot,lmesh%ne)
1049 integer, intent(in) :: im2dto3d(elem%nfptot)
1050
1051 integer :: fp, ke, ke2d
1052 integer :: ip(elem%nfptot), im(elem%nfptot)
1053 real(rp) :: momx0(elem%nfptot,2)
1054 real(rp) :: momy0(elem%nfptot,2)
1055 real(rp) :: drhot0(elem%nfptot,2)
1056 real(rp) :: rhot_hyd(elem%nfptot,2)
1057 real(rp) :: cptot_ov_cvtot(elem%nfptot,2)
1058 real(rp) :: rtot_(elem%nfptot,2)
1059 real(rp) :: wt0(elem%nfptot,2)
1060 real(rp) :: pres0(elem%nfptot,2)
1061 real(rp) :: rdens0(elem%nfptot,2)
1062
1063 real(rp) :: gsqrt_(elem%nfptot,2)
1064 real(rp) :: gsqrtv_(elem%nfptot,2)
1065 real(rp) :: rgsqrtv(elem%nfptot,2)
1066 real(rp) :: rgam2(elem%nfptot,2)
1067 real(rp) :: g13_(elem%nfptot,2)
1068 real(rp) :: g23_(elem%nfptot,2)
1069 real(rp) :: gxz_(elem%nfptot,2)
1070 real(rp) :: gyz_(elem%nfptot,2)
1071 real(rp) :: g11_, g12_, g22_
1072 real(rp) :: gnn_m, gnn_p
1073
1074 real(rp) :: tmp1
1075
1076 real(rp) :: gamm, rgamm, pres0ovrdry, rp0
1077
1078 integer, parameter :: in = 1
1079 integer, parameter :: ex = 2
1080 !------------------------------------------------------------------------
1081
1082 gamm = cpdry / cvdry
1083 rgamm = cvdry / cpdry
1084 pres0ovrdry = pres00 / rdry
1085 rp0 = 1.0_rp / pres00
1086
1087 !$omp parallel private( ke, ke2D, fp, iM, iP, &
1088 !$omp MOMX0, MOMY0, DRHOT0, wt0, rdens0, pres0, &
1089 !$omp CPtot_ov_CVtot, Rtot_, rhot_hyd, &
1090 !$omp Gsqrt_, GsqrtV_, RGsqrtV, G11_, G12_, G22_, G13_, G23_, rgam2, &
1091 !$omp Gxz_, Gyz_, Gnn_M, Gnn_P, &
1092 !$omp tmp1 )
1093
1094 !$omp do
1095 do ke=lmesh%NeS, lmesh%NeE
1096 ke2d = lmesh%EMap3Dto2D(ke)
1097 im(:) = vmapm(:,ke); ip(:) = vmapp(:,ke)
1098
1099 gsqrt_(:,in) = gsqrt(im)
1100 gsqrt_(:,ex) = gsqrt(ip)
1101
1102 rgam2(:,in) = 1.0_rp / gam(im)**2
1103 rgam2(:,ex) = 1.0_rp / gam(ip)**2
1104 gsqrtv_(:,in) = gsqrtv(im)
1105 gsqrtv_(:,ex) = gsqrtv(ip)
1106 rgsqrtv(:,:) = 1.0_rp / gsqrtv_(:,:)
1107
1108 g13_(:,in) = g13(im)
1109 g13_(:,ex) = g13(ip)
1110 g23_(:,in) = g23(im)
1111 g23_(:,ex) = g23(ip)
1112
1113 momx0(:,in) = pvars0_(im(:),momx_vid)
1114 momx0(:,ex) = pvars0_(ip(:),momx_vid)
1115 momy0(:,in) = pvars0_(im(:),momy_vid)
1116 momy0(:,ex) = pvars0_(ip(:),momy_vid)
1117 drhot0(:,in) = pvars0_(im(:),rhot_vid)
1118 drhot0(:,ex) = pvars0_(ip(:),rhot_vid)
1119
1120 rtot_(:,in) = rtot(im(:))
1121 rtot_(:,ex) = rtot(ip(:))
1122 cptot_ov_cvtot(:,in) = cptot(im(:)) / cvtot(im(:))
1123 cptot_ov_cvtot(:,ex) = cptot(ip(:)) / cvtot(ip(:))
1124
1125 !-
1126 rdens0(:,in) = 1.0_rp / ( dens_hyd(im) + pvars0_(im,dens_vid) )
1127 rdens0(:,ex) = 1.0_rp / ( dens_hyd(ip) + pvars0_(ip,dens_vid) )
1128
1129 wt0(:,in) = ( pvars0_(im(:),momz_vid) * rgsqrtv(:,in) + g13_(:,in) * momx0(:,in) &
1130 + g23_(:,in) * momy0(:,in) ) * rdens0(:,in)
1131 wt0(:,ex) = ( pvars0_(ip(:),momz_vid) * rgsqrtv(:,ex) + g13_(:,ex) * momx0(:,ex) &
1132 + g23_(:,ex) * momy0(:,ex) ) * rdens0(:,ex)
1133
1134 rhot_hyd(:,in) = pres0ovrdry * (pres_hyd(im(:))/pres00)**rgamm
1135 rhot_hyd(:,ex) = pres0ovrdry * (pres_hyd(ip(:))/pres00)**rgamm
1136 pres0(:,:) = pres00 * ( rtot_(:,:) * rp0 * ( rhot_hyd(:,:) + drhot0(:,:) ) )**cptot_ov_cvtot(:,:)
1137
1138 !-
1139 do fp=1, elem%NfpTot
1140 g11_ = g11(im2dto3d(fp),ke2d); g12_ = g12(im2dto3d(fp),ke2d); g22_ = g22(im2dto3d(fp),ke2d)
1141
1142 gxz_(fp,in) = rgam2(fp,in) * ( g11_ * g13_(fp,in) + g12_ * g23_(fp,in) )
1143 gxz_(fp,ex) = rgam2(fp,ex) * ( g11_ * g13_(fp,ex) + g12_ * g23_(fp,ex) )
1144
1145 gyz_(fp,in) = rgam2(fp,in) * ( g12_ * g13_(fp,in) + g22_ * g23_(fp,in) )
1146 gyz_(fp,ex) = rgam2(fp,ex) * ( g12_ * g13_(fp,ex) + g22_ * g23_(fp,ex) )
1147 end do
1148
1149 do fp=1, elem%NfpTot
1150 gnn_m = ( 1.0_rp * rgsqrtv(fp,in)**2 + g13_(fp,in) * gxz_(fp,in) + g23_(fp,in) * gyz_(fp,in) ) * abs( nz(fp,ke) )
1151 gnn_p = ( 1.0_rp * rgsqrtv(fp,ex)**2 + g13_(fp,ex) * gxz_(fp,ex) + g23_(fp,ex) * gyz_(fp,ex) ) * abs( nz(fp,ke) )
1152
1153 alph(fp,ke) = nz(fp,ke)**2 * max( abs( wt0(fp,in) ) + sqrt( gnn_m * gamm * pres0(fp,in) * rdens0(fp,in) ), &
1154 abs( wt0(fp,ex) ) + sqrt( gnn_p * gamm * pres0(fp,ex) * rdens0(fp,ex) ) )
1155 end do
1156
1157 !----
1158 do fp=1, elem%NfpTot
1159 tmp1 = - 0.5_rp * lmesh%Fscale(fp,ke) * alph(fp,ke)
1160 del_flux(fp,1,ke) = tmp1 * ( pvars_(ip(fp),momx_vid) - pvars_(im(fp),momx_vid) )
1161 del_flux(fp,2,ke) = tmp1 * ( pvars_(ip(fp),momy_vid) - pvars_(im(fp),momy_vid) )
1162 end do
1163 end do
1164 !$omp end do
1165 !$omp end parallel
1166
1167 return
1168 end subroutine vi_cal_del_flux_dyn_uv
1169
1170!OCL SERIAL
1171 subroutine vi_cal_del_flux_dyn( del_flux, alph, & ! (out)
1172 pvars_, pvars0_, & ! (in)
1173 dens_hyd, pres_hyd, rtot, cptot, cvtot, & ! (in)
1174 gsqrt, gsqrth, gam, gsqrtv, g13, g23, & ! (in)
1175 nz, vmapm, vmapp, im2dto3d, lmesh, elem, lmesh2d, elem2d ) ! (in)
1176
1177 implicit none
1178
1179 class(localmesh3d), intent(in) :: lmesh
1180 class(elementbase3d), intent(in) :: elem
1181 class(localmesh2d), intent(in) :: lmesh2d
1182 class(elementbase2d), intent(in) :: elem2d
1183 real(rp), intent(out) :: del_flux(elem%nfptot,prgvar_num,lmesh%ne)
1184 real(rp), intent(in) :: alph(elem%nfptot,lmesh%ne)
1185 real(rp), intent(in) :: pvars_ (elem%np*lmesh%ne,prgvar_num)
1186 real(rp), intent(in) :: pvars0_(elem%np*lmesh%ne,prgvar_num)
1187 real(rp), intent(in) :: dens_hyd(elem%np*lmesh%nea)
1188 real(rp), intent(in) :: pres_hyd(elem%np*lmesh%nea)
1189 real(rp), intent(in) :: rtot(elem%np*lmesh%nea)
1190 real(rp), intent(in) :: cptot(elem%np*lmesh%nea)
1191 real(rp), intent(in) :: cvtot(elem%np*lmesh%nea)
1192 real(rp), intent(in) :: gsqrt(elem%np*lmesh%nea)
1193 real(rp), intent(in) :: gsqrth(elem2d%np,lmesh2d%ne)
1194 real(rp), intent(in) :: gam(elem%np*lmesh%nea)
1195 real(rp), intent(in) :: gsqrtv(elem%np*lmesh%ne)
1196 real(rp), intent(in) :: g13(elem%np*lmesh%nea)
1197 real(rp), intent(in) :: g23(elem%np*lmesh%nea)
1198 real(rp), intent(in) :: nz(elem%nfptot,lmesh%ne)
1199 integer, intent(in) :: vmapm(elem%nfptot,lmesh%ne)
1200 integer, intent(in) :: vmapp(elem%nfptot,lmesh%ne)
1201 integer, intent(in) :: im2dto3d(elem%nfptot)
1202
1203 integer :: fp, ke, ke2d, ke_z, ke_xy
1204 integer :: ip(elem%nfptot), im(elem%nfptot)
1205 real(rp) :: ddens(elem%nfptot,2)
1206 real(rp) :: momz(elem%nfptot,2)
1207 real(rp) :: momw(elem%nfptot,2)
1208 real(rp) :: drhot(elem%nfptot,2)
1209 real(rp) :: rhot_hyd(elem%nfptot,2)
1210 real(rp) :: cptot_ov_cvtot(elem%nfptot,2)
1211 real(rp) :: rtot_(elem%nfptot,2)
1212 real(rp) :: pott(elem%nfptot,2)
1213 real(rp) :: dpres(elem%nfptot,2)
1214 real(rp) :: dens(elem%nfptot,2)
1215
1216 real(rp) :: gsqrt_(elem%nfptot,2)
1217 real(rp) :: gsqrtv_(elem%nfptot,2)
1218 real(rp) :: rgam2(elem%nfptot,2)
1219 real(rp) :: g13_(elem%nfptot,2)
1220 real(rp) :: g23_(elem%nfptot,2)
1221
1222 real(rp) :: tmp1
1223
1224 real(rp) :: rgamm, pres0ovrdry, rp0
1225
1226 integer, parameter :: in = 1
1227 integer, parameter :: ex = 2
1228 !------------------------------------------------------------------------
1229
1230 rgamm = cvdry / cpdry
1231 pres0ovrdry = pres00 / rdry
1232 rp0 = 1.0_rp / pres00
1233
1234 !$omp parallel private( ke_z, ke_xy, ke, ke2D, fp, iM, iP, &
1235 !$omp DDENS, MOMZ, MOMW, DRHOT, &
1236 !$omp CPtot_ov_CVtot, Rtot_, rhot_hyd, pott, dpres, dens, &
1237 !$omp Gsqrt_, GsqrtV_, G13_, G23_, rgam2 )
1238
1239 !$omp do collapse(2)
1240 do ke_z=1, lmesh%NeZ
1241 do ke_xy=1, lmesh%Ne2D
1242 ke = ke_xy + (ke_z-1)*lmesh%Ne2D
1243 ke2d = lmesh%EMap3Dto2D(ke)
1244
1245 im(:) = vmapm(:,ke); ip(:) = vmapp(:,ke)
1246
1247 gsqrt_(:,in) = gsqrt(im)
1248 gsqrt_(:,ex) = gsqrt(ip)
1249
1250 rgam2(:,in) = 1.0_rp / gam(im)**2
1251 rgam2(:,ex) = 1.0_rp / gam(ip)**2
1252 gsqrtv_(:,in) = gsqrtv(im)
1253 gsqrtv_(:,ex) = gsqrtv(ip)
1254
1255 g13_(:,in) = g13(im)
1256 g13_(:,ex) = g13(ip)
1257 g23_(:,in) = g23(im)
1258 g23_(:,ex) = g23(ip)
1259
1260 ddens(:,in) = pvars_(im(:),dens_vid)
1261 ddens(:,ex) = pvars_(ip(:),dens_vid)
1262 momz(:,in) = pvars_(im(:),momz_vid)
1263 momz(:,ex) = pvars_(ip(:),momz_vid)
1264 drhot(:,in) = pvars_(im(:),rhot_vid)
1265 drhot(:,ex) = pvars_(ip(:),rhot_vid)
1266
1267 rtot_(:,in) = rtot(im(:))
1268 rtot_(:,ex) = rtot(ip(:))
1269 cptot_ov_cvtot(:,in) = cptot(im(:)) / cvtot(im(:))
1270 cptot_ov_cvtot(:,ex) = cptot(ip(:)) / cvtot(ip(:))
1271 !-
1272
1273 dens(:,in) = dens_hyd(im(:)) + ddens(:,in)
1274 dens(:,ex) = dens_hyd(ip(:)) + ddens(:,ex)
1275
1276 rhot_hyd(:,in) = pres0ovrdry * (pres_hyd(im(:))/pres00)**rgamm
1277 rhot_hyd(:,ex) = pres0ovrdry * (pres_hyd(ip(:))/pres00)**rgamm
1278 pott(:,:) = ( rhot_hyd(:,:) + drhot(:,:) ) / dens(:,:)
1279
1280 dpres(:,:) = pres00 * ( rtot_(:,:) * rp0 * dens(:,:) * pott(:,:) )**cptot_ov_cvtot(:,:)
1281 dpres(:,in) = dpres(:,in) - pres_hyd(im(:))
1282 dpres(:,ex) = dpres(:,ex) - pres_hyd(ip(:))
1283
1284 !-
1285 momw(:,in) = momz(:,in) &
1286 + gsqrtv_(:,in) * g13_(:,in) * pvars_(im,momx_vid) &
1287 + gsqrtv_(:,in) * g23_(:,in) * pvars_(im,momy_vid)
1288 momw(:,ex) = momz(:,ex) &
1289 + gsqrtv_(:,ex) * g13_(:,ex) * pvars_(ip,momx_vid) &
1290 + gsqrtv_(:,ex) * g23_(:,ex) * pvars_(ip,momy_vid)
1291
1292 !----
1293
1294 if ( ke_z == 1 .or. ke_z == lmesh%NeZ) then
1295 do fp=1, elem%NfpTot
1296 if ( im(fp) == ip(fp) ) then
1297 momz(fp,ex) = - momz(fp,in) &
1298 - 2.0_rp * gsqrtv_(fp,in) * ( g13_(fp,in) * pvars_(im(fp),momx_vid) &
1299 + g23_(fp,in) * pvars_(im(fp),momy_vid) )
1300 momw(fp,ex) = - momw(fp,in)
1301 end if
1302 end do
1303 else
1304 end if
1305
1306 do fp=1, elem%NfpTot
1307 tmp1 = 0.5_rp * lmesh%Fscale(fp,ke)
1308
1309 del_flux(fp,dens_vid,ke) = tmp1 * ( &
1310 + ( momw(fp,ex) - momw(fp,in) ) * nz(fp,ke) &
1311 - alph(fp,ke) * ( ddens(fp,ex) - ddens(fp,in) ) )
1312
1313
1314 del_flux(fp,momz_vid,ke) = tmp1 * ( &
1315 + ( dpres(fp,ex) - dpres(fp,in) ) * nz(fp,ke) &
1316 - alph(fp,ke) * ( momz(fp,ex) - momz(fp,in) ) )
1317
1318 del_flux(fp,rhot_vid,ke) = tmp1 * ( &
1319 + ( pott(fp,ex) * momw(fp,ex) - pott(fp,in) * momw(fp,in) ) * nz(fp,ke) &
1320 - alph(fp,ke) * ( drhot(fp,ex) - drhot(fp,in) ) )
1321 end do
1322 end do
1323 end do
1324 !$omp end do
1325 !$omp end parallel
1326
1327 return
1328 end subroutine vi_cal_del_flux_dyn
module FElib / Fluid dyn solver / Atmosphere / HEVI / Common
subroutine, public atm_dyn_dgm_hevi_common_linalgebra_solve_var3(d, b, g, nnode_v, im, jm, ne2d, is_top)
subroutine, public atm_dyn_dgm_hevi_common_linalgebra_solve_uv(d, b, g, nnode_v, im, jm, ne2d, is_top)
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / Common
real(rp), dimension(:,:), allocatable, public intrpmat_vpordm1
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVI / Common
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_solve(prog_vars, b, dens, w, wt, pot, dpdrhot, alph, gsqrtv, intrpmat_vpordm1, impl_fac, dt, vmapm, vmapp, lmesh, elem, im, jm)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_eval_ax(dens_t, momz_t, rhot_t, alph, prog_vars, prog_vars0, ddens00, momx00, momy00, momz00, drhot00, dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, impl_fac, dt, lmesh, elem, vmapm, vmapp, element3d_operation, im, jm, b, dens, w, wt, pot, dpdrhot)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_construct_matbnd_uv(bndmatl_uv, bndmatd_uv, bndmatu_uv, alph, gsqrtv, impl_fac, dt, lmesh, elem, im, jm, vmapm, vmapp, ke_z)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_construct_matbnd(bndmatl, bndmatd, bndmatu, dens, w, wt, pot, dpdrhot, alph, gsqrtv, nz, id, fac_dx3, fac_intrpmat_vpordm1, impl_fac, dt, lmesh, elem, im, jm, ke_z)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_solve_uv(prog_vars, b_uv, alph, gsqrtv, impl_fac, dt, vmapm, vmapp, lmesh, elem, im, jm)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_eval_ax_uv(momx_t, momy_t, alph, prog_vars, prog_vars0, ddens00, momx00, momy00, momz00, drhot00, dens_hyd, pres_hyd, rtot, cptot, cvtot, gsqrtv, impl_fac, dt, lmesh, elem, vmapm, vmapp, element3d_operation, im, jm, b1d_ij_uv)
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element/ ModalFilter
module FElib / Element / Operation / Base
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Mesh / Base 3D
module FElib / Data / base
Module common / sparsemat.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a modal filter.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type representing a field with 3D local mesh.
Derived type to manage a computational mesh (base type for 3D domain)
Derived type representing a field with 3D mesh.