/[lmdze]/trunk/dyn3d/calfis.f
ViewVC logotype

Annotation of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 44 - (hide annotations)
Wed Apr 13 12:29:18 2011 UTC (13 years, 1 month ago) by guez
Original Path: trunk/libf/dyn3d/calfis.f90
File size: 10785 byte(s)
Removed argument "pdteta" of "calfis", because it was not used.

Created module "conf_guide_m", containing procedure
"conf_guide". Moved module variables from "guide_m" to "conf_guide_m".

In module "getparam", removed "ini_getparam" and "fin_getparam" from
generic interface "getpar".

Created module variables in "tau2alpha_m" to replace common "comdxdy".

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

  ViewVC Help
Powered by ViewVC 1.1.21