FE-Project
Loading...
Searching...
No Matches
scale_atm_phy_tb_dgm_smg.F90
Go to the documentation of this file.
1!> module FElib / Atmosphere / Physics turbulence
2!!
3!! @par Description
4!! Sub-grid scale turbulence process
5!! Smagorinsky-type
6!!
7!! @author Yuta Kawai, Team SCALE
8!!
9!! @par Reference
10!! - Brown et al., 1994:
11!! Large-eddy simulation of stable atmospheric boundary layers with a revised stochastic subgrid model.
12!! Roy. Meteor. Soc., 120, 1485-1512
13!! - Scotti et al., 1993:
14!! Generalized Smagorinsky model for anisotropic grids.
15!! Phys. Fluids A, 5, 2306-2308
16!! - Nishizawa et al., 2015:
17!! Influence of grid aspect ratio on planetary boundary layer turbulence in large-eddy simulations
18!! Geosci. Model Dev., 8, 3393–3419
19!<
20!-------------------------------------------------------------------------------
21#include "scaleFElib.h"
23 !-----------------------------------------------------------------------------
24 !
25 !++ Used modules
26 !
27 use scale_precision
28 use scale_io
29 use scale_prc
30 use scale_prof
31 use scale_const, only: &
32 eps => const_eps, &
33 grav => const_grav, &
34 rdry => const_rdry, &
35 cpdry => const_cpdry, &
36 cvdry => const_cvdry, &
37 pres00 => const_pre00, &
38 karman => const_karman, &
39 rplanet => const_radius
40
42 use scale_element_base, only: &
50
51 !-----------------------------------------------------------------------------
52 implicit none
53 private
54 !-----------------------------------------------------------------------------
55 !
56 !++ Public procedures
57 !
61
62 !-----------------------------------------------------------------------------
63 !
64 !++ Private procedure
65 !
66 private :: cal_del_flux_grad
67
68 !-----------------------------------------------------------------------------
69 !
70 !++ Private parameters & variables
71 !
72 real(RP), private, parameter :: OneOverThree = 1.0_rp / 3.0_rp
73 real(RP), private, parameter :: twoOverThree = 2.0_rp / 3.0_rp
74 real(RP), private, parameter :: FourOverThree = 4.0_rp / 3.0_rp
75
76 real(RP), private :: Cs = 0.13_rp ! Smagorinsky constant (Scotti et al. 1993)
77 real(RP), private, parameter :: PrN = 0.7_rp ! Prandtl number in neutral conditions
78 real(RP), private, parameter :: RiC = 0.25_rp ! critical Richardson number
79 real(RP), private, parameter :: FmC = 16.0_rp ! fum = sqrt(1 - c*Ri)
80 real(RP), private, parameter :: FhB = 40.0_rp ! fuh = sqrt(1 - b*Ri)/PrN
81 real(RP), private :: RPrN ! 1 / PrN
82 real(RP), private :: RRiC ! 1 / RiC
83 real(RP), private :: OnemPrNovRiC ! PrN / RiC
84
85 ! for backscatter
86 real(RP), private, parameter :: CB = 1.4_rp
87 real(RP), private, parameter :: CBt = 0.45_rp
88 real(RP), private, parameter :: aN = 0.47958315233127197_rp ! a_N = sqrt(0.23)
89 real(RP), private, parameter :: atN4 = 0.09_rp ! a_{\theta N}^4 = 0.3**2
90 real(RP), private, parameter :: C1o = an**3
91 real(RP), private, parameter :: D1o = prn * atn4 / an
92
93
94 real(RP), private :: filter_fac = 2.0_rp
95 real(RP), private :: NU_MAX = 10000.0_rp
96 real(RP), private :: tke_fac
97
98contains
99!OCL SERIAL
100 subroutine atm_phy_tb_dgm_smg_init( mesh )
101 implicit none
102 class(meshbase3d), intent(in) :: mesh
103
104 logical :: consistent_tke = .true.
105
106 namelist / param_atmos_phy_tb_dgm_smg / &
107 cs, &
108 nu_max, &
109 filter_fac, &
110 consistent_tke
111
112 integer :: ierr
113 !--------------------------------------------------------------------
114
115 log_newline
116 log_info("ATMOS_PHY_TB_dgm_smg_setup",*) 'Setup'
117 log_info("ATMOS_PHY_TB_dgm_smg_setup",*) 'Smagorinsky-type Eddy Viscocity Model'
118
119 !--- read namelist
120 rewind(io_fid_conf)
121 read(io_fid_conf,nml=param_atmos_phy_tb_dgm_smg,iostat=ierr)
122 if( ierr < 0 ) then !--- missing
123 log_info("ATMOS_PHY_TB_dgm_smg_setup",*) 'Not found namelist. Default used.'
124 elseif( ierr > 0 ) then !--- fatal error
125 log_error("ATMOS_PHY_TB_dgm_smg_setup",*) 'Not appropriate names in namelist PARAM_ATMOS_PHY_TB_DGM_SMG. Check!'
126 call prc_abort
127 endif
128 log_nml(param_atmos_phy_tb_dgm_smg)
129
130 rprn = 1.0_rp / prn
131 rric = 1.0_rp / ric
132 onemprnovric = ( 1.0_rp - prn ) * rric
133
134 if ( consistent_tke ) then
135 tke_fac = 1.0_rp
136 else
137 tke_fac = 0.0_rp
138 end if
139
140 return
141 end subroutine atm_phy_tb_dgm_smg_init
142
143!OCL SERIAL
145 implicit none
146 !--------------------------------------------------------------------
147
148 return
149 end subroutine atm_phy_tb_dgm_smg_final
150
151!> Calculate parameterized stress tensor and eddy heat flux with turbulent model
152!!
153!OCL SERIAL
155 T11, T12, T13, T21, T22, T23, T31, T32, T33, & ! (out)
156 df1, df2, df3, & ! (out)
157 tke, nu, kh, & ! (out)
158 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, & ! (in)
159 pres, pt, & ! (in)
160 dx, dy, dz, sx, sy, sz, lift, lmesh, elem, lmesh2d, elem2d, & ! (in)
161 is_bound ) ! (in)
162
163 use scale_atm_phy_tb_dgm_common, only: &
165 implicit none
166
167 class(localmesh3d), intent(in) :: lmesh
168 class(elementbase3d), intent(in) :: elem
169 class(localmesh2d), intent(in) :: lmesh2d
170 class(elementbase2d), intent(in) :: elem2d
171 real(rp), intent(out) :: t11(elem%np,lmesh%nea) !< (1,1) component of stress tensor
172 real(rp), intent(out) :: t12(elem%np,lmesh%nea) !< (1,2) component of stress tensor
173 real(rp), intent(out) :: t13(elem%np,lmesh%nea) !< (1,3) component of stress tensor
174 real(rp), intent(out) :: t21(elem%np,lmesh%nea) !< (2,1) component of stress tensor
175 real(rp), intent(out) :: t22(elem%np,lmesh%nea) !< (2,2) component of stress tensor
176 real(rp), intent(out) :: t23(elem%np,lmesh%nea) !< (2,3) component of stress tensor
177 real(rp), intent(out) :: t31(elem%np,lmesh%nea) !< (3,1) component of stress tensor
178 real(rp), intent(out) :: t32(elem%np,lmesh%nea) !< (3,2) component of stress tensor
179 real(rp), intent(out) :: t33(elem%np,lmesh%nea) !< (3,3) component of stress tensor
180 real(rp), intent(out) :: df1(elem%np,lmesh%nea) !< Diffusive heat flux in x1 direction / density
181 real(rp), intent(out) :: df2(elem%np,lmesh%nea) !< Diffusive heat flux in x2 direction / density
182 real(rp), intent(out) :: df3(elem%np,lmesh%nea) !< Diffusive heat flux in x3 direction / density
183 real(rp), intent(out) :: tke(elem%np,lmesh%nea) !< Parameterized turbulent kinetic energy
184 real(rp), intent(out) :: nu(elem%np,lmesh%nea) !< Eddy viscosity
185 real(rp), intent(out) :: kh(elem%np,lmesh%nea) !< Eddy diffusivity
186 real(rp), intent(in) :: ddens_(elem%np,lmesh%nea) !< Density perturbation
187 real(rp), intent(in) :: momx_ (elem%np,lmesh%nea) !< Momentum in x1 direction
188 real(rp), intent(in) :: momy_ (elem%np,lmesh%nea) !< Momentum in x2 direction
189 real(rp), intent(in) :: momz_ (elem%np,lmesh%nea) !< Momentum in x3 direction
190 real(rp), intent(in) :: drhot_(elem%np,lmesh%nea) !< Density x potential temperature perturbation
191 real(rp), intent(in) :: dens_hyd(elem%np,lmesh%nea) !< Reference pressure in hydrostatic balance
192 real(rp), intent(in) :: pres_hyd(elem%np,lmesh%nea) !< Reference density in hydrostatic balance
193 real(rp), intent(in) :: pres(elem%np,lmesh%nea) !< Pressure
194 real(rp), intent(in) :: pt(elem%np,lmesh%nea) !< Potential temperature
195 type(sparsemat), intent(in) :: dx, dy, dz !< Differential matrix managed by sparse matrix type
196 type(sparsemat), intent(in) :: sx, sy, sz !< Stiffness matrix managed by sparse matrix type
197 type(sparsemat), intent(in) :: lift !< Lifting matrix managed by sparse matrix type
198 logical, intent(in) :: is_bound(elem%nfptot,lmesh%ne) !< Flag whether nodes are located at domain boundaries
199
200 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
201 real(rp) :: dens(elem%np), rdens(elem%np), rhot(elem%np), q(elem%np)
202 real(rp) :: ddensdxi(elem%np,3)
203 real(rp) :: dveldxi(elem%np,3,3)
204 real(rp) :: del_flux_rho (elem%nfptot,lmesh%ne,3)
205 real(rp) :: del_flux_mom (elem%nfptot,lmesh%ne,3,3)
206 real(rp) :: del_flux_rhot(elem%nfptot,lmesh%ne,3)
207
208 real(rp) :: s11(elem%np), s12(elem%np), s22(elem%np), s23(elem%np), s31(elem%np), s33(elem%np)
209 real(rp) :: skkovthree
210 real(rp) :: tkemultwoovthree
211 real(rp) :: coef
212
213 real(rp) :: ri ! local gradient Richardson number
214 real(rp) :: s2 ! (2SijSij)^1/2
215 real(rp) :: fm ! factor in eddy viscosity which represents the stability dependence of
216 ! the Brown et al (1994)'s subgrid model
217 real(rp) :: pr ! Parandtl number (=Nu/Kh= fm/fh)
218
219 real(rp) :: lambda (elem%np,lmesh%ne) ! basic mixing length
220 real(rp) :: lambda_r(elem%np) ! characteristic subgrid length scale
221 real(rp) :: e(elem%np) ! subgrid kinetic energy
222 real(rp) :: c1(elem%np) ! factor in the relation with energy disspation rate, lambda_r, and E
223
224 integer :: ke
225 integer :: p
226 !--------------------------------------------------------------------
227
228 call cal_del_flux_grad( del_flux_rho, del_flux_mom, del_flux_rhot, & ! (out)
229 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, pt, & ! (in)
230 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), & ! (in)
231 lmesh%vmapM, lmesh%vmapP, & ! (in)
232 lmesh, elem, is_bound ) ! (in)
233
234 call atm_phy_tb_dgm_common_calc_lambda( lambda, & ! (out)
235 cs, filter_fac, lmesh, elem, lmesh2d, elem2d ) ! (in)
236
237 !$omp parallel do private( &
238 !$omp Fx, Fy, Fz, LiftDelFlx, &
239 !$omp DENS, RHOT, RDENS, Q, DdensDxi, DVelDxi, &
240 !$omp S11, S12, S22, S23, S31, S33, &
241 !$omp coef, SkkOvThree, TKEMulTwoOvThree, &
242 !$omp p, Ri, S2, fm, Pr, lambda_r, E, C1 )
243 do ke=lmesh%NeS, lmesh%NeE
244 !---
245 dens(:) = dens_hyd(:,ke) + ddens_(:,ke)
246 rdens(:) = 1.0_rp / dens(:)
247 rhot(:) = dens(:) * pt(:,ke)
248
249 ! gradient of density
250 call sparsemat_matmul( dx, dens, fx )
251 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rho(:,ke,1), liftdelflx )
252 ddensdxi(:,1) = lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:)
253
254 call sparsemat_matmul( dy, dens, fy )
255 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rho(:,ke,2), liftdelflx )
256 ddensdxi(:,2) = lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:)
257
258 call sparsemat_matmul( dz, dens, fz )
259 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rho(:,ke,3), liftdelflx )
260 ddensdxi(:,3) = lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:)
261
262 ! gradient of u
263 q(:) = momx_(:,ke) * rdens(:)
264
265 call sparsemat_matmul( dx, momx_(:,ke), fx )
266 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,1,1), liftdelflx )
267 dveldxi(:,1,1) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
268
269 call sparsemat_matmul( dy, momx_(:,ke), fy )
270 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,2,1), liftdelflx )
271 dveldxi(:,2,1) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
272
273 call sparsemat_matmul( dz, momx_(:,ke), fz )
274 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,3,1), liftdelflx )
275 dveldxi(:,3,1) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
276
277 ! gradient of v
278 q(:) = momy_(:,ke) * rdens(:)
279
280 call sparsemat_matmul( dx, momy_(:,ke), fx )
281 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,1,2), liftdelflx )
282 dveldxi(:,1,2) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
283
284 call sparsemat_matmul( dy, momy_(:,ke), fy )
285 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,2,2), liftdelflx )
286 dveldxi(:,2,2) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
287
288 call sparsemat_matmul( dz, momy_(:,ke), fz )
289 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,3,2), liftdelflx )
290 dveldxi(:,3,2) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
291
292 ! gradient of w
293 q(:) = momz_(:,ke) * rdens(:)
294
295 call sparsemat_matmul( dx, momz_(:,ke), fx )
296 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,1,3), liftdelflx )
297 dveldxi(:,1,3) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
298
299 call sparsemat_matmul( dy, momz_(:,ke), fy )
300 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,2,3), liftdelflx )
301 dveldxi(:,2,3) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
302
303 call sparsemat_matmul( dz, momz_(:,ke), fz )
304 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_mom(:,ke,3,3), liftdelflx )
305 dveldxi(:,3,3) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
306
307 ! gradient of pt
308 q(:) = rhot(:) * rdens(:)
309
310 call sparsemat_matmul( dx, rhot, fx )
311 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rhot(:,ke,1), liftdelflx )
312 df1(:,ke) = ( lmesh%Escale(:,ke,1,1) * fx(:) + liftdelflx(:) - q(:) * ddensdxi(:,1) ) * rdens(:)
313
314 call sparsemat_matmul( dy, rhot, fy )
315 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rhot(:,ke,2), liftdelflx )
316 df2(:,ke) = ( lmesh%Escale(:,ke,2,2) * fy(:) + liftdelflx(:) - q(:) * ddensdxi(:,2) ) * rdens(:)
317
318 call sparsemat_matmul( dz, rhot, fz )
319 call sparsemat_matmul( lift, lmesh%Fscale(:,ke) * del_flux_rhot(:,ke,3), liftdelflx )
320 df3(:,ke) = ( lmesh%Escale(:,ke,3,3) * fz(:) + liftdelflx(:) - q(:) * ddensdxi(:,3) ) * rdens(:)
321
322
323 ! Calculate the component of strain velocity tensor
324 s11(:) = dveldxi(:,1,1)
325 s12(:) = 0.5_rp * ( dveldxi(:,1,2) + dveldxi(:,2,1) )
326 s22(:) = dveldxi(:,2,2)
327 s23(:) = 0.5_rp * ( dveldxi(:,2,3) + dveldxi(:,3,2) )
328 s31(:) = 0.5_rp * ( dveldxi(:,1,3) + dveldxi(:,3,1) )
329 s33(:) = dveldxi(:,3,3)
330
331 ! Caclulate eddy viscosity & eddy diffusivity
332
333 do p=1, elem%Np
334 s2 = 2.0_rp * ( s11(p)**2 + s22(p)**2 + s33(p)**2 ) &
335 + 4.0_rp * ( s31(p)**2 + s12(p)**2 + s23(p)**2 )
336
337 ri = grav / pt(p,ke) * df3(p,ke) / max( s2, eps )
338
339 ! The Stability functions fm and fh are given by the appendix A of Brown et al. (1994).
340 if (ri < 0.0_rp ) then ! unstable
341 fm = sqrt( 1.0_rp - fmc * ri )
342 nu(p,ke) = lambda(p,ke)**2 * sqrt( s2 ) * fm
343 pr = fm / sqrt( 1.0_rp - fhb * ri ) * prn
344 else if ( ri < ric ) then ! stable
345 fm = ( 1.0_rp - ri * rric )**4
346 nu(p,ke) = lambda(p,ke)**2 * sqrt( s2 ) * fm
347 pr = prn / ( 1.0_rp - onemprnovric * ri )
348 else ! strongly stable
349 fm = 0.0_rp
350 nu(p,ke) = 0.0_rp
351 kh(p,ke) = 0.0_rp
352 pr = 1.0_rp
353 end if
354
355 if ( ri < ric ) then
356 kh(p,ke) = max( min( nu(p,ke) / pr, nu_max ), eps )
357 nu(p,ke) = max( min( nu(p,ke), nu_max ), eps )
358 pr = nu(p,ke) / kh(p,ke)
359 lambda_r(p) = lambda(p,ke) * sqrt( fm / sqrt( 1.0_rp - ri/pr ) )
360 else
361 lambda_r(p) = 0.0_rp
362 end if
363 end do
364
365! Nu(:,ke) = 0.0_RP
366
367 ! if ( backscatter ) then
368 ! else
369 e(:) = nu(:,ke)**3 / ( lambda_r(:)**4 + eps )
370 c1(:) = c1o
371 ! end if
372
373 ! TKE
374 tke(:,ke) = ( e(:) * lambda_r(:) / c1(:) )**twooverthree
375
376 !---
377
378 do p=1, elem%Np
379 tkemultwoovthree = twooverthree * tke(p,ke) * tke_fac
380 skkovthree = ( s11(p) + s22(p) + s33(p) ) * oneoverthree
381 coef = 2.0_rp * nu(p,ke)
382
383 t11(p,ke) = dens(p) * ( coef * ( s11(p) - skkovthree ) - tkemultwoovthree )
384 t12(p,ke) = dens(p) * coef * s12(p)
385 t13(p,ke) = dens(p) * coef * s31(p)
386
387 t21(p,ke) = dens(p) * coef * s12(p)
388 t22(p,ke) = dens(p) * ( coef * ( s22(p) - skkovthree ) - tkemultwoovthree )
389 t23(p,ke) = dens(p) * coef * s23(p)
390
391 t31(p,ke) = dens(p) * coef * s31(p)
392 t32(p,ke) = dens(p) * coef * s23(p)
393 t33(p,ke) = dens(p) * ( coef * ( s33(p) - skkovthree ) - tkemultwoovthree )
394 end do
395
396 df1(:,ke) = kh(:,ke) * df1(:,ke)
397 df2(:,ke) = kh(:,ke) * df2(:,ke)
398 df3(:,ke) = kh(:,ke) * df3(:,ke)
399 end do
400
401 return
402 end subroutine atm_phy_tb_dgm_smg_cal_grad
403
404!-- private --------------------------------------------------------
405
406!OCL SERIAL
407 subroutine cal_del_flux_grad( del_flux_rho, del_flux_mom, del_flux_rhot, & ! (out)
408 ddens_, momx_, momy_, momz_, drhot_, dens_hyd, pres_hyd, pt_, & ! (in)
409 nx, ny, nz, vmapm, vmapp, lmesh, elem, is_bound ) ! (in)
410
411 implicit none
412
413 class(localmesh3d), intent(in) :: lmesh
414 class(elementbase3d), intent(in) :: elem
415 real(rp), intent(out) :: del_flux_rho(elem%nfptot*lmesh%ne,3)
416 real(rp), intent(out) :: del_flux_mom(elem%nfptot*lmesh%ne,3,3)
417 real(rp), intent(out) :: del_flux_rhot(elem%nfptot*lmesh%ne,3)
418 real(rp), intent(in) :: ddens_(elem%np*lmesh%nea)
419 real(rp), intent(in) :: momx_(elem%np*lmesh%nea)
420 real(rp), intent(in) :: momy_(elem%np*lmesh%nea)
421 real(rp), intent(in) :: momz_(elem%np*lmesh%nea)
422 real(rp), intent(in) :: drhot_(elem%np*lmesh%nea)
423 real(rp), intent(in) :: dens_hyd(elem%np*lmesh%nea)
424 real(rp), intent(in) :: pres_hyd(elem%np*lmesh%nea)
425 real(rp), intent(in) :: pt_(elem%np*lmesh%nea)
426 real(rp), intent(in) :: nx(elem%nfptot*lmesh%ne)
427 real(rp), intent(in) :: ny(elem%nfptot*lmesh%ne)
428 real(rp), intent(in) :: nz(elem%nfptot*lmesh%ne)
429 integer, intent(in) :: vmapm(elem%nfptot*lmesh%ne)
430 integer, intent(in) :: vmapp(elem%nfptot*lmesh%ne)
431 logical, intent(in) :: is_bound(elem%nfptot*lmesh%ne)
432
433 integer :: i, ip, im
434 real(rp) :: densm, densp
435 real(rp) :: del
436 real(rp) :: facx, facy, facz
437 !------------------------------------------------------------------------
438
439 !$omp parallel do private ( iM, iP, &
440 !$omp densM, densP, &
441 !$omp del, facx, facy, facz )
442 do i=1, elem%NfpTot * lmesh%Ne
443 im = vmapm(i); ip = vmapp(i)
444
445 densm = ddens_(im) + dens_hyd(im)
446 densp = ddens_(ip) + dens_hyd(ip)
447
448 if ( is_bound(i) ) then
449 facx = 1.0_rp
450 facy = 1.0_rp
451 facz = 1.0_rp
452 else
453 ! facx = 1.0_RP - sign(1.0_RP,nx(i))
454 ! facy = 1.0_RP - sign(1.0_RP,ny(i))
455 ! facz = 1.0_RP - sign(1.0_RP,nz(i))
456 facx = 1.0_rp
457 facy = 1.0_rp
458 facz = 1.0_rp
459 end if
460
461 del = 0.5_rp * ( densp - densm )
462 del_flux_rho(i,1) = facx * del * nx(i)
463 del_flux_rho(i,2) = facy * del * ny(i)
464 del_flux_rho(i,3) = facz * del * nz(i)
465
466 del = 0.5_rp * ( momx_(ip) - momx_(im) )
467 del_flux_mom(i,1,1) = facx * del * nx(i)
468 del_flux_mom(i,2,1) = facy * del * ny(i)
469 del_flux_mom(i,3,1) = facz * del * nz(i)
470
471 del = 0.5_rp * ( momy_(ip) - momy_(im) )
472 del_flux_mom(i,1,2) = facx * del * nx(i)
473 del_flux_mom(i,2,2) = facy * del * ny(i)
474 del_flux_mom(i,3,2) = facz * del * nz(i)
475
476 del = 0.5_rp * ( momz_(ip) - momz_(im) )
477 del_flux_mom(i,1,3) = facx * del * nx(i)
478 del_flux_mom(i,2,3) = facy * del * ny(i)
479 del_flux_mom(i,3,3) = facz * del * nz(i)
480
481 del = 0.5_rp * ( densp * pt_(ip) - densm * pt_(im) )
482 del_flux_rhot(i,1) = facx * del * nx(i)
483 del_flux_rhot(i,2) = facy * del * ny(i)
484 del_flux_rhot(i,3) = facz * del * nz(i)
485 end do
486
487 return
488 end subroutine cal_del_flux_grad
489
module FElib / Fluid dyn solver / Atmosphere / Physics turbulence / Common
subroutine, public atm_phy_tb_dgm_common_calc_lambda(lambda, cs, filter_fac, lmesh, elem, lmesh2d, elem2d)
module FElib / Atmosphere / Physics turbulence
subroutine, public atm_phy_tb_dgm_smg_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_smg_final()
subroutine, public atm_phy_tb_dgm_smg_init(mesh)
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.