/[lmdze]/trunk/Sources/phylmd/coefkz.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/coefkz.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3 - (show annotations)
Wed Feb 27 13:16:39 2008 UTC (16 years, 2 months ago) by guez
Original Path: trunk/libf/phylmd/coefkz.f
File size: 10282 byte(s)
Initial import
1 SUBROUTINE coefkz(nsrf, knon, paprs, pplay,
2 cIM 261103
3 . ksta, ksta_ter,
4 cIM 261103
5 . ts, rugos,
6 . u,v,t,q,
7 . qsurf,
8 . pcfm, pcfh)
9 use dimens_m
10 use indicesol
11 use dimphy
12 use iniprint
13 use YOMCST
14 use yoethf
15 use fcttre
16 use conf_phys_m
17 IMPLICIT none
18 c======================================================================
19 c Auteur(s) F. Hourdin, M. Forichon, Z.X. Li (LMD/CNRS) date: 19930922
20 c (une version strictement identique a l'ancien modele)
21 c Objet: calculer le coefficient du frottement du sol (Cdrag) et les
22 c coefficients d'echange turbulent dans l'atmosphere.
23 c Arguments:
24 c nsrf-----input-I- indicateur de la nature du sol
25 c knon-----input-I- nombre de points a traiter
26 c paprs----input-R- pression a chaque intercouche (en Pa)
27 c pplay----input-R- pression au milieu de chaque couche (en Pa)
28 c ts-------input-R- temperature du sol (en Kelvin)
29 c rugos----input-R- longeur de rugosite (en m)
30 c u--------input-R- vitesse u
31 c v--------input-R- vitesse v
32 c t--------input-R- temperature (K)
33 c q--------input-R- vapeur d'eau (kg/kg)
34 c
35 c itop-----output-I- numero de couche du sommet de la couche limite
36 c pcfm-----output-R- coefficients a calculer (vitesse)
37 c pcfh-----output-R- coefficients a calculer (chaleur et humidite)
38 c======================================================================
39 c
40 c Arguments:
41 c
42 INTEGER knon, nsrf
43 REAL ts(klon)
44 REAL paprs(klon,klev+1), pplay(klon,klev)
45 REAL u(klon,klev), v(klon,klev), t(klon,klev), q(klon,klev)
46 REAL rugos(klon)
47 c
48 REAL pcfm(klon,klev), pcfh(klon,klev)
49 INTEGER itop(klon)
50 c
51 c Quelques constantes et options:
52 c
53 REAL cepdu2, ckap, cb, cc, cd, clam
54 PARAMETER (cepdu2 =(0.1)**2)
55 PARAMETER (CKAP=0.4)
56 PARAMETER (cb=5.0)
57 PARAMETER (cc=5.0)
58 PARAMETER (cd=5.0)
59 PARAMETER (clam=160.0)
60 REAL ratqs ! largeur de distribution de vapeur d'eau
61 PARAMETER (ratqs=0.05)
62 LOGICAL richum ! utilise le nombre de Richardson humide
63 PARAMETER (richum=.TRUE.)
64 REAL ric ! nombre de Richardson critique
65 PARAMETER(ric=0.4)
66 REAL prandtl
67 PARAMETER (prandtl=0.4)
68 REAL kstable ! diffusion minimale (situation stable)
69 ! GKtest
70 ! PARAMETER (kstable=1.0e-10)
71 REAL ksta, ksta_ter
72 cIM: 261103 REAL kstable_ter, kstable_sinon
73 cIM: 211003 cf GK PARAMETER (kstable_ter = 1.0e-6)
74 cIM: 261103 PARAMETER (kstable_ter = 1.0e-8)
75 cIM: 261103 PARAMETER (kstable_ter = 1.0e-10)
76 cIM: 261103 PARAMETER (kstable_sinon = 1.0e-10)
77 ! fin GKtest
78 REAL mixlen ! constante controlant longueur de melange
79 PARAMETER (mixlen=35.0)
80 INTEGER isommet ! le sommet de la couche limite
81 PARAMETER (isommet=klev)
82 LOGICAL tvirtu ! calculer Ri d'une maniere plus performante
83 PARAMETER (tvirtu=.TRUE.)
84 LOGICAL opt_ec ! formule du Centre Europeen dans l'atmosphere
85 PARAMETER (opt_ec=.FALSE.)
86
87 c
88 c Variables locales:
89 c
90 INTEGER i, k, kk !IM 120704
91 REAL zgeop(klon,klev)
92 REAL zmgeom(klon)
93 REAL zri(klon)
94 REAL zl2(klon)
95
96 REAL u1(klon), v1(klon), t1(klon), q1(klon), z1(klon)
97 REAL pcfm1(klon), pcfh1(klon)
98 c
99 REAL zdphi, zdu2, ztvd, ztvu, zcdn
100 REAL zscf
101 REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs
102 REAL z2geomf, zalh2, zalm2, zscfh, zscfm
103 REAL t_coup
104 PARAMETER (t_coup=273.15)
105 cIM
106 LOGICAL check
107 PARAMETER (check=.false.)
108 c
109 c contre-gradient pour la chaleur sensible: Kelvin/metre
110 REAL gamt(2:klev)
111 real qsurf(klon)
112 c
113 LOGICAL appel1er
114 SAVE appel1er
115 c
116 c Fonctions thermodynamiques et fonctions d'instabilite
117 REAL fsta, fins, x
118 LOGICAL zxli ! utiliser un jeu de fonctions simples
119 PARAMETER (zxli=.FALSE.)
120 c
121 fsta(x) = 1.0 / (1.0+10.0*x*(1+8.0*x))
122 fins(x) = SQRT(1.0-18.0*x)
123 c
124 DATA appel1er /.TRUE./
125 c
126 IF (appel1er) THEN
127 if (prt_level > 9) THEN
128 WRITE(lunout,*)'coefkz, opt_ec:', opt_ec
129 WRITE(lunout,*)'coefkz, richum:', richum
130 IF (richum) WRITE(lunout,*)'coefkz, ratqs:', ratqs
131 WRITE(lunout,*)'coefkz, isommet:', isommet
132 WRITE(lunout,*)'coefkz, tvirtu:', tvirtu
133 appel1er = .FALSE.
134 endif
135 ENDIF
136 c
137 c Initialiser les sorties
138 c
139 DO k = 1, klev
140 DO i = 1, knon
141 pcfm(i,k) = 0.0
142 pcfh(i,k) = 0.0
143 ENDDO
144 ENDDO
145 DO i = 1, knon
146 itop(i) = 0
147 ENDDO
148
149 c
150 c Prescrire la valeur de contre-gradient
151 c
152 if (iflag_pbl.eq.1) then
153 DO k = 3, klev
154 gamt(k) = -1.0E-03
155 ENDDO
156 gamt(2) = -2.5E-03
157 else
158 DO k = 2, klev
159 gamt(k) = 0.0
160 ENDDO
161 ENDIF
162 cIM cf JLD/ GKtest
163 IF ( nsrf .NE. is_oce ) THEN
164 cIM 261103 kstable = kstable_ter
165 kstable = ksta_ter
166 ELSE
167 cIM 261103 kstable = kstable_sinon
168 kstable = ksta
169 ENDIF
170 cIM cf JLD/ GKtest fin
171 c
172 c Calculer les geopotentiels de chaque couche
173 c
174 DO i = 1, knon
175 zgeop(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1)))
176 . * (paprs(i,1)-pplay(i,1))
177 ENDDO
178 DO k = 2, klev
179 DO i = 1, knon
180 zgeop(i,k) = zgeop(i,k-1)
181 . + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k)
182 . * (pplay(i,k-1)-pplay(i,k))
183 ENDDO
184 ENDDO
185 c
186 c Calculer le frottement au sol (Cdrag)
187 c
188 DO i = 1, knon
189 u1(i) = u(i,1)
190 v1(i) = v(i,1)
191 t1(i) = t(i,1)
192 q1(i) = q(i,1)
193 z1(i) = zgeop(i,1)
194 ENDDO
195 c
196 CALL clcdrag(klon, knon, nsrf, zxli,
197 $ u1, v1, t1, q1, z1,
198 $ ts, qsurf, rugos,
199 $ pcfm1, pcfh1)
200 cIM $ ts, qsurf, rugos,
201 C
202 DO i = 1, knon
203 pcfm(i,1)=pcfm1(i)
204 pcfh(i,1)=pcfh1(i)
205 ENDDO
206 c
207 c Calculer les coefficients turbulents dans l'atmosphere
208 c
209 DO i = 1, knon
210 itop(i) = isommet
211 ENDDO
212
213
214 DO k = 2, isommet
215 DO i = 1, knon
216 zdu2=MAX(cepdu2,(u(i,k)-u(i,k-1))**2
217 . +(v(i,k)-v(i,k-1))**2)
218 zmgeom(i)=zgeop(i,k)-zgeop(i,k-1)
219 zdphi =zmgeom(i) / 2.0
220 zt = (t(i,k)+t(i,k-1)) * 0.5
221 zq = (q(i,k)+q(i,k-1)) * 0.5
222 c
223 c calculer Qs et dQs/dT:
224 c
225 IF (thermcep) THEN
226 zdelta = MAX(0.,SIGN(1.,RTT-zt))
227 zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta)
228 . + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta
229 zqs = R2ES * FOEEW(zt,zdelta) / pplay(i,k)
230 zqs = MIN(0.5,zqs)
231 zcor = 1./(1.-RETV*zqs)
232 zqs = zqs*zcor
233 zdqs = FOEDE(zt,zdelta,zcvm5,zqs,zcor)
234 ELSE
235 IF (zt .LT. t_coup) THEN
236 zqs = qsats(zt) / pplay(i,k)
237 zdqs = dqsats(zt,zqs)
238 ELSE
239 zqs = qsatl(zt) / pplay(i,k)
240 zdqs = dqsatl(zt,zqs)
241 ENDIF
242 ENDIF
243 c
244 c calculer la fraction nuageuse (processus humide):
245 c
246 zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)
247 zfr = MAX(0.0,MIN(1.0,zfr))
248 IF (.NOT.richum) zfr = 0.0
249 c
250 c calculer le nombre de Richardson:
251 c
252 IF (tvirtu) THEN
253 ztvd =( t(i,k)
254 . + zdphi/RCPD/(1.+RVTMP2*zq)
255 . *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) )
256 . )*(1.+RETV*q(i,k))
257 ztvu =( t(i,k-1)
258 . - zdphi/RCPD/(1.+RVTMP2*zq)
259 . *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) )
260 . )*(1.+RETV*q(i,k-1))
261 zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))
262 zri(i) = zri(i)
263 . + zmgeom(i)*zmgeom(i)/RG*gamt(k)
264 . *(paprs(i,k)/101325.0)**RKAPPA
265 . /(zdu2*0.5*(ztvd+ztvu))
266 c
267 ELSE ! calcul de Ridchardson compatible LMD5
268 c
269 zri(i) =(RCPD*(t(i,k)-t(i,k-1))
270 . -RD*0.5*(t(i,k)+t(i,k-1))/paprs(i,k)
271 . *(pplay(i,k)-pplay(i,k-1))
272 . )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i,k-1)+t(i,k)))
273 zri(i) = zri(i) +
274 . zmgeom(i)*zmgeom(i)*gamt(k)/RG
275 cSB . /(paprs(i,k)/101325.0)**RKAPPA
276 . *(paprs(i,k)/101325.0)**RKAPPA
277 . /(zdu2*0.5*(t(i,k-1)+t(i,k)))
278 ENDIF
279 c
280 c finalement, les coefficients d'echange sont obtenus:
281 c
282 zcdn=SQRT(zdu2) / zmgeom(i) * RG
283 c
284 IF (opt_ec) THEN
285 z2geomf=zgeop(i,k-1)+zgeop(i,k)
286 zalm2=(0.5*ckap/RG*z2geomf
287 . /(1.+0.5*ckap/rg/clam*z2geomf))**2
288 zalh2=(0.5*ckap/rg*z2geomf
289 . /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2
290 IF (zri(i).LT.0.0) THEN ! situation instable
291 zscf = ((zgeop(i,k)/zgeop(i,k-1))**(1./3.)-1.)**3
292 . / (zmgeom(i)/RG)**3 / (zgeop(i,k-1)/RG)
293 zscf = SQRT(-zri(i)*zscf)
294 zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)
295 zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf)
296 pcfm(i,k)=zcdn*zalm2*(1.-2.0*cb*zri(i)*zscfm)
297 pcfh(i,k)=zcdn*zalh2*(1.-3.0*cb*zri(i)*zscfh)
298 ELSE ! situation stable
299 zscf=SQRT(1.+cd*zri(i))
300 pcfm(i,k)=zcdn*zalm2/(1.+2.0*cb*zri(i)/zscf)
301 pcfh(i,k)=zcdn*zalh2/(1.+3.0*cb*zri(i)*zscf)
302 ENDIF
303 ELSE
304 zl2(i)=(mixlen*MAX(0.0,(paprs(i,k)-paprs(i,itop(i)+1))
305 . /(paprs(i,2)-paprs(i,itop(i)+1)) ))**2
306 pcfm(i,k)=sqrt(max(zcdn*zcdn*(ric-zri(i))/ric, kstable))
307 pcfm(i,k)= zl2(i)* pcfm(i,k)
308 pcfh(i,k) = pcfm(i,k) /prandtl ! h et m different
309 ENDIF
310 ENDDO
311 ENDDO
312 c
313 c Au-dela du sommet, pas de diffusion turbulente:
314 c
315 DO i = 1, knon
316 IF (itop(i)+1 .LE. klev) THEN
317 DO k = itop(i)+1, klev
318 pcfh(i,k) = 0.0
319 pcfm(i,k) = 0.0
320 ENDDO
321 ENDIF
322 ENDDO
323 c
324 RETURN
325 END

  ViewVC Help
Powered by ViewVC 1.1.21