/[lmdze]/trunk/libf/dyn3d/inigeom.f90
ViewVC logotype

Diff of /trunk/libf/dyn3d/inigeom.f90

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

trunk/libf/dyn3d/inigeom.f revision 3 by guez, Wed Feb 27 13:16:39 2008 UTC trunk/libf/dyn3d/inigeom.f90 revision 61 by guez, Fri Apr 20 14:58:43 2012 UTC
# Line 1  Line 1 
1        SUBROUTINE inigeom  module inigeom_m
 c  
 c     Auteur :  P. Le Van  
 c  
 c   ............      Version  du 01/04/2001     ...................  
 c  
 c  Calcul des elongations cuij1,.cuij4 , cvij1,..cvij4  aux memes en-  
 c     endroits que les aires aireij1_2d,..aireij4_2d .  
   
 c  Choix entre f(y) a derivee sinusoid. ou a derivee tangente hyperbol.  
 C Possibilité d'appeler une fonction "f(y)" à  
 C dérivée tangente hyperbolique à la place de la fonction à dérivée  
 C sinusoïdale.  
 c  
 c  
       use dimens_m  
       use paramet_m  
       use comconst  
       use comdissnew  
       use logic  
       use comgeom  
       use serre  
       IMPLICIT NONE  
 c  
   
 c------------------------------------------------------------------  
 c   ....  Variables  locales   ....  
 c  
       INTEGER  i,j,itmax,itmay,iter  
       REAL cvu(iip1,jjp1),cuv(iip1,jjm)  
       REAL ai14,ai23,airez,rlatp,rlatm,xprm,xprp,un4rad2,yprp,yprm  
       REAL eps,x1,xo1,f,df,xdm,y1,yo1,ydm  
       REAL coslatm,coslatp,radclatm,radclatp  
       REAL cuij1(iip1,jjp1),cuij2(iip1,jjp1),cuij3(iip1,jjp1),  
      *     cuij4(iip1,jjp1)  
       REAL cvij1(iip1,jjp1),cvij2(iip1,jjp1),cvij3(iip1,jjp1),  
      *     cvij4(iip1,jjp1)  
       REAL rlonvv(iip1),rlatuu(jjp1)  
       REAL rlatu1(jjm),yprimu1(jjm),rlatu2(jjm),yprimu2(jjm) ,  
      *     yprimv(jjm),yprimu(jjp1)  
       REAL gamdi_gdiv, gamdi_grot, gamdi_h  
   
       REAL rlonm025(iip1),xprimm025(iip1), rlonp025(iip1),  
      ,  xprimp025(iip1)  
       SAVE rlatu1,yprimu1,rlatu2,yprimu2,yprimv,yprimu  
       SAVE rlonm025,xprimm025,rlonp025,xprimp025  
   
       REAL      SSUM  
 c  
 c  
 c   ------------------------------------------------------------------  
 c   -                                                                -  
 c   calcul des coeff. ( cu_2d, cv_2d , 1./cu_2d**2,  1./cv_2d**2  )  
 c   -                                                                -  
 c   ------------------------------------------------------------------  
 c  
 c les coef. ( cu_2d, cv_2d ) permettent de passer des vitesses naturelles  
 c      aux vitesses covariantes et contravariantes , ou vice-versa ...  
 c  
 c  
 c on a :  u (covariant) = cu_2d * u (naturel)   , u(contrav)= u(nat)/cu_2d  
 c         v (covariant) = cv_2d * v (naturel)   , v(contrav)= v(nat)/cv_2d  
 c  
 c       on en tire :  u(covariant) = cu_2d * cu_2d * u(contravariant)  
 c                     v(covariant) = cv_2d * cv_2d * v(contravariant)  
 c  
 c  
 c     on a l'application (  x(X) , y(Y) )   avec - im/2 +1 <  X  < im/2  
 c                                                          =     =  
 c                                           et   - jm/2    <  Y  < jm/2  
 c                                                          =     =  
 c  
 c      ...................................................  
 c      ...................................................  
 c      .  x  est la longitude du point  en radians       .  
 c      .  y  est la  latitude du point  en radians       .  
 c      .                                                 .  
 c      .  on a :  cu_2d(i,j) = rad * COS(y) * dx/dX         .  
 c      .          cv( j ) = rad          * dy/dY         .  
 c      .        aire_2d(i,j) =  cu_2d(i,j) * cv(j)             .  
 c      .                                                 .  
 c      . y, dx/dX, dy/dY calcules aux points concernes   .  
 c      .                                                 .  
 c      ...................................................  
 c      ...................................................  
 c  
 c  
 c  
 c                                                           ,  
 c    cv , bien que dependant de j uniquement,sera ici indice aussi en i  
 c          pour un adressage plus facile en  ij  .  
 c  
 c  
 c  
 c  **************  aux points  u  et  v ,           *****************  
 c      xprimu et xprimv sont respectivement les valeurs de  dx/dX  
 c      yprimu et yprimv    .  .  .  .  .  .  .  .  .  .  .  dy/dY  
 c      rlatu  et  rlatv    .  .  .  .  .  .  .  .  .  .  .la latitude  
 c      cvu    et   cv_2d      .  .  .  .  .  .  .  .  .  .  .    cv_2d  
 c  
 c  **************  aux points u, v, scalaires, et z  ****************  
 c      cu_2d, cuv, cuscal, cuz sont respectiv. les valeurs de    cu_2d  
 c  
 c  
 c  
 c         Exemple de distribution de variables sur la grille dans le  
 c             domaine de travail ( X,Y ) .  
 c     ................................................................  
 c                  DX=DY= 1  
 c  
 c    
 c        +     represente  un  point scalaire ( p.exp  la pression )  
 c        >     represente  la composante zonale du  vent  
 c        V     represente  la composante meridienne du vent  
 c        o     represente  la  vorticite  
 c  
 c     ----  , car aux poles , les comp.zonales covariantes sont nulles  
 c  
 c  
 c  
 c         i ->  
 c  
 c         1      2      3      4      5      6      7      8  
 c  j  
 c  v  1   + ---- + ---- + ---- + ---- + ---- + ---- + ---- + --  
 c  
 c         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
 c  
 c     2   +   >  +   >  +   >  +   >  +   >  +   >  +   >  +  >  
 c  
 c         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
 c  
 c     3   +   >  +   >  +   >  +   >  +   >  +   >  +   >  +  >  
 c  
 c         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
 c  
 c     4   +   >  +   >  +   >  +   >  +   >  +   >  +   >  +  >  
 c  
 c         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
 c  
 c     5   + ---- + ---- + ---- + ---- + ---- + ---- + ---- + --  
 c  
 c  
 c      Ci-dessus,  on voit que le nombre de pts.en longitude est egal  
 c                 a   IM = 8  
 c      De meme ,   le nombre d'intervalles entre les 2 poles est egal  
 c                 a   JM = 4  
 c  
 c      Les points scalaires ( + ) correspondent donc a des valeurs  
 c       entieres  de  i ( 1 a IM )   et  de  j ( 1 a  JM +1 )   .  
 c  
 c      Les vents    U       ( > ) correspondent a des valeurs  semi-  
 c       entieres  de i ( 1+ 0.5 a IM+ 0.5) et entieres de j ( 1 a JM+1)  
 c  
 c      Les vents    V       ( V ) correspondent a des valeurs entieres  
 c     de     i ( 1 a  IM ) et semi-entieres de  j ( 1 +0.5  a JM +0.5)  
 c  
 c  
 c  
       print *, "Call sequence information: inigeom"  
       print 3  
  3    FORMAT('Calcul des elongations cu_2d et cv_2d  comme sommes ',  
      $     'des 4 '  
      *  / 5x,  
      $   ' elong. cuij1, .. 4  , cvij1,.. 4  qui les entourent , aux '  
      * / 5x,' memes endroits que les aires aireij1_2d,...j4   . ' / )  
 c  
 c  
       IF( nitergdiv.NE.2 ) THEN  
         gamdi_gdiv = coefdis/ ( float(nitergdiv) -2. )  
       ELSE  
         gamdi_gdiv = 0.  
       ENDIF  
       IF( nitergrot.NE.2 ) THEN  
         gamdi_grot = coefdis/ ( float(nitergrot) -2. )  
       ELSE  
         gamdi_grot = 0.  
       ENDIF  
       IF( niterh.NE.2 ) THEN  
         gamdi_h = coefdis/ ( float(niterh) -2. )  
       ELSE  
         gamdi_h = 0.  
       ENDIF  
   
       WRITE(6,*) ' gamdi_gd ',gamdi_gdiv,gamdi_grot,gamdi_h,coefdis,  
      *  nitergdiv,nitergrot,niterh  
 c  
       pi    = 2.* ASIN(1.)  
 c  
       WRITE(6,990)  
   
 c     ----------------------------------------------------------------  
 c  
       IF( .NOT.fxyhypb )   THEN  
 c  
 c  
        IF( ysinus )  THEN  
 c  
         WRITE(6,*) ' ***  Inigeom ,  Y = Sinus ( Latitude ) *** '  
 c  
 c   .... utilisation de f(x,y )  avec  y  =  sinus de la latitude  ...  
   
         CALL  fxysinus (rlatu,yprimu,rlatv,yprimv,rlatu1,yprimu1,  
      ,                    rlatu2,yprimu2,  
      ,  rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025  
      $       ,xprimp025)  
