SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/FA/decf10.F
Go to the documentation of this file.
00001 C Jan-2011 P. Marguinaud Interface to thread-safe FA
00002       INTEGER FUNCTION DECF10 (  KGRIB,  KLENG, KDECAL, KFAORI, KFAMOD,
00003      X                          KNBIMO )
00004       USE PARKIND1, ONLY : JPRB
00005       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00006 C****
00007 C     Fonction "DECF10"
00008 C
00009 C     But.
00010 C     ---
00011 C
00012 C     Effectuer dans un message GRIB au niveau d'edition 1 le decalage
00013 C     (en valeur) du descripteur "facteur d'echelle decimal".
00014 C
00015 C
00016 C**   Interface.
00017 C     ----------
00018 C
00019 C
00020 C      Arguments d'appel:
00021 C
00022 C     KGRIB  (Entree+ ===> Tableau receptacle pour le message GRIB
00023 C             Sortie)
00024 C     KLENG  (Entree) ===> Longueur utile (mots) de KGRIB
00025 C     KDECAL (Entree) ===> DECALage (additif) a effectuer sur la valeur
00026 C                          courante du facteur d'echelle decimal.
00027 C     KFAORI (Sortie) ===> FActeur decimal d'ORIgine
00028 C     KFAMOD (Sortie) ===> FActeur decimal MODifie
00029 C     KNBIMO (Entree) ===> Nombre de BIts par mot (entier)
00030 C
00031 C     Le code-retour de la fonction est:
00032 C
00033 C      0 si tout s'est bien passe
00034 C     -1 si KGRIB ne commence pas par un entete GRIB
00035 C     -2 si l'edition du GRIB ne convient pas
00036 C     >0 code-retour (erreur) INXBIT
00037 C
00038 C
00039 C     Methode.
00040 C     --------
00041 C
00042 C     Verifie le niveau d'edition du message GRIB, decode le facteur
00043 C     d'echelle decimal courant, y ajoute KDECAL, et remplace la valeur
00044 C     par insertion dans le message.
00045 C
00046 C
00047 C     Sous-programmes/fonctions externes utilises.
00048 C     --------------------------------------------
00049 C
00050 C     INXBIT - INsertion d'une chaine binaire
00051 C
00052 C     Reference.
00053 C     ----------
00054 C
00055 C     Aucune.
00056 C
00057 C
00058 C     Commentaires.
00059 C     -------------
00060 C
00061 C     Cettte fonction a ete developpee dans le cadre du pretraitement de
00062 C     modeles etrangers arrivant sous forme de fichiers, pour DIAPASON
00063 C     et SYNERGIE. Mais elle n'en depend pas vraiment, et peut donc
00064 C     etre reutilisee dans un autre contexte.
00065 C
00066 C     Dans sa mouture initiale, seule l'edition 1 de GRIB est geree.
00067 C
00068 C     On utilise une primitive de bas niveau de la bibliotheque
00069 C     "emos" du CEPMMT.
00070 C
00071 C     La convention de codage du signe du facteur d'echelle est
00072 C     explicitement geree par la fonction courante.
00073 C
00074 C
00075 C     Auteur.
00076 C     -------
00077 C
00078 C     J. Clochard, Meteo France, DSI/OP/D - Juin 2001.
00079 C
00080 C
00081 C     Modifications.
00082 C     --------------
00083 C
00084 C     Aucune.
00085 C
00086 C
00087 C
00088 C     Constantes symboliques.
00089 C
00090 C     Signification des PARAMETER "locaux" au sous-programme :
00091 C
00092 C     JPDGRB => Nombre d'octets a decoder pour controler le message GRIB
00093 C     JPGRIB => Nombre d'octets a decoder pour controler l'entete GRIB
00094 C
00095       INTEGER, PARAMETER :: JPDGRB=8, JPGRIB=4
00096 C
00097 C     Arguments d'appel.
00098 C
00099       INTEGER KLENG, KDECAL, KFAORI, KFAMOD, KNBIMO
00100 C
00101       INTEGER KGRIB (KLENG)
00102 C
00103 C     Variables locales.
00104 C
00105       INTEGER IAUXIL, IREPON, J, IDECAL, ILODES, IPIVOT, IFACOD, IFAC10
00106 C
00107       INTEGER IDGRIB (JPDGRB)
00108 C
00109 C     Caracteres G, R, I, B en code CCITT IA-5
00110 C
00111       INTEGER, PARAMETER :: IBLOCD (JPGRIB) = (/ 71, 82, 73, 66 /)
00112 C
00113       CHARACTER CLOPER*1
00114 C**
00115 C     1.  -  INITIALISATIONS ET CONTROLES.
00116 C-----------------------------------------------------------------------
00117 C
00118       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00119       IF (LHOOK) CALL DR_HOOK('DECF10',0,ZHOOK_HANDLE)
00120       IREPON = 0
00121       KFAORI = -9999
00122       KFAMOD = KFAORI
00123 C
00124       IF ( KDECAL .EQ. 0 ) THEN
00125 C
00126         GO TO 900
00127 C
00128       ENDIF
00129 C
00130 C     Deocdage des premiers octets du message GRIB.
00131 C
00132       CLOPER = 'D'
00133       IDECAL = 0
00134       IAUXIL = JPDGRB
00135       ILODES = 8
00136 C
00137 C      CALL INXBIT(  KGRIB,  KLENG, IDECAL, IDGRIB, IAUXIL, KNBIMO,
00138 C     X             ILODES, CLOPER, IREPON )
00139 C
00140       IF ( IREPON .NE. 0 ) THEN
00141 C
00142         GO TO 900
00143 C
00144       ENDIF
00145 C
00146 C     KGRIB commence-t-il bien par les 4 lettres GRIB ?
00147 C
00148       DO 101 J = 1, JPGRIB
00149 C
00150         IF( IDGRIB(J) .NE. IBLOCD(J) ) THEN
00151 C
00152           IREPON = -1
00153 C
00154           GO TO 900
00155 C
00156         ENDIF
00157 C
00158   101 CONTINUE
00159 C
00160 C     Controle du niveau d'edition de GRIB.
00161 C
00162       IF( IDGRIB(JPDGRB) .NE. 1 ) THEN
00163 C
00164         IREPON = -2
00165 C
00166         GO TO 900
00167 C
00168       ENDIF
00169 C
00170       IDECAL = (8+26)*8
00171       IAUXIL = 1
00172       ILODES = 16
00173       IPIVOT = 2**15
00174 C**
00175 C     2.  -  DECODAGE DU FACTEUR D'ECHELLE DECIMAL COURANT.
00176 C-----------------------------------------------------------------------
00177 C
00178   200 CONTINUE
00179 C
00180 C      CALL INXBIT(  KGRIB,  KLENG, IDECAL, IFACOD, IAUXIL, KNBIMO,
00181 C     X             ILODES, CLOPER, IREPON )
00182       IDECAL = IDECAL-ILODES*IAUXIL
00183 C
00184       IF ( IREPON .NE. 0 ) THEN
00185 C
00186         GO TO 900
00187 C
00188       ELSEIF ( IFACOD .LE. IPIVOT ) THEN
00189 C
00190         IFAC10 = IFACOD
00191 C
00192       ELSE
00193 C
00194         IFAC10 = IPIVOT-IFACOD
00195 C
00196       ENDIF
00197 C
00198       KFAORI = IFAC10
00199 C**
00200 C     3.  -  MODIFICATION DU FACTEUR D'ECHELLE DECIMAL COURANT.
00201 C-----------------------------------------------------------------------
00202 C
00203   300 CONTINUE
00204 C
00205       IFAC10 = IFAC10+KDECAL
00206       KFAMOD = IFAC10
00207       CLOPER = 'C'
00208 C
00209       IF ( IFAC10 .GE. 0 ) THEN
00210 C
00211         IFACOD = IFAC10
00212 C
00213       ELSE
00214 C
00215         IFACOD = IPIVOT-IFAC10
00216 C
00217       ENDIF
00218 C
00219 C      CALL INXBIT(  KGRIB,  KLENG, IDECAL, IFACOD, IAUXIL, KNBIMO,
00220 C     X             ILODES, CLOPER, IREPON )
00221 C**
00222 C     9.  -  MESSAGERIE EVENTUELLE, RETOUR A L'APPLICATIF APPELANT.
00223 C-----------------------------------------------------------------------
00224 C
00225   900 CONTINUE
00226 C
00227       DECF10 = IREPON
00228 C
00229       IF (LHOOK) CALL DR_HOOK('DECF10',1,ZHOOK_HANDLE)
00230       END
00231