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

Annotation of /trunk/dyn3d/calfis.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 70 - (hide annotations)
Mon Jun 24 15:39:52 2013 UTC (10 years, 11 months ago) by guez
Original Path: trunk/libf/dyn3d/calfis.f90
File size: 10221 byte(s)
In procedure, "addfi" access directly the module variable "dtphys"
instead of going through an argument.

In "conflx", do not create a local variable for temperature with
reversed order of vertical levels. Instead, give an actual argument
with reversed order in "physiq".

Changed names of variables "rmd" and "rmv" from module "suphec_m" to
"md" and "mv".

In "hgardfou", print only the first temperature out of range found.

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

  ViewVC Help
Powered by ViewVC 1.1.21