SURFEX v7.3
General documentation of Surfex
|
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