Changeset 2101 for trunk/LMDZ.GENERIC/libf
- Timestamp:
- Feb 15, 2019, 2:43:57 PM (6 years ago)
- Location:
- trunk/LMDZ.GENERIC/libf/phystd
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90
r2069 r2101 267 267 real entr0(ngrid, nlayer) ! Entrainment 268 268 real detr0(ngrid, nlayer) ! Detrainment 269 real zmax0(ngrid) ! Plume height270 269 real fraca(ngrid, nlayer+1) ! Fraction of the surface that plumes occupies 271 270 real zw2(ngrid, nlayer+1) ! Squared vertical speed or its square root … … 1195 1194 f0, fm0, entr0, detr0, & 1196 1195 zqta, zqla, ztv, ztva, ztla, zthl, zqsatth, & 1197 z max0, zw2, fraca,&1196 zw2, fraca, & 1198 1197 lmin, lmix, lalim, lmax, & 1199 1198 zpopsk, ratqscth, ratqsdiff, & -
trunk/LMDZ.GENERIC/libf/phystd/thermcell_alim.F90
r2093 r2101 2 2 ! 3 3 ! 4 SUBROUTINE thermcell_alim(ngrid,klev,ztv2,zlev,alim_star,lalim,lmin)4 SUBROUTINE thermcell_alim(ngrid,nlay,ztv2,zlev,alim_star,lalim,lmin) 5 5 6 7 USE thermcell_mod, ONLY: linf, d_temp8 9 IMPLICIT NONE10 6 11 7 !============================================================================== … … 14 10 ! laterale a la base des panaches thermiques 15 11 !============================================================================== 12 13 IMPLICIT NONE 16 14 17 15 … … 24 22 25 23 INTEGER, INTENT(IN) :: ngrid 26 INTEGER, INTENT(IN) :: klev27 INTEGER, INTENT(IN) :: lmin(ngrid) ! plume initial level24 INTEGER, INTENT(IN) :: nlay 25 INTEGER, INTENT(IN) :: lmin(ngrid) ! plume initial level 28 26 29 REAL, INTENT(IN) :: ztv2(ngrid, klev)! Virtual potential temperature30 REAL, INTENT(IN) :: zlev(ngrid, klev+1)! levels altitude27 REAL, INTENT(IN) :: ztv2(ngrid,nlay) ! Virtual potential temperature 28 REAL, INTENT(IN) :: zlev(ngrid,nlay+1) ! levels altitude 31 29 32 30 ! outputs: 33 31 ! -------- 34 32 35 INTEGER, INTENT(OUT) :: lalim(ngrid) ! alimentation maximal level33 INTEGER, INTENT(OUT) :: lalim(ngrid) ! alimentation maximal level 36 34 37 REAL, INTENT(OUT) :: alim_star(ngrid, klev)35 REAL, INTENT(OUT) :: alim_star(ngrid,nlay) ! Normalized alimentation 38 36 39 37 ! local: … … 42 40 INTEGER :: ig, l 43 41 44 REAL :: alim_star_tot(ngrid) ! integrated alimentation42 REAL :: alim_star_tot(ngrid) ! integrated alimentation 45 43 46 44 !============================================================================== … … 56 54 !============================================================================== 57 55 58 DO l=lmin(ig),klev-159 DO ig=1,ngrid60 IF ((ztv2(ig,l) >ztv2(ig,l+1)).and.(ztv2(ig,lmin(ig))>=ztv2(ig,l))) THEN56 DO ig=1,ngrid 57 DO l=lmin(ig),nlay-1 58 IF ((ztv2(ig,l).gt.ztv2(ig,l+1)).and.(ztv2(ig,lmin(ig)).ge.ztv2(ig,l))) THEN 61 59 alim_star(ig,l) = MAX( (ztv2(ig,l) - ztv2(ig,l+1)), 0.) & 62 60 & * sqrt(zlev(ig,l+1)) … … 73 71 !------------------------------------------------------------------------------ 74 72 75 DO l=1, klev73 DO l=1,nlay 76 74 DO ig=1,ngrid 77 75 IF (alim_star_tot(ig) > 1.e-10 ) THEN -
trunk/LMDZ.GENERIC/libf/phystd/thermcell_alp.F90
r2060 r2101 2 2 ! 3 3 ! 4 SUBROUTINE thermcell_alp(ngrid,nlay,ptimestep & 5 & ,pplay,pplev & 6 & ,fm0,entr0,lmax & 7 & ,ale_bl,alp_bl,lalim_conv,wght_th & 8 & ,zw2,fraca & 9 !!! ncessaire en plus 10 & ,pcon,rhobarz,wth3,wmax_sec,lalim,fm,alim_star,zmax & 11 !!! nrlmd le 10/04/2012 12 & ,pbl_tke,pctsrf,omega,airephy & 13 & ,zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 & 14 & ,n2,s2,ale_bl_stat & 15 & ,therm_tke_max,env_tke_max & 16 & ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke & 17 & ,alp_bl_conv,alp_bl_stat ) 18 !!! fin nrlmd le 10/04/2012 19 20 USE dimphy 21 ! AB : why use dimphy to get klon, klev while subroutine arguments ngrid, nlay are the same? 22 USE thermcell_mod 23 24 IMPLICIT NONE 25 26 !======================================================================= 4 SUBROUTINE thermcell_alp(ngrid,nlay,ptimestep,pplay,pplev, & 5 fm0,entr0,lmax,ale_bl,alp_bl,lalim_conv, & 6 wght_th,zw2,fraca, & 7 pcon,rhobarz,wth3,wmax_sec,lalim,fm,alim_star,zmax, & 8 pbl_tke,pctsrf,omega,airephy, & 9 zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0, & 10 n2,s2,ale_bl_stat, & 11 therm_tke_max,env_tke_max, & 12 alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke, & 13 alp_bl_conv,alp_bl_stat) 14 15 16 !============================================================================== 27 17 ! Auteurs: Frederic Hourdin, Catherine Rio, Anne Mathieu 28 18 ! Version du 09.02.07 … … 50 40 ! 15, 16 run with impl=-1 : numerical convergence with NPv3 51 41 ! 17, 18 run with impl=1 : more stable 52 ! 15 and 17 correspond to the activation of the stratocumulus "bidouille" 53 ! 54 !======================================================================= 55 56 !----------------------------------------------------------------------- 57 ! declarations: 58 ! ------------- 59 60 ! arguments: 61 ! ---------- 62 63 !IM 140508 64 65 INTEGER ngrid,nlay 66 real ptimestep 67 REAL pplay(ngrid,nlay),pplev(ngrid,nlay+1) 68 69 ! local: 70 ! ------ 71 72 73 REAL susqr2pi, reuler 74 75 INTEGER ig,k,l 76 INTEGER lmax(klon),lalim(klon) 77 real zmax(klon),zw2(klon,klev+1) 78 79 !on garde le zmax du pas de temps precedent 80 81 82 real fraca(klon,klev+1) 83 real wth3(klon,klev) 42 ! 15 and 17 correspond to the activation of the stratocumulus "bidouille" 43 ! 44 !============================================================================== 45 46 USE thermcell_mod 47 48 IMPLICIT NONE 49 50 51 !============================================================================== 52 ! Declarations 53 !============================================================================== 54 55 ! Inputs: 56 ! ------- 57 58 INTEGER,INTENT(in) :: ngrid 59 INTEGER,INTENT(in) :: nlay 60 INTEGER lmax(ngrid) 61 INTEGER lalim(ngrid) 62 63 REAL,INTENT(in) :: ptimestep 64 REAL,INTENT(in) :: pplay(ngrid,nlay) 65 REAL,INTENT(in) :: pplev(ngrid,nlay+1) 66 ! On garde le zmax du pas de temps precedent 67 REAL zmax(ngrid) 68 REAL zw2(ngrid,nlay+1) 69 REAL fraca(ngrid,nlay+1) 70 real fm0(ngrid,nlay+1) 71 real entr0(ngrid,nlay) 72 real pbl_tke(ngrid,nlay+1,nbsrf) 73 real pctsrf(ngrid,nbsrf) 74 real omega(ngrid,nlay) 75 real airephy(ngrid) 76 real alim_star(ngrid,nlay) 77 78 ! Outputs: 79 ! --------- 80 81 REAL susqr2pi 82 REAL reuler 83 real wth3(ngrid,nlay) 84 84 ! FH probleme de dimensionnement avec l'allocation dynamique 85 85 ! common/comtherm/thetath2,wth2 86 real rhobarz(klon,klev) 87 88 real wmax_sec(klon) 89 real fm0(klon,klev+1),entr0(klon,klev) 90 real fm(klon,klev+1) 91 92 !niveau de condensation 93 real pcon(klon) 94 95 real alim_star(klon,klev) 96 97 !!! nrlmd le 10/04/2012 98 99 !------Entrées 100 real pbl_tke(klon,klev+1,nbsrf) 101 real pctsrf(klon,nbsrf) 102 real omega(klon,klev) 103 real airephy(klon) 104 !------Sorties 105 real zlcl(klon),fraca0(klon),w0(klon),w_conv(klon) 106 real therm_tke_max0(klon),env_tke_max0(klon) 107 real n2(klon),s2(klon) 108 real ale_bl_stat(klon) 109 real therm_tke_max(klon,klev),env_tke_max(klon,klev) 110 real alp_bl_det(klon),alp_bl_fluct_m(klon),alp_bl_fluct_tke(klon),alp_bl_conv(klon),alp_bl_stat(klon) 111 !------Local 86 real rhobarz(ngrid,nlay) 87 real wmax_sec(ngrid) 88 real fm(ngrid,nlay+1) 89 90 ! niveau de condensation 91 real pcon(ngrid) 92 93 real zlcl(ngrid) 94 real fraca0(ngrid) 95 real w0(ngrid) 96 real w_conv(ngrid) 97 real therm_tke_max0(ngrid) 98 real env_tke_max0(ngrid) 99 real n2(ngrid) 100 real s2(ngrid) 101 real ale_bl_stat(ngrid) 102 real therm_tke_max(ngrid,nlay) 103 real env_tke_max(ngrid,nlay) 104 real alp_bl_det(ngrid) 105 real alp_bl_fluct_m(ngrid) 106 real alp_bl_fluct_tke(ngrid) 107 real alp_bl_conv(ngrid) 108 real alp_bl_stat(ngrid) 109 110 ! local: 111 ! ------ 112 113 INTEGER ig,k,l 112 114 integer nsrf 113 real rhobarz0(klon) ! Densité au LCL 114 logical ok_lcl(klon) ! Existence du LCL des thermiques 115 integer klcl(klon) ! Niveau du LCL 116 real interp(klon) ! Coef d'interpolation pour le LCL 115 integer klcl(ngrid) ! Niveau du LCL 116 117 real rhobarz0(ngrid) ! Densité au LCL 118 logical ok_lcl(ngrid) ! Existence du LCL des thermiques 119 real interp(ngrid) ! Coef d'interpolation pour le LCL 117 120 !--Triggering 118 real Su ! Surface unité: celle d'un updraft élémentaire 119 parameter(Su=4e4) 120 real hcoef ! Coefficient directeur pour le calcul de s2 121 parameter(hcoef=1) 122 real hmincoef ! Coefficient directeur pour l'ordonnée à l'origine pour le calcul de s2 123 parameter(hmincoef=0.3) 124 real eps1 ! Fraction de surface occupée par la population 1 : eps1=n1*s1/(fraca0*Sd) 125 parameter(eps1=0.3) 126 real hmin(ngrid) ! Ordonnée à l'origine pour le calcul de s2 127 real zmax_moy(ngrid) ! Hauteur moyenne des thermiques : zmax_moy = zlcl + 0.33 (zmax-zlcl) 128 real zmax_moy_coef 129 parameter(zmax_moy_coef=0.33) 130 real depth(klon) ! Epaisseur moyenne du cumulus 131 real w_max(klon) ! Vitesse max statistique 132 real s_max(klon) 121 real,parameter :: Su = 4.e4 ! Surface unité: celle d'un updraft élémentaire 122 real,parameter :: hcoef = 1. ! Coefficient directeur pour le calcul de s2 123 real,parameter :: hmincoef = 0.3 ! Coefficient directeur pour l'ordonnée à l'origine pour le calcul de s2 124 real,parameter :: eps1 = 0.3 ! Fraction de surface occupée par la population 1 : eps1=n1*s1/(fraca0*Sd) 125 real,parameter :: zmax_moy_coef=0.33 126 real hmin(ngrid) ! Ordonnée à l'origine pour le calcul de s2 127 real zmax_moy(ngrid) ! Hauteur moyenne des thermiques : zmax_moy = zlcl + 0.33 (zmax-zlcl) 128 real depth(ngrid) ! Epaisseur moyenne du cumulus 129 real w_max(ngrid) ! Vitesse max statistique 130 real s_max(ngrid) 133 131 !--Closure 134 real pbl_tke_max(klon,klev) ! Profil de TKE moyenne 135 real pbl_tke_max0(klon) ! TKE moyenne au LCL 136 real w_ls(klon,klev) ! Vitesse verticale grande échelle (m/s) 137 real coef_m ! On considère un rendement pour alp_bl_fluct_m 138 parameter(coef_m=1.) 139 real coef_tke ! On considère un rendement pour alp_bl_fluct_tke 140 parameter(coef_tke=1.) 141 142 !!! fin nrlmd le 10/04/2012 143 144 ! 145 !nouvelles variables pour la convection 146 real ale_bl(klon) 147 real alp_bl(klon) 148 real alp_int(klon),dp_int(klon),zdp 149 real fm_tot(klon) 150 real wght_th(klon,klev) 151 integer lalim_conv(klon) 132 real pbl_tke_max(ngrid,nlay) ! Profil de TKE moyenne 133 real pbl_tke_max0(ngrid) ! TKE moyenne au LCL 134 real w_ls(ngrid,nlay) ! Vitesse verticale grande échelle (m/s) 135 real,parameter :: coef_m=1. ! On considère un rendement pour alp_bl_fluct_m 136 real,parameter :: coef_tke = 1. ! On considère un rendement pour alp_bl_fluct_tke 137 138 ! nouvelles variables pour la convection 139 real ale_bl(ngrid) 140 real alp_bl(ngrid) 141 real alp_int(ngrid),dp_int(ngrid),zdp 142 real fm_tot(ngrid) 143 real wght_th(ngrid,nlay) 144 integer lalim_conv(ngrid) 152 145 !v1d logical therm 153 146 !v1d save therm 154 147 155 156 !------------------------------------------------------------ 157 ! Initialize output arrays related to stochastic triggering 158 !------------------------------------------------------------ 159 160 DO ig = 1,klon 148 !============================================================================== 149 ! Initialization 150 !============================================================================== 151 152 DO ig = 1,ngrid 161 153 zlcl(ig) = 0. 162 154 fraca0(ig) = 0. … … 175 167 ENDDO 176 168 177 DO l = 1, klev178 DO ig = 1, klon169 DO l = 1,nlay 170 DO ig = 1,ngrid 179 171 therm_tke_max(ig,l) = 0. 180 172 env_tke_max(ig,l) = 0. … … 185 177 !------------Test sur le LCL des thermiques 186 178 do ig=1,ngrid 187 ok_lcl(ig)=.false.188 if ( (pcon(ig) .gt. pplay(ig,klev-1)) .and. (pcon(ig) .lt. pplay(ig,1)) ) ok_lcl(ig)=.true.189 enddo190 179 ok_lcl(ig)=.false. 180 if ( (pcon(ig) .gt. pplay(ig,nlay-1)) .and. (pcon(ig) .lt. pplay(ig,1)) ) ok_lcl(ig)=.true. 181 enddo 182 191 183 !------------Localisation des niveaux entourant le LCL et du coef d'interpolation 192 do l=1,nlay-1193 do ig=1,ngrid194 if (ok_lcl(ig)) then184 do l=1,nlay-1 185 do ig=1,ngrid 186 if (ok_lcl(ig)) then 195 187 !ATTENTION,zw2 calcule en pplev 196 ! if ((pplay(ig,l) .ge. pcon(ig)) .and. (pplay(ig,l+1) .le. pcon(ig))) then197 ! klcl(ig)=l198 ! interp(ig)=(pcon(ig)-pplay(ig,klcl(ig)))/(pplay(ig,klcl(ig)+1)-pplay(ig,klcl(ig)))199 ! endif200 if ((pplev(ig,l) .ge. pcon(ig)) .and. (pplev(ig,l+1) .le. pcon(ig))) then201 klcl(ig)=l202 interp(ig)=(pcon(ig)-pplev(ig,klcl(ig)))/(pplev(ig,klcl(ig)+1)-pplev(ig,klcl(ig)))203 endif204 endif205 enddo206 enddo207 188 ! if ((pplay(ig,l) .ge. pcon(ig)) .and. (pplay(ig,l+1) .le. pcon(ig))) then 189 ! klcl(ig)=l 190 ! interp(ig)=(pcon(ig)-pplay(ig,klcl(ig)))/(pplay(ig,klcl(ig)+1)-pplay(ig,klcl(ig))) 191 ! endif 192 if ((pplev(ig,l) .ge. pcon(ig)) .and. (pplev(ig,l+1) .le. pcon(ig))) then 193 klcl(ig)=l 194 interp(ig)=(pcon(ig)-pplev(ig,klcl(ig)))/(pplev(ig,klcl(ig)+1)-pplev(ig,klcl(ig))) 195 endif 196 endif 197 enddo 198 enddo 199 208 200 !------------Hauteur des thermiques 201 !jyg le 27/04/2012 202 ! do ig =1,ngrid 203 ! rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 204 ! & -rhobarz(ig,klcl(ig)))*interp(ig) 205 ! zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 206 ! if ( (.not.ok_lcl(ig)) .or. (zlcl(ig).gt.zmax(ig)) ) zlcl(ig)=zmax(ig) ! Si zclc > zmax alors on pose zlcl = zmax 207 !! enddo 208 209 do ig =1,ngrid 210 !CR:REHABILITATION ZMAX CONTINU 211 if (ok_lcl(ig)) then 212 rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 213 & -rhobarz(ig,klcl(ig)))*interp(ig) 214 zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 215 zlcl(ig)=min(zlcl(ig),zmax(ig)) ! Si zlcl > zmax alors on pose zlcl = zmax 216 else 217 rhobarz0(ig)=0. 218 zlcl(ig)=zmax(ig) 219 endif 220 enddo 221 !!jyg fin 222 223 !------------Calcul des propriétés du thermique au LCL 224 IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) THEN 225 226 !-----Initialisation de la TKE moyenne 227 do l=1,nlay 228 do ig=1,ngrid 229 pbl_tke_max(ig,l)=0. 230 enddo 231 enddo 232 233 !-----Calcul de la TKE moyenne 234 do nsrf=1,nbsrf 235 do l=1,nlay 236 do ig=1,ngrid 237 pbl_tke_max(ig,l)=pctsrf(ig,nsrf)*pbl_tke(ig,l,nsrf)+pbl_tke_max(ig,l) 238 enddo 239 enddo 240 enddo 241 242 !-----Initialisations des TKE dans et hors des thermiques 243 do l=1,nlay 244 do ig=1,ngrid 245 therm_tke_max(ig,l)=pbl_tke_max(ig,l) 246 env_tke_max(ig,l)=pbl_tke_max(ig,l) 247 enddo 248 enddo 249 250 !-----Calcul de la TKE transportée par les thermiques : therm_tke_max 251 call thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, & 252 & rg,pplev,therm_tke_max) 253 254 ! print *,' thermcell_tke_transport -> ' !!jyg 255 256 !-----Calcul des profils verticaux de TKE hors thermiques : env_tke_max, et de la vitesse verticale grande échelle : W_ls 257 do l=1,nlay 258 do ig=1,ngrid 259 pbl_tke_max(ig,l) = fraca(ig,l)*therm_tke_max(ig,l)+(1.-fraca(ig,l))*env_tke_max(ig,l) ! Recalcul de TKE moyenne aprés transport de TKE_TH 260 env_tke_max(ig,l) = (pbl_tke_max(ig,l)-fraca(ig,l)*therm_tke_max(ig,l))/(1.-fraca(ig,l)) ! Recalcul de TKE dans l'environnement aprés transport de TKE_TH 261 w_ls(ig,l) = -1.*omega(ig,l)/(RG*rhobarz(ig,l)) ! Vitesse verticale de grande échelle 262 enddo 263 enddo 264 265 ! print *,' apres w_ls = ' !!jyg 266 267 do ig=1,ngrid 268 if (ok_lcl(ig)) then 269 fraca0(ig) = fraca(ig,klcl(ig))+(fraca(ig,klcl(ig)+1) & 270 & - fraca(ig,klcl(ig)))*interp(ig) 271 w0(ig) = zw2(ig,klcl(ig))+(zw2(ig,klcl(ig)+1) & 272 & - zw2(ig,klcl(ig)))*interp(ig) 273 w_conv(ig) = w_ls(ig,klcl(ig))+(w_ls(ig,klcl(ig)+1) & 274 & - w_ls(ig,klcl(ig)))*interp(ig) 275 therm_tke_max0(ig) = therm_tke_max(ig,klcl(ig)) & 276 & + (therm_tke_max(ig,klcl(ig)+1)-therm_tke_max(ig,klcl(ig)))*interp(ig) 277 env_tke_max0(ig) = env_tke_max(ig,klcl(ig))+(env_tke_max(ig,klcl(ig)+1) & 278 & - env_tke_max(ig,klcl(ig)))*interp(ig) 279 pbl_tke_max0(ig)=pbl_tke_max(ig,klcl(ig))+(pbl_tke_max(ig,klcl(ig)+1) & 280 & -pbl_tke_max(ig,klcl(ig)))*interp(ig) 281 282 if (therm_tke_max0(ig).ge.20.) therm_tke_max0(ig) = 20. 283 284 if (env_tke_max0(ig).ge.20.) env_tke_max0(ig) = 20. 285 286 if (pbl_tke_max0(ig).ge.20.) pbl_tke_max0(ig) = 20. 287 else 288 fraca0(ig) = 0. 289 w0(ig) = 0. 290 ! jyg le 27/04/2012 291 ! zlcl(ig) = 0. 292 endif 293 enddo 294 295 ENDIF ! IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) 296 297 ! print *,'ENDIF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) ' !!jyg 298 299 !------------Triggering------------------ 300 IF (iflag_trig_bl.ge.1) THEN 301 302 !-----Initialisations 303 depth(:)=0. 304 n2(:)=0. 305 s2(:)=100. ! some low value, arbitrary 306 s_max(:)=0. 307 308 !-----Epaisseur du nuage (depth) et détermination de la queue du spectre de panaches (n2,s2) et du panache le plus gros (s_max) 309 do ig=1,ngrid 310 zmax_moy(ig)=zlcl(ig)+zmax_moy_coef*(zmax(ig)-zlcl(ig)) 311 depth(ig)=zmax_moy(ig)-zlcl(ig) 312 hmin(ig)=hmincoef*zlcl(ig) 313 314 if (depth(ig).ge.10.) then 315 s2(ig)=(hcoef*depth(ig)+hmin(ig))**2 316 n2(ig)=(1.-eps1)*fraca0(ig)*airephy(ig)/s2(ig) 317 209 318 !!jyg le 27/04/2012 210 !! do ig =1,ngrid 211 !! rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 212 !! & -rhobarz(ig,klcl(ig)))*interp(ig) 213 !! zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 214 !! if ( (.not.ok_lcl(ig)) .or. (zlcl(ig).gt.zmax(ig)) ) zlcl(ig)=zmax(ig) ! Si zclc > zmax alors on pose zlcl = zmax 215 !! enddo 216 do ig =1,ngrid 217 !CR:REHABILITATION ZMAX CONTINU 218 if (ok_lcl(ig)) then 219 rhobarz0(ig)=rhobarz(ig,klcl(ig))+(rhobarz(ig,klcl(ig)+1) & 220 & -rhobarz(ig,klcl(ig)))*interp(ig) 221 zlcl(ig)=(pplev(ig,1)-pcon(ig))/(rhobarz0(ig)*RG) 222 zlcl(ig)=min(zlcl(ig),zmax(ig)) ! Si zlcl > zmax alors on pose zlcl = zmax 223 else 224 rhobarz0(ig)=0. 225 zlcl(ig)=zmax(ig) 226 endif 227 enddo 228 !!jyg fin 229 230 !------------Calcul des propriétés du thermique au LCL 231 IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) THEN 232 233 !-----Initialisation de la TKE moyenne 234 do l=1,nlay 235 do ig=1,ngrid 236 pbl_tke_max(ig,l)=0. 237 enddo 238 enddo 239 240 !-----Calcul de la TKE moyenne 241 do nsrf=1,nbsrf 242 do l=1,nlay 243 do ig=1,ngrid 244 pbl_tke_max(ig,l)=pctsrf(ig,nsrf)*pbl_tke(ig,l,nsrf)+pbl_tke_max(ig,l) 245 enddo 246 enddo 247 enddo 248 249 !-----Initialisations des TKE dans et hors des thermiques 250 do l=1,nlay 251 do ig=1,ngrid 252 therm_tke_max(ig,l)=pbl_tke_max(ig,l) 253 env_tke_max(ig,l)=pbl_tke_max(ig,l) 254 enddo 255 enddo 256 257 !-----Calcul de la TKE transportée par les thermiques : therm_tke_max 258 call thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, & 259 & rg,pplev,therm_tke_max) 260 261 ! print *,' thermcell_tke_transport -> ' !!jyg 262 263 !-----Calcul des profils verticaux de TKE hors thermiques : env_tke_max, et de la vitesse verticale grande échelle : W_ls 264 do l=1,nlay 265 do ig=1,ngrid 266 pbl_tke_max(ig,l)=fraca(ig,l)*therm_tke_max(ig,l)+(1.-fraca(ig,l))*env_tke_max(ig,l) ! Recalcul de TKE moyenne aprés transport de TKE_TH 267 env_tke_max(ig,l)=(pbl_tke_max(ig,l)-fraca(ig,l)*therm_tke_max(ig,l))/(1.-fraca(ig,l)) ! Recalcul de TKE dans l'environnement aprés transport de TKE_TH 268 w_ls(ig,l)=-1.*omega(ig,l)/(RG*rhobarz(ig,l)) ! Vitesse verticale de grande échelle 269 enddo 270 enddo 271 272 ! print *,' apres w_ls = ' !!jyg 273 274 do ig=1,ngrid 275 if (ok_lcl(ig)) then 276 fraca0(ig)=fraca(ig,klcl(ig))+(fraca(ig,klcl(ig)+1) & 277 & -fraca(ig,klcl(ig)))*interp(ig) 278 w0(ig)=zw2(ig,klcl(ig))+(zw2(ig,klcl(ig)+1) & 279 & -zw2(ig,klcl(ig)))*interp(ig) 280 w_conv(ig)=w_ls(ig,klcl(ig))+(w_ls(ig,klcl(ig)+1) & 281 & -w_ls(ig,klcl(ig)))*interp(ig) 282 therm_tke_max0(ig)=therm_tke_max(ig,klcl(ig)) & 283 & +(therm_tke_max(ig,klcl(ig)+1)-therm_tke_max(ig,klcl(ig)))*interp(ig) 284 env_tke_max0(ig)=env_tke_max(ig,klcl(ig))+(env_tke_max(ig,klcl(ig)+1) & 285 & -env_tke_max(ig,klcl(ig)))*interp(ig) 286 pbl_tke_max0(ig)=pbl_tke_max(ig,klcl(ig))+(pbl_tke_max(ig,klcl(ig)+1) & 287 & -pbl_tke_max(ig,klcl(ig)))*interp(ig) 288 289 if (therm_tke_max0(ig).ge.20.) therm_tke_max0(ig)=20. 290 291 if (env_tke_max0(ig).ge.20.) env_tke_max0(ig)=20. 292 293 if (pbl_tke_max0(ig).ge.20.) pbl_tke_max0(ig)=20. 294 else 295 fraca0(ig)=0. 296 w0(ig)=0. 297 ! jyg le 27/04/2012 298 ! zlcl(ig)=0. 299 endif 300 enddo 301 302 ENDIF ! IF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) 303 304 ! print *,'ENDIF ( (iflag_trig_bl.ge.1) .or. (iflag_clos_bl.ge.1) ) ' !!jyg 305 306 !------------Triggering------------------ 307 IF (iflag_trig_bl.ge.1) THEN 308 309 !-----Initialisations 310 depth(:)=0. 311 n2(:)=0. 312 s2(:)=100. ! some low value, arbitrary 313 s_max(:)=0. 314 315 !-----Epaisseur du nuage (depth) et détermination de la queue du spectre de panaches (n2,s2) et du panache le plus gros (s_max) 316 do ig=1,ngrid 317 zmax_moy(ig)=zlcl(ig)+zmax_moy_coef*(zmax(ig)-zlcl(ig)) 318 depth(ig)=zmax_moy(ig)-zlcl(ig) 319 hmin(ig)=hmincoef*zlcl(ig) 320 321 if (depth(ig).ge.10.) then 322 s2(ig)=(hcoef*depth(ig)+hmin(ig))**2 323 n2(ig)=(1.-eps1)*fraca0(ig)*airephy(ig)/s2(ig) 324 325 !!jyg le 27/04/2012 326 !! s_max(ig)=s2(ig)*log(n2(ig)) 327 !! if (n2(ig) .lt. 1) s_max(ig)=0. 328 s_max(ig)=s2(ig)*log(max(n2(ig),1.)) 319 !! s_max(ig) = s2(ig)*log(n2(ig)) 320 !! if (n2(ig) .lt. 1) s_max(ig) = 0. 321 s_max(ig) = s2(ig)*log(max(n2(ig),1.)) 329 322 !!fin jyg 330 else331 n2(ig)=0.332 s_max(ig)=0.333 endif334 enddo335 336 ! print *,'avant Calcul de Wmax ' !!jyg337 323 else 324 n2(ig) = 0. 325 s_max(ig) = 0. 326 endif 327 enddo 328 329 ! print *,'avant Calcul de Wmax ' !!jyg 330 338 331 !-----Calcul de Wmax et ALE_BL_STAT associée 339 332 !!jyg le 30/04/2012 … … 347 340 !! endif 348 341 !! enddo 349 350 susqr2pi=su*sqrt(2.*Rpi)351 reuler=exp(1.)352 353 do ig=1,ngrid354 if ( (depth(ig).ge.10.) .and. (s_max(ig).gt.susqr2pi*reuler) ) then355 w_max(ig)=w0(ig)*(1.+sqrt(2.*log(s_max(ig)/susqr2pi)-log(2.*log(s_max(ig)/susqr2pi))))356 ale_bl_stat(ig)=0.5*w_max(ig)**2357 else358 w_max(ig)=0.359 ale_bl_stat(ig)=0.360 endif361 enddo362 363 ENDIF ! iflag_trig_bl364 365 ! print *,'ENDIF iflag_trig_bl' !!jyg366 342 343 susqr2pi=su*sqrt(2.*Rpi) 344 reuler=exp(1.) 345 346 do ig=1,ngrid 347 if ( (depth(ig).ge.10.) .and. (s_max(ig).gt.susqr2pi*reuler) ) then 348 w_max(ig)=w0(ig)*(1.+sqrt(2.*log(s_max(ig)/susqr2pi)-log(2.*log(s_max(ig)/susqr2pi)))) 349 ale_bl_stat(ig)=0.5*w_max(ig)**2 350 else 351 w_max(ig)=0. 352 ale_bl_stat(ig)=0. 353 endif 354 enddo 355 356 ENDIF ! iflag_trig_bl 357 358 ! print *,'ENDIF iflag_trig_bl' !!jyg 359 367 360 !------------Closure------------------ 368 369 IF (iflag_clos_bl.ge.2) THEN370 361 362 IF (iflag_clos_bl.ge.2) THEN 363 371 364 !-----Calcul de ALP_BL_STAT 372 do ig=1,ngrid 373 alp_bl_det(ig)=0.5*coef_m*rhobarz0(ig)*(w0(ig)**3)*fraca0(ig)*(1.-2.*fraca0(ig))/((1.-fraca0(ig))**2) 374 alp_bl_fluct_m(ig)=1.5*rhobarz0(ig)*fraca0(ig)*(w_conv(ig)+coef_m*w0(ig))* & 375 & (w0(ig)**2) 376 alp_bl_fluct_tke(ig)=3.*coef_m*rhobarz0(ig)*w0(ig)*fraca0(ig)*(therm_tke_max0(ig)-env_tke_max0(ig)) & 377 & +3.*rhobarz0(ig)*w_conv(ig)*pbl_tke_max0(ig) 378 379 if (iflag_clos_bl.ge.2) then 380 alp_bl_conv(ig)=1.5*coef_m*rhobarz0(ig)*fraca0(ig)*(fraca0(ig)/(1.-fraca0(ig)))*w_conv(ig)* & 365 do ig=1,ngrid 366 alp_bl_det(ig)=0.5*coef_m*rhobarz0(ig)*(w0(ig)**3)*fraca0(ig)*(1.-2.*fraca0(ig))/((1.-fraca0(ig))**2) 367 alp_bl_fluct_m(ig)=1.5*rhobarz0(ig)*fraca0(ig)*(w_conv(ig)+coef_m*w0(ig))* & 381 368 & (w0(ig)**2) 382 else 383 alp_bl_conv(ig)=0. 384 endif 385 386 alp_bl_stat(ig)=alp_bl_det(ig)+alp_bl_fluct_m(ig)+alp_bl_fluct_tke(ig)+alp_bl_conv(ig) 387 enddo 388 369 alp_bl_fluct_tke(ig)=3.*coef_m*rhobarz0(ig)*w0(ig)*fraca0(ig)*(therm_tke_max0(ig)-env_tke_max0(ig)) & 370 & +3.*rhobarz0(ig)*w_conv(ig)*pbl_tke_max0(ig) 371 372 if (iflag_clos_bl.ge.2) then 373 alp_bl_conv(ig)=1.5*coef_m*rhobarz0(ig)*fraca0(ig)*(fraca0(ig)/(1.-fraca0(ig)))*w_conv(ig)* & 374 & (w0(ig)**2) 375 else 376 alp_bl_conv(ig)=0. 377 endif 378 379 alp_bl_stat(ig)=alp_bl_det(ig)+alp_bl_fluct_m(ig)+alp_bl_fluct_tke(ig)+alp_bl_conv(ig) 380 enddo 381 389 382 !-----Sécurité ALP infinie 390 do ig=1,ngrid391 if (fraca0(ig).gt.0.98) alp_bl_stat(ig)=2.392 enddo393 394 ENDIF ! (iflag_clos_bl.ge.2)395 383 do ig=1,ngrid 384 if (fraca0(ig).gt.0.98) alp_bl_stat(ig)=2. 385 enddo 386 387 ENDIF ! (iflag_clos_bl.ge.2) 388 396 389 !!! fin nrlmd le 10/04/2012 397 398 ! print*,'avant calcul ale et alp' 399 400 !calcul de ALE et ALP pour la convection 401 alp_bl(:)=0. 402 ale_bl(:)=0. 403 404 ! print*,'ALE,ALP ,l,zw2(ig,l),ale_bl(ig),alp_bl(ig)' 405 406 do l=1,nlay 407 do ig=1,ngrid 408 alp_bl(ig)=max(alp_bl(ig),0.5*rhobarz(ig,l)*wth3(ig,l) ) 409 ale_bl(ig)=max(ale_bl(ig),0.5*zw2(ig,l)**2) 410 ! print*,'ALE,ALP',l,zw2(ig,l),ale_bl(ig),alp_bl(ig) 411 enddo 412 enddo 413 414 ! ale sec (max de wmax/2 sous la zone d'inhibition) dans 415 ! le cas iflag_trig_bl=3 416 417 IF (iflag_trig_bl==3) then 418 ale_bl(:)=0.5*wmax_sec(:)**2 419 ENDIF 420 390 391 ! print*,'avant calcul ale et alp' 392 393 ! calcul de ALE et ALP pour la convection 394 alp_bl(:)=0. 395 ale_bl(:)=0. 396 397 ! print*,'ALE,ALP ,l,zw2(ig,l),ale_bl(ig),alp_bl(ig)' 398 399 do l=1,nlay 400 do ig=1,ngrid 401 alp_bl(ig)=max(alp_bl(ig),0.5*rhobarz(ig,l)*wth3(ig,l) ) 402 ale_bl(ig)=max(ale_bl(ig),0.5*zw2(ig,l)**2) 403 ! print*,'ALE,ALP',l,zw2(ig,l),ale_bl(ig),alp_bl(ig) 404 enddo 405 enddo 406 407 ! ale sec (max de wmax/2 sous la zone d'inhibition) dans le cas iflag_trig_bl=3 408 409 IF (iflag_trig_bl==3) then 410 ale_bl(:)=0.5*wmax_sec(:)**2 411 ENDIF 412 421 413 !test:calcul de la ponderation des couches pour KE 422 414 !initialisations 423 415 424 416 fm_tot(:)=0. 425 417 wght_th(:,:)=1. 426 418 lalim_conv(:)=lalim(:) 427 428 do k=1, klev419 420 do k=1,nlay 429 421 do ig=1,ngrid 430 422 if (k<=lalim_conv(ig)) fm_tot(ig)=fm_tot(ig)+fm(ig,k) 431 423 enddo 432 424 enddo 433 425 434 426 ! assez bizarre car, si on est dans la couche d'alim et que alim_star et 435 427 ! plus petit que 1.e-10, on prend wght_th=1. 436 do k=1, klev428 do k=1,nlay 437 429 do ig=1,ngrid 438 430 if (k<=lalim_conv(ig).and.alim_star(ig,k)>1.e-10) then … … 441 433 enddo 442 434 enddo 443 435 444 436 ! print*,'apres wght_th' 445 437 !test pour prolonger la convection 446 438 do ig=1,ngrid 447 !v1d if ((alim_star(ig,1).lt.1.e-10).and.(therm)) then448 if ((alim_star(ig,1).lt.1.e-10)) then449 lalim_conv(ig)=1450 wght_th(ig,1)=1.451 ! print*,'lalim_conv ok',lalim_conv(ig),wght_th(ig,1)452 endif453 enddo 454 439 !v1d if ((alim_star(ig,1).lt.1.e-10).and.(therm)) then 440 if ((alim_star(ig,1).lt.1.e-10)) then 441 lalim_conv(ig)=1 442 wght_th(ig,1)=1. 443 ! print*,'lalim_conv ok',lalim_conv(ig),wght_th(ig,1) 444 endif 445 enddo 446 455 447 !------------------------------------------------------------------------ 456 448 ! Modif CR/FH 20110310 : alp integree sur la verticale. … … 459 451 ! couches 460 452 !------------------------------------------------------------------------ 461 453 462 454 alp_int(:)=0. 463 455 dp_int(:)=0. 456 464 457 do l=2,nlay 465 458 do ig=1,ngrid … … 471 464 enddo 472 465 enddo 473 466 474 467 if (iflag_coupl>=3 .and. iflag_coupl<=5) then 475 468 do ig=1,ngrid … … 480 473 enddo 481 474 endif 482 483 475 484 476 ! Facteur multiplicatif sur alp_bl 485 477 alp_bl(:)=alp_bl_k*alp_bl(:) 486 487 !------------------------------------------------------------------------ 488 489 490 491 return 492 end 478 479 480 return 481 end -
trunk/LMDZ.GENERIC/libf/phystd/thermcell_flux.F90
r2092 r2101 2 2 ! 3 3 ! 4 SUBROUTINE thermcell_flux(ngrid,klev,ptimestep,masse,&5 & lalim,lmin,lmax,alim_star,entr_star,detr_star,&6 & f,rhobarz,zlev,zw2,fm,entr,&7 &detr,zqla,lev_out,lunout1,igout)4 SUBROUTINE thermcell_flux(ngrid,nlay,ptimestep,masse, & 5 lalim,lmin,lmax,alim_star,entr_star,detr_star, & 6 f,rhobarz,zlev,zw2,fm,entr, & 7 detr,zqla,lev_out,lunout1,igout) 8 8 9 9 … … 26 26 27 27 INTEGER ngrid 28 INTEGER klev28 INTEGER nlay 29 29 INTEGER igout 30 30 INTEGER lev_out … … 34 34 INTEGER lalim(ngrid) 35 35 36 REAL alim_star(ngrid, klev)37 REAL entr_star(ngrid, klev)38 REAL detr_star(ngrid, klev)39 REAL zw2(ngrid, klev+1)40 REAL zlev(ngrid, klev+1)41 REAL masse(ngrid, klev)36 REAL alim_star(ngrid,nlay) 37 REAL entr_star(ngrid,nlay) 38 REAL detr_star(ngrid,nlay) 39 REAL zw2(ngrid,nlay+1) 40 REAL zlev(ngrid,nlay+1) 41 REAL masse(ngrid,nlay) 42 42 REAL ptimestep 43 REAL rhobarz(ngrid, klev)43 REAL rhobarz(ngrid,nlay) 44 44 REAL f(ngrid) 45 REAL zqla(ngrid, klev)45 REAL zqla(ngrid,nlay) 46 46 REAL zmax(ngrid) 47 47 … … 49 49 ! -------- 50 50 51 REAL entr(ngrid, klev)52 REAL detr(ngrid, klev)53 REAL fm(ngrid, klev+1)51 REAL entr(ngrid,nlay) 52 REAL detr(ngrid,nlay) 53 REAL fm(ngrid,nlay+1) 54 54 55 55 ! local: … … 124 124 !------------------------------------------------------------------------------ 125 125 126 DO l=1, klev126 DO l=1,nlay 127 127 entr(:,l) = f(:) * (entr_star(:,l) + alim_star(:,l)) 128 128 detr(:,l) = f(:) * detr_star(:,l) … … 133 133 !------------------------------------------------------------------------------ 134 134 135 DO l=1, klev135 DO l=1,nlay 136 136 DO ig=1,ngrid 137 137 IF (l.lt.lmax(ig) .and. l.ge.lmin(ig)) THEN … … 152 152 !============================================================================== 153 153 154 DO l=1, klev154 DO l=1,nlay 155 155 156 156 !------------------------------------------------------------------------------ … … 186 186 ! Test sur fraca constante ou croissante au-dessus de lalim 187 187 !------------------------------------------------------------------------------ 188 188 189 ! AB : Do we have to decree that? If so, set iflag_thermals_optflux to 0 189 190 IF (iflag_thermals_optflux==0) THEN … … 205 206 ! Test sur flux de masse constant ou decroissant au-dessus de lalim 206 207 !------------------------------------------------------------------------------ 208 207 209 ! AB : Do we have to decree that? If so, set iflag_thermals_optflux to 0 208 210 IF (iflag_thermals_optflux==0) THEN … … 544 546 545 547 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 ! AB : temporary test added to check the equation df/dz = e - d validity547 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 548 ! DO l=1, klev548 ! AB : temporary test added to check the validity of eq. df/dz = e - d 549 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 ! DO l=1,nlay 549 551 ! DO ig=1,ngrid 550 552 ! test = abs(fm(ig,l) + entr(ig,l) - detr(ig,l) - fm(ig,l+1)) -
trunk/LMDZ.GENERIC/libf/phystd/thermcell_height.F90
r2060 r2101 3 3 ! 4 4 SUBROUTINE thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix, & 5 & zw2,zlev,lmax,zmax,zm ax0,zmix,&5 & zw2,zlev,lmax,zmax,zmix, & 6 6 & wmax,f_star,lev_out) 7 7 … … 40 40 REAL linter(ngrid) 41 41 REAL zmax(ngrid) 42 REAL zmax0(ngrid)43 42 REAL zmix(ngrid) 44 43 REAL wmax(ngrid) … … 138 137 & - zlev(ig,lmax(ig))) 139 138 zmax(ig) = max(zmax(ig), zlevinter(ig) - zlev(ig,lmin(ig))) 140 zmax0(ig) = zmax(ig)141 139 ENDDO 142 140 -
trunk/LMDZ.GENERIC/libf/phystd/thermcell_main.F90
r2072 r2101 2 2 ! 3 3 ! 4 SUBROUTINE thermcell_main(itap,ngrid,nlay,ptimestep&5 & ,pplay,pplev,pphi,debut&6 &,pu,pv,pt,po &7 &,pduadj,pdvadj,pdtadj,pdoadj &8 &,f0,fm0,entr0,detr0 &9 &,zqta,zqla,ztv,ztva,ztla,zthl,zqsatth &10 & ,zmax0,zw2,fraca&11 &,lmin,lmix,lalim,lmax &12 &,zpspsk,ratqscth,ratqsdiff &13 &,Ale_bl,Alp_bl,lalim_conv,wght_th &4 SUBROUTINE thermcell_main(itap,ngrid,nlay,ptimestep & 5 ,pplay,pplev,pphi,firstcall & 6 ,pu,pv,pt,po & 7 ,pduadj,pdvadj,pdtadj,pdoadj & 8 ,f0,fm0,entr0,detr0 & 9 ,zqta,zqla,ztv,ztva,ztla,zthl,zqsatth & 10 ,zw2,fraca & 11 ,lmin,lmix,lalim,lmax & 12 ,zpspsk,ratqscth,ratqsdiff & 13 ,Ale_bl,Alp_bl,lalim_conv,wght_th & 14 14 !!! nrlmd le 10/04/2012 15 &,pbl_tke,pctsrf,omega,airephy &16 &,zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 &17 &,n2,s2,ale_bl_stat &18 &,therm_tke_max,env_tke_max &19 &,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke &20 &,alp_bl_conv,alp_bl_stat)15 ,pbl_tke,pctsrf,omega,airephy & 16 ,zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0 & 17 ,n2,s2,ale_bl_stat & 18 ,therm_tke_max,env_tke_max & 19 ,alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke & 20 ,alp_bl_conv,alp_bl_stat) 21 21 !!! fin nrlmd le 10/04/2012 22 22 23 23 24 !============================================================================== … … 51 52 !============================================================================== 52 53 53 USE dimphy54 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~55 ! AB : why use dimphy to get klon, klev while subroutine arguments ngrid and56 ! nlay are the same?57 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~58 54 USE thermcell_mod 59 USE print_control_mod, ONLY: lunout,prt_level 60 USE planete_mod, ONLY: preff 55 USE print_control_mod, ONLY: lunout, prt_level 61 56 62 57 IMPLICIT NONE … … 84 79 REAL po(ngrid,nlay) ! 85 80 86 LOGICAL debut81 LOGICAL firstcall 87 82 88 83 ! outputs: … … 94 89 REAL pdoadj(ngrid,nlay) ! water convective variations 95 90 96 REAL fm0( klon,klev+1)! mass flux (after possible time relaxation)97 REAL entr0( klon,klev)! entrainment (after possible time relaxation)98 REAL detr0( klon,klev)! detrainment (after possible time relaxation)99 REAL f0( klon)! mass flux norm (after possible time relaxation)91 REAL fm0(ngrid,nlay+1) ! mass flux (after possible time relaxation) 92 REAL entr0(ngrid,nlay) ! entrainment (after possible time relaxation) 93 REAL detr0(ngrid,nlay) ! detrainment (after possible time relaxation) 94 REAL f0(ngrid) ! mass flux norm (after possible time relaxation) 100 95 101 96 ! local: … … 118 113 119 114 INTEGER ig,k,l,ll,ierr 120 INTEGER lmix_bis(klon) 121 INTEGER lmax(klon) ! 122 INTEGER lmin(klon) ! 123 INTEGER lalim(klon) ! 124 INTEGER lmix(klon) ! 125 126 REAL linter(klon) 127 REAL zmix(klon) 128 REAL zmax(klon) 129 REAL zw2(klon,klev+1) 130 REAL zw_est(klon,klev+1) 131 REAL zmax_sec(klon) 132 REAL zmax0(klon) 133 134 REAL zlay(klon,klev) ! layers altitude 135 REAL zlev(klon,klev+1) ! levels altitude 136 REAL rho(klon,klev) ! layers density 137 REAL rhobarz(klon,klev) ! levels density 138 REAL deltaz(klon,klev) ! layers heigth 139 REAL masse(klon,klev) ! layers mass 140 REAL zpspsk(klon,klev) ! Exner function 141 142 REAL zu(klon,klev) ! environment zonal wind 143 REAL zv(klon,klev) ! environment meridional wind 144 REAL zo(klon,klev) ! environment water tracer 145 REAL zva(klon,klev) ! plume zonal wind 146 REAL zua(klon,klev) ! plume meridional wind 147 REAL zoa(klon,klev) ! plume water tracer 148 149 REAL zt(klon,klev) ! T environment 150 REAL zh(klon,klev) ! T,TP environment 151 REAL zthl(klon,klev) ! TP environment 152 REAL ztv(klon,klev) ! TPV environment ? 153 REAL zl(klon,klev) ! ql environment 154 155 REAL zta(klon,klev) ! 156 REAL zha(klon,klev) ! TRPV plume 157 REAL ztla(klon,klev) ! TP plume 158 REAL ztva(klon,klev) ! TRPV plume 159 REAL ztva_est(klon,klev) ! TRPV plume (temporary) 160 REAL zqla(klon,klev) ! qv plume 161 REAL zqta(klon,klev) ! qt plume 162 163 REAL wmax(klon) ! maximal vertical speed 164 REAL wmax_tmp(klon) ! temporary maximal vertical speed 165 REAL wmax_sec(klon) ! maximal vertical speed if dry case 166 167 REAL fraca(klon,klev+1) ! updraft fraction 168 REAL f_star(klon,klev+1) ! normalized mass flux 169 REAL entr_star(klon,klev) ! normalized entrainment 170 REAL detr_star(klon,klev) ! normalized detrainment 171 REAL alim_star_tot(klon) ! integrated alimentation 172 REAL alim_star(klon,klev) ! normalized alimentation 173 REAL alim_star_clos(klon,klev) ! closure alimentation 174 175 REAL fm(klon,klev+1) ! mass flux 176 REAL entr(klon,klev) ! entrainment 177 REAL detr(klon,klev) ! detrainment 178 REAL f(klon) ! mass flux norm 179 180 REAL zdthladj(klon,klev) ! 115 INTEGER lmix_bis(ngrid) 116 INTEGER lmax(ngrid) ! 117 INTEGER lmin(ngrid) ! 118 INTEGER lalim(ngrid) ! 119 INTEGER lmix(ngrid) ! 120 121 REAL linter(ngrid) 122 REAL zmix(ngrid) 123 REAL zmax(ngrid) 124 REAL zw2(ngrid,nlay+1) 125 REAL zw_est(ngrid,nlay+1) 126 REAL zmax_sec(ngrid) 127 128 REAL zlay(ngrid,nlay) ! layers altitude 129 REAL zlev(ngrid,nlay+1) ! levels altitude 130 REAL rho(ngrid,nlay) ! layers density 131 REAL rhobarz(ngrid,nlay) ! levels density 132 REAL deltaz(ngrid,nlay) ! layers heigth 133 REAL masse(ngrid,nlay) ! layers mass 134 REAL zpspsk(ngrid,nlay) ! Exner function 135 136 REAL zu(ngrid,nlay) ! environment zonal wind 137 REAL zv(ngrid,nlay) ! environment meridional wind 138 REAL zo(ngrid,nlay) ! environment water tracer 139 REAL zva(ngrid,nlay) ! plume zonal wind 140 REAL zua(ngrid,nlay) ! plume meridional wind 141 REAL zoa(ngrid,nlay) ! plume water tracer 142 143 REAL zt(ngrid,nlay) ! T environment 144 REAL zh(ngrid,nlay) ! T,TP environment 145 REAL zthl(ngrid,nlay) ! TP environment 146 REAL ztv(ngrid,nlay) ! TPV environment ? 147 REAL zl(ngrid,nlay) ! ql environment 148 149 REAL zta(ngrid,nlay) ! 150 REAL zha(ngrid,nlay) ! TRPV plume 151 REAL ztla(ngrid,nlay) ! TP plume 152 REAL ztva(ngrid,nlay) ! TRPV plume 153 REAL ztva_est(ngrid,nlay) ! TRPV plume (temporary) 154 REAL zqla(ngrid,nlay) ! qv plume 155 REAL zqta(ngrid,nlay) ! qt plume 156 157 REAL wmax(ngrid) ! maximal vertical speed 158 REAL wmax_tmp(ngrid) ! temporary maximal vertical speed 159 REAL wmax_sec(ngrid) ! maximal vertical speed if dry case 160 161 REAL fraca(ngrid,nlay+1) ! updraft fraction 162 REAL f_star(ngrid,nlay+1) ! normalized mass flux 163 REAL entr_star(ngrid,nlay) ! normalized entrainment 164 REAL detr_star(ngrid,nlay) ! normalized detrainment 165 REAL alim_star_tot(ngrid) ! integrated alimentation 166 REAL alim_star(ngrid,nlay) ! normalized alimentation 167 REAL alim_star_clos(ngrid,nlay) ! closure alimentation 168 169 REAL fm(ngrid,nlay+1) ! mass flux 170 REAL entr(ngrid,nlay) ! entrainment 171 REAL detr(ngrid,nlay) ! detrainment 172 REAL f(ngrid) ! mass flux norm 173 174 REAL zdthladj(ngrid,nlay) ! 181 175 REAL lambda ! time relaxation coefficent 182 176 183 REAL zsortie( klon,klev)184 REAL zsortie1d( klon)177 REAL zsortie(ngrid,nlay) 178 REAL zsortie1d(ngrid) 185 179 REAL susqr2pi, Reuler 186 180 REAL zf 187 181 REAL zf2 188 REAL thetath2( klon,klev)189 REAL wth2( klon,klev)190 REAL wth3( klon,klev)191 REAL q2( klon,klev)182 REAL thetath2(ngrid,nlay) 183 REAL wth2(ngrid,nlay) 184 REAL wth3(ngrid,nlay) 185 REAL q2(ngrid,nlay) 192 186 ! FH : probleme de dimensionnement avec l'allocation dynamique 193 187 ! common/comtherm/thetath2,wth2 194 real wq( klon,klev)195 real wthl( klon,klev)196 real wthv( klon,klev)197 real ratqscth( klon,klev)188 real wq(ngrid,nlay) 189 real wthl(ngrid,nlay) 190 real wthv(ngrid,nlay) 191 real ratqscth(ngrid,nlay) 198 192 real var 199 193 real vardiff 200 real ratqsdiff( klon,klev)194 real ratqsdiff(ngrid,nlay) 201 195 ! niveau de condensation 202 integer nivcon( klon)203 real zcon( klon)196 integer nivcon(ngrid) 197 real zcon(ngrid) 204 198 real CHI 205 real zcon2(klon) 206 real pcon(klon) 207 real zqsat(klon,klev) 208 real zqsatth(klon,klev) 209 ! FH/IM : save f0 210 real zlevinter(klon) 199 real zcon2(ngrid) 200 real pcon(ngrid) 201 real zqsat(ngrid,nlay) 202 real zqsatth(ngrid,nlay) 203 real zlevinter(ngrid) 211 204 real seuil 212 205 … … 214 207 215 208 !------Entrees 216 real pbl_tke( klon,klev+1,nbsrf)217 real pctsrf( klon,nbsrf)218 real omega( klon,klev)219 real airephy( klon)209 real pbl_tke(ngrid,nlay+1,nbsrf) 210 real pctsrf(ngrid,nbsrf) 211 real omega(ngrid,nlay) 212 real airephy(ngrid) 220 213 !------Sorties 221 real zlcl( klon),fraca0(klon),w0(klon),w_conv(klon)222 real therm_tke_max0( klon),env_tke_max0(klon)223 real n2( klon),s2(klon)224 real ale_bl_stat( klon)225 real therm_tke_max( klon,klev),env_tke_max(klon,klev)226 real alp_bl_det( klon),alp_bl_fluct_m(klon),alp_bl_fluct_tke(klon),alp_bl_conv(klon),alp_bl_stat(klon)214 real zlcl(ngrid),fraca0(ngrid),w0(ngrid),w_conv(ngrid) 215 real therm_tke_max0(ngrid),env_tke_max0(ngrid) 216 real n2(ngrid),s2(ngrid) 217 real ale_bl_stat(ngrid) 218 real therm_tke_max(ngrid,nlay),env_tke_max(ngrid,nlay) 219 real alp_bl_det(ngrid),alp_bl_fluct_m(ngrid),alp_bl_fluct_tke(ngrid),alp_bl_conv(ngrid),alp_bl_stat(ngrid) 227 220 !------Local 228 221 integer nsrf 229 real rhobarz0( klon)! Densite au LCL230 logical ok_lcl( klon)! Existence du LCL des thermiques231 integer klcl( klon)! Niveau du LCL232 real interp( klon)! Coef d'interpolation pour le LCL222 real rhobarz0(ngrid) ! Densite au LCL 223 logical ok_lcl(ngrid) ! Existence du LCL des thermiques 224 integer klcl(ngrid) ! Niveau du LCL 225 real interp(ngrid) ! Coef d'interpolation pour le LCL 233 226 !------Triggering 234 real Su ! Surface unite: celle d'un updraft elementaire227 real Su ! Surface unite: celle d'un updraft elementaire 235 228 parameter(Su=4e4) 236 real hcoef ! Coefficient directeur pour le calcul de s2229 real hcoef ! Coefficient directeur pour le calcul de s2 237 230 parameter(hcoef=1) 238 real hmincoef ! Coefficient directeur pour l'ordonnee a l'origine pour le calcul de s2231 real hmincoef ! Coefficient directeur pour l'ordonnee a l'origine pour le calcul de s2 239 232 parameter(hmincoef=0.3) 240 real eps1 ! Fraction de surface occupee par la population 1 : eps1=n1*s1/(fraca0*Sd)233 real eps1 ! Fraction de surface occupee par la population 1 : eps1=n1*s1/(fraca0*Sd) 241 234 parameter(eps1=0.3) 242 real hmin(ngrid) ! Ordonnee a l'origine pour le calcul de s2243 real zmax_moy(ngrid) ! Hauteur moyenne des thermiques : zmax_moy = zlcl + 0.33 (zmax-zlcl)235 real hmin(ngrid) ! Ordonnee a l'origine pour le calcul de s2 236 real zmax_moy(ngrid) ! Hauteur moyenne des thermiques : zmax_moy = zlcl + 0.33 (zmax-zlcl) 244 237 real zmax_moy_coef 245 238 parameter(zmax_moy_coef=0.33) 246 real depth( klon)! Epaisseur moyenne du cumulus247 real w_max( klon)! Vitesse max statistique248 real s_max( klon)239 real depth(ngrid) ! Epaisseur moyenne du cumulus 240 real w_max(ngrid) ! Vitesse max statistique 241 real s_max(ngrid) 249 242 !------Closure 250 real pbl_tke_max( klon,klev)! Profil de TKE moyenne251 real pbl_tke_max0( klon)! TKE moyenne au LCL252 real w_ls( klon,klev)! Vitesse verticale grande echelle (m/s)253 real coef_m ! On considere un rendement pour alp_bl_fluct_m243 real pbl_tke_max(ngrid,nlay) ! Profil de TKE moyenne 244 real pbl_tke_max0(ngrid) ! TKE moyenne au LCL 245 real w_ls(ngrid,nlay) ! Vitesse verticale grande echelle (m/s) 246 real coef_m ! On considere un rendement pour alp_bl_fluct_m 254 247 parameter(coef_m=1.) 255 real coef_tke ! On considere un rendement pour alp_bl_fluct_tke248 real coef_tke ! On considere un rendement pour alp_bl_fluct_tke 256 249 parameter(coef_tke=1.) 257 250 … … 259 252 260 253 ! Nouvelles variables pour la convection 261 real Ale_bl( klon)262 real Alp_bl( klon)263 real alp_int( klon),dp_int(klon),zdp264 real ale_int( klon)265 integer n_int( klon)266 real fm_tot( klon)267 real wght_th( klon,klev)268 integer lalim_conv( klon)254 real Ale_bl(ngrid) 255 real Alp_bl(ngrid) 256 real alp_int(ngrid),dp_int(ngrid),zdp 257 real ale_int(ngrid) 258 integer n_int(ngrid) 259 real fm_tot(ngrid) 260 real wght_th(ngrid,nlay) 261 integer lalim_conv(ngrid) 269 262 270 263 CHARACTER*2 str2 … … 282 275 seuil = 0.25 283 276 284 IF ( debut) THEN277 IF (firstcall) THEN 285 278 IF (iflag_thermals==15.or.iflag_thermals==16) THEN 286 279 dvimpl = 0 … … 299 292 entr(:,:) = 0. 300 293 detr(:,:) = 0. 301 302 IF (ngrid.ne.klon) THEN 303 print *, 'ERROR: ngrid and klon are different!' 304 print *, 'ngrid =', ngrid 305 print *, 'klon =', klon 306 ENDIF 307 308 DO ig=1,klon 294 f(:) = 0. 295 296 DO ig=1,ngrid 309 297 f0(ig) = max(f0(ig), 1.e-2) 310 zmax0(ig) = max(zmax0(ig),40.)311 298 ENDDO 312 299 … … 352 339 353 340 zlev(:,1) = 0. 354 zlev(:,nlay+1) = (2. * pphi(:, klev) - pphi(:,klev-1)) / RG341 zlev(:,nlay+1) = (2. * pphi(:,nlay) - pphi(:,nlay-1)) / RG 355 342 356 343 DO l=1,nlay … … 467 454 !============================================================================== 468 455 469 CALL thermcell_plume(itap,ngrid,nlay,ptimestep,ztv,zthl, &470 & po,zl,rhobarz,zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, &471 & lalim,f0,detr_star,entr_star,f_star,ztva, &472 & ztla,zqla,zqta,zha,zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis, &456 CALL thermcell_plume(itap,ngrid,nlay,ptimestep,ztv,zthl, & 457 & po,zl,rhobarz,zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & 458 & lalim,f0,detr_star,entr_star,f_star,ztva, & 459 & ztla,zqla,zqta,zha,zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis, & 473 460 & lmin,lev_out,lunout1,igout) 474 461 475 CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lalim ') 476 CALL test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lmix ') 477 478 !============================================================================== 479 ! Calcul des caracteristiques du thermique:zmax,zmix,wmax 480 !============================================================================== 481 482 CALL thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,zw2, & 483 & zlev,lmax,zmax,zmax0,zmix,wmax,f_star, & 484 & lev_out) 462 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lalim ') 463 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lmix ') 464 465 !============================================================================== 466 ! Thermal plumes characteristics: zmax, zmix, wmax 467 !============================================================================== 468 469 CALL thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,zw2, & 470 & zlev,lmax,zmax,zmix,wmax,f_star,lev_out) 485 471 486 472 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 488 474 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 489 475 490 CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lalim ')491 CALL test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmin ')492 CALL test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmix ')493 CALL test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmax ')494 495 !============================================================================== 496 ! Closure and mass flux determining476 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lalim ') 477 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmin ') 478 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmix ') 479 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmax ') 480 481 !============================================================================== 482 ! Closure and mass fluxes computation 497 483 !============================================================================== 498 484 … … 500 486 & lalim,lmin,zmax_sec,wmax_sec,lev_out) 501 487 502 CALL test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry lmin ')503 CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry lalim ')488 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry lmin ') 489 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry lalim ') 504 490 505 491 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 509 495 alim_star_clos(:,:) = alim_star(:,:) 510 496 alim_star_clos(:,:) = entr_star(:,:) + alim_star(:,:) 511 497 512 498 !------------------------------------------------------------------------------ 513 499 ! Closure (dry if iflag_thermals_closure=1, moist if iflag_thermals_closure=2) … … 531 517 f0 = (1.-lambda) * f + lambda * f0 532 518 ELSE 533 f0 = f519 f0(:) = f(:) 534 520 ENDIF 535 521 … … 539 525 IF (.not. (f0(1).ge.0.) ) THEN 540 526 abort_message = '.not. (f0(1).ge.0.)' 541 write(*,*)'f0 =', f0(1)527 print *, 'f0 =', f0(1) 542 528 CALL abort_physic(modname,abort_message,1) 529 ELSE 530 print *, 'f0 =', f0(1) 543 531 ENDIF 544 532 545 ! ==============================================================================546 ! Deduction des flux547 ! ==============================================================================533 !------------------------------------------------------------------------------ 534 ! Mass fluxes 535 !------------------------------------------------------------------------------ 548 536 549 537 CALL thermcell_flux(ngrid,nlay,ptimestep,masse, & 550 & lalim,lmin,lmax,alim_star,entr_star,detr_star,&551 & f,rhobarz,zlev,zw2,fm,entr,&552 & detr,zqla,lev_out,lunout1,igout)553 554 CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_flux lalim ')555 CALL test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_flux lmax ')538 & lalim,lmin,lmax,alim_star,entr_star,detr_star, & 539 & f,rhobarz,zlev,zw2,fm,entr,detr,zqla, & 540 & lev_out,lunout1,igout) 541 542 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_flux lalim ') 543 ! CALL test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_flux lmax ') 556 544 557 545 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 567 555 detr0 = (1.-lambda) * detr + lambda * detr0 568 556 ELSE 569 fm0 = fm570 entr0 = entr571 detr0 = detr557 fm0(:,:) = fm(:,:) 558 entr0(:,:) = entr(:,:) 559 detr0(:,:) = detr(:,:) 572 560 ENDIF 573 561 574 !============================================================================== 575 ! Calcul du transport vertical (de qt et tp) 576 !============================================================================== 577 578 CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,masse, & 579 & zthl,zdthladj,zta,lmin,lev_out) 580 581 CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,masse, & 582 & po,pdoadj,zoa,lmin,lev_out) 583 584 DO l=1,nlay 562 !------------------------------------------------------------------------------ 563 ! Updraft fraction 564 !------------------------------------------------------------------------------ 565 566 DO ig=1,ngrid 567 fraca(ig,1) = 0. 568 fraca(ig,nlay+1) = 0. 569 ENDDO 570 571 DO l=2,nlay 585 572 DO ig=1,ngrid 586 pdtadj(ig,l) = zdthladj(ig,l) * zpspsk(ig,l) 587 ENDDO 588 ENDDO 589 590 !============================================================================== 591 ! Calcul de la fraction de l'ascendance 592 !============================================================================== 593 594 DO ig=1,klon 595 fraca(ig,1)=0. 596 fraca(ig,nlay+1)=0. 597 ENDDO 598 599 DO l=2,nlay 600 DO ig=1,klon 601 IF (zw2(ig,l).gt.1.e-10) THEN 573 IF (zw2(ig,l).gt.0.) THEN 602 574 fraca(ig,l) = fm(ig,l) / (rhobarz(ig,l) * zw2(ig,l)) 603 575 ELSE … … 608 580 609 581 !============================================================================== 582 ! Transport vertical 583 !============================================================================== 584 585 !------------------------------------------------------------------------------ 586 ! Calcul du transport vertical (de qt et tp) 587 !------------------------------------------------------------------------------ 588 589 CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,masse, & 590 & zthl,zdthladj,zta,lmin,lev_out) 591 592 CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,masse, & 593 & po,pdoadj,zoa,lmin,lev_out) 594 595 DO l=1,nlay 596 DO ig=1,ngrid 597 pdtadj(ig,l) = zdthladj(ig,l) * zpspsk(ig,l) 598 ENDDO 599 ENDDO 600 601 !------------------------------------------------------------------------------ 610 602 ! Calcul du transport vertical du moment horizontal 611 ! ==============================================================================603 !------------------------------------------------------------------------------ 612 604 613 605 IF (dvimpl.eq.0) THEN … … 620 612 ELSE 621 613 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 622 ! Calcul purement conservatif pour le transport de V 614 ! Calcul purement conservatif pour le transport de V=(u,v) 623 615 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 624 616 CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,masse, & … … 756 748 ratqsdiff(:,:) = 0. 757 749 758 DO l=1, klev750 DO l=1,nlay 759 751 DO ig=1,ngrid 760 752 IF (l<=lalim(ig)) THEN … … 766 758 if (prt_level.ge.1) print*,'14f OK convect8' 767 759 768 DO l=1, klev760 DO l=1,nlay 769 761 DO ig=1,ngrid 770 762 IF (l<=lalim(ig)) THEN … … 799 791 800 792 801 SUBROUTINE test_ltherm(klon,klev,pplev,pplay,long,seuil,ztv,po,&802 793 SUBROUTINE test_ltherm(ngrid,nlay,pplev,pplay,long,seuil,ztv,po, & 794 ztva,zqla,f_star,zw2,comment) 803 795 804 796 … … 815 807 ! ------- 816 808 817 INTEGER klon818 INTEGER klev819 INTEGER long( klon)820 821 REAL pplev( klon,klev+1)822 REAL pplay( klon,klev)823 REAL ztv( klon,klev)824 REAL po( klon,klev)825 REAL ztva( klon,klev)826 REAL zqla( klon,klev)827 REAL f_star( klon,klev)828 REAL zw2( klon,klev)809 INTEGER ngrid 810 INTEGER nlay 811 INTEGER long(ngrid) 812 813 REAL pplev(ngrid,nlay+1) 814 REAL pplay(ngrid,nlay) 815 REAL ztv(ngrid,nlay) 816 REAL po(ngrid,nlay) 817 REAL ztva(ngrid,nlay) 818 REAL zqla(ngrid,nlay) 819 REAL f_star(ngrid,nlay) 820 REAL zw2(ngrid,nlay) 829 821 REAL seuil 830 822 … … 847 839 848 840 ! test sur la hauteur des thermiques ... 849 do i=1, klon841 do i=1,ngrid 850 842 !IMtemp if (pplay(i,long(i)).lt.seuil*pplev(i,1)) then 851 843 if (prt_level.ge.10) then 852 844 print *, 'WARNING ',comment,' au point ',i,' K= ',long(i) 853 845 print *, ' K P(MB) THV(K) Qenv(g/kg)THVA QLA(g/kg) F* W2' 854 do k=1, klev846 do k=1,nlay 855 847 write(6,'(i3,7f10.3)') k,pplay(i,k),ztv(i,k),1000*po(i,k),ztva(i,k),1000*zqla(i,k),f_star(i,k),zw2(i,k) 856 848 enddo … … 871 863 872 864 873 SUBROUTINE thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, & 874 & rg,pplev,therm_tke_max) 875 876 877 USE print_control_mod, ONLY: prt_level 878 879 IMPLICIT NONE 865 SUBROUTINE thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0, & 866 rg,pplev,therm_tke_max) 880 867 881 868 … … 887 874 ! Transport de la TKE par le thermique moyen pour la fermeture en ALP 888 875 ! On transporte pbl_tke pour donner therm_tke 876 !============================================================================== 877 878 USE print_control_mod, ONLY: prt_level 879 880 IMPLICIT NONE 881 882 883 !============================================================================== 884 ! Declarations 889 885 !============================================================================== 890 886 … … 900 896 real entr(ngrid,nlay) 901 897 real q(ngrid,nlay) 902 integer lev_out ! niveau pour les print903 898 904 899 real qa(ngrid,nlay),detr(ngrid,nlay),wqd(ngrid,nlay+1) … … 909 904 integer isrf 910 905 911 lev_out=0 912 913 if (prt_level.ge.1) print*,'Q2 THERMCEL_DQ 0' 914 915 ! calcul du detrainement 906 !------------------------------------------------------------------------------ 907 ! Calcul du detrainement 908 !------------------------------------------------------------------------------ 909 916 910 do k=1,nlay 917 detr0(:,k) =fm0(:,k)-fm0(:,k+1)+entr0(:,k)918 masse0(:,k) =(pplev(:,k)-pplev(:,k+1))/RG911 detr0(:,k) = fm0(:,k) - fm0(:,k+1) + entr0(:,k) 912 masse0(:,k) = (pplev(:,k) - pplev(:,k+1)) / RG 919 913 enddo 920 921 914 915 !------------------------------------------------------------------------------ 922 916 ! Decalage vertical des entrainements et detrainements. 917 !------------------------------------------------------------------------------ 918 923 919 masse(:,1)=0.5*masse0(:,1) 924 920 entr(:,1)=0.5*entr0(:,1) 925 921 detr(:,1)=0.5*detr0(:,1) 926 922 fm(:,1)=0. 923 927 924 do k=1,nlay-1 928 925 masse(:,k+1)=0.5*(masse0(:,k)+masse0(:,k+1)) … … 931 928 fm(:,k+1)=fm(:,k)+entr(:,k)-detr(:,k) 932 929 enddo 930 933 931 fm(:,nlay+1)=0. 934 932 935 933 !!! nrlmd le 16/09/2010 936 934 ! calcul de la valeur dans les ascendances 937 ! do ig=1,ngrid 938 ! qa(ig,1)=q(ig,1) 939 ! enddo 940 !!! 941 942 !do isrf=1,nsrf 943 944 ! q(:,:)=therm_tke(:,:,isrf) 945 q(:,:)=therm_tke_max(:,:) 946 !!! nrlmd le 16/09/2010 935 ! do ig=1,ngrid 936 ! qa(ig,1) = q(ig,1) 937 ! enddo 938 939 q(:,:)=therm_tke_max(:,:) 940 947 941 do ig=1,ngrid 948 942 qa(ig,1)=q(ig,1) 949 943 enddo 950 !!! 951 952 if (1==1) then 953 do k=2,nlay 944 945 if (1==1) then 946 do k=2,nlay 947 do ig=1,ngrid 948 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.1.e-5*masse(ig,k)) then 949 qa(ig,k) = (fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) & 950 & / (fm(ig,k+1)+detr(ig,k)) 951 else 952 qa(ig,k)=q(ig,k) 953 endif 954 955 ! if (qa(ig,k).lt.0.) print *, 'WARNING: qa is negative!' 956 ! if (q(ig,k).lt.0.) print *, 'WARNING: q is negative!' 957 enddo 958 enddo 959 960 !------------------------------------------------------------------------------ 961 ! Calcul du flux subsident 962 !------------------------------------------------------------------------------ 963 964 do k=2,nlay 965 do ig=1,ngrid 966 wqd(ig,k) = fm(ig,k) * q(ig,k) 967 if (wqd(ig,k).lt.0.) print*,'WARNING: wqd is negative!' 968 enddo 969 enddo 970 954 971 do ig=1,ngrid 955 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. & 956 & 1.e-5*masse(ig,k)) then 957 qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k)) & 958 & /(fm(ig,k+1)+detr(ig,k)) 959 else 960 qa(ig,k)=q(ig,k) 961 endif 962 if (qa(ig,k).lt.0.) then 963 ! print*,'qa<0!!!' 964 endif 965 if (q(ig,k).lt.0.) then 966 ! print*,'q<0!!!' 967 endif 968 enddo 969 enddo 970 971 ! Calcul du flux subsident 972 973 do k=2,nlay 974 do ig=1,ngrid 975 wqd(ig,k)=fm(ig,k)*q(ig,k) 976 if (wqd(ig,k).lt.0.) then 977 ! print*,'wqd<0!!!' 978 endif 979 enddo 980 enddo 981 do ig=1,ngrid 982 wqd(ig,1)=0. 983 wqd(ig,nlay+1)=0. 984 enddo 985 972 wqd(ig,1) = 0. 973 wqd(ig,nlay+1) = 0. 974 enddo 975 976 !------------------------------------------------------------------------------ 986 977 ! Calcul des tendances 987 do k=1,nlay 988 do ig=1,ngrid 989 q(ig,k)=q(ig,k)+(detr(ig,k)*qa(ig,k)-entr(ig,k)*q(ig,k) & 990 & -wqd(ig,k)+wqd(ig,k+1)) & 991 & *ptimestep/masse(ig,k) 992 enddo 993 enddo 994 995 endif 996 997 therm_tke_max(:,:)=q(:,:) 978 !------------------------------------------------------------------------------ 979 980 do k=1,nlay 981 do ig=1,ngrid 982 q(ig,k) = q(ig,k) + ptimestep / masse(ig,k) & 983 & * (detr(ig,k) * qa(ig,k) - entr(ig,k) * q(ig,k) & 984 & - wqd(ig,k) + wqd(ig,k+1)) 985 enddo 986 enddo 987 endif 988 989 therm_tke_max(:,:) = q(:,:) 998 990 999 991 -
trunk/LMDZ.GENERIC/libf/phystd/thermcell_plume.F90
r2093 r2101 2 2 ! 3 3 ! 4 SUBROUTINE thermcell_plume(itap,ngrid,klev,ptimestep,ztv,&5 &zthl,po,zl,rhobarz,zlev,pplev,pphi,zpspsk, &6 &alim_star,alim_star_tot,lalim,f0,detr_star, &7 &entr_star,f_star,ztva,ztla,zqla,zqta,zha, &8 &zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis, &9 &lmin,lev_out,lunout1,igout)4 SUBROUTINE thermcell_plume(itap,ngrid,nlay,ptimestep,ztv, & 5 zthl,po,zl,rhobarz,zlev,pplev,pphi,zpspsk, & 6 alim_star,alim_star_tot,lalim,f0,detr_star, & 7 entr_star,f_star,ztva,ztla,zqla,zqta,zha, & 8 zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis, & 9 lmin,lev_out,lunout1,igout) 10 10 11 11 … … 36 36 INTEGER itap 37 37 INTEGER ngrid 38 INTEGER klev38 INTEGER nlay 39 39 INTEGER lunout1 40 40 INTEGER igout … … 42 42 43 43 REAL ptimestep ! time step 44 REAL ztv(ngrid, klev) ! TRPV environment45 REAL zthl(ngrid, klev) ! TP environment46 REAL po(ngrid, klev) ! qt environment47 REAL zl(ngrid, klev) ! ql environment48 REAL rhobarz(ngrid, klev) ! levels density49 REAL zlev(ngrid, klev+1) ! levels altitude50 REAL pplev(ngrid, klev+1) ! levels pressure51 REAL pphi(ngrid, klev) ! geopotential52 REAL zpspsk(ngrid, klev) ! Exner function44 REAL ztv(ngrid,nlay) ! TRPV environment 45 REAL zthl(ngrid,nlay) ! TP environment 46 REAL po(ngrid,nlay) ! qt environment 47 REAL zl(ngrid,nlay) ! ql environment 48 REAL rhobarz(ngrid,nlay) ! levels density 49 REAL zlev(ngrid,nlay+1) ! levels altitude 50 REAL pplev(ngrid,nlay+1) ! levels pressure 51 REAL pphi(ngrid,nlay) ! geopotential 52 REAL zpspsk(ngrid,nlay) ! Exner function 53 53 54 54 ! outputs: … … 60 60 INTEGER lmix_bis(ngrid) ! maximum vertical speed level (modified) 61 61 62 REAL alim_star(ngrid, klev) ! normalized alimentation62 REAL alim_star(ngrid,nlay) ! normalized alimentation 63 63 REAL alim_star_tot(ngrid) ! integrated alimentation 64 64 65 65 REAL f0(ngrid) ! previous time step mass flux norm 66 66 67 REAL detr_star(ngrid, klev) ! normalized detrainment68 REAL entr_star(ngrid, klev) ! normalized entrainment69 REAL f_star(ngrid, klev+1) ! normalized mass flux70 71 REAL ztva(ngrid, klev) ! TRPV plume (after mixing)72 REAL ztva_est(ngrid, klev) ! TRPV plume (before mixing)73 REAL ztla(ngrid, klev) ! TP plume74 REAL zqla(ngrid, klev) ! ql plume (after mixing)75 REAL zqta(ngrid, klev) ! qt plume76 REAL zha(ngrid, klev) ! TRPV plume77 78 REAL w_est(ngrid, klev+1) ! updraft square vertical speed (before mixing)79 REAL zw2(ngrid, klev+1) ! updraft square vertical speed (after mixing)80 81 REAL zqsatth(ngrid, klev) ! saturation vapor pressure (after mixing)67 REAL detr_star(ngrid,nlay) ! normalized detrainment 68 REAL entr_star(ngrid,nlay) ! normalized entrainment 69 REAL f_star(ngrid,nlay+1) ! normalized mass flux 70 71 REAL ztva(ngrid,nlay) ! TRPV plume (after mixing) 72 REAL ztva_est(ngrid,nlay) ! TRPV plume (before mixing) 73 REAL ztla(ngrid,nlay) ! TP plume 74 REAL zqla(ngrid,nlay) ! ql plume (after mixing) 75 REAL zqta(ngrid,nlay) ! qt plume 76 REAL zha(ngrid,nlay) ! TRPV plume 77 78 REAL w_est(ngrid,nlay+1) ! updraft square vertical speed (before mixing) 79 REAL zw2(ngrid,nlay+1) ! updraft square vertical speed (after mixing) 80 81 REAL zqsatth(ngrid,nlay) ! saturation vapor pressure (after mixing) 82 82 83 83 ! local: … … 88 88 INTEGER lm 89 89 90 REAL zqla_est(ngrid, klev) ! ql plume (before mixing)91 REAL zta_est(ngrid, klev) ! TR plume (before mixing)92 REAL zbuoy(ngrid, klev) ! plume buoyancy93 REAL zbuoyjam(ngrid, klev) ! plume buoyancy (modified)90 REAL zqla_est(ngrid,nlay) ! ql plume (before mixing) 91 REAL zta_est(ngrid,nlay) ! TR plume (before mixing) 92 REAL zbuoy(ngrid,nlay) ! plume buoyancy 93 REAL zbuoyjam(ngrid,nlay) ! plume buoyancy (modified) 94 94 95 95 REAL ztemp(ngrid) ! temperature for saturation vapor pressure computation in plume 96 96 REAL zqsat(ngrid) ! saturation vapor pressure (before mixing) 97 97 REAL zdz ! layers height 98 REAL ztv2(ngrid, klev) ! ztv + d_temp * Dirac(l=lmin)98 REAL ztv2(ngrid,nlay) ! ztv + d_temp * Dirac(l=lmin) 99 99 100 100 REAL zalpha ! 101 REAL zdqt(ngrid, klev) !101 REAL zdqt(ngrid,nlay) ! 102 102 REAL zbetalpha ! 103 103 REAL zdw2 ! … … 118 118 REAL zltup ! useless here 119 119 120 REAL dummy120 REAL psat ! dummy argument for Psat_water() 121 121 122 122 LOGICAL active(ngrid) ! if the plume is active at ig,l (speed and incoming mass flux > 0 or l=lmin) … … 161 161 162 162 ztv2(:,:) = ztv(:,:) 163 ztv2(:,linf) = ztv 2(:,linf) + d_temp163 ztv2(:,linf) = ztv(:,linf) + d_temp 164 164 165 165 !============================================================================== … … 178 178 active(ig) = .false. 179 179 l = linf 180 DO WHILE ((.not.active(ig)) .and. pplev(ig,l+1).gt.pres_limit .and. l.lt. klev)180 DO WHILE ((.not.active(ig)) .and. pplev(ig,l+1).gt.pres_limit .and. l.lt.nlay) 181 181 IF (ztv2(ig,l).gt.ztv2(ig,l+1)) THEN 182 182 active(ig) = .true. … … 190 190 ! AB : On pourrait n'appeler thermcell_alim que si la plume est active 191 191 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 CALL thermcell_alim(ngrid, klev,ztv2,zlev,alim_star,lalim,lmin)192 CALL thermcell_alim(ngrid,nlay,ztv2,zlev,alim_star,lalim,lmin) 193 193 194 194 !============================================================================== … … 222 222 !============================================================================== 223 223 224 DO l=2, klev-1224 DO l=2,nlay-1 225 225 226 226 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 242 242 243 243 DO ig=1,ngrid 244 CALL Psat_water(ztemp(ig), pplev(ig,l), dummy, zqsat(ig))244 CALL Psat_water(ztemp(ig), pplev(ig,l), psat, zqsat(ig)) 245 245 ENDDO 246 246 … … 434 434 DO ig=1,ngrid 435 435 IF (activetmp(ig)) THEN 436 CALL Psat_water(ztemp(ig), pplev(ig,l), dummy, zqsatth(ig,l))436 CALL Psat_water(ztemp(ig), pplev(ig,l), psat, zqsatth(ig,l)) 437 437 ENDIF 438 438 ENDDO
Note: See TracChangeset
for help on using the changeset viewer.