/[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

revision 7 by guez, Mon Mar 31 12:24:17 2008 UTC revision 60 by guez, Mon Jan 30 14:37:26 2012 UTC
# Line 1  Line 1 
1  SUBROUTINE inigeom  module inigeom_m
2    
   !     Auteur :  P. Le Van  
   
   !   ............      Version  du 01/04/2001     ...................  
   
   !  Calcul des elongations cuij1,.cuij4 , cvij1,..cvij4  aux memes en-  
   !     endroits que les aires aireij1_2d,..aireij4_2d .  
   
   !  Choix entre f(y) a derivee sinusoid. ou a derivee tangente hyperbol.  
   ! Possibilité d'appeler une fonction "f(y)" à  
   ! dérivée tangente hyperbolique à la place de la fonction à dérivée  
   ! sinusoïdale.  
   
   
   USE dimens_m  
   USE paramet_m  
   USE comconst  
   USE comdissnew  
   USE logic  
   USE comgeom  
   USE serre  
3    IMPLICIT NONE    IMPLICIT NONE
4    
5    contains
6    
7    !------------------------------------------------------------------    SUBROUTINE inigeom
   !   ....  Variables  locales   ....  
   
   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  
   
   !   calcul des coeff. ( cu_2d, cv_2d , 1./cu_2d**2,  1./cv_2d**2  )  
   !   -                                                                -  
   !   ------------------------------------------------------------------  
   
   ! les coef. ( cu_2d, cv_2d ) permettent de passer des vitesses naturelles  
   !      aux vitesses covariantes et contravariantes , ou vice-versa ...  
   
   
   ! on a :  u (covariant) = cu_2d * u (naturel)   , u(contrav)= u(nat)/cu_2d  
   !         v (covariant) = cv_2d * v (naturel)   , v(contrav)= v(nat)/cv_2d  
   
   !       on en tire :  u(covariant) = cu_2d * cu_2d * u(contravariant)  
   !                     v(covariant) = cv_2d * cv_2d * v(contravariant)  
   
   
   !     on a l'application (  x(X) , y(Y) )   avec - im/2 +1 <  X  < im/2  
   !                                                          =     =  
   !                                           et   - jm/2    <  Y  < jm/2  
   !                                                          =     =  
   
   !      ...................................................  
   !      ...................................................  
   !      .  x  est la longitude du point  en radians       .  
   !      .  y  est la  latitude du point  en radians       .  
   !      .                                                 .  
   !      .  on a :  cu_2d(i,j) = rad * COS(y) * dx/dX         .  
   !      .          cv( j ) = rad          * dy/dY         .  
   !      .        aire_2d(i,j) =  cu_2d(i,j) * cv(j)             .  
   !      .                                                 .  
   !      . y, dx/dX, dy/dY calcules aux points concernes   .  
   !      .                                                 .  
   !      ...................................................  
   !      ...................................................  
   
   
   
   !                                                           ,  
   !    cv , bien que dependant de j uniquement,sera ici indice aussi en i  
   !          pour un adressage plus facile en  ij  .  
   
   
   
   !  **************  aux points  u  et  v ,           *****************  
   !      xprimu et xprimv sont respectivement les valeurs de  dx/dX  
   !      yprimu et yprimv    .  .  .  .  .  .  .  .  .  .  .  dy/dY  
   !      rlatu  et  rlatv    .  .  .  .  .  .  .  .  .  .  .la latitude  
   !      cvu    et   cv_2d      .  .  .  .  .  .  .  .  .  .  .    cv_2d  
   
   !  **************  aux points u, v, scalaires, et z  ****************  
   !      cu_2d, cuv, cuscal, cuz sont respectiv. les valeurs de    cu_2d  
   
   
   
   !         Exemple de distribution de variables sur la grille dans le  
   !             domaine de travail ( X,Y ) .  
   !     ................................................................  
   !                  DX=DY= 1  
   
   
   !        +     represente  un  point scalaire ( p.exp  la pression )  
   !        >     represente  la composante zonale du  vent  
   !        V     represente  la composante meridienne du vent  
   !        o     represente  la  vorticite  
   
   !     ----  , car aux poles , les comp.zonales covariantes sont nulles  
   
   
   
   !         i ->  
   
   !         1      2      3      4      5      6      7      8  
   !  j  
   !  v  1   + ---- + ---- + ---- + ---- + ---- + ---- + ---- + --  
   
   !         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
   
   !     2   +   >  +   >  +   >  +   >  +   >  +   >  +   >  +  >  
   
   !         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
   
   !     3   +   >  +   >  +   >  +   >  +   >  +   >  +   >  +  >  
   
   !         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
   
   !     4   +   >  +   >  +   >  +   >  +   >  +   >  +   >  +  >  
   
   !         V   o  V   o  V   o  V   o  V   o  V   o  V   o  V  o  
   
   !     5   + ---- + ---- + ---- + ---- + ---- + ---- + ---- + --  
   
   
   !      Ci-dessus,  on voit que le nombre de pts.en longitude est egal  
   !                 a   IM = 8  
   !      De meme ,   le nombre d'intervalles entre les 2 poles est egal  
   !                 a   JM = 4  
   
   !      Les points scalaires ( + ) correspondent donc a des valeurs  
   !       entieres  de  i ( 1 a IM )   et  de  j ( 1 a  JM +1 )   .  
   
   !      Les vents    U       ( > ) correspondent a des valeurs  semi-  
   !       entieres  de i ( 1+ 0.5 a IM+ 0.5) et entieres de j ( 1 a JM+1)  
   
   !      Les vents    V       ( V ) correspondent a des valeurs entieres  
   !     de     i ( 1 a  IM ) et semi-entieres de  j ( 1 +0.5  a JM +0.5)  
   
   
   
   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   . '/)  
   
   
   IF (nitergdiv/=2) THEN  
      gamdi_gdiv = coefdis/(float(nitergdiv)-2.)  
   ELSE  
      gamdi_gdiv = 0.  
   END IF  
   IF (nitergrot/=2) THEN  
      gamdi_grot = coefdis/(float(nitergrot)-2.)  
   ELSE  
      gamdi_grot = 0.  
   END IF  
   IF (niterh/=2) THEN  
      gamdi_h = coefdis/(float(niterh)-2.)  
   ELSE  
      gamdi_h = 0.  
   END IF  
   
   WRITE (6,*) ' gamdi_gd ', gamdi_gdiv, gamdi_grot, gamdi_h, coefdis, &  
        nitergdiv, nitergrot, niterh  
   
   pi = 2.*asin(1.)  
   
   WRITE (6,990)  
   
   !     ----------------------------------------------------------------  
   
   IF ( .NOT. fxyhypb) THEN  
   
   
      IF (ysinus) THEN  
   
         WRITE (6,*) ' ***  Inigeom ,  Y = Sinus ( Latitude ) *** '  
   
         !   .... 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)  
   
      ELSE  
   
         WRITE (6,*) '*** Inigeom ,  Y = Latitude  , der. sinusoid . ***'  
   
         ! utilisation  de f(x,y) a tangente sinusoidale , y etant la latit. ..  
   
   
         pxo = clon*pi/180.  
         pyo = 2.*clat*pi/180.  
   
         !  ....  determination de  transx ( pour le zoom ) par Newton-Raphson .  
   
         itmax = 10  
         eps = .1E-7  
   
         xo1 = 0.  
         DO  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<=eps) exit  
            xo1 = x1  
         end DO  
   
         transx = xo1  
   
         itmay = 10  
         eps = .1E-7  
   
         yo1 = 0.  
         DO 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<=eps) exit  
            yo1 = y1  
         end DO  
   
         transy = yo1  
   
         CALL fxy(rlatu,yprimu,rlatv,yprimv,rlatu1,yprimu1,rlatu2,yprimu2, &  
              rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025)  
   
      END IF  
   
   ELSE  
   
      ! ....  Utilisation  de fxyhyper , f(x,y) a derivee tangente hyperbol.  
      !   ..................................................................  
   
      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)  
   
   
   END IF  
   
   !  -------------------------------------------------------------------  
   
   
   rlatu(1) = asin(1.)  
   rlatu(jjp1) = -rlatu(1)  
   
   
   !   ....  calcul  aux  poles  ....  
   
   yprimu(1) = 0.  
   yprimu(jjp1) = 0.  
   
   
   un4rad2 = 0.25*rad*rad  
   
   !   -------------------------------------------------------------  
   !   -------------------------------------------------------------  
   !                                                                    -  
   ! calcul  des aires ( aire_2d,aireu_2d,airev_2d, 1./aire_2d, 1./airez )  
   !   -      et de   fext_2d ,  force de coriolis  extensive  .  
   !   -  
   !   -------------------------------------------------------------  
   !   -------------------------------------------------------------  
   
   
   
   !   A 1 point scalaire P (i,j) de la grille, reguliere en (X,Y) , sont  
   !   affectees 4 aires entourant P , calculees respectivement aux points  
   !            ( i + 1/4, j - 1/4 )    :    aireij1_2d (i,j)  
   !            ( i + 1/4, j + 1/4 )    :    aireij2_2d (i,j)  
   !            ( i - 1/4, j + 1/4 )    :    aireij3_2d (i,j)  
   !            ( i - 1/4, j - 1/4 )    :    aireij4_2d (i,j)  
   
   !           ,  
   ! Les cotes de chacun de ces 4 carres etant egaux a 1/2 suivant (X,Y).  
   !   Chaque aire centree en 1 point scalaire P(i,j) est egale a la somme  
   ! des 4 aires  aireij1_2d,aireij2_2d,aireij3_2d,aireij4_2d qui sont affectees au  
   !   point (i,j) .  
   !   On definit en outre les coefficients  alpha comme etant egaux a  
   ! (aireij / aire_2d), c.a.d par exp.  alpha1_2d(i,j)=aireij1_2d(i,j)/aire_2d(i,j)  
   
   !   De meme, toute aire centree en 1 point U est egale a la somme des  
   ! 4 aires aireij1_2d,aireij2_2d,aireij3_2d,aireij4_2d entourant le point U.  
   !    Idem pour  airev_2d, airez .  
   
   !       On a ,pour chaque maille :    dX = dY = 1  
   
   
   !                             . V  
   
   !                 aireij4_2d .        . aireij1_2d  
   
   !                   U .       . P      . U  
   
   !                 aireij3_2d .        . aireij2_2d  
   
   !                             . V  
   
   
   
   
   
   ! ....................................................................  
   
   ! Calcul des 4 aires elementaires aireij1_2d,aireij2_2d,aireij3_2d,aireij4_2d  
   ! qui entourent chaque aire_2d(i,j) , ainsi que les 4 elongations elementaires  
   ! cuij et les 4 elongat. cvij qui sont calculees aux memes  
   !     endroits  que les aireij   .  
   
   !  ....................................................................  
   
   !     .......  do 35  :   boucle sur les  jjm + 1  latitudes   .....  
   
   
   DO j = 1, jjp1  
   
      IF (j==1) THEN  
   
         yprm = yprimu1(j)  
         rlatm = rlatu1(j)  
   
         coslatm = cos(rlatm)  
         radclatm = 0.5*rad*coslatm  
   
         DO 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)  
         end DO  
   
         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.  
         END DO  
   
      END IF  
   
      IF (j==jjp1) THEN  
         yprp = yprimu2(j-1)  
         rlatp = rlatu2(j-1)  
         !cc       yprp             = fyprim( FLOAT(j) - 0.25 )  
         !cc       rlatp            = fy    ( FLOAT(j) - 0.25 )  
   
         coslatp = cos(rlatp)  
         radclatp = 0.5*rad*coslatp  
   
         DO 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)  
         end DO  
   
         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.  
         END DO  
   
      END IF  
   
   
      IF (j>1 .AND. j<jjp1) THEN  
   
         rlatp = rlatu2(j-1)  
         yprp = yprimu2(j-1)  
         rlatm = rlatu1(j)  
         yprm = yprimu1(j)  
         !c         rlatp    = fy    ( FLOAT(j) - 0.25 )  
         !c         yprp     = fyprim( FLOAT(j) - 0.25 )  
         !c         rlatm    = fy    ( FLOAT(j) + 0.25 )  
         !c         yprm     = fyprim( FLOAT(j) + 0.25 )  
   
         coslatm = cos(rlatm)  
         coslatp = cos(rlatp)  
         radclatp = 0.5*rad*coslatp  
         radclatm = 0.5*rad*coslatm  
   
         DO 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)  
         end DO  
   
      END IF  
   
      !    ........       periodicite   ............  
   
      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)  
   
   end DO  
   
   !    ..............................................................  
   
   DO j = 1, jjp1  
      DO 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)  
      end DO  
   
   
      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)  
   end DO  
   
   
   DO j = 1, jjp1  
      DO 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  
      end DO  
      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)  
   end DO  
   
   
   DO j = 1, jjm  
   
      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)  
      END DO  
      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  
      END DO  
      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)  
   
   end DO  
   
   
   !    .....      Calcul  des elongations cu_2d,cv_2d, cvu     .........  
   
   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))  
      END DO  
      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)  
      END DO  
      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)  
   END DO  
   
   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)  
      END DO  
      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)  
   END DO  
   
   
   !   ....  calcul aux  poles  ....  
   
   DO i = 1, iip1  
      cu_2d(i,1) = 0.  
      unscu2_2d(i,1) = 0.  
      cvu(i,1) = 0.  
   
      cu_2d(i,jjp1) = 0.  
      unscu2_2d(i,jjp1) = 0.  
      cvu(i,jjp1) = 0.  
   END DO  
   
   !    ..............................................................  
   
   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)  
      END DO  
      airvscu2_2d(iip1,j) = airvscu2_2d(1,j)  
      aivscu2gam_2d(iip1,j) = aivscu2gam_2d(1,j)  
   END DO  
   
   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)  
      END DO  
      airuscv2_2d(iip1,j) = airuscv2_2d(1,j)  
      aiuscv2gam_2d(iip1,j) = aiuscv2gam_2d(1,j)  
   END DO  
   
   
   !   calcul des aires aux  poles :  
   !   -----------------------------  
   
   apoln = sum(aire_2d(:iim, 1))  
   apols = sum(aire_2d(:iim, jjp1))  
   unsapolnga1 = 1./(apoln**(-gamdi_gdiv))  
   unsapolsga1 = 1./(apols**(-gamdi_gdiv))  
   unsapolnga2 = 1./(apoln**(-gamdi_h))  
   unsapolsga2 = 1./(apols**(-gamdi_h))  
   
   !----------------------------------------------------------------  
   !     gtitre='Coriolis version ancienne'  
   !     gfichier='fext1'  
   !     CALL writestd(fext_2d,iip1*jjm)  
   
   !   changement F. Hourdin calcul conservatif pour fext_2d  
   !   constang_2d contient le produit a * cos ( latitude ) * omega  
   
   DO i = 1, iim  
      constang_2d(i,1) = 0.  
   END DO  
   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))  
      END DO  
   END DO  
   DO i = 1, iim  
      constang_2d(i,jjp1) = 0.  
   END DO  
   
   !   periodicite en longitude  
   
   DO j = 1, jjm  
      fext_2d(iip1,j) = fext_2d(1,j)  
   END DO  
   DO j = 1, jjp1  
      constang_2d(iip1,j) = constang_2d(1,j)  
   END DO  
   
   ! fin du changement  
   
   
   !----------------------------------------------------------------  
   
   WRITE (6,*) '   ***  Coordonnees de la grille  *** '  
   WRITE (6,995)  
   
   WRITE (6,*) '   LONGITUDES  aux pts.   V  ( degres )  '  
   WRITE (6,995)  
   DO i = 1, iip1  
      rlonvv(i) = rlonv(i)*180./pi  
   END DO  
   WRITE (6,400) rlonvv  
