source: LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_qsat.F90 @ 1336

Last change on this file since 1336 was 1336, checked in by idelkadi, 14 years ago
  • Remise de la valeur par default de alp_offset a 0.
  • Ajout de la possiblite de lecture des parametres de ini_wake.F dans le fichier ini_wake_param.data
  • Ajout de la possiblite de lecture des parametres de wake.F dans le fichier wake_param.data
  • Correction dans la partie convection (nouvelle physique)
File size: 2.5 KB
Line 
1subroutine thermcell_qsat(klon,mask,pplev,ptemp,pqt,pqsat)
2implicit none
3
4#include "YOMCST.h"
5#include "YOETHF.h"
6#include "FCTTRE.h"
7
8!====================================================================
9! DECLARATIONS
10!====================================================================
11
12! Arguments
13INTEGER klon
14REAL pplev(klon)
15REAL ptemp(klon),pqt(klon),pqsat(klon)
16LOGICAL mask(klon)
17
18! Variables locales
19INTEGER ig,iter
20REAL Tbef(klon),DT(klon)
21REAL tdelta,zcor,qlbef,zdelta,zcvm5,dqsat,num,denom,dqsat_dT
22logical Zsat
23REAL RLvCp
24REAL, SAVE :: DDT0=.01
25LOGICAL afaire(klon),tout_converge
26
27!====================================================================
28! INITIALISATIONS
29!====================================================================
30
31RLvCp = RLVTT/RCPD
32tout_converge=.false.
33afaire(:)=mask(:)
34DT(:)=0.
35
36
37!====================================================================
38! Routine a vectoriser en copiant mask dans converge et en mettant
39! la boucle sur les iterations a l'exterieur est en mettant
40! converge= false des que la convergence est atteinte.
41! Pr Tprec=Tl calcul de qsat
42! Si qsat>qT T=Tl, q=qT
43! Sinon DDT=(-Tprec+Tl+RLVCP (qT-qsat(T')) / (1+RLVCP dqsat/dt)
44! On cherche DDT < DDT0
45!====================================================================
46
47do ig=1,klon
48   if (mask(ig)) then
49               Tbef(ig)=ptemp(ig)
50               zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
51               pqsat(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig)
52               pqsat(ig)=MIN(0.5,pqsat(ig))
53               zcor=1./(1.-retv*pqsat(ig))
54               pqsat(ig)=pqsat(ig)*zcor
55               qlbef=max(0.,pqt(ig)-pqsat(ig))
56               afaire(ig)=qlbef>1.e-10
57               DT(ig) = 0.5*RLvCp*qlbef
58     endif
59enddo
60
61
62do iter=1,10
63    afaire(:)=(abs(DT(:))>DDT0).and.afaire(:)
64    do ig=1,klon
65               if (afaire(ig)) then
66                 Tbef(ig)=Tbef(ig)+DT(ig)
67                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
68                 pqsat(ig)= R2ES * FOEEW(Tbef(ig),zdelta)/pplev(ig)
69                 pqsat(ig)=MIN(0.5,pqsat(ig))
70                 zcor=1./(1.-retv*pqsat(ig))
71                 pqsat(ig)=pqsat(ig)*zcor
72                 qlbef=pqt(ig)-pqsat(ig)
73                 zdelta=MAX(0.,SIGN(1.,RTT-Tbef(ig)))
74                 zcvm5=R5LES*(1.-zdelta) + R5IES*zdelta
75                 zcor=1./(1.-retv*pqsat(ig))
76                 dqsat_dT=FOEDE(Tbef(ig),zdelta,zcvm5,pqsat(ig),zcor)
77                 num=-Tbef(ig)+ptemp(ig)+RLvCp*qlbef
78                 denom=1.+RLvCp*dqsat_dT
79                 DT(ig)=num/denom
80               endif
81    enddo
82enddo
83
84return
85end
Note: See TracBrowser for help on using the repository browser.