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

Annotation of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21