Changeset 1472 for LMDZ5/branches/LMDZ5V2.0-dev/libf/phylmd
- Timestamp:
- Dec 23, 2010, 5:38:42 PM (14 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/branches/LMDZ5V2.0-dev/libf/phylmd/fisrtilp.F90
r1463 r1472 2 2 ! $Id$ 3 3 ! 4 c 5 SUBROUTINE fisrtilp(dtime,paprs,pplay,t,q,ptconv,ratqs, 6 s d_t, d_q, d_ql, rneb, radliq, rain, snow, 7 s pfrac_impa, pfrac_nucl, pfrac_1nucl, 8 s frac_impa, frac_nucl, 9 s prfl, psfl, rhcl, zqta, fraca, 10 s ztv, zpspsk, ztla, zthl, iflag_cldcon) 11 12 c 13 USE dimphy 14 IMPLICIT none 15 c====================================================================== 16 c Auteur(s): Z.X. Li (LMD/CNRS) 17 c Date: le 20 mars 1995 18 c Objet: condensation et precipitation stratiforme. 19 c schema de nuage 20 c====================================================================== 21 c====================================================================== 22 cym#include "dimensions.h" 23 cym#include "dimphy.h" 24 #include "YOMCST.h" 25 #include "tracstoke.h" 26 #include "fisrtilp.h" 27 c 28 c Arguments: 29 c 30 REAL dtime ! intervalle du temps (s) 31 REAL paprs(klon,klev+1) ! pression a inter-couche 32 REAL pplay(klon,klev) ! pression au milieu de couche 33 REAL t(klon,klev) ! temperature (K) 34 REAL q(klon,klev) ! humidite specifique (kg/kg) 35 REAL d_t(klon,klev) ! incrementation de la temperature (K) 36 REAL d_q(klon,klev) ! incrementation de la vapeur d'eau 37 REAL d_ql(klon,klev) ! incrementation de l'eau liquide 38 REAL rneb(klon,klev) ! fraction nuageuse 39 REAL radliq(klon,klev) ! eau liquide utilisee dans rayonnements 40 REAL rhcl(klon,klev) ! humidite relative en ciel clair 41 REAL rain(klon) ! pluies (mm/s) 42 REAL snow(klon) ! neige (mm/s) 43 REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s) 44 REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s) 45 REAL ztv(klon,klev) 46 REAL zqta(klon,klev),fraca(klon,klev) 47 REAL sigma1(klon,klev),sigma2(klon,klev) 48 REAL qltot(klon,klev),ctot(klon,klev) 49 REAL zpspsk(klon,klev),ztla(klon,klev) 50 REAL zthl(klon,klev) 51 52 logical lognormale(klon) 53 54 cAA 55 c Coeffients de fraction lessivee : pour OFF-LINE 56 c 57 REAL pfrac_nucl(klon,klev) 58 REAL pfrac_1nucl(klon,klev) 59 REAL pfrac_impa(klon,klev) 60 c 61 c Fraction d'aerosols lessivee par impaction et par nucleation 62 c POur ON-LINE 63 c 64 REAL frac_impa(klon,klev) 65 REAL frac_nucl(klon,klev) 66 real zct ,zcl 67 cAA 68 c 69 c Options du programme: 70 c 71 REAL seuil_neb ! un nuage existe vraiment au-dela 72 PARAMETER (seuil_neb=0.001) 73 74 INTEGER ninter ! sous-intervals pour la precipitation 75 INTEGER ncoreczq 76 INTEGER iflag_cldcon 77 PARAMETER (ninter=5) 78 LOGICAL evap_prec ! evaporation de la pluie 79 PARAMETER (evap_prec=.TRUE.) 80 REAL ratqs(klon,klev) ! determine la largeur de distribution de vapeur 81 logical ptconv(klon,klev) ! determine la largeur de distribution de vapeur 82 83 real zpdf_sig(klon),zpdf_k(klon),zpdf_delta(klon) 84 real Zpdf_a(klon),zpdf_b(klon),zpdf_e1(klon),zpdf_e2(klon) 85 real erf 86 REAL qcloud(klon) 87 c 88 LOGICAL cpartiel ! condensation partielle 89 PARAMETER (cpartiel=.TRUE.) 90 REAL t_coup 91 PARAMETER (t_coup=234.0) 92 c 93 c Variables locales: 94 c 95 INTEGER i, k, n, kk 96 REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5 97 REAL zrfl(klon), zrfln(klon), zqev, zqevt 98 REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq 99 REAL ztglace, zt(klon) 100 INTEGER nexpo ! exponentiel pour glace/eau 101 REAL zdz(klon),zrho(klon),ztot , zrhol(klon) 102 REAL zchau ,zfroi ,zfice(klon),zneb(klon) 103 c 104 LOGICAL appel1er 105 SAVE appel1er 106 c$OMP THREADPRIVATE(appel1er) 107 c 108 c--------------------------------------------------------------- 109 c 110 cAA Variables traceurs: 111 cAA Provisoire !!! Parametres alpha du lessivage 112 cAA A priori on a 4 scavenging # possibles 113 c 114 REAL a_tr_sca(4) 115 save a_tr_sca 116 c$OMP THREADPRIVATE(a_tr_sca) 117 c 118 c Variables intermediaires 119 c 120 REAL zalpha_tr 121 REAL zfrac_lessi 122 REAL zprec_cond(klon) 123 cAA 124 REAL zmair, zcpair, zcpeau 125 C Pour la conversion eau-neige 126 REAL zlh_solid(klon), zm_solid 127 cIM 128 cym INTEGER klevm1 129 c--------------------------------------------------------------- 130 c 131 c Fonctions en ligne: 132 c 133 REAL fallvs,fallvc ! vitesse de chute pour crystaux de glace 134 REAL zzz 135 #include "YOETHF.h" 136 #include "FCTTRE.h" 137 fallvc (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_con 138 fallvs (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_lsc 139 c 140 DATA appel1er /.TRUE./ 141 cym 142 zdelq=0.0 143 144 print*,'NUAGES4 A. JAM' 145 IF (appel1er) THEN 146 c 147 PRINT*, 'fisrtilp, ninter:', ninter 148 PRINT*, 'fisrtilp, evap_prec:', evap_prec 149 PRINT*, 'fisrtilp, cpartiel:', cpartiel 150 IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN 151 PRINT*, 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime 152 PRINT*, 'Je prefere un sous-intervalle de 6 minutes' 153 c CALL abort 154 ENDIF 155 appel1er = .FALSE. 156 c 157 cAA initialiation provisoire 158 a_tr_sca(1) = -0.5 159 a_tr_sca(2) = -0.5 160 a_tr_sca(3) = -0.5 161 a_tr_sca(4) = -0.5 162 c 163 cAA Initialisation a 1 des coefs des fractions lessivees 164 c 165 !cdir collapse 166 DO k = 1, klev 167 DO i = 1, klon 168 pfrac_nucl(i,k)=1. 169 pfrac_1nucl(i,k)=1. 170 pfrac_impa(i,k)=1. 171 ENDDO 172 ENDDO 173 174 ENDIF ! test sur appel1er 175 c 176 cMAf Initialisation a 0 de zoliq 177 c DO i = 1, klon 178 c zoliq(i)=0. 179 c ENDDO 180 c Determiner les nuages froids par leur temperature 181 c nexpo regle la raideur de la transition eau liquide / eau glace. 182 c 183 ztglace = RTT - 15.0 184 nexpo = 6 185 ccc nexpo = 1 186 c 187 c Initialiser les sorties: 188 c 189 !cdir collapse 190 DO k = 1, klev+1 191 DO i = 1, klon 192 prfl(i,k) = 0.0 193 psfl(i,k) = 0.0 194 ENDDO 195 ENDDO 196 197 !cdir collapse 198 DO k = 1, klev 199 DO i = 1, klon 200 d_t(i,k) = 0.0 201 d_q(i,k) = 0.0 202 d_ql(i,k) = 0.0 203 rneb(i,k) = 0.0 204 radliq(i,k) = 0.0 205 frac_nucl(i,k) = 1. 206 frac_impa(i,k) = 1. 207 ENDDO 208 ENDDO 209 DO i = 1, klon 210 rain(i) = 0.0 211 snow(i) = 0.0 212 zoliq(i)=0. 213 c ENDDO 214 c 215 c Initialiser le flux de precipitation a zero 216 c 217 c DO i = 1, klon 218 zrfl(i) = 0.0 219 zneb(i) = seuil_neb 220 ENDDO 221 c 222 c 223 cAA Pour plus de securite 224 225 zalpha_tr = 0. 226 zfrac_lessi = 0. 227 228 cAA---------------------------------------------------------- 229 c 230 ncoreczq=0 231 c Boucle verticale (du haut vers le bas) 232 c 233 cIM : klevm1 234 cym klevm1=klev-1 235 DO 9999 k = klev, 1, -1 236 c 237 cAA---------------------------------------------------------- 238 c 239 DO i = 1, klon 240 zt(i)=t(i,k) 241 zq(i)=q(i,k) 242 ENDDO 243 c 244 c Calculer la varition de temp. de l'air du a la chaleur sensible 245 C transporter par la pluie. 246 C Il resterait a rajouter cet effet de la chaleur sensible sur les 247 C flux de surface, du a la diff. de temp. entre le 1er niveau et la 248 C surface. 249 C 250 IF(k.LE.klevm1) THEN 251 DO i = 1, klon 252 cIM 253 zmair=(paprs(i,k)-paprs(i,k+1))/RG 254 zcpair=RCPD*(1.0+RVTMP2*zq(i)) 255 zcpeau=RCPD*RVTMP2 256 zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zrfl(i)*dtime*zcpeau 257 $ + zmair*zcpair*zt(i) ) 258 $ / (zmair*zcpair + zrfl(i)*dtime*zcpeau) 259 C C WRITE (6,*) 'cppluie ', zt(i)-(t(i,k+1)+d_t(i,k+1)) 260 ENDDO 261 ENDIF 262 c 263 c 264 c Calculer l'evaporation de la precipitation 265 c 266 267 268 IF (evap_prec) THEN 269 DO i = 1, klon 270 IF (zrfl(i) .GT.0.) THEN 271 IF (thermcep) THEN 272 zdelta=MAX(0.,SIGN(1.,RTT-zt(i))) 273 zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k) 274 zqs(i)=MIN(0.5,zqs(i)) 275 zcor=1./(1.-RETV*zqs(i)) 276 zqs(i)=zqs(i)*zcor 277 ELSE 278 IF (zt(i) .LT. t_coup) THEN 279 zqs(i) = qsats(zt(i)) / pplay(i,k) 280 ELSE 281 zqs(i) = qsatl(zt(i)) / pplay(i,k) 4 ! 5 SUBROUTINE fisrtilp(dtime,paprs,pplay,t,q,ptconv,ratqs, & 6 d_t, d_q, d_ql, rneb, radliq, rain, snow, & 7 pfrac_impa, pfrac_nucl, pfrac_1nucl, & 8 frac_impa, frac_nucl, & 9 prfl, psfl, rhcl, zqta, fraca, & 10 ztv, zpspsk, ztla, zthl, iflag_cldcon) 11 12 ! 13 USE dimphy 14 IMPLICIT none 15 !====================================================================== 16 ! Auteur(s): Z.X. Li (LMD/CNRS) 17 ! Date: le 20 mars 1995 18 ! Objet: condensation et precipitation stratiforme. 19 ! schema de nuage 20 !====================================================================== 21 !====================================================================== 22 !ym include "dimensions.h" 23 !ym include "dimphy.h" 24 include "YOMCST.h" 25 include "tracstoke.h" 26 include "fisrtilp.h" 27 ! 28 ! Arguments: 29 ! 30 REAL dtime ! intervalle du temps (s) 31 REAL paprs(klon,klev+1) ! pression a inter-couche 32 REAL pplay(klon,klev) ! pression au milieu de couche 33 REAL t(klon,klev) ! temperature (K) 34 REAL q(klon,klev) ! humidite specifique (kg/kg) 35 REAL d_t(klon,klev) ! incrementation de la temperature (K) 36 REAL d_q(klon,klev) ! incrementation de la vapeur d'eau 37 REAL d_ql(klon,klev) ! incrementation de l'eau liquide 38 REAL rneb(klon,klev) ! fraction nuageuse 39 REAL radliq(klon,klev) ! eau liquide utilisee dans rayonnements 40 REAL rhcl(klon,klev) ! humidite relative en ciel clair 41 REAL rain(klon) ! pluies (mm/s) 42 REAL snow(klon) ! neige (mm/s) 43 REAL prfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s) 44 REAL psfl(klon,klev+1) ! flux d'eau precipitante aux interfaces (kg/m2/s) 45 REAL ztv(klon,klev) 46 REAL zqta(klon,klev),fraca(klon,klev) 47 REAL sigma1(klon,klev),sigma2(klon,klev) 48 REAL qltot(klon,klev),ctot(klon,klev) 49 REAL zpspsk(klon,klev),ztla(klon,klev) 50 REAL zthl(klon,klev) 51 52 logical lognormale(klon) 53 54 !AA 55 ! Coeffients de fraction lessivee : pour OFF-LINE 56 ! 57 REAL pfrac_nucl(klon,klev) 58 REAL pfrac_1nucl(klon,klev) 59 REAL pfrac_impa(klon,klev) 60 ! 61 ! Fraction d'aerosols lessivee par impaction et par nucleation 62 ! POur ON-LINE 63 ! 64 REAL frac_impa(klon,klev) 65 REAL frac_nucl(klon,klev) 66 real zct ,zcl 67 !AA 68 ! 69 ! Options du programme: 70 ! 71 REAL seuil_neb ! un nuage existe vraiment au-dela 72 PARAMETER (seuil_neb=0.001) 73 74 INTEGER ninter ! sous-intervals pour la precipitation 75 INTEGER ncoreczq 76 INTEGER iflag_cldcon 77 PARAMETER (ninter=5) 78 LOGICAL evap_prec ! evaporation de la pluie 79 PARAMETER (evap_prec=.TRUE.) 80 REAL ratqs(klon,klev) ! determine la largeur de distribution de vapeur 81 logical ptconv(klon,klev) ! determine la largeur de distribution de vapeur 82 83 real zpdf_sig(klon),zpdf_k(klon),zpdf_delta(klon) 84 real Zpdf_a(klon),zpdf_b(klon),zpdf_e1(klon),zpdf_e2(klon) 85 real erf 86 REAL qcloud(klon) 87 ! 88 LOGICAL cpartiel ! condensation partielle 89 PARAMETER (cpartiel=.TRUE.) 90 REAL t_coup 91 PARAMETER (t_coup=234.0) 92 ! 93 ! Variables locales: 94 ! 95 INTEGER i, k, n, kk 96 REAL zqs(klon), zdqs(klon), zdelta, zcor, zcvm5 97 REAL zrfl(klon), zrfln(klon), zqev, zqevt 98 REAL zoliq(klon), zcond(klon), zq(klon), zqn(klon), zdelq 99 REAL ztglace, zt(klon) 100 INTEGER nexpo ! exponentiel pour glace/eau 101 REAL zdz(klon),zrho(klon),ztot , zrhol(klon) 102 REAL zchau ,zfroi ,zfice(klon),zneb(klon) 103 ! 104 LOGICAL appel1er 105 SAVE appel1er 106 !$OMP THREADPRIVATE(appel1er) 107 ! 108 !--------------------------------------------------------------- 109 ! 110 !AA Variables traceurs: 111 !AA Provisoire !!! Parametres alpha du lessivage 112 !AA A priori on a 4 scavenging # possibles 113 ! 114 REAL a_tr_sca(4) 115 save a_tr_sca 116 !$OMP THREADPRIVATE(a_tr_sca) 117 ! 118 ! Variables intermediaires 119 ! 120 REAL zalpha_tr 121 REAL zfrac_lessi 122 REAL zprec_cond(klon) 123 !AA 124 REAL zmair, zcpair, zcpeau 125 ! Pour la conversion eau-neige 126 REAL zlh_solid(klon), zm_solid 127 !IM 128 !ym INTEGER klevm1 129 !--------------------------------------------------------------- 130 ! 131 ! Fonctions en ligne: 132 ! 133 REAL fallvs,fallvc ! vitesse de chute pour crystaux de glace 134 REAL zzz 135 include "YOETHF.h" 136 include "FCTTRE.h" 137 fallvc (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_con 138 fallvs (zzz) = 3.29/2.0 * ((zzz)**0.16) * ffallv_lsc 139 ! 140 DATA appel1er /.TRUE./ 141 !ym 142 zdelq=0.0 143 144 print*,'NUAGES4 A. JAM' 145 IF (appel1er) THEN 146 ! 147 PRINT*, 'fisrtilp, ninter:', ninter 148 PRINT*, 'fisrtilp, evap_prec:', evap_prec 149 PRINT*, 'fisrtilp, cpartiel:', cpartiel 150 IF (ABS(dtime/REAL(ninter)-360.0).GT.0.001) THEN 151 PRINT*, 'fisrtilp: Ce n est pas prevu, voir Z.X.Li', dtime 152 PRINT*, 'Je prefere un sous-intervalle de 6 minutes' 153 ! CALL abort 154 ENDIF 155 appel1er = .FALSE. 156 ! 157 !AA initialiation provisoire 158 a_tr_sca(1) = -0.5 159 a_tr_sca(2) = -0.5 160 a_tr_sca(3) = -0.5 161 a_tr_sca(4) = -0.5 162 ! 163 !AA Initialisation a 1 des coefs des fractions lessivees 164 ! 165 !cdir collapse 166 DO k = 1, klev 167 DO i = 1, klon 168 pfrac_nucl(i,k)=1. 169 pfrac_1nucl(i,k)=1. 170 pfrac_impa(i,k)=1. 171 ENDDO 172 ENDDO 173 174 ENDIF ! test sur appel1er 175 ! 176 !MAf Initialisation a 0 de zoliq 177 ! DO i = 1, klon 178 ! zoliq(i)=0. 179 ! ENDDO 180 ! Determiner les nuages froids par leur temperature 181 ! nexpo regle la raideur de la transition eau liquide / eau glace. 182 ! 183 ztglace = RTT - 15.0 184 nexpo = 6 185 !cc nexpo = 1 186 ! 187 ! Initialiser les sorties: 188 ! 189 !cdir collapse 190 DO k = 1, klev+1 191 DO i = 1, klon 192 prfl(i,k) = 0.0 193 psfl(i,k) = 0.0 194 ENDDO 195 ENDDO 196 197 !cdir collapse 198 DO k = 1, klev 199 DO i = 1, klon 200 d_t(i,k) = 0.0 201 d_q(i,k) = 0.0 202 d_ql(i,k) = 0.0 203 rneb(i,k) = 0.0 204 radliq(i,k) = 0.0 205 frac_nucl(i,k) = 1. 206 frac_impa(i,k) = 1. 207 ENDDO 208 ENDDO 209 DO i = 1, klon 210 rain(i) = 0.0 211 snow(i) = 0.0 212 zoliq(i)=0. 213 ! ENDDO 214 ! 215 ! Initialiser le flux de precipitation a zero 216 ! 217 ! DO i = 1, klon 218 zrfl(i) = 0.0 219 zneb(i) = seuil_neb 220 ENDDO 221 ! 222 ! 223 !AA Pour plus de securite 224 225 zalpha_tr = 0. 226 zfrac_lessi = 0. 227 228 !AA---------------------------------------------------------- 229 ! 230 ncoreczq=0 231 ! Boucle verticale (du haut vers le bas) 232 ! 233 !IM : klevm1 234 !ym klevm1=klev-1 235 DO k = klev, 1, -1 236 ! 237 !AA---------------------------------------------------------- 238 ! 239 DO i = 1, klon 240 zt(i)=t(i,k) 241 zq(i)=q(i,k) 242 ENDDO 243 ! 244 ! Calculer la varition de temp. de l'air du a la chaleur sensible 245 ! transporter par la pluie. 246 ! Il resterait a rajouter cet effet de la chaleur sensible sur les 247 ! flux de surface, du a la diff. de temp. entre le 1er niveau et la 248 ! surface. 249 ! 250 IF(k.LE.klevm1) THEN 251 DO i = 1, klon 252 !IM 253 zmair=(paprs(i,k)-paprs(i,k+1))/RG 254 zcpair=RCPD*(1.0+RVTMP2*zq(i)) 255 zcpeau=RCPD*RVTMP2 256 zt(i) = ( (t(i,k+1)+d_t(i,k+1))*zrfl(i)*dtime*zcpeau & 257 + zmair*zcpair*zt(i) ) & 258 / (zmair*zcpair + zrfl(i)*dtime*zcpeau) 259 ! C WRITE (6,*) 'cppluie ', zt(i)-(t(i,k+1)+d_t(i,k+1)) 260 ENDDO 261 ENDIF 262 ! 263 ! 264 ! Calculer l'evaporation de la precipitation 265 ! 266 267 268 IF (evap_prec) THEN 269 DO i = 1, klon 270 IF (zrfl(i) .GT.0.) THEN 271 IF (thermcep) THEN 272 zdelta=MAX(0.,SIGN(1.,RTT-zt(i))) 273 zqs(i)= R2ES*FOEEW(zt(i),zdelta)/pplay(i,k) 274 zqs(i)=MIN(0.5,zqs(i)) 275 zcor=1./(1.-RETV*zqs(i)) 276 zqs(i)=zqs(i)*zcor 277 ELSE 278 IF (zt(i) .LT. t_coup) THEN 279 zqs(i) = qsats(zt(i)) / pplay(i,k) 280 ELSE 281 zqs(i) = qsatl(zt(i)) / pplay(i,k) 282 ENDIF 283 ENDIF 284 zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) ) 285 zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i)) & 286 * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG 287 zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) & 288 * RG*dtime/(paprs(i,k)-paprs(i,k+1)) 289 zqev = MIN (zqev, zqevt) 290 zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) & 291 /RG/dtime 292 293 ! pour la glace, on ré-évapore toute la précip dans la 294 ! couche du dessous 295 ! la glace venant de la couche du dessus est simplement 296 ! dans la couche du dessous. 297 298 IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0. 299 300 zq(i) = zq(i) - (zrfln(i)-zrfl(i)) & 301 * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime 302 zt(i) = zt(i) + (zrfln(i)-zrfl(i)) & 303 * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime & 304 * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) 305 zrfl(i) = zrfln(i) 282 306 ENDIF 283 ENDIF 284 zqev = MAX (0.0, (zqs(i)-zq(i))*zneb(i) ) 285 zqevt = coef_eva * (1.0-zq(i)/zqs(i)) * SQRT(zrfl(i)) 286 . * (paprs(i,k)-paprs(i,k+1))/pplay(i,k)*zt(i)*RD/RG 287 zqevt = MAX(0.0,MIN(zqevt,zrfl(i))) 288 . * RG*dtime/(paprs(i,k)-paprs(i,k+1)) 289 zqev = MIN (zqev, zqevt) 290 zrfln(i) = zrfl(i) - zqev*(paprs(i,k)-paprs(i,k+1)) 291 . /RG/dtime 292 293 c pour la glace, on r�vapore toute la pr�ip dans la couche du dessous 294 c la glace venant de la couche du dessus est simplement dans la couche 295 c du dessous. 296 297 IF (zt(i) .LT. t_coup.and.reevap_ice) zrfln(i)=0. 298 299 zq(i) = zq(i) - (zrfln(i)-zrfl(i)) 300 . * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime 301 zt(i) = zt(i) + (zrfln(i)-zrfl(i)) 302 . * (RG/(paprs(i,k)-paprs(i,k+1)))*dtime 303 . * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) 304 zrfl(i) = zrfln(i) 305 ENDIF 306 ENDDO 307 ENDIF 308 c 309 c Calculer Qs et L/Cp*dQs/dT: 310 c 311 IF (thermcep) THEN 312 DO i = 1, klon 307 ENDDO 308 ENDIF 309 ! 310 ! Calculer Qs et L/Cp*dQs/dT: 311 ! 312 IF (thermcep) THEN 313 DO i = 1, klon 313 314 zdelta = MAX(0.,SIGN(1.,RTT-zt(i))) 314 315 zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta … … 319 320 zqs(i) = zqs(i)*zcor 320 321 zdqs(i) = FOEDE(zt(i),zdelta,zcvm5,zqs(i),zcor) 321 ENDDO 322 ELSE 323 DO i = 1, klon 324 IF (zt(i).LT.t_coup) THEN 325 zqs(i) = qsats(zt(i))/pplay(i,k) 326 zdqs(i) = dqsats(zt(i),zqs(i)) 327 ELSE 328 zqs(i) = qsatl(zt(i))/pplay(i,k) 329 zdqs(i) = dqsatl(zt(i),zqs(i)) 330 ENDIF 331 ENDDO 332 ENDIF 333 c 334 c Determiner la condensation partielle et calculer la quantite 335 c de l'eau condensee: 336 c 337 338 IF (cpartiel) THEN 339 340 c print*,'Dans partiel k=',k 341 c 342 c Calcul de l'eau condensee et de la fraction nuageuse et de l'eau 343 c nuageuse a partir des PDF de Sandrine Bony. 344 c rneb : fraction nuageuse 345 c zqn : eau totale dans le nuage 346 c zcond : eau condensee moyenne dans la maille. 347 c on prend en compte le r�hauffement qui diminue la partie condensee 348 c 349 c Version avec les raqts 350 351 if (iflag_pdf.eq.0) then 322 ENDDO 323 ELSE 324 DO i = 1, klon 325 IF (zt(i).LT.t_coup) THEN 326 zqs(i) = qsats(zt(i))/pplay(i,k) 327 zdqs(i) = dqsats(zt(i),zqs(i)) 328 ELSE 329 zqs(i) = qsatl(zt(i))/pplay(i,k) 330 zdqs(i) = dqsatl(zt(i),zqs(i)) 331 ENDIF 332 ENDDO 333 ENDIF 334 ! 335 ! Determiner la condensation partielle et calculer la quantite 336 ! de l'eau condensee: 337 ! 338 339 IF (cpartiel) THEN 340 341 ! print*,'Dans partiel k=',k 342 ! 343 ! Calcul de l'eau condensee et de la fraction nuageuse et de l'eau 344 ! nuageuse a partir des PDF de Sandrine Bony. 345 ! rneb : fraction nuageuse 346 ! zqn : eau totale dans le nuage 347 ! zcond : eau condensee moyenne dans la maille. 348 ! on prend en compte le réchauffement qui diminue la partie 349 ! condensee 350 ! 351 ! Version avec les raqts 352 353 if (iflag_pdf.eq.0) then 352 354 353 355 do i=1,klon 354 zdelq = min(ratqs(i,k),0.99) * zq(i)355 rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq)356 zqn(i) = (zq(i)+zdelq+zqs(i))/2.0356 zdelq = min(ratqs(i,k),0.99) * zq(i) 357 rneb(i,k) = (zq(i)+zdelq-zqs(i)) / (2.0*zdelq) 358 zqn(i) = (zq(i)+zdelq+zqs(i))/2.0 357 359 enddo 358 360 359 360 c 361 cVersion avec les nouvelles PDFs.361 else 362 ! 363 ! Version avec les nouvelles PDFs. 362 364 do i=1,klon 363 365 if(zq(i).lt.1.e-15) then 364 ncoreczq=ncoreczq+1365 zq(i)=1.e-15366 ncoreczq=ncoreczq+1 367 zq(i)=1.e-15 366 368 endif 367 enddo 368 369 370 371 call cloudth(klon,klev,k,ztv,372 . zq,zqta,fraca,373 . qcloud,ctot,zpspsk,paprs,ztla,zthl,374 .ratqs,zqs,t)375 376 369 enddo 370 371 if (iflag_cldcon>=5) then 372 373 call cloudth(klon,klev,k,ztv, & 374 zq,zqta,fraca, & 375 qcloud,ctot,zpspsk,paprs,ztla,zthl, & 376 ratqs,zqs,t) 377 378 do i=1,klon 377 379 rneb(i,k)=ctot(i,k) 378 380 zqn(i)=qcloud(i) 379 enddo 380 381 enddo 382 383 endif 384 385 if (iflag_cldcon <= 4) then 386 lognormale = .true. 387 elseif (iflag_cldcon == 6) then 388 ! lognormale en l'absence des thermiques 389 lognormale = fraca(:,k) < 1e-10 390 else 391 ! Dans le cas iflag_cldcon=5, on prend systématiquement la 392 ! bi-gaussienne 393 lognormale = .false. 394 end if 395 396 do i=1,klon 397 if (lognormale(i)) then 398 zpdf_sig(i)=ratqs(i,k)*zq(i) 399 zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2)) 400 zpdf_delta(i)=log(zq(i)/zqs(i)) 401 zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.)) 402 zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.)) 403 zpdf_e1(i)=zpdf_a(i)-zpdf_b(i) 404 zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i)) 405 zpdf_e1(i)=1.-erf(zpdf_e1(i)) 406 zpdf_e2(i)=zpdf_a(i)+zpdf_b(i) 407 zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i)) 408 zpdf_e2(i)=1.-erf(zpdf_e2(i)) 381 409 endif 382 383 ! Pour iflag_cldcon<=4, on prend toujours la lognormale 384 ! Dans le cas iflag_cldcon=5, on prend systématiquement la bi-gaussienne 385 ! Dans le cas iflagÃ_cldcon=6, on prend la lognormale en absence des thermiques 386 387 lognormale(:)= 388 . iflag_cldcon<=4.or.(iflag_cldcon==6.and.fraca(:,k)<1.e-10) 389 do i=1,klon 390 if (lognormale(i)) then 391 zpdf_sig(i)=ratqs(i,k)*zq(i) 392 zpdf_k(i)=-sqrt(log(1.+(zpdf_sig(i)/zq(i))**2)) 393 zpdf_delta(i)=log(zq(i)/zqs(i)) 394 zpdf_a(i)=zpdf_delta(i)/(zpdf_k(i)*sqrt(2.)) 395 zpdf_b(i)=zpdf_k(i)/(2.*sqrt(2.)) 396 zpdf_e1(i)=zpdf_a(i)-zpdf_b(i) 397 zpdf_e1(i)=sign(min(abs(zpdf_e1(i)),5.),zpdf_e1(i)) 398 zpdf_e1(i)=1.-erf(zpdf_e1(i)) 399 zpdf_e2(i)=zpdf_a(i)+zpdf_b(i) 400 zpdf_e2(i)=sign(min(abs(zpdf_e2(i)),5.),zpdf_e2(i)) 401 zpdf_e2(i)=1.-erf(zpdf_e2(i)) 402 endif 403 enddo 404 405 do i=1,klon 406 if (lognormale(i)) then 407 if (zpdf_e1(i).lt.1.e-10) then 408 rneb(i,k)=0. 409 zqn(i)=zqs(i) 410 else 411 rneb(i,k)=0.5*zpdf_e1(i) 412 zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i) 413 endif 414 endif 415 416 enddo 410 enddo 411 412 do i=1,klon 413 if (lognormale(i)) then 414 if (zpdf_e1(i).lt.1.e-10) then 415 rneb(i,k)=0. 416 zqn(i)=zqs(i) 417 else 418 rneb(i,k)=0.5*zpdf_e1(i) 419 zqn(i)=zq(i)*zpdf_e2(i)/zpdf_e1(i) 420 endif 421 endif 422 423 enddo 417 424 418 425 … … 435 442 ENDIF 436 443 ENDDO 437 ! do i=1,klon438 ! IF (rneb(i,k) .LE. 0.0) zqn(i) = 0.0439 ! IF (rneb(i,k) .GE. 1.0) zqn(i) = zq(i)440 ! rneb(i,k) = MAX(0.0,MIN(1.0,rneb(i,k)))441 !c zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1.+zdqs(i))442 !c On ne divise pas par 1+zdqs pour forcer a avoir l'eau predite par443 !c la convection.444 !c ATTENTION !!! Il va falloir verifier tout ca.445 ! zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)446 !c print*,'ZDQS ',zdqs(i)447 !c--Olivier448 ! rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i)449 ! IF (rneb(i,k) .LE. 0.0) rhcl(i,k)=zq(i)/zqs(i)450 ! IF (rneb(i,k) .GE. 1.0) rhcl(i,k)=1.0451 !c--fin452 ! ENDDO453 454 455 456 457 458 459 460 461 462 463 c 464 465 466 czt(i) = zt(i) + zcond(i) * RLVTT/RCPD467 468 469 c 470 cPartager l'eau condensee en precipitation et eau liquide nuageuse471 c 472 473 IF (rneb(i,k).GT.0.0) THEN474 zoliq(i) = zcond(i)475 zrho(i) = pplay(i,k) / zt(i) / RD476 zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG)477 zfice(i) = 1.0 - (zt(i)-ztglace) / (273.13-ztglace)478 zfice(i) = MIN(MAX(zfice(i),0.0),1.0)479 zfice(i) = zfice(i)**nexpo480 zneb(i) = MAX(rneb(i,k), seuil_neb)481 radliq(i,k) = zoliq(i)/REAL(ninter+1)482 ENDIF483 484 c 485 486 DO i = 1, klon487 IF (rneb(i,k).GT.0.0) THEN488 zrhol(i) = zrho(i) * zoliq(i) / zneb(i)489 490 IF (zneb(i).EQ.seuil_neb) THEN491 ztot = 0.0492 ELSE493 cquantite d'eau a eliminer: zchau494 cmeme chose pour la glace: zfroi495 if (ptconv(i,k)) then496 zcl =cld_lc_con497 zct =1./cld_tau_con498 zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i)499 .*fallvc(zrhol(i)) * zfice(i)500 else501 zcl =cld_lc_lsc502 zct =1./cld_tau_lsc503 zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i)504 .*fallvs(zrhol(i)) * zfice(i)505 endif506 zchau = zct *dtime/REAL(ninter) * zoliq(i)507 .*(1.0-EXP(-(zoliq(i)/zneb(i)/zcl )**2)) *(1.-zfice(i))508 ztot = zchau + zfroi509 ztot = MAX(ztot ,0.0)510 ENDIF511 ztot = MIN(ztot,zoliq(i))512 zoliq(i) = MAX(zoliq(i)-ztot , 0.0)513 radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1)514 ENDIF515 ENDDO516 517 c 518 519 IF (rneb(i,k).GT.0.0) THEN520 d_ql(i,k) = zoliq(i)521 zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0)522 .* (paprs(i,k)-paprs(i,k+1))/(RG*dtime)523 ENDIF524 IF (zt(i).LT.RTT) THEN525 psfl(i,k)=zrfl(i)526 ELSE527 prfl(i,k)=zrfl(i)528 ENDIF529 530 c 531 cCalculer les tendances de q et de t:532 c 533 534 535 536 537 c 538 cAA--------------- Calcul du lessivage stratiforme -------------539 540 541 c 542 zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0)543 .* (paprs(i,k)-paprs(i,k+1))/RG544 545 cAA lessivage nucleation LMD5 dans la couche elle-meme546 547 548 549 550 551 552 553 554 c 555 cnucleation avec un facteur -1 au lieu de -0.5556 557 558 559 c 560 561 c 562 cAA Lessivage par impaction dans les couches en-dessous563 564 DO i = 1, klon 565 IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN566 if (t(i,kk) .GE. ztglace) THEN567 zalpha_tr = a_tr_sca(1)568 else569 zalpha_tr = a_tr_sca(2)570 endif571 zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i))572 pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi)573 frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi574 ENDIF575 ENDDO 576 577 c 578 cAA----------------------------------------------------------579 cFIN DE BOUCLE SUR K580 9999 CONTINUE581 c 582 cAA-----------------------------------------------------------583 c 584 cPluie ou neige au sol selon la temperature de la 1ere couche585 c 586 587 588 589 590 591 592 593 594 595 C 596 CFor energy conservation : when snow is present, the solification597 clatent heat is considered.598 599 600 601 602 603 604 END DO605 606 c 607 608 609 610 611 RETURN 612 END 444 ! do i=1,klon 445 ! IF (rneb(i,k) .LE. 0.0) zqn(i) = 0.0 446 ! IF (rneb(i,k) .GE. 1.0) zqn(i) = zq(i) 447 ! rneb(i,k) = MAX(0.0,MIN(1.0,rneb(i,k))) 448 !c zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k)/(1.+zdqs(i)) 449 !c On ne divise pas par 1+zdqs pour forcer a avoir l'eau predite par 450 !c la convection. 451 !c ATTENTION !!! Il va falloir verifier tout ca. 452 ! zcond(i) = MAX(0.0,zqn(i)-zqs(i))*rneb(i,k) 453 !c print*,'ZDQS ',zdqs(i) 454 !c--Olivier 455 ! rhcl(i,k)=(zqs(i)+zq(i)-zdelq)/2./zqs(i) 456 ! IF (rneb(i,k) .LE. 0.0) rhcl(i,k)=zq(i)/zqs(i) 457 ! IF (rneb(i,k) .GE. 1.0) rhcl(i,k)=1.0 458 !c--fin 459 ! ENDDO 460 ELSE 461 DO i = 1, klon 462 IF (zq(i).GT.zqs(i)) THEN 463 rneb(i,k) = 1.0 464 ELSE 465 rneb(i,k) = 0.0 466 ENDIF 467 zcond(i) = MAX(0.0,zq(i)-zqs(i))/(1.+zdqs(i)) 468 ENDDO 469 ENDIF 470 ! 471 DO i = 1, klon 472 zq(i) = zq(i) - zcond(i) 473 ! zt(i) = zt(i) + zcond(i) * RLVTT/RCPD 474 zt(i) = zt(i) + zcond(i) * RLVTT/RCPD/(1.0+RVTMP2*zq(i)) 475 ENDDO 476 ! 477 ! Partager l'eau condensee en precipitation et eau liquide nuageuse 478 ! 479 DO i = 1, klon 480 IF (rneb(i,k).GT.0.0) THEN 481 zoliq(i) = zcond(i) 482 zrho(i) = pplay(i,k) / zt(i) / RD 483 zdz(i) = (paprs(i,k)-paprs(i,k+1)) / (zrho(i)*RG) 484 zfice(i) = 1.0 - (zt(i)-ztglace) / (273.13-ztglace) 485 zfice(i) = MIN(MAX(zfice(i),0.0),1.0) 486 zfice(i) = zfice(i)**nexpo 487 zneb(i) = MAX(rneb(i,k), seuil_neb) 488 radliq(i,k) = zoliq(i)/REAL(ninter+1) 489 ENDIF 490 ENDDO 491 ! 492 DO n = 1, ninter 493 DO i = 1, klon 494 IF (rneb(i,k).GT.0.0) THEN 495 zrhol(i) = zrho(i) * zoliq(i) / zneb(i) 496 497 IF (zneb(i).EQ.seuil_neb) THEN 498 ztot = 0.0 499 ELSE 500 ! quantite d'eau a eliminer: zchau 501 ! meme chose pour la glace: zfroi 502 if (ptconv(i,k)) then 503 zcl =cld_lc_con 504 zct =1./cld_tau_con 505 zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i) & 506 *fallvc(zrhol(i)) * zfice(i) 507 else 508 zcl =cld_lc_lsc 509 zct =1./cld_tau_lsc 510 zfroi = dtime/REAL(ninter)/zdz(i)*zoliq(i) & 511 *fallvs(zrhol(i)) * zfice(i) 512 endif 513 zchau = zct *dtime/REAL(ninter) * zoliq(i) & 514 *(1.0-EXP(-(zoliq(i)/zneb(i)/zcl )**2)) *(1.-zfice(i)) 515 ztot = zchau + zfroi 516 ztot = MAX(ztot ,0.0) 517 ENDIF 518 ztot = MIN(ztot,zoliq(i)) 519 zoliq(i) = MAX(zoliq(i)-ztot , 0.0) 520 radliq(i,k) = radliq(i,k) + zoliq(i)/REAL(ninter+1) 521 ENDIF 522 ENDDO 523 ENDDO 524 ! 525 DO i = 1, klon 526 IF (rneb(i,k).GT.0.0) THEN 527 d_ql(i,k) = zoliq(i) 528 zrfl(i) = zrfl(i)+ MAX(zcond(i)-zoliq(i),0.0) & 529 * (paprs(i,k)-paprs(i,k+1))/(RG*dtime) 530 ENDIF 531 IF (zt(i).LT.RTT) THEN 532 psfl(i,k)=zrfl(i) 533 ELSE 534 prfl(i,k)=zrfl(i) 535 ENDIF 536 ENDDO 537 ! 538 ! Calculer les tendances de q et de t: 539 ! 540 DO i = 1, klon 541 d_q(i,k) = zq(i) - q(i,k) 542 d_t(i,k) = zt(i) - t(i,k) 543 ENDDO 544 ! 545 !AA--------------- Calcul du lessivage stratiforme ------------- 546 547 DO i = 1,klon 548 ! 549 zprec_cond(i) = MAX(zcond(i)-zoliq(i),0.0) & 550 * (paprs(i,k)-paprs(i,k+1))/RG 551 IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN 552 !AA lessivage nucleation LMD5 dans la couche elle-meme 553 if (t(i,k) .GE. ztglace) THEN 554 zalpha_tr = a_tr_sca(3) 555 else 556 zalpha_tr = a_tr_sca(4) 557 endif 558 zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i)) 559 pfrac_nucl(i,k)=pfrac_nucl(i,k)*(1.-zneb(i)*zfrac_lessi) 560 frac_nucl(i,k)= 1.-zneb(i)*zfrac_lessi 561 ! 562 ! nucleation avec un facteur -1 au lieu de -0.5 563 zfrac_lessi = 1. - EXP(-zprec_cond(i)/zneb(i)) 564 pfrac_1nucl(i,k)=pfrac_1nucl(i,k)*(1.-zneb(i)*zfrac_lessi) 565 ENDIF 566 ! 567 ENDDO ! boucle sur i 568 ! 569 !AA Lessivage par impaction dans les couches en-dessous 570 DO kk = k-1, 1, -1 571 DO i = 1, klon 572 IF (rneb(i,k).GT.0.0.and.zprec_cond(i).gt.0.) THEN 573 if (t(i,kk) .GE. ztglace) THEN 574 zalpha_tr = a_tr_sca(1) 575 else 576 zalpha_tr = a_tr_sca(2) 577 endif 578 zfrac_lessi = 1. - EXP(zalpha_tr*zprec_cond(i)/zneb(i)) 579 pfrac_impa(i,kk)=pfrac_impa(i,kk)*(1.-zneb(i)*zfrac_lessi) 580 frac_impa(i,kk)= 1.-zneb(i)*zfrac_lessi 581 ENDIF 582 ENDDO 583 ENDDO 584 ! 585 !AA---------------------------------------------------------- 586 ! FIN DE BOUCLE SUR K 587 end DO 588 ! 589 !AA----------------------------------------------------------- 590 ! 591 ! Pluie ou neige au sol selon la temperature de la 1ere couche 592 ! 593 DO i = 1, klon 594 IF ((t(i,1)+d_t(i,1)) .LT. RTT) THEN 595 snow(i) = zrfl(i) 596 zlh_solid(i) = RLSTT-RLVTT 597 ELSE 598 rain(i) = zrfl(i) 599 zlh_solid(i) = 0. 600 ENDIF 601 ENDDO 602 ! 603 ! For energy conservation : when snow is present, the solification 604 ! latent heat is considered. 605 DO k = 1, klev 606 DO i = 1, klon 607 zcpair=RCPD*(1.0+RVTMP2*(q(i,k)+d_q(i,k))) 608 zmair=(paprs(i,k)-paprs(i,k+1))/RG 609 zm_solid = (prfl(i,k)-prfl(i,k+1)+psfl(i,k)-psfl(i,k+1))*dtime 610 d_t(i,k) = d_t(i,k) + zlh_solid(i) *zm_solid / (zcpair*zmair) 611 END DO 612 END DO 613 ! 614 615 if (ncoreczq>0) then 616 print*,'WARNING : ZQ dans fisrtilp ',ncoreczq,' val < 1.e-15.' 617 endif 618 619 END SUBROUTINE fisrtilp
Note: See TracChangeset
for help on using the changeset viewer.