*=*=*=*= grid_noro.html =*=*=*=*
SUBROUTINE grid_noro

SUBROUTINE grid_noro


      SUBROUTINE grid_noro(imdep, jmdep, xdata, ydata, entree,
     .                 imar, jmar, x, y, zmea,zstd,zsig,zgam,zthe)
c=======================================================================
c (F. Lott) (voir aussi z.x. Li, A. Harzallah et L. Fairhead)
c
c      Calcul des parametres de l'orographie sous-maille necessaires
c      au nouveau shema de representation des montagnes meso-echelles
c      dans le modele.  Les points sont mis sur une grille rectangulaire
c      pseudo-physique.  Typiquement, il y a iim+1 latitudes incluant
c      le pole nord et le pole sud.  Il y a jjm+1 longitudes, y compris
c      aux poles.  Aux poles les champs peuvent ont une valeurs repetee
c      jjm+1 fois.....  La valeur du champs en jjm+1 (jmar) est celle
c      en j=1.
c      Les parametres a,b,c,d representent les limites de la region
c      de point de grille correspondant a un point decrit precedemment.
c      Les moyennes sur ces regions des valeurs calculees a partir de
c      l'USN, sont ponderees par un poids, fonction de la surface
c      occuppe par ces donnees a l'interieure de la grille du modele.
c      Dans la plupart des cas ce poid est le rapport entre la surface
c      de la region de point de grille USN et la surface de la region
c      de point de grille du modele.
c
c
c           (c)
c        ----d-----
c        | . . . .|
c        |        |
c     (b)a . * . .b(a)
c        |        |
c        | . . . .|
c        ----c-----
c           (d)
C=======================================================================
c INPUT:
c        imdep, jmdep: dimensions X et Y pour depart
c        xdata, ydata: coordonnees X et Y pour depart
c        entree: champ d'entree a transformer
c        dans ce programme, on assume que les donnees sont les altitudes
c        de l'USNavy: imdep=iusn=2160, jmdep=jusn=1080.
c OUTPUT:
c        imar, jmar: dimensions X et Y d'arrivee
c        x, y: coordonnees X et Y d'arrivee
c        les champs de sorties sont sur une grille physique:
c             zmea:  orographie moyenne
c             zstd:  deviation standard de l'orographie sous-maille
c             zsig:  pente de l'orographie sous-maille
c             zgam:  anisotropy de l'orographie sous maille
c             zthe:  orientation de l'axe oriente dans la direction
c                    de plus grande pente de l'orographie sous maille
C=======================================================================
c     IMPLICIT INTEGER (I,J)
c     IMPLICIT REAL(X,Z)
        implicit none
       integer iusn,jusn,iext
        parameter(iusn=360,jusn=180,iext=40)
c!-*-      include 'param1'
c!-*-      include 'comcstfi.h'
#include "dimensions.h"
#include "comconst.h"
c!-*-
c!-*-      parameter(iim=cols,jjm=rows)
        REAL xusn(iusn+2*iext),yusn(jusn+2)	
      REAL zusn(iusn+2*iext,jusn+2),zusnfi(iusn+2*iext,jusn+2)

c   modif declarations pour implicit none
      real zmeanor,zmeasud,zstdnor,zstdsud,zsignor
      real zsigsud,zweinor,zweisud
      real xk,xl,xm,xw,xp,xq
      real zmaxmea,zmaxstd,zmaxsig,zmaxgam,zmaxthe,zminthe
      real zbordnor,zbordsud,zbordest,zbordoue,xpi
      real zdeltax,zdeltay,zlenx,zleny,weighx,weighy,xincr
      integer i,j,ii,jj,ideltax,ihalph

      INTEGER imdep, jmdep
      REAL xdata(imdep),ydata(jmdep)
      REAL entree(imdep,jmdep)
c
      INTEGER imar, jmar

      REAL ztz(iim+1,jjm+1),zxtzx(iim+1,jjm+1)
      REAL zytzy(iim+1,jjm+1),zxtzy(iim+1,jjm+1)
      REAL zxtzxusn(iusn+2*iext,jusn+2),zytzyusn(iusn+2*iext,jusn+2)
      REAL zxtzyusn(iusn+2*iext,jusn+2)
      REAL weight(iim+1,jjm+1)
      REAL x(imar+1),y(jmar)
      REAL zmea(imar+1,jmar),zstd(imar+1,jmar)
      REAL zsig(imar+1,jmar),zgam(imar+1,jmar),zthe(imar+1,jmar)
