      SUBROUTINE FAISC2 ( KREP, KRANGC )
#include "facom0.h"
C****
C      Ce sous-programme initialise des tableaux "reference" de
C      l'en-tete GRIB, section 2: les differents types de grille
C      sont abordes (routine appelee une seule fois pour un cadre donne)
C**
C    Arguments : KREP   (Sortie) ==> Code-reponse du sous-programme;
C                KRANGC (Entree) ==> Rang dans la table des cadres;
C*
C
      USE FAMODU   , ONLY : NSEC2SP    ,NSEC2GG    ,NSEC2LL
     S                     ,NSEC2AL    ,NSEC2LA    ,XSEC2      ,NOMPAR
C
#include "precision.h"
C
#include "facomp.h"
#include "facom1.h"
C
      INTEGER KREP, KRANGC
C
      REAL ZPI, ZRAMDE, ZLATPRE, ZLATDER, ZLONPRE, ZLONDER
      REAL (KIND=JPDBLR), PARAMETER :: ONE = 1.0
C
      INTEGER INLAT, INIVAU, INUMER, INIMES
C
      LOGICAL LLMLAM
C
#include "facom2.h"
C**
C     0.  -  INITIALISATIONS PREALABLES
C-----------------------------------------------------------------------
C
      KREP=0
      IF (KRANGC.LE.0.OR.KRANGC.GT.JPNXCA) THEN
        KREP=-66
        GOTO 1001
      ENDIF
      INLAT  = NLATIT(KRANGC)
      INIVAU = NNIVER(KRANGC)
      LLMLAM = LIMLAM(KRANGC)
      ZPI = 2.*ASIN(1.)
C Conversion des radians en 1/1000 de degre
      ZRAMDE = 180000./ZPI
C
      IF (LLMLAM) GOTO 300
C**
C     1.  -  KSEC2 POUR LA REPRESENTATION SPECTRALE ARPEGE
C-----------------------------------------------------------------------
C
C Type de representation de donnees
C
C SSLAPO=sinus latitude du pole d'interet
C (si=1, pole=pole N et pas de rotation)
C SCODIL=coeff de dilation (si =1, pas de dilatation)
      IF ((1.-SSLAPO(KRANGC)).LE.1.E-10) THEN
        NSEC2SP(1,KRANGC)=70
        IF (ABS(SCODIL(KRANGC)-1.).LE.1.E-10) THEN
          NSEC2SP(1,KRANGC)=50
        ENDIF
      ELSE
        NSEC2SP(1,KRANGC)=80
        IF (ABS(SCODIL(KRANGC)-1.).LE.1.E-10) THEN
          NSEC2SP(1,KRANGC)=60
        ENDIF
      ENDIF
C Troncature (3 fois la meme si triangulaire)
      NSEC2SP(2,KRANGC) =MTRONC(KRANGC)
      NSEC2SP(3,KRANGC) =MTRONC(KRANGC)
      NSEC2SP(4,KRANGC) =MTRONC(KRANGC)
C Type de representation
      NSEC2SP(5,KRANGC) =1
C Mode de representation (2->complex packing)
      NSEC2SP(6,KRANGC) =2
C Reserves
      NSEC2SP(7:11,KRANGC)=0
C Nb de parametres pour la coord verticale
C On prend ici le cas de la coordonnee hybride
C mais le cas de la coord pression sera aisement
C pris en compte + tard (KSEC2(12)=0).
      NSEC2SP(12,KRANGC)=2*(INIVAU+1)
C Latitude du pole sud de rotation
      NSEC2SP(13,KRANGC)=0
C Longitude du pole sud de rotation
      NSEC2SP(14,KRANGC)=0
