SURFEX v8.1
General documentation of Surfex
facodx.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 facodx_fort &
4 & (fa, krep, krang, cdpref, knivau, cdsuff, &
5 & psec4, ldcosp, kvalco, klongd, &
6 & ldundf, pundf, ydgr1tab)
8 USE parkind1, ONLY : jprb
9 USE yomhook , ONLY : lhook, dr_hook
10 USE lfi_precision
11 IMPLICIT NONE
12 !****
13 ! Sous-programme INTERNE du logiciel de Fichiers ARPEGE:
14 ! PREPARATION (codage GRIBEX) d'un CHAMP HORIZONTAL
15 ! destine a etre ecrit sur un fichier ARPEGE/ALADIN.
16 ! ( CODage d'un champ a l'aide de gribeX )
17 !**
18 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
19 ! KRANG (Entree) ==> Rang de l'unite logique;
20 ! CDPREF (Entree) ==> Prefixe eventuel du nom d'article;
21 ! KNIVAU (Entree) ==> Niveau vertical eventuel;
22 ! CDSUFF (Entree) ==> Suffixe eventuel du nom d'article;
23 ! ( Tableau ) PSEC4 (Entree) ==> Valeurs REELLES du champ a ecrire;
24 ! LDCOSP (Entree) ==> Vrai si le champ est represente
25 ! par des coefficients spectraux;
26 ! ( Tableau ) KVALCO (Sortie) ==> Donnees destinees a l'ecriture;
27 ! KLONGD (Sortie) ==> Nombre de mots a ecrire;
28 !*
29 ! En mode multi-taches, il doit y avoir verrouillage du fichier
30 ! concerne avant l'appel au sous-programme.
31 !
32 ! Modifications
33 ! -------------
34 ! R. El Ouaraini : 03-Oct-06, introduire la nouvelle geometrie pour tester ERPK
35 !
36 ! JM AUDOIN : 15 mai 2007 partie 5 changement unite
37 ! R. El Khatib 22-May-2015 : Bypass errror message in case of underflows
38 !
39 !
40 !
41 TYPE(fa_com) :: FA
42 TYPE(fagr1tab) :: YDGR1TAB
43 INTEGER (KIND=JPLIKB) KREP, KRANG, KNIVAU, KLONGD
44 !
45 INTEGER (KIND=JPLIKB) KVALCO(*)
46 REAL (KIND=JPDBLR) PSEC4(*), PUNDF, ZUNDF
47 !
48 LOGICAL LDCOSP, LDUNDF, LLUNDF
49 !
50 CHARACTER CDPREF*(*), CDSUFF*(*)
51 !
52 #include "fagribex.h"
53 !
54 REAL (KIND=JPDBLR), ALLOCATABLE :: ZSEC4(:)
55 INTEGER (KIND=JPLIKB), ALLOCATABLE :: IVALCO(:)
56 REAL (KIND=JPDBLR) :: ZMIN, ZA
57 REAL (KIND=JPDBLR) :: ZSEC2(10+2*(fa%jpxniv+1)), ZSEC3(2), ZPULAP
58 !
59 INTEGER (KIND=JPLIKB) ISEC0(2), ISEC1(fa%jpsec1)
60 INTEGER (KIND=JPLIKB) ISEC2(fa%jpsec2), ISEC3(2)
61 INTEGER (KIND=JPLIKB) ISEC4(fa%jpsec4), ILONSEC2
62 INTEGER (KIND=JPLIKB) ILENG, IWORD, IRET, JM, IPULAP
63 INTEGER (KIND=JPLIKB) ILCHAM, JN, IDECAL, ICPACK
64 INTEGER (KIND=JPLIKB) ITRONC, ILOW, IHIGH, IDIMNC, INBITS
65 INTEGER (KIND=JPLIKB) IL, IADD, IRANGC, IILCHAM, INIMES
66 INTEGER (KIND=JPLIKB) INUMER, IDX, JLAT, JLON, IDECOPT
67 INTEGER (KIND=JPLIKB) IFAORI, IFAMOD, INBIMO
68 !
69 LOGICAL LLMLAM
70 !
71 CHARACTER(LEN=1) CLOPER
72 !
73 INTRINSIC len_trim
74 !
75 CHARACTER(LEN=FA%JPXNOM) CLACTI
76 CHARACTER(LEN=FA%JPLMES) CLMESS
77 CHARACTER(LEN=FA%JPLSPX) CLNSPR
78 LOGICAL LLFATA
79 LOGICAL LLFACDE
80 
81 !**
82 ! 1. - CONTROLES ET INITIALISATIONS.
83 !-----------------------------------------------------------------------
84 !
85 REAL(KIND=JPRB) :: ZHOOK_HANDLE
86 IF (lhook) CALL dr_hook('FACODX_MT',0,zhook_handle)
87 
88 isec0 = 0
89 isec1 = 0
90 isec2 = 0
91 isec3 = 0
92 isec4 = 0
93 zsec2 = 0
94 zsec3 = 0
95 
96 llundf = ldundf
97 
98 clacti=''
99 IF (krang.LE.0.OR.krang.GT.fa%JPNXFA) THEN
100  krep=-66
101  GOTO 1001
102 ENDIF
103 icpack=fa%FICHIER(krang)%NSTROF
104 irangc=fa%FICHIER(krang)%NUCADR
105 llmlam=fa%CADRE(irangc)%LIMLAM
106 itronc=fa%CADRE(irangc)%MTRONC
107 !
108 IF (llmlam) THEN
109  IF (ldcosp) THEN
110  ilonsec2=21+fa%CADRE(irangc)%NOMPAR(2)
111  ELSE
112  ilonsec2=22
113  ENDIF
114 ELSE
115  IF (ldcosp) THEN
116  ilonsec2=22
117  ELSE
118  ilonsec2=22+fa%CADRE(irangc)%NLATIT
119  ENDIF
120 ENDIF
121 !
122 kvalco(1)=fa%FICHIER(krang)%NFGRIB
123 idecal=3
124 IF (ldcosp) THEN
125  IF (llmlam) THEN
126  ilcham=fa%CADRE(irangc)%NSFLAM
127  ELSE
128  ilcham=(1+itronc)*(2+itronc)
129  ENDIF
130  kvalco(2)=1
131  inbits=fa%FICHIER(krang)%NBFCSP
132  idecal=idecal+2
133 ELSE
134  ilcham=fa%CADRE(irangc)%NVAPDG
135  kvalco(2)=0
136  inbits=fa%FICHIER(krang)%NBFPDG
137 ENDIF
138 kvalco(3)=inbits
139 iilcham = ilcham
140 idecopt = 0
141 llfacde = fa%FICHIER(krang)%NCOGRIF(11) /= 0
142 !**
143 ! 2. - PREPARATION DU TABLEAU DE DONNEES A ECRIRE SUR LE FICHIER.
144 !-----------------------------------------------------------------------
145 !
146 ALLOCATE (zsec4(ilcham))
147 !
148 IF (ldcosp .AND. llmlam) THEN
149 !
150 ! Champ ALADIN en coefficients spectraux... traitement particulier,
151 ! car non prevu dans GRIBEX (il y sera considere comme un champ lat-lon)
152 ! mais on a la possibilite de compacter une (pseudo-)puissance de
153 ! laplacien du champ a la place du champ, de maniere a augmenter
154 ! la precision du champ en "aplanissant" le spectre.
155 !
156 ! Determination de la puissance de Laplacien (en 1/1000 ieme)
157 !
158  CALL fapula_fort &
159 & (fa, krep, krang, psec4, ipulap )
160  zpulap=REAL(ipulap,jpdblr)/1000._JPDBLR
161 ! ZPULAP=0.
162 ! IPULAP=0
163  IF (fa%LFAMOP) THEN
164  print *,'FACODX: puissance de laplacien selectionee ',zpulap, &
165 & ' pour une sous-tronc de ',icpack
166  ENDIF
167  IF (krep.NE.0) GOTO 1001
168 !
169 ! Transfert des coeff spectraux devant etre compactes de PSEC4 a ZSEC4
170 ! avec prise en compte du coefficient (n**2+m**2)**zpulap. Les coefficients
171 ! concernes sont ceux inclus dans le quart de l'ellipse, hors axes (coeff
172 ! nuls), et hors du triangle non-compacte (sous-troncature).
173  iilcham=0
174 !
175  DO jm=1,fa%CADRE(irangc)%NOMPAR(2)
176  ilow=2+2*jm+1
177  iadd=4* max(icpack+1-jm,1_jplikb )
178 !
179  DO idx=fa%CADRE(irangc)%NOMPAR(ilow)+iadd,fa%CADRE(irangc)%NOMPAR(ilow+1)
180  iilcham=iilcham+1
181  jn=(idx-fa%CADRE(irangc)%NOMPAR(ilow))/4
182  zsec4(iilcham)=psec4(idx) * &
183 & ((REAL(jn**2+jm**2, jpdblr))**zpulap)
184  ENDDO
185  ENDDO
186 
187 ! Number of elements in sub-triangle+axes:IDIMNC
188  idimnc=ilcham-iilcham
189 ! Recherche de l'amplitude et du min du champ
190  zmin = minval(zsec4(1:iilcham))
191  za = maxval(zsec4(1:iilcham)) - zmin
192 ! Recherche du facteur decimal optimal pour utiliser
193 ! au mieux les INBITS dans le codage de ce champ
194  IF (fa%LFAMOP) THEN
195  WRITE (unit=fa%NULOUT,fmt=*)'FACODX: traitement du champ: ', &
196 & cdpref,knivau,cdsuff
197  ENDIF
198  krep = 0
199  IF (llfacde) CALL facdec_fort (fa, krep, za, zmin, inbits, idecopt)
200  IF (krep.NE.0) THEN
201  krep = 0
202  ENDIF
203 ELSEIF(ldcosp .AND. .NOT.llmlam) THEN
204 !
205 ! Transfert du tableau d'entree dans un tableau local
206 ! de maniere a eviter l'ecrasement du tableau d'entree par "GRIBEX".
207 !
208  zsec4(1:iilcham) = psec4(1:iilcham)
209  idimnc=(1+icpack)*(2+icpack)
210 ELSE
211 !
212 ! CHAMPS NON SPECTRAUX: transfert du tableau d'entree dans un
213 ! tableau local de maniere a eviter son ecrasement par "GRIBEX".
214 !
215 !
216  idimnc=0
217 ! Tester si Nouvelle ou ancienne geometrie Aladin
218 IF (fa%CADRE(irangc)%SINLAT(1) .GE. 0) THEN
219  IF (llmlam .AND. fa%CADRE(irangc)%SINLAT(10).LT.0) THEN
220 ! Parametre de projection negatif, donc pas de projection:
221 ! Il s'agit d'une grille lat-lon reguliere du type Full-Pos
222 ! (pour champ ARPEGE ou Aladin). Il faut donc renverser
223 ! le champ afin de ranger Nord-Sud les valeurs plutot que Sud-Nord
224 ! (on conserve le rangt W-E consecutif).
225 ! Le but est de satisfaire la BDAP qui attend un rangt NW-->SE.
226 !
227  IF (fa%LFAMOP) THEN
228  WRITE (unit=fa%NULOUT,fmt=*) &
229 & ' FACODX: Grille LAT-LON pour BDAP -> ', &
230 & ' renversement des valeurs pour etre rangees NS'
231  ENDIF
232  DO jlat=1,fa%CADRE(irangc)%NLATIT
233  DO jlon=1,fa%CADRE(irangc)%NXLOPA
234  jn=jlon+fa%CADRE(irangc)%NXLOPA*(jlat-1)
235  idx=jlon+fa%CADRE(irangc)%NXLOPA*(fa%CADRE(irangc)%NLATIT-jlat)
236  zsec4(idx) = psec4(jn)
237  ENDDO
238  ENDDO
239  ELSE
240  zsec4(1:iilcham) = psec4(1:iilcham)
241  ENDIF
242 ELSE
243  IF (llmlam .AND. fa%CADRE(irangc)%SINLAT(2).LT.0) THEN
244  IF (fa%LFAMOP) THEN
245  WRITE (unit=fa%NULOUT,fmt=*) &
246 & ' FACODX: Grille LAT-LON pour BDAP -> ', &
247 & ' renversement des valeurs pour etre rangees NS'
248  ENDIF
249  DO jlat=1,fa%CADRE(irangc)%NLATIT
250  DO jlon=1,fa%CADRE(irangc)%NXLOPA
251  jn=jlon+fa%CADRE(irangc)%NXLOPA*(jlat-1)
252  idx=jlon+fa%CADRE(irangc)%NXLOPA*(fa%CADRE(irangc)%NLATIT-jlat)
253  zsec4(idx) = psec4(jn)
254  ENDDO
255  ENDDO
256  ELSE
257  zsec4(1:iilcham) = psec4(1:iilcham)
258  ENDIF
259 ENDIF
260 ! Recherche de l'amplitude et du min du champ
261  zmin=zsec4(1)
262  za=0._jpdblr
263  zmin = minval(zsec4(1:iilcham))
264  za = maxval(zsec4(1:iilcham)) - zmin
265 ! Recherche du facteur decimal optimal pour utiliser
266 ! au mieux les INBITS dans le codage de ce champ
267  IF (fa%LFAMOP) THEN
268  WRITE (unit=fa%NULOUT,fmt=*)'FACODX: traitement du champ: ', &
269 & cdpref,knivau,cdsuff
270  ENDIF
271  krep = 0
272  IF (llfacde) THEN
273  IF (abs(za) <= epsilon(za)) THEN
274 ! On anticipe le retour d'erreur de facdec dans le cas ou le champs est quasi-constant
275 ! (cad : son amplitude est inferieur a la precision de la machine).
276  idecopt = 0
277  krep = 0
278  ELSEIF (zmin /= 0_jpdblr .AND. abs(zmin) < epsilon(zmin)) THEN
279 ! On anticipe le retour d'erreur de facdec dans le cas ou le champ contient un "underflow"
280  idecopt = 0
281  krep = 0
282  ELSE
283  CALL facdec_fort (fa, krep, za, zmin, inbits, idecopt)
284  IF (krep.NE.0) THEN
285  WRITE (unit=fa%NULOUT,fmt=*)'FACODX: field incriminated by FACDEC was ', cdpref,knivau,cdsuff
286  idecopt = 0
287  krep = 0
288  ENDIF
289  ENDIF
290  ENDIF
291 ENDIF
292 !*
293 ! 3. - INITIALISATION DE L'ENROBAGE GRIB
294 !-----------------------------------------------------------------------
295 !
296 ! 3.1 - Sections 1, 2, 3 et 4 (sf la partie reelle pour 4)
297 !
298 CALL fainig_fort &
299 & (fa, krep, krang, cdpref, knivau, cdsuff, ldcosp, &
300 & iilcham, isec1, isec2, zsec2, isec3, zsec3, isec4,&
301 & ydgr1tab)
302 
303 IF (krep.NE.0) THEN
304  GOTO 1001
305 ENDIF
306 ! Prise en compte du facteur decimal
307 IF (llfacde .AND. isec1(23) == 0) THEN
308  isec1(23) = idecopt
309 ENDIF
310 !
311 ! 3.2 - Definition du type de codage
312 !
313 cloper='C'
314 IF (fa%FICHIER(krang)%NCOGRIF(1)==1) cloper='K'
315 !*
316 ! 4. - CHANGEMENT D'UNITE DE CERTAINS CHAMPS.
317 ! Il s'agit de champs dont les valeurs sont comprises
318 ! entre 0 et 1 dans le modele mais dont l'unite
319 ! conventionnelle dans le GRIB est le %.
320 !---------------------------------------------------------------
321 !
322 zundf = pundf
323 IF (ydgr1tab%LMULTI) THEN
324  zsec4 = zsec4 * ydgr1tab%FMULTI
325  zundf = zundf * ydgr1tab%FMULTI
326 ENDIF
327 !
328 ! Traitement des valeurs indefinies; on verifie d'abord que le champ
329 ! contient de telles valeurs afin d'eviter de polluer le resultat
330 ! final avec un bitmap inutile
331 !
332 IF (llundf) THEN
333  llundf = any(zsec4 == zundf)
334 ENDIF
335 !
336 ! Ajustement des parametres d'encodage
337 !
338 IF (llundf) THEN
339  isec1(5)=192
340  zsec3(2)=zundf
341  isec3(1)=0
342  isec3(2)=int(zundf)
343 ENDIF
344 !*
345 ! 5. - CODAGE GRIB PROPREMENT DIT
346 !-----------------------------------------------------------------------
347 !
348 iret=-1
349 ! ILENG=longueur disponible en nb d'"entiers declares INTEGER" dans KVALCO.
350 ! On part de l'hypothese ou le dimensionnement de KVALCO se fait
351 ! dans la routine appelante a ILCHAM+2 (cas de l'absence de compactage).
352 ileng=(kind(kvalco)/4)*(ilcham+2-idecal)
353 iword=0
354 !DP
355 !DP TEST AVEC UNE PUISSANCE DE LAPLACIEN IMPOSEE
356 !DP
357 !DP CALL GRSMKP(0)
358 !DP ISEC4(17) = 2000
359 !DP
360 IF (fa%LFAMOP) THEN
361  WRITE (unit=fa%NULOUT,fmt=*)' FACODX: CLOPER = ',cloper
362  WRITE (unit=fa%NULOUT,fmt=*) &
363 & ' FACODX: IILCHAM, ILCHAM, IDECAL, ILENG = ', &
364 & iilcham, ilcham, idecal, ileng
365  WRITE (unit=fa%NULOUT,fmt=*)' * ISEC1 = ',isec1
366  WRITE (unit=fa%NULOUT,fmt=*) &
367 & ' * ILONSEC2 ! ISEC2(1:ILONSEC2) = ', &
368 & ilonsec2,' ! ', isec2(1:ilonsec2)
369  WRITE (unit=fa%NULOUT,fmt=*) ' * ZSEC2(1:2) = ',zsec2(1:2)
370  IF (isec2(12).GT.0) WRITE (unit=fa%NULOUT,fmt=*) &
371 & ' * ISEC2(12) ! ZSEC2(11:10+ISEC2(12)) = ', &
372 & isec2(12), ' ! ', zsec2(11:10+isec2(12))
373  WRITE (unit=fa%NULOUT,fmt=*)' * FA%JPSEC4 ! ISEC4 = ', &
374 & fa%JPSEC4,' ! ',isec4
375  WRITE (unit=fa%NULOUT,fmt=*)' * ZSEC4(1:20) = ', &
376 & zsec4(1:20)
377 ENDIF
378 
379 ! WARNING GRIBEX ENLEVE
380 !CALL GRSDBG (0)
381 !CALL GRSVCK (0)
382 
383 ! Defauts
384 
385 !CALL GRSX2O (1)
386 !CALL GRSN2O (1)
387 
388 ! Defaults FA
389 
390 !IF (FA%IOPTGRSX2O /= NUNDEF) &
391 !& CALL GRSX2O(INT (FA%IOPTGRSX2O, JPLIKM))
392 !
393 !IF (FA%IOPTGRSN2O /= NUNDEF) &
394 !& CALL GRSN2O(INT (FA%IOPTGRSN2O, JPLIKB))
395 
396 ! Defauts pour cette unite
397 
398 !IF (FA%FICHIER(KRANG)%IOPTGRSX2O /= NUNDEF) &
399 !& CALL GRSX2O(INT (FA%FICHIER(KRANG)%IOPTGRSX2O, JPLIKM))
400 !
401 !IF (FA%FICHIER(KRANG)%IOPTGRSN2O /= NUNDEF) &
402 !& CALL GRSN2O(INT (FA%FICHIER(KRANG)%IOPTGRSN2O, JPLIKB))
403 
404 ! 1/ On force GRIBEX a calculer la puissance de laplacien
405 !CALL GRSMKP(1)
406 ! 2/ On retire l'arrondi du message GRIB a un multiple de 120 octets
407 !CALL GRSRND(0)
408 
409 CALL fagribex(isec0,isec1,isec2,zsec2,isec3,zsec3,isec4, &
410 & zsec4,iilcham,kvalco(idecal+1),ileng,iword, &
411 & cloper,iret)
412 !
413 IF (iret.GT.0) THEN
414 ! Erreur rapportee par GRIBEX
415  krep=-1000-iret
416  GOTO 1001
417 ELSEIF (iret.LT.0) THEN
418 ! Warning rapporte par GRIBEX
419  WRITE (unit=fa%NULOUT,fmt=*)
420  WRITE (unit=fa%NULOUT,fmt=*) &
421 & '!------------------------------------------'
422  WRITE (unit=fa%NULOUT,fmt=*) &
423 & '! FACODX: WARNING !!! !'
424  WRITE (unit=fa%NULOUT,fmt=*) &
425 & '!------------------------------------------'
426  WRITE (unit=fa%NULOUT,fmt=*) ' Code retour de GRIBEX = ', &
427 & iret,' pour le champ: ',cdpref,knivau,cdsuff
428  WRITE (unit=fa%NULOUT,fmt=*)
429 ENDIF
430 !
431 ! ISEC0(1) = nb d'octets dans le message GRIB
432 ! IWORD = nb de mots de JBDBLE octets (64 bits) du message GRIB
433 iword=1+(isec0(1)-1)/jplikb
434 klongd=idecal+iword+idimnc
435 IF (fa%LFAMOP) THEN
436  WRITE (unit=fa%NULOUT,fmt=*) &
437 & ' FACODX: longueur du GRIB en nb octets et en mots = ', &
438 & isec0(1), iword
439  WRITE (unit=fa%NULOUT,fmt=*) &
440 & ' FACODX: longueur de l''article FA en mots = ', &
441 & klongd
442  IF (isec4(4).EQ.64 .AND. isec4(3).EQ.128) THEN
443  WRITE (unit=fa%NULOUT,fmt=*) &
444 & ' FACODX: complex packing with P=',isec4(17), &
445 & ' and sub trunc = ',isec4(18)
446  ENDIF
447 ENDIF
448 !
449 ! CAS D'UN DEPASSEMENT DE LA TAILLE MAX DE L'ARTICLE FINAL
450 ! On ramene ce cas a celui d'un tableau trop petit dans GRIBEX.
451 !
452 IF (klongd.GT.ilcham+2) THEN
453  IF (fa%LFAMOP) THEN
454  WRITE (unit=fa%NULOUT,fmt=*) &
455 & ' FACODX: article FA + long avec compactage', &
456 & ' que sans => on le supprime'
457  ENDIF
458  iret=710
459  krep=-1000-iret
460  GOTO 1001
461 ENDIF
462 !
463 !*
464 ! 6. - TRANSFERT DES COEFFICIENTS SPECTRAUX NON COMPACTES.
465 !-----------------------------------------------------------------------
466 ! (et non traites par GRIBEX) en fin d'article.
467 !
468 IF (ldcosp) THEN
469  kvalco(4)=icpack
470  IF (llmlam) THEN
471  kvalco(5)=ipulap
472 ! Copy nonpacked part of PSEC4 (sub-triangle+axes) into KVALCO
473  iilcham=0
474  DO jm=0,fa%CADRE(irangc)%NOMPAR(2)
475  il=2+2*jm+1
476  ilow=fa%CADRE(irangc)%NOMPAR(il)
477 !
478  IF (jm.EQ.0) THEN
479  ihigh=fa%CADRE(irangc)%NOMPAR(il+1)
480  ELSE
481  ihigh=ilow+4*(icpack+1-jm)-1
482  IF (ihigh.LE.ilow) ihigh=ilow+3
483  ENDIF
484 !
485  DO idx=ilow,ihigh
486  iilcham=iilcham+1
487  zsec4(iilcham)=psec4(idx)
488  ENDDO
489  ENDDO
490  IF (iilcham.NE.idimnc) THEN
491  WRITE (unit=fa%NULOUT,fmt='(A35,I10,A11,I10)') &
492 & 'FACODX: incoherence entre IILCHAM= ',iilcham, &
493 & 'et IDIMNC= ',idimnc
494  krep=-126
495  GOTO 1001
496  ENDIF
497  ELSE
498  kvalco(5)=isec4(17)
499 ! Recuperation des coeff spectraux non compactes sachant que le
500 ! rangement est fait par colonnes de JM=cst juxtaposees
501  zsec4(1:2*(icpack+1))=psec4(1:2*(icpack+1))
502  iilcham=2*(icpack+1)-1
503  idx=2*(itronc+1)-1
504  DO jm=1,icpack
505  DO jn=jm,itronc
506  idx=idx+2
507  IF (jn.LE.icpack) THEN
508  iilcham=iilcham+2
509  zsec4(iilcham) = psec4(idx)
510  zsec4(iilcham+1) = psec4(idx+1)
511  ENDIF
512  ENDDO
513  ENDDO
514  IF (iilcham+1.NE.idimnc) THEN
515  WRITE (unit=fa%NULOUT,fmt='(A35,I10,A11,I10)') &
516 & 'FACODX: incoherence entre IILCHAM+1= ',iilcham+1, &
517 & 'et IDIMNC= ',idimnc
518  krep=-126
519  GOTO 1001
520  ENDIF
521  ENDIF
522 ! Les IDIMNC coeff spectraux non compactes doivent etre transferes
523 ! sur le tableau d'entiers KVALCO apres le IDECAL+IWORD ieme elt.
524 !
525 ! KVALCO(IDECAL+IWORD+1:KLONGD)=TRANSFER(ZSEC4,KVALCO,IDIMNC)
526  ALLOCATE (ivalco(idimnc))
527  ivalco(1:idimnc)=transfer(zsec4,ivalco,idimnc)
528  kvalco(idecal+iword+1:klongd)=ivalco(1:idimnc)
529  DEALLOCATE (ivalco)
530 ENDIF
531 !**
532 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
533 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
534 !-----------------------------------------------------------------------
535 !
536 1001 CONTINUE
537 IF (ALLOCATED(zsec4)) DEALLOCATE ( zsec4 )
538 !
539 ! Cas particulier de l'erreur GRIBEX num 710: OUTPUT ARRAY TOO SMALL
540 ! On s'en sert pour detecter un probleme de compactage lie a ce que
541 ! le champ compacte+les descripteurs prennent plus de place que le
542 ! champ non compacte...
543 ! On sort donc du compactage (FACODX) pour demander un codage sans
544 ! compactage (FACINE) avec rangement des valeurs selon le modele:
545 ! FA%NFGRIB=-1.
546 !
547 IF (iret==710) THEN
548  clnspr='FACODX'
549  inimes=2
550  inumer=jpniil
551 !
552  WRITE (unit=clmess,fmt='(''KREP='',I5,'', KRANG='',I4, &
553 & '', CDPREF='''''',A,'''''', KNIVAU='',I6, &
554 & '', CDSUFF='''''',A,'''''', LDCOSP= '',L1, &
555 & '', KLONGD='',I6)') &
556 & krep, krang, cdpref(1:len_trim(cdpref)), knivau, &
557 & cdsuff(1:len_trim(cdsuff)), ldcosp, klongd
558  CALL faipar_fort &
559 & (fa, inumer,inimes,krep,.false.,clmess, &
560 & clnspr,clacti,.false.)
561  clmess= &
562 & ' CAUTION: this field is not packed or it will occupy more space'
563  CALL faipar_fort &
564 & (fa, inumer,inimes,krep,.false.,clmess, &
565 & clnspr,clacti,.false.)
566  IF (lhook) CALL dr_hook('FACODX_MT',1,zhook_handle)
567  RETURN
568 ENDIF
569 !
570 !
571 !
572 llfata=llmoer(krep,krang)
573 !
574 IF (fa%LFAMOP.OR.llfata) THEN
575  inimes=2
576  clnspr='FACODX'
577  inumer=jpniil
578 !
579  WRITE (unit=clmess,fmt='(''KREP='',I5,'', KRANG='',I4, &
580 & '', CDPREF='''''',A,'''''', KNIVAU='',I6, &
581 & '', CDSUFF='''''',A,'''''', LDCOSP= '',L1, &
582 & '', KLONGD='',I6)') &
583 & krep, krang, cdpref(1:len_trim(cdpref)), knivau, &
584 & cdsuff(1:len_trim(cdsuff)), ldcosp, klongd
585  CALL faipar_fort &
586 & (fa, inumer,inimes,krep,.false.,clmess, &
587 & clnspr,clacti,.false.)
588 ENDIF
589 !
590 IF (lhook) CALL dr_hook('FACODX_MT',1,zhook_handle)
591 
592 CONTAINS
593 
594 #include "facom2.llmoer.h"
595 
596 END SUBROUTINE facodx_fort
597 
598 !INTF KREP OUT
599 !INTF KRANG IN
600 !INTF CDPREF IN
601 !INTF KNIVAU IN
602 !INTF CDSUFF IN
603 !INTF PSEC4 IN DIMS=*
604 !INTF LDCOSP IN
605 !INTF KVALCO OUT DIMS=* KIND=JPLIKB
606 !INTF KLONGD OUT
607 !INTF LDUNDF IN
608 !INTF PUNDF IN
609 !INTF YDGR1TAB IN
integer, parameter jplikb
subroutine facdec_fort(FA, KREP, PA, PMIN, KNBIT, KDEC)
Definition: facdec.F90:5
subroutine fainig_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, LDCOSP, KLCHAM, KSEC1, KSEC2, PSEC2, KSEC3, PSEC3, KSEC4, YDGR1TAB)
Definition: fainig.F90:8
integer(kind=jplikb), parameter nundef
Definition: fa_mod.F90:36
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter jpdblr
subroutine facodx_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PSEC4, LDCOSP, KVALCO, KLONGD, LDUNDF, PUNDF, YDGR1TAB)
Definition: facodx.F90:7
logical lhook
Definition: yomhook.F90:15
subroutine fagribex(KSEC0, KSEC1, KSEC2, PSEC2, KSEC3, PSEC3, KSEC4, PSEC4, KLENP, KGRIB, KLENG, KWORD, HOPER, KRET)
Definition: fagribex.F90:4
subroutine fapula_fort(FA, KREP, KRANG, PSPEC, KPULAP)
Definition: fapula.F90:5
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