FE-Project
Loading...
Searching...
No Matches
scale_atm_dyn_dgm_nonhydro3d_rhot_hevi_splitform.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module Atmosphere / Dynamics HEVI
3!!
4!! @par Description
5!! HEVI DGM scheme for Atmospheric dynamical process.
6!! To improve the numerical instability due to the aliasing errors,
7!! the split form based on Gassner et al. (2016, JCP) is used for advection terms.
8!!
9!! @author Yuta Kawai, Team SCALE
10!<
11!-------------------------------------------------------------------------------
12#include "scaleFElib.h"
14 !-----------------------------------------------------------------------------
15 !
16 !++ Used modules
17 !
18 use scale_precision
19 use scale_io
20 use scale_prc
21 use scale_prof
22 use scale_const, only: &
23 grav => const_grav, &
24 rdry => const_rdry, &
25 cpdry => const_cpdry, &
26 cvdry => const_cvdry, &
27 pres00 => const_pre00
28
31 use scale_element_base, only: &
40
44 dens_vid => prgvar_ddens_id, rhot_vid => prgvar_drhot_id, &
45 momx_vid => prgvar_momx_id, momy_vid => prgvar_momy_id, &
46 momz_vid => prgvar_momz_id, &
48
49 !-----------------------------------------------------------------------------
50 implicit none
51 private
52 !-----------------------------------------------------------------------------
53 !
54 !++ Public procedures
55 !
60
61 !-----------------------------------------------------------------------------
62 !
63 !++ Public parameters & variables
64 !
65
66 !-----------------------------------------------------------------------------
67 !
68 !++ Private procedures & variables
69 !
70 !-------------------
71
72 real(RP), private, allocatable :: DxT1D_(:,:)
73 real(RP), private, allocatable :: DyT1D_(:,:)
74 real(RP), private, allocatable :: DzT1D_(:,:)
75
76 private :: dx_ab, dy_ab, dz_ab
77 private :: dx_abc, dy_abc, dz_abc
78
79contains
83 implicit none
84 class(meshbase3d), intent(in) :: mesh
85
86 integer :: p1, p2, p3, p_
87 type(elementbase3d), pointer :: elem
88 !--------------------------------------------
89
92
93 !-
94 elem => mesh%refElem3D
95
96 allocate( dxt1d_(elem%Nnode_h1D,elem%Nnode_h1D) )
97 allocate( dyt1d_(elem%Nnode_h1D,elem%Nnode_h1D) )
98 allocate( dzt1d_(elem%Nnode_v,elem%Nnode_v) )
99
100 do p1=1, elem%Nnode_h1D
101 dxt1d_(:,p1) = elem%Dx1(p1,1:elem%Nnode_h1D)
102 end do
103
104 do p2=1, elem%Nnode_h1D
105 do p_=1, elem%Nnode_h1D
106 dyt1d_(p_,p2) = elem%Dx2(1+(p2-1)*elem%Nnode_h1D,1+(p_-1)*elem%Nnode_h1D)
107 end do
108 end do
109
110 do p3=1, elem%Nnode_v
111 dzt1d_(:,p3) = elem%Dx3(elem%Colmask(p3,1),elem%Colmask(:,1))
112 end do
113
114 return
116
117
121 implicit none
122 !--------------------------------------------
123
126
127 deallocate( dxt1d_, dyt1d_, dzt1d_ )
128
129 return
131
132 !-------------------------------
133
135 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
136 ddens_, momx_, momy_, momz_, drhot_, dpres_, & ! (in)
137 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, & ! (in)
138 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, & ! (in)
139 element3d_operation, dx, dy, dz, sx, sy, sz, lift, & ! (in)
140 lmesh, elem, lmesh2d, elem2d ) ! (in)
141
144
145 implicit none
146
147 class(localmesh3d), intent(in) :: lmesh
148 class(elementbase3d), intent(in) :: elem
149 class(localmesh2d), intent(in) :: lmesh2d
150 class(elementbase2d), intent(in) :: elem2d
151 class(elementoperationbase3d), intent(in) :: element3d_operation
152 type(sparsemat), intent(in) :: dx, dy, dz, sx, sy, sz, lift
153 real(rp), intent(out) :: dens_dt(elem%np,lmesh%nea)
154 real(rp), intent(out) :: momx_dt(elem%np,lmesh%nea)
155 real(rp), intent(out) :: momy_dt(elem%np,lmesh%nea)
156 real(rp), intent(out) :: momz_dt(elem%np,lmesh%nea)
157 real(rp), intent(out) :: rhot_dt(elem%np,lmesh%nea)
158 real(rp), intent(in) :: ddens_(elem%np,lmesh%nea)
159 real(rp), intent(in) :: momx_(elem%np,lmesh%nea)
160 real(rp), intent(in) :: momy_(elem%np,lmesh%nea)
161 real(rp), intent(in) :: momz_(elem%np,lmesh%nea)
162 real(rp), intent(in) :: drhot_(elem%np,lmesh%nea)
163 real(rp), intent(in) :: dpres_(elem%np,lmesh%nea)
164 real(rp), intent(in) :: dens_hyd(elem%np,lmesh%nea)
165 real(rp), intent(in) :: pres_hyd(elem%np,lmesh%nea)
166 real(rp), intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
167 real(rp), intent(in) :: therm_hyd(elem%np,lmesh%nea)
168 real(rp), intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
169 real(rp), intent(in) :: rtot(elem%np,lmesh%nea)
170 real(rp), intent(in) :: cvtot(elem%np,lmesh%nea)
171 real(rp), intent(in) :: cptot(elem%np,lmesh%nea)
172 real(rp), intent(in) :: dphyddx(elem%np,lmesh%nea)
173 real(rp), intent(in) :: dphyddy(elem%np,lmesh%nea)
174
175 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
176 real(rp) :: fx_sp(elem%np), fy_sp(elem%np), fz_sp(elem%np)
177 real(rp) :: dpres_hyd(elem%np), gradphyd_x(elem%np), gradphyd_y(elem%np)
178 real(rp) :: del_flux(elem%nfptot,lmesh%ne,prgvar_num)
179 real(rp) :: del_flux_hyd(elem%nfptot,lmesh%ne,2)
180 real(rp) :: gsqrtdens_(elem%np), rdens_(elem%np), rhot_hyd(elem%np), rhot_(elem%np)
181 real(rp) :: u_(elem%np), v_(elem%np), w_(elem%np), wt_(elem%np), pot_(elem%np)
182 real(rp) :: cori(elem%np)
183 real(rp) :: gsqrtv(elem%np), rgsqrtv(elem%np)
184
185 integer :: ke, ke2d
186
187 real(rp) :: gamm, rgamm
188 real(rp) :: rp0
189 real(rp) :: rovp0, p0ovr
190 !------------------------------------------------------------------------
191
192 call prof_rapstart( 'cal_dyn_tend_bndflux', 3)
193 call get_ebnd_flux( &
194 del_flux, del_flux_hyd, & ! (out)
195 ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, & ! (in)
196 rtot, cvtot, cptot, & ! (in)
197 lmesh%Gsqrt, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), & ! (in)
198 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), & ! (in)
199 lmesh%vmapM, lmesh%vmapP, & ! (in)
200 lmesh, elem, lmesh2d, elem2d ) ! (in)
201 call prof_rapend( 'cal_dyn_tend_bndflux', 3)
202
203 !-----
204 call prof_rapstart( 'cal_dyn_tend_interior', 3)
205 gamm = cpdry / cvdry
206 rgamm = cvdry / cpdry
207 rp0 = 1.0_rp / pres00
208 rovp0 = rdry * rp0
209 p0ovr = pres00 / rdry
210
211 !$omp parallel do private( ke2d, Cori, &
212 !$omp RHOT_, GsqrtDens_, rdens_, u_, v_, w_, wt_, pot_, &
213 !$omp DPRES_hyd, GradPhyd_x, GradPhyd_y, &
214 !$omp GsqrtV, RGsqrtV, &
215 !$omp Fx, Fy, Fz, Fx_sp, Fy_sp, Fz_sp, LiftDelFlx )
216 do ke = lmesh%NeS, lmesh%NeE
217 !--
218 ke2d = lmesh%EMap3Dto2D(ke)
219 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
220
221 gsqrtv(:) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
222 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
223
224 !--
225 rhot_(:) = p0ovr * (pres_hyd(:,ke) * rp0)**rgamm + drhot_(:,ke)
226 ! DPRES_(:) = PRES00 * ( Rtot(:,ke) * rP0 * RHOT_(:) )**( CPtot(:,ke) / CVtot(:,ke) ) &
227 ! - PRES_hyd(:,ke)
228
229 gsqrtdens_(:) = lmesh%Gsqrt(:,ke) * ( ddens_(:,ke) + dens_hyd(:,ke) )
230 rdens_(:) = 1.0_rp / gsqrtdens_(:)
231 u_(:) = momx_(:,ke) * rdens_(:)
232 v_(:) = momy_(:,ke) * rdens_(:)
233 w_(:) = momz_(:,ke) * rdens_(:)
234 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
235 pot_(:) = rhot_(:) * rdens_(:)
236
237 ke2d = lmesh%EMap3Dto2D(ke)
238 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
239
240 !-- Gradient hydrostatic pressure
241
242 dpres_hyd(:) = pres_hyd(:,ke) - pres_hyd_ref(:,ke)
243
244 call sparsemat_matmul(dx, gsqrtv(:) * dpres_hyd(:), fx)
245 call sparsemat_matmul(dz, gsqrtv(:) * lmesh%GI3(:,ke,1) * dpres_hyd(:), fz)
246 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,1), liftdelflx)
247 gradphyd_x(:) = lmesh%Escale(:,ke,1,1) * fx(:) &
248 + lmesh%Escale(:,ke,3,3) * fz(:) &
249 + liftdelflx(:)
250
251 call sparsemat_matmul(dy, gsqrtv(:) * dpres_hyd(:), fy)
252 call sparsemat_matmul(dz, gsqrtv(:) * lmesh%GI3(:,ke,2) * dpres_hyd(:), fz)
253 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,2), liftdelflx)
254 gradphyd_y(:) = lmesh%Escale(:,ke,2,2) * fy(:) &
255 + lmesh%Escale(:,ke,3,3) * fz(:) &
256 + liftdelflx(:)
257
258 !-- DENS
259 call dx_ab( dxt1d_, gsqrtdens_(:), u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
260 call dy_ab( dyt1d_, gsqrtdens_(:), v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
261 call dz_ab( dzt1d_, gsqrtdens_(:), wt_(:) - w_(:) * rgsqrtv(:), elem%Nnode_h1D, elem%Nnode_v, fz_sp )
262 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,dens_vid), liftdelflx)
263
264 dens_dt(:,ke) = - ( &
265 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
266 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
267 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
268 + liftdelflx(:) )
269
270 !-- MOMX
271 call dx_abc( dxt1d_, gsqrtdens_, u_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
272 call dy_abc( dyt1d_, gsqrtdens_, u_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
273 call dz_abc( dzt1d_, gsqrtdens_, u_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
274 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * dpres_(:,ke) , fx)
275 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momx_vid), liftdelflx)
276
277 momx_dt(:,ke) = &
278 - ( lmesh%Escale(:,ke,1,1) * ( fx_sp(:) + fx(:) ) &
279 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
280 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
281 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
282 - gradphyd_x(:) * rgsqrtv(:) &
283 + cori(:) * momy_(:,ke)
284
285 !-- MOMY
286 call dx_abc( dxt1d_, gsqrtdens_, v_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
287 call dy_abc( dyt1d_, gsqrtdens_, v_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
288 call dz_abc( dzt1d_, gsqrtdens_, v_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
289 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * dpres_(:,ke) , fy)
290 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momy_vid), liftdelflx)
291
292 momy_dt(:,ke) = &
293 - ( lmesh%Escale(:,ke,1,1) * fx_sp(:) &
294 + lmesh%Escale(:,ke,2,2) * ( fy_sp(:) + fy(:) ) &
295 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
296 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
297 - gradphyd_y(:) * rgsqrtv(:) &
298 - cori(:) * momx_(:,ke)
299
300 !-- MOMZ
301 call dx_abc( dxt1d_, gsqrtdens_, w_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
302 call dy_abc( dyt1d_, gsqrtdens_, w_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
303 call dz_abc( dzt1d_, gsqrtdens_, w_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
304 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momz_vid), liftdelflx)
305
306 momz_dt(:,ke) = - ( &
307 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
308 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
309 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
310 + liftdelflx(:) )
311
312 !-- RHOT
313 call dx_abc( dxt1d_, gsqrtdens_, pot_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
314 call dy_abc( dyt1d_, gsqrtdens_, pot_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
315 call dz_abc( dzt1d_, gsqrtdens_, pot_, wt_(:) - w_(:) * rgsqrtv(:), elem%Nnode_h1D, elem%Nnode_v, fz_sp )
316 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,rhot_vid), liftdelflx)
317
318 rhot_dt(:,ke) = - ( &
319 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
320 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
321 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
322 + liftdelflx(:) )
323 end do
324 call prof_rapend( 'cal_dyn_tend_interior', 3)
325
326 return
328
329 !------
330
332 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, RHOT_dt, & ! (out)
333 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, & ! (in)
334 ddens0_, momx0_, momy0_, momz0_, drhot0_, & ! (in)
335 rtot, cvtot, cptot, & ! (in)
336 element3d_operation, dz, lift, & ! (in)
337 impl_fac, dt, & ! (in)
338 lmesh, elem, lmesh2d, elem2d ) ! (in)
339
347
348 implicit none
349
350 class(localmesh3d), intent(in) :: lmesh
351 class(elementbase3d), intent(in) :: elem
352 class(localmesh2d), intent(in) :: lmesh2d
353 class(elementbase2d), intent(in) :: elem2d
354 real(rp), intent(out) :: dens_dt(elem%np,lmesh%nea)
355 real(rp), intent(out) :: momx_dt(elem%np,lmesh%nea)
356 real(rp), intent(out) :: momy_dt(elem%np,lmesh%nea)
357 real(rp), intent(out) :: momz_dt(elem%np,lmesh%nea)
358 real(rp), intent(out) :: rhot_dt(elem%np,lmesh%nea)
359 real(rp), intent(in) :: ddens_(elem%np,lmesh%nea)
360 real(rp), intent(in) :: momx_(elem%np,lmesh%nea)
361 real(rp), intent(in) :: momy_(elem%np,lmesh%nea)
362 real(rp), intent(in) :: momz_(elem%np,lmesh%nea)
363 real(rp), intent(in) :: drhot_(elem%np,lmesh%nea)
364 real(rp), intent(in) :: dens_hyd(elem%np,lmesh%nea)
365 real(rp), intent(in) :: pres_hyd(elem%np,lmesh%nea)
366 real(rp), intent(in) :: ddens0_(elem%np,lmesh%nea)
367 real(rp), intent(in) :: momx0_(elem%np,lmesh%nea)
368 real(rp), intent(in) :: momy0_(elem%np,lmesh%nea)
369 real(rp), intent(in) :: momz0_(elem%np,lmesh%nea)
370 real(rp), intent(in) :: drhot0_(elem%np,lmesh%nea)
371 real(rp), intent(in) :: rtot(elem%np,lmesh%nea)
372 real(rp), intent(in) :: cvtot(elem%np,lmesh%nea)
373 real(rp), intent(in) :: cptot(elem%np,lmesh%nea)
374 class(elementoperationbase3d), intent(in) :: element3d_operation
375 class(sparsemat), intent(in) :: dz, lift
376 real(rp), intent(in) :: impl_fac
377 real(rp), intent(in) :: dt
378
379 real(rp) :: prog_vars (elem%np,lmesh%nez,prgvar_num,lmesh%nex*lmesh%ney)
380 real(rp) :: prog_vars0(elem%np,lmesh%nez,prgvar_num,lmesh%nex*lmesh%ney)
381 real(rp) :: b1d(elem%nnode_v,3,lmesh%nez,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
382 integer :: ipiv(elem%nnode_v*3*lmesh%nez,elem%nnode_h1d**2)
383 real(rp) :: b1d_uv(elem%nnode_v,lmesh%nez,2,elem%nnode_h1d**2,lmesh%nex*lmesh%ney)
384 integer :: ipiv_uv(elem%nnode_v*1*lmesh%nez,elem%nnode_h1d**2)
385 real(rp) :: alph(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
386 real(rp) :: rtot_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
387 real(rp) :: cptot_ov_cvtot(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
388 real(rp) :: dens_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
389 real(rp) :: pres_hyd_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
390 real(rp) :: gnnm_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
391 real(rp) :: g13_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
392 real(rp) :: g23_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
393 real(rp) :: gsqrtv_z(elem%np,lmesh%nez,lmesh%nex*lmesh%ney)
394 real(rp) :: nz(elem%nfptot,lmesh%nez,lmesh%nex*lmesh%ney)
395 integer :: vmapm(elem%nfptot,lmesh%nez)
396 integer :: vmapp(elem%nfptot,lmesh%nez)
397 integer :: colmask(elem%nnode_v)
398 integer :: ke_xy, ke_z, ke, ke2d, v
399 integer :: itr_nlin
400 integer :: kl, ku, nz_1d
401 integer :: kl_uv, ku_uv, nz_1d_uv
402 integer :: ij, info
403 logical :: is_converged
404
405 real(rp), allocatable :: pmatbnd(:,:,:)
406 real(rp), allocatable :: pmatbnd_uv(:,:,:)
407 !------------------------------------------------------------------------
408
409
410 call prof_rapstart( 'hevi_cal_vi_prep', 3)
411
412 nz_1d = elem%Nnode_v * 3 * lmesh%NeZ
413 kl = ( elem%Nnode_v + 1 ) * 3 - 1
414 ku = kl
415 nz_1d_uv = elem%Nnode_v * 1 * lmesh%NeZ
416 kl_uv = elem%Nnode_v
417 ku_uv = kl_uv
418 allocate( pmatbnd(2*kl+ku+1,nz_1d,elem%Nnode_h1D**2) )
419 allocate( pmatbnd_uv(2*kl_uv+ku_uv+1,nz_1d_uv,elem%Nnode_h1D**2) )
420
421 call lmesh%GetVmapZ1D( vmapm, vmapp ) ! (out)
422
423 !-
424
425 !$omp parallel private( ke_xy, ke_z, ke, ke2D )
426 !$omp do collapse(2)
427 do ke_xy=1, lmesh%NeX*lmesh%NeY
428 do ke_z=1, lmesh%NeZ
429 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
430 ke2d = lmesh%EMap3Dto2D(ke)
431
432 prog_vars(:,ke_z,dens_vid,ke_xy) = ddens0_(:,ke)
433 prog_vars(:,ke_z,momx_vid,ke_xy) = momx0_(:,ke)
434 prog_vars(:,ke_z,momy_vid,ke_xy) = momy0_(:,ke)
435 prog_vars(:,ke_z,momz_vid,ke_xy) = momz0_(:,ke)
436 prog_vars(:,ke_z,rhot_vid,ke_xy) = drhot0_(:,ke)
437
438 dens_hyd_z(:,ke_z,ke_xy) = dens_hyd(:,ke)
439 pres_hyd_z(:,ke_z,ke_xy) = pres_hyd(:,ke)
440
441 rtot_z(:,ke_z,ke_xy) = rtot(:,ke)
442 cptot_ov_cvtot(:,ke_z,ke_xy) = cptot(:,ke) / cvtot(:,ke)
443
444 nz(:,ke_z,ke_xy) = lmesh%normal_fn(:,ke,3)
445 g13_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,1)
446 g23_z(:,ke_z,ke_xy) = lmesh%GI3(:,ke,2)
447 gsqrtv_z(:,ke_z,ke_xy) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
448
449 gnnm_z(:,ke_z,ke_xy) = ( 1.0_rp / gsqrtv_z(:,ke_z,ke_xy)**2 &
450 + g13_z(:,ke_z,ke_xy)**2 + g23_z(:,ke_z,ke_xy) )
451 end do
452 end do
453 !$omp end do
454 !$omp workshare
455 prog_vars0(:,:,:,:) = prog_vars(:,:,:,:)
456 !$omp end workshare
457 !$omp end parallel
458
459 call prof_rapend( 'hevi_cal_vi_prep', 3)
460
461 !--
462
463 if ( abs(impl_fac) > 0.0_rp ) then
464 call prof_rapstart( 'hevi_cal_vi_itr', 3)
465
466 ! G = (q^n+1 - q^n*) + impl_fac * A(q^n+1) = 0
467 ! dG/dq^n+1 del[q] = - G(q^n*)
468 do itr_nlin = 1, 1
469 call prof_rapstart( 'hevi_cal_vi_ax', 3)
470
471 call vi_eval_ax_uv( &
472 momx_dt(:,:), momy_dt(:,:), alph(:,:,:), & ! (out)
473 prog_vars, prog_vars0, & ! (in)
474 ddens_, momx_, momy_, momz_, drhot_, & ! (in)
475 dens_hyd_z, pres_hyd_z, & ! (in)
476 rtot_z, cptot_ov_cvtot, & ! (in)
477 dz, lift, intrpmat_vpordm1, & ! (in)
478 gnnm_z, g13_z, g23_z, gsqrtv_z, & ! (in)
479 impl_fac, dt, & ! (in)
480 lmesh, elem, nz, vmapm, vmapp, & ! (in)
481 b1d_uv(:,:,:,:,:) ) ! (out)
482
483 call prof_rapend( 'hevi_cal_vi_ax', 3)
484
485 do ke_xy=1, lmesh%NeX * lmesh%NeY
486 call prof_rapstart( 'hevi_cal_vi_matbnd', 3)
487
488 call vi_construct_matbnd_uv( pmatbnd_uv(:,:,:), & ! (out)
489 kl_uv, ku_uv, nz_1d_uv, & ! (in)
490 prog_vars(:,:,:,ke_xy), & ! (in)
491 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), & ! (in)
492 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), & ! (in)
493 alph(:,:,ke_xy), & ! (in)
494 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), & ! (in)
495 dz, lift, intrpmat_vpordm1, & ! (in)
496 impl_fac, dt, & ! (in)
497 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 ) ! (in)
498
499 call prof_rapend( 'hevi_cal_vi_matbnd', 3)
500
501 call prof_rapstart( 'hevi_cal_vi_lin', 3)
502 !$omp parallel private(ij, v, ke_z, info, ColMask)
503 !$omp do
504 do ij=1, elem%Nnode_h1D**2
505! call dgbsv( nz_1D_uv, kl_uv, ku_uv, 2, PmatBnd_uv(:,:,ij), 2*kl_uv+ku_uv+1, ipiv_uv(:,ij), b1D_uv(:,:,:,ij,ke_xy), nz_1D_uv, info)
506 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 )
507
508 colmask(:) = elem%Colmask(:,ij)
509 do ke_z=1, lmesh%NeZ
510 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)
511 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)
512 end do
513 end do ! for ij
514 !$omp end do
515 !$omp end parallel
516 call prof_rapend( 'hevi_cal_vi_lin', 3)
517
518 end do ! for ke_xy
519
520 call prof_rapstart( 'hevi_cal_vi_ax', 3)
521 call vi_eval_ax( &
522 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), & ! (out, dummy)
523 alph(:,:,:), & ! (in)
524 prog_vars, prog_vars0, & ! (in)
525 ddens_, momx_, momy_, momz_, drhot_, & ! (in)
526 dens_hyd_z, pres_hyd_z, & ! (in)
527 rtot_z, cptot_ov_cvtot, & ! (in)
528 dz, lift, intrpmat_vpordm1, & ! (in)
529 gnnm_z, g13_z, g23_z, gsqrtv_z, & ! (in)
530 impl_fac, dt, & ! (in)
531 lmesh, elem, nz, vmapm, vmapp, & ! (in)
532 b1d(:,:,:,:,:) ) ! (out)
533 call prof_rapend( 'hevi_cal_vi_ax', 3)
534
535 do ke_xy=1, lmesh%NeX * lmesh%NeY
536 call prof_rapstart( 'hevi_cal_vi_matbnd', 3)
537 call vi_construct_matbnd( pmatbnd(:,:,:), & ! (out)
538 kl, ku, nz_1d, & ! (in)
539 prog_vars(:,:,:,ke_xy), & ! (in)
540 dens_hyd_z(:,:,ke_xy), pres_hyd_z(:,:,ke_xy), & ! (in)
541 g13_z(:,:,ke_xy), g23_z(:,:,ke_xy), gsqrtv_z(:,:,ke_xy), & ! (in)
542 alph(:,:,ke_xy), & ! (in)
543 rtot_z(:,:,ke_xy), cptot_ov_cvtot(:,:,ke_xy), & ! (in)
544 dz, lift, intrpmat_vpordm1, & ! (in)
545 impl_fac, dt, & ! (in)
546 lmesh, elem, nz(:,:,ke_xy), vmapm, vmapp, ke_xy, 1 ) ! (in)
547
548 call prof_rapend( 'hevi_cal_vi_matbnd', 3)
549
550 call prof_rapstart( 'hevi_cal_vi_lin', 3)
551 !$omp parallel private(ij, v, ke_z, info, ColMask)
552 !$omp do
553 do ij=1, elem%Nnode_h1D**2
554! call dgbsv( nz_1D, kl, ku, 1, PmatBnd(:,:,ij), 2*kl+ku+1, ipiv(:,ij), b1D(:,:,:,ij,ke_xy), nz_1D, info)
555 call linalgebra_solvelineq_bndmat( pmatbnd(:,:,ij), b1d(:,:,:,ij,ke_xy), ipiv(:,ij), nz_1d, kl, ku, 1, vi_use_lapack_flag )
556
557 colmask(:) = elem%Colmask(:,ij)
558 do ke_z=1, lmesh%NeZ
559 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)
560 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)
561 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)
562 end do
563 end do ! for ij
564 !$omp end do
565 !$omp end parallel
566 call prof_rapend( 'hevi_cal_vi_lin', 3)
567
568 end do ! for ke_xy
569 end do ! itr nlin
570
571 call prof_rapend( 'hevi_cal_vi_itr', 3)
572 end if
573
574
575 call prof_rapstart( 'hevi_cal_vi_retrun_var', 3)
576 if ( abs(impl_fac) > 0.0_rp) then
577 !$omp parallel do collapse(2) private(ke_xy, ke_z, ke)
578 do ke_xy=1, lmesh%NeX * lmesh%NeY
579 do ke_z=1, lmesh%NeZ
580 ke = ke_xy + (ke_z-1)*lmesh%NeX*lmesh%NeY
581 dens_dt(:,ke) = ( prog_vars(:,ke_z,dens_vid,ke_xy) - ddens_(:,ke) ) / impl_fac
582 momx_dt(:,ke) = ( prog_vars(:,ke_z,momx_vid,ke_xy) - momx_(:,ke) ) / impl_fac
583 momy_dt(:,ke) = ( prog_vars(:,ke_z,momy_vid,ke_xy) - momy_(:,ke) ) / impl_fac
584 momz_dt(:,ke) = ( prog_vars(:,ke_z,momz_vid,ke_xy) - momz_(:,ke) ) / impl_fac
585 rhot_dt(:,ke) = ( prog_vars(:,ke_z,rhot_vid,ke_xy) - drhot_(:,ke) ) / impl_fac
586 end do
587 end do
588 else
589 call vi_eval_ax_uv( &
590 momx_dt(:,:), momy_dt(:,:), & ! (out)
591 alph(:,:,:), & ! (out, dummy)
592 prog_vars, prog_vars0, & ! (in)
593 ddens_, momx_, momy_, momz_, drhot_, & ! (in)
594 dens_hyd_z, pres_hyd_z, & ! (in)
595 rtot_z, cptot_ov_cvtot, & ! (in)
596 dz, lift, intrpmat_vpordm1, & ! (in)
597 gnnm_z, g13_z, g23_z, gsqrtv_z, & ! (in)
598 impl_fac, dt, & ! (in)
599 lmesh, elem, nz, vmapm, vmapp ) ! (in)
600
601 call vi_eval_ax( &
602 dens_dt(:,:), momz_dt(:,:), rhot_dt(:,:), & ! (out)
603 alph(:,:,:), & ! (in, dummy)
604 prog_vars, prog_vars0, & ! (in)
605 ddens_, momx_, momy_, momz_, drhot_, & ! (in)
606 dens_hyd_z, pres_hyd_z, & ! (in)
607 rtot_z, cptot_ov_cvtot, & ! (in)
608 dz, lift, intrpmat_vpordm1, & ! (in)
609 gnnm_z, g13_z, g23_z, gsqrtv_z, & ! (in)
610 impl_fac, dt, & ! (in)
611 lmesh, elem, nz, vmapm, vmapp ) ! (in)
612 end if
613 call prof_rapend( 'hevi_cal_vi_retrun_var', 3)
614
615 return
617
618 !-----------------------------------------
619
620 subroutine dx_ab(DxT1D, a, b, Nnode_h1D, Nnode_v, fx)
621 integer, intent(in) :: nnode_h1d, nnode_v
622 real(rp), intent(in) :: dxt1d(nnode_h1d,nnode_h1d)
623 real(rp), intent(in) :: a(nnode_h1d,nnode_h1d,nnode_v)
624 real(rp), intent(in) :: b(nnode_h1d,nnode_h1d,nnode_v)
625 real(rp), intent(out) :: fx(nnode_h1d,nnode_h1d,nnode_v)
626
627 integer :: i, j, k, p
628 integer :: i2, j2, k2, p2
629 !-------------------------------------------------
630
631 do k=1, nnode_v
632 do j=1, nnode_h1d
633 do i=1, nnode_h1d
634 fx(i,j,k) = 0.5_rp * sum( dxt1d(:,i) * (a(i,j,k) + a(:,j,k)) * (b(i,j,k) + b(:,j,k)) )
635 end do
636 end do
637 end do
638
639 return
640 end subroutine dx_ab
641
642 subroutine dy_ab(DyT1D, a, b, Nnode_h1D, Nnode_v, fy)
643 integer, intent(in) :: nnode_h1d, nnode_v
644 real(rp), intent(in) :: dyt1d(nnode_h1d,nnode_h1d)
645 real(rp), intent(in) :: a(nnode_h1d,nnode_h1d,nnode_v)
646 real(rp), intent(in) :: b(nnode_h1d,nnode_h1d,nnode_v)
647 real(rp), intent(out) :: fy(nnode_h1d,nnode_h1d,nnode_v)
648
649 integer :: i, j, k, p
650 integer :: i2, j2, k2, p2
651 !-------------------------------------------------
652
653 do k=1, nnode_v
654 do j=1, nnode_h1d
655 do i=1, nnode_h1d
656 fy(i,j,k) = 0.5_rp * sum( dyt1d(:,j) * (a(i,j,k) + a(i,:,k)) * (b(i,j,k) + b(i,:,k)) )
657 end do
658 end do
659 end do
660
661 return
662 end subroutine dy_ab
663
664 subroutine dz_ab(DzT1D, a, b, Nnode_h1D, Nnode_v, fz)
665 integer, intent(in) :: nnode_h1d, nnode_v
666 real(rp), intent(in) :: dzt1d(nnode_v,nnode_v)
667 real(rp), intent(in) :: a(nnode_h1d,nnode_h1d,nnode_v)
668 real(rp), intent(in) :: b(nnode_h1d,nnode_h1d,nnode_v)
669 real(rp), intent(out) :: fz(nnode_h1d,nnode_h1d,nnode_v)
670
671 integer :: i, j, k, p
672 integer :: i2, j2, k2, p2
673 !-------------------------------------------------
674
675 do k=1, nnode_v
676 do j=1, nnode_h1d
677 do i=1, nnode_h1d
678 fz(i,j,k) = 0.5_rp * sum( dzt1d(:,k) * (a(i,j,k) + a(i,j,:)) * (b(i,j,k) + b(i,j,:)) )
679 end do
680 end do
681 end do
682
683 return
684 end subroutine dz_ab
685
686 subroutine dx_abc(DxT1D, a, b, c, Nnode_h1D, Nnode_v, fx)
687 integer, intent(in) :: nnode_h1d, nnode_v
688 real(rp), intent(in) :: dxt1d(nnode_h1d,nnode_h1d)
689 real(rp), intent(in) :: a(nnode_h1d,nnode_h1d,nnode_v)
690 real(rp), intent(in) :: b(nnode_h1d,nnode_h1d,nnode_v)
691 real(rp), intent(in) :: c(nnode_h1d,nnode_h1d,nnode_v)
692 real(rp), intent(out) :: fx(nnode_h1d,nnode_h1d,nnode_v)
693
694 integer :: i, j, k, p
695 integer :: i2, j2, k2, p2
696 !-------------------------------------------------
697
698 do k=1, nnode_v
699 do j=1, nnode_h1d
700 do i=1, nnode_h1d
701 fx(i,j,k) = 0.25_rp * sum( dxt1d(:,i) * (a(i,j,k) + a(:,j,k)) * (b(i,j,k) + b(:,j,k)) * (c(i,j,k) + c(:,j,k)) )
702 end do
703 end do
704 end do
705
706 return
707 end subroutine dx_abc
708
709 subroutine dy_abc(DyT1D, a, b, c, Nnode_h1D, Nnode_v, fy)
710 integer, intent(in) :: nnode_h1d, nnode_v
711 real(rp), intent(in) :: dyt1d(nnode_h1d,nnode_h1d)
712 real(rp), intent(in) :: a(nnode_h1d,nnode_h1d,nnode_v)
713 real(rp), intent(in) :: b(nnode_h1d,nnode_h1d,nnode_v)
714 real(rp), intent(in) :: c(nnode_h1d,nnode_h1d,nnode_v)
715 real(rp), intent(out) :: fy(nnode_h1d,nnode_h1d,nnode_v)
716
717 integer :: i, j, k, p
718 integer :: i2, j2, k2, p2
719 !-------------------------------------------------
720
721 do k=1, nnode_v
722 do j=1, nnode_h1d
723 do i=1, nnode_h1d
724 fy(i,j,k) = 0.25_rp * sum( dyt1d(:,j) * (a(i,j,k) + a(i,:,k)) * (b(i,j,k) + b(i,:,k)) * (c(i,j,k) + c(i,:,k)) )
725 end do
726 end do
727 end do
728
729 return
730 end subroutine dy_abc
731
732 subroutine dz_abc(DzT1D, a, b, c, Nnode_h1D, Nnode_v, fz)
733 integer, intent(in) :: nnode_h1d, nnode_v
734 real(rp), intent(in) :: dzt1d(nnode_v,nnode_v)
735 real(rp), intent(in) :: a(nnode_h1d,nnode_h1d,nnode_v)
736 real(rp), intent(in) :: b(nnode_h1d,nnode_h1d,nnode_v)
737 real(rp), intent(in) :: c(nnode_h1d,nnode_h1d,nnode_v)
738 real(rp), intent(out) :: fz(nnode_h1d,nnode_h1d,nnode_v)
739
740 integer :: i, j, k, p
741 integer :: i2, j2, k2, p2
742 !-------------------------------------------------
743
744 do k=1, nnode_v
745 do j=1, nnode_h1d
746 do i=1, nnode_h1d
747 fz(i,j,k) = 0.25_rp * sum( dzt1d(:,k) * (a(i,j,k) + a(i,j,:)) * (b(i,j,k) + b(i,j,:)) * (c(i,j,k) + c(i,j,:)) )
748 end do
749 end do
750 end do
751
752 return
753 end subroutine dz_abc
754
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / Common
subroutine, public atm_dyn_dgm_nonhydro3d_common_init(mesh)
Initialize a common module for atmospheric nonhydrostatic dynamical core.
real(rp), dimension(:,:), allocatable, public intrpmat_vpordm1
subroutine, public atm_dyn_dgm_nonhydro3d_common_final()
Finalize a common module for atmospheric nonhydrostatic dynamical core.
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVI / Common
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_ov_cvtot, dz, lift, intrpmat_vpordm1, gnnm, g13, g23, gsqrtv, impl_fac, dt, lmesh, elem, nz, vmapm, vmapp, b1d_ij)
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_ov_cvtot, dz, lift, intrpmat_vpordm1, gnnm, g13, g23, gsqrtv, impl_fac, dt, lmesh, elem, nz, vmapm, vmapp, b1d_ij_uv)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_construct_matbnd(pmatbnd, kl, ku, nz_1d, prog_vars0, dens_hyd, pres_hyd, g13, g23, gsqrtv, alph, rtot, cptot_ov_cvtot, dz, lift, intrpmat_vpordm1, impl_fac, dt, lmesh, elem, nz, vmapm, vmapp, ke_x, ke_y)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_common_construct_matbnd_uv(pmatbnd_uv, kl_uv, ku_uv, nz_1d_uv, prog_vars0, dens_hyd, pres_hyd, g13, g23, gsqrtv, alph, rtot, cptot_ov_cvtot, dz, lift, intrpmat_vpordm1, impl_fac, dt, lmesh, elem, nz, vmapm, vmapp, ke_x, ke_y)
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVI / Numflux
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_numflux_get_generalvc_asis(del_flux, del_flux_hyd, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, rtot, cvtot, cptot, gsqrt, g13, g23, nx, ny, nz, vmapm, vmapp, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_splitform_cal_vi(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, ddens0_, momx0_, momy0_, momz0_, drhot0_, rtot, cvtot, cptot, element3d_operation, dz, lift, impl_fac, dt, lmesh, elem, lmesh2d, elem2d)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_hevi_splitform_cal_tend(dens_dt, momx_dt, momy_dt, momz_dt, rhot_dt, ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, element3d_operation, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d)
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element/ ModalFilter
module FElib / Element / Operation / Base
Module common / Linear algebra.
subroutine, public linalgebra_solvelineq_bndmat(a, b, ipiv, n, kl, ku, nrhs, use_lapack)
Calculate the solution of linear equations with a band matrix.
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.
Derived type to manage a sparse matrix.