C Lat et lon du pole d'etirement
      IF (NTYPTR(KRANGC).GE.2) THEN
        NSEC2SP(15,KRANGC)=ZRAMDE*ASIN(SSLAPO(KRANGC))
        NSEC2SP(16,KRANGC)=ZRAMDE*
     S    (SIGN(ONE,SSLOPO(KRANGC))*ACOS(SCLOPO(KRANGC)))
      ELSE
        NSEC2SP(15,KRANGC)=0
        NSEC2SP(16,KRANGC)=0
      ENDIF
C Reserves
      NSEC2SP(17:22,KRANGC)=0
C**
C     2.  -  KSEC2 POUR LA GRILLE DE GAUSS (ARPEGE)
C-----------------------------------------------------------------------
C
C Type de representation de donnees
C
C SSLAPO=sinus latitude du pole d'interet
C (si=1, pole=pole N et pas de rotation)
C SCODIL=coeff de dilation (si =1, pas de dilatation)
      IF ((1.-SSLAPO(KRANGC)).LE.1.E-10) THEN
        NSEC2GG(1,KRANGC)=24
        IF (ABS(SCODIL(KRANGC)-1.).LE.1.E-10) THEN
          NSEC2GG(1,KRANGC)=4
        ENDIF
      ELSE
        NSEC2GG(1,KRANGC)=34
        IF (ABS(SCODIL(KRANGC)-1.).LE.1.E-10) THEN
          NSEC2GG(1,KRANGC)=14
        ENDIF
      ENDIF
C Nb de pts sur un parallele
      NSEC2GG(2,KRANGC)=NXLOPA(KRANGC)
C Nb de pts sur une longitude
      NSEC2GG(3,KRANGC)=INLAT
      ZLATPRE=ASIN(MAX(-1.,MIN(1.,SINLAT(1,KRANGC))))
C Latitude (1/1000 degre) du premier pt de grille
      NSEC2GG(4,KRANGC)=ZRAMDE*ZLATPRE
C Longitude (1/1000 degre) du premier pt de grille
      NSEC2GG(5,KRANGC)=0