c
      REAL a(2200),b(2200),c(1100),d(1100)
c
c  quelques constantes:
c
      print *,' parametres de l orographie a l echelle sous maille'
      print*,'rad =',rad
      print*,'Long et lat entree'
      print*,(x(i),i=1,imar+1)
      print*,(y(j),j=1,jmar)
       print*,'Long et lat donnees'
      print*,(xdata(i),i=1,imdep)
      print*,(ydata(j),j=1,jmdep)

      xpi=acos(-1.)
      zdeltay=2.*xpi/float(jusn)*rad
c
c  quelques tests de dimensions:
c
      IF (imar.GT.2200 .OR. jmar.GT.1100) THEN
         PRINT*, 'imar ou jmar trop grand', imar, jmar
         CALL ABORT
      ENDIF

      IF(imdep.ne.iusn.or.jmdep.ne.jusn)then
         print *,' imdep ou jmdep mal dimensionnes:',imdep,jmdep
         call abort
      ENDIF

      IF(imar+1.gt.iim+1.or.jmar.gt.jjm+1)THEN
        print *,' imar ou jmar mal dimensionnes:',imar,jmar
        call abort
      ENDIF
c
C  Extension de la base de donnee de l'USN pour faciliter
C  les calculs ulterieurs:
c
      DO j=1,jusn
        yusn(j+1)=ydata(j)
      DO i=1,iusn
        zusn(i+iext,j+1)=entree(i,j)
        xusn(i+iext)=xdata(i)
      ENDDO
      DO i=1,iext
        zusn(i,j+1)=entree(iusn-iext+i,j)
        xusn(i)=xdata(iusn-iext+i)-2.*xpi
        zusn(iusn+iext+i,j+1)=entree(i,j)
        xusn(iusn+iext+i)=xdata(i)+2.*xpi
      ENDDO
      ENDDO

        yusn(1)=ydata(1)+(ydata(1)-ydata(2))
        yusn(jusn+2)=ydata(jusn)+(ydata(jusn)-ydata(jusn-1))
       DO i=1,iusn/2+iext
        zusn(i,1)=zusn(i+iusn/2,2)
        zusn(i+iusn/2+iext,1)=zusn(i,2)
        zusn(i,jusn+2)=zusn(i+iusn/2,jusn+1)
        zusn(i+iusn/2+iext,jusn+2)=zusn(i,jusn+1)
       ENDDO
c
c  Calcul d'une orographie filtree aux hautes latitudes
c  pour permettre des calculs plus isotropiques sur la pente
c  des montagnes
c
       DO i=1,IUSN+2*iext
       DO J=1,JUSN+2
          zusnfi(i,j)=0.0
       ENDDO
       ENDDO

      DO j=1,jusn
            ideltax=1./cos(yusn(j+1))
            ideltax=min(iusn/2-1,ideltax)
            IF(MOD(IDELTAX,2).EQ.0)THEN
              IDELTAX=IDELTAX+1
            ENDIF
            IHALPH=(IDELTAX-1)/2
c           print *,' ideltax=',ideltax
         IF(ideltax.eq.1)THEN
            DO i=1,iusn
               zusnfi(i+iext,j+1)=entree(i,j)
            ENDDO
         ELSE
            DO i=1,ihalph
               DO ii=1,i+ihalph
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(ii,j)
               ENDDO
               DO ii=ihalph-i,0,-1
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(iusn-ii,j)
               ENDDO
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)/float(ideltax)
            ENDDO
            DO i=iusn-ihalph+1,iusn
               DO ii = i-ihalph,iusn
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(ii,j)
               ENDDO
               DO ii = 1,ihalph+i-iusn
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(ii,j)
               ENDDO
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)/float(ideltax)
            ENDDO
            DO i=ihalph+1,iusn-ihalph
               DO ii=-ihalph,ihalph
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)+entree(i+ii,j)
               ENDDO
               zusnfi(i+iext,j+1)=zusnfi(i+iext,j+1)/float(ideltax)
            ENDDO
         ENDIF
            DO i=1,iext
               zusnfi(i,j+1)=zusnfi(iusn-iext+i,j+1)
               zusnfi(i+iusn+iext,j+1)=zusnfi(i,j+1)
            ENDDO
      ENDDO
