Changeset 1294 for LMDZ4/branches/LMDZ4V5.0-dev/libf
- Timestamp:
- Jan 14, 2010, 3:35:30 PM (15 years ago)
- Location:
- LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd
- Files:
-
- 2 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/calltherm.F90
r1146 r1294 45 45 !******************************************************** 46 46 ! declarations 47 LOGICAL flag_bidouille_stratocu 47 48 real fmc_therm(klon,klev+1),zqasc(klon,klev) 48 49 real zqla(klon,klev) … … 187 188 & ,r_aspect_thermals,l_mix_thermals,w2di_thermals & 188 189 & ,tau_thermals) 189 else if (iflag_thermals .ge.13) then190 CALL thermcell _main(itap,klon,klev,zdt &190 else if (iflag_thermals==13.or.iflag_thermals==14) then 191 CALL thermcellV0_main(itap,klon,klev,zdt & 191 192 & ,pplay,paprs,pphi,debut & 192 193 & ,u_seri,v_seri,t_seri,q_seri & … … 197 198 & ,tau_thermals,Ale,Alp,lalim_conv,wght_th & 198 199 & ,zmax0,f0,zw2,fraca) 200 else if (iflag_thermals==15.or.iflag_thermals==16) then 201 CALL thermcell_main(itap,klon,klev,zdt & 202 & ,pplay,paprs,pphi,debut & 203 & ,u_seri,v_seri,t_seri,q_seri & 204 & ,d_u_the,d_v_the,d_t_the,d_q_the & 205 & ,zfm_therm,zentr_therm,zdetr_therm,zqasc,zqla,lmax & 206 & ,ratqscth,ratqsdiff,zqsatth & 207 & ,r_aspect_thermals,l_mix_thermals & 208 & ,tau_thermals,Ale,Alp,lalim_conv,wght_th & 209 & ,zmax0,f0,zw2,fraca) 210 if (prt_level.gt.10) write(lunout,*)'Apres thermcell_main OK' 211 else 212 STOP'Cas des thermiques non prevu' 199 213 endif 200 214 215 flag_bidouille_stratocu=iflag_thermals.lt.14.or.iflag_thermals.lt.16 201 216 202 217 fact(:)=0. 203 218 DO i=1,klon 204 logexpr1(i)= iflag_thermals.lt.14.or.weak_inversion(i).gt.0.5219 logexpr1(i)=flag_bidouille_stratocu.or.weak_inversion(i).gt.0.5 205 220 IF(logexpr1(i)) fact(i)=1./float(nsplit_thermals) 206 221 ENDDO … … 235 250 qmemoire(:,:)=q_seri(:,:) 236 251 q_seri(:,:) = q_seri(:,:) + d_q_the(:,:) 252 if (prt_level.gt.10) write(lunout,*)'Apres apres thermcell_main OK' 237 253 238 254 DO i=1,klon -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/physiq.F
r1287 r1294 2548 2548 2549 2549 ! les ratqs sont une combinaison de ratqss et ratqsc 2550 print*,'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs2550 write(lunout,*)'PHYLMD NOUVEAU TAU_RATQS ',tau_ratqs 2551 2551 2552 2552 if (tau_ratqs>1.e-10) then -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_closure.F90
r1146 r1294 1 ! 2 ! $Header$ 3 ! 1 4 SUBROUTINE thermcell_closure(ngrid,nlay,r_aspect,ptimestep,rho, & 2 & zlev,lalim,alim_star, alim_star_tot,zmax_sec,wmax_sec,zmax,wmax,f,lev_out)5 & zlev,lalim,alim_star,f_star,zmax,wmax,f,lev_out) 3 6 4 7 !------------------------------------------------------------------------- 5 8 !thermcell_closure: fermeture, determination de f 9 ! 10 ! Modification 7 septembre 2009 11 ! 1. On enleve alim_star_tot des arguments pour le recalculer et etre ainis 12 ! coherent avec l'integrale au numerateur. 13 ! 2. On ne garde qu'une version des couples wmax,zmax et wmax_sec,zmax_sec 14 ! l'idee etant que le choix se fasse a l'appel de thermcell_closure 15 ! 3. Vectorisation en mettant les boucles en l l'exterieur avec des if 6 16 !------------------------------------------------------------------------- 7 17 IMPLICIT NONE … … 9 19 #include "iniprint.h" 10 20 #include "thermcell.h" 11 12 13 14 21 INTEGER ngrid,nlay 22 INTEGER ig,k 23 REAL r_aspect,ptimestep 24 integer lev_out ! niveau pour les print 15 25 16 INTEGER lalim(ngrid) 17 REAL alim_star(ngrid,nlay) 18 REAL alim_star_tot(ngrid) 19 REAL rho(ngrid,nlay) 20 REAL zlev(ngrid,nlay) 21 REAL zmax(ngrid),zmax_sec(ngrid) 22 REAL wmax(ngrid),wmax_sec(ngrid) 23 real zdenom 26 INTEGER lalim(ngrid) 27 REAL alim_star(ngrid,nlay) 28 REAL f_star(ngrid,nlay+1) 29 REAL rho(ngrid,nlay) 30 REAL zlev(ngrid,nlay) 31 REAL zmax(ngrid) 32 REAL wmax(ngrid) 33 REAL zdenom(ngrid) 34 REAL alim_star2(ngrid) 35 REAL f(ngrid) 24 36 25 REAL alim_star2(ngrid) 37 REAL alim_star_tot(ngrid) 38 INTEGER llmax 26 39 27 REAL f(ngrid) 40 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41 print*,'THERMCELL CLOSURE 26E' 28 42 29 do ig=1,ngrid 30 alim_star2(ig)=0. 31 enddo 32 do ig=1,ngrid 33 if (alim_star(ig,1).LT.1.e-10) then 34 f(ig)=0. 35 else 36 do k=1,lalim(ig) 37 alim_star2(ig)=alim_star2(ig)+alim_star(ig,k)**2 & 38 & /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) 39 enddo 40 zdenom=max(500.,zmax(ig))*r_aspect*alim_star2(ig) 41 if (zdenom<1.e-14) then 42 print*,'ig=',ig 43 print*,'alim_star2',alim_star2(ig) 44 print*,'zmax',zmax(ig) 45 print*,'r_aspect',r_aspect 46 print*,'zdenom',zdenom 47 print*,'alim_star',alim_star(ig,:) 48 print*,'zmax_sec',zmax_sec(ig) 49 print*,'wmax_sec',wmax_sec(ig) 50 stop 51 endif 52 if ((zmax_sec(ig).gt.1.e-10).and.(iflag_thermals_ed.eq.0)) then 53 f(ig)=wmax_sec(ig)*alim_star_tot(ig)/(max(500.,zmax_sec(ig))*r_aspect & 54 & *alim_star2(ig)) 55 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp((-ptimestep/ & 56 ! & zmax_sec(ig))*wmax_sec(ig)) 57 if(prt_level.GE.10) write(lunout,*)'closure dry',f(ig),wmax_sec(ig),alim_star_tot(ig),zmax_sec(ig) 58 else 59 f(ig)=wmax(ig)*alim_star_tot(ig)/zdenom 60 ! f(ig)=f(ig)+(f0(ig)-f(ig))*exp((-ptimestep/ & 61 ! & zmax(ig))*wmax(ig)) 62 if(prt_level.GE.10) print*,'closure moist',f(ig),wmax(ig),alim_star_tot(ig),zmax(ig) 63 endif 64 endif 65 ! f0(ig)=f(ig) 66 enddo 67 if (prt_level.ge.1) print*,'apres fermeture' 43 alim_star2(:)=0. 44 alim_star_tot(:)=0. 45 f(:)=0. 68 46 69 ! 47 ! Indice vertical max (max de lalim) atteint par les thermiques sur le domaine 48 llmax=1 49 do ig=1,ngrid 50 if (lalim(ig)>llmax) llmax=lalim(ig) 51 enddo 52 53 54 ! Calcul des integrales sur la verticale de alim_star et de 55 ! alim_star^2/(rho dz) 56 do k=1,llmax-1 57 do ig=1,ngrid 58 if (k<lalim(ig)) then 59 alim_star2(ig)=alim_star2(ig)+alim_star(ig,k)**2 & 60 & /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) 61 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,k) 62 endif 63 enddo 64 enddo 65 66 67 do ig=1,ngrid 68 if (alim_star2(ig)>1.e-10) then 69 f(ig)=wmax(ig)*alim_star_tot(ig)/ & 70 & (max(500.,zmax(ig))*r_aspect*alim_star2(ig)) 71 endif 72 enddo 73 74 75 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 76 ! TESTS POUR UNE NOUVELLE FERMETURE DANS LAQUELLE ALIM_STAR NE SERAIT 77 ! PAS NORMALISE 78 ! f(ig)=f(ig)*f_star(ig,2)/(f_star(ig,lalim(ig))) 79 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 80 70 81 return 71 82 end -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_dry.F90
r938 r1294 1 ! 2 ! $Header$ 3 ! 1 4 SUBROUTINE thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star, & 2 5 & lalim,lmin,zmax,wmax,lev_out) … … 4 7 !-------------------------------------------------------------------------- 5 8 !thermcell_dry: calcul de zmax et wmax du thermique sec 9 ! Calcul de la vitesse maximum et de la hauteur maximum pour un panache 10 ! ascendant avec une fonction d'alimentation alim_star et sans changement 11 ! de phase. 12 ! Le calcul pourrait etre sans doute simplifier. 13 ! La temperature potentielle virtuelle dans la panache ascendant est 14 ! la temperature potentielle virtuelle pondérée par alim_star. 6 15 !-------------------------------------------------------------------------- 16 7 17 IMPLICIT NONE 8 18 #include "YOMCST.h" … … 48 58 !calcul de la vitesse a partir de la CAPE en melangeant thetav 49 59 50 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!51 ! A eliminer52 ! Ce if complique etait fait pour reperer la premiere couche instable53 ! Ici, c'est lmin.54 !55 ! do l=1,nlay-256 ! do ig=1,ngrid57 ! if (ztv(ig,l).gt.ztv(ig,l+1) &58 ! & .and.alim_star(ig,l).gt.1.e-10 &59 ! & .and.zw2(ig,l).lt.1e-10) then60 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!61 62 60 63 61 ! Calcul des F^*, integrale verticale de E^* … … 84 82 ! Premiere couche du panache thermique 85 83 !------------------------------------------------------------------------ 84 86 85 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) & 87 86 & *(zlev(ig,l+1)-zlev(ig,l)) & … … 96 95 ! 3. la vitesse au carré en haut zw2(ig,l+1) 97 96 !------------------------------------------------------------------------ 98 99 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!100 ! A eliminer : dans cette version, si zw2 est > 0 on a un therique.101 ! et donc, au dessus, f_star(ig,l+1) est forcement suffisamment102 ! grand puisque on n'a pas de detrainement.103 ! f_star est une fonction croissante.104 ! c'est donc vraiment sur zw2 uniquement qu'il faut faire le test.105 ! else if ((zw2(ig,l).ge.1e-10).and. &106 ! & (f_star(ig,l)+alim_star(ig,l).gt.1.e-10)) then107 ! f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)108 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!109 97 110 98 else if (zw2(ig,l).ge.1e-10) then … … 145 133 if (prt_level.ge.1) print*,'fin calcul zw2' 146 134 ! 147 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!148 ! A eliminer :149 ! Ce calcul de lmax est fait en meme temps que celui de linter, plus haut150 ! Calcul de la couche correspondant a la hauteur du thermique151 ! do ig=1,ngrid152 ! lmax(ig)=lalim(ig)153 ! enddo154 ! do ig=1,ngrid155 ! do l=nlay,lalim(ig)+1,-1156 ! if (zw2(ig,l).le.1.e-10) then157 ! lmax(ig)=l-1158 ! endif159 ! enddo160 ! enddo161 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!162 163 !164 135 ! Determination de zw2 max 165 136 do ig=1,ngrid … … 185 156 do ig=1,ngrid 186 157 ! calcul de zlevinter 187 188 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!189 ! FH A eliminer190 ! Simplification191 ! zlevinter(ig)=(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig)))* &192 ! & linter(ig)+zlev(ig,lmax(ig))-lmax(ig)*(zlev(ig,lmax(ig)+1) &193 ! & -zlev(ig,lmax(ig)))194 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!195 196 158 zlevinter(ig)=zlev(ig,lmax(ig)) + & 197 159 & (linter(ig)-lmax(ig))*(zlev(ig,lmax(ig)+1)-zlev(ig,lmax(ig))) … … 199 161 enddo 200 162 201 ! Verification que lalim<=lmax202 do ig=1,ngrid203 if(lalim(ig)>lmax(ig)) then204 if ( prt_level > 1 ) THEN205 print*,'WARNING thermcell_dry ig=',ig,' lalim=',lalim(ig),' lmax(ig)=',lmax(ig)206 endif207 lmax(ig)=lalim(ig)208 endif209 enddo210 211 163 RETURN 212 164 END -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_init.F90
r1057 r1294 1 ! 2 ! $Header$ 3 ! 1 4 SUBROUTINE thermcell_init(ngrid,nlay,ztv,zlay,zlev, & 2 5 & lalim,lmin,alim_star,alim_star_tot,lev_out) … … 26 29 !def des alim_star tels que alim=f*alim_star 27 30 28 do l=1,nlay29 do ig=1,ngrid30 alim_star(ig,l)=0.31 enddo32 enddo33 ! determination de la longueur de la couche d entrainement34 do ig=1,ngrid35 lalim(ig)=136 enddo37 31 38 if (iflag_thermals_ed.ge.1) then 39 !si la première couche est instable, on declenche un thermique 32 write(lunout,*)'THERM INIT V20C ' 33 34 alim_star_tot(:)=0. 35 alim_star(:,:)=0. 36 lmin(:)=1 37 lalim(:)=1 38 39 do l=1,nlay-1 40 40 do ig=1,ngrid 41 if (ztv(ig,1).gt.ztv(ig,2)) then 42 lmin(ig)=1 43 lalim(ig)=2 44 alim_star(ig,1)=1. 45 alim_star_tot(ig)=alim_star(ig,1) 46 if(prt_level.GE.10) print*,'init',alim_star(ig,1),alim_star_tot(ig) 47 else 48 lmin(ig)=1 49 lalim(ig)=1 50 alim_star(ig,1)=0. 51 alim_star_tot(ig)=0. 52 endif 53 enddo 54 55 else 56 !else iflag_thermals_ed=0 ancienne def de l alim 57 58 !on ne considere que les premieres couches instables 59 do l=nlay-2,1,-1 60 do ig=1,ngrid 61 if (ztv(ig,l).gt.ztv(ig,l+1).and. & 62 & ztv(ig,l+1).le.ztv(ig,l+2)) then 63 lalim(ig)=l+1 64 endif 65 enddo 66 enddo 67 68 ! determination du lmin: couche d ou provient le thermique 69 70 do ig=1,ngrid 71 ! FH initialisation de lmin a nlay plutot que 1. 72 ! lmin(ig)=nlay 73 lmin(ig)=1 74 enddo 75 do l=nlay,2,-1 76 do ig=1,ngrid 77 if (ztv(ig,l-1).gt.ztv(ig,l)) then 78 lmin(ig)=l-1 41 if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then 42 alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & 43 & *sqrt(zlev(ig,l+1)) 44 lalim(:)=l+1 45 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 79 46 endif 80 47 enddo 81 48 enddo 82 ! 83 zzalim(:)=0. 84 do l=1,nlay-1 49 do l=1,nlay 85 50 do ig=1,ngrid 86 if (l<lalim(ig)) then 87 zzalim(ig)=zzalim(ig)+zlay(ig,l)*(ztv(ig,l)-ztv(ig,l+1)) 88 endif 89 enddo 90 enddo 91 do ig=1,ngrid 92 if (lalim(ig)>1) then 93 zzalim(ig)=zlay(ig,1)+zzalim(ig)/(ztv(ig,1)-ztv(ig,lalim(ig))) 94 else 95 zzalim(ig)=zlay(ig,1) 96 endif 97 enddo 98 99 if(prt_level.GE.10) print*,'ZZALIM LALIM ',zzalim,lalim,zlay(1,lalim(1)) 100 101 ! definition de l'entrainement des couches 102 if (1.eq.1) then 103 do l=1,nlay-1 104 do ig=1,ngrid 105 if (ztv(ig,l).gt.ztv(ig,l+1).and. & 106 & l.ge.lmin(ig).and.l.lt.lalim(ig)) then 107 !def possibles pour alim_star: zdthetadz, dthetadz, zdtheta 108 alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & 109 & *sqrt(zlev(ig,l+1)) 110 endif 111 enddo 112 enddo 113 else 114 do l=1,nlay-1 115 do ig=1,ngrid 116 if (ztv(ig,l).gt.ztv(ig,l+1).and. & 117 & l.ge.lmin(ig).and.l.lt.lalim(ig)) then 118 alim_star(ig,l)=max(3.*zzalim(ig)-zlay(ig,l),0.) & 119 & *(zlev(ig,l+1)-zlev(ig,l)) 120 endif 121 enddo 122 enddo 123 endif 124 125 ! pas de thermique si couche 1 stable 126 do ig=1,ngrid 127 !CRnouveau test 128 if (alim_star(ig,1).lt.1.e-10) then 129 do l=1,nlay 130 alim_star(ig,l)=0. 131 enddo 132 lmin(ig)=1 133 endif 134 enddo 135 ! calcul de l alimentation totale 136 do ig=1,ngrid 137 alim_star_tot(ig)=0. 138 enddo 139 do l=1,nlay 140 do ig=1,ngrid 141 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 142 enddo 143 enddo 144 ! 145 ! Calcul entrainement normalise 146 do l=1,nlay 147 do ig=1,ngrid 148 if (alim_star_tot(ig).gt.1.e-10) then 51 if (alim_star_tot(ig) > 1.e-10 ) then 149 52 alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig) 150 53 endif 151 54 enddo 152 55 enddo 153 154 !on remet alim_star_tot a 1 155 do ig=1,ngrid 156 alim_star_tot(ig)=1. 157 enddo 56 alim_star_tot(:)=1. 158 57 159 endif 160 !endif iflag_thermals_ed 161 return 58 return 162 59 end -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_main.F90
r1146 r1294 22 22 ! de "thermiques" explicitement representes avec processus nuageux 23 23 ! 24 ! R éécriture à partir d'un listing papier àHabas, le 14/02/0025 ! 26 ! le thermique est suppos é homogène et dissipé par mélange avec27 ! son environnement. la longueur l_mix contr ôle l'efficacitédu28 ! m élange29 ! 30 ! Le calcul du transport des diff érentes espèces se fait en prenant24 ! Reecriture a partir d'un listing papier a Habas, le 14/02/00 25 ! 26 ! le thermique est suppose homogene et dissipe par melange avec 27 ! son environnement. la longueur l_mix controle l'efficacite du 28 ! melange 29 ! 30 ! Le calcul du transport des differentes especes se fait en prenant 31 31 ! en compte: 32 32 ! 1. un flux de masse montant … … 85 85 real linter(klon) 86 86 real zmix(klon) 87 real zmax(klon),zw2(klon,klev+1),ztva(klon,klev),zw_est(klon,klev+1) 87 real zmax(klon),zw2(klon,klev+1),ztva(klon,klev),zw_est(klon,klev+1),ztva_est(klon,klev) 88 88 ! real fraca(klon,klev) 89 89 … … 115 115 ! FH probleme de dimensionnement avec l'allocation dynamique 116 116 ! common/comtherm/thetath2,wth2 117 real wq(klon,klev) 118 real wthl(klon,klev) 119 real wthv(klon,klev) 117 120 118 121 real ratqscth(klon,klev) … … 142 145 real f_star(klon,klev+1),entr_star(klon,klev) 143 146 real detr_star(klon,klev) 144 real alim_star_tot(klon) ,alim_star2(klon)147 real alim_star_tot(klon) 145 148 real alim_star(klon,klev) 149 real alim_star_clos(klon,klev) 146 150 real f(klon), f0(klon) 147 151 !FH/IM save f0 … … 149 153 logical debut 150 154 real seuil 155 real csc(klon,klev) 151 156 152 157 ! … … 220 225 ENDIF 221 226 ! 222 !Initialisation 223 ! 224 ! IF (1.eq.0) THEN 225 ! do ig=1,klon 226 !FH/IM 130308 if ((debut).or.((.not.debut).and.(f0(ig).lt.1.e-10))) then 227 ! if ((.not.debut).and.(f0(ig).lt.1.e-10)) then 228 ! f0(ig)=1.e-5 229 ! zmax0(ig)=40. 230 !v1d therm=.false. 231 ! endif 232 ! enddo 233 ! ENDIF !(1.eq.0) THEN 234 if (prt_level.ge.10)write(lunout,*) & 235 & 'WARNING thermcell_main f0=max(f0,1.e-2)' 227 write(lunout,*)'WARNING thermcell_main f0=max(f0,1.e-2)' 236 228 do ig=1,klon 237 229 if (prt_level.ge.20) then … … 239 231 endif 240 232 f0(ig)=max(f0(ig),1.e-2) 233 zmax0(ig)=max(zmax0(ig),40.) 241 234 !IMmarche pas ?! if (f0(ig)<1.e-2) f0(ig)=1.e-2 242 235 enddo … … 364 357 365 358 !------------------------------------------------------------------ 366 ! 1. alim_star est le profil vertical de l'alimentation àla base du367 ! panache thermique, calcul é à partir de la flotabilitéde l'air sec359 ! 1. alim_star est le profil vertical de l'alimentation a la base du 360 ! panache thermique, calcule a partir de la flotabilite de l'air sec 368 361 ! 2. lmin et lalim sont les indices inferieurs et superieurs de alim_star 369 362 !------------------------------------------------------------------ 370 363 ! 371 364 entr_star=0. ; detr_star=0. ; alim_star=0. ; alim_star_tot=0. 372 CALL thermcell_init(ngrid,nlay,ztv,zlay,zlev, & 373 & lalim,lmin,alim_star,alim_star_tot,lev_out) 374 375 call test_ltherm(ngrid,nlay,pplev,pplay,lmin,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_init lmin ') 376 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_init lalim ') 377 378 379 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_init' 380 if (prt_level.ge.10) then 381 write(lunout1,*) 'Dans thermcell_main 1' 382 write(lunout1,*) 'lmin ',lmin(igout) 383 write(lunout1,*) 'lalim ',lalim(igout) 384 write(lunout1,*) ' ig l alim_star thetav' 385 write(lunout1,'(i6,i4,2e15.5)') (igout,l,alim_star(igout,l) & 386 & ,ztv(igout,l),l=1,lalim(igout)+4) 387 endif 388 389 !v1d do ig=1,klon 390 !v1d if (alim_star(ig,1).gt.1.e-10) then 391 !v1d therm=.true. 392 !v1d endif 393 !v1d enddo 365 lmin=1 366 394 367 !----------------------------------------------------------------------------- 395 368 ! 3. wmax_sec et zmax_sec sont les vitesses et altitudes maximum d'un 396 369 ! panache sec conservatif (e=d=0) alimente selon alim_star 397 370 ! Il s'agit d'un calcul de type CAPE 398 ! zmax_sec est utilis é pour déterminer la géométrie du thermique.371 ! zmax_sec est utilise pour determiner la geometrie du thermique. 399 372 !------------------------------------------------------------------------------ 400 ! 373 !--------------------------------------------------------------------------------- 374 !calcul du melange et des variables dans le thermique 375 !-------------------------------------------------------------------------------- 376 ! 377 if (prt_level.ge.1) print*,'avant thermcell_plume ',lev_out 378 !IM 140508 CALL thermcell_plume(ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & 379 CALL thermcell_plume(itap,ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & 380 & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & 381 & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & 382 & ztla,zqla,zqta,zha,zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis,linter & 383 & ,lev_out,lunout1,igout) 384 if (prt_level.ge.1) print*,'apres thermcell_plume ',lev_out 385 386 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lalim ') 387 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lmix ') 388 389 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_plume' 390 if (prt_level.ge.10) then 391 write(lunout1,*) 'Dans thermcell_main 2' 392 write(lunout1,*) 'lmin ',lmin(igout) 393 write(lunout1,*) 'lalim ',lalim(igout) 394 write(lunout1,*) ' ig l alim_star entr_star detr_star f_star ' 395 write(lunout1,'(i6,i4,4e15.5)') (igout,l,alim_star(igout,l),entr_star(igout,l),detr_star(igout,l) & 396 & ,f_star(igout,l+1),l=1,nint(linter(igout))+5) 397 endif 398 399 !------------------------------------------------------------------------------- 400 ! Calcul des caracteristiques du thermique:zmax,zmix,wmax 401 !------------------------------------------------------------------------------- 402 ! 403 CALL thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,zw2, & 404 & zlev,lmax,zmax,zmax0,zmix,wmax,lev_out) 405 406 407 408 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lalim ') 409 call test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmin ') 410 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmix ') 411 call test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmax ') 412 413 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_height' 414 415 !------------------------------------------------------------------------------- 416 ! Fermeture,determination de f 417 !------------------------------------------------------------------------------- 418 ! 419 ! 420 write(lunout,*)'THERM NOUVEAU RIO2009 31B' 401 421 CALL thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star, & 402 422 & lalim,lmin,zmax_sec,wmax_sec,lev_out) 403 423 404 424 call test_ltherm(ngrid,nlay,pplev,pplay,lmin,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry lmin ') … … 417 437 418 438 419 !--------------------------------------------------------------------------------- 420 !calcul du melange et des variables dans le thermique 421 !-------------------------------------------------------------------------------- 422 ! 423 if (prt_level.ge.1) print*,'avant thermcell_plume ',lev_out 424 !IM 140508 CALL thermcell_plume(ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & 425 CALL thermcell_plume(itap,ngrid,nlay,ptimestep,ztv,zthl,po,zl,rhobarz, & 426 & zlev,pplev,pphi,zpspsk,l_mix,r_aspect,alim_star,alim_star_tot, & 427 & lalim,zmax_sec,f0,detr_star,entr_star,f_star,ztva, & 428 & ztla,zqla,zqta,zha,zw2,zw_est,zqsatth,lmix,lmix_bis,linter & 429 & ,lev_out,lunout1,igout) 430 if (prt_level.ge.1) print*,'apres thermcell_plume ',lev_out 431 432 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lalim ') 433 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lmix ') 434 435 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_plume' 436 if (prt_level.ge.10) then 437 write(lunout1,*) 'Dans thermcell_main 2' 438 write(lunout1,*) 'lmin ',lmin(igout) 439 write(lunout1,*) 'lalim ',lalim(igout) 440 write(lunout1,*) ' ig l alim_star entr_star detr_star f_star ' 441 write(lunout1,'(i6,i4,4e15.5)') (igout,l,alim_star(igout,l),entr_star(igout,l),detr_star(igout,l) & 442 & ,f_star(igout,l+1),l=1,nint(linter(igout))+5) 443 endif 444 445 !------------------------------------------------------------------------------- 446 ! Calcul des caracteristiques du thermique:zmax,zmix,wmax 447 !------------------------------------------------------------------------------- 448 ! 449 CALL thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,zw2, & 450 & zlev,lmax,zmax,zmax0,zmix,wmax,lev_out) 451 452 453 call test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lalim ') 454 call test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmin ') 455 call test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmix ') 456 call test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmax ') 457 458 if (prt_level.ge.1) print*,'thermcell_main apres thermcell_height' 459 460 !------------------------------------------------------------------------------- 461 ! Fermeture,determination de f 462 !------------------------------------------------------------------------------- 463 ! 464 !avant closure: on redéfinit lalim, alim_star_tot et alim_star 465 ! do ig=1,klon 466 ! do l=2,lalim(ig) 467 ! alim_star(ig,l)=entr_star(ig,l) 468 ! entr_star(ig,l)=0. 469 ! enddo 470 ! enddo 471 439 print*,'THERM 26JJJ' 440 441 ! Choix de la fonction d'alimentation utilisee pour la fermeture. 442 ! Apparemment sans importance 443 alim_star_clos(:,:)=alim_star(:,:) 444 alim_star_clos(:,:)=entr_star(:,:)+alim_star(:,:) 445 446 ! Appel avec la version seche 472 447 CALL thermcell_closure(ngrid,nlay,r_aspect,ptimestep,rho, & 473 & zlev,lalim,alim_star,alim_star_tot,zmax_sec,wmax_sec,zmax,wmax,f,lev_out) 448 & zlev,lalim,alim_star_clos,f_star,zmax_sec,wmax_sec,f,lev_out) 449 450 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 451 ! Appel avec les zmax et wmax tenant compte de la condensation 452 ! Semble moins bien marcher 453 ! CALL thermcell_closure(ngrid,nlay,r_aspect,ptimestep,rho, & 454 ! & zlev,lalim,alim_star,f_star,zmax,wmax,f,lev_out) 455 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 474 456 475 457 if(prt_level.ge.1)print*,'thermcell_closure apres thermcell_closure' … … 484 466 ! Test valable seulement en 1D mais pas genant 485 467 if (.not. (f0(1).ge.0.) ) then 486 stop 468 stop'Dans thermcell_main' 487 469 endif 488 470 … … 511 493 fm0=(1.-lambda)*fm+lambda*fm0 512 494 entr0=(1.-lambda)*entr+lambda*entr0 513 !detr0=(1.-lambda)*detr+lambda*detr0495 detr0=(1.-lambda)*detr+lambda*detr0 514 496 else 515 497 fm0=fm … … 560 542 & ,fraca,zmax & 561 543 & ,zu,zv,pduadj,pdvadj,zua,zva,lev_out) 562 !IM 050508 & ,zu,zv,pduadj,pdvadj,zua,zva,igout,lev_out) 544 563 545 else 564 546 … … 636 618 ! 637 619 if (prt_level.ge.10) print*,'14f OK convect8 ig,l,zha zh zpspsk ',ig,l,zha(ig,l),zh(ig,l),zpspsk(ig,l) 638 thetath2(ig,l)=zf2*(z ha(ig,l)-zh(ig,l)/zpspsk(ig,l))**2620 thetath2(ig,l)=zf2*(ztla(ig,l)-zthl(ig,l))**2 639 621 if(zw2(ig,l).gt.1.e-10) then 640 622 wth2(ig,l)=zf2*(zw2(ig,l))**2 … … 651 633 enddo 652 634 enddo 635 !calcul des flux: q, thetal et thetav 636 do l=1,nlay 637 do ig=1,ngrid 638 wq(ig,l)=fraca(ig,l)*zw2(ig,l)*(zqta(ig,l)*1000.-po(ig,l)*1000.) 639 wthl(ig,l)=fraca(ig,l)*zw2(ig,l)*(ztla(ig,l)-zthl(ig,l)) 640 wthv(ig,l)=fraca(ig,l)*zw2(ig,l)*(ztva(ig,l)-ztv(ig,l)) 641 enddo 642 enddo 653 643 !calcul de ale_bl et alp_bl 654 !pour le calcul d'une valeur int égrée entre la surface et lmax644 !pour le calcul d'une valeur integree entre la surface et lmax 655 645 do ig=1,ngrid 656 646 alp_int(ig)=0. … … 782 772 ! print*,'15 OK convect8' 783 773 774 #ifdef wrgrads_thermcell 784 775 if (prt_level.ge.1) print*,'thermcell_main sorties 3D' 785 #ifdef wrgrads_thermcell786 776 #include "thermcell_out3d.h" 787 777 #endif -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_out3d.h
r1029 r1294 27 27 call wrgradsfi(1,nlay,q2(igout,1:klev),'q2 ','q2 ') 28 28 ! 29 ! 30 call wrgradsfi(1,nlay,wthl(igout,1:klev),'wthl ','wthl ') 31 call wrgradsfi(1,nlay,wthv(igout,1:klev),'wthv ','wthv ') 32 call wrgradsfi(1,nlay,wq(igout,1:klev),'wq ','wq ') 33 29 34 call wrgradsfi(1,nlay,ztva(igout,1:klev),'ztva ','ztva ') 30 35 call wrgradsfi(1,nlay,ztv(igout,1:klev),'ztv ','ztv ') … … 53 58 call wrgradsfi(1,1,f(igout),'f ','f ') 54 59 call wrgradsfi(1,1,alim_star_tot(igout),'a_s_t ','a_s_t ') 55 call wrgradsfi(1,1,alim_star2(igout),'a_2 ','a_2 ')56 60 call wrgradsfi(1,1,zmax(igout),'zmax ','zmax ') 57 61 call wrgradsfi(1,1,zmax_sec(igout),'z_sec ','z_sec ') -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_plume.F90
r1057 r1294 1 ! 2 ! $Header$ 3 ! 1 4 SUBROUTINE thermcell_plume(itap,ngrid,klev,ptimestep,ztv,zthl,po,zl,rhobarz, & 2 & zlev,pplev,pphi,zpspsk, l_mix,r_aspect,alim_star,alim_star_tot, &3 & lalim, zmax_sec,f0,detr_star,entr_star,f_star,ztva, &4 & ztla,zqla,zqta,zha,zw2,w_est,z qsatth,lmix,lmix_bis,linter &5 & zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot, & 6 & lalim,f0,detr_star,entr_star,f_star,csc,ztva, & 7 & ztla,zqla,zqta,zha,zw2,w_est,ztva_est,zqsatth,lmix,lmix_bis,linter & 5 8 & ,lev_out,lunout1,igout) 6 9 … … 31 34 REAL zpspsk(ngrid,klev) 32 35 REAL alim_star(ngrid,klev) 33 REAL zmax_sec(ngrid)34 36 REAL f0(ngrid) 35 REAL l_mix36 REAL r_aspect37 37 INTEGER lalim(ngrid) 38 38 integer lev_out ! niveau pour les print … … 44 44 REAL ztla(ngrid,klev) 45 45 REAL zqla(ngrid,klev) 46 REAL zqla0(ngrid,klev)47 46 REAL zqta(ngrid,klev) 48 47 REAL zha(ngrid,klev) … … 50 49 REAL detr_star(ngrid,klev) 51 50 REAL coefc 52 REAL detr_stara(ngrid,klev)53 REAL detr_starb(ngrid,klev)54 REAL detr_starc(ngrid,klev)55 REAL detr_star0(ngrid,klev)56 REAL detr_star1(ngrid,klev)57 REAL detr_star2(ngrid,klev)58 59 51 REAL entr_star(ngrid,klev) 60 REAL entr_star1(ngrid,klev)61 REAL entr_star2(ngrid,klev)62 52 REAL detr(ngrid,klev) 63 53 REAL entr(ngrid,klev) 54 55 REAL csc(ngrid,klev) 64 56 65 57 REAL zw2(ngrid,klev+1) … … 72 64 REAL zqsatth(ngrid,klev) 73 65 REAL zta_est(ngrid,klev) 66 REAL zdw2 67 REAL zw2modif 68 REAL zeps 74 69 75 70 REAL linter(ngrid) … … 80 75 INTEGER ig,l,k 81 76 77 real zdz,zfact,zbuoy,zalpha 82 78 real zcor,zdelta,zcvm5,qlbef 83 79 real Tbef,qsatbef … … 86 82 PARAMETER (DDT0=.01) 87 83 logical Zsat 88 REAL fact_gamma,fact_epsilon 84 LOGICAL active(ngrid),activetmp(ngrid) 85 REAL fact_gamma,fact_epsilon,fact_gamma2 89 86 REAL c2(ngrid,klev) 90 87 88 REAL zw2fact,expa 91 89 Zsat=.false. 92 90 ! Initialisation … … 97 95 fact_epsilon=1. 98 96 else if (iflag_thermals_ed==1) then 97 ! Valeurs au moment de la premiere soumission des papiers 99 98 fact_gamma=1. 100 fact_epsilon=1. 99 fact_epsilon=0.002 100 fact_gamma2=0.6 101 ! Suggestions des Fleurs, Septembre 2009 102 fact_epsilon=0.015 103 !test cr 104 ! fact_epsilon=0.002 105 fact_gamma=0.9 106 fact_gamma2=0.7 107 101 108 else if (iflag_thermals_ed==2) then 102 109 fact_gamma=1. 103 110 fact_epsilon=2. 111 else if (iflag_thermals_ed==3) then 112 fact_gamma=3./4. 113 fact_epsilon=3. 104 114 endif 105 115 106 do l=1,klev 116 write(lunout,*)'THERM 31H ' 117 118 ! Initialisations des variables reeles 119 if (1==0) then 120 ztva(:,:)=ztv(:,:) 121 ztva_est(:,:)=ztva(:,:) 122 ztla(:,:)=zthl(:,:) 123 zqta(:,:)=po(:,:) 124 zha(:,:) = ztva(:,:) 125 else 126 ztva(:,:)=0. 127 ztva_est(:,:)=0. 128 ztla(:,:)=0. 129 zqta(:,:)=0. 130 zha(:,:) =0. 131 endif 132 133 zqla_est(:,:)=0. 134 zqsatth(:,:)=0. 135 zqla(:,:)=0. 136 detr_star(:,:)=0. 137 entr_star(:,:)=0. 138 alim_star(:,:)=0. 139 alim_star_tot(:)=0. 140 csc(:,:)=0. 141 detr(:,:)=0. 142 entr(:,:)=0. 143 zw2(:,:)=0. 144 w_est(:,:)=0. 145 f_star(:,:)=0. 146 wa_moy(:,:)=0. 147 linter(:)=1. 148 linter(:)=1. 149 150 ! Initialisation des variables entieres 151 lmix(:)=1 152 lmix_bis(:)=2 153 wmaxa(:)=0. 154 lalim(:)=1 155 156 !------------------------------------------------------------------------- 157 ! On ne considere comme actif que les colonnes dont les deux premieres 158 ! couches sont instables. 159 !------------------------------------------------------------------------- 160 active(:)=ztv(:,1)>ztv(:,2) 161 162 !------------------------------------------------------------------------- 163 ! Definition de l'alimentation a l'origine dans thermcell_init 164 !------------------------------------------------------------------------- 165 do l=1,klev-1 107 166 do ig=1,ngrid 108 zqla_est(ig,l)=0. 109 ztva_est(ig,l)=ztva(ig,l) 110 zqsatth(ig,l)=0. 167 if (ztv(ig,l)> ztv(ig,l+1) .and. ztv(ig,1)>=ztv(ig,l) ) then 168 alim_star(ig,l)=MAX((ztv(ig,l)-ztv(ig,l+1)),0.) & 169 & *sqrt(zlev(ig,l+1)) 170 lalim(:)=l+1 171 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 172 endif 111 173 enddo 112 174 enddo 113 114 !CR: attention test couche alim 115 ! do l=2,klev 116 ! do ig=1,ngrid 117 ! alim_star(ig,l)=0. 118 ! enddo 119 ! enddo 120 !AM:initialisations du thermique 121 do k=1,klev 122 do ig=1,ngrid 123 ztva(ig,k)=ztv(ig,k) 124 ztla(ig,k)=zthl(ig,k) 125 zqla(ig,k)=0. 126 zqta(ig,k)=po(ig,k) 127 ! 128 ztva(ig,k) = ztla(ig,k)*zpspsk(ig,k)+RLvCp*zqla(ig,k) 129 ztva(ig,k) = ztva(ig,k)/zpspsk(ig,k) 130 zha(ig,k) = ztva(ig,k) 131 ! 132 enddo 133 enddo 134 do k=1,klev 135 do ig=1,ngrid 136 detr_star(ig,k)=0. 137 entr_star(ig,k)=0. 138 139 detr_stara(ig,k)=0. 140 detr_starb(ig,k)=0. 141 detr_starc(ig,k)=0. 142 detr_star0(ig,k)=0. 143 zqla0(ig,k)=0. 144 detr_star1(ig,k)=0. 145 detr_star2(ig,k)=0. 146 entr_star1(ig,k)=0. 147 entr_star2(ig,k)=0. 148 149 detr(ig,k)=0. 150 entr(ig,k)=0. 151 enddo 152 enddo 153 if (prt_level.ge.1) print*,'7 OK convect8' 154 do k=1,klev+1 155 do ig=1,ngrid 156 zw2(ig,k)=0. 157 w_est(ig,k)=0. 158 f_star(ig,k)=0. 159 wa_moy(ig,k)=0. 175 do l=1,klev 176 do ig=1,ngrid 177 if (alim_star_tot(ig) > 1.e-10 ) then 178 alim_star(ig,l)=alim_star(ig,l)/alim_star_tot(ig) 179 endif 160 180 enddo 161 181 enddo 162 163 if (prt_level.ge.1) print*,'8 OK convect8' 164 do ig=1,ngrid 165 linter(ig)=1. 166 lmix(ig)=1 167 lmix_bis(ig)=2 168 wmaxa(ig)=0. 169 enddo 170 171 !----------------------------------------------------------------------------------- 172 !boucle de calcul de la vitesse verticale dans le thermique 173 !----------------------------------------------------------------------------------- 174 do l=1,klev-1 175 do ig=1,ngrid 176 177 178 179 ! Calcul dans la premiere couche active du thermique (ce qu'on teste 180 ! en disant que la couche est instable et que w2 en bas de la couche 181 ! est nulle. 182 183 if (ztv(ig,l).gt.ztv(ig,l+1) & 184 & .and.alim_star(ig,l).gt.1.e-10 & 185 & .and.zw2(ig,l).lt.1e-10) then 186 187 182 alim_star_tot(:)=1. 183 184 185 !------------------------------------------------------------------------------ 186 ! Calcul dans la premiere couche 187 ! On decide dans cette version que le thermique n'est actif que si la premiere 188 ! couche est instable. 189 ! Pourrait etre change si on veut que le thermiques puisse se déclencher 190 ! dans une couche l>1 191 !------------------------------------------------------------------------------ 192 do ig=1,ngrid 188 193 ! Le panache va prendre au debut les caracteristiques de l'air contenu 189 194 ! dans cette couche. 190 ztla(ig,l)=zthl(ig,l) 191 zqta(ig,l)=po(ig,l) 192 zqla(ig,l)=zl(ig,l) 193 f_star(ig,l+1)=alim_star(ig,l) 194 195 zw2(ig,l+1)=2.*RG*(ztv(ig,l)-ztv(ig,l+1))/ztv(ig,l+1) & 196 & *(zlev(ig,l+1)-zlev(ig,l)) & 197 & *0.4*pphi(ig,l)/(pphi(ig,l+1)-pphi(ig,l)) 198 w_est(ig,l+1)=zw2(ig,l+1) 195 if (active(ig)) then 196 ztla(ig,1)=zthl(ig,1) 197 zqta(ig,1)=po(ig,1) 198 zqla(ig,1)=zl(ig,1) 199 !cr: attention, prise en compte de f*(1)=1 200 f_star(ig,2)=alim_star(ig,1) 201 zw2(ig,2)=2.*RG*(ztv(ig,1)-ztv(ig,2))/ztv(ig,2) & 202 & *(zlev(ig,2)-zlev(ig,1)) & 203 & *0.4*pphi(ig,1)/(pphi(ig,2)-pphi(ig,1)) 204 w_est(ig,2)=zw2(ig,2) 205 endif 206 enddo 199 207 ! 200 208 201 202 else if ((zw2(ig,l).ge.1e-10).and. & 203 & (f_star(ig,l)+alim_star(ig,l)).gt.1.e-10) then 204 !estimation du detrainement a partir de la geometrie du pas precedent 205 !tests sur la definition du detr 206 !calcul de detr_star et entr_star 207 208 209 210 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 211 ! FH le test miraculeux de Catherine ? Le bout du tunel ? 212 ! w_est(ig,3)=zw2(ig,2)* & 213 ! & ((f_star(ig,2))**2) & 214 ! & /(f_star(ig,2)+alim_star(ig,2))**2+ & 215 ! & 2.*RG*(ztva(ig,1)-ztv(ig,2))/ztv(ig,2) & 216 ! & *(zlev(ig,3)-zlev(ig,2)) 217 ! if (l.gt.2) then 218 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 209 !============================================================================== 210 !boucle de calcul de la vitesse verticale dans le thermique 211 !============================================================================== 212 do l=2,klev-1 213 !============================================================================== 214 215 216 ! On decide si le thermique est encore actif ou non 217 ! AFaire : Il faut sans doute ajouter entr_star a alim_star dans ce test 218 do ig=1,ngrid 219 active(ig)=active(ig) & 220 & .and. zw2(ig,l)>1.e-10 & 221 & .and. f_star(ig,l)+alim_star(ig,l)>1.e-10 222 enddo 219 223 220 224 … … 222 226 ! Premier calcul de la vitesse verticale a partir de la temperature 223 227 ! potentielle virtuelle 224 225 ! FH CESTQUOI CA ???? 226 #define int1d2 227 !#undef int1d2 228 #ifdef int1d2 229 if (l.ge.2) then 230 #else 231 if (l.gt.2) then 232 #endif 233 234 if (1.eq.1) then 235 w_est(ig,3)=zw2(ig,2)* & 236 & ((f_star(ig,2))**2) & 237 & /(f_star(ig,2)+alim_star(ig,2))**2+ & 238 & 2.*RG*(ztva(ig,2)-ztv(ig,2))/ztv(ig,2) & 239 ! & *1./3. & 240 & *(zlev(ig,3)-zlev(ig,2)) 241 endif 228 ! if (1.eq.1) then 229 ! w_est(ig,3)=zw2(ig,2)* & 230 ! & ((f_star(ig,2))**2) & 231 ! & /(f_star(ig,2)+alim_star(ig,2))**2+ & 232 ! & 2.*RG*(ztva(ig,2)-ztv(ig,2))/ztv(ig,2) & 233 ! & *(zlev(ig,3)-zlev(ig,2)) 234 ! endif 242 235 243 236 244 237 !--------------------------------------------------------------------------- 245 !calcul de l entrainement et du detrainement lateral 238 ! calcul des proprietes thermodynamiques et de la vitesse de la couche l 239 ! sans tenir compte du detrainement et de l'entrainement dans cette 240 ! couche 241 ! Ici encore, on doit pouvoir ajouter entr_star (qui peut etre calculer 242 ! avant) a l'alimentation pour avoir un calcul plus propre 246 243 !--------------------------------------------------------------------------- 247 ! 248 !test:estimation de ztva_new_est sans entrainement 249 250 Tbef=ztla(ig,l-1)*zpspsk(ig,l) 251 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 252 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 253 qsatbef=MIN(0.5,qsatbef) 254 zcor=1./(1.-retv*qsatbef) 255 qsatbef=qsatbef*zcor 256 Zsat = (max(0.,zqta(ig,l-1)-qsatbef) .gt. 1.e-10) 257 if (Zsat) then 258 qlbef=max(0.,zqta(ig,l-1)-qsatbef) 259 DT = 0.5*RLvCp*qlbef 260 do while (abs(DT).gt.DDT0) 261 Tbef=Tbef+DT 262 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 263 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 264 qsatbef=MIN(0.5,qsatbef) 265 zcor=1./(1.-retv*qsatbef) 266 qsatbef=qsatbef*zcor 267 qlbef=zqta(ig,l-1)-qsatbef 268 269 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 270 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta 271 zcor=1./(1.-retv*qsatbef) 272 dqsat_dT=FOEDE(Tbef,zdelta,zcvm5,qsatbef,zcor) 273 num=-Tbef+ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*qlbef 274 denom=1.+RLvCp*dqsat_dT 275 DT=num/denom 276 enddo 277 zqla_est(ig,l) = max(0.,zqta(ig,l-1)-qsatbef) 278 endif 244 245 call thermcell_condens(ngrid,active, & 246 & zpspsk(:,l),pplev(:,l),ztla(:,l-1),zqta(:,l-1),zqla_est(:,l)) 247 248 do ig=1,ngrid 249 if(active(ig)) then 279 250 ztva_est(ig,l) = ztla(ig,l-1)*zpspsk(ig,l)+RLvCp*zqla_est(ig,l) 251 zta_est(ig,l)=ztva_est(ig,l) 280 252 ztva_est(ig,l) = ztva_est(ig,l)/zpspsk(ig,l) 281 zta_est(ig,l)=ztva_est(ig,l)282 253 ztva_est(ig,l) = ztva_est(ig,l)*(1.+RETV*(zqta(ig,l-1) & 283 254 & -zqla_est(ig,l))-zqla_est(ig,l)) … … 287 258 & /(f_star(ig,l)+alim_star(ig,l))**2+ & 288 259 & 2.*RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 289 ! & *1./3. &290 260 & *(zlev(ig,l+1)-zlev(ig,l)) 291 261 if (w_est(ig,l+1).lt.0.) then 292 262 w_est(ig,l+1)=zw2(ig,l) 293 263 endif 294 ! 295 !calcul du detrainement 296 !======================= 297 298 !CR:on vire les modifs 299 if (iflag_thermals_ed==0) then 300 301 ! Modifications du calcul du detrainement. 302 ! Dans la version de la these de Catherine, on passe brusquement 303 ! de la version seche a la version nuageuse pour le detrainement 304 ! ce qui peut occasioner des oscillations. 305 ! dans la nouvelle version, on commence par calculer un detrainement sec. 306 ! Puis un autre en cas de nuages. 307 ! Puis on combine les deux lineairement en fonction de la quantite d'eau. 308 309 #define int1d3 310 !#undef int1d3 311 #define RIO_TH 312 #ifdef RIO_TH 313 !1. Cas non nuageux 314 ! 1.1 on est sous le zmax_sec et w croit 315 if ((w_est(ig,l+1).gt.w_est(ig,l)).and. & 316 & (zlev(ig,l+1).lt.zmax_sec(ig)).and. & 317 #ifdef int1d3 318 & (zqla_est(ig,l).lt.1.e-10)) then 319 #else 320 & (zqla(ig,l-1).lt.1.e-10)) then 321 #endif 322 detr_star(ig,l)=MAX(0.,(rhobarz(ig,l+1) & 323 & *sqrt(w_est(ig,l+1))*sqrt(l_mix*zlev(ig,l+1)) & 324 & -rhobarz(ig,l)*sqrt(w_est(ig,l))*sqrt(l_mix*zlev(ig,l))) & 325 & /(r_aspect*zmax_sec(ig))) 326 detr_stara(ig,l)=detr_star(ig,l) 327 328 if (prt_level.ge.20) print*,'coucou calcul detr 1: ig, l',ig,l 329 330 ! 1.2 on est sous le zmax_sec et w decroit 331 else if ((zlev(ig,l+1).lt.zmax_sec(ig)).and. & 332 #ifdef int1d3 333 & (zqla_est(ig,l).lt.1.e-10)) then 334 #else 335 & (zqla(ig,l-1).lt.1.e-10)) then 336 #endif 337 detr_star(ig,l)=-f0(ig)*f_star(ig,lmix(ig)) & 338 & /(rhobarz(ig,lmix(ig))*wmaxa(ig))* & 339 & (rhobarz(ig,l+1)*sqrt(w_est(ig,l+1)) & 340 & *((zmax_sec(ig)-zlev(ig,l+1))/ & 341 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2. & 342 & -rhobarz(ig,l)*sqrt(w_est(ig,l)) & 343 & *((zmax_sec(ig)-zlev(ig,l))/ & 344 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2.) 345 detr_starb(ig,l)=detr_star(ig,l) 346 347 if (prt_level.ge.20) print*,'coucou calcul detr 2: ig, l',ig,l 348 264 endif 265 enddo 266 267 !------------------------------------------------- 268 !calcul des taux d'entrainement et de detrainement 269 !------------------------------------------------- 270 271 do ig=1,ngrid 272 if (active(ig)) then 273 zdz=zlev(ig,l+1)-zlev(ig,l) 274 zbuoy=RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) 275 zfact=fact_gamma/(1.+fact_gamma) 276 277 ! estimation de la fraction couverte par les thermiques 278 zalpha=f0(ig)*f_star(ig,l)/sqrt(w_est(ig,l))/rhobarz(ig,l) 279 280 !calcul de la soumission papier 281 if (1.eq.1) then 282 fact_epsilon=0.0007 283 ! zfact=0.9/(1.+0.9) 284 zfact=0.3 285 fact_gamma=0.7 286 fact_gamma2=0.6 287 expa=0.25 288 ! Calcul du taux d'entrainement entr_star (epsilon) 289 entr_star(ig,l)=f_star(ig,l)*zdz * ( zfact * MAX(0., & 290 & zbuoy/w_est(ig,l+1) )& 291 !- fact_epsilon/zalpha**0.25 ) & 292 & +0.000 ) 293 294 ! entr_star(ig,l)=f_star(ig,l)*zdz * ( 1./3 * MAX(0., & 295 ! & zbuoy/w_est(ig,l+1) - 1./zalpha**0.25 ) & 296 ! & +0.000 ) 297 ! Calcul du taux de detrainement detr_star (delta) 298 ! if (zqla_est(ig,l).lt.1.e-10) then 299 ! detr_star(ig,l)=f_star(ig,l)*zdz * ( & 300 ! & fact_gamma2 * MAX(0.,fact_epsilon-zbuoy/w_est(ig,l+1) ) & 301 ! & +0.0006 ) 302 ! else 303 ! detr_star(ig,l)=f_star(ig,l)*zdz * ( & 304 ! & fact_gamma2 * MAX(0.,fact_epsilon-zbuoy/w_est(ig,l+1) ) & 305 ! & +0.002 ) 306 ! endif 307 detr_star(ig,l)=f_star(ig,l)*zdz * ( & 308 & fact_gamma2 * MAX(0., & 309 !fact_epsilon/zalpha**0.25 310 & -zbuoy/w_est(ig,l+1) ) & 311 ! & + 0.002*(max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l))**0.6 & 312 !test 313 & + 0.006*(max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l))**0.6 & 314 & +0.0000 ) 349 315 else 350 316 351 ! 1.3 dans les autres cas 352 detr_star(ig,l)=0.002*f0(ig)*f_star(ig,l) & 353 & *(zlev(ig,l+1)-zlev(ig,l)) 354 detr_starc(ig,l)=detr_star(ig,l) 355 356 if (prt_level.ge.20) print*,'coucou calcul detr 3 n: ig, l',ig, l 357 317 ! Calcul du taux d'entrainement entr_star (epsilon) 318 entr_star(ig,l)=f_star(ig,l)*zdz * ( zfact * MAX(0., & 319 & zbuoy/w_est(ig,l+1) - fact_epsilon ) & 320 & +0.0000 ) 321 322 ! Calcul du taux de detrainement detr_star (delta) 323 detr_star(ig,l)=f_star(ig,l)*zdz * ( & 324 & fact_gamma2 * MAX(0.,fact_epsilon-zbuoy/w_est(ig,l+1) ) & 325 & + 0.002*(max(zqta(ig,l-1)-po(ig,l),0.)/po(ig,l))**0.6 & 326 & +0.0000 ) 327 358 328 endif 359 360 #else 361 362 ! 1.1 on est sous le zmax_sec et w croit 363 if ((w_est(ig,l+1).gt.w_est(ig,l)).and. & 364 & (zlev(ig,l+1).lt.zmax_sec(ig)) ) then 365 detr_star(ig,l)=MAX(0.,(rhobarz(ig,l+1) & 366 & *sqrt(w_est(ig,l+1))*sqrt(l_mix*zlev(ig,l+1)) & 367 & -rhobarz(ig,l)*sqrt(w_est(ig,l))*sqrt(l_mix*zlev(ig,l))) & 368 & /(r_aspect*zmax_sec(ig))) 369 370 if (prt_level.ge.20) print*,'coucou calcul detr 1: ig, l', ig, l 371 372 ! 1.2 on est sous le zmax_sec et w decroit 373 else if ((zlev(ig,l+1).lt.zmax_sec(ig)) ) then 374 detr_star(ig,l)=-f0(ig)*f_star(ig,lmix(ig)) & 375 & /(rhobarz(ig,lmix(ig))*wmaxa(ig))* & 376 & (rhobarz(ig,l+1)*sqrt(w_est(ig,l+1)) & 377 & *((zmax_sec(ig)-zlev(ig,l+1))/ & 378 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2. & 379 & -rhobarz(ig,l)*sqrt(w_est(ig,l)) & 380 & *((zmax_sec(ig)-zlev(ig,l))/ & 381 & ((zmax_sec(ig)-zlev(ig,lmix(ig)))))**2.) 382 if (prt_level.ge.20) print*,'coucou calcul detr 1: ig, l', ig, l 383 384 else 385 detr_star=0. 386 endif 387 388 ! 1.3 dans les autres cas 389 detr_starc(ig,l)=0.002*f0(ig)*f_star(ig,l) & 390 & *(zlev(ig,l+1)-zlev(ig,l)) 391 392 coefc=min(zqla(ig,l-1)/1.e-3,1.) 393 if (zlev(ig,l+1).ge.zmax_sec(ig)) coefc=1. 394 coefc=1. 395 ! il semble qu'il soit important de baser le calcul sur 396 ! zqla_est(ig,l-1) plutot que sur zqla_est(ig,l) 397 detr_star(ig,l)=detr_starc(ig,l)*coefc+detr_star(ig,l)*(1.-coefc) 398 399 if (prt_level.ge.20) print*,'coucou calcul detr 2: ig, l', ig, l 400 401 #endif 402 403 404 if (prt_level.ge.20) print*,'coucou calcul detr 444: ig, l', ig, l 405 !IM 730508 beg 406 ! if(itap.GE.7200) THEN 407 ! print*,'th_plume ig,l,itap,zqla_est=',ig,l,itap,zqla_est(ig,l) 408 ! endif 409 !IM 730508 end 410 411 zqla0(ig,l)=zqla_est(ig,l) 412 detr_star0(ig,l)=detr_star(ig,l) 413 !IM 060508 beg 414 ! if(detr_star(ig,l).GT.1.) THEN 415 ! print*,'th_plumeBEF ig l detr_star detr_starc coefc',ig,l,detr_star(ig,l) & 416 ! & ,detr_starc(ig,l),coefc 417 ! endif 418 !IM 060508 end 419 !IM 160508 beg 420 !IM 160508 IF (f0(ig).NE.0.) THEN 421 detr_star(ig,l)=detr_star(ig,l)/f0(ig) 422 !IM 160508 ELSE IF(detr_star(ig,l).EQ.0.) THEN 423 !IM 160508 print*,'WARNING1 : th_plume f0=0, detr_star=0: ig, l, itap',ig,l,itap 424 !IM 160508 ELSE 425 !IM 160508 print*,'WARNING2 : th_plume f0=0, ig, l, itap, detr_star',ig,l,itap,detr_star(ig,l) 426 !IM 160508 ENDIF 427 !IM 160508 end 428 !IM 060508 beg 429 ! if(detr_star(ig,l).GT.1.) THEN 430 ! print*,'th_plumeAFT ig l detr_star f0 1/f0',ig,l,detr_star(ig,l),f0(ig), & 431 ! & float(1)/f0(ig) 432 ! endif 433 !IM 060508 end 434 if (prt_level.ge.20) print*,'coucou calcul detr 445: ig, l', ig, l 435 ! 436 !calcul de entr_star 437 438 ! #undef test2 439 ! #ifdef test2 440 ! La version test2 destabilise beaucoup le modele. 441 ! Il semble donc que ca aide d'avoir un entrainement important sous 442 ! le nuage. 443 ! if (zqla_est(ig,l-1).ge.1.e-10.and.l.gt.lalim(ig)) then 444 ! entr_star(ig,l)=0.4*detr_star(ig,l) 445 ! else 446 ! entr_star(ig,l)=0. 447 ! endif 448 ! #else 449 ! 450 ! Deplacement du calcul de entr_star pour eviter d'avoir aussi 451 ! entr_star > fstar. 452 ! Redeplacer suite a la transformation du cas detr>f 453 ! FH 454 455 if (prt_level.ge.20) print*,'coucou calcul detr 446: ig, l', ig, l 456 #define int1d 457 !FH 070508 #define int1d4 458 !#undef int1d4 459 ! L'option int1d4 correspond au choix dans le cas ou le detrainement 460 ! devient trop grand. 461 462 #ifdef int1d 463 464 #ifdef int1d4 465 #else 466 detr_star(ig,l)=min(detr_star(ig,l),f_star(ig,l)) 467 !FH 070508 plus 468 detr_star(ig,l)=min(detr_star(ig,l),1.) 469 #endif 470 471 entr_star(ig,l)=max(0.4*detr_star(ig,l)-alim_star(ig,l),0.) 472 473 if (prt_level.ge.20) print*,'coucou calcul detr 447: ig, l', ig, l 474 #ifdef int1d4 475 ! Si le detrainement excede le flux en bas + l'entrainement, le thermique 476 ! doit disparaitre. 477 if (detr_star(ig,l)>f_star(ig,l)+entr_star(ig,l)) then 478 detr_star(ig,l)=f_star(ig,l)+entr_star(ig,l) 479 f_star(ig,l+1)=0. 480 linter(ig)=l+1 481 zw2(ig,l+1)=-1.e-10 482 endif 483 #endif 484 485 486 #else 487 488 if (prt_level.ge.20) print*,'coucou calcul detr 448: ig, l', ig, l 489 if(l.gt.lalim(ig)) then 490 entr_star(ig,l)=0.4*detr_star(ig,l) 491 else 492 493 ! FH : 494 ! Cette ligne doit permettre de garantir qu'on a toujours un flux = 1 495 ! en haut de la couche d'alimentation. 496 ! A remettre en questoin a la premiere occasion mais ca peut aider a 497 ! ecrire un code robuste. 498 ! Que ce soit avec ca ou avec l'ancienne facon de faire (e* = 0 mais 499 ! d* non nul) on a une discontinuité de e* ou d* en haut de la couche 500 ! d'alimentation, ce qui n'est pas forcement heureux. 501 502 if (prt_level.ge.20) print*,'coucou calcul detr 449: ig, l', ig, l 503 #undef pre_int1c 504 #ifdef pre_int1c 505 entr_star(ig,l)=max(detr_star(ig,l)-alim_star(ig,l),0.) 506 detr_star(ig,l)=entr_star(ig,l) 507 #else 508 entr_star(ig,l)=0. 509 #endif 510 329 !endif choix du calcul de E* et D* 330 331 !cr test 332 ! entr_star(ig,l)=entr_star(ig,l)+0.2*detr_star(ig,l) 333 334 ! Prise en compte de la fraction 335 ! detr_star(ig,l)=detr_star(ig,l)*sqrt(0.01/max(zalpha,1.e-5)) 336 337 ! En dessous de lalim, on prend le max de alim_star et entr_star pour 338 ! alim_star et 0 sinon 339 if (l.lt.lalim(ig)) then 340 alim_star(ig,l)=max(alim_star(ig,l),entr_star(ig,l)) 341 entr_star(ig,l)=0. 511 342 endif 512 343 513 #endif 514 515 if (prt_level.ge.20) print*,'coucou calcul detr 440: ig, l', ig, l 516 entr_star1(ig,l)=entr_star(ig,l) 517 detr_star1(ig,l)=detr_star(ig,l) 518 ! 519 520 #ifdef int1d 521 #else 522 if (detr_star(ig,l).gt.f_star(ig,l)) then 523 524 ! Ce test est là entre autres parce qu'on passe par des valeurs 525 ! delirantes de detr_star. 526 ! ca vaut sans doute le coup de verifier pourquoi. 527 528 detr_star(ig,l)=f_star(ig,l) 529 #ifdef pre_int1c 530 if (l.gt.lalim(ig)+1) then 531 entr_star(ig,l)=0. 532 alim_star(ig,l)=0. 533 ! FH ajout pour forcer a stoper le thermique juste sous le sommet 534 ! de la couche (voir calcul de finter) 535 zw2(ig,l+1)=-1.e-10 536 linter(ig)=l+1 537 else 538 entr_star(ig,l)=0.4*detr_star(ig,l) 539 endif 540 #else 541 entr_star(ig,l)=0.4*detr_star(ig,l) 542 #endif 543 endif 544 #endif 545 546 else !l > 2 547 detr_star(ig,l)=0. 548 entr_star(ig,l)=0. 549 endif 550 551 entr_star2(ig,l)=entr_star(ig,l) 552 detr_star2(ig,l)=detr_star(ig,l) 553 if (prt_level.ge.20) print*,'coucou calcul detr 450: ig, l', ig, l 554 555 endif ! iflag_thermals_ed==0 556 557 !CR:nvlle def de entr_star et detr_star 558 if (iflag_thermals_ed>=1) then 559 ! if (l.lt.lalim(ig)) then 560 ! if (l.lt.2) then 561 ! entr_star(ig,l)=0. 562 ! detr_star(ig,l)=0. 563 ! else 564 ! if (0.001.gt.(RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l))/(2.*w_est(ig,l+1)))) then 565 ! entr_star(ig,l)=0.001*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 566 ! else 567 ! entr_star(ig,l)= & 568 ! & f_star(ig,l)/(2.*w_est(ig,l+1)) & 569 ! & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)) & 570 ! & *(zlev(ig,l+1)-zlev(ig,l)) 571 572 573 entr_star(ig,l)=MAX(0.*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)), & 574 & f_star(ig,l)/(2.*w_est(ig,l+1)) & 575 & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 576 & *(zlev(ig,l+1)-zlev(ig,l))) & 577 & +0.0001*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 578 579 if (((ztva_est(ig,l)-ztv(ig,l)).gt.1.e-10).and.(l.le.lmix_bis(ig))) then 580 alim_star_tot(ig)=alim_star_tot(ig)+entr_star(ig,l) 581 lalim(ig)=lmix_bis(ig) 582 if(prt_level.GE.10) print*,'alim_star_tot',alim_star_tot(ig),entr_star(ig,l) 583 endif 584 585 if (((ztva_est(ig,l)-ztv(ig,l)).gt.1.e-10).and.(l.le.lmix_bis(ig))) then 586 ! c2(ig,l)=2500000.*zqla_est(ig,l)/(1004.*zta_est(ig,l)) 587 c2(ig,l)=0.001 588 detr_star(ig,l)=MAX(0.*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)), & 589 & c2(ig,l)*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) & 590 & -f_star(ig,l)/(2.*w_est(ig,l+1)) & 591 & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 592 & *(zlev(ig,l+1)-zlev(ig,l))) & 593 & +0.0001*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 594 595 else 596 ! c2(ig,l)=2500000.*zqla_est(ig,l)/(1004.*zta_est(ig,l)) 597 c2(ig,l)=0.003 598 599 detr_star(ig,l)=MAX(0.*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)), & 600 & c2(ig,l)*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) & 601 & -f_star(ig,l)/(2.*w_est(ig,l+1)) & 602 & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l) & 603 & *(zlev(ig,l+1)-zlev(ig,l))) & 604 & +0.0002*f_star(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 605 endif 606 607 608 ! detr_star(ig,l)=detr_star(ig,l)*3. 609 ! if (l.lt.lalim(ig)) then 610 ! entr_star(ig,l)=0. 611 ! endif 612 ! if (l.lt.2) then 613 ! entr_star(ig,l)=0. 614 ! detr_star(ig,l)=0. 615 ! endif 616 617 618 ! endif 619 ! else if ((ztva_est(ig,l)-ztv(ig,l)).gt.1.e-10) then 620 ! entr_star(ig,l)=MAX(0.,0.8*f_star(ig,l)/(2.*w_est(ig,l+1)) & 621 ! & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)) & 622 ! & *(zlev(ig,l+1)-zlev(ig,l)) 623 ! detr_star(ig,l)=0.002*f_star(ig,l) & 624 ! & *(zlev(ig,l+1)-zlev(ig,l)) 625 ! else 626 ! entr_star(ig,l)=0.001*f_star(ig,l) & 627 ! & *(zlev(ig,l+1)-zlev(ig,l)) 628 ! detr_star(ig,l)=MAX(0.,-0.2*f_star(ig,l)/(2.*w_est(ig,l+1)) & 629 ! & *RG*(ztva_est(ig,l)-ztv(ig,l))/ztv(ig,l)) & 630 ! & *(zlev(ig,l+1)-zlev(ig,l)) & 631 ! & +0.002*f_star(ig,l) & 632 ! & *(zlev(ig,l+1)-zlev(ig,l)) 633 ! endif 634 635 endif ! iflag_thermals_ed==1 636 637 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 638 ! FH inutile si on conserve comme on l'a fait plus haut entr=detr 639 ! dans la couche d'alimentation 640 !pas d entrainement dans la couche alim 641 ! if ((l.le.lalim(ig))) then 642 ! entr_star(ig,l)=0. 643 ! endif 644 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 645 ! 646 !prise en compte du detrainement et de l entrainement dans le calcul du flux 647 344 ! Calcul du flux montant normalise 648 345 f_star(ig,l+1)=f_star(ig,l)+alim_star(ig,l)+entr_star(ig,l) & 649 346 & -detr_star(ig,l) 650 347 651 !test sur le signe de f_star 652 if (prt_level.ge.20) print*,'coucou calcul detr 451: ig, l', ig, l653 if (f_star(ig,l+1).gt.1.e-10) then 348 endif 349 enddo 350 654 351 !---------------------------------------------------------------------------- 655 352 !calcul de la vitesse verticale en melangeant Tl et qt du thermique 656 353 !--------------------------------------------------------------------------- 657 ! 658 Zsat=.false. 659 ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & 354 activetmp(:)=active(:) .and. f_star(:,l+1)>1.e-10 355 do ig=1,ngrid 356 if (activetmp(ig)) then 357 Zsat=.false. 358 ztla(ig,l)=(f_star(ig,l)*ztla(ig,l-1)+ & 660 359 & (alim_star(ig,l)+entr_star(ig,l))*zthl(ig,l)) & 661 360 & /(f_star(ig,l+1)+detr_star(ig,l)) 662 ! 663 zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & 361 zqta(ig,l)=(f_star(ig,l)*zqta(ig,l-1)+ & 664 362 & (alim_star(ig,l)+entr_star(ig,l))*po(ig,l)) & 665 363 & /(f_star(ig,l+1)+detr_star(ig,l)) 666 ! 667 Tbef=ztla(ig,l)*zpspsk(ig,l) 668 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 669 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 670 qsatbef=MIN(0.5,qsatbef) 671 zcor=1./(1.-retv*qsatbef) 672 qsatbef=qsatbef*zcor 673 Zsat = (max(0.,zqta(ig,l)-qsatbef) .gt. 1.e-10) 674 if (Zsat) then 675 qlbef=max(0.,zqta(ig,l)-qsatbef) 676 DT = 0.5*RLvCp*qlbef 677 do while (abs(DT).gt.DDT0) 678 Tbef=Tbef+DT 679 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 680 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,l) 681 qsatbef=MIN(0.5,qsatbef) 682 zcor=1./(1.-retv*qsatbef) 683 qsatbef=qsatbef*zcor 684 qlbef=zqta(ig,l)-qsatbef 685 686 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 687 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta 688 zcor=1./(1.-retv*qsatbef) 689 dqsat_dT=FOEDE(Tbef,zdelta,zcvm5,qsatbef,zcor) 690 num=-Tbef+ztla(ig,l)*zpspsk(ig,l)+RLvCp*qlbef 691 denom=1.+RLvCp*dqsat_dT 692 DT=num/denom 693 enddo 694 zqla(ig,l) = max(0.,qlbef) 695 endif 696 ! 364 365 endif 366 enddo 367 368 call thermcell_condens(ngrid,activetmp,zpspsk(:,l),pplev(:,l),ztla(:,l),zqta(:,l),zqla(:,l)) 369 370 371 do ig=1,ngrid 372 if (activetmp(ig)) then 697 373 if (prt_level.ge.20) print*,'coucou calcul detr 4512: ig, l', ig, l 698 374 ! on ecrit de maniere conservative (sat ou non) … … 707 383 !on ecrit zqsat 708 384 zqsatth(ig,l)=qsatbef 709 !calcul de vitesse 710 zw2(ig,l+1)=zw2(ig,l)* & 711 & ((f_star(ig,l))**2) & 712 ! Tests de Catherine 713 ! & /(f_star(ig,l+1)+detr_star(ig,l))**2+ & 714 & /(f_star(ig,l+1)+detr_star(ig,l)-entr_star(ig,l)*(1.-fact_epsilon))**2+ & 715 & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 716 & *fact_gamma & 717 & *(zlev(ig,l+1)-zlev(ig,l)) 718 !prise en compte des forces de pression que qd flottabilité<0 719 ! zw2(ig,l+1)=zw2(ig,l)* & 720 ! & 1./(1.+2.*entr_star(ig,l)/f_star(ig,l)) + & 721 ! & (f_star(ig,l))**2 & 722 ! & /(f_star(ig,l)+entr_star(ig,l))**2+ & 723 ! & (f_star(ig,l)-2.*entr_star(ig,l))**2/(f_star(ig,l)+2.*entr_star(ig,l))**2+ & 724 ! & /(f_star(ig,l+1)+detr_star(ig,l)-entr_star(ig,l)*(1.-2.))**2+ & 725 ! & /(f_star(ig,l)**2+2.*2.*detr_star(ig,l)*f_star(ig,l)+2.*entr_star(ig,l)*f_star(ig,l))+ & 726 ! & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 727 ! & *1./3. & 385 386 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 387 ! zw2(ig,l+1)=& 388 ! & zw2(ig,l)*(1-fact_epsilon/(1.+fact_gamma)*2.*(zlev(ig,l+1)-zlev(ig,l))) & 389 ! & +2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 390 ! & *1./(1.+fact_gamma) & 728 391 ! & *(zlev(ig,l+1)-zlev(ig,l)) 729 730 ! write(30,*),l+1,zw2(ig,l+1)-zw2(ig,l), & 731 ! & -2.*entr_star(ig,l)/f_star(ig,l)*zw2(ig,l), & 732 ! & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l)*(zlev(ig,l+1)-zlev(ig,l)) 733 734 735 ! zw2(ig,l+1)=zw2(ig,l)* & 736 ! & (2.-2.*entr_star(ig,l)/f_star(ig,l)) & 737 ! & -zw2(ig,l-1)+ & 738 ! & 2.*RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) & 739 ! & *1./3. & 740 ! & *(zlev(ig,l+1)-zlev(ig,l)) 741 742 endif 743 endif 392 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 393 ! La meme en plus modulaire : 394 zbuoy=RG*(ztva(ig,l)-ztv(ig,l))/ztv(ig,l) 395 zdz=zlev(ig,l+1)-zlev(ig,l) 396 397 398 zeps=(entr_star(ig,l)+alim_star(ig,l))/(f_star(ig,l)*zdz) 399 400 if (1==0) then 401 zw2modif=zw2(ig,l)*(1-fact_epsilon/(1.+fact_gamma)*2.*zdz) 402 zdw2=2.*zbuoy/(1.+fact_gamma)*zdz 403 zw2(ig,l+1)=zw2modif+zdw2 404 else 405 ! Tentative de reecriture de l'equation de w2. A reprendre ... 406 ! zdw2=2*zdz*zbuoy 407 ! zw2modif=zw2(ig,l)*(1.-2.*zdz*(zeps+fact_epsilon)) 408 !!!!! zw2(ig,l+1)=(zw2(ig,l)+zdw2)/(1.+2.*zfactw2(ig,l)) 409 !formulation Arnaud 410 ! zw2fact=zbuoy*zalpha**expa/fact_epsilon 411 ! zw2(ig,l+1)=(zw2(ig,l)-zw2fact)*exp(-2.*fact_epsilon/(zalpha**expa*(1+fact_gamma))*zdz) & 412 ! & +zw2fact 413 if (zbuoy.gt.1.e-10) then 414 zw2fact=zbuoy*zalpha**expa/fact_epsilon*(fact_gamma-zfact) 415 zw2(ig,l+1)=(zw2(ig,l)-zw2fact)*exp(-2.*fact_epsilon/(zalpha**expa)*zdz) & 416 & +zw2fact 417 else 418 zw2fact=zbuoy*zalpha**expa/fact_epsilon*(fact_gamma) 419 zw2(ig,l+1)=(zw2(ig,l)-zw2fact)*exp(-2.*fact_epsilon/(zalpha**expa)*zdz) & 420 & +zw2fact 421 422 endif 423 424 endif 425 ! zw2(ig,l+1)=zw2modif+zdw2 426 endif 427 enddo 428 744 429 if (prt_level.ge.20) print*,'coucou calcul detr 460: ig, l',ig, l 745 430 ! 431 !--------------------------------------------------------------------------- 746 432 !initialisations pour le calcul de la hauteur du thermique, de l'inversion et de la vitesse verticale max 747 433 !--------------------------------------------------------------------------- 434 435 do ig=1,ngrid 748 436 if (zw2(ig,l+1)>0. .and. zw2(ig,l+1).lt.1.e-10) then 749 437 ! stop'On tombe sur le cas particulier de thermcell_dry' … … 753 441 endif 754 442 755 ! if ((zw2(ig,l).gt.0.).and. (zw2(ig,l+1).le.0.)) then756 443 if (zw2(ig,l+1).lt.0.) then 757 444 linter(ig)=(l*(zw2(ig,l+1)-zw2(ig,l)) & … … 771 458 wmaxa(ig)=wa_moy(ig,l+1) 772 459 endif 773 enddo 460 enddo 461 462 !========================================================================= 463 ! FIN DE LA BOUCLE VERTICALE 774 464 enddo 775 776 !on remplace a* par e* ds premiere couche 777 ! if (iflag_thermals_ed.ge.1) then 778 ! do ig=1,ngrid 779 ! do l=2,klev 780 ! if (l.lt.lalim(ig)) then 781 ! alim_star(ig,l)=entr_star(ig,l) 782 ! endif 783 ! enddo 784 ! enddo 785 ! do ig=1,ngrid 786 ! lalim(ig)=lmix_bis(ig) 787 ! enddo 788 ! endif 789 if (iflag_thermals_ed.ge.1) then 790 do ig=1,ngrid 791 do l=2,lalim(ig) 792 alim_star(ig,l)=entr_star(ig,l) 793 entr_star(ig,l)=0. 794 enddo 795 enddo 796 endif 465 !========================================================================= 466 467 !on recalcule alim_star_tot 468 do ig=1,ngrid 469 alim_star_tot(ig)=0. 470 enddo 471 do ig=1,ngrid 472 do l=1,lalim(ig)-1 473 alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,l) 474 enddo 475 enddo 476 477 797 478 if (prt_level.ge.20) print*,'coucou calcul detr 470: ig, l', ig, l 798 479
Note: See TracChangeset
for help on using the changeset viewer.