Changeset 2561 for LMDZ5/trunk/libf/phylmd
- Timestamp:
- Jun 10, 2016, 2:04:19 PM (8 years ago)
- Location:
- LMDZ5/trunk/libf/phylmd
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/clesphys.h
r2524 r2561 40 40 !IM, MAFo fmagic, pmagic : parametres - additionnel et multiplicatif - 41 41 ! pour regler l albedo sur ocean 42 REAL pbl_lmixmin_alpha 42 43 REAL fmagic, pmagic 43 44 ! Hauteur (imposee) du contenu en eau du sol … … 94 95 & , CH4_ppb, N2O_ppb, CFC11_ppt, CFC12_ppt & 95 96 & , CH4_ppb_per, N2O_ppb_per, CFC11_ppt_per, CFC12_ppt_per & 96 & , cdmmax, cdhmax, ksta, ksta_ter, f_ri_cd_min&97 & , cdmmax,cdhmax,ksta,ksta_ter,f_ri_cd_min,pbl_lmixmin_alpha & 97 98 & , fmagic, pmagic & 98 99 & , f_cdrag_ter,f_cdrag_oce,f_rugoro,z0min & -
LMDZ5/trunk/libf/phylmd/coef_diff_turb_mod.F90
r2311 r2561 164 164 iflag_pbl) 165 165 ELSE IF (iflag_pbl<20) THEN 166 CALL yamada4( knon,dtime,RG,RD,ypaprs,yt, &166 CALL yamada4(ni,nsrf,knon,dtime,RG,RD,ypaprs,yt, & 167 167 yzlev,yzlay,yu,yv,yteta, & 168 168 ycdragm,yq2,ykmm,ykmn,ykmq,yustar, & -
LMDZ5/trunk/libf/phylmd/conf_phys_m.F90
r2547 r2561 179 179 REAL,SAVE :: cdmmax_omp,cdhmax_omp,ksta_omp,ksta_ter_omp,f_ri_cd_min_omp 180 180 LOGICAL,SAVE :: ok_kzmin_omp 181 REAL, SAVE :: pbl_lmixmin_alpha_omp 181 182 REAL, SAVE :: fmagic_omp, pmagic_omp 182 183 INTEGER,SAVE :: iflag_pbl_omp,lev_histhf_omp,lev_histday_omp,lev_histmth_omp … … 1269 1270 ok_kzmin_omp = .true. 1270 1271 call getin('ok_kzmin',ok_kzmin_omp) 1272 1273 pbl_lmixmin_alpha_omp=0.0 1274 call getin('pbl_lmixmin_alpha',pbl_lmixmin_alpha_omp) 1275 1271 1276 1272 1277 ! … … 2066 2071 f_ri_cd_min = f_ri_cd_min_omp 2067 2072 ok_kzmin = ok_kzmin_omp 2073 pbl_lmixmin_alpha=pbl_lmixmin_alpha_omp 2068 2074 fmagic = fmagic_omp 2069 2075 pmagic = pmagic_omp … … 2383 2389 write(lunout,*)' f_ri_cd_min = ',f_ri_cd_min 2384 2390 write(lunout,*)' ok_kzmin = ',ok_kzmin 2391 write(lunout,*)' pbl_lmixmin_alpha = ',pbl_lmixmin_alpha 2385 2392 write(lunout,*)' fmagic = ',fmagic 2386 2393 write(lunout,*)' pmagic = ',pmagic -
LMDZ5/trunk/libf/phylmd/phys_local_var_mod.F90
r2536 r2561 16 16 REAL, SAVE, ALLOCATABLE :: u_seri(:,:), v_seri(:,:) 17 17 !$OMP THREADPRIVATE(u_seri, v_seri) 18 REAL, SAVE, ALLOCATABLE :: l_mixmin(:,:,:), l_mix(:,:,:) 19 !$OMP THREADPRIVATE(l_mixmin, l_mix) 18 20 19 21 REAL, SAVE, ALLOCATABLE :: tr_seri(:,:,:) … … 406 408 allocate(t_seri(klon,klev),q_seri(klon,klev),ql_seri(klon,klev),qs_seri(klon,klev)) 407 409 allocate(u_seri(klon,klev),v_seri(klon,klev)) 410 allocate(l_mixmin(klon,klev,nbsrf), l_mix(klon,klev,nbtr)) 408 411 409 412 allocate(tr_seri(klon,klev,nbtr)) … … 625 628 deallocate(t_seri,q_seri,ql_seri,qs_seri) 626 629 deallocate(u_seri,v_seri) 630 deallocate(l_mixmin,l_mix) 627 631 628 632 deallocate(tr_seri) -
LMDZ5/trunk/libf/phylmd/phys_output_ctrlout_mod.F90
r2553 r2561 745 745 TYPE(ctrl_out), SAVE, DIMENSION(4) :: o_tke_srf = (/ & 746 746 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'tke_ter', & 747 "Max Turb. Kinetic Energy "//clnsurf(1)," -", (/ ('', i=1, 9) /)), &747 "Max Turb. Kinetic Energy "//clnsurf(1),"m2/s2", (/ ('', i=1, 9) /)), & 748 748 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'tke_lic', & 749 "Max Turb. Kinetic Energy "//clnsurf(2)," -", (/ ('', i=1, 9) /)), &749 "Max Turb. Kinetic Energy "//clnsurf(2),"m2/s2", (/ ('', i=1, 9) /)), & 750 750 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'tke_oce', & 751 "Max Turb. Kinetic Energy "//clnsurf(3)," -", (/ ('', i=1, 9) /)), &751 "Max Turb. Kinetic Energy "//clnsurf(3),"m2/s2", (/ ('', i=1, 9) /)), & 752 752 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'tke_sic', & 753 "Max Turb. Kinetic Energy "//clnsurf(4),"-", (/ ('', i=1, 9) /)) /) 753 "Max Turb. Kinetic Energy "//clnsurf(4),"m2/s2", (/ ('', i=1, 9) /)) /) 754 755 TYPE(ctrl_out), SAVE, DIMENSION(4) :: o_l_mixmin = (/ & 756 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mixmin_ter', & 757 "PBL mixing length "//clnsurf(1),"m", (/ ('', i=1, 9) /)), & 758 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mixmin_lic', & 759 "PBL mixing length "//clnsurf(2),"m", (/ ('', i=1, 9) /)), & 760 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mixmin_oce', & 761 "PBL mixing length "//clnsurf(3),"m", (/ ('', i=1, 9) /)), & 762 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mixmin_sic', & 763 "PBL mixing length "//clnsurf(4),"m", (/ ('', i=1, 9) /)) /) 764 765 TYPE(ctrl_out), SAVE, DIMENSION(4) :: o_l_mix = (/ & 766 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mix_ter', & 767 "min PBL mixing length "//clnsurf(1),"m", (/ ('', i=1, 9) /)), & 768 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mix_lic', & 769 "min PBL mixing length "//clnsurf(2),"m", (/ ('', i=1, 9) /)), & 770 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mix_oce', & 771 "min PBL mixing length "//clnsurf(3),"m", (/ ('', i=1, 9) /)), & 772 ctrl_out((/ 10, 4, 10, 10, 10, 10, 11, 11, 11 /),'l_mix_sic', & 773 "min PBL mixing length "//clnsurf(4),"m", (/ ('', i=1, 9) /)) /) 754 774 755 775 TYPE(ctrl_out), SAVE, DIMENSION(4) :: o_tke_max_srf = (/ & -
LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90
r2553 r2561 60 60 o_fsw_srf, o_wbils_srf, o_wbilo_srf, & 61 61 o_tke_srf, o_tke_max_srf,o_dltpbltke_srf, o_wstar, & 62 o_l_mixmin,o_l_mix, & 62 63 o_cdrm, o_cdrh, o_cldl, o_cldm, o_cldh, & 63 64 o_cldt, o_JrNt, o_cldljn, o_cldmjn, & … … 198 199 USE phys_local_var_mod, only: zxfluxlat, slp, ptstar, pt0, zxtsol, zt2m, & 199 200 t2m_min_mon, t2m_max_mon, evap, & 201 l_mixmin,l_mix, & 200 202 zu10m, zv10m, zq2m, zustar, zxqsurf, & 201 203 rain_lsc, rain_num, snow_lsc, bils, sens, fder, & … … 619 621 IF (iflag_pbl > 1) THEN 620 622 CALL histwrite_phy(o_tke_srf(nsrf), pbl_tke(:,1:klev,nsrf)) 623 CALL histwrite_phy(o_l_mix(nsrf), l_mix(:,1:klev,nsrf)) 624 CALL histwrite_phy(o_l_mixmin(nsrf), l_mixmin(:,1:klev,nsrf)) 621 625 CALL histwrite_phy(o_tke_max_srf(nsrf), pbl_tke(:,1:klev,nsrf)) 622 626 ENDIF -
LMDZ5/trunk/libf/phylmd/yamada4.F90
r2441 r2561 1 2 ! $Header$ 3 4 SUBROUTINE yamada4(ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, & 1 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 3 SUBROUTINE yamada4(ni, nsrf, ngrid, dt, g, rconst, plev, temp, zlev, zlay, u, v, teta, & 5 4 cd, q2, km, kn, kq, ustar, iflag_pbl) 5 6 6 USE dimphy 7 USE print_control_mod, ONLY: prt_level8 USE ioipsl_getin_p_mod, ONLY : getin_p9 10 7 IMPLICIT NONE 11 8 include "iniprint.h" 9 ! ....................................................................... 10 ! ym#include "dimensions.h" 11 ! ym#include "dimphy.h" 12 ! ************************************************************************************************ 13 ! 14 ! yamada4: subroutine qui calcule le transfert turbulent avec une fermeture d'ordre 2 ou 2.5 15 ! 16 ! Reference: Simulation of nocturnal drainage flows by a q2l Turbulence Closure Model 17 ! Yamada T. 18 ! J. Atmos. Sci, 40, 91-106, 1983 19 ! 20 !************************************************************************************************ 21 ! Input : 22 !'====== 23 ! ni: indice horizontal sur la grille de base, non restreinte 24 ! nsrf: type de surface 25 ! ngrid: nombre de mailles concern??es sur l'horizontal 12 26 ! dt : pas de temps 13 27 ! g : g 28 ! rconst: constante de l'air sec 14 29 ! zlev : altitude a chaque niveau (interface inferieure de la couche 15 30 ! de meme indice) … … 17 32 ! u,v : vitesse au centre de chaque couche 18 33 ! (en entree : la valeur au debut du pas de temps) 19 ! teta : temperature potentielle au centre de chaque couche34 ! teta : temperature potentielle virtuelle au centre de chaque couche 20 35 ! (en entree : la valeur au debut du pas de temps) 21 ! cd : cdrag 36 ! cd : cdrag pour la quantit?? de mouvement 22 37 ! (en entree : la valeur au debut du pas de temps) 38 ! ustar: vitesse de friction calcul??e par une formule diagnostique 39 ! iflag_pbl: flag pour choisir des options du sch??ma de turbulence 40 ! 41 ! iflag_pbl doit valoir entre 6 et 9 42 ! l=6, on prend systematiquement une longueur d'equilibre 43 ! iflag_pbl=6 : MY 2.0 44 ! iflag_pbl=7 : MY 2.0.Fournier 45 ! iflag_pbl=8/9 : MY 2.5 46 ! iflag_pbl=8 with special obsolete treatments for convergence 47 ! with Cmpi5 NPv3.1 simulations 48 ! iflag_pbl=10/11 : New scheme M2 and N2 explicit and dissiptation exact 49 ! iflag_pbl=12 = 11 with vertical diffusion off q2 50 ! 51 ! 2013/04/01 (FH hourdin@lmd.jussieu.fr) 52 ! Correction for very stable PBLs (iflag_pbl=10 and 11) 53 ! iflag_pbl=8 converges numerically with NPv3.1 54 ! iflag_pbl=11 -> the model starts with NP from start files created by ce0l 55 ! -> the model can run with longer time-steps. 56 ! 57 ! Inpout/Output : 58 !============== 23 59 ! q2 : $q^2$ au bas de chaque couche 24 60 ! (en entree : la valeur au debut du pas de temps) 25 61 ! (en sortie : la valeur a la fin du pas de temps) 62 63 ! Outputs: 64 !========== 26 65 ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque 27 66 ! couche) … … 29 68 ! kn : diffusivite turbulente des scalaires (au bas de chaque couche) 30 69 ! (en sortie : la valeur a la fin du pas de temps) 31 32 ! iflag_pbl doit valoir entre 6 et 9 33 ! l=6, on prend systematiquement une longueur d'equilibre 34 ! iflag_pbl=6 : MY 2.0 35 ! iflag_pbl=7 : MY 2.0.Fournier 36 ! iflag_pbl=8/9 : MY 2.5 37 ! iflag_pbl=8 with special obsolete treatments for convergence 38 ! with Cmpi5 NPv3.1 simulations 39 ! iflag_pbl=10/11 : New scheme M2 and N2 explicit and dissiptation exact 40 ! iflag_pbl=12 = 11 with vertical diffusion off q2 41 42 ! 2013/04/01 (FH hourdin@lmd.jussieu.fr) 43 ! Correction for very stable PBLs (iflag_pbl=10 and 11) 44 ! iflag_pbl=8 converges numerically with NPv3.1 45 ! iflag_pbl=11 -> the model starts with NP from start files created by ce0l 46 ! -> the model can run with longer time-steps. 47 ! ....................................................................... 48 70 ! 71 !....................................................................... 72 73 !======================================================================= 74 ! Declarations: 75 !======================================================================= 76 77 78 ! Inputs/Outputs 79 !---------------- 49 80 REAL dt, g, rconst 50 81 REAL plev(klon, klev+1), temp(klon, klev) … … 57 88 REAL teta(klon, klev) 58 89 REAL cd(klon) 59 REAL q2(klon, klev+1) , qpre90 REAL q2(klon, klev+1) 60 91 REAL unsdz(klon, klev) 61 92 REAL unsdzdec(klon, klev+1) 62 93 REAL kn(klon, klev+1) 63 94 REAL km(klon, klev+1) 64 REAL kmpre(klon, klev+1), tmp2 95 INTEGER iflag_pbl, ngrid, nsrf 96 INTEGER ni(klon) 97 98 99 ! Local 100 !------- 101 102 INCLUDE "clesphys.h" 103 104 105 REAL kmpre(klon, klev+1), tmp2, qpre 65 106 REAL mpre(klon, klev+1) 66 REAL kn(klon, klev+1)67 107 REAL kq(klon, klev+1) 68 108 REAL ff(klon, klev+1), delta(klon, klev+1) 69 109 REAL aa(klon, klev+1), aa0, aa1 70 INTEGER iflag_pbl, ngrid71 110 INTEGER nlay, nlev 72 73 111 LOGICAL first 74 112 INTEGER ipas … … 77 115 DATA first, ipas/.FALSE., 0/ 78 116 !$OMP THREADPRIVATE( first,ipas) 79 REAL,SAVE :: lmixmin=1. 80 !$OMP THREADPRIVATE(lmixmin) 81 82 117 LOGICAL hboville 83 118 INTEGER ig, k 84 85 86 119 REAL ri, zrif, zalpha, zsm, zsn 87 120 REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev) 88 89 121 REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1) 90 122 REAL dtetadz(klon, klev+1) 91 123 REAL m2cstat, mcstat, kmcstat 92 124 REAL l(klon, klev+1) 93 REAL, ALLOCATABLE, SAVE :: l0(:) 94 !$OMP THREADPRIVATE(l0) 95 REAL sq(klon), sqz(klon), zz(klon, klev+1) 125 REAL zz(klon, klev+1) 96 126 INTEGER iter 97 98 127 REAL ric, rifc, b1, kap 99 128 SAVE ric, rifc, b1, kap 100 129 DATA ric, rifc, b1, kap/0.195, 0.191, 16.6, 0.4/ 101 130 !$OMP THREADPRIVATE(ric,rifc,b1,kap) 131 REAL seuilsm, seuilalpha, lmixmin 102 132 REAL frif, falpha, fsm 103 REAL fl, zzz, zl0, zq2, zn2104 105 133 REAL rino(klon, klev+1), smyam(klon, klev), styam(klon, klev), & 106 134 lyam(klon, klev), knyam(klon, klev), w2yam(klon, klev), t2yam(klon, klev) 107 135 LOGICAL, SAVE :: firstcall = .TRUE. 108 136 !$OMP THREADPRIVATE(firstcall) 137 138 139 ! Fonctions utilis??es 140 !-------------------- 141 109 142 frif(ri) = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156)) 110 143 falpha(ri) = 1.318*(0.2231-ri)/(0.2341-ri) 111 144 fsm(ri) = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri)) 112 fl(zzz, zl0, zq2, zn2) = max(min(l0(ig)*kap*zlev(ig, & 113 k)/(kap*zlev(ig,k)+l0(ig)),0.5*sqrt(q2(ig,k))/sqrt( & 114 max(n2(ig,k),1.E-10))), lmixmin) 115 116 117 nlay = klev 118 nlev = klev + 1 119 120 IF (firstcall) THEN 121 ALLOCATE (l0(klon)) 122 firstcall = .FALSE. 123 CALL getin_p('lmixmin',lmixmin) 124 END IF 145 146 147 !=============================================================================== 148 ! Flags, tests et ??valuations de constantes 149 !=============================================================================== 150 151 ! On utilise ou non la routine de Holstalg Boville pour les cas tres stables 152 hboville=.TRUE. 125 153 126 154 … … 129 157 END IF 130 158 159 ! Seuil dans le code de turbulence 160 seuilalpha=1.12 161 seuilsm=0.085 162 lmixmin=1. 163 164 nlay = klev 165 nlev = klev + 1 131 166 ipas = ipas + 1 132 167 133 168 134 ! ....................................................................... 135 ! les increments verticaux 136 ! ....................................................................... 137 138 ! !!!!! allerte !!!!!c 139 ! !!!!! zlev n'est pas declare a nlev !!!!!c 140 ! !!!!! ----> 169 !======================================================================== 170 ! Calcul des increments verticaux 171 !========================================================================= 172 173 174 ! Attention: zlev n'est pas declare a nlev 141 175 DO ig = 1, ngrid 142 176 zlev(ig, nlev) = zlay(ig, nlay) + (zlay(ig,nlay)-zlev(ig,nlev-1)) 143 177 END DO 144 ! !!!!! <---- 145 ! !!!!! allerte !!!!!c 178 146 179 147 180 DO k = 1, nlay … … 162 195 END DO 163 196 164 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 165 ! Computing M^2, N^2, Richardson numbers, stability functions 166 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 167 ! initialize arrays: 197 !========================================================================= 198 ! Richardson number and stability functions 199 !========================================================================= 200 201 ! initialize arrays: 202 168 203 m2(:, :) = 0.0 169 204 sm(:, :) = 0.0 170 205 rif(:, :) = 0.0 171 206 207 !------------------------------------------------------------ 172 208 DO k = 2, klev 209 173 210 DO ig = 1, ngrid 174 211 dz(ig, k) = zlay(ig, k) - zlay(ig, k-1) … … 177 214 dtetadz(ig, k) = (teta(ig,k)-teta(ig,k-1))/dz(ig, k) 178 215 n2(ig, k) = g*2.*dtetadz(ig, k)/(teta(ig,k-1)+teta(ig,k)) 179 ! n2(ig,k)=0.180 216 ri = n2(ig, k)/max(m2(ig,k), 1.E-10) 181 217 IF (ri<ric) THEN … … 184 220 rif(ig, k) = rifc 185 221 END IF 222 186 223 IF (rif(ig,k)<0.16) THEN 187 224 alpha(ig, k) = falpha(rif(ig,k)) 188 225 sm(ig, k) = fsm(rif(ig,k)) 189 226 ELSE 190 alpha(ig, k) = 1.12191 sm(ig, k) = 0.085227 alpha(ig, k) = seuilalpha 228 sm(ig, k) = seuilsm 192 229 END IF 193 230 zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k) … … 196 233 197 234 198 ! ==================================================================== 199 ! Computing the mixing length 200 ! ==================================================================== 201 202 ! Mise a jour de l0 203 IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN 204 205 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 206 ! Iterative computation of l0 207 ! This version is kept for iflag_pbl only for convergence 208 ! with NPv3.1 Cmip5 simulations 209 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 210 211 DO ig = 1, ngrid 212 sq(ig) = 1.E-10 213 sqz(ig) = 1.E-10 214 END DO 215 DO k = 2, klev - 1 216 DO ig = 1, ngrid 217 zq = sqrt(q2(ig,k)) 218 sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1)) 219 sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1)) 220 END DO 221 END DO 222 DO ig = 1, ngrid 223 l0(ig) = 0.2*sqz(ig)/sq(ig) 224 END DO 235 236 ! ==================================================================== 237 ! Computing the mixing length 238 ! ==================================================================== 239 240 241 CALL mixinglength(ni,nsrf,ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, firstcall, l) 242 243 244 245 !======================================================================= 246 ! DIFFERENT TYPES DE SCHEMA de YAMADA 247 !======================================================================= 248 249 !-------------- 250 ! Yamada 2.0 251 !-------------- 252 IF (iflag_pbl==6) THEN 253 254 DO k = 2, klev 255 q2(:, k) = l(:, k)**2*zz(:, k) 256 END DO 257 258 259 !------------------ 260 ! Yamada 2.Fournier 261 !------------------ 262 263 ELSE IF (iflag_pbl==7) THEN 264 265 266 ! Calcul de l, km, au pas precedent 267 !.................................... 225 268 DO k = 2, klev 226 269 DO ig = 1, ngrid 227 l(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))228 END DO229 END DO230 ! print*,'L0 cas 8 ou 10 ',l0231 232 ELSE233 234 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!235 ! In all other case, the assymptotic mixing length l0 is imposed (100m)236 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!237 238 l0(:) = 150.239 DO k = 2, klev240 DO ig = 1, ngrid241 l(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k))242 END DO243 END DO244 ! print*,'L0 cas autres ',l0245 246 END IF247 248 249 ! ====================================================================250 ! Yamada 2.0251 ! ====================================================================252 IF (iflag_pbl==6) THEN253 254 DO k = 2, klev255 q2(:, k) = l(:, k)**2*zz(:, k)256 END DO257 258 259 ELSE IF (iflag_pbl==7) THEN260 ! ====================================================================261 ! Yamada 2.Fournier262 ! ====================================================================263 264 ! Calcul de l, km, au pas precedent265 DO k = 2, klev266 DO ig = 1, ngrid267 ! print*,'SMML=',sm(ig,k),l(ig,k)268 270 delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k)) 269 271 kmpre(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k) 270 272 mpre(ig, k) = sqrt(m2(ig,k)) 271 ! print*,'0L=',k,l(ig,k),delta(ig,k),km(ig,k)272 273 END DO 273 274 END DO … … 278 279 mcstat = sqrt(m2cstat) 279 280 280 ! print*,'M2 L=',k,mpre(ig,k),mcstat 281 282 ! -----{puis on ecrit la valeur de q qui annule l'equation de m 283 ! supposee en q3} 281 ! Puis on ecrit la valeur de q qui annule l'equation de m supposee en q3 282 !......................................................................... 284 283 285 284 IF (k==2) THEN … … 293 292 (unsdz(ig,k)+unsdz(ig,k-1)) 294 293 END IF 295 ! print*,'T2 L=',k,tmp2 294 296 295 tmp2 = kmcstat/(sm(ig,k)/q2(ig,k))/l(ig, k) 297 296 q2(ig, k) = max(tmp2, 1.E-12)**(2./3.) 298 ! print*,'Q2 L=',k,q2(ig,k)299 297 300 298 END DO 301 299 END DO 302 300 301 302 ! ------------------------ 303 ! Yamada 2.5 a la Didi 304 !------------------------- 305 303 306 ELSE IF (iflag_pbl==8 .OR. iflag_pbl==9) THEN 304 ! ==================================================================== 305 ! Yamada 2.5 a la Didi 306 ! ==================================================================== 307 308 309 ! Calcul de l, km, au pas precedent 307 308 ! Calcul de l, km, au pas precedent 309 !.................................... 310 310 DO k = 2, klev 311 311 DO ig = 1, ngrid 312 ! print*,'SMML=',sm(ig,k),l(ig,k)313 312 delta(ig, k) = q2(ig, k)/(l(ig,k)**2*sm(ig,k)) 314 313 IF (delta(ig,k)<1.E-20) THEN 315 ! print*,'ATTENTION L=',k,' Delta=',delta(ig,k)316 314 delta(ig, k) = 1.E-20 317 315 END IF … … 319 317 aa0 = (m2(ig,k)-alpha(ig,k)*n2(ig,k)-delta(ig,k)/b1) 320 318 aa1 = (m2(ig,k)*(1.-rif(ig,k))-delta(ig,k)/b1) 321 ! abder print*,'AA L=',k,aa0,aa1,aa1/max(m2(ig,k),1.e-20)322 319 aa(ig, k) = aa1*dt/(delta(ig,k)*l(ig,k)) 323 ! print*,'0L=',k,l(ig,k),delta(ig,k),km(ig,k)324 320 qpre = sqrt(q2(ig,k)) 325 ! if (iflag_pbl.eq.8 ) then326 321 IF (aa(ig,k)>0.) THEN 327 322 q2(ig, k) = (qpre+aa(ig,k)*qpre*qpre)**2 … … 337 332 ! endif 338 333 q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4) 339 ! print*,'Q2 L=',k,q2(ig,k),qpre*qpre340 334 END DO 341 335 END DO … … 343 337 ELSE IF (iflag_pbl>=10) THEN 344 338 345 ! print*,'Schema mixte D'346 ! print*,'Longueur ',l(:,:)347 339 DO k = 2, klev - 1 348 DO ig = 1, ngrid 349 l(ig, k) = max(l(ig,k), lmixmin) 350 km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k) 351 q2(ig, k) = q2(ig, k) + dt*km(ig, k)*m2(ig, k)*(1.-rif(ig,k)) 352 q2(ig, k) = min(max(q2(ig,k),1.E-10), 1.E4) 353 q2(ig, k) = 1./(1./sqrt(q2(ig,k))+dt/(2*l(ig,k)*b1)) 354 q2(ig, k) = q2(ig, k)*q2(ig, k) 355 END DO 340 km(:, k) = l(:, k)*sqrt(q2(:,k))*sm(:, k) 341 q2(:, k) = q2(:, k) + dt*km(:, k)*m2(:, k)*(1.-rif(:,k)) 342 q2(:, k) = min(max(q2(:,k),1.E-10), 1.E4) 343 q2(:, k) = 1./(1./sqrt(q2(:,k))+dt/(2*l(:,k)*b1)) 344 q2(:, k) = q2(:, k)*q2(:, k) 356 345 END DO 357 346 … … 362 351 END IF ! Fin du cas 8 363 352 364 ! print*,'OK8'365 353 366 354 ! ==================================================================== 367 ! Calcul des coefficients de m �ange355 ! Calcul des coefficients de melange 368 356 ! ==================================================================== 357 369 358 DO k = 2, klev 370 ! print*,'k=',k371 359 DO ig = 1, ngrid 372 ! abde print*,'KML=',l(ig,k),q2(ig,k),sm(ig,k)373 360 zq = sqrt(q2(ig,k)) 374 km(ig, k) = l(ig, k)*zq*sm(ig, k) 375 kn(ig, k) = km(ig, k)*alpha(ig, k) 376 kq(ig, k) = l(ig, k)*zq*0.2 377 ! print*,'KML=',km(ig,k),kn(ig,k) 378 END DO 379 END DO 361 km(ig, k) = l(ig, k)*zq*sm(ig, k) ! For momentum 362 kn(ig, k) = km(ig, k)*alpha(ig, k) ! For scalars 363 kq(ig, k) = l(ig, k)*zq*0.2 ! For TKE 364 END DO 365 END DO 366 367 368 !==================================================================== 369 ! Transport diffusif vertical de la TKE par la TKE 370 !==================================================================== 371 372 380 373 ! initialize near-surface and top-layer mixing coefficients 381 kq(1:ngrid, 1) = kq(1:ngrid, 2) ! constant (ie no gradient) near the surface 382 kq(1:ngrid, klev+1) = 0 ! zero at the top 383 384 ! Transport diffusif vertical de la TKE. 374 !........................................................... 375 376 kq(1:ngrid, 1) = kq(1:ngrid, 2) ! constant (ie no gradient) near the surface 377 kq(1:ngrid, klev+1) = 0 ! zero at the top 378 379 ! Transport diffusif vertical de la TKE. 380 !....................................... 381 385 382 IF (iflag_pbl>=12) THEN 386 ! print*,'YAMADA VDIF'387 383 q2(:, 1) = q2(:, 2) 388 384 CALL vdif_q2(dt, g, rconst, ngrid, plev, temp, kq, q2) 389 385 END IF 390 386 391 ! Traitement des cas noctrunes avec l'introduction d'une longueur 392 ! minilale. 393 394 ! ==================================================================== 395 ! Traitement particulier pour les cas tres stables. 396 ! D'apres Holtslag Boville. 387 388 !==================================================================== 389 ! Traitement particulier pour les cas tres stables, introduction d'une 390 ! longueur de m??lange minimale 391 !==================================================================== 392 ! 393 ! Reference: Local versus Nonlocal boundary-layer diffusion in a global climate model 394 ! Holtslag A.A.M. and Boville B.A. 395 ! J. Clim., 6, 1825-1842, 1993 396 397 398 IF (hboville) THEN 399 397 400 398 401 IF (prt_level>1) THEN 399 402 PRINT *, 'YAMADA4 0' 400 END IF !(prt_level>1) THEN 403 END IF 404 401 405 DO ig = 1, ngrid 402 406 coriol(ig) = 1.E-4 … … 404 408 END DO 405 409 406 ! print*,'pblhmin ',pblhmin407 ! Test a remettre 21 11 02408 ! test abd 13 05 02 if(0.eq.1) then409 410 IF (1==1) THEN 410 411 IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN … … 419 420 END IF 420 421 IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN 421 ! print*,'Seuil min Km K=',k,kmin,km(ig,k),kn(ig,k) 422 ! s ,sqrt(q2(ig,k)),pblhmin(ig),qmin/sm(ig,k) 422 423 423 kn(ig, k) = kmin 424 424 km(ig, k) = kmin 425 425 kq(ig, k) = kmin 426 ! la longueur de melange est suposee etre l= kap z 427 ! K=l q Sm d'ou q2=(K/l Sm)**2 426 427 ! la longueur de melange est suposee etre l= kap z 428 ! K=l q Sm d'ou q2=(K/l Sm)**2 429 428 430 q2(ig, k) = (qmin/sm(ig,k))**2 429 431 END IF … … 432 434 433 435 ELSE 434 435 436 DO k = 2, klev 436 437 DO ig = 1, ngrid … … 442 443 END IF 443 444 IF (kn(ig,k)<kmin .OR. km(ig,k)<kmin) THEN 444 ! print*,'Seuil min Km K=',k,kmin,km(ig,k),kn(ig,k)445 ! s ,sqrt(q2(ig,k)),pblhmin(ig),qmin/sm(ig,k)446 445 kn(ig, k) = kmin 447 446 km(ig, k) = kmin 448 447 kq(ig, k) = kmin 449 450 448 ! la longueur de melange est suposee etre l= kap z 449 ! K=l q Sm d'ou q2=(K/l Sm)**2 451 450 sm(ig, k) = 1. 452 451 alpha(ig, k) = 1. … … 463 462 END IF 464 463 464 END IF ! hboville 465 465 466 IF (prt_level>1) THEN 466 467 PRINT *, 'YAMADA4 1' 467 468 END IF !(prt_level>1) THEN 469 470 471 !====================================================== 472 ! Estimations de w'2 et T'2 d'apres Abdela et McFarlane 473 !====================================================== 474 ! 475 ! Reference: A New Second-Order Turbulence Closure Scheme for the Planetary Boundary Layer 476 ! Abdella K and McFarlane N 477 ! J. Atmos. Sci., 54, 1850-1867, 1997 478 468 479 ! Diagnostique pour stokage 480 !.......................... 469 481 470 482 IF (1==0) THEN … … 482 494 knyam(1:ngrid, 2:klev) = kn(1:ngrid, 2:klev) 483 495 484 ! Estimations de w'2 et T'2 d'apres Abdela et McFarlane 496 497 ! Calcul de w'2 et T'2 498 !....................... 485 499 486 500 w2yam(1:ngrid, 2:klev) = q2(1:ngrid, 2:klev)*0.24 + & … … 493 507 END IF 494 508 495 ! print*,'OKFIN' 509 !============================================================================ 510 496 511 first = .FALSE. 497 512 RETURN 513 514 498 515 END SUBROUTINE yamada4 516 517 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 518 519 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 499 520 SUBROUTINE vdif_q2(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2) 521 500 522 USE dimphy 501 523 IMPLICIT NONE 502 503 ! dt : pas de temps 524 525 include "dimensions.h" 526 527 ! vdif_q2: subroutine qui calcule la diffusion de la TKE par la TKE 528 ! avec un schema implicite en temps avec 529 ! inversion d'un syst??me tridiagonal 530 ! 531 ! Reference: Description of the interface with the surface and 532 ! the computation of the turbulet diffusion in LMDZ 533 ! Technical note on LMDZ 534 ! Dufresne, J-L, Ghattas, J. and Grandpeix, J-Y 535 ! 536 !============================================================================ 537 ! Declarations 538 !============================================================================ 504 539 505 540 REAL plev(klon, klev+1) … … 516 551 INTEGER i, k 517 552 518 ! print*,'RD=',rconst 553 554 !========================================================================= 555 ! Calcul 556 !========================================================================= 557 519 558 DO k = 1, klev 520 559 DO i = 1, ngrid 521 ! test522 ! print*,'i,k',i,k523 ! print*,'temp(i,k)=',temp(i,k)524 ! print*,'(plev(i,k)-plev(i,k+1))=',plev(i,k),plev(i,k+1)525 560 zz = (plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k)) 526 561 kstar(i, k) = 0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz/ & … … 546 581 denom(i, k) = deltap(i, k) + (1.-beta(i,k+1))*kstar(i, k) + & 547 582 kstar(i, k-1) 548 ! correction d'un bug 10 01 2001549 583 alpha(i, k) = (q2(i,k)*deltap(i,k)+kstar(i,k)*alpha(i,k+1))/denom(i, k) 550 584 beta(i, k) = kstar(i, k-1)/denom(i, k) … … 553 587 554 588 ! Si on recalcule q2(1) 589 !....................... 555 590 IF (1==0) THEN 556 591 DO i = 1, ngrid … … 559 594 END DO 560 595 END IF 561 ! sinon, on peut sauter cette boucle... 596 562 597 563 598 DO k = 2, klev + 1 … … 569 604 RETURN 570 605 END SUBROUTINE vdif_q2 571 SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2) 572 USE dimphy 606 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 607 608 609 610 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 611 SUBROUTINE vdif_q2e(timestep, gravity, rconst, ngrid, plev, temp, kmy, q2) 612 613 USE dimphy 573 614 IMPLICIT NONE 574 615 575 ! dt : pas de temps 616 include "dimensions.h" 617 ! 618 ! vdif_q2e: subroutine qui calcule la diffusion de TKE par la TKE 619 ! avec un schema explicite en temps 620 621 622 !==================================================== 623 ! Declarations 624 !==================================================== 576 625 577 626 REAL plev(klon, klev+1) … … 585 634 REAL denom(klon, klev+1), alpha(klon, klev+1), beta(klon, klev+1) 586 635 INTEGER ngrid 587 588 636 INTEGER i, k 637 638 639 !================================================== 640 ! Calcul 641 !================================================== 589 642 590 643 DO k = 1, klev … … 621 674 RETURN 622 675 END SUBROUTINE vdif_q2e 676 677 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 678 679 680 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 681 682 SUBROUTINE mixinglength(ni, nsrf, ngrid,iflag_pbl,pbl_lmixmin_alpha,lmixmin,zlay,zlev,u,v,q2,n2, firstcall, lmix) 683 684 685 686 USE dimphy 687 USE phys_state_var_mod, only: zstd, zsig, zmea 688 USE phys_local_var_mod, only: l_mixmin, l_mix 689 690 ! zstd: ecart type de la'altitud e sous-maille 691 ! zmea: altitude moyenne sous maille 692 ! zsig: pente moyenne de le maille 693 694 USE geometry_mod, only: cell_area 695 ! aire_cell: aire de la maille 696 697 IMPLICIT NONE 698 !************************************************************************* 699 ! Subrourine qui calcule la longueur de m??lange dans le sch??ma de turbulence 700 ! avec la formule de Blackadar 701 ! Calcul d'un minimum en fonction de l'orographie sous-maille: 702 ! L'id??e est la suivante: plus il y a de relief, plus il y a du m??lange 703 ! induit par les circulations meso et submeso ??chelles. 704 ! 705 ! References: * The vertical distribution of wind and turbulent exchange in a neutral atmosphere 706 ! Blackadar A.K. 707 ! J. Geophys. Res., 64, No 8, 1962 708 ! 709 ! * An evaluation of neutral and convective planetary boundary-layer parametrisations relative 710 ! to large eddy simulations 711 ! Ayotte K et al 712 ! Boundary Layer Meteorology, 79, 131-175, 1996 713 ! 714 ! 715 ! * Local Similarity in the Stable Boundary Layer and Mixing length Approaches: consistency of concepts 716 ! Van de Wiel B.J.H et al 717 ! Boundary-Lay Meteorol, 128, 103-166, 2008 718 ! 719 ! 720 ! Histoire: 721 !---------- 722 ! * premi??re r??daction, Etienne et Frederic, 09/06/2016 723 ! 724 ! *********************************************************************** 725 726 !================================================================== 727 ! Declarations 728 !================================================================== 729 730 ! Inputs 731 !------- 732 INTEGER ni(klon) ! indice sur la grille original (non restreinte) 733 INTEGER nsrf ! Type de surface 734 INTEGER ngrid ! Nombre de points concern??s sur l'horizontal 735 INTEGER iflag_pbl ! Choix du sch??ma de turbulence 736 REAL pbl_lmixmin_alpha ! on active ou non le calcul de la longueur de melange minimum 737 REAL lmixmin ! Minimum absolu de la longueur de m??lange 738 REAL zlay(klon, klev) ! altitude du centre de la couche 739 REAL zlev(klon, klev+1) ! atitude de l'interface inf??rieure de la couche 740 REAL u(klon, klev) ! vitesse du vent zonal 741 REAL v(klon, klev) ! vitesse du vent meridional 742 REAL q2(klon, klev+1) ! energie cin??tique turbulente 743 REAL n2(klon, klev+1) ! frequence de Brunt-Vaisala 744 745 !In/out 746 !------- 747 748 LOGICAL firstcall ! premier appel au code 749 750 ! Outputs 751 !--------- 752 753 REAL lmix(klon, klev+1) ! Longueur de melange 754 755 756 ! Local 757 !------- 758 759 INTEGER ig,jg, k 760 REAL h_oro(klon) 761 REAL hlim(klon) 762 REAL, SAVE :: kap=0.4,kapb=0.4 763 REAL zq 764 REAL sq(klon), sqz(klon) 765 REAL, ALLOCATABLE, SAVE :: l0(:) 766 !$OMP THREADPRIVATE(l0) 767 REAL fl, zzz, zl0, zq2, zn2 768 REAL famorti, zzzz, zh_oro, zhlim 769 REAL l1(klon, klev+1), l2(klon,klev+1) 770 REAL winds(klon, klev) 771 REAL xcell 772 REAL zstdslope(klon) 773 REAL lmax 774 REAL l2strat, l2neutre, extent 775 REAL l2limit(klon) 776 !=============================================================== 777 ! Fonctions utiles 778 !=============================================================== 779 780 ! Calcul de l suivant la formule de Blackadar 1962 adapt??e par Ayotte 1996 781 !.......................................................................... 782 783 fl(zzz, zl0, zq2, zn2) = max(min(l0(ig)*kap*zlev(ig, & 784 k)/(kap*zlev(ig,k)+l0(ig)),0.5*sqrt(q2(ig,k))/sqrt( & 785 max(n2(ig,k),1.E-10))), 1.E-5) 786 787 ! Fonction d'amortissement de la turbulence au dessus de la montagne 788 ! On augmente l'amortissement en diminuant la valeur de hlim (extent) dans le code 789 !..................................................................... 790 791 famorti(zzzz, zh_oro, zhlim)=(-1.)*ATAN((zzzz-zh_oro)/(zhlim-zh_oro))*2./3.1416+1. 792 793 794 795 796 797 IF (firstcall) THEN 798 ALLOCATE (l0(klon)) 799 firstcall = .FALSE. 800 END IF 801 802 803 804 !===================================================================== 805 ! CALCUL de la LONGUEUR de m??lange suivant BLACKADAR: l1 806 !===================================================================== 807 808 809 IF (iflag_pbl==8 .OR. iflag_pbl==10) THEN 810 811 812 ! Iterative computation of l0 813 ! This version is kept for iflag_pbl only for convergence 814 ! with NPv3.1 Cmip5 simulations 815 !................................................................... 816 817 DO ig = 1, ngrid 818 sq(ig) = 1.E-10 819 sqz(ig) = 1.E-10 820 END DO 821 DO k = 2, klev - 1 822 DO ig = 1, ngrid 823 zq = sqrt(q2(ig,k)) 824 sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1)) 825 sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1)) 826 END DO 827 END DO 828 DO ig = 1, ngrid 829 l0(ig) = 0.2*sqz(ig)/sq(ig) 830 END DO 831 DO k = 2, klev 832 DO ig = 1, ngrid 833 l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k)) 834 END DO 835 END DO 836 837 ELSE 838 839 840 ! In all other case, the assymptotic mixing length l0 is imposed (150m) 841 !...................................................................... 842 843 l0(:) = 150. 844 DO k = 2, klev 845 DO ig = 1, ngrid 846 l1(ig, k) = fl(zlev(ig,k), l0(ig), q2(ig,k), n2(ig,k)) 847 END DO 848 END DO 849 850 END IF 851 852 !================================================================================= 853 ! CALCUL d'une longueur de melange en fonctions de la topographie sous maille: l2 854 ! si plb_lmixmin_alpha=TRUE et si on se trouve sur de la terre ( pas actif sur les 855 ! glacier, la glace de mer et les oc??ans) 856 !================================================================================= 857 858 l2(:,:)=0.0 859 l_mixmin(:,:,nsrf)=0. 860 l_mix(:,:,nsrf)=0. 861 862 IF (nsrf .EQ. 1) THEN 863 864 ! coefficients 865 !-------------- 866 867 extent=2. ! On ??tend l'impact du relief jusqu'?? extent*h, extent >1. 868 lmax=150. ! Longueur de m??lange max dans l'absolu 869 870 ! calculs 871 !--------- 872 873 DO ig=1,ngrid 874 875 ! On calcule la hauteur du relief 876 !................................. 877 878 ! On ne peut pas prendre zstd seulement pour caracteriser le relief sous maille 879 ! car sur un terrain pentu mais sans relief, zstd est non nul (comme en Antarctique, C. Genthon) 880 ! On corrige donc zstd avec l'ecart type de l'altitude dans la maille sans relief 881 ! (en gros, une maille de taille xcell avec une pente constante zstdslope) 882 883 884 jg=ni(ig) 885 886 ! IF (zsig(jg) .EQ. 0.) THEN 887 ! zstdslope(ig)=0. 888 ! ELSE 889 ! xcell=sqrt(cell_area(jg)) 890 ! zstdslope(ig)=max((xcell*zsig(jg)-zmea(jg))**3 /(3.*zsig(jg)),0.) 891 ! zstdslope(ig)=sqrt(zstdslope(ig)) 892 ! END IF 893 894 ! h_oro(ig)=max(zstd(jg)-zstdslope(ig),0.) ! Hauteur du relief 895 h_oro(ig)=zstd(jg) 896 hlim(ig)=extent*h_oro(ig) 897 898 899 900 901 END DO 902 903 l2limit(1:ngrid)=0. 904 905 DO k=2,klev 906 DO ig=1,ngrid 907 908 winds(ig,k)=sqrt(u(ig,k)**2+v(ig,k)**2) 909 910 IF (zlev(ig,k) .LE. h_oro(ig)) THEN ! Si on est sous l'orographie 911 912 913 l2strat= kapb*pbl_lmixmin_alpha*winds(ig,k)/sqrt(max(n2(ig,k),1.E-10)) ! si stratifi??, amplitude d'oscillation * kappab (voir Van de Wiel et al 2008) 914 915 l2neutre=kap*zlev(ig,k)*h_oro(ig)/(kap*zlev(ig,k)+h_oro(ig)) ! Dans le cas neutre, formule de blackadar qui tend asymptotiquement vers h 916 l2neutre=MIN(l2neutre,lmax) ! On majore par lmax 917 l2limit(ig)=MIN(l2neutre,l2strat) ! Calcule de l2 (minimum de la longueur en cas neutre et celle en situation stratifi??e) 918 919 l2(ig,k)=l2limit(ig) 920 921 ELSE IF (zlev(ig,k) .LE. hlim(ig)) THEN ! Si on est au dessus des montagnes, mais affect?? encore par elles 922 923 ! Au dessus des montagnes, on prend la l2limit au sommet des montagnes 924 ! (la derni??re calcul??e dans la boucle k, vu que k est un indice croissant avec z) 925 ! et on multiplie l2limit par une fonction qui d??croit entre h et hlim 926 927 l2(ig,k)=l2limit(ig)*famorti(zlev(ig,k),h_oro(ig), hlim(ig)) 928 929 930 ELSE ! Au dessus de extent*h, on prend l2=l0 931 932 l2(ig,k)=0. 933 934 935 END IF 936 937 END DO 938 END DO 939 940 941 END IF ! pbl_lmixmin_alpha 942 943 !================================================================================== 944 ! On prend le max entre la longueur de melange de blackadar et celle calcul??e 945 ! en fonction de la topographie 946 !=================================================================================== 947 948 949 DO k=2,klev 950 DO ig=1,ngrid 951 952 lmix(ig,k)=MAX(MAX(l1(ig,k), l2(ig,k)),lmixmin) 953 954 END DO 955 END DO 956 957 DO k=2,klev 958 DO ig=1,ngrid 959 jg=ni(ig) 960 l_mix(jg,k,nsrf)=lmix(ig,k) 961 l_mixmin(jg,k,nsrf)=l2(ig,k) 962 ENDDO 963 ENDDO 964 DO ig=1,ngrid 965 jg=ni(ig) 966 l_mix(jg,1,nsrf)=hlim(ig) 967 ENDDO 968 969 970 971 END SUBROUTINE mixinglength 972 973 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Note: See TracChangeset
for help on using the changeset viewer.