c
c Calculer les limites des zones des nouveaux points
c
      a(1) = x(1) - (x(2)-x(1))/2.0
      b(1) = (x(1)+x(2))/2.0
      DO i = 2, imar-1
         a(i) = b(i-1)
         b(i) = (x(i)+x(i+1))/2.0
      ENDDO
      a(imar) = b(imar-1)
      b(imar) = x(imar) + (x(imar)-x(imar-1))/2.0

      c(1) = y(1) - (y(2)-y(1))/2.0
      d(1) = (y(1)+y(2))/2.0
      DO j = 2, jmar-1
         c(j) = d(j-1)
         d(j) = (y(j)+y(j+1))/2.0
      ENDDO
      c(jmar) = d(jmar-1)
      d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
c
c      quelques initialisations:
      print*,'OKM1'
c
      DO i = 1, imar
      DO j = 1, jmar
         weight(i,j) = 0.0
         zxtzx(i,j) = 0.0
         zytzy(i,j) = 0.0
         zxtzy(i,j) = 0.0
         ztz(i,j) = 0.0
         zmea(i,j) = 0.0
         zstd(i,j)=0.0
      ENDDO
      ENDDO
c
c  calculs des correlations de pentes sur la grille de l'USN.
c
         DO j = 2,jusn+1
         DO i = 1, iusn+2*iext
            zytzyusn(i,j)=0.0
            zxtzxusn(i,j)=0.0
            zxtzyusn(i,j)=0.0
         ENDDO
         ENDDO


         DO j = 2,jusn+1
            zdeltax=zdeltay*cos(yusn(j))
         DO i = 2, iusn+2*iext-1
            zytzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))**2/zdeltay**2
            zxtzxusn(i,j)=(zusnfi(i+1,j)-zusnfi(i-1,j))**2/zdeltax**2
            zxtzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))/zdeltay
     *                   *(zusnfi(i+1,j)-zusnfi(i-1,j))/zdeltax
         ENDDO

         ENDDO



      print*,'OK0'
c
c  sommations des differentes quantites definies precedemment
c  sur une grille du modele.
c
      zleny=xpi/float(jusn)*rad
      xincr=xpi/2./float(jusn)
       DO ii = 1, imar
       DO jj = 1, jmar
c        PRINT *,' iteration ii jj:',ii,jj
         DO j = 2,jusn+1
c         DO j = 3,jusn
            zlenx=zleny*cos(yusn(j))
            zdeltax=zdeltay*cos(yusn(j))
            zbordnor=(c(jj)-yusn(j)+xincr)*rad
            zbordsud=(yusn(j)-d(jj)+xincr)*rad
            weighy=amax1(0.,
     *             amin1(zbordnor,zbordsud,zleny))
         IF(weighy.ne.0)THEN
         DO i = 2, iusn+2*iext-1
            zbordest=(xusn(i)-a(ii)+xincr)*rad*cos(yusn(j))
            zbordoue=(b(ii)+xincr-xusn(i))*rad*cos(yusn(j))
            weighx=amax1(0.,
     *             amin1(zbordest,zbordoue,zlenx))
            IF(weighx.ne.0)THEN
            weight(ii,jj)=weight(ii,jj)+weighx*weighy
            zxtzx(ii,jj)=zxtzx(ii,jj)+zxtzxusn(i,j)*weighx*weighy
            zytzy(ii,jj)=zytzy(ii,jj)+zytzyusn(i,j)*weighx*weighy
            zxtzy(ii,jj)=zxtzy(ii,jj)+zxtzyusn(i,j)*weighx*weighy
            ztz(ii,jj)  =ztz(ii,jj)  +zusn(i,j)*zusn(i,j)*weighx*weighy
            zmea(ii,jj) =zmea(ii,jj)+zusn(i,j)*weighx*weighy
            ENDIF
         ENDDO
         ENDIF
         ENDDO
       ENDDO
       ENDDO
c
c  calculs des differents parametres necessaires au programme
c  de parametrisation de l'orographie a l'echelle moyenne:
c
      zmaxmea=0.
      zmaxstd=0.
      zmaxsig=0.
      zmaxgam=0.
      zmaxthe=0.
      zminthe=0.
c     print 100,' '
c100  format(1X,A1,'II JJ',4X,'H',8X,'SD',8X,'SI',3X,'GA',3X,'TH')
       print*,'OK1'
       DO ii = 1, imar
       DO jj = 1, jmar
c       print*,'ok0'
         IF (weight(ii,jj) .NE. 0.0) THEN
c  Orography moyenne:
c         print*,'ok1'
           zmea (ii,jj)=zmea (ii,jj)/weight(ii,jj)
           zxtzx(ii,jj)=zxtzx(ii,jj)/weight(ii,jj)
           zytzy(ii,jj)=zytzy(ii,jj)/weight(ii,jj)
           zxtzy(ii,jj)=zxtzy(ii,jj)/weight(ii,jj)
           ztz(ii,jj)  =ztz(ii,jj)/weight(ii,jj)