8    
9    WRITE (6,995)      ! Auteur : P. Le Van
   WRITE (6,*) '   LATITUDES   aux pts.   V  ( degres )  '  
   WRITE (6,995)  
   DO i = 1, jjm  
      rlatuu(i) = rlatv(i)*180./pi  
   END DO  
   WRITE (6,400) (rlatuu(i),i=1,jjm)  
10    
11    DO i = 1, iip1      ! Calcul des élongations cuij1, ..., cuij4, cvij1, ..., cvij4 aux mêmes
12       rlonvv(i) = rlonu(i)*180./pi      ! endroits que les aires aireij1_2d, ..., aireij4_2d.
   END DO  
   WRITE (6,995)  
   WRITE (6,*) '   LONGITUDES  aux pts.   U  ( degres )  '  
   WRITE (6,995)  
   WRITE (6,400) rlonvv  
   WRITE (6,995)  
13    
14    WRITE (6,*) '   LATITUDES   aux pts.   U  ( degres )  '      ! Choix entre une fonction "f(y)" à dérivée sinusoïdale ou à
15    WRITE (6,995)      ! dérivée tangente hyperbolique. Calcul des coefficients cu_2d,
16    DO i = 1, jjp1      ! cv_2d, 1. / cu_2d**2, 1. / cv_2d**2. Les coefficients cu_2d et cv_2d
17       rlatuu(i) = rlatu(i)*180./pi      ! permettent de passer des vitesses naturelles aux vitesses
18    END DO      ! covariantes et contravariantes, ou vice-versa.
19    WRITE (6,400) (rlatuu(i),i=1,jjp1)  
20    WRITE (6,995)      ! 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
122              print *, 'Inigeom, Y = Latitude, der. sinusoid .'
123              ! 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        DO i = 1, iip1
378           cu_2d(i, 1) = 0.
379           unscu2_2d(i, 1) = 0.
380           cvu(i, 1) = 0.
381    
382           cu_2d(i, jjp1) = 0.
383           unscu2_2d(i, jjp1) = 0.
384           cvu(i, jjp1) = 0.
385        END DO
386    
387        DO j = 1, jjm
388           DO i = 1, iim
389              airvscu2_2d(i, j) = airev_2d(i, j) / (cuv(i, j) * cuv(i, j))
390              aivscu2gam_2d(i, j) = airvscu2_2d(i, j)**(-gamdi_grot)
391           END DO
392           airvscu2_2d(iip1, j) = airvscu2_2d(1, j)
393           aivscu2gam_2d(iip1, j) = aivscu2gam_2d(1, j)
394        END DO
395    
396        DO j = 2, jjm
397           DO i = 1, iim
398              airuscv2_2d(i, j) = aireu_2d(i, j) / (cvu(i, j) * cvu(i, j))
399              aiuscv2gam_2d(i, j) = airuscv2_2d(i, j)**(-gamdi_grot)
400           END DO
401           airuscv2_2d(iip1, j) = airuscv2_2d(1, j)
402           aiuscv2gam_2d(iip1, j) = aiuscv2gam_2d(1, j)
403        END DO
404    
405        ! Calcul des aires aux pôles :
406    
407        apoln = sum(aire_2d(:iim, 1))
408        apols = sum(aire_2d(:iim, jjp1))
409        unsapolnga1 = 1. / (apoln**(-gamdi_gdiv))
410        unsapolsga1 = 1. / (apols**(-gamdi_gdiv))
411        unsapolnga2 = 1. / (apoln**(-gamdi_h))
412        unsapolsga2 = 1. / (apols**(-gamdi_h))
413    
414        ! Changement F. Hourdin calcul conservatif pour fext_2d
415        ! constang_2d contient le produit a * cos (latitude) * omega
416    
417        DO i = 1, iim
418           constang_2d(i, 1) = 0.
419        END DO
420        DO j = 1, jjm - 1
421           DO i = 1, iim
422              constang_2d(i, j + 1) = rad * omeg * cu_2d(i, j + 1) &
423                   * cos(rlatu(j + 1))
424           END DO
425        END DO
426        DO i = 1, iim
427           constang_2d(i, jjp1) = 0.
428        END DO
429    
430        ! Périodicité en longitude
431    
432        DO j = 1, jjm
433           fext_2d(iip1, j) = fext_2d(1, j)
434        END DO
435        DO j = 1, jjp1
436           constang_2d(iip1, j) = constang_2d(1, j)
437        END DO
438    
439        call new_unit(unit)
440        open(unit, file="longitude_latitude.txt", status="replace", action="write")
441        write(unit, fmt=*) '"longitudes at V points (degrees)"', rlonv * 180. / pi
442        write(unit, fmt=*) '"latitudes at V points (degrees)"', rlatv * 180. / pi
443        write(unit, fmt=*) '"longitudes at U points (degrees)"', rlonu * 180. / pi
444        write(unit, fmt=*) '"latitudes at U points (degrees)"', rlatu * 180. / pi
445        close(unit)
446    
447  400 FORMAT (1X,8F8.2)    END SUBROUTINE inigeom
 990 FORMAT (//)  
 995 FORMAT (/)  
448    
449  END SUBROUTINE inigeom  end module inigeom_m

Legend:
Removed from v.7  
changed lines
  Added in v.60

  ViewVC Help
Powered by ViewVC 1.1.21