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

Annotation of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 71 - (hide annotations)
Mon Jul 8 18:12:18 2013 UTC (10 years, 10 months ago) by guez
Original Path: trunk/libf/dyn3d/calfis.f90
File size: 9964 byte(s)
No reason to call inidissip in ce0l.

In inidissip, set random seed to 1 beacuse PGI compiler does not
accept all zeros.

dq was computed needlessly in caladvtrac. Arguments masse and dq of
calfis not used.

Replaced real*8 by double precision.

Pass arrays with inverted order of vertical levels to conflx instead
of creating local variables for this inside conflx.

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

  ViewVC Help
Powered by ViewVC 1.1.21