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

Annotation of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21