SURFEX v8.1
General documentation of Surfex
decf10.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Interface to thread-safe FA
3 FUNCTION decf10 &
4 & (kgrib, kleng, kdecal, &
5 & kfaori, kfamod, knbimo)
6 USE parkind1, ONLY : jprb
7 USE yomhook , ONLY : lhook, dr_hook
9 IMPLICIT NONE
10 !****
11 ! Fonction "DECF10"
12 !
13 ! But.
14 ! ---
15 !
16 ! Effectuer dans un message GRIB au niveau d'edition 1 le decalage
17 ! (en valeur) du descripteur "facteur d'echelle decimal".
18 !
19 !
20 !** Interface.
21 ! ----------
22 !
23 !
24 ! Arguments d'appel:
25 !
26 ! KGRIB (Entree+ ===> Tableau receptacle pour le message GRIB
27 ! Sortie)
28 ! KLENG (Entree) ===> Longueur utile (mots) de KGRIB
29 ! KDECAL (Entree) ===> DECALage (additif) a effectuer sur la valeur
30 ! courante du facteur d'echelle decimal.
31 ! KFAORI (Sortie) ===> FActeur decimal d'ORIgine
32 ! KFAMOD (Sortie) ===> FActeur decimal MODifie
33 ! KNBIMO (Entree) ===> Nombre de BIts par mot (entier)
34 !
35 ! Le code-retour de la fonction est:
36 !
37 ! 0 si tout s'est bien passe
38 ! -1 si KGRIB ne commence pas par un entete GRIB
39 ! -2 si l'edition du GRIB ne convient pas
40 ! >0 code-retour (erreur) INXBIT
41 !
42 !
43 ! Methode.
44 ! --------
45 !
46 ! Verifie le niveau d'edition du message GRIB, decode le facteur
47 ! d'echelle decimal courant, y ajoute KDECAL, et remplace la valeur
48 ! par insertion dans le message.
49 !
50 !
51 ! Sous-programmes/fonctions externes utilises.
52 ! --------------------------------------------
53 !
54 ! INXBIT - INsertion d'une chaine binaire
55 !
56 ! Reference.
57 ! ----------
58 !
59 ! Aucune.
60 !
61 !
62 ! Commentaires.
63 ! -------------
64 !
65 ! Cettte fonction a ete developpee dans le cadre du pretraitement de
66 ! modeles etrangers arrivant sous forme de fichiers, pour DIAPASON
67 ! et SYNERGIE. Mais elle n'en depend pas vraiment, et peut donc
68 ! etre reutilisee dans un autre contexte.
69 !
70 ! Dans sa mouture initiale, seule l'edition 1 de GRIB est geree.
71 !
72 ! On utilise une primitive de bas niveau de la bibliotheque
73 ! "emos" du CEPMMT.
74 !
75 ! La convention de codage du signe du facteur d'echelle est
76 ! explicitement geree par la fonction courante.
77 !
78 !
79 ! Auteur.
80 ! -------
81 !
82 ! J. Clochard, Meteo France, DSI/OP/D - Juin 2001.
83 !
84 !
85 ! Modifications.
86 ! --------------
87 !
88 ! Aucune.
89 !
90 !
91 !
92 ! Constantes symboliques.
93 !
94 ! Signification des PARAMETER "locaux" au sous-programme :
95 !
96 ! JPDGRB => Nombre d'octets a decoder pour controler le message GRIB
97 ! JPGRIB => Nombre d'octets a decoder pour controler l'entete GRIB
98 !
99 INTEGER (KIND=JPLIKB) DECF10
100 !
101 INTEGER JPDGRB, JPGRIB
102 !
103 parameter( jpdgrb = 8, jpgrib = 4 )
104 !
105 ! Arguments d'appel.
106 !
107 INTEGER (KIND=JPLIKB) KLENG, KDECAL, KFAORI, KFAMOD, KNBIMO
108 !
109 INTEGER KGRIB (kleng)
110 !
111 ! Variables locales.
112 !
113 INTEGER IAUXIL, IREPON, J, IDECAL, ILODES, IPIVOT, IFACOD, IFAC10
114 !
115 INTEGER IDGRIB (jpdgrb)
116 INTEGER ILENG, INBIMO
117 !
118 ! Caracteres G, R, I, B en code CCITT IA-5
119 !
120 INTEGER, PARAMETER :: IBLOCD (jpgrib) = (/ 71, 82, 73, 66 /)
121 !
122 CHARACTER(LEN=1) CLOPER
123 !**
124 ! 1. - INITIALISATIONS ET CONTROLES.
125 !-----------------------------------------------------------------------
126 !
127 REAL(KIND=JPRB) :: ZHOOK_HANDLE
128 IF (lhook) CALL dr_hook('DECF10',0,zhook_handle)
129 irepon = 0
130 kfaori = -9999
131 kfamod = kfaori
132 ileng = int(kleng, jplikm)
133 inbimo = int(knbimo, jplikm)
134 !
135 IF ( kdecal .EQ. 0 ) THEN
136 !
137  GO TO 900
138 !
139 ENDIF
140 !
141 ! Deocdage des premiers octets du message GRIB.
142 !
143 cloper = 'D'
144 idecal = 0
145 iauxil = jpdgrb
146 ilodes = 8
147 !
148 CALL inxbit( kgrib, ileng, idecal, idgrib, iauxil, inbimo, &
149 & ilodes, cloper, irepon )
150 !
151 IF ( irepon .NE. 0 ) THEN
152 !
153  GO TO 900
154 !
155 ENDIF
156 !
157 ! KGRIB commence-t-il bien par les 4 lettres GRIB ?
158 !
159 DO j = 1, jpgrib
160 !
161  IF( idgrib(j) .NE. iblocd(j) ) THEN
162 !
163  irepon = -1
164 !
165  GO TO 900
166 !
167  ENDIF
168 !
169 ENDDO
170 !
171 ! Controle du niveau d'edition de GRIB.
172 !
173 IF( idgrib(jpdgrb) .NE. 1 ) THEN
174 !
175  irepon = -2
176 !
177  GO TO 900
178 !
179 ENDIF
180 !
181 idecal = (8+26)*8
182 iauxil = 1
183 ilodes = 16
184 ipivot = 2**15
185 !**
186 ! 2. - DECODAGE DU FACTEUR D'ECHELLE DECIMAL COURANT.
187 !-----------------------------------------------------------------------
188 !
189 !
190 CALL inxbit( kgrib, ileng, idecal, ifacod, iauxil, inbimo, &
191 & ilodes, cloper, irepon )
192 idecal = idecal-ilodes*iauxil
193 !
194 IF ( irepon .NE. 0 ) THEN
195 !
196  GO TO 900
197 !
198 ELSEIF ( ifacod .LE. ipivot ) THEN
199 !
200  ifac10 = ifacod
201 !
202 ELSE
203 !
204  ifac10 = ipivot-ifacod
205 !
206 ENDIF
207 !
208 kfaori = int(ifac10, jplikb)
209 !**
210 ! 3. - MODIFICATION DU FACTEUR D'ECHELLE DECIMAL COURANT.
211 !-----------------------------------------------------------------------
212 !
213 !
214 ifac10 = ifac10+ int(kdecal, jplikm)
215 kfamod = int(ifac10, jplikb)
216 cloper = 'C'
217 !
218 IF ( ifac10 .GE. 0 ) THEN
219 !
220  ifacod = ifac10
221 !
222 ELSE
223 !
224  ifacod = ipivot-ifac10
225 !
226 ENDIF
227 !
228 CALL inxbit( kgrib, ileng, idecal, ifacod, iauxil, inbimo, &
229 & ilodes, cloper, irepon )
230 !**
231 ! 9. - MESSAGERIE EVENTUELLE, RETOUR A L'APPLICATIF APPELANT.
232 !-----------------------------------------------------------------------
233 !
234 900 CONTINUE
235 !
236 decf10 = int(irepon, jplikb)
237 !
238 IF (lhook) CALL dr_hook('DECF10',1,zhook_handle)
239 END FUNCTION decf10
integer, parameter jplikb
integer(kind=jplikb) function decf10(KGRIB, KLENG, KDECAL, KFAORI, KFAMOD, KNBIMO)
Definition: decf10.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
integer, parameter jplikm