FE-Project
Loading...
Searching...
No Matches
scale_atm_phy_tb_dgm_dns.F90
Go to the documentation of this file.
1!> module FElib / Atmosphere / Physics turbulence
2!!
3!! @par Description
4!! Turbulence process for DNS
5!!
6!! @author Yuta Kawai, Team SCALE
7!<
8!-------------------------------------------------------------------------------
9#include "scaleFElib.h"
11 !-----------------------------------------------------------------------------
12 !
13 !++ Used modules
14 !
15 use scale_precision
16 use scale_io
17 use scale_prc
18 use scale_prof
19 use scale_const, only: &
20 eps => const_eps, &
21 grav => const_grav, &
22 rdry => const_rdry, &
23 cpdry => const_cpdry, &
24 cvdry => const_cvdry, &
25 pres00 => const_pre00, &
26 karman => const_karman, &
27 rplanet => const_radius
28
30 use scale_element_base, only: &
38
39 !-----------------------------------------------------------------------------
40 implicit none
41 private
42 !-----------------------------------------------------------------------------
43 !
44 !++ Public procedures
45 !
49
50 !-----------------------------------------------------------------------------
51 !
52 !++ Private procedure
53 !
54 private :: cal_del_flux_grad
55
56 !-----------------------------------------------------------------------------
57 !
58 !++ Private parameters & variables
59 !
60 real(RP), private, parameter :: OneOverThree = 1.0_rp / 3.0_rp
61 real(RP), private, parameter :: twoOverThree = 2.0_rp / 3.0_rp
62 real(RP), private, parameter :: FourOverThree = 4.0_rp / 3.0_rp
63
64 real(RP), private :: DNS_NU = 1.512e-5_rp !< kinematic viscosity coefficient [m2/s] for air at 20degC
65 real(RP), private :: DNS_MU = 1.8e-5_rp !< molecular diffusive coefficient [m2/s] for air at 20degC
66
67contains
68!OCL SERIAL
69 subroutine atm_phy_tb_dgm_dns_init( mesh )
70 implicit none
71 class(meshbase3d), intent(in) :: mesh
72
73 logical :: consistent_tke = .true.
74
75 namelist / param_atmos_phy_tb_dgm_dns / &
76 dns_nu, dns_mu
77
78 integer :: ierr
79 !--------------------------------------------------------------------
80
81 log_newline
82 log_info("ATMOS_PHY_TB_dgm_dns_setup",*) 'Setup'
83 log_info("ATMOS_PHY_TB_dgm_dns_setup",*) 'Eddy Viscocity Model for DNS'
84
85 !--- read namelist
86 rewind(io_fid_conf)
87 read(io_fid_conf,nml=param_atmos_phy_tb_dgm_dns,iostat=ierr)
88 if( ierr < 0 ) then !--- missing
89 log_info("ATMOS_PHY_TB_dgm_dns_setup",*) 'Not found namelist. Default used.'
90 elseif( ierr > 0 ) then !--- fatal error
91 log_error("ATMOS_PHY_TB_dgm_dns_setup",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_TB_DGM_DNS. Check!'
92 call prc_abort
93 endif
94 log_nml(param_atmos_phy_tb_dgm_dns)
95
96 return
97 end subroutine atm_phy_tb_dgm_dns_init
98
99!OCL SERIAL
101 implicit none
102 !--------------------------------------------------------------------
103
104 return
105 end subroutine atm_phy_tb_dgm_dns_final
106
107!> Calculate parameterized stress tensor and eddy heat flux with turbulent model
108!!
109!OCL SERIAL
111 T11, T12, T13, T21, T22, T23, T31, T32, T33, & ! (out)
112 df1, df2, df3, & ! (out)
113 tke, nu, kh, & ! (out)
114 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, & ! (in)
115 pres, pt, & ! (in)
116 dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, & ! (in)
117 is_bound ) ! (in)
118
119 implicit none
120
121 class(localmesh3d), intent(in) :: lmesh
122 class(elementbase3d), intent(in) :: elem
123 class(localmesh2d), intent(in) :: lmesh2d
124 class(elementbase2d), intent(in) :: elem2d
125 real(rp), intent(out) :: t11(elem%np,lmesh%nea) !< (1,1) component of stress tensor
126 real(rp), intent(out) :: t12(elem%np,lmesh%nea) !< (1,2) component of stress tensor
127 real(rp), intent(out) :: t13(elem%np,lmesh%nea) !< (1,3) component of stress tensor
128 real(rp), intent(out) :: t21(elem%np,lmesh%nea) !< (2,1) component of stress tensor
129 real(rp), intent(out) :: t22(elem%np,lmesh%nea) !< (2,2) component of stress tensor
130 real(rp), intent(out) :: t23(elem%np,lmesh%nea) !< (2,3) component of stress tensor
131 real(rp), intent(out) :: t31(elem%np,lmesh%nea) !< (3,1) component of stress tensor
132 real(rp), intent(out) :: t32(elem%np,lmesh%nea) !< (3,2) component of stress tensor
133 real(rp), intent(out) :: t33(elem%np,lmesh%nea) !< (3,3) component of stress tensor
134 real(rp), intent(out) :: df1(elem%np,lmesh%nea) !< Diffusive heat flux in x1 direction / density
135 real(rp), intent(out) :: df2(elem%np,lmesh%nea) !< Diffusive heat flux in x2 direction / density
136 real(rp), intent(out) :: df3(elem%np,lmesh%nea) !< Diffusive heat flux in x3 direction / density
137 real(rp), intent(out) :: tke(elem%np,lmesh%nea) !< Parameterized turbulent kinetic energy
138 real(rp), intent(out) :: nu(elem%np,lmesh%nea) !< Eddy viscosity
139 real(rp), intent(out) :: kh(elem%np,lmesh%nea) !< Eddy diffusivity
140 real(rp), intent(in) :: ddens_(elem%np,lmesh%nea) !< Density perturbation
141 real(rp), intent(in) :: momx_ (elem%np,lmesh%nea) !< Momentum in x1 direction
142 real(rp), intent(in) :: momy_ (elem%np,lmesh%nea) !< Momentum in x2 direction
143 real(rp), intent(in) :: momz_ (elem%np,lmesh%nea) !< Momentum in x3 direction
144 real(rp), intent(in) :: drhot_(elem%np,lmesh%nea) !< Density x potential temperature perturbation
145 real(rp), intent(in) :: dens_hyd(elem%np,lmesh%nea) !< Reference pressure in hydrostatic balance
146 real(rp), intent(in) :: pres_hyd(elem%np,lmesh%nea) !< Reference density in hydrostatic balance
147 real(rp), intent(in) :: pres(elem%np,lmesh%nea) !< Pressure
148 real(rp), intent(in) :: pt(elem%np,lmesh%nea) !< Potential temperature
149 type(sparsemat), intent(in) :: dx, dy, dz !< Differential matrix managed by sparse matrix type
150 type(sparsemat), intent(in) :: sx, sy, sz !< Stiffness matrix managed by sparse matrix type
151 type(sparsemat), intent(in) :: lift !< Lifting matrix managed by sparse matrix type
152 logical, intent(in) :: is_bound(elem%nfptot,lmesh%ne) !< Flag whether nodes are located at domain boundaries
153
154 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
155 real(rp) :: dens(elem%np), rdens(elem%np), rhot(elem%np), q(elem%np)
156 real(rp) :: ddensdxi(elem%np,3)
157 real(rp) :: dveldxi(elem%np,3,3)
158 real(rp) :: del_flux_rho (elem%nfptot,lmesh%ne,3)
159 real(rp) :: del_flux_mom (elem%nfptot,lmesh%ne,3,3)
160 real(rp) :: del_flux_rhot(elem%nfptot,lmesh%ne,3)
161
162 real(rp) :: s11(elem%np), s12(elem%np), s22(elem%np), s23(elem%np), s31(elem%np), s33(elem%np)
163 real(rp) :: skkovthree
164 real(rp) :: coef
165
166 integer :: ke
167 integer :: p
168 !--------------------------------------------------------------------
169
170 call cal_del_flux_grad( del_flux_rho, del_flux_mom, del_flux_rhot, & ! (out)
171 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, pt, & ! (in)
172 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), & ! (in)
173 lmesh%vmapM, lmesh%vmapP, & ! (in)
174 lmesh, elem, is_bound ) ! (in)
175
176 !$omp parallel do private( &
177 !$omp Fx, Fy, Fz, LiftDelFlx, &
178 !$omp DENS, RHOT, RDENS, Q, DdensDxi, DVelDxi, &
179 !$omp S11, S12, S22, S23, S31, S33, &
180 !$omp coef, SkkOvThree, &
181 !$omp p )
182 do ke=lmesh%NeS, lmesh%NeE
183 !---
184 dens(:) = dens_hyd(:,ke) + ddens_(:,ke)
185 rdens(:) = 1.0_rp / dens(:)
186 rhot(:) = dens(:) * pt(:,ke)
187
188 ! gradient of density
189 call sparsemat_matmul( dx, dens, fx )
190 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rho(:,ke,1), liftdelflx )
191 ddensdxi(:,1) = lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:)
192
193 call sparsemat_matmul( dy, dens, fy )
194 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rho(:,ke,2), liftdelflx )
195 ddensdxi(:,2) = lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:)
196
197 call sparsemat_matmul( dz, dens, fz )
198 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rho(:,ke,3), liftdelflx )
199 ddensdxi(:,3) = lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
200
201 ! gradient of u
202 q(:) = momx_(:,ke) * rdens(:)
203
204 call sparsemat_matmul( dx, momx_(:,ke), fx )
205 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,1,1), liftdelflx )
206 dveldxi(:,1,1) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
207
208 call sparsemat_matmul( dy, momx_(:,ke), fy )
209 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,2,1), liftdelflx )
210 dveldxi(:,2,1) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
211
212 call sparsemat_matmul( dz, momx_(:,ke), fz )
213 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,3,1), liftdelflx )
214 dveldxi(:,3,1) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
215
216 ! gradient of v
217 q(:) = momy_(:,ke) * rdens(:)
218
219 call sparsemat_matmul( dx, momy_(:,ke), fx )
220 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,1,2), liftdelflx )
221 dveldxi(:,1,2) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
222
223 call sparsemat_matmul( dy, momy_(:,ke), fy )
224 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,2,2), liftdelflx )
225 dveldxi(:,2,2) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
226
227 call sparsemat_matmul( dz, momy_(:,ke), fz )
228 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,3,2), liftdelflx )
229 dveldxi(:,3,2) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
230
231 ! gradient of w
232 q(:) = momz_(:,ke) * rdens(:)
233
234 call sparsemat_matmul( dx, momz_(:,ke), fx )
235 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,1,3), liftdelflx )
236 dveldxi(:,1,3) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
237
238 call sparsemat_matmul( dy, momz_(:,ke), fy )
239 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,2,3), liftdelflx )
240 dveldxi(:,2,3) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
241
242 call sparsemat_matmul( dz, momz_(:,ke), fz )
243 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,3,3), liftdelflx )
244 dveldxi(:,3,3) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
245
246 ! gradient of pt
247 q(:) = rhot(:) * rdens(:)
248
249 call sparsemat_matmul( dx, rhot, fx )
250 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rhot(:,ke,1), liftdelflx )
251 df1(:,ke) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
252
253 call sparsemat_matmul( dy, rhot, fy )
254 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rhot(:,ke,2), liftdelflx )
255 df2(:,ke) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
256
257 call sparsemat_matmul( dz, rhot, fz )
258 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rhot(:,ke,3), liftdelflx )
259 df3(:,ke) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
260
261
262 ! Calculate the component of strain velocity tensor
263 s11(:) = dveldxi(:,1,1)
264 s12(:) = 0.5_rp * ( dveldxi(:,1,2) + dveldxi(:,2,1) )
265 s22(:) = dveldxi(:,2,2)
266 s23(:) = 0.5_rp * ( dveldxi(:,2,3) + dveldxi(:,3,2) )
267 s31(:) = 0.5_rp * ( dveldxi(:,1,3) + dveldxi(:,3,1) )
268 s33(:) = dveldxi(:,3,3)
269
270 ! Caclulate eddy viscosity & eddy diffusivity
271
272 nu(:,ke) = dns_nu
273 kh(:,ke) = dns_mu
274
275 !---
276
277 do p=1, elem%Np
278 skkovthree = ( s11(p) + s22(p) + s33(p) ) * oneoverthree
279 coef = 2.0_rp * nu(p,ke)
280
281 t11(p,ke) = dens(p) * ( coef * ( s11(p) - skkovthree ) )
282 t12(p,ke) = dens(p) * coef * s12(p)
283 t13(p,ke) = dens(p) * coef * s31(p)
284
285 t21(p,ke) = dens(p) * coef * s12(p)
286 t22(p,ke) = dens(p) * ( coef * ( s22(p) - skkovthree ) )
287 t23(p,ke) = dens(p) * coef * s23(p)
288
289 t31(p,ke) = dens(p) * coef * s31(p)
290 t32(p,ke) = dens(p) * coef * s23(p)
291 t33(p,ke) = dens(p) * ( coef * ( s33(p) - skkovthree ) )
292 end do
293
294 df1(:,ke) = kh(:,ke) * df1(:,ke)
295 df2(:,ke) = kh(:,ke) * df2(:,ke)
296 df3(:,ke) = kh(:,ke) * df3(:,ke)
297 end do
298
299 return
300 end subroutine atm_phy_tb_dgm_dns_cal_grad
301
302!OCL SERIAL
303 subroutine cal_del_flux_grad( del_flux_rho, del_flux_mom, del_flux_rhot, & ! (out)
304 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, pt_, & ! (in)
305 nx, ny, nz, vmapm, vmapp, lmesh, elem, is_bound ) ! (in)
306
307 implicit none
308
309 class(localmesh3d), intent(in) :: lmesh
310 class(elementbase3d), intent(in) :: elem
311 real(rp), intent(out) :: del_flux_rho(elem%nfptot*lmesh%ne,3)
312 real(rp), intent(out) :: del_flux_mom(elem%nfptot*lmesh%ne,3,3)
313 real(rp), intent(out) :: del_flux_rhot(elem%nfptot*lmesh%ne,3)
314 real(rp), intent(in) :: ddens_(elem%np*lmesh%nea)
315 real(rp), intent(in) :: momx_(elem%np*lmesh%nea)
316 real(rp), intent(in) :: momy_(elem%np*lmesh%nea)
317 real(rp), intent(in) :: momz_(elem%np*lmesh%nea)
318 real(rp), intent(in) :: drhot_(elem%np*lmesh%nea)
319 real(rp), intent(in) :: dens_hyd(elem%np*lmesh%nea)
320 real(rp), intent(in) :: pres_hyd(elem%np*lmesh%nea)
321 real(rp), intent(in) :: pt_(elem%np*lmesh%nea)
322 real(rp), intent(in) :: nx(elem%nfptot*lmesh%ne)
323 real(rp), intent(in) :: ny(elem%nfptot*lmesh%ne)
324 real(rp), intent(in) :: nz(elem%nfptot*lmesh%ne)
325 integer, intent(in) :: vmapm(elem%nfptot*lmesh%ne)
326 integer, intent(in) :: vmapp(elem%nfptot*lmesh%ne)
327 logical, intent(in) :: is_bound(elem%nfptot*lmesh%ne)
328
329 integer :: i, ip, im
330 real(rp) :: densm, densp
331 real(rp) :: del
332 real(rp) :: facx, facy, facz
333 !------------------------------------------------------------------------
334
335 !$omp parallel do private ( iM, iP, &
336 !$omp densM, densP, &
337 !$omp del, facx, facy, facz )
338 do i=1, elem%NfpTot * lmesh%Ne
339 im = vmapm(i); ip = vmapp(i)
340
341 densm = ddens_(im) + dens_hyd(im)
342 densp = ddens_(ip) + dens_hyd(ip)
343
344 if ( is_bound(i) ) then
345 facx = 1.0_rp
346 facy = 1.0_rp
347 facz = 1.0_rp
348 else
349 ! facx = 1.0_RP - sign(1.0_RP,nx(i))
350 ! facy = 1.0_RP - sign(1.0_RP,ny(i))
351 ! facz = 1.0_RP - sign(1.0_RP,nz(i))
352 facx = 1.0_rp
353 facy = 1.0_rp
354 facz = 1.0_rp
355 end if
356
357 del = 0.5_rp * ( densp - densm )
358 del_flux_rho(i,1) = facx * del * nx(i)
359 del_flux_rho(i,2) = facy * del * ny(i)
360 del_flux_rho(i,3) = facz * del * nz(i)
361
362 del = 0.5_rp * ( momx_(ip) - momx_(im) )
363 del_flux_mom(i,1,1) = facx * del * nx(i)
364 del_flux_mom(i,2,1) = facy * del * ny(i)
365 del_flux_mom(i,3,1) = facz * del * nz(i)
366
367 del = 0.5_rp * ( momy_(ip) - momy_(im) )
368 del_flux_mom(i,1,2) = facx * del * nx(i)
369 del_flux_mom(i,2,2) = facy * del * ny(i)
370 del_flux_mom(i,3,2) = facz * del * nz(i)
371
372 del = 0.5_rp * ( momz_(ip) - momz_(im) )
373 del_flux_mom(i,1,3) = facx * del * nx(i)
374 del_flux_mom(i,2,3) = facy * del * ny(i)
375 del_flux_mom(i,3,3) = facz * del * nz(i)
376
377 del = 0.5_rp * ( densp * pt_(ip) - densm * pt_(im) )
378 del_flux_rhot(i,1) = facx * del * nx(i)
379 del_flux_rhot(i,2) = facy * del * ny(i)
380 del_flux_rhot(i,3) = facz * del * nz(i)
381 end do
382
383 return
384 end subroutine cal_del_flux_grad
385
386!-- private --------------------------------------------------------
387
module FElib / Atmosphere / Physics turbulence
subroutine, public atm_phy_tb_dgm_dns_init(mesh)
subroutine, public atm_phy_tb_dgm_dns_cal_grad(t11, t12, t13, t21, t22, t23, t31, t32, t33, df1, df2, df3, tke, nu, kh, ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, pres, pt, dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, is_bound)
Calculate parameterized stress tensor and eddy heat flux with turbulent model.
subroutine, public atm_phy_tb_dgm_dns_final()
module FElib / Element / Base
module FElib / Element / hexahedron
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 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.