source: LMDZ6/trunk/libf/phylmd/lmdz_atke_turbulence_ini.F90 @ 4976

Last change on this file since 4976 was 4804, checked in by evignon, 10 months ago

travail de documentation et commentaire des routines ATKE par Clement Dehondt

File size: 8.3 KB
RevLine 
[4687]1MODULE lmdz_atke_turbulence_ini
[4449]2
3implicit none
4
[4745]5! declaration of constants and parameters
[4449]6
[4804]7real, save, protected  :: rg, rd, rpi, rcpd, rv, viscom, viscoh       
8!$OMP THREADPRIVATE(rg, rd, rpi, rcpd, rv, viscom, viscoh)     
[4478]9
[4804]10integer, save, protected :: iflag_atke        ! flag that controls options in atke_compute_km_kh
11integer, save, protected :: iflag_atke_lmix   ! flag that controls the calculation of mixing length in atke
12integer, save, protected :: iflag_num_atke    ! flag that controls the numerical treatment of diffusion coeffiient calculation
13!$OMP THREADPRIVATE(iflag_atke, iflag_atke_lmix, iflag_num_atke)
[4449]14
[4804]15logical, save, protected :: atke_ok_vdiff    ! activate vertical diffusion of TKE or not
16logical, save, protected :: atke_ok_virtual  ! account for vapor for flottability
17!$OMP THREADPRIVATE(atke_ok_vdiff, atke_ok_virtual)
[4449]18
[4804]19real, save, protected :: kappa = 0.4         ! Von Karman constant
20real, save, protected :: cn                  ! Sm value at Ri=0
21real, save, protected :: cinf                ! Sm value at Ri=-Inf
22real, save, protected :: ri0                 ! Richardson number near zero to guarantee continuity in slope of Sm (stability function) at Ri=0
23real, save, protected :: ri1                 ! Richardson number near zero to guarantee continuity in slope of Pr (Prandlt's number) at Ri=0
24real, save, protected :: lmin = 0.01         ! minimum mixing length corresponding to the Kolmogov dissipation scale  in planetary atmospheres (Chen et al 2016, JGR Atmos)
25real, save, protected :: ctkes               ! coefficient for surface TKE
26real, save, protected :: clmixshear          ! coefficient for mixing length depending on local wind shear
27!$OMP THREADPRIVATE(kappa, cn, cinf, ri0, ri1, lmin, ctkes, clmixshear)
[4449]28
29
[4804]30! Tunable parameters for the ATKE scheme and their range of values
31!!-------------------------------------------------------------------------------------------------------------
32real, save, protected :: cepsilon            ! controls the value of the dissipation length scale, range [1.2 - 10]
33real, save, protected :: cke                 ! controls the value of the diffusion coefficient of TKE, range [1 - 5]
34real, save, protected :: l0                  ! asymptotic mixing length far from the ground [m] (Sun et al 2011, JAMC), range [15 - 75]
35real, save, protected :: clmix               ! controls the value of the mixing length in stratified conditions, range [0.1 - 2]
36real, save, protected :: ric                 ! critical Richardson number controlling the slope of Sm in stable conditions, range [0.19 - 0.25]
37real, save, protected :: smmin               ! minimum value of Sm in very stable conditions (defined here as minsqrt(Ez/Ek)) at large Ri, range [0.025 - 0.1]
38real, save, protected :: pr_neut             ! neutral value of the Prandtl number (Ri=0), range [0.7 - 1]
39real, save, protected :: pr_slope            ! linear slope of Pr with Ri in the very stable regime, range [3 - 5]
40real, save, protected :: cinffac             ! ratio between cinf and cn controlling the convective limit of Sm, range [1.2 - 5.0]
41real, save, protected :: pr_asym             ! value of Prandlt in the convective limit(Ri=-Inf), range [0.3 - 0.5]
42!$OMP THREADPRIVATE(cepsilon, cke, l0, clmix, ric, smmin, pr_neut, pr_slope, cinffac, pr_asym)
43!!-------------------------------------------------------------------------------------------------------------
[4449]44
[4804]45CONTAINS
[4449]46
[4804]47SUBROUTINE atke_ini(rg_in, rd_in, rpi_in, rcpd_in, rv_in, viscom_in, viscoh_in)
48      !!----------------------------------------------------------------------
49      !!                  ***  ROUTINE  atke_ini  ***
50      !!
51      !! ** Purpose :   Initialization of the atke module and choice of some constants
52      !!               
53      !!----------------------------------------------------------------------
[4478]54
[4804]55        USE ioipsl_getin_p_mod, ONLY : getin_p                                                                                                     
[4745]56
[4804]57      ! input arguments (universal constants for planet)
58      !-------------------------------------------------
59      real, intent(in) :: rg_in, rd_in, rpi_in, rcpd_in, rv_in, viscom_in, viscoh_in
60      !!----------------------------------------------------------------------
61     
62      rg=rg_in          ! gravity acceleration
63      rd=rd_in          ! dry gas constant (R/M, R=perfect gas constant and M is the molar mass of the fluid)
64      rpi=rpi_in        ! Pi number
65      rcpd=rcpd_in      ! cp per unit mass of the gas
66      rv=rv_in          ! water vapor constant (for simulations in Earth's atmosphere)
67      viscom=viscom_in  ! kinematic molecular viscosity for momentum
68      viscoh=viscoh_in  ! kinematic molecular viscosity for heat
[4745]69
70
[4804]71      ! Read flag values in .def files
72      !-------------------------------
[4745]73
[4804]74      ! flag that controls options in atke_compute_km_kh
75      iflag_atke=0
76      CALL getin_p('iflag_atke',iflag_atke)
[4449]77
[4804]78      ! flag that controls the calculation of mixing length in atke
79      iflag_atke_lmix=0
80      CALL getin_p('iflag_atke_lmix',iflag_atke_lmix)
[4631]81
[4804]82      if (iflag_atke .eq. 0 .and. iflag_atke_lmix>0) then
83            call abort_physic("atke_turbulence_ini", &
84            'stationary scheme must use mixing length formulation not depending on tke', 1)
85      endif
[4631]86
[4804]87      ! activate vertical diffusion of TKE or not
88      atke_ok_vdiff=.false.
89      CALL getin_p('atke_ok_vdiff',atke_ok_vdiff)
[4631]90
[4804]91      ! account for vapor for flottability
92      atke_ok_virtual=.true.
93      CALL getin_p('atke_ok_virtual',atke_ok_virtual)
[4653]94
95
[4804]96      ! flag that controls the numerical treatment of diffusion coeffiient calculation
97      iflag_num_atke=0
98      CALL getin_p('iflag_num_atke',iflag_num_atke)
[4653]99
[4804]100      ! asymptotic mixing length in neutral conditions [m]
101      ! Sun et al 2011, JAMC
102      ! between 10 and 40
103      l0=15.0
104      CALL getin_p('atke_l0',l0)
[4545]105
[4804]106      ! critical Richardson number
107      ric=0.25
108      CALL getin_p('atke_ric',ric)
[4449]109
[4804]110      ! constant for tke dissipation calculation
111      cepsilon=5.87 ! default value as in yamada4
112      CALL getin_p('atke_cepsilon',cepsilon)
[4449]113
[4804]114      ! calculation of cn = Sm value at Ri=0
115      ! direct dependance on cepsilon to guarantee Fm=1 (first-order like stability function) at Ri=0
116      cn=(1./sqrt(cepsilon))**(2/3)
[4449]117
[4804]118      ! asymptotic value of Sm for Ri=-Inf
119      cinffac=2.0
120      CALL getin_p('atke_cinffac',cinffac)
121      cinf=cinffac*cn
122      if (cinf .le. cn) then
123            call abort_physic("atke_turbulence_ini", &
124            'cinf cannot be lower than cn', 1)
125      endif
[4449]126
[4804]127      ! coefficient for surface TKE
128      ! following Lenderink & Holtslag 2004, ctkes=(cepsilon)**(2/3)
129      ! (provided by limit condition in neutral conditions)
130      ctkes=(cepsilon)**(2./3.)
[4653]131
[4804]132      ! slope of Pr=f(Ri) for stable conditions
133      pr_slope=5.0 ! default value from Zilitinkevich et al. 2005
134      CALL getin_p('atke_pr_slope',pr_slope)
135      if (pr_slope .le. 1) then
136            call abort_physic("atke_turbulence_ini", &
137            'pr_slope has to be greater than 1 for consistency of the tke scheme', 1)
138      endif
[4780]139
[4804]140      ! value of turbulent prandtl number in neutral conditions (Ri=0)
141      pr_neut=0.8
142      CALL getin_p('atke_pr_neut',pr_neut)
[4780]143
[4804]144      ! asymptotic turbulent prandt number value for Ri=-Inf
145      pr_asym=0.4
146      CALL getin_p('atke_pr_asym',pr_asym)
147      if (pr_asym .ge. pr_neut) then
148            call abort_physic("atke_turbulence_ini", &
149            'pr_asym must be be lower than pr_neut', 1)
150      endif
[4780]151
[4804]152      ! coefficient for mixing length depending on local stratification
153      clmix=0.5
154      CALL getin_p('atke_clmix',clmix)
[4653]155
[4804]156      ! coefficient for mixing length depending on local wind shear
157      clmixshear=0.5
158      CALL getin_p('atke_clmixshear',clmixshear)
[4449]159
[4804]160      ! minimum anisotropy coefficient (defined here as minsqrt(Ez/Ek)) at large Ri.
161      ! From Zilitinkevich et al. 2013, it equals sqrt(0.03)~0.17 
162      smmin=0.17
163      CALL getin_p('atke_smmin',smmin)
[4478]164
[4804]165      ! ratio between the eddy diffusivity coeff for tke wrt that for momentum
166      ! default value from Lenderink et al. 2004
167      cke=2.
168      CALL getin_p('atke_cke',cke)
[4780]169
[4804]170      ! calculation of Ri0 such that continuity in slope of Sm at Ri=0
171      ri0=2./rpi*(cinf - cn)*ric/cn
[4780]172
[4804]173      ! calculation of Ri1 to guarantee continuity in slope of Prandlt number at Ri=0
174      ri1 = -2./rpi * (pr_asym - pr_neut)
[4780]175
[4804]176RETURN
[4780]177
[4449]178END SUBROUTINE atke_ini
179
[4687]180END MODULE  lmdz_atke_turbulence_ini
Note: See TracBrowser for help on using the repository browser.