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

Contents of /trunk/libf/dyn3d/calfis.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 47 - (show annotations)
Fri Jul 1 15:00:48 2011 UTC (12 years, 10 months ago) by guez
File size: 10193 byte(s)
Split "thermcell.f" and "cv3_routines.f".
Removed copies of files that are now in "L_util".
Moved "mva9" and "diagetpq" to their own files.
Unified variable names across procedures.

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

  ViewVC Help
Powered by ViewVC 1.1.21