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

Annotation of /trunk/dyn3d/calfis.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 90 - (hide annotations)
Wed Mar 12 21:16:36 2014 UTC (10 years, 2 months ago) by guez
File size: 8637 byte(s)
Removed procedures ini_histday, ini_histhf, write_histday and
write_histhf.

Divided file regr_pr_coefoz.f into regr_pr_av.f and
regr_pr_int.f. (Following LMDZ.) Divided module regr_pr_coefoz into
modules regr_pr_av_m and regr_pr_int_m. Renamed regr_pr_av_coefoz to
regr_pr_av and regr_pr_int_coefoz to regr_pr_int. The idea is that
those procedures are more general than Mobidic.

Removed argument dudyn of calfis and physiq. dudyn is not used either
in LMDZ. Removed computation in calfis of unused variable zpsrf (not
used either in LMDZ). Removed useless computation of dqfi in calfis
(part 62): the results were overwritten. (Same in LMDZ.)

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 90 w, dufi, dvfi, dtetafi, dqfi, dpfi, lafin)
9 guez 3
10 guez 90 ! 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 90 ! 1. R\'earrangement 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 90 ! - Les vents sont donn\'es dans la physique par leurs composantes
22 guez 40 ! 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 90 ! - Les deux seules variables d\'ependant de la g\'eom\'etrie
29     ! n\'ecessaires pour la physique sont la latitude (pour le
30     ! rayonnement) et l'aire de la maille (quand on veut int\'egrer 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 guez 90 REAL, intent(in):: rdayvrai
45     REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour
46 guez 70
47     REAL, intent(in):: ucov(iim + 1, jjm + 1, llm)
48 guez 71 ! ucov covariant zonal velocity
49 guez 90
50 guez 71 REAL, intent(in):: vcov(iim + 1, jjm, llm)
51     ! vcov covariant meridional velocity
52 guez 3
53 guez 90 REAL, intent(in):: teta(iim + 1, jjm + 1, llm) ! teta potential temperature
54    
55 guez 34 REAL, intent(in):: q(iim + 1, jjm + 1, llm, nqmx)
56 guez 90 ! mass fractions of advected fields
57 guez 3
58 guez 90 REAL, intent(in):: ps(iim + 1, jjm + 1) ! ps surface pressure
59    
60 guez 70 REAL, intent(in):: pk(iim + 1, jjm + 1, llm)
61 guez 90 ! Exner = cp * (p / preff)**kappa
62    
63 guez 69 REAL, intent(in):: phis(iim + 1, jjm + 1)
64 guez 47 REAL, intent(in):: phi(iim + 1, jjm + 1, llm)
65     REAL, intent(in):: w(iim + 1, jjm + 1, llm)
66 guez 71
67     REAL, intent(out):: dufi(iim + 1, jjm + 1, llm)
68     ! tendency for the covariant zonal velocity (m2 s-2)
69    
70 guez 90 REAL, intent(out):: dvfi(iim + 1, jjm, llm)
71     ! tendency for the natural meridional velocity
72    
73 guez 47 REAL, intent(out):: dtetafi(iim + 1, jjm + 1, llm)
74 guez 90 ! tendency for the potential temperature
75    
76     REAL, intent(out):: dqfi(iim + 1, jjm + 1, llm, nqmx)
77     REAL, intent(out):: dpfi(iim + 1, jjm + 1) ! tendance sur la pression
78 guez 70 LOGICAL, intent(in):: lafin
79 guez 3
80 guez 90 ! Local:
81 guez 3
82 guez 89 INTEGER i, j, l, ig0, iq, iiq
83 guez 3 REAL zpsrf(klon)
84 guez 90
85 guez 47 REAL paprs(klon, llm+1), play(klon, llm)
86 guez 90 ! paprs defini aux (llm +1) interfaces des couches
87     ! play defini aux (llm) milieux des couches
88    
89 guez 47 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     !-----------------------------------------------------------------------
105    
106     !!print *, "Call sequence information: calfis"
107    
108 guez 40 ! 40. transformation des variables dynamiques en variables physiques:
109 guez 3
110 guez 40 ! 42. pression intercouches :
111 guez 3
112 guez 47 forall (l = 1: llm+1) paprs(:, l) = pack(p3d(:, :, l), dyn_phy)
113 guez 3
114 guez 40 ! 43. temperature naturelle (en K) et pressions milieux couches
115 guez 34 DO l=1, llm
116 guez 47 pksurcp = pk(:, :, l) / cpp
117 guez 10 pls(:, :, l) = preff * pksurcp**(1./ kappa)
118 guez 47 play(:, l) = pack(pls(:, :, l), dyn_phy)
119     t(:, l) = pack(teta(:, :, l) * pksurcp, dyn_phy)
120 guez 3 ENDDO
121    
122 guez 40 ! 43.bis traceurs
123 guez 34 DO iq=1, nqmx
124 guez 3 iiq=niadv(iq)
125 guez 34 DO l=1, llm
126     qx(1, l, iq) = q(1, 1, l, iiq)
127 guez 40 ig0 = 2
128 guez 34 DO j=2, jjm
129 guez 3 DO i = 1, iim
130 guez 40 qx(ig0, l, iq) = q(i, j, l, iiq)
131     ig0 = ig0 + 1
132 guez 3 ENDDO
133     ENDDO
134 guez 34 qx(ig0, l, iq) = q(1, jjm + 1, l, iiq)
135 guez 3 ENDDO
136     ENDDO
137    
138 guez 40 ! Geopotentiel calcule par rapport a la surface locale:
139 guez 47 forall (l = 1:llm) pphi(:, l) = pack(phi(:, :, l), dyn_phy)
140     pphis = pack(phis, dyn_phy)
141     forall (l = 1:llm) pphi(:, l)=pphi(:, l) - pphis
142 guez 3
143 guez 40 ! Calcul de la vitesse verticale (en Pa*m*s ou Kg/s)
144 guez 34 DO l=1, llm
145 guez 47 omega(1, l)=w(1, 1, l) * g /apoln
146 guez 3 ig0=2
147 guez 34 DO j=2, jjm
148 guez 3 DO i = 1, iim
149 guez 47 omega(ig0, l) = w(i, j, l) * g * unsaire_2d(i, j)
150 guez 3 ig0 = ig0 + 1
151     ENDDO
152     ENDDO
153 guez 47 omega(ig0, l)=w(1, jjm + 1, l) * g /apols
154 guez 3 ENDDO
155    
156 guez 40 ! 45. champ u:
157 guez 3
158 guez 40 DO l=1, llm
159     DO j=2, jjm
160 guez 3 ig0 = 1+(j-2)*iim
161 guez 71 u(ig0+1, l)= 0.5 &
162     * (ucov(iim, j, l) / cu_2d(iim, j) + ucov(1, j, l) / cu_2d(1, j))
163 guez 34 DO i=2, iim
164 guez 71 u(ig0+i, l)= 0.5 * (ucov(i-1, j, l)/cu_2d(i-1, j) &
165 guez 47 + ucov(i, j, l)/cu_2d(i, j))
166 guez 3 end DO
167     end DO
168     end DO
169    
170 guez 40 ! 46.champ v:
171 guez 3
172 guez 35 forall (j = 2: jjm, l = 1: llm) zvfi(:iim, j, l)= 0.5 &
173 guez 47 * (vcov(:iim, j-1, l) / cv_2d(:iim, j-1) &
174     + vcov(:iim, j, l) / cv_2d(:iim, j))
175 guez 35 zvfi(iim + 1, 2:jjm, :) = zvfi(1, 2:jjm, :)
176 guez 3
177 guez 90 ! 47. champs de vents au p\^ole nord
178 guez 40 ! U = 1 / pi * integrale [ v * cos(long) * d long ]
179     ! V = 1 / pi * integrale [ v * sin(long) * d long ]
180 guez 3
181 guez 34 DO l=1, llm
182 guez 47 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*vcov(1, 1, l)/cv_2d(1, 1)
183 guez 34 DO i=2, iim
184 guez 47 z1(i) =(rlonu(i)-rlonu(i-1))*vcov(i, 1, l)/cv_2d(i, 1)
185 guez 3 ENDDO
186    
187 guez 47 u(1, l) = SUM(COS(rlonv(:iim)) * z1) / pi
188 guez 40 zvfi(:, 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
189 guez 3 ENDDO
190    
191 guez 90 ! 48. champs de vents au p\^ole sud:
192 guez 40 ! U = 1 / pi * integrale [ v * cos(long) * d long ]
193     ! V = 1 / pi * integrale [ v * sin(long) * d long ]
194 guez 3
195 guez 34 DO l=1, llm
196 guez 47 z1(1) =(rlonu(1)-rlonu(iim)+2.*pi)*vcov(1, jjm, l) &
197 guez 34 /cv_2d(1, jjm)
198     DO i=2, iim
199 guez 47 z1(i) =(rlonu(i)-rlonu(i-1))*vcov(i, jjm, l)/cv_2d(i, jjm)
200 guez 3 ENDDO
201    
202 guez 47 u(klon, l) = SUM(COS(rlonv(:iim)) * z1) / pi
203 guez 40 zvfi(:, jjm + 1, l) = SUM(SIN(rlonv(:iim)) * z1) / pi
204 guez 35 ENDDO
205 guez 3
206 guez 35 forall(l= 1: llm) v(:, l) = pack(zvfi(:, :, l), dyn_phy)
207 guez 3
208 guez 35 ! Appel de la physique :
209 guez 47 CALL physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, u, &
210 guez 90 v, t, qx, omega, d_u, d_v, d_t, d_qx, d_ps)
211 guez 3
212 guez 40 ! transformation des tendances physiques en tendances dynamiques:
213 guez 3
214 guez 47 dpfi = gr_fi_dyn(d_ps)
215 guez 3
216 guez 40 ! 62. enthalpie potentielle
217 guez 47 do l=1, llm
218     dtetafi(:, :, l) = cpp * gr_fi_dyn(d_t(:, l)) / pk(:, :, l)
219     end do
220 guez 3
221 guez 40 ! 63. traceurs
222 guez 3
223 guez 40 ! initialisation des tendances
224 guez 47 dqfi=0.
225 guez 3
226 guez 34 DO iq=1, nqmx
227 guez 3 iiq=niadv(iq)
228 guez 34 DO l=1, llm
229     DO i=1, iim + 1
230 guez 47 dqfi(i, 1, l, iiq) = d_qx(1, l, iq)
231     dqfi(i, jjm + 1, l, iiq) = d_qx(klon, l, iq)
232 guez 3 ENDDO
233 guez 34 DO j=2, jjm
234 guez 3 ig0=1+(j-2)*iim
235 guez 34 DO i=1, iim
236 guez 47 dqfi(i, j, l, iiq) = d_qx(ig0+i, l, iq)
237 guez 3 ENDDO
238 guez 47 dqfi(iim + 1, j, l, iiq) = dqfi(1, j, l, iq)
239 guez 3 ENDDO
240     ENDDO
241     ENDDO
242    
243 guez 40 ! 65. champ u:
244 guez 3
245 guez 34 DO l=1, llm
246     DO i=1, iim + 1
247 guez 47 dufi(i, 1, l) = 0.
248     dufi(i, jjm + 1, l) = 0.
249 guez 3 ENDDO
250    
251 guez 34 DO j=2, jjm
252 guez 3 ig0=1+(j-2)*iim
253 guez 34 DO i=1, iim-1
254 guez 71 dufi(i, j, l)= 0.5*(d_u(ig0+i, l)+d_u(ig0+i+1, l))*cu_2d(i, j)
255 guez 3 ENDDO
256 guez 71 dufi(iim, j, l)= 0.5*(d_u(ig0+1, l)+d_u(ig0+iim, l))*cu_2d(iim, j)
257 guez 47 dufi(iim + 1, j, l)=dufi(1, j, l)
258 guez 3 ENDDO
259     ENDDO
260    
261 guez 40 ! 67. champ v:
262 guez 3
263 guez 34 DO l=1, llm
264     DO j=2, jjm-1
265 guez 3 ig0=1+(j-2)*iim
266 guez 34 DO i=1, iim
267 guez 71 dvfi(i, j, l)= 0.5*(d_v(ig0+i, l)+d_v(ig0+i+iim, l))*cv_2d(i, j)
268 guez 3 ENDDO
269 guez 47 dvfi(iim + 1, j, l) = dvfi(1, j, l)
270 guez 3 ENDDO
271     ENDDO
272    
273 guez 90 ! 68. champ v pr\`es des p\^oles:
274 guez 40 ! v = U * cos(long) + V * SIN(long)
275 guez 3
276 guez 34 DO l=1, llm
277     DO i=1, iim
278 guez 71 dvfi(i, 1, l)= d_u(1, l)*COS(rlonv(i))+d_v(1, l)*SIN(rlonv(i))
279     dvfi(i, jjm, l)=d_u(klon, l)*COS(rlonv(i)) +d_v(klon, l)*SIN(rlonv(i))
280     dvfi(i, 1, l)= 0.5*(dvfi(i, 1, l)+d_v(i+1, l))*cv_2d(i, 1)
281     dvfi(i, jjm, l)= 0.5 &
282     * (dvfi(i, jjm, l) + d_v(klon - iim - 1 + i, l)) * cv_2d(i, jjm)
283 guez 3 ENDDO
284    
285 guez 47 dvfi(iim + 1, 1, l) = dvfi(1, 1, l)
286     dvfi(iim + 1, jjm, l)= dvfi(1, jjm, l)
287 guez 3 ENDDO
288    
289     END SUBROUTINE calfis
290    
291     end module calfis_m

  ViewVC Help
Powered by ViewVC 1.1.21