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

Annotation of /trunk/dyn3d/calfis.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 40 - (hide annotations)
Tue Feb 22 13:49:36 2011 UTC (13 years, 3 months ago) by guez
Original Path: trunk/libf/dyn3d/calfis.f90
File size: 10794 byte(s)
"alpha" useless, always 0, in "exner_hyb".

1 guez 3 module calfis_m
2    
3     IMPLICIT NONE
4    
5     contains
6    
7 guez 40 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 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     ! 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 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     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 guez 40 ! Local variables :
95 guez 3
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 guez 40 ! 1. Initialisations :
126     ! latitude, longitude et aires des mailles pour la physique:
127 guez 3
128 guez 40 ! 40. transformation des variables dynamiques en variables physiques:
129     ! 41. pressions au sol (en Pascals)
130 guez 3
131 guez 34 zpsrf(1) = pps(1, 1)
132 guez 3
133 guez 40 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 guez 40 ! 42. pression intercouches :
142 guez 3
143 guez 40 ! zplev defini aux (llm +1) interfaces des couches
144     ! zplay defini aux (llm) milieux des couches
145 guez 3
146 guez 40 ! Exner = cp * (p(l) / preff) ** kappa
147 guez 3
148 guez 10 forall (l = 1: llm+1) zplev(:, l) = pack(p3d(:, :, l), dyn_phy)
149 guez 3
150 guez 40 ! 43. temperature naturelle (en K) et pressions milieux couches
151 guez 34 DO l=1, llm
152 guez 40 pksurcp = ppk(:, :, l) / cpp
153 guez 10 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 guez 40 ! 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 40 ig0 = 2
164 guez 34 DO j=2, jjm
165 guez 3 DO i = 1, iim
166 guez 40 qx(ig0, l, iq) = q(i, j, l, iiq)
167     ig0 = ig0 + 1
168 guez 3 ENDDO
169     ENDDO
170 guez 34 qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
171 guez 3 ENDDO
172     ENDDO
173    
174 guez 40 ! Geopotentiel calcule par rapport a la surface locale:
175 guez 3 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 40 ! 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 guez 40 ! 45. champ u:
197 guez 3
198 guez 40 DO l=1, llm
199     DO j=2, jjm
200 guez 3 ig0 = 1+(j-2)*iim
201 guez 40 zufi(ig0+1, l)= 0.5 * &
202 guez 34 (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 guez 40 ! 46.champ v:
212 guez 3
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 40 ! 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 guez 3
222 guez 34 DO l=1, llm
223 guez 40 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, 1, l)/cv_2d(1, 1)
224 guez 34 DO i=2, iim
225 guez 40 z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i, 1, l)/cv_2d(i, 1)
226 guez 3 ENDDO
227    
228 guez 40 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 40 ! 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 guez 3
236 guez 34 DO l=1, llm
237 guez 40 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*pvcov(1, jjm, l) &
238 guez 34 /cv_2d(1, jjm)
239     DO i=2, iim
240 guez 40 z1(i) =(rlonu(i)-rlonu(i-1))*pvcov(i, jjm, l)/cv_2d(i, jjm)
241 guez 3 ENDDO
242    
243 guez 40 zufi(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
244     zvfi(:, jjm + 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
245 guez 35 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 guez 40 ! transformation des tendances physiques en tendances dynamiques:
259 guez 3
260 guez 40 ! tendance sur la pression :
261 guez 3
262     pdpsfi = gr_fi_dyn(zdpsrf)
263    
264 guez 40 ! 62. enthalpie potentielle
265 guez 3
266 guez 34 DO l=1, llm
267 guez 3
268 guez 34 DO i=1, iim + 1
269 guez 40 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 40 pdhfi(iim + 1, j, l) = pdhfi(1, j, l)
279 guez 3 ENDDO
280    
281     ENDDO
282    
283 guez 40 ! 62. humidite specifique
284 guez 3
285 guez 34 DO iq=1, nqmx
286     DO l=1, llm
287     DO i=1, iim + 1
288 guez 40 pdqfi(i, 1, l, iq) = zdqfi(1, l, iq)
289 guez 34 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 guez 40 ! 63. traceurs
302 guez 3
303 guez 40 ! initialisation des tendances
304 guez 3 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 guez 40 pdqfi(i, 1, l, iiq) = zdqfi(1, l, iq)
311 guez 34 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 guez 40 ! 65. champ u:
324 guez 3
325 guez 34 DO l=1, llm
326 guez 3
327 guez 34 DO i=1, iim + 1
328 guez 40 pdufi(i, 1, l) = 0.
329 guez 34 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 guez 40 ! 67. champ v:
346 guez 3
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 guez 40 ! 68. champ v pres des poles:
360     ! v = U * cos(long) + V * SIN(long)
361 guez 3
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 40 pdvfi(iim + 1, 1, l) = pdvfi(1, 1, l)
375 guez 34 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