2    
3      IMPLICIT NONE
4    
5    contains
6    
7      SUBROUTINE inigeom
8    
9        ! Auteur : P. Le Van
10    
11        ! Calcul des élongations cuij1, ..., cuij4, cvij1, ..., cvij4 aux mêmes
12        ! endroits que les aires aireij1_2d, ..., aireij4_2d.
13    
14        ! Choix entre une fonction "f(y)" à dérivée sinusoïdale ou à
15        ! dérivée tangente hyperbolique. Calcul des coefficients cu_2d,
16        ! cv_2d, 1. / cu_2d**2, 1. / cv_2d**2. Les coefficients cu_2d et cv_2d
17        ! permettent de passer des vitesses naturelles aux vitesses
18        ! covariantes et contravariantes, ou vice-versa.
19    
20        ! On a :
21        ! u(covariant) = cu_2d * u(naturel), u(contravariant) = u(naturel) / cu_2d
22        ! v(covariant) = cv_2d * v(naturel), v(contravariant) = v(naturel) / cv_2d
23    
24        ! On en tire :
25        ! u(covariant) = cu_2d * cu_2d * u(contravariant)
26        ! v(covariant) = cv_2d * cv_2d * v(contravariant)
27    
28        ! On a l'application (x(X), y(Y)) avec - im / 2 + 1 <= X <= im / 2
29        ! et - jm / 2 <= Y <= jm / 2
30    
31        ! x est la longitude du point en radians.
32        ! y est la latitude du point en radians.
33        !
34        ! On a : cu_2d(i, j) = rad * cos(y) * dx / dX
35        ! cv(j) = rad * dy / dY
36        ! aire_2d(i, j) = cu_2d(i, j) * cv(j)
37        !
38        ! y, dx / dX, dy / dY calculés aux points concernés. cv, bien que
39        ! dépendant de j uniquement, sera ici indicé aussi en i pour un
40        ! adressage plus facile en ij.
41    
42        ! xprimu et xprimv sont respectivement les valeurs de dx / dX aux
43        ! points u et v. yprimu et yprimv sont respectivement les valeurs
44        ! de dy / dY aux points u et v. rlatu et rlatv sont respectivement
45        ! les valeurs de la latitude aux points u et v. cvu et cv_2d sont
46        ! respectivement les valeurs de cv_2d aux points u et v.
47    
48        ! cu_2d, cuv, cuscal, cuz sont respectivement les valeurs de cu_2d
49        ! aux points u, v, scalaires, et z. Cf. "inigeom.txt".
50    
51        USE comconst, ONLY : g, omeg, rad
52        USE comgeom, ONLY : airesurg_2d, aireu_2d, airev_2d, aire_2d, &
53             alpha1p2_2d, alpha1p4_2d, alpha1_2d, &
54             alpha2p3_2d, alpha2_2d, alpha3p4_2d, alpha3_2d, alpha4_2d, apoln, &
55             apols, constang_2d, cuscvugam_2d, cusurcvu_2d, cuvscvgam1_2d, &
56             cuvscvgam2_2d, cuvsurcv_2d, cu_2d, cvscuvgam_2d, cvsurcuv_2d, &
57             cvuscugam1_2d, cvuscugam2_2d, cvusurcu_2d, cv_2d, fext_2d, rlatu, &
58             rlatv, rlonu, rlonv, unsairez_2d, unsaire_2d, unsairz_gam_2d, &
59             unsair_gam1_2d, unsair_gam2_2d, unsapolnga1, unsapolnga2, &
60             unsapolsga1, unsapolsga2, unscu2_2d, unscv2_2d, xprimu, xprimv
61        USE comdissnew, ONLY : coefdis, nitergdiv, nitergrot, niterh
62        use conf_gcm_m, ONLY : fxyhypb, ysinus
63        USE dimens_m, ONLY : iim, jjm
64        use fxy_m, only: fxy
65        use jumble, only: new_unit
66        use nr_util, only: pi
67        USE paramet_m, ONLY : iip1, jjp1
68        USE serre, ONLY : alphax, alphay, clat, clon, dzoomx, dzoomy, grossismx, &
69             grossismy, pxo, pyo, taux, tauy, transx, transy
70    
71        ! Variables locales
72    
73        INTEGER i, j, itmax, itmay, iter, unit
74        REAL cvu(iip1, jjp1), cuv(iip1, jjm)
75        REAL ai14, ai23, airez, un4rad2
76        REAL eps, x1, xo1, f, df, xdm, y1, yo1, ydm
77        REAL coslatm, coslatp, radclatm, radclatp
78        REAL, dimension(iip1, jjp1):: cuij1, cuij2, cuij3, cuij4 ! in m
79        REAL, dimension(iip1, jjp1):: cvij1, cvij2, cvij3, cvij4 ! in m
80        REAL rlatu1(jjm), yprimu1(jjm), rlatu2(jjm), yprimu2(jjm)
81        real yprimv(jjm), yprimu(jjp1)
82        REAL gamdi_gdiv, gamdi_grot, gamdi_h
83        REAL rlonm025(iip1), xprimm025(iip1), rlonp025(iip1), xprimp025(iip1)
84        real, dimension(iim + 1, jjm + 1):: aireij1_2d, aireij2_2d, aireij3_2d, &
85             aireij4_2d ! in m2
86        real airuscv2_2d(iim + 1, jjm)
87        real airvscu2_2d(iim + 1, jjm), aiuscv2gam_2d(iim + 1, jjm)
88        real aivscu2gam_2d(iim + 1, jjm)
89    
90        !------------------------------------------------------------------
91    
92        PRINT *, 'Call sequence information: inigeom'
93    
94        IF (nitergdiv/=2) THEN
95           gamdi_gdiv = coefdis / (real(nitergdiv)-2.)
96        ELSE
97           gamdi_gdiv = 0.
98        END IF
99        IF (nitergrot/=2) THEN
100           gamdi_grot = coefdis / (real(nitergrot)-2.)
101        ELSE
102           gamdi_grot = 0.
103        END IF
104        IF (niterh/=2) THEN
105           gamdi_h = coefdis / (real(niterh)-2.)
106        ELSE
107           gamdi_h = 0.
108        END IF
109    
110        print *, 'gamdi_gdiv = ', gamdi_gdiv
111        print *, "gamdi_grot = ", gamdi_grot
112        print *, "gamdi_h = ", gamdi_h
113    
114        IF (.NOT. fxyhypb) THEN
115           IF (ysinus) THEN
116              print *, ' Inigeom, Y = Sinus (Latitude) '
117              ! utilisation de f(x, y) avec y = sinus de la latitude
118              CALL fxysinus(rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, &
119                   rlatu2, yprimu2, rlonu, xprimu, rlonv, xprimv, rlonm025, &
120                   xprimm025, rlonp025, xprimp025)
121         ELSE         ELSE
122  c            print *, 'Inigeom, Y = Latitude, der. sinusoid .'
123          WRITE(6,*) '*** Inigeom ,  Y = Latitude  , der. sinusoid . ***'            ! utilisation de f(x, y) a tangente sinusoidale, y etant la latit
124    
125              pxo = clon * pi / 180.
126              pyo = 2. * clat * pi / 180.
127    
128              ! determination de transx (pour le zoom) par Newton-Raphson
129    
130              itmax = 10
131              eps = .1E-7
132    
133              xo1 = 0.
134              DO iter = 1, itmax
135                 x1 = xo1
136                 f = x1 + alphax * sin(x1-pxo)
137                 df = 1. + alphax * cos(x1-pxo)
138                 x1 = x1 - f / df
139                 xdm = abs(x1-xo1)
140                 IF (xdm<=eps) EXIT
141                 xo1 = x1
142              END DO
143    
144              transx = xo1
145    
146              itmay = 10
147              eps = .1E-7
148    
149              yo1 = 0.
150              DO iter = 1, itmay
151                 y1 = yo1
152                 f = y1 + alphay * sin(y1-pyo)
153                 df = 1. + alphay * cos(y1-pyo)
154                 y1 = y1 - f / df
155                 ydm = abs(y1-yo1)
156                 IF (ydm<=eps) EXIT
157                 yo1 = y1
158              END DO
159    
160              transy = yo1
161    
162              CALL fxy(rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, rlatu2, &
163                   yprimu2, rlonu, xprimu, rlonv, xprimv, rlonm025, xprimm025, &
164                   rlonp025, xprimp025)
165           END IF
166        ELSE
167           ! Utilisation de fxyhyper, f(x, y) à dérivée tangente hyperbolique
168           print *, 'Inigeom, Y = Latitude, dérivée tangente hyperbolique'
169           CALL fxyhyper(clat, grossismy, dzoomy, tauy, clon, grossismx, dzoomx, &
170                taux, rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, rlatu2, &
171                yprimu2, rlonu, xprimu, rlonv, xprimv, rlonm025, xprimm025, &
172                rlonp025, xprimp025)
173        END IF
174    
175        rlatu(1) = pi / 2.
176        rlatu(jjp1) = -rlatu(1)
177    
178        ! Calcul aux pôles
179    
180        yprimu(1) = 0.
181        yprimu(jjp1) = 0.
182    
183        un4rad2 = 0.25 * rad * rad
184    
185        ! Cf. "inigeom.txt". Calcul des quatre aires élémentaires
186        ! aireij1_2d, aireij2_2d, aireij3_2d, aireij4_2d qui entourent
187        ! chaque aire_2d(i, j), ainsi que les quatre élongations
188        ! élémentaires cuij et les quatre élongations cvij qui sont
189        ! calculées aux mêmes endroits que les aireij.
190    
191        coslatm = cos(rlatu1(1))
192        radclatm = 0.5 * rad * coslatm
193    
194        aireij1_2d(:iim, 1) = 0.
195        aireij2_2d(:iim, 1) = un4rad2 * coslatm * xprimp025(:iim) * yprimu1(1)
196        aireij3_2d(:iim, 1) = un4rad2 * coslatm * xprimm025(:iim) * yprimu1(1)
197        aireij4_2d(:iim, 1) = 0.
198    
199        cuij1(:iim, 1) = 0.
200        cuij2(:iim, 1) = radclatm * xprimp025(:iim)
201        cuij3(:iim, 1) = radclatm * xprimm025(:iim)
202        cuij4(:iim, 1) = 0.
203    
204        cvij1(:iim, 1) = 0.
205        cvij2(:iim, 1) = 0.5 * rad * yprimu1(1)
206        cvij3(:iim, 1) = cvij2(:iim, 1)
207        cvij4(:iim, 1) = 0.
208    
209        do j = 2, jjm
210           coslatm = cos(rlatu1(j))
211           coslatp = cos(rlatu2(j-1))
212           radclatp = 0.5 * rad * coslatp
213           radclatm = 0.5 * rad * coslatm
214           ai14 = un4rad2 * coslatp * yprimu2(j-1)
215           ai23 = un4rad2 * coslatm * yprimu1(j)
216    
217           aireij1_2d(:iim, j) = ai14 * xprimp025(:iim)
218           aireij2_2d(:iim, j) = ai23 * xprimp025(:iim)
219           aireij3_2d(:iim, j) = ai23 * xprimm025(:iim)
220           aireij4_2d(:iim, j) = ai14 * xprimm025(:iim)
221           cuij1(:iim, j) = radclatp * xprimp025(:iim)
222           cuij2(:iim, j) = radclatm * xprimp025(:iim)
223           cuij3(:iim, j) = radclatm * xprimm025(:iim)
224           cuij4(:iim, j) = radclatp * xprimm025(:iim)
225           cvij1(:iim, j) = 0.5 * rad * yprimu2(j-1)
226           cvij2(:iim, j) = 0.5 * rad * yprimu1(j)
227           cvij3(:iim, j) = cvij2(:iim, j)
228           cvij4(:iim, j) = cvij1(:iim, j)
229        end do
230    
231        coslatp = cos(rlatu2(jjm))
232        radclatp = 0.5 * rad * coslatp
233    
234        aireij1_2d(:iim, jjp1) = un4rad2 * coslatp * xprimp025(:iim) * yprimu2(jjm)
235        aireij2_2d(:iim, jjp1) = 0.
236        aireij3_2d(:iim, jjp1) = 0.
237        aireij4_2d(:iim, jjp1) = un4rad2 * coslatp * xprimm025(:iim) * yprimu2(jjm)
238    
239        cuij1(:iim, jjp1) = radclatp * xprimp025(:iim)
240        cuij2(:iim, jjp1) = 0.
241        cuij3(:iim, jjp1) = 0.
242        cuij4(:iim, jjp1) = radclatp * xprimm025(:iim)
243    
244        cvij1(:iim, jjp1) = 0.5 * rad * yprimu2(jjm)
245        cvij2(:iim, jjp1) = 0.
246        cvij3(:iim, jjp1) = 0.
247        cvij4(:iim, jjp1) = cvij1(:iim, jjp1)
248    
249        ! Périodicité :
250    
251        cvij1(iip1, :) = cvij1(1, :)
252        cvij2(iip1, :) = cvij2(1, :)
253        cvij3(iip1, :) = cvij3(1, :)
254        cvij4(iip1, :) = cvij4(1, :)
255    
256        cuij1(iip1, :) = cuij1(1, :)
257        cuij2(iip1, :) = cuij2(1, :)
258        cuij3(iip1, :) = cuij3(1, :)
259        cuij4(iip1, :) = cuij4(1, :)
260    
261        aireij1_2d(iip1, :) = aireij1_2d(1, :)
262        aireij2_2d(iip1, :) = aireij2_2d(1, :)
263        aireij3_2d(iip1, :) = aireij3_2d(1, :)
264        aireij4_2d(iip1, :) = aireij4_2d(1, :)
265    
266        DO j = 1, jjp1
267           DO i = 1, iim
268              aire_2d(i, j) = aireij1_2d(i, j) + aireij2_2d(i, j) &
269                   + aireij3_2d(i, j) + aireij4_2d(i, j)
270              alpha1_2d(i, j) = aireij1_2d(i, j) / aire_2d(i, j)
271              alpha2_2d(i, j) = aireij2_2d(i, j) / aire_2d(i, j)
272              alpha3_2d(i, j) = aireij3_2d(i, j) / aire_2d(i, j)
273              alpha4_2d(i, j) = aireij4_2d(i, j) / aire_2d(i, j)
274              alpha1p2_2d(i, j) = alpha1_2d(i, j) + alpha2_2d(i, j)
275              alpha1p4_2d(i, j) = alpha1_2d(i, j) + alpha4_2d(i, j)
276              alpha2p3_2d(i, j) = alpha2_2d(i, j) + alpha3_2d(i, j)
277              alpha3p4_2d(i, j) = alpha3_2d(i, j) + alpha4_2d(i, j)
278           END DO
279    
280           aire_2d(iip1, j) = aire_2d(1, j)
281           alpha1_2d(iip1, j) = alpha1_2d(1, j)
282           alpha2_2d(iip1, j) = alpha2_2d(1, j)
283           alpha3_2d(iip1, j) = alpha3_2d(1, j)
284           alpha4_2d(iip1, j) = alpha4_2d(1, j)
285           alpha1p2_2d(iip1, j) = alpha1p2_2d(1, j)
286           alpha1p4_2d(iip1, j) = alpha1p4_2d(1, j)
287           alpha2p3_2d(iip1, j) = alpha2p3_2d(1, j)
288           alpha3p4_2d(iip1, j) = alpha3p4_2d(1, j)
289        END DO
290    
291        DO j = 1, jjp1
292           DO i = 1, iim
293              aireu_2d(i, j) = aireij1_2d(i, j) + aireij2_2d(i, j) + &
294                   aireij4_2d(i + 1, j) + aireij3_2d(i + 1, j)
295              unsaire_2d(i, j) = 1. / aire_2d(i, j)
296              unsair_gam1_2d(i, j) = unsaire_2d(i, j)**(-gamdi_gdiv)
297              unsair_gam2_2d(i, j) = unsaire_2d(i, j)**(-gamdi_h)
298              airesurg_2d(i, j) = aire_2d(i, j) / g
299           END DO
300           aireu_2d(iip1, j) = aireu_2d(1, j)
301           unsaire_2d(iip1, j) = unsaire_2d(1, j)
302           unsair_gam1_2d(iip1, j) = unsair_gam1_2d(1, j)
303           unsair_gam2_2d(iip1, j) = unsair_gam2_2d(1, j)
304           airesurg_2d(iip1, j) = airesurg_2d(1, j)
305        END DO
306    
307        DO j = 1, jjm
308           DO i = 1, iim
309              airev_2d(i, j) = aireij2_2d(i, j) + aireij3_2d(i, j) + &
310                   aireij1_2d(i, j + 1) + aireij4_2d(i, j + 1)
311           END DO
312           DO i = 1, iim
313              airez = aireij2_2d(i, j) + aireij1_2d(i, j + 1) &
314                   + aireij3_2d(i + 1, j) + aireij4_2d(i + 1, j + 1)
315              unsairez_2d(i, j) = 1. / airez
316              unsairz_gam_2d(i, j) = unsairez_2d(i, j)**(-gamdi_grot)
317              fext_2d(i, j) = airez * sin(rlatv(j)) * 2. * omeg
318           END DO
319           airev_2d(iip1, j) = airev_2d(1, j)
320           unsairez_2d(iip1, j) = unsairez_2d(1, j)
321           fext_2d(iip1, j) = fext_2d(1, j)
322           unsairz_gam_2d(iip1, j) = unsairz_gam_2d(1, j)
323        END DO
324    
325        ! Calcul des élongations cu_2d, cv_2d, cvu
326    
327        DO j = 1, jjm
328           DO i = 1, iim
329              cv_2d(i, j) = 0.5 * &
330                   (cvij2(i, j) + cvij3(i, j) + cvij1(i, j + 1) + cvij4(i, j + 1))
331              cvu(i, j) = 0.5 * (cvij1(i, j) + cvij4(i, j) + cvij2(i, j) &
332                   + cvij3(i, j))
333              cuv(i, j) = 0.5 * (cuij2(i, j) + cuij3(i, j) + cuij1(i, j + 1) &
334                   + cuij4(i, j + 1))
335              unscv2_2d(i, j) = 1. / cv_2d(i, j)**2
336           END DO
337           DO i = 1, iim
338              cuvsurcv_2d(i, j) = airev_2d(i, j) * unscv2_2d(i, j)
339              cvsurcuv_2d(i, j) = 1. / cuvsurcv_2d(i, j)
340              cuvscvgam1_2d(i, j) = cuvsurcv_2d(i, j)**(-gamdi_gdiv)
341              cuvscvgam2_2d(i, j) = cuvsurcv_2d(i, j)**(-gamdi_h)
342              cvscuvgam_2d(i, j) = cvsurcuv_2d(i, j)**(-gamdi_grot)
343           END DO
344           cv_2d(iip1, j) = cv_2d(1, j)
345           cvu(iip1, j) = cvu(1, j)
346           unscv2_2d(iip1, j) = unscv2_2d(1, j)
347           cuv(iip1, j) = cuv(1, j)
348           cuvsurcv_2d(iip1, j) = cuvsurcv_2d(1, j)
349           cvsurcuv_2d(iip1, j) = cvsurcuv_2d(1, j)
350           cuvscvgam1_2d(iip1, j) = cuvscvgam1_2d(1, j)
351           cuvscvgam2_2d(iip1, j) = cuvscvgam2_2d(1, j)
352           cvscuvgam_2d(iip1, j) = cvscuvgam_2d(1, j)
353        END DO
354    
355        DO j = 2, jjm
356           DO i = 1, iim
357              cu_2d(i, j) = 0.5 * (cuij1(i, j) + cuij4(i + 1, j) + cuij2(i, j) &
358                   + cuij3(i + 1, j))
359              unscu2_2d(i, j) = 1. / cu_2d(i, j)**2
360              cvusurcu_2d(i, j) = aireu_2d(i, j) * unscu2_2d(i, j)
361              cusurcvu_2d(i, j) = 1. / cvusurcu_2d(i, j)
362              cvuscugam1_2d(i, j) = cvusurcu_2d(i, j)**(-gamdi_gdiv)
363              cvuscugam2_2d(i, j) = cvusurcu_2d(i, j)**(-gamdi_h)
364              cuscvugam_2d(i, j) = cusurcvu_2d(i, j)**(-gamdi_grot)
365           END DO
366           cu_2d(iip1, j) = cu_2d(1, j)
367           unscu2_2d(iip1, j) = unscu2_2d(1, j)
368           cvusurcu_2d(iip1, j) = cvusurcu_2d(1, j)
369           cusurcvu_2d(iip1, j) = cusurcvu_2d(1, j)
370           cvuscugam1_2d(iip1, j) = cvuscugam1_2d(1, j)
371           cvuscugam2_2d(iip1, j) = cvuscugam2_2d(1, j)
372           cuscvugam_2d(iip1, j) = cuscvugam_2d(1, j)
373        END DO
374    
375        ! Calcul aux pôles
376    
377        cu_2d(:, 1) = 0.
378        unscu2_2d(:, 1) = 0.
379        cvu(:, 1) = 0.
380    
381        cu_2d(:, jjp1) = 0.
382        unscu2_2d(:, jjp1) = 0.
383        cvu(:, jjp1) = 0.
384    
385        DO j = 1, jjm
386           DO i = 1, iim
387              airvscu2_2d(i, j) = airev_2d(i, j) / (cuv(i, j) * cuv(i, j))
388              aivscu2gam_2d(i, j) = airvscu2_2d(i, j)**(-gamdi_grot)
389           END DO
390           airvscu2_2d(iip1, j) = airvscu2_2d(1, j)
391           aivscu2gam_2d(iip1, j) = aivscu2gam_2d(1, j)
392        END DO
393    
394        DO j = 2, jjm
395           DO i = 1, iim
396              airuscv2_2d(i, j) = aireu_2d(i, j) / (cvu(i, j) * cvu(i, j))
397              aiuscv2gam_2d(i, j) = airuscv2_2d(i, j)**(-gamdi_grot)
398           END DO
399           airuscv2_2d(iip1, j) = airuscv2_2d(1, j)
400           aiuscv2gam_2d(iip1, j) = aiuscv2gam_2d(1, j)
401        END DO
402    
403        ! Calcul des aires aux pôles :
404    
405        apoln = sum(aire_2d(:iim, 1))
406        apols = sum(aire_2d(:iim, jjp1))
407        unsapolnga1 = 1. / (apoln**(-gamdi_gdiv))
408        unsapolsga1 = 1. / (apols**(-gamdi_gdiv))
409        unsapolnga2 = 1. / (apoln**(-gamdi_h))
410        unsapolsga2 = 1. / (apols**(-gamdi_h))
411    
412        ! Changement F. Hourdin calcul conservatif pour fext_2d
413        ! constang_2d contient le produit a * cos (latitude) * omega
414    
415        DO i = 1, iim
416           constang_2d(i, 1) = 0.
417        END DO
418        DO j = 1, jjm - 1
419           DO i = 1, iim
420              constang_2d(i, j + 1) = rad * omeg * cu_2d(i, j + 1) &
421                   * cos(rlatu(j + 1))
422           END DO
423        END DO
424        DO i = 1, iim
425           constang_2d(i, jjp1) = 0.
426        END DO
427    
428        ! Périodicité en longitude
429    
430        DO j = 1, jjm
431           fext_2d(iip1, j) = fext_2d(1, j)
432        END DO
433        DO j = 1, jjp1
434           constang_2d(iip1, j) = constang_2d(1, j)
435        END DO
436    
437        call new_unit(unit)
438        open(unit, file="longitude_latitude.txt", status="replace", action="write")
439        write(unit, fmt=*) '"longitudes at V points (degrees)"', rlonv * 180. / pi
440        write(unit, fmt=*) '"latitudes at V points (degrees)"', rlatv * 180. / pi
441        write(unit, fmt=*) '"longitudes at U points (degrees)"', rlonu * 180. / pi
442        write(unit, fmt=*) '"latitudes at U points (degrees)"', rlatu * 180. / pi
443        close(unit)
444    
445      END SUBROUTINE inigeom
446    
447  c utilisation  de f(x,y) a tangente sinusoidale , y etant la latit. ..  end module inigeom_m
 c  
   
         pxo   = clon *pi /180.  
         pyo   = 2.* clat* pi /180.  
 c  
 c  ....  determination de  transx ( pour le zoom ) par Newton-Raphson .  
 c  
         itmax = 10  
         eps   = .1e-7  
 c  
         xo1 = 0.  
         DO 10 iter = 1, itmax  
         x1  = xo1  
         f   = x1+ alphax *SIN(x1-pxo)  
         df  = 1.+ alphax *COS(x1-pxo)  
         x1  = x1 - f/df  
         xdm = ABS( x1- xo1 )  
         IF( xdm.LE.eps )GO TO 11  
         xo1 = x1  
  10     CONTINUE  
  11     CONTINUE  
 c  
         transx = xo1  
   
         itmay = 10  
         eps   = .1e-7  
 C  
         yo1  = 0.  
         DO 15 iter = 1,itmay  
         y1   = yo1  
         f    = y1 + alphay* SIN(y1-pyo)  
         df   = 1. + alphay* COS(y1-pyo)  
         y1   = y1 -f/df  
         ydm  = ABS(y1-yo1)  
         IF(ydm.LE.eps) GO TO 17  
         yo1  = y1  
  15     CONTINUE  
 c  
  17     CONTINUE  
         transy = yo1  
   
         CALL fxy ( rlatu,yprimu,rlatv,yprimv,rlatu1,yprimu1,  
      ,              rlatu2,yprimu2,  
      ,  rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025  
      $       ,xprimp025)  
   
        ENDIF  
 c  
       ELSE  
 c  
 c ....  Utilisation  de fxyhyper , f(x,y) a derivee tangente hyperbol.  
 c   ..................................................................  
   
       WRITE(6,*)  
      $        '*** Inigeom , Y = Latitude  , der.tg. hyperbolique ***'  
   
        CALL fxyhyper( clat, grossismy, dzoomy, tauy    ,  
      ,                clon, grossismx, dzoomx, taux    ,  
      , rlatu,yprimu,rlatv, yprimv,rlatu1, yprimu1,rlatu2,yprimu2  ,  
      , rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025  
      $     ,xprimp025 )  
   
     
       ENDIF  
 c  
 c  -------------------------------------------------------------------  
   
 c  
       rlatu(1)    =     ASIN(1.)  
       rlatu(jjp1) =  - rlatu(1)  
 c  
 c  
 c   ....  calcul  aux  poles  ....  
 c  
       yprimu(1)      = 0.  
       yprimu(jjp1)   = 0.  
 c  
 c  
       un4rad2 = 0.25 * rad * rad  
 c  
 c   -------------------------------------------------------------  
 c   -------------------------------------------------------------  
 c                                                                    -  
 c calcul  des aires ( aire_2d,aireu_2d,airev_2d, 1./aire_2d, 1./airez )  
 c   -      et de   fext_2d ,  force de coriolis  extensive  .  
 c   -                                                    
 c   -------------------------------------------------------------  
 c   -------------------------------------------------------------  
 c  
 c  
 c  
 c   A 1 point scalaire P (i,j) de la grille, reguliere en (X,Y) , sont  
 c   affectees 4 aires entourant P , calculees respectivement aux points  
 c            ( i + 1/4, j - 1/4 )    :    aireij1_2d (i,j)  
 c            ( i + 1/4, j + 1/4 )    :    aireij2_2d (i,j)  
 c            ( i - 1/4, j + 1/4 )    :    aireij3_2d (i,j)  
 c            ( i - 1/4, j - 1/4 )    :    aireij4_2d (i,j)  
 c  
 c           ,  
 c Les cotes de chacun de ces 4 carres etant egaux a 1/2 suivant (X,Y).  
 c   Chaque aire centree en 1 point scalaire P(i,j) est egale a la somme  
 c des 4 aires  aireij1_2d,aireij2_2d,aireij3_2d,aireij4_2d qui sont affectees au  
 c   point (i,j) .  
 c   On definit en outre les coefficients  alpha comme etant egaux a  
 c (aireij / aire_2d), c.a.d par exp.  alpha1_2d(i,j)=aireij1_2d(i,j)/aire_2d(i,j)  
 c  
 c   De meme, toute aire centree en 1 point U est egale a la somme des  
 c 4 aires aireij1_2d,aireij2_2d,aireij3_2d,aireij4_2d entourant le point U .  
 c    Idem pour  airev_2d, airez .  
 c  
 c       On a ,pour chaque maille :    dX = dY = 1  
 c  
 c  
 c                             . V  
 c  
 c                 aireij4_2d .        . aireij1_2d  
 c  
 c                   U .       . P      . U  
 c  
 c                 aireij3_2d .        . aireij2_2d  
 c  
 c                             . V  
 c  
 c  
 c  
 c  
 c  
 c ....................................................................  
 c  
 c Calcul des 4 aires elementaires aireij1_2d,aireij2_2d,aireij3_2d,aireij4_2d  
 c qui entourent chaque aire_2d(i,j) , ainsi que les 4 elongations elemen  
 c   taires cuij et les 4 elongat. cvij qui sont calculees aux memes  
 c     endroits  que les aireij   .      
 c  
 c  ....................................................................  
 c  
 c     .......  do 35  :   boucle sur les  jjm + 1  latitudes   .....  
 c  
 c  
       DO 35 j = 1, jjp1  
 c  
       IF ( j. eq. 1 )  THEN  
 c  
       yprm           = yprimu1(j)  
       rlatm          = rlatu1(j)  
 c  
       coslatm        = COS( rlatm )  
       radclatm       = 0.5* rad * coslatm  
 c  
       DO 30 i = 1, iim  
       xprp           = xprimp025( i )  
       xprm           = xprimm025( i )  
       aireij2_2d( i,1 ) = un4rad2 * coslatm  * xprp * yprm  
       aireij3_2d( i,1 ) = un4rad2 * coslatm  * xprm * yprm  
       cuij2  ( i,1 ) = radclatm * xprp  
       cuij3  ( i,1 ) = radclatm * xprm  
       cvij2  ( i,1 ) = 0.5* rad * yprm  
       cvij3  ( i,1 ) = cvij2(i,1)  
   30  CONTINUE  
 c  
       DO  i = 1, iim  
       aireij1_2d( i,1 ) = 0.  
       aireij4_2d( i,1 ) = 0.  
       cuij1  ( i,1 ) = 0.  
       cuij4  ( i,1 ) = 0.  
       cvij1  ( i,1 ) = 0.  
       cvij4  ( i,1 ) = 0.  
       ENDDO  
 c  
       END IF  
 c  
       IF ( j. eq. jjp1 )  THEN  
        yprp               = yprimu2(j-1)  
        rlatp              = rlatu2 (j-1)  
 ccc       yprp             = fyprim( FLOAT(j) - 0.25 )  
 ccc       rlatp            = fy    ( FLOAT(j) - 0.25 )  
 c  
       coslatp             = COS( rlatp )  
       radclatp            = 0.5* rad * coslatp  
 c  
       DO 31 i = 1,iim  
         xprp              = xprimp025( i )  
         xprm              = xprimm025( i )  
         aireij1_2d( i,jjp1 ) = un4rad2 * coslatp  * xprp * yprp  
         aireij4_2d( i,jjp1 ) = un4rad2 * coslatp  * xprm * yprp  
         cuij1(i,jjp1)     = radclatp * xprp  
         cuij4(i,jjp1)     = radclatp * xprm  
         cvij1(i,jjp1)     = 0.5 * rad* yprp  
         cvij4(i,jjp1)     = cvij1(i,jjp1)  
  31   CONTINUE  
 c  
        DO   i    = 1, iim  
         aireij2_2d( i,jjp1 ) = 0.  
         aireij3_2d( i,jjp1 ) = 0.  
         cvij2  ( i,jjp1 ) = 0.  
         cvij3  ( i,jjp1 ) = 0.  
         cuij2  ( i,jjp1 ) = 0.  
         cuij3  ( i,jjp1 ) = 0.  
        ENDDO  
 c  
       END IF  
 c  
   
       IF ( j .gt. 1 .AND. j .lt. jjp1 )  THEN  
 c  
         rlatp    = rlatu2 ( j-1 )  
         yprp     = yprimu2( j-1 )  
         rlatm    = rlatu1 (  j  )  
         yprm     = yprimu1(  j  )  
 cc         rlatp    = fy    ( FLOAT(j) - 0.25 )  
 cc         yprp     = fyprim( FLOAT(j) - 0.25 )  
 cc         rlatm    = fy    ( FLOAT(j) + 0.25 )  
 cc         yprm     = fyprim( FLOAT(j) + 0.25 )  
   
          coslatm  = COS( rlatm )  
          coslatp  = COS( rlatp )  
          radclatp = 0.5* rad * coslatp  
          radclatm = 0.5* rad * coslatm  
 c  
          DO 32 i = 1,iim  
          xprp            = xprimp025( i )  
          xprm            = xprimm025( i )  
         
          ai14            = un4rad2 * coslatp * yprp  
          ai23            = un4rad2 * coslatm * yprm  
          aireij1_2d ( i,j ) = ai14 * xprp  
          aireij2_2d ( i,j ) = ai23 * xprp  
          aireij3_2d ( i,j ) = ai23 * xprm  
          aireij4_2d ( i,j ) = ai14 * xprm  
          cuij1   ( i,j ) = radclatp * xprp  
          cuij2   ( i,j ) = radclatm * xprp  
          cuij3   ( i,j ) = radclatm * xprm  
          cuij4   ( i,j ) = radclatp * xprm  
          cvij1   ( i,j ) = 0.5* rad * yprp  
          cvij2   ( i,j ) = 0.5* rad * yprm  
          cvij3   ( i,j ) = cvij2(i,j)  
          cvij4   ( i,j ) = cvij1(i,j)  
   32     CONTINUE  
 c  
       END IF  
 c  
 c    ........       periodicite   ............  
 c  
          cvij1   (iip1,j) = cvij1   (1,j)  
          cvij2   (iip1,j) = cvij2   (1,j)  
          cvij3   (iip1,j) = cvij3   (1,j)  
          cvij4   (iip1,j) = cvij4   (1,j)  
          cuij1   (iip1,j) = cuij1   (1,j)  
          cuij2   (iip1,j) = cuij2   (1,j)  
          cuij3   (iip1,j) = cuij3   (1,j)  
          cuij4   (iip1,j) = cuij4   (1,j)  
          aireij1_2d (iip1,j) = aireij1_2d (1,j )  
          aireij2_2d (iip1,j) = aireij2_2d (1,j )  
          aireij3_2d (iip1,j) = aireij3_2d (1,j )  
          aireij4_2d (iip1,j) = aireij4_2d (1,j )  
           
   35  CONTINUE  
 c  
 c    ..............................................................  
 c  
       DO 37 j = 1, jjp1  
       DO 36 i = 1, iim  
       aire_2d    ( i,j )  = aireij1_2d(i,j) + aireij2_2d(i,j)  
      *        + aireij3_2d(i,j) + aireij4_2d(i,j)  
       alpha1_2d  ( i,j )  = aireij1_2d(i,j) / aire_2d(i,j)  
       alpha2_2d  ( i,j )  = aireij2_2d(i,j) / aire_2d(i,j)  
       alpha3_2d  ( i,j )  = aireij3_2d(i,j) / aire_2d(i,j)  
       alpha4_2d  ( i,j )  = aireij4_2d(i,j) / aire_2d(i,j)  
       alpha1p2_2d( i,j )  = alpha1_2d (i,j) + alpha2_2d (i,j)  
       alpha1p4_2d( i,j )  = alpha1_2d (i,j) + alpha4_2d (i,j)  
       alpha2p3_2d( i,j )  = alpha2_2d (i,j) + alpha3_2d (i,j)  
       alpha3p4_2d( i,j )  = alpha3_2d (i,j) + alpha4_2d (i,j)  
   36  CONTINUE  
 c  
 c  
       aire_2d    (iip1,j) = aire_2d    (1,j)  
       alpha1_2d  (iip1,j) = alpha1_2d  (1,j)  
       alpha2_2d  (iip1,j) = alpha2_2d  (1,j)  
       alpha3_2d  (iip1,j) = alpha3_2d  (1,j)  
       alpha4_2d  (iip1,j) = alpha4_2d  (1,j)  
       alpha1p2_2d(iip1,j) = alpha1p2_2d(1,j)  
       alpha1p4_2d(iip1,j) = alpha1p4_2d(1,j)  
       alpha2p3_2d(iip1,j) = alpha2p3_2d(1,j)  
       alpha3p4_2d(iip1,j) = alpha3p4_2d(1,j)  
   37  CONTINUE  
 c  
   
       DO 42 j = 1,jjp1  
       DO 41 i = 1,iim  
       aireu_2d       (i,j)= aireij1_2d(i,j) + aireij2_2d(i,j)  
      *        + aireij4_2d(i+1,j) +aireij3_2d(i+1,j)  
       unsaire_2d    ( i,j)= 1./ aire_2d(i,j)  
       unsair_gam1_2d( i,j)= unsaire_2d(i,j)** ( - gamdi_gdiv )  
       unsair_gam2_2d( i,j)= unsaire_2d(i,j)** ( - gamdi_h    )  
       airesurg_2d   ( i,j)= aire_2d(i,j)/ g  
   41  CONTINUE  
       aireu_2d     (iip1,j)  = aireu_2d  (1,j)  
       unsaire_2d   (iip1,j)  = unsaire_2d(1,j)  
       unsair_gam1_2d(iip1,j) = unsair_gam1_2d(1,j)  
       unsair_gam2_2d(iip1,j) = unsair_gam2_2d(1,j)  
       airesurg_2d   (iip1,j) = airesurg_2d(1,j)  
   42  CONTINUE  
 c  
 c  
       DO 48 j = 1,jjm  
 c  
         DO i=1,iim  
          airev_2d     (i,j) = aireij2_2d(i,j)+ aireij3_2d(i,j)  
      *          + aireij1_2d(i,j+1) +aireij4_2d(i,j+1)  
         ENDDO  
          DO i=1,iim  
           airez         = aireij2_2d(i,j)+aireij1_2d(i,j+1)  
      *           +aireij3_2d(i+1,j) +aireij4_2d(i+1,j+1)  
           unsairez_2d(i,j) = 1./ airez  
           unsairz_gam_2d(i,j)= unsairez_2d(i,j)** ( - gamdi_grot )  
           fext_2d    (i,j)   = airez * SIN(rlatv(j))* 2.* omeg  
          ENDDO  
         airev_2d     (iip1,j)  = airev_2d(1,j)  
         unsairez_2d  (iip1,j)  = unsairez_2d(1,j)  
         fext_2d      (iip1,j)  = fext_2d(1,j)  
         unsairz_gam_2d(iip1,j) = unsairz_gam_2d(1,j)  
 c  
   48  CONTINUE  
 c  
 c  
 c    .....      Calcul  des elongations cu_2d,cv_2d, cvu     .........  
 c  
       DO    j   = 1, jjm  
        DO   i  = 1, iim  
        cv_2d(i,j) = 0.5  
      $         *( cvij2(i,j)+cvij3(i,j)+cvij1(i,j+1)+cvij4(i,j+1))  
        cvu(i,j)= 0.5 *( cvij1(i,j)+cvij4(i,j)+cvij2(i,j)  +cvij3(i,j) )  
        cuv(i,j)= 0.5  
      $      *( cuij2(i,j)+cuij3(i,j)+cuij1(i,j+1)+cuij4(i,j+1))  
        unscv2_2d(i,j) = 1./ ( cv_2d(i,j)*cv_2d(i,j) )  
        ENDDO  
        DO   i  = 1, iim  
        cuvsurcv_2d (i,j)    = airev_2d(i,j)  * unscv2_2d(i,j)  
        cvsurcuv_2d (i,j)    = 1./cuvsurcv_2d(i,j)  
        cuvscvgam1_2d(i,j)   = cuvsurcv_2d (i,j) ** ( - gamdi_gdiv )  
        cuvscvgam2_2d(i,j)   = cuvsurcv_2d (i,j) ** ( - gamdi_h )  
        cvscuvgam_2d(i,j)    = cvsurcuv_2d (i,j) ** ( - gamdi_grot )  
        ENDDO  
        cv_2d       (iip1,j)  = cv_2d       (1,j)  
        cvu      (iip1,j)  = cvu      (1,j)  
        unscv2_2d   (iip1,j)  = unscv2_2d   (1,j)  
        cuv      (iip1,j)  = cuv      (1,j)  
        cuvsurcv_2d (iip1,j)  = cuvsurcv_2d (1,j)  
        cvsurcuv_2d (iip1,j)  = cvsurcuv_2d (1,j)  
        cuvscvgam1_2d(iip1,j) = cuvscvgam1_2d(1,j)  
        cuvscvgam2_2d(iip1,j) = cuvscvgam2_2d(1,j)  
        cvscuvgam_2d(iip1,j)  = cvscuvgam_2d(1,j)  
       ENDDO  
   
       DO  j     = 2, jjm  
         DO   i  = 1, iim  
         cu_2d(i,j) = 0.5  
      $          *(cuij1(i,j)+cuij4(i+1,j)+cuij2(i,j)+cuij3(i+1,j))  
         unscu2_2d    (i,j)  = 1./ ( cu_2d(i,j) * cu_2d(i,j) )  
         cvusurcu_2d  (i,j)  =  aireu_2d(i,j) * unscu2_2d(i,j)  
         cusurcvu_2d  (i,j)  = 1./ cvusurcu_2d(i,j)  
         cvuscugam1_2d (i,j) = cvusurcu_2d(i,j) ** ( - gamdi_gdiv )  
         cvuscugam2_2d (i,j) = cvusurcu_2d(i,j) ** ( - gamdi_h    )  
         cuscvugam_2d (i,j)  = cusurcvu_2d(i,j) ** ( - gamdi_grot )  
         ENDDO  
         cu_2d       (iip1,j)  = cu_2d(1,j)  
         unscu2_2d   (iip1,j)  = unscu2_2d(1,j)  
         cvusurcu_2d (iip1,j)  = cvusurcu_2d(1,j)  
         cusurcvu_2d (iip1,j)  = cusurcvu_2d(1,j)  
         cvuscugam1_2d(iip1,j) = cvuscugam1_2d(1,j)  
         cvuscugam2_2d(iip1,j) = cvuscugam2_2d(1,j)  
         cuscvugam_2d (iip1,j) = cuscvugam_2d(1,j)  
       ENDDO  
   
 c  
 c   ....  calcul aux  poles  ....  
 c  
       DO    i      =  1, iip1  
         cu_2d    ( i, 1 )  =   0.  
         unscu2_2d( i, 1 )  =   0.  
         cvu   ( i, 1 )  =   0.  
 c  
         cu_2d    (i, jjp1) =   0.  
         unscu2_2d(i, jjp1) =   0.  
         cvu   (i, jjp1) =   0.  
       ENDDO  
 c  
 c    ..............................................................  
 c  
       DO j = 1, jjm  
         DO i= 1, iim  
          airvscu2_2d  (i,j) = airev_2d(i,j)/ ( cuv(i,j) * cuv(i,j) )  
          aivscu2gam_2d(i,j) = airvscu2_2d(i,j)** ( - gamdi_grot )  
         ENDDO  
          airvscu2_2d  (iip1,j)  = airvscu2_2d(1,j)  
          aivscu2gam_2d(iip1,j)  = aivscu2gam_2d(1,j)  
       ENDDO  
   
       DO j=2,jjm  
         DO i=1,iim  
          airuscv2_2d   (i,j)    = aireu_2d(i,j)/ ( cvu(i,j) * cvu(i,j) )  
          aiuscv2gam_2d (i,j)    = airuscv2_2d(i,j)** ( - gamdi_grot )  
         ENDDO  
          airuscv2_2d  (iip1,j)  = airuscv2_2d  (1,j)  
          aiuscv2gam_2d(iip1,j)  = aiuscv2gam_2d(1,j)  
       ENDDO  
   
 c  
 c   calcul des aires aux  poles :  
 c   -----------------------------  
 c  
       apoln       = SSUM(iim,aire_2d(1,1),1)  
       apols       = SSUM(iim,aire_2d(1,jjp1),1)  
       unsapolnga1 = 1./ ( apoln ** ( - gamdi_gdiv ) )  
       unsapolsga1 = 1./ ( apols ** ( - gamdi_gdiv ) )  
       unsapolnga2 = 1./ ( apoln ** ( - gamdi_h    ) )  
       unsapolsga2 = 1./ ( apols ** ( - gamdi_h    ) )  
 c  
 c----------------------------------------------------------------  
 c     gtitre='Coriolis version ancienne'  
 c     gfichier='fext1'  
 c     CALL writestd(fext_2d,iip1*jjm)  
 c  
 c   changement F. Hourdin calcul conservatif pour fext_2d  
 c   constang_2d contient le produit a * cos ( latitude ) * omega  
 c  
       DO i=1,iim  
          constang_2d(i,1) = 0.  
       ENDDO  
       DO j=1,jjm-1  
         DO i=1,iim  
          constang_2d(i,j+1) = rad*omeg*cu_2d(i,j+1)*COS(rlatu(j+1))  
         ENDDO  
       ENDDO  
       DO i=1,iim  
          constang_2d(i,jjp1) = 0.  
       ENDDO  
 c  
 c   periodicite en longitude  
 c  
       DO j=1,jjm  
         fext_2d(iip1,j)     = fext_2d(1,j)  
       ENDDO  
       DO j=1,jjp1  
         constang_2d(iip1,j) = constang_2d(1,j)  
       ENDDO  
   
 c fin du changement  
   
 c  
 c----------------------------------------------------------------  
 c  
        WRITE(6,*) '   ***  Coordonnees de la grille  *** '  
        WRITE(6,995)  
 c  
        WRITE(6,*) '   LONGITUDES  aux pts.   V  ( degres )  '  
        WRITE(6,995)  
         DO i=1,iip1  
          rlonvv(i) = rlonv(i)*180./pi  
         ENDDO  
        WRITE(6,400) rlonvv  
 c  
        WRITE(6,995)  
        WRITE(6,*) '   LATITUDES   aux pts.   V  ( degres )  '  
        WRITE(6,995)  
         DO i=1,jjm  
          rlatuu(i)=rlatv(i)*180./pi  
         ENDDO  
        WRITE(6,400) (rlatuu(i),i=1,jjm)  
 c  
         DO i=1,iip1  
           rlonvv(i)=rlonu(i)*180./pi  
         ENDDO  
        WRITE(6,995)  
        WRITE(6,*) '   LONGITUDES  aux pts.   U  ( degres )  '  
        WRITE(6,995)  
        WRITE(6,400) rlonvv  
        WRITE(6,995)  
   
        WRITE(6,*) '   LATITUDES   aux pts.   U  ( degres )  '  
        WRITE(6,995)  
         DO i=1,jjp1  
          rlatuu(i)=rlatu(i)*180./pi  
         ENDDO  
        WRITE(6,400) (rlatuu(i),i=1,jjp1)  
        WRITE(6,995)  
 c  
 444    format(f10.3,f6.0)  
 400    FORMAT(1x,8f8.2)  
 990    FORMAT(//)  
 995    FORMAT(/)  
 c  
       RETURN  
       END  

Legend:
Removed from v.3  
changed lines
  Added in v.61

  ViewVC Help
Powered by ViewVC 1.1.21