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

Contents of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 89 - (show annotations)
Tue Mar 11 16:03:19 2014 UTC (10 years, 2 months ago) by guez
File size: 9612 byte(s)
Removed call to pvtheta in calfis because the result pvteta is not
used (not used either in LMDZ).

Removed unused argument dv of calfis. (Corresponding argument in LMDZ
is pdvcov and computations from pdvcov are made in calfis but not
used.)

Removed procedures that were not called.

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

  ViewVC Help
Powered by ViewVC 1.1.21