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

Annotation of /trunk/dyn3d/calfis.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 79 - (hide annotations)
Fri Feb 28 17:52:47 2014 UTC (10 years, 2 months ago) by guez
File size: 9981 byte(s)
Moved procedure iniconst inside module comconst. Removed useless
variables of module comconst: im, jm, lllm, imp1, jmp1, lllmm1,
lllmp1, lcl, cotot, unsim. Move definition of dtvr that was in
dynetat0 and etat0 to iniconst. Moved comparison of dtvr from day_step
and start.nc that was in gcm to dynetat0. Moved call to disvert out of
iniconst. Moved call to iniconst in gcm before call to dynetat0.

Removed unused argument pvteta of physiq (not used either in LMDZ).

1 guez 3 module calfis_m
2    
3     IMPLICIT NONE
4    
5     contains
6    
7 guez 71 SUBROUTINE calfis(rdayvrai, time, ucov, vcov, teta, q, ps, pk, phis, phi, &
8     dudyn, dv, w, dufi, dvfi, dtetafi, dqfi, dpfi, lafin)
9 guez 3
10 guez 35 ! From dyn3d/calfis.F, version 1.3 2005/05/25 13:10:09
11 guez 40 ! Authors: P. Le Van, F. Hourdin
12 guez 3
13 guez 70 ! 1. Réarrangement des tableaux et transformation des variables
14 guez 40 ! dynamiques en variables physiques
15 guez 70
16 guez 40 ! 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 guez 70 ! 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 70 use comconst, only: kappa, cpp, dtphys, g
34     use comgeom, only: apoln, cu_2d, cv_2d, unsaire_2d, apols, rlonu, rlonv
35     use dimens_m, only: iim, jjm, llm, nqmx
36     use dimphy, only: klon
37     use disvert_m, only: preff
38     use grid_change, only: dyn_phy, gr_fi_dyn
39     use iniadvtrac_m, only: niadv
40     use nr_util, only: pi
41     use physiq_m, only: physiq
42     use pressure_var, only: p3d, pls
43    
44     ! Arguments :
45    
46 guez 40 ! Output :
47 guez 47 ! dvfi tendency for the natural meridional velocity
48     ! dtetafi tendency for the potential temperature
49 guez 40 ! pdtsfi tendency for the surface temperature
50    
51     ! pdtrad radiative tendencies \ input and output
52     ! pfluxrad radiative fluxes / input and output
53    
54 guez 70 REAL, intent(in):: rdayvrai
55 guez 47 REAL, intent(in):: time ! heure de la journée en fraction de jour
56 guez 70 REAL, intent(in):: ucov(iim + 1, jjm + 1, llm)
57 guez 71 ! ucov covariant zonal velocity
58     REAL, intent(in):: vcov(iim + 1, jjm, llm)
59     ! vcov covariant meridional velocity
60 guez 44 REAL, intent(in):: teta(iim + 1, jjm + 1, llm)
61 guez 71 ! teta potential temperature
62 guez 3
63 guez 34 REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)
64 guez 3 ! (mass fractions of advected fields)
65    
66 guez 71 REAL, intent(in):: ps(iim + 1, jjm + 1)
67     ! ps surface pressure
68 guez 70 REAL, intent(in):: pk(iim + 1, jjm + 1, llm)
69 guez 69 REAL, intent(in):: phis(iim + 1, jjm + 1)
70 guez 47 REAL, intent(in):: phi(iim + 1, jjm + 1, llm)
71 guez 70 REAL dudyn(iim + 1, jjm + 1, llm)
72 guez 47 REAL dv(iim + 1, jjm, llm)
73     REAL, intent(in):: w(iim + 1, jjm + 1, llm)
74 guez 71
75     REAL, intent(out):: dufi(iim + 1, jjm + 1, llm)
76     ! tendency for the covariant zonal velocity (m2 s-2)
77    
78 guez 47 REAL dvfi(iim + 1, jjm, llm)
79     REAL, intent(out):: dtetafi(iim + 1, jjm + 1, llm)
80     REAL dqfi(iim + 1, jjm + 1, llm, nqmx)
81     REAL dpfi(iim + 1, jjm + 1)
82 guez 70 LOGICAL, intent(in):: lafin
83 guez 3
84 guez 40 ! Local variables :
85 guez 3
86 guez 34 INTEGER i, j, l, ig0, ig, iq, iiq
87 guez 3 REAL zpsrf(klon)
88 guez 47 REAL paprs(klon, llm+1), play(klon, llm)
89     REAL pphi(klon, llm), pphis(klon)
90 guez 3
91 guez 47 REAL u(klon, llm), v(klon, llm)
92 guez 35 real zvfi(iim + 1, jjm + 1, llm)
93 guez 47 REAL t(klon, llm) ! temperature
94 guez 34 real qx(klon, llm, nqmx) ! mass fractions of advected fields
95 guez 47 REAL omega(klon, llm)
96 guez 3
97 guez 71 REAL d_u(klon, llm), d_v(klon, llm) ! tendances physiques du vent (m s-2)
98 guez 47 REAL d_t(klon, llm), d_qx(klon, llm, nqmx)
99     REAL d_ps(klon)
100 guez 3
101 guez 35 REAL z1(iim)
102 guez 34 REAL pksurcp(iim + 1, jjm + 1)
103 guez 3
104     ! I. Musat: diagnostic PVteta, Amip2
105     INTEGER, PARAMETER:: ntetaSTD=3
106     REAL:: rtetaSTD(ntetaSTD) = (/350., 380., 405./)
107 guez 34 REAL PVteta(klon, ntetaSTD)
108 guez 3
109     !-----------------------------------------------------------------------
110    
111     !!print *, "Call sequence information: calfis"
112    
113 guez 40 ! 1. Initialisations :
114     ! latitude, longitude et aires des mailles pour la physique:
115 guez 3
116 guez 40 ! 40. transformation des variables dynamiques en variables physiques:
117     ! 41. pressions au sol (en Pascals)
118 guez 3
119 guez 47 zpsrf(1) = ps(1, 1)
120 guez 3
121 guez 40 ig0 = 2
122 guez 34 DO j = 2, jjm
123 guez 47 CALL SCOPY(iim, ps(1, j), 1, zpsrf(ig0), 1)
124 guez 3 ig0 = ig0+iim
125     ENDDO
126    
127 guez 47 zpsrf(klon) = ps(1, jjm + 1)
128 guez 3
129 guez 40 ! 42. pression intercouches :
130 guez 3
131 guez 47 ! paprs defini aux (llm +1) interfaces des couches
132     ! play defini aux (llm) milieux des couches
133 guez 3
134 guez 40 ! Exner = cp * (p(l) / preff) ** kappa
135 guez 3
136 guez 47 forall (l = 1: llm+1) paprs(:, l) = pack(p3d(:, :, l), dyn_phy)
137 guez 3
138 guez 40 ! 43. temperature naturelle (en K) et pressions milieux couches
139 guez 34 DO l=1, llm
140 guez 47 pksurcp = pk(:, :, l) / cpp
141 guez 10 pls(:, :, l) = preff * pksurcp**(1./ kappa)
142 guez 47 play(:, l) = pack(pls(:, :, l), dyn_phy)
143     t(:, l) = pack(teta(:, :, l) * pksurcp, dyn_phy)
144 guez 3 ENDDO
145    
146 guez 40 ! 43.bis traceurs
147 guez 34 DO iq=1, nqmx
148 guez 3 iiq=niadv(iq)
149 guez 34 DO l=1, llm
150     qx(1, l, iq) = q(1, 1, l, iiq)
151 guez 40 ig0 = 2
152 guez 34 DO j=2, jjm
153 guez 3 DO i = 1, iim
154 guez 40 qx(ig0, l, iq) = q(i, j, l, iiq)
155     ig0 = ig0 + 1
156 guez 3 ENDDO
157     ENDDO
158 guez 34 qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
159 guez 3 ENDDO
160     ENDDO
161    
162 guez 40 ! Geopotentiel calcule par rapport a la surface locale:
163 guez 47 forall (l = 1:llm) pphi(:, l) = pack(phi(:, :, l), dyn_phy)
164     pphis = pack(phis, dyn_phy)
165     forall (l = 1:llm) pphi(:, l)=pphi(:, l) - pphis
166 guez 3
167 guez 40 ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
168 guez 34 DO l=1, llm
169 guez 47 omega(1, l)=w(1, 1, l) * g /apoln
170 guez 3 ig0=2
171 guez 34 DO j=2, jjm
172 guez 3 DO i = 1, iim
173 guez 47 omega(ig0, l) = w(i, j, l) * g * unsaire_2d(i, j)
174 guez 3 ig0 = ig0 + 1
175     ENDDO
176     ENDDO
177 guez 47 omega(ig0, l)=w(1, jjm + 1, l) * g /apols
178 guez 3 ENDDO
179    
180 guez 40 ! 45. champ u:
181 guez 3
182 guez 40 DO l=1, llm
183     DO j=2, jjm
184 guez 3 ig0 = 1+(j-2)*iim
185 guez 71 u(ig0+1, l)= 0.5 &
186     * (ucov(iim, j, l) / cu_2d(iim, j) + ucov(1, j, l) / cu_2d(1, j))
187 guez 34 DO i=2, iim
188 guez 71 u(ig0+i, l)= 0.5 * (ucov(i-1, j, l)/cu_2d(i-1, j) &
189 guez 47 + ucov(i, j, l)/cu_2d(i, j))
190 guez 3 end DO
191     end DO
192     end DO
193    
194 guez 40 ! 46.champ v:
195 guez 3
196 guez 35 forall (j = 2: jjm, l = 1: llm) zvfi(:iim, j, l)= 0.5 &
197 guez 47 * (vcov(:iim, j-1, l) / cv_2d(:iim, j-1) &
198     + vcov(:iim, j, l) / cv_2d(:iim, j))
199 guez 35 zvfi(iim + 1, 2:jjm, :) = zvfi(1, 2:jjm, :)
200 guez 3
201 guez 40 ! 47. champs de vents au pôle nord
202     ! U = 1 / pi * integrale [ v * cos(long) * d long ]
203     ! V = 1 / pi * integrale [ v * sin(long) * d long ]
204 guez 3
205 guez 34 DO l=1, llm
206 guez 47 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*vcov(1, 1, l)/cv_2d(1, 1)
207 guez 34 DO i=2, iim
208 guez 47 z1(i) =(rlonu(i)-rlonu(i-1))*vcov(i, 1, l)/cv_2d(i, 1)
209 guez 3 ENDDO
210    
211 guez 47 u(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
212 guez 40 zvfi(:, 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
213 guez 3 ENDDO
214    
215 guez 40 ! 48. champs de vents au pôle sud:
216     ! U = 1 / pi * integrale [ v * cos(long) * d long ]
217     ! V = 1 / pi * integrale [ v * sin(long) * d long ]
218 guez 3
219 guez 34 DO l=1, llm
220 guez 47 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*vcov(1, jjm, l) &
221 guez 34 /cv_2d(1, jjm)
222     DO i=2, iim
223 guez 47 z1(i) =(rlonu(i)-rlonu(i-1))*vcov(i, jjm, l)/cv_2d(i, jjm)
224 guez 3 ENDDO
225    
226 guez 47 u(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
227 guez 40 zvfi(:, jjm + 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
228 guez 35 ENDDO
229 guez 3
230 guez 35 forall(l= 1: llm) v(:, l) = pack(zvfi(:, :, l), dyn_phy)
231 guez 3
232 guez 79 ! Compute potential vorticity at theta = 350, 380 and 405 K:
233 guez 71 CALL PVtheta(klon, llm, ucov, vcov, teta, t, play, paprs, ntetaSTD, &
234     rtetaSTD, PVteta)
235 guez 3
236 guez 35 ! Appel de la physique :
237 guez 47 CALL physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, u, &
238 guez 79 v, t, qx, omega, d_u, d_v, d_t, d_qx, d_ps, dudyn)
239 guez 3
240 guez 40 ! transformation des tendances physiques en tendances dynamiques:
241 guez 3
242 guez 40 ! tendance sur la pression :
243 guez 3
244 guez 47 dpfi = gr_fi_dyn(d_ps)
245 guez 3
246 guez 40 ! 62. enthalpie potentielle
247 guez 47 do l=1, llm
248     dtetafi(:, :, l) = cpp * gr_fi_dyn(d_t(:, l)) / pk(:, :, l)
249     end do
250 guez 3
251 guez 40 ! 62. humidite specifique
252 guez 3
253 guez 34 DO iq=1, nqmx
254     DO l=1, llm
255     DO i=1, iim + 1
256 guez 47 dqfi(i, 1, l, iq) = d_qx(1, l, iq)
257     dqfi(i, jjm + 1, l, iq) = d_qx(klon, l, iq)
258 guez 3 ENDDO
259 guez 34 DO j=2, jjm
260 guez 3 ig0=1+(j-2)*iim
261 guez 34 DO i=1, iim
262 guez 47 dqfi(i, j, l, iq) = d_qx(ig0+i, l, iq)
263 guez 3 ENDDO
264 guez 47 dqfi(iim + 1, j, l, iq) = dqfi(1, j, l, iq)
265 guez 3 ENDDO
266     ENDDO
267     ENDDO
268    
269 guez 40 ! 63. traceurs
270 guez 3
271 guez 40 ! initialisation des tendances
272 guez 47 dqfi=0.
273 guez 3
274 guez 34 DO iq=1, nqmx
275 guez 3 iiq=niadv(iq)
276 guez 34 DO l=1, llm
277     DO i=1, iim + 1
278 guez 47 dqfi(i, 1, l, iiq) = d_qx(1, l, iq)
279     dqfi(i, jjm + 1, l, iiq) = d_qx(klon, l, iq)
280 guez 3 ENDDO
281 guez 34 DO j=2, jjm
282 guez 3 ig0=1+(j-2)*iim
283 guez 34 DO i=1, iim
284 guez 47 dqfi(i, j, l, iiq) = d_qx(ig0+i, l, iq)
285 guez 3 ENDDO
286 guez 47 dqfi(iim + 1, j, l, iiq) = dqfi(1, j, l, iq)
287 guez 3 ENDDO
288     ENDDO
289     ENDDO
290    
291 guez 40 ! 65. champ u:
292 guez 3
293 guez 34 DO l=1, llm
294     DO i=1, iim + 1
295 guez 47 dufi(i, 1, l) = 0.
296     dufi(i, jjm + 1, l) = 0.
297 guez 3 ENDDO
298    
299 guez 34 DO j=2, jjm
300 guez 3 ig0=1+(j-2)*iim
301 guez 34 DO i=1, iim-1
302 guez 71 dufi(i, j, l)= 0.5*(d_u(ig0+i, l)+d_u(ig0+i+1, l))*cu_2d(i, j)
303 guez 3 ENDDO
304 guez 71 dufi(iim, j, l)= 0.5*(d_u(ig0+1, l)+d_u(ig0+iim, l))*cu_2d(iim, j)
305 guez 47 dufi(iim + 1, j, l)=dufi(1, j, l)
306 guez 3 ENDDO
307     ENDDO
308    
309 guez 40 ! 67. champ v:
310 guez 3
311 guez 34 DO l=1, llm
312     DO j=2, jjm-1
313 guez 3 ig0=1+(j-2)*iim
314 guez 34 DO i=1, iim
315 guez 71 dvfi(i, j, l)= 0.5*(d_v(ig0+i, l)+d_v(ig0+i+iim, l))*cv_2d(i, j)
316 guez 3 ENDDO
317 guez 47 dvfi(iim + 1, j, l) = dvfi(1, j, l)
318 guez 3 ENDDO
319     ENDDO
320    
321 guez 71 ! 68. champ v près des pôles:
322 guez 40 ! v = U * cos(long) + V * SIN(long)
323 guez 3
324 guez 34 DO l=1, llm
325     DO i=1, iim
326 guez 71 dvfi(i, 1, l)= d_u(1, l)*COS(rlonv(i))+d_v(1, l)*SIN(rlonv(i))
327     dvfi(i, jjm, l)=d_u(klon, l)*COS(rlonv(i)) +d_v(klon, l)*SIN(rlonv(i))
328     dvfi(i, 1, l)= 0.5*(dvfi(i, 1, l)+d_v(i+1, l))*cv_2d(i, 1)
329     dvfi(i, jjm, l)= 0.5 &
330     * (dvfi(i, jjm, l) + d_v(klon - iim - 1 + i, l)) * cv_2d(i, jjm)
331 guez 3 ENDDO
332    
333 guez 47 dvfi(iim + 1, 1, l) = dvfi(1, 1, l)
334     dvfi(iim + 1, jjm, l)= dvfi(1, jjm, l)
335 guez 3 ENDDO
336    
337     END SUBROUTINE calfis
338    
339     end module calfis_m

  ViewVC Help
Powered by ViewVC 1.1.21