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

Contents of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 88 - (show annotations)
Tue Mar 11 15:09:02 2014 UTC (10 years, 2 months ago) by guez
File size: 10012 byte(s)
Removed useless argument mode of subroutine read_reanalyse.

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

  ViewVC Help
Powered by ViewVC 1.1.21