c         print*,'ok2'
c  Deviation standard:
           zstd(ii,jj)=sqrt(amax1(0.,ztz(ii,jj)-zmea(ii,jj)**2))
c  Coefficients K, L et M:
           xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2.
           xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2.
           xm=zxtzy(ii,jj)
           xp=xk-sqrt(xl**2+xm**2)
           xq=xk+sqrt(xl**2+xm**2)
           xw=1.e-8
           if(xp.le.xw) xp=0.
           if(xq.le.xw) xq=xw
           if(abs(xm).le.xw) xm=xw*sign(1.,xm)
c          print*,'ok3'
c pente:
           zsig(ii,jj)=sqrt(xq)
c           zsig(ii,jj)=sqrt(2.*xk)
c isotropy:
           zgam(ii,jj)=xp/xq
c angle theta:
           zthe(ii,jj)=57.29577951*atan2(xm,xl)/2.

c          print 101,ii,jj,
c    *           zmea(ii,jj),zstd(ii,jj),zsig(ii,jj),zgam(ii,jj),
c    *           zthe(ii,jj)
c101  format(1x,2(1x,i2),2(1x,f7.1),1x,f7.4,2x,f4.2,1x,f5.1)
c          print*,'ok4'
         ELSE
c           PRINT*, 'probleme,ii,jj=', ii,jj
c          print*,'ok1b'
         ENDIF
      zmaxmea=amax1(zmea(ii,jj),zmaxmea)
c         print*,'oka'
      zmaxstd=amax1(zstd(ii,jj),zmaxstd)
c         print*,'okb'
      zmaxsig=amax1(zsig(ii,jj),zmaxsig)
c         print*,'okc'
      zmaxgam=amax1(zgam(ii,jj),zmaxgam)
c         print*,'okd'
      zmaxthe=amax1(zthe(ii,jj),zmaxthe)
c         print*,'oke'
      zminthe=amin1(zthe(ii,jj),zminthe)
c      print*,'ok5'
       ENDDO
       ENDDO

      print *,'  MEAN ORO:',zmaxmea
        print *,'  ST. DEV.:',zmaxstd
      print *,'  PENTE:',zmaxsig
      print *,' ANISOTROP:',zmaxgam
      print *,'  ANGLE:',zminthe,zmaxthe	

C
c  On passe ce donnees sur la grille dite physique....(?)
c  On met gamma et theta a 1. et 0. aux poles ou ces quantites
c  n'ont pas vraiment de sens
c
      DO jj=1,jmar
      zmea(imar+1,jj)=zmea(1,jj)
      zstd(imar+1,jj)=zstd(1,jj)
      zsig(imar+1,jj)=zsig(1,jj)
      zgam(imar+1,jj)=zgam(1,jj)
      zthe(imar+1,jj)=zthe(1,jj)
      ENDDO


      zmeanor=0.0
      zmeasud=0.0
      zstdnor=0.0
      zstdsud=0.0
      zsignor=0.0
      zsigsud=0.0
      zweinor=0.0
      zweisud=0.0

      DO ii=1,imar
      zweinor=zweinor+              weight(ii,   1)
      zweisud=zweisud+              weight(ii,jmar)
      zmeanor=zmeanor+zmea(ii,   1)*weight(ii,   1)
      zmeasud=zmeasud+zmea(ii,jmar)*weight(ii,jmar)
      zstdnor=zstdnor+zstd(ii,   1)*weight(ii,   1)
      zstdsud=zstdsud+zstd(ii,jmar)*weight(ii,jmar)
      zsignor=zsignor+zsig(ii,   1)*weight(ii,   1)
      zsigsud=zsigsud+zsig(ii,jmar)*weight(ii,jmar)
      ENDDO

      DO ii=1,imar+1
      zmea(ii,   1)=zmeanor/zweinor
      zmea(ii,jmar)=zmeasud/zweisud
      zstd(ii,   1)=zstdnor/zweinor
      zstd(ii,jmar)=zstdsud/zweisud
      zsig(ii,   1)=zsignor/zweinor
      zsig(ii,jmar)=zsigsud/zweisud
      zgam(ii,   1)=1.
      zgam(ii,jmar)=1.
      zthe(ii,   1)=0.
      zthe(ii,jmar)=0.
      ENDDO


      RETURN
      END