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

Contents of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 70 - (show annotations)
Mon Jun 24 15:39:52 2013 UTC (10 years, 11 months ago) by guez
Original Path: trunk/libf/dyn3d/calfis.f90
File size: 10221 byte(s)
In procedure, "addfi" access directly the module variable "dtphys"
instead of going through an argument.

In "conflx", do not create a local variable for temperature with
reversed order of vertical levels. Instead, give an actual argument
with reversed order in "physiq".

Changed names of variables "rmd" and "rmv" from module "suphec_m" to
"md" and "mv".

In "hgardfou", print only the first temperature out of range found.

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

  ViewVC Help
Powered by ViewVC 1.1.21