SURFEX v8.1
General documentation of Surfex
fadgra.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe FA
3 SUBROUTINE fadgra_fort &
4 & (fa, krep, krang, cdnoma, kvalco, klonga, &
5 & pchamp, ldcosp, cdpref, knivau, cdsuff, &
6 & ldundf, pundf)
8 USE parkind1, ONLY : jprb
9 USE yomhook , ONLY : lhook, dr_hook
10 USE lfi_precision
12 USE grib_api
13 IMPLICIT NONE
14 !****
15 ! Sous-programme INTERNE du logiciel de Fichiers ARPEGE:
16 !**
17 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
18 ! KRANG (Entree) ==> Rang de l'unite logique;
19 ! CDNOMA (Entree) ==> Nom d'article (prefabrique);
20 ! ( Tableau ) KVALCO (Entree) ==> Donnees issues de la lecture;
21 ! KLONGA (Entree) ==> Nombre de mots lus;
22 ! ( Tableau ) PCHAMP (Sortie) ==> Valeurs REELLES du champ lu;
23 ! LDCOSP (Entree) ==> Vrai si le champ est represente
24 ! par des coefficients spectraux;
25 ! CDPREF (Entree) ==> Prefixe au sens FA
26 ! KNIVAU (Entree) ==> Niveau au sens FA
27 ! CDSUFF (Entree) ==> Suffixe au sens FA
28 ! LDUNDF (Entree) ==> Si ce champ a des valeurs indefinies
29 ! alors inserer PUNDF sur les points
30 ! manquants
31 ! PUNDF (Entree) ==> Dans le cas ou LDUNDF est vrai,
32 ! valeur non definie a inserer dans le champ
33 ! LDUNDF (Sortie) ==> Vrai si ce champ a des valeurs
34 ! indefinies
35 ! PUNDF (Sortie) ==> Dans le cas ou LDUNDF est vrai (en sortie),
36 ! valeur non definie a inserer dans le champ
37 !
38 !
39 TYPE(fa_com) :: FA
40 INTEGER (KIND=JPLIKB) KREP, KRANG, KLONGA, KNIVAU
41 !
42 INTEGER (KIND=JPLIKB), TARGET :: KVALCO(klonga)
43 REAL (KIND=JPDBLR) PCHAMP(*)
44 !
45 REAL (KIND=JPDBLR) PUNDF
46 !
47 LOGICAL LDCOSP, LDUNDF, LLUNDF, LLLTLN
48 !
49 CHARACTER CDNOMA*(*), CDPREF*(*), CDSUFF*(*)
50 !
51 REAL (KIND=JPDBLR) ZUNDF
52 !
53 INTEGER (KIND=JPLIKB) ILCHAM
54 INTEGER (KIND=JPLIKB) ITRONC
55 INTEGER (KIND=JPLIKB) INIMES
56 INTEGER (KIND=JPLIKB) INUMER
57 !
58 LOGICAL LLMLAM, LLCOSP, LLMGLO
59 !
60 type(fafich), POINTER :: ylfich
61 type(facadr), POINTER :: ylcadr
62 !
63 CHARACTER, ALLOCATABLE :: CLGRIB (:)
64 !
65 REAL (KIND=JPDBLR), ALLOCATABLE :: ZCHAMP (:)
66 !
67 INTEGER (KIND=JPLIKB) ILGRIB, IRANGC
68 INTEGER (KIND=JPLIKB) JLAT, JLON, JN, IDX, J
69 INTEGER (KIND=JPLIKM) IGRIBH, IRET, IBITMAP, INDATV, IBTMP
70 CHARACTER(LEN=FA%JPLSPX) CLNSPR
71 CHARACTER(LEN=FA%JPLMES) CLMESS
72 CHARACTER(LEN=FA%JPXNOM) CLNOMU
73 !
74 INTEGER (KIND=JPLIKB) IMULTM, IMULTE
75 LOGICAL LLFATA
76 REAL (KIND=JPDBLR) ZMULTI
77 INTEGER IEDITION, IPARAM
78 LOGICAL LLLOCSEC, LLGRIB1
79 
80 !**
81 ! 1. - CONTROLES ET INITIALISATIONS.
82 !-----------------------------------------------------------------------
83 !
84 REAL(KIND=JPRB) :: ZHOOK_HANDLE
85 IF (lhook) CALL dr_hook('FADGRA_MT',0,zhook_handle)
86 
87 krep = 0
88 
89 
90 ylfich => fa%FICHIER(krang)
91 irangc = ylfich%NUCADR
92 ylcadr => fa%CADRE(irangc)
93 !
94 llmlam = ylcadr%LIMLAM
95 llltln = ylcadr%SINLAT(2) < 0 .AND. llmlam
96 llmglo = (.NOT. llltln) .AND. (.NOT. llmlam)
97 !
98 llcosp = ldcosp
99 !
100 inumer=ylfich%NULOGI
101 !
102 !**
103 ! 2. - CONTROLE DES DONNEES DE L'ARTICLE
104 !-----------------------------------------------------------------------
105 !
106 IF ((.NOT. falgra(kvalco(1))).OR. &
107 & kvalco(2).LT.0.OR.kvalco(2).GT.1) THEN
108  krep=-91
109  GOTO 1001
110 ELSE
111  llcosp=kvalco(2).EQ.1
112 ENDIF
113 !
114 IF ((llcosp.AND..NOT.ldcosp).OR.(.NOT.llcosp.AND.ldcosp)) THEN
115  krep=-92
116  GOTO 1001
117 ENDIF
118 !
119 IF (llcosp) THEN
120  IF (llmlam) THEN
121  ilcham = ylcadr%NSFLAM
122  ELSE
123  ilcham =(1+ylcadr%MTRONC)*(2+ylcadr%MTRONC)
124  ENDIF
125 ELSE
126  ilcham=ylcadr%NVAPDG
127 ENDIF
128 !
129 !**
130 ! 3. - DECODAGE GRIB_API DES DONNEES DE L'ARTICLE
131 !-----------------------------------------------------------------------
132 !
133 
134 ilgrib = (klonga-3)*8
135 
136 ALLOCATE (clgrib(ilgrib))
137 clgrib = transfer(kvalco(4:klonga), clgrib)
138 CALL grib_new_from_message_char (igribh, clgrib, status=iret)
139 DEALLOCATE (clgrib)
140 
141 CALL igrib_get_value (igribh, 'editionNumber', iedition)
142 llgrib1 = iedition == 1
143 
144 IF (llgrib1) THEN
145  CALL igrib_set_value (igribh, 'setLocalDefinition', 1)
146  lllocsec = .false.
147 ELSE
148 ! Scaling factor may be encoded in the message
149  CALL igrib_is_defined (igribh, 'grib2LocalSectionNumber', lllocsec)
150  IF (.NOT. lllocsec) THEN
151  CALL igrib_set_value (igribh, 'grib2LocalSectionPresent', 1)
152  CALL igrib_set_value (igribh, 'grib2LocalSectionNumber', 1)
153  ENDIF
154 ENDIF
155 
156 IF (.NOT. lllocsec) THEN
157 ! Restore encoding parameters if needed
158  IF (knivau > 0) THEN
159  CALL stru (cdsuff, clnomu)
160  ELSE
161  CALL stru (cdnoma, clnomu)
162  ENDIF
163  CALL igrib_set_value (igribh, 'faFieldName', trim(clnomu))
164 ENDIF
165 
166 IF (llgrib1) THEN
167  CALL igrib_get_value (igribh, 'indicatorOfParameter', iparam)
168 ELSE
169  CALL igrib_get_value (igribh, 'parameterNumber', iparam)
170 ENDIF
171 
172 IF (iparam == 255) THEN
173  WRITE (fa%NULOUT, '(" FADGRA: Field `",A,"'' is not &
174  &declared in `faFieldName.def'' and has no encoded &
175  &FMULTM and FMULTE")') trim(cdnoma)
176 ENDIF
177 
178 CALL igrib_get_value (igribh, 'FMULTM', imultm)
179 CALL igrib_get_value (igribh, 'FMULTE', imulte)
180 
181 zmulti = REAL (IMULTM, JPDBLR) * 10._JPDBLR ** IMULTE
182 
183 CALL igrib_get_value (igribh, 'bitmapPresent', ibtmp)
184 IF (ibtmp == 0) THEN
185 ! When there is not bitmap, numberOfDataPoints may be broken; in this case we
186 ! use numberOfValues
187  CALL igrib_get_value (igribh, 'numberOfValues', indatv)
188 ELSE
189 ! numberOfValues = number of non-missing values when a bitmap is present
190  CALL igrib_get_value (igribh, 'numberOfDataPoints', indatv)
191 ENDIF
192 
193 ! Basic check
194 
195 IF (indatv < ilcham) THEN
196  krep=-93
197  GOTO 1001
198 ELSEIF (indatv > ilcham) THEN
199  krep=-94
200  GOTO 1001
201 ENDIF
202 
203 IF (llltln) THEN
204 
205  ALLOCATE (zchamp(ilcham))
206  CALL igrib_get_value (igribh, 'values', zchamp(1:ilcham))
207 
208  DO jlat = 1, ylcadr%NLATIT
209  DO jlon = 1, ylcadr%NXLOPA
210  jn = jlon+ylcadr%NXLOPA*(jlat-1)
211  idx = jlon+ylcadr%NXLOPA*(ylcadr%NLATIT-jlat)
212  pchamp(jn) = zchamp(idx)
213  ENDDO
214  ENDDO
215 
216  DEALLOCATE (zchamp)
217 
218 ELSE
219  CALL igrib_get_value (igribh, 'values', pchamp(1:ilcham))
220 ENDIF
221 
222 CALL igrib_get_value (igribh, 'bitmapPresent', ibitmap)
223 llundf = ibitmap /= 0
224 
225 IF (llundf) THEN
226  CALL igrib_get_value (igribh, 'missingValue', zundf)
227 ENDIF
228 
229 CALL igrib_release (igribh)
230 
231 !
232 ! Facteur d'echelle eventuel
233 !
234 IF (zmulti /= real(1._4, jpdblr)) THEN
235  pchamp(1:ilcham) = pchamp(1:ilcham) / zmulti
236  zundf = zundf / zmulti
237 ENDIF
238 !
239 IF (ldundf .AND. llundf) THEN
240  DO j = 1, ilcham
241  IF (pchamp(j) == zundf) THEN
242  pchamp(j) = pundf
243  ENDIF
244  ENDDO
245  zundf = pundf
246 ENDIF
247 !
248 ldundf = llundf
249 pundf = zundf
250 
251 !**
252 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
253 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
254 !-----------------------------------------------------------------------
255 !
256 1001 CONTINUE
257 llfata=llmoer(krep,krang)
258 !
259 IF (fa%LFAMOP.OR.llfata) THEN
260  inimes=2
261  clnspr='FADGRA'
262  inumer=ylfich%NULOGI
263 !
264  WRITE (unit=clmess,fmt='(''KREP='',I5,'', KRANG='',I4, &
265 & '', CDNOMA='''''',A,'''''', KLONGA= '',I8, &
266 & '', LDCOSP='',L1)') &
267 & krep, krang, cdnoma, klonga, ldcosp
268  CALL faipar_fort &
269 & (fa, inumer,inimes,krep,.false.,clmess, &
270 & clnspr,cdnoma,.false.)
271 ENDIF
272 !
273 IF (lhook) CALL dr_hook('FADGRA_MT',1,zhook_handle)
274 
275 CONTAINS
276 
277 #include "facom2.llmoer.h"
278 #include "falgra.h"
279 
280 SUBROUTINE stru (CDS, CDU)
281 CHARACTER (LEN=*) :: CDS, CDU
282 INTEGER (KIND=JPLIKB) :: J
283 
284 DO j = 1, len(cdu)
285  cdu(j:j) = ' '
286 ENDDO
287 
288 DO j = 1, len_trim(cds)
289  IF (cds(j:j) == ' ') THEN
290  cdu(j:j) = '_'
291  ELSE
292  cdu(j:j) = cds(j:j)
293  ENDIF
294 ENDDO
295 
296 END SUBROUTINE stru
297 
298 END SUBROUTINE
299 
300 !INTF KREP OUT
301 !INTF KRANG IN
302 !INTF CDNOMA IN
303 !INTF KVALCO IN DIMS=* KIND=JPLIKB
304 !INTF KLONGA IN
305 !INTF PCHAMP OUT DIMS=*
306 !INTF LDCOSP IN
307 !INTF LDUNDF OUT
308 !INTF PUNDF OUT
309 
subroutine, public igrib_is_defined(KHANDLE, CDKEY, LDDEFINED, KRET)
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine fadgra_fort(FA, KREP, KRANG, CDNOMA, KVALCO, KLONGA, PCHAMP, LDCOSP, CDPREF, KNIVAU, CDSUFF, LDUNDF, PUNDF)
Definition: fadgra.F90:7
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
subroutine, public igrib_release(KHANDLE)
integer, parameter jpdblr
logical lhook
Definition: yomhook.F90:15
subroutine stru(CDS, CDU)
Definition: facgrm.F90:168
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31
real8 real
Definition: privpub.h:396