Changeset 1330
- Timestamp:
- Mar 24, 2010, 1:41:35 PM (15 years ago)
- Location:
- LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcellV0_main.F90
r1299 r1330 225 225 !Initialisation 226 226 ! 227 ! IF (1.eq.0) THEN228 ! do ig=1,klon229 !FH/IM 130308 if ((debut).or.((.not.debut).and.(f0(ig).lt.1.e-10))) then230 ! if ((.not.debut).and.(f0(ig).lt.1.e-10)) then231 ! f0(ig)=1.e-5232 ! zmax0(ig)=40.233 !v1d therm=.false.234 ! endif235 ! enddo236 ! ENDIF !(1.eq.0) THEN237 227 if (prt_level.ge.10)write(lunout,*) & 238 228 & 'WARNING thermcell_main f0=max(f0,1.e-2)' 239 229 do ig=1,klon 240 if (prt_level.ge.20) then241 print*,'th_main ig f0',ig,f0(ig)242 endif243 230 f0(ig)=max(f0(ig),1.e-2) 244 !IMmarche pas ?! if (f0(ig)<1.e-2) f0(ig)=1.e-2245 231 enddo 246 232 … … 637 623 zf2=zf/(1.-zf) 638 624 ! 639 if (prt_level.ge.10) print*,'14e OK convect8 ig,l,zf,zf2',ig,l,zf,zf2640 !641 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)642 625 thetath2(ig,l)=zf2*(zha(ig,l)-zh(ig,l)/zpspsk(ig,l))**2 643 626 if(zw2(ig,l).gt.1.e-10) then … … 649 632 wth3(ig,l)=zf2*(1-2.*fraca(ig,l))/(1-fraca(ig,l)) & 650 633 & *zw2(ig,l)*zw2(ig,l)*zw2(ig,l) 651 if (prt_level.ge.10) print*,'14g OK convect8 ig,l,po',ig,l,po(ig,l)652 634 q2(ig,l)=zf2*(zqta(ig,l)*1000.-po(ig,l)*1000.)**2 653 635 !test: on calcul q2/po=ratqsc … … 655 637 enddo 656 638 enddo 657 !calcul de ale_bl et alp_bl 658 !pour le calcul d'une valeur intégrée entre la surface et lmax 639 640 if (prt_level.ge.10) then 641 print*,'14e OK convect8 ig,l,zf,zf2',ig,l,zf,zf2 642 ig=igout 643 do l=1,nlay 644 print*,'14f OK convect8 ig,l,zha zh zpspsk ',ig,l,zha(ig,l),zh(ig,l),zpspsk(ig,l) 645 enddo 646 do l=1,nlay 647 print*,'14g OK convect8 ig,l,po',ig,l,po(ig,l) 648 enddo 649 endif 650 659 651 do ig=1,ngrid 660 652 alp_int(ig)=0. -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_env.F90
r970 r1330 1 1 SUBROUTINE thermcell_env(ngrid,nlay,po,pt,pu,pv,pplay, & 2 & pplev,zo,zh,zl,ztv,zthl,zu,zv,zpspsk, zqsat,lev_out)2 & pplev,zo,zh,zl,ztv,zthl,zu,zv,zpspsk,pqsat,lev_out) 3 3 4 4 !-------------------------------------------------------------- … … 31 31 REAL zu(ngrid,nlay) 32 32 REAL zv(ngrid,nlay) 33 REAL zqsat(ngrid,nlay)33 REAL pqsat(ngrid,nlay) 34 34 35 INTEGER ig,l ,ll35 INTEGER ig,ll 36 36 37 real zcor,zdelta,zcvm5,qlbef 38 real Tbef,qsatbef 39 real dqsat_dT,DT,num,denom 40 REAL RLvCp,DDT0 41 PARAMETER (DDT0=.01) 42 LOGICAL Zsat 37 real dqsat_dT 38 real RLvCp 43 39 44 Zsat=.false. 45 RLvCp = RLVTT/RCPD 40 logical mask(ngrid,nlay) 46 41 47 ! 48 ! Pr Tprec=Tl calcul de qsat 49 ! Si qsat>qT T=Tl, q=qT 50 ! Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt) 51 ! On cherche DDT < DDT0 42 43 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 44 ! Initialisations : 45 !------------------ 46 47 print*,'THERMCELL ENV OPTIMISE ' 48 mask(:,:)=.true. 49 RLvCp = RLVTT/RCPD 50 52 51 ! 53 52 ! calcul des caracteristiques de l environnement … … 57 56 zl(ig,ll)=0. 58 57 zh(ig,ll)=pt(ig,ll) 59 zqsat(ig,ll)=0.60 58 EndDO 61 59 EndDO 62 60 ! 63 61 ! 64 !recherche de saturation dans l environnement 65 DO ll=1,nlay 66 ! les points insatures sont definitifs 67 DO ig=1,ngrid 68 Tbef=pt(ig,ll) 69 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 70 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,ll) 71 qsatbef=MIN(0.5,qsatbef) 72 zcor=1./(1.-retv*qsatbef) 73 qsatbef=qsatbef*zcor 74 Zsat = (max(0.,po(ig,ll)-qsatbef) .gt. 1.e-10) 75 if (Zsat) then 76 qlbef=max(0.,po(ig,ll)-qsatbef) 77 ! si sature: ql est surestime, d'ou la sous-relax 78 DT = 0.5*RLvCp*qlbef 79 ! on pourra enchainer 2 ou 3 calculs sans Do while 80 do while (abs(DT).gt.DDT0) 81 ! il faut verifier si c,a conserve quand on repasse en insature ... 82 Tbef=Tbef+DT 83 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 84 qsatbef= R2ES * FOEEW(Tbef,zdelta)/pplev(ig,ll) 85 qsatbef=MIN(0.5,qsatbef) 86 zcor=1./(1.-retv*qsatbef) 87 qsatbef=qsatbef*zcor 88 ! on veut le signe de qlbef 89 qlbef=po(ig,ll)-qsatbef 90 ! dqsat_dT 91 zdelta=MAX(0.,SIGN(1.,RTT-Tbef)) 92 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta 93 zcor=1./(1.-retv*qsatbef) 94 dqsat_dT=FOEDE(Tbef,zdelta,zcvm5,qsatbef,zcor) 95 num=-Tbef+pt(ig,ll)+RLvCp*qlbef 96 denom=1.+RLvCp*dqsat_dT 97 if (denom.lt.1.e-10) then 98 print*,'pb denom' 99 endif 100 DT=num/denom 101 enddo 102 ! on ecrit de maniere conservative (sat ou non) 103 zl(ig,ll) = max(0.,qlbef) 104 ! T = Tl +Lv/Cp ql 105 zh(ig,ll) = pt(ig,ll)+RLvCp*zl(ig,ll) 106 zo(ig,ll) = po(ig,ll)-zl(ig,ll) 107 endif 108 !on ecrit zqsat 109 zqsat(ig,ll)=qsatbef 110 EndDO 111 EndDO 62 ! Condensation : 63 !--------------- 64 ! Calcul de l'humidite a saturation et de la condensation 65 66 call thermcell_qsat(ngrid*nlay,mask,pplev,pt,po,pqsat) 67 DO ll=1,nlay 68 DO ig=1,ngrid 69 zl(ig,ll) = max(0.,po(ig,ll)-pqsat(ig,ll)) 70 zh(ig,ll) = pt(ig,ll)+RLvCp*zl(ig,ll) ! T = Tl + Lv/Cp ql 71 zo(ig,ll) = po(ig,ll)-zl(ig,ll) 72 ENDDO 73 ENDDO 112 74 ! 113 75 ! 114 76 !----------------------------------------------------------------------- 115 ! incrementation eventuelle de tendances precedentes:116 ! ---------------------------------------------------117 77 118 78 if (prt_level.ge.1) print*,'0 OK convect8' 119 79 120 DO 1010l=1,nlay121 DO 1015ig=1,ngrid122 zpspsk(ig,l )=(pplay(ig,l)/100000.)**RKAPPA123 zu(ig,l )=pu(ig,l)124 zv(ig,l )=pv(ig,l)80 DO ll=1,nlay 81 DO ig=1,ngrid 82 zpspsk(ig,ll)=(pplay(ig,ll)/100000.)**RKAPPA 83 zu(ig,ll)=pu(ig,ll) 84 zv(ig,ll)=pv(ig,ll) 125 85 !attention zh est maintenant le profil de T et plus le profil de theta ! 86 ! Quelle horreur ! A eviter. 126 87 ! 127 88 ! T-> Theta 128 ztv(ig,l )=zh(ig,l)/zpspsk(ig,l)89 ztv(ig,ll)=zh(ig,ll)/zpspsk(ig,ll) 129 90 !Theta_v 130 ztv(ig,l)=ztv(ig,l)*(1.+RETV*(zo(ig,l)) & 131 & -zl(ig,l)) 91 ztv(ig,ll)=ztv(ig,ll)*(1.+RETV*(zo(ig,ll))-zl(ig,ll)) 132 92 !Thetal 133 zthl(ig,l )=pt(ig,l)/zpspsk(ig,l)93 zthl(ig,ll)=pt(ig,ll)/zpspsk(ig,ll) 134 94 ! 135 1015 CONTINUE 136 1010 CONTINUE 95 ENDDO 96 ENDDO 137 97 138 98 RETURN -
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_flux2.F90
r1299 r1330 41 41 REAL zfm 42 42 43 integer igout 43 integer igout,lout 44 44 integer lev_out 45 45 integer lunout1 … … 49 49 REAL fomass_max,alphamax 50 50 save fomass_max,alphamax 51 52 logical check_debug,labort_gcm 51 53 52 54 character (len=20) :: modname='thermcell_flux2' … … 84 86 ! Verification de la nullite des entrainement et detrainement au dessus 85 87 ! de lmax(ig) 86 !------------------------------------------------------------------------- 87 88 ! Active uniquement si check_debug=.true. ou prt_level>=10 89 !------------------------------------------------------------------------- 90 91 check_debug=.false..or.prt_level>=10 92 93 if (check_debug) then 88 94 do l=1,klev 89 95 do ig=1,ngrid … … 102 108 print*,'detr_star(ig,l)',detr_star(ig,l) 103 109 abort_message = '' 110 labort_gcm=.true. 104 111 CALL abort_gcm (modname,abort_message,1) 105 112 endif … … 107 114 enddo 108 115 enddo 116 endif 109 117 110 118 !------------------------------------------------------------------------- … … 259 267 260 268 ! do l=1,klev 269 270 271 272 labort_gcm=.false. 261 273 do ig=1,ngrid 262 274 if (entr(ig,l)<0.) then 263 print*,'N1 ig,l,entr',ig,l,entr(ig,l) 264 abort_message = 'entr negatif' 265 CALL abort_gcm (modname,abort_message,1) 266 endif 275 labort_gcm=.true. 276 igout=ig 277 lout=l 278 endif 279 enddo 280 281 if (labort_gcm) then 282 print*,'N1 ig,l,entr',igout,lout,entr(igout,lout) 283 abort_message = 'entr negatif' 284 CALL abort_gcm (modname,abort_message,1) 285 endif 286 287 do ig=1,ngrid 267 288 if (detr(ig,l).gt.fm(ig,l)) then 268 289 ncorecfm6=ncorecfm6+1 … … 287 308 entr(ig,l)=0. 288 309 endif 289 310 enddo 311 312 labort_gcm=.false. 313 do ig=1,ngrid 290 314 if (entr(ig,l).lt.0.) then 291 print*,'ig,l,lmax(ig)',ig,l,lmax(ig) 292 print*,'entr(ig,l)',entr(ig,l) 293 print*,'fm(ig,l)',fm(ig,l) 294 abort_message = 'probleme dans thermcell flux' 295 CALL abort_gcm (modname,abort_message,1) 296 endif 297 enddo 315 labort_gcm=.true. 316 igout=ig 317 endif 318 enddo 319 if (labort_gcm) then 320 ig=igout 321 print*,'ig,l,lmax(ig)',ig,l,lmax(ig) 322 print*,'entr(ig,l)',entr(ig,l) 323 print*,'fm(ig,l)',fm(ig,l) 324 abort_message = 'probleme dans thermcell flux' 325 CALL abort_gcm (modname,abort_message,1) 326 endif 327 328 298 329 ! enddo 299 330 endif … … 313 344 detr(ig,l)=detr(ig,l)+fm(ig,l+1) 314 345 fm(ig,l+1)=0. 315 ! print*,'fm2<0',l+1,lmax(ig)316 346 ncorecfm2=ncorecfm2+1 317 347 endif 348 enddo 349 350 labort_gcm=.false. 351 do ig=1,ngrid 318 352 if (detr(ig,l).lt.0.) then 353 labort_gcm=.true. 354 igout=ig 355 endif 356 enddo 357 if (labort_gcm) then 358 ig=igout 319 359 print*,'cas 2 : ig,l,lmax(ig)',ig,l,lmax(ig) 320 360 print*,'detr(ig,l)',detr(ig,l) … … 322 362 abort_message = 'probleme dans thermcell flux' 323 363 CALL abort_gcm (modname,abort_message,1) 324 endif 325 enddo 364 endif 326 365 ! enddo 327 366 … … 388 427 389 428 if (1.eq.1) then 429 labort_gcm=.false. 390 430 do l=1,klev-1 391 431 do ig=1,ngrid … … 408 448 else 409 449 if(l.ge.lmax(ig).and.0.eq.1) then 450 igout=ig 451 lout=l 452 labort_gcm=.true. 453 endif 454 entr(ig,l+1)=entr(ig,l+1)-ddd 455 detr(ig,l)=0. 456 fm(ig,l+1)=fm(ig,l)+entr(ig,l) 457 detr(ig,l)=0. 458 endif 459 endif 460 endif 461 enddo 462 enddo 463 if (labort_gcm) then 464 ig=igout 465 l=lout 410 466 print*,'ig,l',ig,l 411 467 print*,'eee0',eee0 … … 424 480 abort_message = 'probleme dans thermcell_flux' 425 481 CALL abort_gcm (modname,abort_message,1) 426 endif 427 entr(ig,l+1)=entr(ig,l+1)-ddd 428 detr(ig,l)=0. 429 fm(ig,l+1)=fm(ig,l)+entr(ig,l) 430 detr(ig,l)=0. 431 endif 432 endif 433 endif 434 enddo 435 enddo 482 endif 436 483 endif 437 484 !
Note: See TracChangeset
for help on using the changeset viewer.