FE-Project
Loading...
Searching...
No Matches
scale_atm_dyn_dgm_nonhydro3d_rhot_heve_splitform Module Reference

module Atmosphere / Dynamics HEVE More...

Functions/Subroutines

subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_init (mesh)
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_final ()
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_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)

Detailed Description

module Atmosphere / Dynamics HEVE

Description
HEVE DGM scheme for Atmospheric dynamical process. To improve the numerical instability due to the aliasing errors, the split form based on Gassner et al. (2016, JCP) is used for advection terms.
Author
Yuta Kawai, Team SCALE

Function/Subroutine Documentation

◆ atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_init()

subroutine, public scale_atm_dyn_dgm_nonhydro3d_rhot_heve_splitform::atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_init ( class(meshbase3d), intent(in) mesh)

Definition at line 79 of file scale_atm_dyn_dgm_nonhydro3d_rhot_heve_splitform.F90.

80 implicit none
81 class(MeshBase3D), intent(in) :: mesh
82
83 integer :: p1, p2, p3, p_
84 type(ElementBase3D), pointer :: elem
85 !--------------------------------------------
86
87 call atm_dyn_dgm_nonhydro3d_common_init( mesh )
88 elem => mesh%refElem3D
89
90 allocate( dxt1d_(elem%Nnode_h1D,elem%Nnode_h1D) )
91 allocate( dyt1d_(elem%Nnode_h1D,elem%Nnode_h1D) )
92 allocate( dzt1d_(elem%Nnode_v,elem%Nnode_v) )
93
94 do p1=1, elem%Nnode_h1D
95 dxt1d_(:,p1) = elem%Dx1(p1,1:elem%Nnode_h1D)
96 end do
97
98 do p2=1, elem%Nnode_h1D
99 do p_=1, elem%Nnode_h1D
100 dyt1d_(p_,p2) = elem%Dx2(1+(p2-1)*elem%Nnode_h1D,1+(p_-1)*elem%Nnode_h1D)
101 end do
102 end do
103
104 do p3=1, elem%Nnode_v
105 dzt1d_(:,p3) = elem%Dx3(elem%Colmask(p3,1),elem%Colmask(:,1))
106 end do
107
108 return

References scale_atm_dyn_dgm_nonhydro3d_common::atm_dyn_dgm_nonhydro3d_common_init().

◆ atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_final()

subroutine, public scale_atm_dyn_dgm_nonhydro3d_rhot_heve_splitform::atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_final

Definition at line 112 of file scale_atm_dyn_dgm_nonhydro3d_rhot_heve_splitform.F90.

113 implicit none
114 !--------------------------------------------
115
116 deallocate( dxt1d_, dyt1d_, dzt1d_ )
117 call atm_dyn_dgm_nonhydro3d_common_final()
118
119 return

References scale_atm_dyn_dgm_nonhydro3d_common::atm_dyn_dgm_nonhydro3d_common_final().

◆ atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_cal_tend()

subroutine, public scale_atm_dyn_dgm_nonhydro3d_rhot_heve_splitform::atm_dyn_dgm_nonhydro3d_rhot_heve_splitform_cal_tend ( real(rp), dimension(elem%np,lmesh%nea), intent(out) dens_dt,
real(rp), dimension(elem%np,lmesh%nea), intent(out) momx_dt,
real(rp), dimension(elem%np,lmesh%nea), intent(out) momy_dt,
real(rp), dimension(elem%np,lmesh%nea), intent(out) momz_dt,
real(rp), dimension(elem%np,lmesh%nea), intent(out) rhot_dt,
real(rp), dimension(elem%np,lmesh%nea), intent(in) ddens_,
real(rp), dimension(elem%np,lmesh%nea), intent(in) momx_,
real(rp), dimension(elem%np,lmesh%nea), intent(in) momy_,
real(rp), dimension(elem%np,lmesh%nea), intent(in) momz_,
real(rp), dimension(elem%np,lmesh%nea), intent(in) drhot_,
real(rp), dimension(elem%np,lmesh%nea), intent(in) dpres_,
real(rp), dimension(elem%np,lmesh%nea), intent(in) dens_hyd,
real(rp), dimension(elem%np,lmesh%nea), intent(in) pres_hyd,
real(rp), dimension(elem%np,lmesh%nea), intent(in) pres_hyd_ref,
real(rp), dimension(elem%np,lmesh%nea), intent(in) therm_hyd,
real(rp), dimension(elem2d%np,lmesh2d%nea), intent(in) coriolis,
real(rp), dimension(elem%np,lmesh%nea), intent(in) rtot,
real(rp), dimension(elem%np,lmesh%nea), intent(in) cvtot,
real(rp), dimension(elem%np,lmesh%nea), intent(in) cptot,
real(rp), dimension(elem%np,lmesh%nea), intent(in) dphyddx,
real(rp), dimension(elem%np,lmesh%nea), intent(in) dphyddy,
class(elementoperationbase3d), intent(in) element3d_operation,
type(sparsemat), intent(in) dx,
type(sparsemat), intent(in) dy,
type(sparsemat), intent(in) dz,
type(sparsemat), intent(in) sx,
type(sparsemat), intent(in) sy,
type(sparsemat), intent(in) sz,
type(sparsemat), intent(in) lift,
class(localmesh3d), intent(in) lmesh,
class(elementbase3d), intent(in) elem,
class(localmesh2d), intent(in) lmesh2d,
class(elementbase2d), intent(in) elem2d )