C Flag pour la resolution (0->on ne donne pas l'increment)
      NSEC2GG(6,KRANGC)=0
C Latitude (1/1000 degre) du dernier pt de grille
      NSEC2GG(7,KRANGC)=-NSEC2GG(4,KRANGC)
C Longitude (1/1000 degre) du dernier pt de grille.
C (NLOPAR(1,KRANGC)=nb de longitudes sur le 1er parallele)
      NSEC2GG(8,KRANGC)=-360000/NLOPAR(1,KRANGC)
C Increment zonal (1/1000 degre)
C Pas de sens ici.
      NSEC2GG(9,KRANGC)=0
C Nb de paralleles entre le pole et l'equateur
      NSEC2GG(10,KRANGC)=(INLAT+1)/2
C Flag pour le mode de balayage
      NSEC2GG(11,KRANGC)=0
C Nombre de parametres pour la coord. verticale
      NSEC2GG(12,KRANGC)=0
C Latitude du pole sud de rotation
      NSEC2GG(13,KRANGC)=0
C Longitude du pole sud de rotation
      NSEC2GG(14,KRANGC)=0
C Latitude et longitude du pole d'etirement
      IF (NTYPTR(KRANGC).GE.2) THEN
        NSEC2GG(15,KRANGC)=ZRAMDE*ASIN(SSLAPO(KRANGC))
        NSEC2GG(16,KRANGC)=ZRAMDE*
     S     (SIGN(ONE,SSLOPO(KRANGC))*ACOS(SCLOPO(KRANGC)))
      ELSE
        NSEC2GG(15,KRANGC)=0
        NSEC2GG(16,KRANGC)=0
      ENDIF
C Flag:      0 -> grille reguliere,  1 -> grille reduite
      IF (NLOPAR(1,KRANGC)==NLOPAR((1+INLAT)/2,KRANGC)) THEN
        NSEC2GG(17,KRANGC)=0
      ELSE
        NSEC2GG(17,KRANGC)=1
      ENDIF
C Flag:      0 -> Terre ronde     , 64 -> Terre ellipsoide
      NSEC2GG(18,KRANGC)=0
C Flag sur les composantes des vecteurs (0->geographique, 8->grille)
      NSEC2GG(19,KRANGC)=0
C Reserves
      NSEC2GG(20:22,KRANGC)=0
C Pour les grilles reduites, nb de points sur chaque parallele
      NSEC2GG(23:22+(1+INLAT)/2,KRANGC)=NLOPAR(1:(1+INLAT)/2,KRANGC)
      NSEC2GG(23-MOD(INLAT,2)+(1+INLAT)/2:22+INLAT,KRANGC)=
     S                               NLOPAR((1+INLAT)/2:1:-1,KRANGC)
      GOTO 600
C**
C     3.  -  KSEC2 POUR LA GRILLE LAT-LON (CAS FULL-POS, ARPEGE OU ALADIN)
C-------------------------------------------------------------------------
C
300   CONTINUE
C TEST POUR NEW EGGX
      IF (SINLAT(1,KRANGC) .GE. 0) THEN
C OLD EGGX
      ZLATPRE=SINLAT(7,KRANGC)
      ZLONPRE=SINLAT(4,KRANGC)
      ZLATDER=SINLAT(5,KRANGC)
      ZLONDER=SINLAT(6,KRANGC)
C Type de representation de donnees
      ELSE
C NEW EGGX
      ZLATPRE=SINLAT(16,KRANGC)
      ZLONPRE=SINLAT(13,KRANGC)
      ZLATDER=SINLAT(14,KRANGC)
      ZLONDER=SINLAT(15,KRANGC)
      ENDIF
C
C Type de representation de donnees
      NSEC2LL(1,KRANGC)=0
C Nb de pts sur un parallele
      NSEC2LL(2,KRANGC)=NXLOPA(KRANGC)
C Nb de pts sur une longitude
      NSEC2LL(3,KRANGC)=INLAT
C Latitude (1/1000 degre) du premier pt de grille
      NSEC2LL(4,KRANGC)=NINT(ZRAMDE*ZLATPRE)
C Longitude (1/1000 degre) du premier pt de grille
      NSEC2LL(5,KRANGC)=NINT(ZRAMDE*ZLONPRE)
      IF (NSEC2LL(5,KRANGC).GT.180000)
     S                      NSEC2LL(5,KRANGC)=NSEC2LL(5,KRANGC)-360000
C Flag pour la resolution (128->on donne l'increment: grille reguliere)
      NSEC2LL(6,KRANGC)=128
C Latitude (1/1000 degre) du dernier pt de grille
      NSEC2LL(7,KRANGC)=NINT(ZRAMDE*ZLATDER)
C Longitude (1/1000 degre) du dernier pt de grille
      NSEC2LL(8,KRANGC)=NINT(ZRAMDE*ZLONDER)
      IF (NSEC2LL(8,KRANGC).GT.180000)
     S                      NSEC2LL(8,KRANGC)=NSEC2LL(8,KRANGC)-360000
C Increment zonal (1/1000 degre)
      IF (ZLONPRE.GT.ZLONDER) THEN
        NSEC2LL(9,KRANGC)=
     S        NINT((ZLONDER+2.*ZPI-ZLONPRE)*ZRAMDE/(NXLOPA(KRANGC)-1))
      ELSE
        NSEC2LL(9,KRANGC)=
     S        NINT((ZLONDER-ZLONPRE)*ZRAMDE/(NXLOPA(KRANGC)-1))
      ENDIF
C Increment meridien (1/1000 degre)
      NSEC2LL(10,KRANGC)=
     S          NINT((ZLATPRE-ZLATDER)*ZRAMDE/(INLAT-1))
C Flag pour le mode de balayage: W->E et S->N = 64; W->E et N->S = 0
C Full-Pos produit des champs lat-lon ranges S->N pour ARP et ALD.
C Or la BDAP attend un rangt N->S pour les grilles lat-lon.
C FA renverse donc les champs issus de Full-Pos avant codage GRIBEX.
C 
      NSEC2LL(11,KRANGC)=0
C Nombre de parametres pour la coord. verticale
      NSEC2LL(12,KRANGC)=0
C Latitude du pole sud de rotation
      NSEC2LL(13,KRANGC)=0
C Longitude du pole sud de rotation
      NSEC2LL(14,KRANGC)=0
C Latitude et longitude du pole d'etirement
      NSEC2LL(15,KRANGC)=0
      NSEC2LL(16,KRANGC)=0
C Flag:      0 -> grille reguliere,  1 -> grille reduite
      NSEC2LL(17,KRANGC)=0
C Flag:      0 -> Terre ronde     , 64 -> Terre ellipsoide
      NSEC2LL(18,KRANGC)=0
C Flag sur les composantes des vecteurs (0->geographique, 8->grille)
      NSEC2LL(19,KRANGC)=0
C Reserves
      NSEC2LL(20:22,KRANGC)=0
C**
C     4.  -  KSEC2 POUR LA GRILLE LAT-LON QUASI-REGULIERE ALADIN
C            (en fait, tenue de camouflage pour les coeff spectraux
C             que l'on va ranger en balayant le 1/4 de l'ellipse
C             verticalement: axe X=axe n (nb d'onde meridien) et
C             axe Y=axe m (nb d'onde zonal) afin de suivre le rangt
C             dans le modele. Seuls les coeff spectraux qui seront
C             compactes sont stockes sur la grille lat-lon, soit
C             tous sauf ceux des axes et ceux inclus dans le carre
C             delimite par la ss-tronc de non-compactage).
C-----------------------------------------------------------------------
C
C Type de representation de donnees
      NSEC2AL(1,KRANGC)=0
C Nb de pts sur un parallele: valeur manquante
      NSEC2AL(2,KRANGC)=2**16 -1
C Nb de pts sur une longitude: nombre d'onde zonal max -1
C associe au nombre d'onde meridien 1 (les CSP sur les axes sont
C extraits des champs de CSP puisque non compactes)
      NSEC2AL(3,KRANGC)=(NOZPAR(6,KRANGC)-NOZPAR(5,KRANGC)+1)/4 -1
C Latitude (1/1000 degre) du premier pt de grille: valeur bidon
      NSEC2AL(4,KRANGC)=0
C Longitude (1/1000 degre) du premier pt de grille: valeur bidon
      NSEC2AL(5,KRANGC)=0
C Flag pour la resolution (128->on donne l'increment: grille reguliere)
      NSEC2AL(6,KRANGC)=0
C Latitude (1/1000 degre) du dernier pt de grille: valeur bidon
      NSEC2AL(7,KRANGC)=40000
C Longitude (1/1000 degre) du dernier pt de grille: valeur bidon
      NSEC2AL(8,KRANGC)=40000
C Increment zonal (1/1000 degre)
      NSEC2AL(9,KRANGC)=2**16 -1
C Increment meridien (1/1000 degre): deduit des valeurs bidon
      NSEC2AL(10,KRANGC)=(NSEC2AL(7,KRANGC)-NSEC2AL(4,KRANGC))/
     S                   (NSEC2AL(3,KRANGC)-1)
C Flag pour le mode de balayage
      NSEC2AL(11,KRANGC)=0
C Nombre de parametres pour la coord. verticale
      NSEC2AL(12,KRANGC)=0
C Latitude du pole sud de rotation
      NSEC2AL(13,KRANGC)=0
C Longitude du pole sud de rotation
      NSEC2AL(14,KRANGC)=0
C Latitude et longitude du pole d'etirement
      NSEC2AL(15,KRANGC)=0
      NSEC2AL(16,KRANGC)=0
C Flag:      0 -> grille reguliere,  1 -> grille reduite
      NSEC2AL(17,KRANGC)=1
C Flag:      0 -> Terre ronde     , 64 -> Terre ellipsoide
      NSEC2AL(18,KRANGC)=0
C Flag sur les composantes des vecteurs (0->geographique, 8->grille)
      NSEC2AL(19,KRANGC)=0
C Reserves
      NSEC2AL(20:22,KRANGC)=0
C Les valeurs (22+1:22+MTRONC(KRANGC)-1) representant les nb de pts
C le long de chaque parallele (ici, le nb de coeff spectraux
C pour un meme n (et -n), excepte le triangle et les axes non
C compactes) dependent de la ss-troncature qui depend du fichier
C et ne seront donc pas stockes dans le tableau NSEC2AL qui
C depend du cadre. Le tableau NSC2ALF(JPXTRO-1,JPNXFA) les
C contiendra.
C
C**
C     5.  -  KSEC2 POUR LA GRILLE LAMBERT CONFORME (CAS GENERAL ALADIN)
C-------------------------------------------------------------------------
C
C Type de representation de donnees
      NSEC2LA(1,KRANGC)=3
C Nb de pts sur un parallele
      NSEC2LA(2,KRANGC)=NXLOPA(KRANGC)
C Nb de pts sur une longitude
      NSEC2LA(3,KRANGC)=INLAT
C
C Les parametres communs sont regroupes
C Flag pour la resolution (128->on donne l'increment: grille reguliere)
      NSEC2LA(6,KRANGC)=128
C Reserve
      NSEC2LA(8,KRANGC)=0
C Flag pour le mode de balayage: W->E et S->N = 64; W->E et N->S = 0
      NSEC2LA(11,KRANGC)=64
C Nombre de parametres pour la coord. verticale
      NSEC2LA(12,KRANGC)=0
C Latitude (1/1000 degre) du premier pt de grille
      NSEC2LA(4,KRANGC)=NINT(ZRAMDE*ZLATPRE)
C Longitude (1/1000 degre) du premier pt de grille
      NSEC2LA(5,KRANGC)=NINT(ZRAMDE*ZLONPRE)
      IF (NSEC2LA(5,KRANGC).GT.180000)
     S                      NSEC2LA(5,KRANGC)=NSEC2LA(5,KRANGC)-360000
C
C TEST POUR OLD/NEW EGGX
      IF (SINLAT(1,KRANGC) .GE. 0) THEN
C Old EGGX
C Orientation de la grille
      NSEC2LA(7,KRANGC)=NINT(ZRAMDE*SINLAT(8,KRANGC))
      IF (NSEC2LA(7,KRANGC).GT.180000)
     S                      NSEC2LA(7,KRANGC)=NSEC2LA(7,KRANGC)-360000
C Dimension de la maille dans la direction X
      NSEC2LA(9,KRANGC)=NINT(SINLAT(15,KRANGC))
C Dimension de la maille dans la direction Y
      NSEC2LA(10,KRANGC)=NINT(SINLAT(16,KRANGC))
C Flag pour le centre de projection
C (0: le pole Nord est sur le plan de projection
C  et 1 seul centre de projection est utilise;
C  128: idem sauf que c'est le pole Sud)
      IF (SINLAT(9,KRANGC).GE.0) THEN
        NSEC2LA(13,KRANGC)=0
      ELSE
        NSEC2LA(13,KRANGC)=128
      ENDIF
C Premiere latitude depuis le pole ou le cone coupe la sphere
      NSEC2LA(14,KRANGC)=NINT(ZRAMDE*SINLAT(9,KRANGC))
C Deuxieme latitude depuis le pole ou le cone coupe la sphere
C Dans Aladin, le plan de projection est rarement secant (cela
C releve plus d'un domaine mal defini que d'un choix) et cette
C possibilite va disparaitre bientot. Comme le calcul de cette
C seconde latitude n'est pas aise (pb de convergence), on va
C declarer la grille tangente! mais avec un WARNING...
      NSEC2LA(15,KRANGC)=NSEC2LA(14,KRANGC)
      IF (ABS(SINLAT(10,KRANGC)-SIN(SINLAT(9,KRANGC))).GT.1.E-10 
     S    .AND. LFAMOP) THEN
        PRINT *,' FAISC2: WARNING !! La grille Lambert coupe en fait',
     S          ' la sphere, mais sera consideree comme tangente'
      ENDIF
      ELSE
C NEW EGGX
C Orientation de la grille
      NSEC2LA(7,KRANGC)=NINT(ZRAMDE*SINLAT(3,KRANGC))
      IF (NSEC2LA(7,KRANGC).GT.180000)
     S                      NSEC2LA(7,KRANGC)=NSEC2LA(7,KRANGC)-360000
C Dimension de la maille dans la direction X
      NSEC2LA(9,KRANGC)=NINT(SINLAT(7,KRANGC))
C Dimension de la maille dans la direction Y
      NSEC2LA(10,KRANGC)=NINT(SINLAT(8,KRANGC))
C Flag pour le centre de projection
C (0: le pole Nord est sur le plan de projection
C  et 1 seul centre de projection est utilise;
C  128: idem sauf que c'est le pole Sud)
      IF (SINLAT(4,KRANGC).GE.0) THEN
        NSEC2LA(13,KRANGC)=0
      ELSE
        NSEC2LA(13,KRANGC)=128
      ENDIF
C Premiere latitude depuis le pole ou le cone coupe la sphere
      NSEC2LA(14,KRANGC)=NINT(ZRAMDE*SINLAT(4,KRANGC))
C NEW EGGX toujours tangent
      NSEC2LA(15,KRANGC)=NSEC2LA(14,KRANGC)
      ENDIF

C Reserve
      NSEC2LA(16,KRANGC)=0
C Flag:      0 -> grille reguliere
      NSEC2LA(17,KRANGC)=0
C Flag:      0 -> Terre ronde     , 64 -> Terre ellipsoide
      NSEC2LA(18,KRANGC)=0
C Flag sur les composantes des vecteurs (0->geographique, 8->grille)
      NSEC2LA(19,KRANGC)=8
C Latitude du pole sud
      NSEC2LA(20,KRANGC)=0
C Longitude du pole sud
      NSEC2LA(21,KRANGC)=0
C Reserve
      NSEC2LA(22,KRANGC)=0
C**
C     6.  -  PARTIE REELLE DE LA SECTION 2 DE GRIBEX
C-----------------------------------------------------------------------
C
600   CONTINUE
C Angle de rotation
      XSEC2(1,KRANGC)=0.
C Coefficient d'etirement
      XSEC2(2,KRANGC)=SCODIL(KRANGC)
C Reserve
      XSEC2(3:10,KRANGC)=0.
C Parametres pour la coordonnee verticale
      XSEC2(11:11+INIVAU,KRANGC)=SFOHYB(1,0:INIVAU,KRANGC)*
     S                           SPREFE(KRANGC)
      XSEC2(12+INIVAU:12+2*INIVAU,KRANGC)=SFOHYB(2,0:INIVAU,KRANGC)
C**
C    10.  -  PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
C            VIA LE SOUS-PROGRAMME "FAIPAR" .
C-----------------------------------------------------------------------
C
 1001 CONTINUE
C
      IF (LFAMOP.OR.KREP.NE.0) THEN
        INIMES=2
        CLNSPR='FAISC2'
        INUMER=JPNIIL
C
        WRITE (UNIT=CLMESS,FMT='(''KREP='',I4,'', KRANGC='',I4)')
     S     KREP, KRANGC
        CALL FAIPAR (INUMER,INIMES,KREP,.FALSE.,CLMESS,CLNSPR,
     S               CLNSPR,.FALSE.)
      ENDIF
C
      RETURN
      END
