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

Contents of /trunk/dyn3d/comgeom.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 82 - (show annotations)
Wed Mar 5 14:57:53 2014 UTC (10 years, 2 months ago) by guez
File size: 19310 byte(s)
Changed all ".f90" suffixes to ".f".
1 module comgeom
2
3 use dimens_m, only: iim, jjm
4
5 implicit none
6
7 private iim, jjm
8
9 real cu_2d(iim + 1, jjm + 1), cv_2d(iim + 1, jjm) ! in m
10 real cu((iim + 1) * (jjm + 1)), cv((iim + 1) * jjm) ! in m
11 equivalence (cu, cu_2d), (cv, cv_2d)
12
13 real unscu2_2d(iim + 1, jjm + 1) ! in m-2
14 real unscu2((iim + 1) * (jjm + 1)) ! in m-2
15 equivalence (unscu2, unscu2_2d)
16
17 real unscv2_2d(iim + 1, jjm) ! in m-2
18 real unscv2((iim + 1) * jjm) ! in m-2
19 equivalence (unscv2, unscv2_2d)
20
21 real aire((iim + 1) * (jjm + 1)), aire_2d(iim + 1, jjm + 1) ! in m2
22 real airesurg_2d(iim + 1, jjm + 1), airesurg((iim + 1) * (jjm + 1))
23 equivalence (aire, aire_2d), (airesurg, airesurg_2d)
24
25 real aireu_2d(iim + 1, jjm + 1) ! in m2
26 real aireu((iim + 1) * (jjm + 1)) ! in m2
27 equivalence (aireu, aireu_2d)
28
29 real airev((iim + 1) * jjm), airev_2d(iim + 1, jjm) ! in m2
30 real unsaire((iim + 1) * (jjm + 1)), unsaire_2d(iim + 1, jjm + 1) ! in m-2
31 equivalence (airev, airev_2d), (unsaire, unsaire_2d)
32
33 real apoln, apols ! in m2
34
35 real unsairez_2d(iim + 1, jjm)
36 real unsairez((iim + 1) * jjm)
37 equivalence (unsairez, unsairez_2d)
38
39 real alpha1_2d(iim + 1, jjm + 1)
40 real alpha1((iim + 1) * (jjm + 1))
41 equivalence (alpha1, alpha1_2d)
42
43 real alpha2_2d(iim + 1, jjm + 1)
44 real alpha2((iim + 1) * (jjm + 1))
45 equivalence (alpha2, alpha2_2d)
46
47 real alpha3_2d(iim + 1, jjm + 1), alpha4_2d(iim + 1, jjm + 1)
48 real alpha3((iim + 1) * (jjm + 1)), alpha4((iim + 1) * (jjm + 1))
49 equivalence (alpha3, alpha3_2d), (alpha4, alpha4_2d)
50
51 real alpha1p2_2d(iim + 1, jjm + 1)
52 real alpha1p2((iim + 1) * (jjm + 1))
53 equivalence (alpha1p2, alpha1p2_2d)
54
55 real alpha1p4_2d(iim + 1, jjm + 1), alpha2p3_2d(iim + 1, jjm + 1)
56 real alpha1p4((iim + 1) * (jjm + 1)), alpha2p3((iim + 1) * (jjm + 1))
57 equivalence (alpha1p4, alpha1p4_2d), (alpha2p3, alpha2p3_2d)
58
59 real alpha3p4((iim + 1) * (jjm + 1))
60 real alpha3p4_2d(iim + 1, jjm + 1)
61 equivalence (alpha3p4, alpha3p4_2d)
62
63 real fext_2d(iim + 1, jjm), constang_2d(iim + 1, jjm + 1)
64 real fext((iim + 1) * jjm), constang((iim + 1) * (jjm + 1))
65 equivalence (fext, fext_2d), (constang, constang_2d)
66
67 real rlatu(jjm + 1)
68 ! (latitudes of points of the "scalar" and "u" grid, in rad)
69
70 real rlatv(jjm)
71 ! (latitudes of points of the "v" grid, in rad, in decreasing order)
72
73 real rlonu(iim + 1) ! longitudes of points of the "u" grid, in rad
74
75 real rlonv(iim + 1)
76 ! (longitudes of points of the "scalar" and "v" grid, in rad)
77
78 real cuvsurcv_2d(iim + 1, jjm), cvsurcuv_2d(iim + 1, jjm) ! no dimension
79 real cuvsurcv((iim + 1) * jjm), cvsurcuv((iim + 1) * jjm) ! no dimension
80 equivalence (cuvsurcv, cuvsurcv_2d), (cvsurcuv, cvsurcuv_2d)
81
82 real cvusurcu_2d(iim + 1, jjm + 1), cusurcvu_2d(iim + 1, jjm + 1)
83 ! no dimension
84 real cvusurcu((iim + 1) * (jjm + 1)), cusurcvu((iim + 1) * (jjm + 1))
85 ! no dimension
86 equivalence (cvusurcu, cvusurcu_2d), (cusurcvu, cusurcvu_2d)
87
88 real cuvscvgam1_2d(iim + 1, jjm)
89 real cuvscvgam1((iim + 1) * jjm)
90 equivalence (cuvscvgam1, cuvscvgam1_2d)
91
92 real cuvscvgam2_2d(iim + 1, jjm), cvuscugam1_2d(iim + 1, jjm + 1)
93 real cuvscvgam2((iim + 1) * jjm), cvuscugam1((iim + 1) * (jjm + 1))
94 equivalence (cuvscvgam2, cuvscvgam2_2d), (cvuscugam1, cvuscugam1_2d)
95
96 real cvuscugam2_2d(iim + 1, jjm + 1), cvscuvgam_2d(iim + 1, jjm)
97 real cvuscugam2((iim + 1) * (jjm + 1)), cvscuvgam((iim + 1) * jjm)
98 equivalence (cvuscugam2, cvuscugam2_2d), (cvscuvgam, cvscuvgam_2d)
99
100 real cuscvugam((iim + 1) * (jjm + 1))
101 real cuscvugam_2d(iim + 1, jjm + 1)
102 equivalence (cuscvugam, cuscvugam_2d)
103
104 real unsapolnga1, unsapolnga2, unsapolsga1, unsapolsga2
105
106 real unsair_gam1_2d(iim + 1, jjm + 1), unsair_gam2_2d(iim + 1, jjm + 1)
107 real unsair_gam1((iim + 1) * (jjm + 1)), unsair_gam2((iim + 1) * (jjm + 1))
108 equivalence (unsair_gam1, unsair_gam1_2d), (unsair_gam2, unsair_gam2_2d)
109
110 real unsairz_gam_2d(iim + 1, jjm)
111 real unsairz_gam((iim + 1) * jjm)
112 equivalence (unsairz_gam, unsairz_gam_2d)
113
114 real xprimu(iim + 1), xprimv(iim + 1)
115
116 save
117
118 contains
119
120 SUBROUTINE inigeom
121
122 ! Auteur : P. Le Van
123
124 ! Calcul des élongations cuij1, ..., cuij4, cvij1, ..., cvij4 aux mêmes
125 ! endroits que les aires aireij1_2d, ..., aireij4_2d.
126
127 ! Choix entre une fonction "f(y)" à dérivée sinusoïdale ou à
128 ! dérivée tangente hyperbolique. Calcul des coefficients cu_2d,
129 ! cv_2d, 1. / cu_2d**2, 1. / cv_2d**2. Les coefficients cu_2d et cv_2d
130 ! permettent de passer des vitesses naturelles aux vitesses
131 ! covariantes et contravariantes, ou vice-versa.
132
133 ! On a :
134 ! u(covariant) = cu_2d * u(naturel), u(contravariant) = u(naturel) / cu_2d
135 ! v(covariant) = cv_2d * v(naturel), v(contravariant) = v(naturel) / cv_2d
136
137 ! On en tire :
138 ! u(covariant) = cu_2d * cu_2d * u(contravariant)
139 ! v(covariant) = cv_2d * cv_2d * v(contravariant)
140
141 ! On a l'application (x(X), y(Y)) avec - im / 2 + 1 <= X <= im / 2
142 ! et - jm / 2 <= Y <= jm / 2
143
144 ! x est la longitude du point en radians.
145 ! y est la latitude du point en radians.
146 !
147 ! On a : cu_2d(i, j) = rad * cos(y) * dx / dX
148 ! cv(j) = rad * dy / dY
149 ! aire_2d(i, j) = cu_2d(i, j) * cv(j)
150 !
151 ! y, dx / dX, dy / dY calculés aux points concernés. cv, bien que
152 ! dépendant de j uniquement, sera ici indicé aussi en i pour un
153 ! adressage plus facile en ij.
154
155 ! xprimu et xprimv sont respectivement les valeurs de dx / dX aux
156 ! points u et v. yprimu et yprimv sont respectivement les valeurs
157 ! de dy / dY aux points u et v. rlatu et rlatv sont respectivement
158 ! les valeurs de la latitude aux points u et v. cvu et cv_2d sont
159 ! respectivement les valeurs de cv_2d aux points u et v.
160
161 ! cu_2d, cuv, cuscal, cuz sont respectivement les valeurs de cu_2d
162 ! aux points u, v, scalaires, et z. Cf. "inigeom.txt".
163
164 USE comconst, ONLY : g, omeg, rad
165 USE comdissnew, ONLY : coefdis, nitergdiv, nitergrot, niterh
166 use conf_gcm_m, ONLY : fxyhypb, ysinus
167 use fxy_m, only: fxy
168 use fxyhyper_m, only: fxyhyper
169 use jumble, only: new_unit
170 use nr_util, only: pi
171 USE paramet_m, ONLY : iip1, jjp1
172 USE serre, ONLY : alphax, alphay, clat, clon, dzoomx, dzoomy, grossismx, &
173 grossismy, pxo, pyo, taux, tauy, transx, transy
174 ! Modifies pxo, pyo, transx, transy
175
176 ! Variables locales
177
178 INTEGER i, j, itmax, itmay, iter, unit
179 REAL cvu(iip1, jjp1), cuv(iip1, jjm)
180 REAL ai14, ai23, airez, un4rad2
181 REAL eps, x1, xo1, f, df, xdm, y1, yo1, ydm
182 REAL coslatm, coslatp, radclatm, radclatp
183 REAL, dimension(iip1, jjp1):: cuij1, cuij2, cuij3, cuij4 ! in m
184 REAL, dimension(iip1, jjp1):: cvij1, cvij2, cvij3, cvij4 ! in m
185 REAL rlatu1(jjm), yprimu1(jjm), rlatu2(jjm), yprimu2(jjm)
186 real yprimv(jjm), yprimu(jjp1)
187 REAL gamdi_gdiv, gamdi_grot, gamdi_h
188 REAL rlonm025(iip1), xprimm025(iip1), rlonp025(iip1), xprimp025(iip1)
189 real, dimension(iim + 1, jjm + 1):: aireij1_2d, aireij2_2d, aireij3_2d, &
190 aireij4_2d ! in m2
191 real airuscv2_2d(iim + 1, jjm)
192 real airvscu2_2d(iim + 1, jjm), aiuscv2gam_2d(iim + 1, jjm)
193 real aivscu2gam_2d(iim + 1, jjm)
194
195 !------------------------------------------------------------------
196
197 PRINT *, 'Call sequence information: inigeom'
198
199 IF (nitergdiv/=2) THEN
200 gamdi_gdiv = coefdis / (real(nitergdiv)-2.)
201 ELSE
202 gamdi_gdiv = 0.
203 END IF
204 IF (nitergrot/=2) THEN
205 gamdi_grot = coefdis / (real(nitergrot)-2.)
206 ELSE
207 gamdi_grot = 0.
208 END IF
209 IF (niterh/=2) THEN
210 gamdi_h = coefdis / (real(niterh)-2.)
211 ELSE
212 gamdi_h = 0.
213 END IF
214
215 print *, 'gamdi_gdiv = ', gamdi_gdiv
216 print *, "gamdi_grot = ", gamdi_grot
217 print *, "gamdi_h = ", gamdi_h
218
219 IF (.NOT. fxyhypb) THEN
220 IF (ysinus) THEN
221 print *, ' Inigeom, Y = Sinus (Latitude) '
222 ! utilisation de f(x, y) avec y = sinus de la latitude
223 CALL fxysinus(rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, &
224 rlatu2, yprimu2, rlonu, xprimu, rlonv, xprimv, rlonm025, &
225 xprimm025, rlonp025, xprimp025)
226 ELSE
227 print *, 'Inigeom, Y = Latitude, der. sinusoid .'
228 ! utilisation de f(x, y) a tangente sinusoidale, y etant la latit
229
230 pxo = clon * pi / 180.
231 pyo = 2. * clat * pi / 180.
232
233 ! determination de transx (pour le zoom) par Newton-Raphson
234
235 itmax = 10
236 eps = .1E-7
237
238 xo1 = 0.
239 DO iter = 1, itmax
240 x1 = xo1
241 f = x1 + alphax * sin(x1-pxo)
242 df = 1. + alphax * cos(x1-pxo)
243 x1 = x1 - f / df
244 xdm = abs(x1-xo1)
245 IF (xdm<=eps) EXIT
246 xo1 = x1
247 END DO
248
249 transx = xo1
250
251 itmay = 10
252 eps = .1E-7
253
254 yo1 = 0.
255 DO iter = 1, itmay
256 y1 = yo1
257 f = y1 + alphay * sin(y1-pyo)
258 df = 1. + alphay * cos(y1-pyo)
259 y1 = y1 - f / df
260 ydm = abs(y1-yo1)
261 IF (ydm<=eps) EXIT
262 yo1 = y1
263 END DO
264
265 transy = yo1
266
267 CALL fxy(rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, rlatu2, &
268 yprimu2, rlonu, xprimu, rlonv, xprimv, rlonm025, xprimm025, &
269 rlonp025, xprimp025)
270 END IF
271 ELSE
272 ! Utilisation de fxyhyper, f(x, y) à dérivée tangente hyperbolique
273 print *, 'Inigeom, Y = Latitude, dérivée tangente hyperbolique'
274 CALL fxyhyper(clat, grossismy, dzoomy, tauy, clon, grossismx, dzoomx, &
275 taux, rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, rlatu2, &
276 yprimu2, rlonu, xprimu, rlonv, xprimv, rlonm025, xprimm025, &
277 rlonp025, xprimp025)
278 END IF
279
280 rlatu(1) = pi / 2.
281 rlatu(jjp1) = -rlatu(1)
282
283 ! Calcul aux pôles
284
285 yprimu(1) = 0.
286 yprimu(jjp1) = 0.
287
288 un4rad2 = 0.25 * rad * rad
289
290 ! Cf. "inigeom.txt". Calcul des quatre aires élémentaires
291 ! aireij1_2d, aireij2_2d, aireij3_2d, aireij4_2d qui entourent
292 ! chaque aire_2d(i, j), ainsi que les quatre élongations
293 ! élémentaires cuij et les quatre élongations cvij qui sont
294 ! calculées aux mêmes endroits que les aireij.
295
296 coslatm = cos(rlatu1(1))
297 radclatm = 0.5 * rad * coslatm
298
299 aireij1_2d(:iim, 1) = 0.
300 aireij2_2d(:iim, 1) = un4rad2 * coslatm * xprimp025(:iim) * yprimu1(1)
301 aireij3_2d(:iim, 1) = un4rad2 * coslatm * xprimm025(:iim) * yprimu1(1)
302 aireij4_2d(:iim, 1) = 0.
303
304 cuij1(:iim, 1) = 0.
305 cuij2(:iim, 1) = radclatm * xprimp025(:iim)
306 cuij3(:iim, 1) = radclatm * xprimm025(:iim)
307 cuij4(:iim, 1) = 0.
308
309 cvij1(:iim, 1) = 0.
310 cvij2(:iim, 1) = 0.5 * rad * yprimu1(1)
311 cvij3(:iim, 1) = cvij2(:iim, 1)
312 cvij4(:iim, 1) = 0.
313
314 do j = 2, jjm
315 coslatm = cos(rlatu1(j))
316 coslatp = cos(rlatu2(j-1))
317 radclatp = 0.5 * rad * coslatp
318 radclatm = 0.5 * rad * coslatm
319 ai14 = un4rad2 * coslatp * yprimu2(j-1)
320 ai23 = un4rad2 * coslatm * yprimu1(j)
321
322 aireij1_2d(:iim, j) = ai14 * xprimp025(:iim)
323 aireij2_2d(:iim, j) = ai23 * xprimp025(:iim)
324 aireij3_2d(:iim, j) = ai23 * xprimm025(:iim)
325 aireij4_2d(:iim, j) = ai14 * xprimm025(:iim)
326 cuij1(:iim, j) = radclatp * xprimp025(:iim)
327 cuij2(:iim, j) = radclatm * xprimp025(:iim)
328 cuij3(:iim, j) = radclatm * xprimm025(:iim)
329 cuij4(:iim, j) = radclatp * xprimm025(:iim)
330 cvij1(:iim, j) = 0.5 * rad * yprimu2(j-1)
331 cvij2(:iim, j) = 0.5 * rad * yprimu1(j)
332 cvij3(:iim, j) = cvij2(:iim, j)
333 cvij4(:iim, j) = cvij1(:iim, j)
334 end do
335
336 coslatp = cos(rlatu2(jjm))
337 radclatp = 0.5 * rad * coslatp
338
339 aireij1_2d(:iim, jjp1) = un4rad2 * coslatp * xprimp025(:iim) * yprimu2(jjm)
340 aireij2_2d(:iim, jjp1) = 0.
341 aireij3_2d(:iim, jjp1) = 0.
342 aireij4_2d(:iim, jjp1) = un4rad2 * coslatp * xprimm025(:iim) * yprimu2(jjm)
343
344 cuij1(:iim, jjp1) = radclatp * xprimp025(:iim)
345 cuij2(:iim, jjp1) = 0.
346 cuij3(:iim, jjp1) = 0.
347 cuij4(:iim, jjp1) = radclatp * xprimm025(:iim)
348
349 cvij1(:iim, jjp1) = 0.5 * rad * yprimu2(jjm)
350 cvij2(:iim, jjp1) = 0.
351 cvij3(:iim, jjp1) = 0.
352 cvij4(:iim, jjp1) = cvij1(:iim, jjp1)
353
354 ! Périodicité :
355
356 cvij1(iip1, :) = cvij1(1, :)
357 cvij2(iip1, :) = cvij2(1, :)
358 cvij3(iip1, :) = cvij3(1, :)
359 cvij4(iip1, :) = cvij4(1, :)
360
361 cuij1(iip1, :) = cuij1(1, :)
362 cuij2(iip1, :) = cuij2(1, :)
363 cuij3(iip1, :) = cuij3(1, :)
364 cuij4(iip1, :) = cuij4(1, :)
365
366 aireij1_2d(iip1, :) = aireij1_2d(1, :)
367 aireij2_2d(iip1, :) = aireij2_2d(1, :)
368 aireij3_2d(iip1, :) = aireij3_2d(1, :)
369 aireij4_2d(iip1, :) = aireij4_2d(1, :)
370
371 DO j = 1, jjp1
372 DO i = 1, iim
373 aire_2d(i, j) = aireij1_2d(i, j) + aireij2_2d(i, j) &
374 + aireij3_2d(i, j) + aireij4_2d(i, j)
375 alpha1_2d(i, j) = aireij1_2d(i, j) / aire_2d(i, j)
376 alpha2_2d(i, j) = aireij2_2d(i, j) / aire_2d(i, j)
377 alpha3_2d(i, j) = aireij3_2d(i, j) / aire_2d(i, j)
378 alpha4_2d(i, j) = aireij4_2d(i, j) / aire_2d(i, j)
379 alpha1p2_2d(i, j) = alpha1_2d(i, j) + alpha2_2d(i, j)
380 alpha1p4_2d(i, j) = alpha1_2d(i, j) + alpha4_2d(i, j)
381 alpha2p3_2d(i, j) = alpha2_2d(i, j) + alpha3_2d(i, j)
382 alpha3p4_2d(i, j) = alpha3_2d(i, j) + alpha4_2d(i, j)
383 END DO
384
385 aire_2d(iip1, j) = aire_2d(1, j)
386 alpha1_2d(iip1, j) = alpha1_2d(1, j)
387 alpha2_2d(iip1, j) = alpha2_2d(1, j)
388 alpha3_2d(iip1, j) = alpha3_2d(1, j)
389 alpha4_2d(iip1, j) = alpha4_2d(1, j)
390 alpha1p2_2d(iip1, j) = alpha1p2_2d(1, j)
391 alpha1p4_2d(iip1, j) = alpha1p4_2d(1, j)
392 alpha2p3_2d(iip1, j) = alpha2p3_2d(1, j)
393 alpha3p4_2d(iip1, j) = alpha3p4_2d(1, j)
394 END DO
395
396 DO j = 1, jjp1
397 DO i = 1, iim
398 aireu_2d(i, j) = aireij1_2d(i, j) + aireij2_2d(i, j) + &
399 aireij4_2d(i + 1, j) + aireij3_2d(i + 1, j)
400 unsaire_2d(i, j) = 1. / aire_2d(i, j)
401 unsair_gam1_2d(i, j) = unsaire_2d(i, j)**(-gamdi_gdiv)
402 unsair_gam2_2d(i, j) = unsaire_2d(i, j)**(-gamdi_h)
403 airesurg_2d(i, j) = aire_2d(i, j) / g
404 END DO
405 aireu_2d(iip1, j) = aireu_2d(1, j)
406 unsaire_2d(iip1, j) = unsaire_2d(1, j)
407 unsair_gam1_2d(iip1, j) = unsair_gam1_2d(1, j)
408 unsair_gam2_2d(iip1, j) = unsair_gam2_2d(1, j)
409 airesurg_2d(iip1, j) = airesurg_2d(1, j)
410 END DO
411
412 DO j = 1, jjm
413 DO i = 1, iim
414 airev_2d(i, j) = aireij2_2d(i, j) + aireij3_2d(i, j) + &
415 aireij1_2d(i, j + 1) + aireij4_2d(i, j + 1)
416 END DO
417 DO i = 1, iim
418 airez = aireij2_2d(i, j) + aireij1_2d(i, j + 1) &
419 + aireij3_2d(i + 1, j) + aireij4_2d(i + 1, j + 1)
420 unsairez_2d(i, j) = 1. / airez
421 unsairz_gam_2d(i, j) = unsairez_2d(i, j)**(-gamdi_grot)
422 fext_2d(i, j) = airez * sin(rlatv(j)) * 2. * omeg
423 END DO
424 airev_2d(iip1, j) = airev_2d(1, j)
425 unsairez_2d(iip1, j) = unsairez_2d(1, j)
426 fext_2d(iip1, j) = fext_2d(1, j)
427 unsairz_gam_2d(iip1, j) = unsairz_gam_2d(1, j)
428 END DO
429
430 ! Calcul des élongations cu_2d, cv_2d, cvu
431
432 DO j = 1, jjm
433 DO i = 1, iim
434 cv_2d(i, j) = 0.5 * &
435 (cvij2(i, j) + cvij3(i, j) + cvij1(i, j + 1) + cvij4(i, j + 1))
436 cvu(i, j) = 0.5 * (cvij1(i, j) + cvij4(i, j) + cvij2(i, j) &
437 + cvij3(i, j))
438 cuv(i, j) = 0.5 * (cuij2(i, j) + cuij3(i, j) + cuij1(i, j + 1) &
439 + cuij4(i, j + 1))
440 unscv2_2d(i, j) = 1. / cv_2d(i, j)**2
441 END DO
442 DO i = 1, iim
443 cuvsurcv_2d(i, j) = airev_2d(i, j) * unscv2_2d(i, j)
444 cvsurcuv_2d(i, j) = 1. / cuvsurcv_2d(i, j)
445 cuvscvgam1_2d(i, j) = cuvsurcv_2d(i, j)**(-gamdi_gdiv)
446 cuvscvgam2_2d(i, j) = cuvsurcv_2d(i, j)**(-gamdi_h)
447 cvscuvgam_2d(i, j) = cvsurcuv_2d(i, j)**(-gamdi_grot)
448 END DO
449 cv_2d(iip1, j) = cv_2d(1, j)
450 cvu(iip1, j) = cvu(1, j)
451 unscv2_2d(iip1, j) = unscv2_2d(1, j)
452 cuv(iip1, j) = cuv(1, j)
453 cuvsurcv_2d(iip1, j) = cuvsurcv_2d(1, j)
454 cvsurcuv_2d(iip1, j) = cvsurcuv_2d(1, j)
455 cuvscvgam1_2d(iip1, j) = cuvscvgam1_2d(1, j)
456 cuvscvgam2_2d(iip1, j) = cuvscvgam2_2d(1, j)
457 cvscuvgam_2d(iip1, j) = cvscuvgam_2d(1, j)
458 END DO
459
460 DO j = 2, jjm
461 DO i = 1, iim
462 cu_2d(i, j) = 0.5 * (cuij1(i, j) + cuij4(i + 1, j) + cuij2(i, j) &
463 + cuij3(i + 1, j))
464 unscu2_2d(i, j) = 1. / cu_2d(i, j)**2
465 cvusurcu_2d(i, j) = aireu_2d(i, j) * unscu2_2d(i, j)
466 cusurcvu_2d(i, j) = 1. / cvusurcu_2d(i, j)
467 cvuscugam1_2d(i, j) = cvusurcu_2d(i, j)**(-gamdi_gdiv)
468 cvuscugam2_2d(i, j) = cvusurcu_2d(i, j)**(-gamdi_h)
469 cuscvugam_2d(i, j) = cusurcvu_2d(i, j)**(-gamdi_grot)
470 END DO
471 cu_2d(iip1, j) = cu_2d(1, j)
472 unscu2_2d(iip1, j) = unscu2_2d(1, j)
473 cvusurcu_2d(iip1, j) = cvusurcu_2d(1, j)
474 cusurcvu_2d(iip1, j) = cusurcvu_2d(1, j)
475 cvuscugam1_2d(iip1, j) = cvuscugam1_2d(1, j)
476 cvuscugam2_2d(iip1, j) = cvuscugam2_2d(1, j)
477 cuscvugam_2d(iip1, j) = cuscvugam_2d(1, j)
478 END DO
479
480 ! Calcul aux pôles
481
482 cu_2d(:, 1) = 0.
483 unscu2_2d(:, 1) = 0.
484 cvu(:, 1) = 0.
485
486 cu_2d(:, jjp1) = 0.
487 unscu2_2d(:, jjp1) = 0.
488 cvu(:, jjp1) = 0.
489
490 DO j = 1, jjm
491 DO i = 1, iim
492 airvscu2_2d(i, j) = airev_2d(i, j) / (cuv(i, j) * cuv(i, j))
493 aivscu2gam_2d(i, j) = airvscu2_2d(i, j)**(-gamdi_grot)
494 END DO
495 airvscu2_2d(iip1, j) = airvscu2_2d(1, j)
496 aivscu2gam_2d(iip1, j) = aivscu2gam_2d(1, j)
497 END DO
498
499 DO j = 2, jjm
500 DO i = 1, iim
501 airuscv2_2d(i, j) = aireu_2d(i, j) / (cvu(i, j) * cvu(i, j))
502 aiuscv2gam_2d(i, j) = airuscv2_2d(i, j)**(-gamdi_grot)
503 END DO
504 airuscv2_2d(iip1, j) = airuscv2_2d(1, j)
505 aiuscv2gam_2d(iip1, j) = aiuscv2gam_2d(1, j)
506 END DO
507
508 ! Calcul des aires aux pôles :
509
510 apoln = sum(aire_2d(:iim, 1))
511 apols = sum(aire_2d(:iim, jjp1))
512 unsapolnga1 = 1. / (apoln**(-gamdi_gdiv))
513 unsapolsga1 = 1. / (apols**(-gamdi_gdiv))
514 unsapolnga2 = 1. / (apoln**(-gamdi_h))
515 unsapolsga2 = 1. / (apols**(-gamdi_h))
516
517 ! Changement F. Hourdin calcul conservatif pour fext_2d
518 ! constang_2d contient le produit a * cos (latitude) * omega
519
520 DO i = 1, iim
521 constang_2d(i, 1) = 0.
522 END DO
523 DO j = 1, jjm - 1
524 DO i = 1, iim
525 constang_2d(i, j + 1) = rad * omeg * cu_2d(i, j + 1) &
526 * cos(rlatu(j + 1))
527 END DO
528 END DO
529 DO i = 1, iim
530 constang_2d(i, jjp1) = 0.
531 END DO
532
533 ! Périodicité en longitude
534 DO j = 1, jjp1
535 constang_2d(iip1, j) = constang_2d(1, j)
536 END DO
537
538 call new_unit(unit)
539 open(unit, file="longitude_latitude.txt", status="replace", action="write")
540 write(unit, fmt=*) '"longitudes at V points (degrees)"', rlonv * 180. / pi
541 write(unit, fmt=*) '"latitudes at V points (degrees)"', rlatv * 180. / pi
542 write(unit, fmt=*) '"longitudes at U points (degrees)"', rlonu * 180. / pi
543 write(unit, fmt=*) '"latitudes at U points (degrees)"', rlatu * 180. / pi
544 close(unit)
545
546 END SUBROUTINE inigeom
547
548 end module comgeom

  ViewVC Help
Powered by ViewVC 1.1.21