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

Diff of /trunk/dyn3d/comgeom.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/dyn3d/comgeom.f90 revision 46 by guez, Mon May 16 14:52:30 2011 UTC trunk/dyn3d/comgeom.f90 revision 79 by guez, Fri Feb 28 17:52:47 2014 UTC
# Line 1  Line 1 
1  module comgeom  module comgeom
2    
3    use dimens_m, only: iim, jjm    use dimens_m, only: iim, jjm
   use paramet_m, only: ip1jmp1, ip1jm  
4    
5    implicit none    implicit none
6    
7    private iim, jjm, ip1jmp1, ip1jm    private iim, jjm
8    
9    real cu_2d(iim + 1, jjm + 1), cv_2d(iim + 1, jjm)    real cu_2d(iim + 1, jjm + 1), cv_2d(iim + 1, jjm) ! in m
10    real cu(ip1jmp1), cv(ip1jm)    real cu((iim + 1) * (jjm + 1)), cv((iim + 1) * jjm) ! in m
11    equivalence (cu, cu_2d), (cv, cv_2d)    equivalence (cu, cu_2d), (cv, cv_2d)
12    
13    real unscu2_2d(iim + 1, jjm + 1)    real unscu2_2d(iim + 1, jjm + 1) ! in m-2
14    real unscu2(ip1jmp1)    real unscu2((iim + 1) * (jjm + 1)) ! in m-2
15    equivalence (unscu2, unscu2_2d)    equivalence (unscu2, unscu2_2d)
16    
17    real unscv2_2d(iim + 1, jjm)    real unscv2_2d(iim + 1, jjm) ! in m-2
18    real unscv2(ip1jm)    real unscv2((iim + 1) * jjm) ! in m-2
19    equivalence (unscv2, unscv2_2d)    equivalence (unscv2, unscv2_2d)
20    
21    real aire_2d(iim + 1, jjm + 1), airesurg_2d(iim + 1, jjm + 1)    real aire((iim + 1) * (jjm + 1)), aire_2d(iim + 1, jjm + 1) ! in m2
22    real aire(ip1jmp1), airesurg(ip1jmp1)    real airesurg_2d(iim + 1, jjm + 1), airesurg((iim + 1) * (jjm + 1))
23    equivalence (aire, aire_2d), (airesurg, airesurg_2d)    equivalence (aire, aire_2d), (airesurg, airesurg_2d)
24    
25    real aireu_2d(iim + 1, jjm + 1)              real aireu_2d(iim + 1, jjm + 1) ! in m2
26    real aireu(ip1jmp1)    real aireu((iim + 1) * (jjm + 1)) ! in m2
27    equivalence (aireu, aireu_2d)    equivalence (aireu, aireu_2d)
28    
29    real airev_2d(iim + 1, jjm), unsaire_2d(iim + 1, jjm + 1)    real airev((iim + 1) * jjm), airev_2d(iim + 1, jjm) ! in m2
30    real airev(ip1jm), unsaire(ip1jmp1)    real unsaire((iim + 1) * (jjm + 1)), unsaire_2d(iim + 1, jjm + 1) ! in m-2
31    equivalence (airev, airev_2d), (unsaire, unsaire_2d)    equivalence (airev, airev_2d), (unsaire, unsaire_2d)
32    
33    real apoln, apols    real apoln, apols ! in m2
34    
35    real unsairez_2d(iim + 1, jjm)    real unsairez_2d(iim + 1, jjm)
36    real unsairez(ip1jm)    real unsairez((iim + 1) * jjm)
37    equivalence (unsairez, unsairez_2d)    equivalence (unsairez, unsairez_2d)
38    
39    real alpha1_2d(iim + 1, jjm + 1)    real alpha1_2d(iim + 1, jjm + 1)
40    real alpha1(ip1jmp1)    real alpha1((iim + 1) * (jjm + 1))
41    equivalence (alpha1, alpha1_2d)    equivalence (alpha1, alpha1_2d)
42    
43    real alpha2_2d(iim + 1, jjm + 1)            real alpha2_2d(iim + 1, jjm + 1)        
44    real alpha2(ip1jmp1)    real alpha2((iim + 1) * (jjm + 1))
45    equivalence (alpha2, alpha2_2d)    equivalence (alpha2, alpha2_2d)
46    
47    real alpha3_2d(iim + 1, jjm + 1), alpha4_2d(iim + 1, jjm + 1)    real alpha3_2d(iim + 1, jjm + 1), alpha4_2d(iim + 1, jjm + 1)
48    real alpha3(ip1jmp1), alpha4(ip1jmp1)    real alpha3((iim + 1) * (jjm + 1)), alpha4((iim + 1) * (jjm + 1))
49    equivalence (alpha3, alpha3_2d), (alpha4, alpha4_2d)    equivalence (alpha3, alpha3_2d), (alpha4, alpha4_2d)
50    
51    real alpha1p2_2d(iim + 1, jjm + 1)            real alpha1p2_2d(iim + 1, jjm + 1)        
52    real alpha1p2(ip1jmp1)    real alpha1p2((iim + 1) * (jjm + 1))
53    equivalence (alpha1p2, alpha1p2_2d)    equivalence (alpha1p2, alpha1p2_2d)
54    
55    real alpha1p4_2d(iim + 1, jjm + 1), alpha2p3_2d(iim + 1, jjm + 1)    real alpha1p4_2d(iim + 1, jjm + 1), alpha2p3_2d(iim + 1, jjm + 1)
56    real alpha1p4(ip1jmp1), alpha2p3(ip1jmp1)    real alpha1p4((iim + 1) * (jjm + 1)), alpha2p3((iim + 1) * (jjm + 1))
57    equivalence (alpha1p4, alpha1p4_2d), (alpha2p3, alpha2p3_2d)    equivalence (alpha1p4, alpha1p4_2d), (alpha2p3, alpha2p3_2d)
58    
59    real alpha3p4(ip1jmp1)    real alpha3p4((iim + 1) * (jjm + 1))
60    real alpha3p4_2d(iim + 1, jjm + 1)        real alpha3p4_2d(iim + 1, jjm + 1)    
61    equivalence (alpha3p4, alpha3p4_2d)    equivalence (alpha3p4, alpha3p4_2d)
62    
63    real fext_2d(iim + 1, jjm), constang_2d(iim + 1, jjm + 1)    real fext_2d(iim + 1, jjm), constang_2d(iim + 1, jjm + 1)
64    real fext(ip1jm), constang(ip1jmp1)    real fext((iim + 1) * jjm), constang((iim + 1) * (jjm + 1))
65    equivalence (fext, fext_2d), (constang, constang_2d)    equivalence (fext, fext_2d), (constang, constang_2d)
66    
67    real rlatu(jjm + 1)    real rlatu(jjm + 1)
# Line 76  module comgeom Line 75  module comgeom
75    real rlonv(iim + 1)    real rlonv(iim + 1)
76    ! (longitudes of points of the "scalar" and "v" grid, in rad)    ! (longitudes of points of the "scalar" and "v" grid, in rad)
77    
78    real cuvsurcv_2d(iim + 1, jjm), cvsurcuv_2d(iim + 1, jjm)      real cuvsurcv_2d(iim + 1, jjm), cvsurcuv_2d(iim + 1, jjm) ! no dimension
79    real cuvsurcv(ip1jm), cvsurcuv(ip1jm)    real cuvsurcv((iim + 1) * jjm), cvsurcuv((iim + 1) * jjm) ! no dimension
80    equivalence (cuvsurcv, cuvsurcv_2d), (cvsurcuv, cvsurcuv_2d)    equivalence (cuvsurcv, cuvsurcv_2d), (cvsurcuv, cvsurcuv_2d)
81    
82    real cvusurcu_2d(iim + 1, jjm + 1), cusurcvu_2d(iim + 1, jjm + 1)    real cvusurcu_2d(iim + 1, jjm + 1), cusurcvu_2d(iim + 1, jjm + 1)
83    real cvusurcu(ip1jmp1), cusurcvu(ip1jmp1)    ! 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)    equivalence (cvusurcu, cvusurcu_2d), (cusurcvu, cusurcvu_2d)
87    
88    real cuvscvgam1_2d(iim + 1, jjm)    real cuvscvgam1_2d(iim + 1, jjm)
89    real cuvscvgam1(ip1jm)    real cuvscvgam1((iim + 1) * jjm)
90    equivalence (cuvscvgam1, cuvscvgam1_2d)    equivalence (cuvscvgam1, cuvscvgam1_2d)
91    
92    real cuvscvgam2_2d(iim + 1, jjm), cvuscugam1_2d(iim + 1, jjm + 1)    real cuvscvgam2_2d(iim + 1, jjm), cvuscugam1_2d(iim + 1, jjm + 1)
93    real cuvscvgam2(ip1jm), cvuscugam1(ip1jmp1)    real cuvscvgam2((iim + 1) * jjm), cvuscugam1((iim + 1) * (jjm + 1))
94    equivalence (cuvscvgam2, cuvscvgam2_2d), (cvuscugam1, cvuscugam1_2d)    equivalence (cuvscvgam2, cuvscvgam2_2d), (cvuscugam1, cvuscugam1_2d)
95    
96    real cvuscugam2_2d(iim + 1, jjm + 1), cvscuvgam_2d(iim + 1, jjm)    real cvuscugam2_2d(iim + 1, jjm + 1), cvscuvgam_2d(iim + 1, jjm)
97    real cvuscugam2(ip1jmp1), cvscuvgam(ip1jm)    real cvuscugam2((iim + 1) * (jjm + 1)), cvscuvgam((iim + 1) * jjm)
98    equivalence (cvuscugam2, cvuscugam2_2d), (cvscuvgam, cvscuvgam_2d)    equivalence (cvuscugam2, cvuscugam2_2d), (cvscuvgam, cvscuvgam_2d)
99    
100    real cuscvugam(ip1jmp1)    real cuscvugam((iim + 1) * (jjm + 1))
101    real cuscvugam_2d(iim + 1, jjm + 1)    real cuscvugam_2d(iim + 1, jjm + 1)
102    equivalence (cuscvugam, cuscvugam_2d)    equivalence (cuscvugam, cuscvugam_2d)
103    
104    real unsapolnga1, unsapolnga2, unsapolsga1, unsapolsga2                    real unsapolnga1, unsapolnga2, unsapolsga1, unsapolsga2                
105    
106    real unsair_gam1_2d(iim + 1, jjm + 1), unsair_gam2_2d(iim + 1, jjm + 1)    real unsair_gam1_2d(iim + 1, jjm + 1), unsair_gam2_2d(iim + 1, jjm + 1)
107    real unsair_gam1(ip1jmp1), unsair_gam2(ip1jmp1)    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)    equivalence (unsair_gam1, unsair_gam1_2d), (unsair_gam2, unsair_gam2_2d)
109    
110    real unsairz_gam_2d(iim + 1, jjm)    real unsairz_gam_2d(iim + 1, jjm)
111    real unsairz_gam(ip1jm)    real unsairz_gam((iim + 1) * jjm)
112    equivalence (unsairz_gam, unsairz_gam_2d)    equivalence (unsairz_gam, unsairz_gam_2d)
113    
114    real xprimu(iim + 1), xprimv(iim + 1)    real xprimu(iim + 1), xprimv(iim + 1)
115    
116    save    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  end module comgeom

Legend:
Removed from v.46  
changed lines
  Added in v.79

  ViewVC Help
Powered by ViewVC 1.1.21