/[lmdze]/trunk/libf/phylmd/Conflx/flxmain.f90
ViewVC logotype

Annotation of /trunk/libf/phylmd/Conflx/flxmain.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (hide annotations)
Thu Jul 26 14:37:37 2012 UTC (11 years, 9 months ago) by guez
File size: 10166 byte(s)
Changed handling of compiler in compilation system.

Removed the prefix letters "y", "p", "t" or "z" in some names of variables.

Replaced calls to NetCDF by calls to NetCDF95.

Extracted "ioget_calendar" procedures from "calendar.f90" into a
separate file.

Extracted to a separate file, "mathop2.f90", procedures that were not
part of the generic interface "mathop" in "mathop.f90".

Removed computation of "dq" in "bilan_dyn", which was not used.

In "iniadvtrac", removed schemes 20 Slopes and 30 Prather. Was not
compatible with declarations of array sizes.

In "clcdrag", "ustarhb", "vdif_kcay", "yamada4" and "coefkz", changed
the size of some arrays from "klon" to "knon".

Removed possible call to "conema3" in "physiq".

Removed unused argument "cd" in "yamada".

1 guez 62 module flxmain_m
2    
3     IMPLICIT none
4    
5     contains
6    
7     SUBROUTINE flxmain(pdtime, pten, pqen, pqsen, pqhfl, pap, paph, pgeo, &
8     ldland, ptte, pqte, pvervel, prsfc, pssfc, kcbot, kctop, kdtop, pmfu, &
9     pmfd, pen_u, pde_u, pen_d, pde_d, dt_con, dq_con, pmflxr, pmflxs)
10    
11     USE dimphy, ONLY: klev, klon
12     USE suphec_m, ONLY: rcpd, retv, rg, rlvtt
13     USE yoethf_m, ONLY: r4les, r5les
14     USE yoecumf, ONLY: cmfdeps, entrpen, entrscv, lmfdd
15    
16     REAL pten(klon,klev), pqen(klon,klev), pqsen(klon,klev)
17     REAL ptte(klon,klev)
18     REAL pqte(klon,klev)
19     REAL pvervel(klon,klev)
20     REAL pgeo(klon,klev), pap(klon,klev), paph(klon,klev+1)
21     REAL pqhfl(klon)
22    
23     REAL ptu(klon,klev), pqu(klon,klev), plu(klon,klev)
24     REAL plude(klon,klev)
25     REAL pmfu(klon,klev)
26     REAL prsfc(klon), pssfc(klon)
27     INTEGER kcbot(klon), kctop(klon), ktype(klon)
28     LOGICAL ldland(klon), ldcum(klon)
29    
30     REAL ztenh(klon,klev), zqenh(klon,klev), zqsenh(klon,klev)
31     REAL zgeoh(klon,klev)
32     REAL zmfub(klon), zmfub1(klon)
33     REAL zmfus(klon,klev), zmfuq(klon,klev), zmful(klon,klev)
34     REAL zdmfup(klon,klev), zdpmel(klon,klev)
35     REAL zentr(klon), zhcbase(klon)
36     REAL zdqpbl(klon), zdqcv(klon), zdhpbl(klon)
37     REAL zrfl(klon)
38     REAL pmflxr(klon,klev+1)
39     REAL pmflxs(klon,klev+1)
40     INTEGER ilab(klon,klev), ictop0(klon)
41     LOGICAL llo1
42     REAL dt_con(klon,klev), dq_con(klon,klev)
43     REAL zmfmax, zdh
44     REAL, intent(in):: pdtime
45     real zqumqe, zdqmin, zalvdcp, zhsat, zzz
46     REAL zhhat, zpbmpt, zgam, zeps, zfac
47     INTEGER i, k, ikb, itopm2, kcum
48    
49     REAL pen_u(klon,klev), pde_u(klon,klev)
50     REAL pen_d(klon,klev), pde_d(klon,klev)
51    
52     REAL ptd(klon,klev), pqd(klon,klev), pmfd(klon,klev)
53     REAL zmfds(klon,klev), zmfdq(klon,klev), zdmfdp(klon,klev)
54     INTEGER kdtop(klon)
55     LOGICAL lddraf(klon)
56    
57     LOGICAL:: firstcal = .TRUE.
58    
59     !---------------------------------------------------------------------
60    
61     IF (firstcal) THEN
62     CALL flxsetup
63     firstcal = .FALSE.
64     ENDIF
65    
66     DO i = 1, klon
67     ldcum(i) = .FALSE.
68     ENDDO
69     DO k = 1, klev
70     DO i = 1, klon
71     dt_con(i,k) = 0.0
72     dq_con(i,k) = 0.0
73     ENDDO
74     ENDDO
75    
76     ! initialiser les variables et faire l'interpolation verticale
77    
78     CALL flxini(pten, pqen, pqsen, pgeo, &
79     paph, zgeoh, ztenh, zqenh, zqsenh, &
80     ptu, pqu, ptd, pqd, pmfd, zmfds, zmfdq, zdmfdp, &
81     pmfu, zmfus, zmfuq, zdmfup, &
82     zdpmel, plu, plude, ilab, pen_u, pde_u, pen_d, pde_d)
83    
84     ! determiner les valeurs au niveau de base de la tour convective
85    
86     CALL flxbase(ztenh, zqenh, zgeoh, paph, &
87     ptu, pqu, plu, ldcum, kcbot, ilab)
88    
89     ! calculer la convergence totale de l'humidite et celle en provenance
90     ! de la couche limite, plus precisement, la convergence integree entre
91     ! le sol et la base de la convection. Cette derniere convergence est
92     ! comparee avec l'evaporation obtenue dans la couche limite pour
93     ! determiner le type de la convection
94    
95     k=1
96     DO i = 1, klon
97     zdqcv(i) = pqte(i,k)*(paph(i,k+1)-paph(i,k))
98     zdhpbl(i) = 0.0
99     zdqpbl(i) = 0.0
100     ENDDO
101    
102     DO k=2,klev
103     DO i = 1, klon
104 guez 52 zdqcv(i)=zdqcv(i)+pqte(i,k)*(paph(i,k+1)-paph(i,k))
105     IF (k.GE.kcbot(i)) THEN
106     zdqpbl(i)=zdqpbl(i)+pqte(i,k)*(paph(i,k+1)-paph(i,k))
107     zdhpbl(i)=zdhpbl(i)+(RCPD*ptte(i,k)+RLVTT*pqte(i,k)) &
108 guez 62 *(paph(i,k+1)-paph(i,k))
109 guez 52 ENDIF
110 guez 62 ENDDO
111     ENDDO
112    
113     DO i = 1, klon
114     ktype(i) = 2
115     if (zdqcv(i).GT.MAX(0.,-1.5*pqhfl(i)*RG)) ktype(i) = 1
116     !cc if (zdqcv(i).GT.MAX(0.,-1.1*pqhfl(i)*RG)) ktype(i) = 1
117     ENDDO
118    
119     ! determiner le flux de masse entrant a travers la base.
120     ! on ignore, pour l'instant, l'effet du panache descendant
121    
122     DO i = 1, klon
123     ikb=kcbot(i)
124     zqumqe=pqu(i,ikb)+plu(i,ikb)-zqenh(i,ikb)
125     zdqmin=MAX(0.01*zqenh(i,ikb),1.E-10)
126     IF (zdqpbl(i).GT.0..AND.zqumqe.GT.zdqmin.AND.ldcum(i)) THEN
127     zmfub(i) = zdqpbl(i)/(RG*MAX(zqumqe,zdqmin))
128     ELSE
129     zmfub(i) = 0.01
130     ldcum(i)=.FALSE.
131     ENDIF
132     IF (ktype(i).EQ.2) THEN
133     zdh = RCPD*(ptu(i,ikb)-ztenh(i,ikb)) + RLVTT*zqumqe
134     zdh = RG * MAX(zdh,1.0E5*zdqmin)
135     IF (zdhpbl(i).GT.0..AND.ldcum(i))zmfub(i)=zdhpbl(i)/zdh
136     ENDIF
137     zmfmax = (paph(i,ikb)-paph(i,ikb-1)) / (RG*pdtime)
138     zmfub(i) = MIN(zmfub(i),zmfmax)
139     zentr(i) = ENTRSCV
140     IF (ktype(i).EQ.1) zentr(i) = ENTRPEN
141     ENDDO
142    
143     ! DETERMINE CLOUD ASCENT FOR ENTRAINING PLUME
144    
145     ! (A) calculer d'abord la hauteur "theorique" de la tour convective sans
146     ! considerer l'entrainement ni le detrainement du panache, sachant
147     ! ces derniers peuvent abaisser la hauteur theorique.
148    
149     DO i = 1, klon
150     ikb=kcbot(i)
151     zhcbase(i)=RCPD*ptu(i,ikb)+zgeoh(i,ikb)+RLVTT*pqu(i,ikb)
152     ictop0(i)=kcbot(i)-1
153     ENDDO
154    
155     zalvdcp=RLVTT/RCPD
156     DO k=klev-1,3,-1
157     DO i = 1, klon
158     zhsat=RCPD*ztenh(i,k)+zgeoh(i,k)+RLVTT*zqsenh(i,k)
159     zgam=R5LES*zalvdcp*zqsenh(i,k)/ &
160     ((1.-RETV *zqsenh(i,k))*(ztenh(i,k)-R4LES)**2)
161     zzz=RCPD*ztenh(i,k)*0.608
162     zhhat=zhsat-(zzz+zgam*zzz)/(1.+zgam*zzz/RLVTT)* &
163     MAX(zqsenh(i,k)-zqenh(i,k),0.)
164     IF(k.LT.ictop0(i).AND.zhcbase(i).GT.zhhat) ictop0(i)=k
165     ENDDO
166     ENDDO
167    
168     ! (B) calculer le panache ascendant
169    
170     CALL flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen, &
171     pgeo, zgeoh, pap, paph, pqte, pvervel, &
172     ldland, ldcum, ktype, ilab, &
173     ptu, pqu, plu, pmfu, zmfub, zentr, &
174     zmfus, zmfuq, zmful, plude, zdmfup, &
175     kcbot, kctop, ictop0, kcum, pen_u, pde_u)
176    
177     IF (kcum /= 0) then
178     ! verifier l'epaisseur de la convection et changer eventuellement
179     ! le taux d'entrainement/detrainement
180    
181     DO i = 1, klon
182     zpbmpt=paph(i,kcbot(i))-paph(i,kctop(i))
183     IF(ldcum(i).AND.ktype(i).EQ.1.AND.zpbmpt.LT.2.E4)ktype(i)=2
184     IF(ldcum(i)) ictop0(i)=kctop(i)
185     IF(ktype(i).EQ.2) zentr(i)=ENTRSCV
186     ENDDO
187    
188     IF (lmfdd) THEN ! si l'on considere le panache descendant
189     ! calculer la precipitation issue du panache ascendant pour
190     ! determiner l'existence du panache descendant dans la convection
191     DO i = 1, klon
192     zrfl(i)=zdmfup(i,1)
193     ENDDO
194     DO k=2,klev
195     DO i = 1, klon
196     zrfl(i)=zrfl(i)+zdmfup(i,k)
197     ENDDO
198     ENDDO
199    
200     ! determiner le LFS (level of free sinking: niveau de plonge libre)
201     CALL flxdlfs(ztenh, zqenh, zgeoh, paph, ptu, pqu, &
202     ldcum, kcbot, kctop, zmfub, zrfl, &
203     ptd, pqd, &
204     pmfd, zmfds, zmfdq, zdmfdp, &
205     kdtop, lddraf)
206    
207     ! calculer le panache descendant
208     CALL flxddraf(ztenh, zqenh, &
209     zgeoh, paph, zrfl, &
210     ptd, pqd, &
211     pmfd, zmfds, zmfdq, zdmfdp, &
212     lddraf, pen_d, pde_d)
213    
214     ! calculer de nouveau le flux de masse entrant a travers la base
215     ! de la convection, sachant qu'il a ete modifie par le panache
216     ! descendant
217     DO i = 1, klon
218     IF (lddraf(i)) THEN
219     ikb = kcbot(i)
220     llo1 = PMFD(i,ikb).LT.0.
221     zeps = 0.
222     IF ( llo1 ) zeps = CMFDEPS
223     zqumqe = pqu(i,ikb)+plu(i,ikb)- &
224     zeps*pqd(i,ikb)-(1.-zeps)*zqenh(i,ikb)
225     zdqmin = MAX(0.01*zqenh(i,ikb),1.E-10)
226     zmfmax = (paph(i,ikb)-paph(i,ikb-1)) / (RG*pdtime)
227     IF (zdqpbl(i).GT.0..AND.zqumqe.GT.zdqmin.AND.ldcum(i) &
228     .AND.zmfub(i).LT.zmfmax) THEN
229     zmfub1(i) = zdqpbl(i) / (RG*MAX(zqumqe,zdqmin))
230     ELSE
231     zmfub1(i) = zmfub(i)
232     ENDIF
233     IF (ktype(i).EQ.2) THEN
234     zdh = RCPD*(ptu(i,ikb)-zeps*ptd(i,ikb)- &
235     (1.-zeps)*ztenh(i,ikb))+RLVTT*zqumqe
236     zdh = RG * MAX(zdh,1.0E5*zdqmin)
237     IF (zdhpbl(i).GT.0..AND.ldcum(i))zmfub1(i)=zdhpbl(i)/zdh
238     ENDIF
239     IF ( .NOT.((ktype(i).EQ.1.OR.ktype(i).EQ.2).AND. &
240     ABS(zmfub1(i)-zmfub(i)).LT.0.2*zmfub(i)) ) &
241     zmfub1(i) = zmfub(i)
242     ENDIF
243     ENDDO
244     DO k = 1, klev
245     DO i = 1, klon
246     IF (lddraf(i)) THEN
247     zfac = zmfub1(i)/MAX(zmfub(i),1.E-10)
248     pmfd(i,k) = pmfd(i,k)*zfac
249     zmfds(i,k) = zmfds(i,k)*zfac
250     zmfdq(i,k) = zmfdq(i,k)*zfac
251     zdmfdp(i,k) = zdmfdp(i,k)*zfac
252     pen_d(i,k) = pen_d(i,k)*zfac
253     pde_d(i,k) = pde_d(i,k)*zfac
254     ENDIF
255     ENDDO
256     ENDDO
257     DO i = 1, klon
258     IF (lddraf(i)) zmfub(i)=zmfub1(i)
259     ENDDO
260     ENDIF ! fin de test sur lmfdd
261    
262     ! calculer de nouveau le panache ascendant
263    
264     CALL flxasc(pdtime,ztenh, zqenh, pten, pqen, pqsen, &
265     pgeo, zgeoh, pap, paph, pqte, pvervel, &
266     ldland, ldcum, ktype, ilab, &
267     ptu, pqu, plu, pmfu, zmfub, zentr, &
268     zmfus, zmfuq, zmful, plude, zdmfup, &
269     kcbot, kctop, ictop0, kcum, pen_u, pde_u)
270    
271     ! determiner les flux convectifs en forme finale, ainsi que
272     ! la quantite des precipitations
273    
274     CALL flxflux(pdtime, pqen, pqsen, ztenh, zqenh, pap, paph, &
275     ldland, zgeoh, kcbot, kctop, lddraf, kdtop, ktype, ldcum, &
276     pmfu, pmfd, zmfus, zmfds, zmfuq, zmfdq, zmful, plude, &
277     zdmfup, zdmfdp, pten, prsfc, pssfc, zdpmel, itopm2, &
278     pmflxr, pmflxs)
279    
280     ! calculer les tendances pour T et Q
281    
282     CALL flxdtdq(itopm2, paph, ldcum, pten, &
283     zmfus, zmfds, zmfuq, zmfdq, zmful, zdmfup, zdmfdp, zdpmel, &
284     dt_con,dq_con)
285     end IF
286    
287     END SUBROUTINE flxmain
288    
289     end module flxmain_m

  ViewVC Help
Powered by ViewVC 1.1.21