/[lmdze]/trunk/libf/dyn3d/calfis.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/calfis.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 40 - (show annotations)
Tue Feb 22 13:49:36 2011 UTC (13 years, 2 months ago) by guez
File size: 10794 byte(s)
"alpha" useless, always 0, in "exner_hyb".

1 module calfis_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE calfis(rdayvrai, heure, pucov, pvcov, pteta, q, pmasse, pps, &
8 ppk, pphis, pphi, pducov, pdvcov, pdteta, pdq, pw, pdufi, pdvfi, &
9 pdhfi, pdqfi, pdpsfi, lafin)
10
11 ! From dyn3d/calfis.F, version 1.3 2005/05/25 13:10:09
12 ! Authors: P. Le Van, F. Hourdin
13
14 ! 1. Réarrangement des tableaux et transformation variables
15 ! dynamiques en variables physiques
16 ! 2. Calcul des termes physiques
17 ! 3. Retransformation des tendances physiques en tendances dynamiques
18
19 ! Remarques:
20
21 ! - Les vents sont donnés dans la physique par leurs composantes
22 ! naturelles.
23
24 ! - La variable thermodynamique de la physique est une variable
25 ! intensive : T.
26 ! Pour la dynamique on prend T * (preff / p(l)) **kappa
27
28 ! - Les deux seules variables dépendant de la géométrie
29 ! nécessaires pour la physique sont la latitude pour le
30 ! rayonnement et l'aire de la maille quand on veut intégrer une
31 ! grandeur horizontalement.
32
33 ! Input :
34 ! pucov covariant zonal velocity
35 ! pvcov covariant meridional velocity
36 ! pteta potential temperature
37 ! pps surface pressure
38 ! pmasse masse d'air dans chaque maille
39 ! pts surface temperature (K)
40 ! callrad clef d'appel au rayonnement
41
42 ! Output :
43 ! pdufi tendency for the natural zonal velocity (ms-1)
44 ! pdvfi tendency for the natural meridional velocity
45 ! pdhfi tendency for the potential temperature
46 ! pdtsfi tendency for the surface temperature
47
48 ! pdtrad radiative tendencies \ input and output
49 ! pfluxrad radiative fluxes / input and output
50
51 use comconst, only: kappa, cpp, dtphys, g
52 use comvert, only: preff
53 use comgeom, only: apoln, cu_2d, cv_2d, unsaire_2d, apols, rlonu, rlonv
54 use dimens_m, only: iim, jjm, llm, nqmx
55 use dimphy, only: klon
56 use grid_change, only: dyn_phy, gr_fi_dyn
57 use iniadvtrac_m, only: niadv
58 use nr_util, only: pi
59 use physiq_m, only: physiq
60 use pressure_var, only: p3d, pls
61
62 ! Arguments :
63
64 LOGICAL, intent(in):: lafin
65 REAL, intent(in):: heure ! heure de la journée en fraction de jour
66
67 REAL pvcov(iim + 1, jjm, llm)
68 REAL pucov(iim + 1, jjm + 1, llm)
69 REAL pteta(iim + 1, jjm + 1, llm)
70 REAL pmasse(iim + 1, jjm + 1, llm)
71
72 REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)
73 ! (mass fractions of advected fields)
74
75 REAL pphis(iim + 1, jjm + 1)
76 REAL pphi(iim + 1, jjm + 1, llm)
77
78 REAL pdvcov(iim + 1, jjm, llm)
79 REAL pducov(iim + 1, jjm + 1, llm)
80 REAL pdteta(iim + 1, jjm + 1, llm)
81 REAL pdq(iim + 1, jjm + 1, llm, nqmx)
82
83 REAL pw(iim + 1, jjm + 1, llm)
84
85 REAL pps(iim + 1, jjm + 1)
86 REAL, intent(in):: ppk(iim + 1, jjm + 1, llm)
87
88 REAL pdvfi(iim + 1, jjm, llm)
89 REAL pdufi(iim + 1, jjm + 1, llm)
90 REAL pdhfi(iim + 1, jjm + 1, llm)
91 REAL pdqfi(iim + 1, jjm + 1, llm, nqmx)
92 REAL pdpsfi(iim + 1, jjm + 1)
93
94 ! Local variables :
95
96 INTEGER i, j, l, ig0, ig, iq, iiq
97 REAL zpsrf(klon)
98 REAL zplev(klon, llm+1), zplay(klon, llm)
99 REAL zphi(klon, llm), zphis(klon)
100
101 REAL zufi(klon, llm), v(klon, llm)
102 real zvfi(iim + 1, jjm + 1, llm)
103 REAL ztfi(klon, llm) ! temperature
104 real qx(klon, llm, nqmx) ! mass fractions of advected fields
105 REAL pvervel(klon, llm)
106
107 REAL zdufi(klon, llm), zdvfi(klon, llm)
108 REAL zdtfi(klon, llm), zdqfi(klon, llm, nqmx)
109 REAL zdpsrf(klon)
110
111 REAL z1(iim)
112 REAL pksurcp(iim + 1, jjm + 1)
113
114 ! I. Musat: diagnostic PVteta, Amip2
115 INTEGER, PARAMETER:: ntetaSTD=3
116 REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)
117 REAL PVteta(klon, ntetaSTD)
118
119 REAL, intent(in):: rdayvrai
120
121 !-----------------------------------------------------------------------
122
123 !!print *, "Call sequence information: calfis"
124
125 ! 1. Initialisations :
126 ! latitude, longitude et aires des mailles pour la physique:
127
128 ! 40. transformation des variables dynamiques en variables physiques:
129 ! 41. pressions au sol (en Pascals)
130
131 zpsrf(1) = pps(1, 1)
132
133 ig0 = 2
134 DO j = 2, jjm
135 CALL SCOPY(iim, pps(1, j), 1, zpsrf(ig0), 1)
136 ig0 = ig0+iim
137 ENDDO
138
139 zpsrf(klon) = pps(1, jjm + 1)
140
141 ! 42. pression intercouches :
142
143 ! zplev defini aux (llm +1) interfaces des couches
144 ! zplay defini aux (llm) milieux des couches
145
146 ! Exner = cp * (p(l) / preff) ** kappa
147
148 forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)
149
150 ! 43. temperature naturelle (en K) et pressions milieux couches
151 DO l=1, llm
152 pksurcp = ppk(:, :, l) / cpp
153 pls(:, :, l) = preff * pksurcp**(1./ kappa)
154 zplay(:, l) = pack(pls(:, :, l), dyn_phy)
155 ztfi(:, l) = pack(pteta(:, :, l) * pksurcp, dyn_phy)
156 ENDDO
157
158 ! 43.bis traceurs
159 DO iq=1, nqmx
160 iiq=niadv(iq)
161 DO l=1, llm
162 qx(1, l, iq) = q(1, 1, l, iiq)
163 ig0 = 2
164 DO j=2, jjm
165 DO i = 1, iim
166 qx(ig0, l, iq) = q(i, j, l, iiq)
167 ig0 = ig0 + 1
168 ENDDO
169 ENDDO
170 qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
171 ENDDO
172 ENDDO
173
174 ! Geopotentiel calcule par rapport a la surface locale:
175 forall (l = 1:llm) zphi(:, l) = pack(pphi(:, :, l), dyn_phy)
176 zphis = pack(pphis, dyn_phy)
177 DO l=1, llm
178 DO ig=1, klon
179 zphi(ig, l)=zphi(ig, l)-zphis(ig)
180 ENDDO
181 ENDDO
182
183 ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
184 DO l=1, llm
185 pvervel(1, l)=pw(1, 1, l) * g /apoln
186 ig0=2
187 DO j=2, jjm
188 DO i = 1, iim
189 pvervel(ig0, l) = pw(i, j, l) * g * unsaire_2d(i, j)
190 ig0 = ig0 + 1
191 ENDDO
192 ENDDO
193 pvervel(ig0, l)=pw(1, jjm + 1, l) * g /apols
194 ENDDO
195
196 ! 45. champ u:
197
198 DO l=1, llm
199 DO j=2, jjm
200 ig0 = 1+(j-2)*iim
201 zufi(ig0+1, l)= 0.5 * &
202 (pucov(iim, j, l)/cu_2d(iim, j) + pucov(1, j, l)/cu_2d(1, j))
203 DO i=2, iim
204 zufi(ig0+i, l)= 0.5 * &
205 (pucov(i-1, j, l)/cu_2d(i-1, j) &
206 + pucov(i, j, l)/cu_2d(i, j))
207 end DO
208 end DO
209 end DO
210
211 ! 46.champ v:
212
213 forall (j = 2: jjm, l = 1: llm) zvfi(:iim, j, l)= 0.5 &
214 * (pvcov(:iim, j-1, l) / cv_2d(:iim, j-1) &
215 + pvcov(:iim, j, l) / cv_2d(:iim, j))
216 zvfi(iim + 1, 2:jjm, :) = zvfi(1, 2:jjm, :)
217
218 ! 47. champs de vents au pôle nord
219 ! U = 1 / pi * integrale [ v * cos(long) * d long ]
220 ! V = 1 / pi * integrale [ v * sin(long) * d long ]
221
222 DO l=1, llm
223 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, 1, l)/cv_2d(1, 1)
224 DO i=2, iim
225 z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i, 1, l)/cv_2d(i, 1)
226 ENDDO
227
228 zufi(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
229 zvfi(:, 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
230 ENDDO
231
232 ! 48. champs de vents au pôle sud:
233 ! U = 1 / pi * integrale [ v * cos(long) * d long ]
234 ! V = 1 / pi * integrale [ v * sin(long) * d long ]
235
236 DO l=1, llm
237 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, jjm, l) &
238 /cv_2d(1, jjm)
239 DO i=2, iim
240 z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i, jjm, l)/cv_2d(i, jjm)
241 ENDDO
242
243 zufi(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
244 zvfi(:, jjm + 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
245 ENDDO
246
247 forall(l= 1: llm) v(:, l) = pack(zvfi(:, :, l), dyn_phy)
248
249 !IM calcul PV a teta=350, 380, 405K
250 CALL PVtheta(klon, llm, pucov, pvcov, pteta, ztfi, zplay, zplev, &
251 ntetaSTD, rtetaSTD, PVteta)
252
253 ! Appel de la physique :
254 CALL physiq(lafin, rdayvrai, heure, dtphys, zplev, zplay, zphi, &
255 zphis, zufi, v, ztfi, qx, pvervel, zdufi, zdvfi, &
256 zdtfi, zdqfi, zdpsrf, pducov, PVteta) ! diagnostic PVteta, Amip2
257
258 ! transformation des tendances physiques en tendances dynamiques:
259
260 ! tendance sur la pression :
261
262 pdpsfi = gr_fi_dyn(zdpsrf)
263
264 ! 62. enthalpie potentielle
265
266 DO l=1, llm
267
268 DO i=1, iim + 1
269 pdhfi(i, 1, l) = cpp * zdtfi(1, l) / ppk(i, 1 , l)
270 pdhfi(i, jjm + 1, l) = cpp * zdtfi(klon, l)/ ppk(i, jjm + 1, l)
271 ENDDO
272
273 DO j=2, jjm
274 ig0=1+(j-2)*iim
275 DO i=1, iim
276 pdhfi(i, j, l) = cpp * zdtfi(ig0+i, l) / ppk(i, j, l)
277 ENDDO
278 pdhfi(iim + 1, j, l) = pdhfi(1, j, l)
279 ENDDO
280
281 ENDDO
282
283 ! 62. humidite specifique
284
285 DO iq=1, nqmx
286 DO l=1, llm
287 DO i=1, iim + 1
288 pdqfi(i, 1, l, iq) = zdqfi(1, l, iq)
289 pdqfi(i, jjm + 1, l, iq) = zdqfi(klon, l, iq)
290 ENDDO
291 DO j=2, jjm
292 ig0=1+(j-2)*iim
293 DO i=1, iim
294 pdqfi(i, j, l, iq) = zdqfi(ig0+i, l, iq)
295 ENDDO
296 pdqfi(iim + 1, j, l, iq) = pdqfi(1, j, l, iq)
297 ENDDO
298 ENDDO
299 ENDDO
300
301 ! 63. traceurs
302
303 ! initialisation des tendances
304 pdqfi=0.
305
306 DO iq=1, nqmx
307 iiq=niadv(iq)
308 DO l=1, llm
309 DO i=1, iim + 1
310 pdqfi(i, 1, l, iiq) = zdqfi(1, l, iq)
311 pdqfi(i, jjm + 1, l, iiq) = zdqfi(klon, l, iq)
312 ENDDO
313 DO j=2, jjm
314 ig0=1+(j-2)*iim
315 DO i=1, iim
316 pdqfi(i, j, l, iiq) = zdqfi(ig0+i, l, iq)
317 ENDDO
318 pdqfi(iim + 1, j, l, iiq) = pdqfi(1, j, l, iq)
319 ENDDO
320 ENDDO
321 ENDDO
322
323 ! 65. champ u:
324
325 DO l=1, llm
326
327 DO i=1, iim + 1
328 pdufi(i, 1, l) = 0.
329 pdufi(i, jjm + 1, l) = 0.
330 ENDDO
331
332 DO j=2, jjm
333 ig0=1+(j-2)*iim
334 DO i=1, iim-1
335 pdufi(i, j, l)= &
336 0.5*(zdufi(ig0+i, l)+zdufi(ig0+i+1, l))*cu_2d(i, j)
337 ENDDO
338 pdufi(iim, j, l)= &
339 0.5*(zdufi(ig0+1, l)+zdufi(ig0+iim, l))*cu_2d(iim, j)
340 pdufi(iim + 1, j, l)=pdufi(1, j, l)
341 ENDDO
342
343 ENDDO
344
345 ! 67. champ v:
346
347 DO l=1, llm
348
349 DO j=2, jjm-1
350 ig0=1+(j-2)*iim
351 DO i=1, iim
352 pdvfi(i, j, l)= &
353 0.5*(zdvfi(ig0+i, l)+zdvfi(ig0+i+iim, l))*cv_2d(i, j)
354 ENDDO
355 pdvfi(iim + 1, j, l) = pdvfi(1, j, l)
356 ENDDO
357 ENDDO
358
359 ! 68. champ v pres des poles:
360 ! v = U * cos(long) + V * SIN(long)
361
362 DO l=1, llm
363 DO i=1, iim
364 pdvfi(i, 1, l)= &
365 zdufi(1, l)*COS(rlonv(i))+zdvfi(1, l)*SIN(rlonv(i))
366 pdvfi(i, jjm, l)=zdufi(klon, l)*COS(rlonv(i)) &
367 +zdvfi(klon, l)*SIN(rlonv(i))
368 pdvfi(i, 1, l)= &
369 0.5*(pdvfi(i, 1, l)+zdvfi(i+1, l))*cv_2d(i, 1)
370 pdvfi(i, jjm, l)= &
371 0.5*(pdvfi(i, jjm, l)+zdvfi(klon-iim-1+i, l))*cv_2d(i, jjm)
372 ENDDO
373
374 pdvfi(iim + 1, 1, l) = pdvfi(1, 1, l)
375 pdvfi(iim + 1, jjm, l)= pdvfi(1, jjm, l)
376 ENDDO
377
378 END SUBROUTINE calfis
379
380 end module calfis_m

  ViewVC Help
Powered by ViewVC 1.1.21