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

Annotation of /trunk/dyn3d/calfis.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 47 - (hide annotations)
Fri Jul 1 15:00:48 2011 UTC (12 years, 10 months ago) by guez
Original Path: trunk/libf/dyn3d/calfis.f90
File size: 10193 byte(s)
Split "thermcell.f" and "cv3_routines.f".
Removed copies of files that are now in "L_util".
Moved "mva9" and "diagetpq" to their own files.
Unified variable names across procedures.

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

  ViewVC Help
Powered by ViewVC 1.1.21