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

Annotation of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 37 - (hide annotations)
Tue Dec 21 15:45:48 2010 UTC (13 years, 5 months ago) by guez
Original Path: trunk/libf/dyn3d/calfis.f90
File size: 11310 byte(s)
Inlined procedure "pression".

Split "guide.f90" into "guide.f90" and "tau2alpha.f90". Split
"read_reanalyse.f" into single-procedure files in directory
"Read_reanalyse".

Useless copy of variables in "iniphysiq". Directly define module
variables in "gcm" and remove procedure "iniphysiq".

Added "pressure-altitude" in "test_disvert".

1 guez 3 module calfis_m
2    
3     IMPLICIT NONE
4    
5     contains
6    
7 guez 37 SUBROUTINE calfis(rdayvrai, heure, pucov, pvcov, pteta, q, &
8 guez 10 pmasse, pps, ppk, pphis, pphi, pducov, pdvcov, pdteta, pdq, pw, &
9 guez 37 pdufi, pdvfi, pdhfi, pdqfi, pdpsfi, lafin)
10 guez 3
11 guez 35 ! From dyn3d/calfis.F, version 1.3 2005/05/25 13:10:09
12     ! Authors : P. Le Van, F. Hourdin
13 guez 3
14     ! 1. rearrangement des tableaux et transformation
15     ! variables dynamiques > variables physiques
16     ! 2. calcul des termes physiques
17     ! 3. retransformation des tendances physiques en tendances dynamiques
18    
19     ! remarques:
20     ! ----------
21    
22     ! - les vents sont donnes dans la physique par leurs composantes
23     ! naturelles.
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     ! - les deux seules variables dependant de la geometrie necessaires
28     ! pour la physique sont la latitude pour le rayonnement et
29     ! l'aire de la maille quand on veut integrer une grandeur
30     ! horizontalement.
31    
32     ! Input :
33     ! -------
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     ! --------
44     ! pdufi tendency for the natural zonal velocity (ms-1)
45     ! pdvfi tendency for the natural meridional velocity
46     ! pdhfi tendency for the potential temperature
47     ! pdtsfi tendency for the surface temperature
48    
49     ! pdtrad radiative tendencies \ both input
50     ! pfluxrad radiative fluxes / and output
51    
52     use comconst, only: kappa, cpp, dtphys, g, pi
53 guez 20 use comvert, only: preff
54 guez 3 use comgeom, only: apoln, cu_2d, cv_2d, unsaire_2d, apols, rlonu, rlonv
55 guez 35 use dimens_m, only: iim, jjm, llm, nqmx
56     use dimphy, only: klon
57     use grid_change, only: dyn_phy, gr_fi_dyn
58 guez 18 use iniadvtrac_m, only: niadv
59 guez 3 use physiq_m, only: physiq
60 guez 10 use pressure_var, only: p3d, pls
61 guez 3
62     ! Arguments :
63    
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     REAL pteta(iim + 1, jjm + 1, llm)
70     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 pdteta(iim + 1, jjm + 1, llm)
81     REAL pdq(iim + 1, jjm + 1, llm, nqmx)
82 guez 3
83 guez 34 REAL pw(iim + 1, jjm + 1, llm)
84 guez 3
85 guez 34 REAL pps(iim + 1, jjm + 1)
86     REAL, intent(in):: ppk(iim + 1, jjm + 1, llm)
87 guez 3
88 guez 34 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 guez 3
94     ! Local variables :
95    
96 guez 34 INTEGER i, j, l, ig0, ig, iq, iiq
97 guez 3 REAL zpsrf(klon)
98 guez 34 REAL zplev(klon, llm+1), zplay(klon, llm)
99     REAL zphi(klon, llm), zphis(klon)
100 guez 3
101 guez 35 REAL zufi(klon, llm), v(klon, llm)
102     real zvfi(iim + 1, jjm + 1, llm)
103 guez 34 REAL ztfi(klon, llm) ! temperature
104     real qx(klon, llm, nqmx) ! mass fractions of advected fields
105     REAL pvervel(klon, llm)
106 guez 3
107 guez 34 REAL zdufi(klon, llm), zdvfi(klon, llm)
108     REAL zdtfi(klon, llm), zdqfi(klon, llm, nqmx)
109 guez 3 REAL zdpsrf(klon)
110    
111 guez 35 REAL z1(iim)
112 guez 34 REAL pksurcp(iim + 1, jjm + 1)
113 guez 3
114     ! I. Musat: diagnostic PVteta, Amip2
115     INTEGER, PARAMETER:: ntetaSTD=3
116     REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)
117 guez 34 REAL PVteta(klon, ntetaSTD)
118 guez 3
119 guez 7 REAL, intent(in):: rdayvrai
120 guez 3
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 guez 34 zpsrf(1) = pps(1, 1)
132 guez 3
133     ig0 = 2
134 guez 34 DO j = 2, jjm
135     CALL SCOPY(iim, pps(1, j), 1, zpsrf(ig0), 1)
136 guez 3 ig0 = ig0+iim
137     ENDDO
138    
139 guez 34 zpsrf(klon) = pps(1, jjm + 1)
140 guez 3
141     ! 42. pression intercouches :
142    
143     ! .... zplev definis aux (llm +1) interfaces des couches ....
144     ! .... zplay definis aux (llm) milieux des couches ....
145    
146     ! ... Exner = cp * (p(l) / preff) ** kappa ....
147    
148 guez 10 forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)
149 guez 3
150     ! 43. temperature naturelle (en K) et pressions milieux couches .
151 guez 34 DO l=1, llm
152 guez 10 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 guez 3 ENDDO
157    
158     ! 43.bis traceurs
159 guez 34 DO iq=1, nqmx
160 guez 3 iiq=niadv(iq)
161 guez 34 DO l=1, llm
162     qx(1, l, iq) = q(1, 1, l, iiq)
163 guez 3 ig0 = 2
164 guez 34 DO j=2, jjm
165 guez 3 DO i = 1, iim
166 guez 34 qx(ig0, l, iq) = q(i, j, l, iiq)
167 guez 3 ig0 = ig0 + 1
168     ENDDO
169     ENDDO
170 guez 34 qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
171 guez 3 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 guez 34 DO l=1, llm
178     DO ig=1, klon
179     zphi(ig, l)=zphi(ig, l)-zphis(ig)
180 guez 3 ENDDO
181     ENDDO
182    
183 guez 35 ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
184 guez 34 DO l=1, llm
185     pvervel(1, l)=pw(1, 1, l) * g /apoln
186 guez 3 ig0=2
187 guez 34 DO j=2, jjm
188 guez 3 DO i = 1, iim
189 guez 34 pvervel(ig0, l) = pw(i, j, l) * g * unsaire_2d(i, j)
190 guez 3 ig0 = ig0 + 1
191     ENDDO
192     ENDDO
193 guez 34 pvervel(ig0, l)=pw(1, jjm + 1, l) * g /apols
194 guez 3 ENDDO
195    
196     ! 45. champ u:
197    
198 guez 34 DO l=1, llm
199     DO j=2, jjm
200 guez 3 ig0 = 1+(j-2)*iim
201 guez 34 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 guez 3 end DO
208     end DO
209     end DO
210    
211     ! 46.champ v:
212    
213 guez 35 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 guez 3
218 guez 34 ! 47. champs de vents au pôle nord
219 guez 3 ! U = 1 / pi * integrale [ v * cos(long) * d long ]
220     ! V = 1 / pi * integrale [ v * sin(long) * d long ]
221    
222 guez 34 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 guez 3 ENDDO
227    
228 guez 35 zufi(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
229     zvfi(:, 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
230 guez 3 ENDDO
231    
232 guez 34 ! 48. champs de vents au pôle sud:
233 guez 3 ! U = 1 / pi * integrale [ v * cos(long) * d long ]
234     ! V = 1 / pi * integrale [ v * sin(long) * d long ]
235    
236 guez 34 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 guez 3 ENDDO
242    
243 guez 35 zufi(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
244     zvfi(:, jjm + 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
245     ENDDO
246 guez 3
247 guez 35 forall(l= 1: llm) v(:, l) = pack(zvfi(:, :, l), dyn_phy)
248 guez 3
249     !IM calcul PV a teta=350, 380, 405K
250 guez 35 CALL PVtheta(klon, llm, pucov, pvcov, pteta, ztfi, zplay, zplev, &
251 guez 34 ntetaSTD, rtetaSTD, PVteta)
252 guez 3
253 guez 35 ! 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 guez 3
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 guez 34 DO l=1, llm
267 guez 3
268 guez 34 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 guez 3 ENDDO
272    
273 guez 34 DO j=2, jjm
274 guez 3 ig0=1+(j-2)*iim
275 guez 34 DO i=1, iim
276     pdhfi(i, j, l) = cpp * zdtfi(ig0+i, l) / ppk(i, j, l)
277 guez 3 ENDDO
278 guez 34 pdhfi(iim + 1, j, l) = pdhfi(1, j, l)
279 guez 3 ENDDO
280    
281     ENDDO
282    
283     ! 62. humidite specifique
284    
285 guez 34 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 guez 3 ENDDO
291 guez 34 DO j=2, jjm
292 guez 3 ig0=1+(j-2)*iim
293 guez 34 DO i=1, iim
294     pdqfi(i, j, l, iq) = zdqfi(ig0+i, l, iq)
295 guez 3 ENDDO
296 guez 34 pdqfi(iim + 1, j, l, iq) = pdqfi(1, j, l, iq)
297 guez 3 ENDDO
298     ENDDO
299     ENDDO
300    
301     ! 63. traceurs
302    
303     ! initialisation des tendances
304     pdqfi=0.
305    
306 guez 34 DO iq=1, nqmx
307 guez 3 iiq=niadv(iq)
308 guez 34 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 guez 3 ENDDO
313 guez 34 DO j=2, jjm
314 guez 3 ig0=1+(j-2)*iim
315 guez 34 DO i=1, iim
316     pdqfi(i, j, l, iiq) = zdqfi(ig0+i, l, iq)
317 guez 3 ENDDO
318 guez 34 pdqfi(iim + 1, j, l, iiq) = pdqfi(1, j, l, iq)
319 guez 3 ENDDO
320     ENDDO
321     ENDDO
322    
323     ! 65. champ u:
324    
325 guez 34 DO l=1, llm
326 guez 3
327 guez 34 DO i=1, iim + 1
328     pdufi(i, 1, l) = 0.
329     pdufi(i, jjm + 1, l) = 0.
330 guez 3 ENDDO
331    
332 guez 34 DO j=2, jjm
333 guez 3 ig0=1+(j-2)*iim
334 guez 34 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 guez 3 ENDDO
338 guez 34 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 guez 3 ENDDO
342    
343     ENDDO
344    
345     ! 67. champ v:
346    
347 guez 34 DO l=1, llm
348 guez 3
349 guez 34 DO j=2, jjm-1
350 guez 3 ig0=1+(j-2)*iim
351 guez 34 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 guez 3 ENDDO
355 guez 34 pdvfi(iim + 1, j, l) = pdvfi(1, j, l)
356 guez 3 ENDDO
357     ENDDO
358    
359     ! 68. champ v pres des poles:
360     ! v = U * cos(long) + V * SIN(long)
361    
362 guez 34 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 guez 3 ENDDO
373    
374 guez 34 pdvfi(iim + 1, 1, l) = pdvfi(1, 1, l)
375     pdvfi(iim + 1, jjm, l)= pdvfi(1, jjm, l)
376 guez 3 ENDDO
377    
378     END SUBROUTINE calfis
379    
380     end module calfis_m

  ViewVC Help
Powered by ViewVC 1.1.21