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