Definition at line 124 of file scale_atm_dyn_dgm_nonhydro3d_rhot_heve_splitform.F90.

131
134
135 implicit none
136
137 class(LocalMesh3D), intent(in) :: lmesh
138 class(ElementBase3D), intent(in) :: elem
139 class(LocalMesh2D), intent(in) :: lmesh2D
140 class(ElementBase2D), intent(in) :: elem2D
141 class(ElementOperationBase3D), intent(in) :: element3D_operation
142 type(SparseMat), intent(in) :: Dx, Dy, Dz, Sx, Sy, Sz, Lift
143 real(RP), intent(out) :: DENS_dt(elem%Np,lmesh%NeA)
144 real(RP), intent(out) :: MOMX_dt(elem%Np,lmesh%NeA)
145 real(RP), intent(out) :: MOMY_dt(elem%Np,lmesh%NeA)
146 real(RP), intent(out) :: MOMZ_dt(elem%Np,lmesh%NeA)
147 real(RP), intent(out) :: RHOT_dt(elem%Np,lmesh%NeA)
148 real(RP), intent(in) :: DDENS_(elem%Np,lmesh%NeA)
149 real(RP), intent(in) :: MOMX_(elem%Np,lmesh%NeA)
150 real(RP), intent(in) :: MOMY_(elem%Np,lmesh%NeA)
151 real(RP), intent(in) :: MOMZ_(elem%Np,lmesh%NeA)
152 real(RP), intent(in) :: DRHOT_(elem%Np,lmesh%NeA)
153 real(RP), intent(in) :: DPRES_(elem%Np,lmesh%NeA)
154 real(RP), intent(in) :: DENS_hyd(elem%Np,lmesh%NeA)
155 real(RP), intent(in) :: PRES_hyd(elem%Np,lmesh%NeA)
156 real(RP), intent(in) :: PRES_hyd_ref(elem%Np,lmesh%NeA)
157 real(RP), intent(in) :: THERM_hyd(elem%Np,lmesh%NeA)
158 real(RP), intent(in) :: CORIOLIS(elem2D%Np,lmesh2D%NeA)
159 real(RP), intent(in) :: Rtot(elem%Np,lmesh%NeA)
160 real(RP), intent(in) :: CVtot(elem%Np,lmesh%NeA)
161 real(RP), intent(in) :: CPtot(elem%Np,lmesh%NeA)
162 real(RP), intent(in) :: DPhydDx(elem%Np,lmesh%NeA)
163 real(RP), intent(in) :: DPhydDy(elem%Np,lmesh%NeA)
164
165 real(RP) :: Fx(elem%Np), Fy(elem%Np), Fz(elem%Np), LiftDelFlx(elem%Np)
166 real(RP) :: Fx_sp(elem%Np), Fy_sp(elem%Np), Fz_sp(elem%Np)
167 real(RP) :: DPRES_hyd(elem%Np), GradPhyd_x(elem%Np), GradPhyd_y(elem%Np)
168 real(RP) :: del_flux(elem%NfpTot,lmesh%Ne,PRGVAR_NUM)
169 real(RP) :: del_flux_hyd(elem%NfpTot,lmesh%Ne,2)
170 real(RP) :: GsqrtDens_(elem%Np), rdens_(elem%Np), RHOT_(elem%Np)
171 real(RP) :: u_(elem%Np), v_(elem%Np), w_(elem%Np), wt_(elem%Np), pot_(elem%Np)
172 real(RP) :: drho(elem%Np), Cori(elem%Np)
173 real(RP) :: GsqrtV(elem%Np), RGsqrtV(elem%Np)
174
175 integer :: ke, ke2d
176
177 real(RP) :: gamm, rgamm
178 real(RP) :: rP0
179 real(RP) :: RovP0, P0ovR
180 !------------------------------------------------------------------------
181
182 call prof_rapstart( 'cal_dyn_tend_bndflux', 3)
183 call get_ebnd_flux( &
184 del_flux, del_flux_hyd, & ! (out)
185 ddens_, momx_, momy_, momz_, drhot_, dpres_, dens_hyd, pres_hyd, & ! (in)
186 rtot, cvtot, cptot, & ! (in)
187 lmesh%Gsqrt, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), & ! (in)
188 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), & ! (in)
189 lmesh%vmapM, lmesh%vmapP, & ! (in)
190 lmesh, elem, lmesh2d, elem2d ) ! (in)
191 call prof_rapend( 'cal_dyn_tend_bndflux', 3)
192
193 !-----
194 call prof_rapstart( 'cal_dyn_tend_interior', 3)
195 gamm = cpdry / cvdry
196 rgamm = cvdry / cpdry
197 rp0 = 1.0_rp / pres00
198 rovp0 = rdry * rp0
199 p0ovr = pres00 / rdry
200
201 !$omp parallel do private( ke2d, Cori, &
202 !$omp RHOT_, GsqrtDens_, rdens_, u_, v_, w_, wt_, pot_, &
203 !$omp DPRES_hyd, GradPhyd_x, GradPhyd_y, drho, &
204 !$omp GsqrtV, RGsqrtV, &
205 !$omp Fx, Fy, Fz, Fx_sp, Fy_sp, Fz_sp, LiftDelFlx )
206 do ke = lmesh%NeS, lmesh%NeE
207 !--
208 ke2d = lmesh%EMap3Dto2D(ke)
209 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
210
211 gsqrtv(:) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
212 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
213
214 !--
215 rhot_(:) = p0ovr * (pres_hyd(:,ke) * rp0)**rgamm + drhot_(:,ke)
216 ! DPRES_(:) = PRES00 * ( Rtot(:,ke) * rP0 * RHOT_(:) )**( CPtot(:,ke) / CVtot(:,ke) ) &
217 ! - PRES_hyd(:,ke)
218
219 gsqrtdens_(:) = lmesh%Gsqrt(:,ke) * ( ddens_(:,ke) + dens_hyd(:,ke) )
220 rdens_(:) = 1.0_rp / gsqrtdens_(:)
221 u_(:) = momx_(:,ke) * rdens_(:)
222 v_(:) = momy_(:,ke) * rdens_(:)
223 w_(:) = momz_(:,ke) * rdens_(:)
224 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
225 pot_(:) = rhot_(:) * rdens_(:)
226
227 ke2d = lmesh%EMap3Dto2D(ke)
228 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
229
230 drho(:) = matmul(intrpmat_vpordm1, ddens_(:,ke))
231
232 !-- Gradient hydrostatic pressure
233
234 dpres_hyd(:) = pres_hyd(:,ke) - pres_hyd_ref(:,ke)
235
236 call sparsemat_matmul(dx, gsqrtv(:) * dpres_hyd(:), fx)
237 call sparsemat_matmul(dz, gsqrtv(:) * lmesh%GI3(:,ke,1) * dpres_hyd(:), fz)
238 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,1), liftdelflx)
239 gradphyd_x(:) = lmesh%Escale(:,ke,1,1) * fx(:) &
240 + lmesh%Escale(:,ke,3,3) * fz(:) &
241 + liftdelflx(:)
242
243 call sparsemat_matmul(dy, gsqrtv(:) * dpres_hyd(:), fy)
244 call sparsemat_matmul(dz, gsqrtv(:) * lmesh%GI3(:,ke,2) * dpres_hyd(:), fz)
245 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,2), liftdelflx)
246 gradphyd_y(:) = lmesh%Escale(:,ke,2,2) * fy(:) &
247 + lmesh%Escale(:,ke,3,3) * fz(:) &
248 + liftdelflx(:)
249
250 !-- DENS
251 call dx_ab( dxt1d_, gsqrtdens_(:), u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
252 call dy_ab( dyt1d_, gsqrtdens_(:), v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
253 call dz_ab( dzt1d_, gsqrtdens_(:), wt_(:), elem%Nnode_h1D, elem%Nnode_v, fz_sp )
254 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,dens_vid), liftdelflx)
255
256 dens_dt(:,ke) = - ( &
257 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
258 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
259 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
260 + liftdelflx(:) )
261
262 !-- MOMX
263 call dx_abc( dxt1d_, gsqrtdens_, u_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
264 call dy_abc( dyt1d_, gsqrtdens_, u_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
265 call dz_abc( dzt1d_, gsqrtdens_, u_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
266 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * dpres_(:,ke) , fx)
267 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momx_vid), liftdelflx)
268
269 momx_dt(:,ke) = &
270 - ( lmesh%Escale(:,ke,1,1) * ( fx_sp(:) + fx(:) ) &
271 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
272 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
273 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
274 - gradphyd_x(:) * rgsqrtv(:) &
275 + cori(:) * momy_(:,ke)
276
277 !-- MOMY
278 call dx_abc( dxt1d_, gsqrtdens_, v_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
279 call dy_abc( dyt1d_, gsqrtdens_, v_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
280 call dz_abc( dzt1d_, gsqrtdens_, v_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
281 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * dpres_(:,ke) , fy)
282 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momy_vid), liftdelflx)
283
284 momy_dt(:,ke) = &
285 - ( lmesh%Escale(:,ke,1,1) * fx_sp(:) &
286 + lmesh%Escale(:,ke,2,2) * ( fy_sp(:) + fy(:) ) &
287 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
288 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
289 - gradphyd_y(:) * rgsqrtv(:) &
290 - cori(:) * momx_(:,ke)
291
292 !-- MOMZ
293 call dx_abc( dxt1d_, gsqrtdens_, w_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
294 call dy_abc( dyt1d_, gsqrtdens_, w_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
295 call dz_abc( dzt1d_, gsqrtdens_, w_, wt_, elem%Nnode_h1D, elem%Nnode_v, fz_sp )
296 call sparsemat_matmul(dz, lmesh%Gsqrt(:,ke) * rgsqrtv(:) * dpres_(:,ke) , fz)
297 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momz_vid), liftdelflx)
298
299 momz_dt(:,ke) = - ( &
300 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
301 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
302 + lmesh%Escale(:,ke,3,3) * ( fz_sp(:) + fz(:) ) &
303 + liftdelflx(:) ) &
304 - grav * drho(:)
305
306 !-- RHOT
307 call dx_abc( dxt1d_, gsqrtdens_, pot_, u_, elem%Nnode_h1D, elem%Nnode_v, fx_sp )
308 call dy_abc( dyt1d_, gsqrtdens_, pot_, v_, elem%Nnode_h1D, elem%Nnode_v, fy_sp )
309 call dz_abc( dzt1d_, gsqrtdens_, pot_, wt_(:), elem%Nnode_h1D, elem%Nnode_v, fz_sp )
310 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,rhot_vid), liftdelflx)
311
312 rhot_dt(:,ke) = - ( &
313 lmesh%Escale(:,ke,1,1) * fx_sp(:) &
314 + lmesh%Escale(:,ke,2,2) * fy_sp(:) &
315 + lmesh%Escale(:,ke,3,3) * fz_sp(:) &
316 + liftdelflx(:) )
317 end do
318 call prof_rapend( 'cal_dyn_tend_interior', 3)
319
320 return
module FElib / Fluid dyn solver / Atmosphere / Nonhydrostatic model / HEVE / Numflux
subroutine, public atm_dyn_dgm_nonhydro3d_rhot_heve_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)

References scale_atm_dyn_dgm_nonhydro3d_rhot_heve_numflux::atm_dyn_dgm_nonhydro3d_rhot_heve_numflux_get_generalvc_asis(), and scale_atm_dyn_dgm_nonhydro3d_common::intrpmat_vpordm1.