SURFEX v8.1
General documentation of Surfex
facon1.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 facon1_fort &
4 & (fa, krep, knumer, cdpref, knivau, cdsuff, &
5 & pchamp, ldcosp, cdnoma, klnoma, kvalco, &
6 & klongd, ldundf, pundf, ydgr1tab)
7 USE fa_mod, ONLY : fa_com, fagr1tab
8 USE parkind1, ONLY : jprb
9 USE yomhook , ONLY : lhook, dr_hook
10 USE lfi_precision
11 IMPLICIT NONE
12 !****
13 ! Sous-programme de CODAGE d'un CHAMP HORIZONTAL destine a etre
14 ! ecrit sur un fichier ARPEGE/ALADIN.
15 ! ( COdage de (Nouvelles ?) Donnees )
16 !**
17 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
18 ! KNUMER (Entree) ==> Numero de l'unite logique;
19 ! CDPREF (Entree) ==> Prefixe eventuel du nom d'article;
20 ! KNIVAU (Entree) ==> Niveau vertical eventuel;
21 ! CDSUFF (Entree) ==> Suffixe eventuel du nom d'article;
22 ! ( Tableau ) PCHAMP (Entree) ==> Valeurs REELLES du champ a ecrire;
23 ! LDCOSP (Entree) ==> Vrai si le champ est represente
24 ! par des coefficients spectraux;
25 ! CDNOMA (Sortie) ==> Nom de l'article-champ a ecrire;
26 ! KLNOMA (Sortie) ==> Nombre de caracteres utiles dans
27 ! CDNOMA;
28 ! ( Tableau ) KVALCO (Sortie) ==> Donnees destinees a l'ecriture;
29 ! KLONGD (Sortie) ==> Nombre de valeurs (mots de 64 bits
30 ! en principe) a ecrire.
31 ! LDUNDF (Entree) ==> Vrai si ce champ a des valeurs
32 ! indefinies
33 ! PUNDF (Entree) ==> Dans le cas ou LDUNDF est vrai,
34 ! valeur non definie
35 !
36 ! Remarques:
37 !
38 ! - KVALCO doit avoir une longueur
39 ! suffisante pour stocker les donnees codees. Le dimensionnement
40 ! "tous terrains" est (2+ILCHAM), qui permet le cas echeant de
41 ! stocker un champ a pleine resolution sans codage effectif.
42 ! (ILCHAM est le nombre de valeurs du champ a ecrire)
43 !
44 ! - CDNOMA doit avoir au moins FA%JPXNOM caracteres.
45 !
46 !
47 TYPE(fa_com) :: FA
48 TYPE(fagr1tab) :: YDGR1TAB
49 INTEGER (KIND=JPLIKB) KREP, KNUMER, KNIVAU, KLNOMA, KLONGD
50 !
51 REAL (KIND=JPDBLR) PCHAMP (*), PUNDF
52 INTEGER (KIND=JPLIKB) KVALCO (*)
53 !
54 CHARACTER CDPREF*(*), CDSUFF*(*), CDNOMA*(*)
55 !
56 INTEGER (KIND=JPLIKB) IREP, ILPRFU, ILSUFU, ILNOMU
57 INTEGER (KIND=JPLIKB) IRANG, INIMES
58 INTEGER (KIND=JPLIKB) ILPREF, ILSUFF, ILCDNO, IRANGC
59 INTEGER (KIND=JPLIKB) IB1PAR (fa%jplb1p), INGRIB
60 !
61 LOGICAL LLVERF, LLRLFI, LDCOSP, LLNOMU, LLNOPA, LDUNDF
62 !
63 CHARACTER CLPREF*(fa%jpxnom), CLSUFF*(fa%jpxsuf)
64 !
65 CHARACTER(LEN=FA%JPLMES) CLMESS
66 CHARACTER(LEN=FA%JPLSPX) CLNSPR
67 LOGICAL LLFATA
68 
69 !**
70 ! 1. - CONTROLES ET INITIALISATIONS.
71 !-----------------------------------------------------------------------
72 !
73 REAL(KIND=JPRB) :: ZHOOK_HANDLE
74 IF (lhook) CALL dr_hook('FACON1_MT',0,zhook_handle)
75 llverf=.false.
76 llrlfi=.false.
77 llnomu=.false.
78 llnopa=.false.
79 ilprfu=int(len(cdpref), jplikb)
80 ilsufu=int(len(cdsuff), jplikb)
81 ilcdno=int(len(cdnoma), jplikb)
82 klnoma=0
83 CALL fanumu_fort &
84 & (fa, knumer,irang)
85 !
86 IF (irang.EQ.0) THEN
87  irep=-51
88  GOTO 1001
89 ELSEIF (ilcdno.LT.fa%JPXNOM) THEN
90  irep=-65
91  GOTO 1001
92 ELSE
93  cdnoma=' '
94 ENDIF
95 !
96 ! Verrouillage eventuel du fichier.
97 !
98 IF (fa%LFAMUL) CALL lfiver_fort &
99 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'ON')
100 llverf=fa%LFAMUL
101 !
102 IF (fa%FICHIER(irang)%LCREAF) THEN
103  irep=-85
104  GOTO 1001
105 ENDIF
106 !**
107 ! 2. - FABRICATION DU NOM D'ARTICLE VIA LE SOUS-PROGRAMME "FANFAR"
108 ! ( controles de CDPREF, KNIVAU, CDSUFF inclus )
109 !-----------------------------------------------------------------------
110 !
111 CALL fanfar_fort &
112 & (fa, irep,irang,cdpref,knivau,cdsuff,cdnoma, &
113 & ib1par(6),ilprfu,ilsufu,ilnomu)
114 IF (irep.NE.0) GOTO 1001
115 llnomu=.true.
116 klnoma=ilnomu
117 !**
118 ! 3. - FABRICATION DE L'ARTICLE A ECRIRE SUR LE FICHIER.
119 !-----------------------------------------------------------------------
120 !
121 !
122 ! Controle de l'homogeneite du type de rangement des coeff. spectraux
123 ! parmi les champs lus/ecrits: ces champs compactes avec
124 ! FA%NIGRIB=-1 ou 3 doivent etre ranges comme dans le modele ("verticalement"
125 ! soit selon des colonnes JM=cst consecutives) et contrairement si compactes
126 ! avec FA%NIGRIB= 0,1 ou 2.
127 !
128 irangc=fa%FICHIER(irang)%NUCADR
129 IF (ldcosp) THEN
130  IF (fa%FICHIER(irang)%NFGRIB.EQ.-1.OR.fa%FICHIER(irang)%NFGRIB.EQ.3) THEN
131  fa%FICHIER(irang)%NRASVE=fa%FICHIER(irang)%NRASVE+1
132  IF (fa%FICHIER(irang)%NRASVE.EQ.1.AND.fa%FICHIER(irang)%NRASHO.GT.0) THEN
133  WRITE(fa%NULOUT,*) &
134 & '------------------------------------------------'
135  WRITE(fa%NULOUT,*)' FACON1 : WARNING !!!!! '
136  WRITE(fa%NULOUT,*)' Un champ de coeff. spectraux avec'
137  WRITE(fa%NULOUT,*) &
138 & ' rangement type modele va etre ecrit alors que'
139  WRITE(fa%NULOUT,*) &
140 & ' d''autres champs spec. ont un rangt different.'
141  WRITE(fa%NULOUT,*) &
142 & '------------------------------------------------'
143  ENDIF
144  ELSEIF (fa%FICHIER(irang)%NFGRIB.GE.0.AND.fa%FICHIER(irang)%NFGRIB.LE.2) THEN
145  fa%FICHIER(irang)%NRASHO=fa%FICHIER(irang)%NRASHO+1
146  IF (fa%FICHIER(irang)%NRASHO.EQ.1.AND.fa%FICHIER(irang)%NRASVE.GT.0) THEN
147  WRITE(fa%NULOUT,*) &
148 & '------------------------------------------------'
149  WRITE(fa%NULOUT,*) &
150 & ' FACON1 : WARNING !!!!! '
151  WRITE(fa%NULOUT,*) &
152 & ' Un champ de coeff. spectraux avec'
153  WRITE(fa%NULOUT,*) &
154 & ' rangt autre que celui du modele va etre ecrit'
155  WRITE(fa%NULOUT,*) &
156 & ' alors que d''autres champs ont le rangt modele'
157  WRITE(fa%NULOUT,*) &
158 & '------------------------------------------------'
159  ENDIF
160  ENDIF
161 ENDIF
162 !
163 500 CONTINUE
164 !
165 IF (fa%FICHIER(irang)%NFGRIB.EQ.3) THEN
166 ! Cas d'un champ qu'il faut "griber" avec GRIBEX
167  CALL facodx_fort &
168 & (fa, irep, irang, cdpref, knivau, cdsuff, &
169 & pchamp, ldcosp, kvalco, klongd, &
170 & ldundf, pundf, ydgr1tab)
171 !
172 ! Cas particulier de l'erreur GRIBEX num 710: OUTPUT ARRAY TOO SMALL
173 ! On s'en sert pour detecter un probleme de compactage lie a ce que
174 ! le champ compacte + les descripteurs prennent plus de place que le
175 ! champ non compacte...
176 ! On sort donc du compactage (FACODX) pour demander un codage sans
177 ! compactage (FACINE) avec rangement des valeurs selon le modele:
178 ! FA%NFGRIB=-1.
179 !
180  IF (irep==-1710) THEN
181  irep = 0
182  fa%FICHIER(irang)%NFGRIB = -1
183  llnopa = .true.
184  GOTO 500
185  ENDIF
186 ELSEIF (falgra(fa%FICHIER(irang)%NFGRIB)) THEN
187 ! Cas d'un champ qu'il faut "griber" avec GRIB_API
188  IF (ldcosp .AND. (falgra_sp(fa%FICHIER(irang)%NFGRIB) == 102)) THEN
189  ingrib = fa%FICHIER(irang)%NFGRIB
190  fa%FICHIER(irang)%NFGRIB = 2_jplikb
191  CALL facine_fort &
192 & (fa, irep, irang, cdnoma(1:ilnomu), pchamp, &
193 & ldcosp, kvalco, klongd, ib1par, &
194 & ldundf, pundf)
195  fa%FICHIER(irang)%NFGRIB = ingrib
196  ELSE
197  CALL facgra_fort (fa, irep, irang, cdpref, knivau, cdsuff, &
198  & pchamp(1), ldcosp, kvalco, klongd, &
199  & ldundf, pundf)
200  ENDIF
201 ELSEIF (fa%FICHIER(irang)%NFGRIB.EQ.4) THEN
202  CALL faccpl_fort &
203 & (fa, irep, irang, cdpref, knivau, cdsuff, &
204 & pchamp, ldcosp, kvalco, klongd, ib1par)
205 ELSE
206  CALL facine_fort &
207 & (fa, irep, irang, cdnoma(1:ilnomu), pchamp, &
208 & ldcosp, kvalco, klongd, ib1par, &
209 & ldundf, pundf)
210  IF (llnopa) fa%FICHIER(irang)%NFGRIB = 3
211 ! Le codage num 3 avait ete demande mais se revelait etre
212 ! plus gourmand en place que le num -1: on avait donc force
213 ! l'absence de compactage (-1). On revient maintenant au codage
214 ! num 3 pour ce cadre IRANG et les eventuels codages suivants.
215 !
216 ENDIF
217 !**
218 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
219 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
220 !-----------------------------------------------------------------------
221 !
222 1001 CONTINUE
223 krep=irep
224 llfata=llmoer(irep,irang)
225 !
226 ! Deverrouillage eventuel du fichier.
227 !
228 IF (llverf) CALL lfiver_fort &
229 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'OFF')
230 !
231 IF (llfata) THEN
232  inimes=2
233 ELSE
234  inimes=ixnvms(irang)
235 ENDIF
236 !
237 IF (.NOT.llfata.AND.inimes.NE.2) THEN
238  IF (lhook) CALL dr_hook('FACON1_MT',1,zhook_handle)
239  RETURN
240 ENDIF
241 !
242 clnspr='FACON1'
243 !
244 IF (ilprfu.GE.1) THEN
245  ilpref=min(ilprfu,int(len(clpref), jplikb))
246  clpref(1:ilpref)=cdpref(1:ilpref)
247 ELSE
248  ilpref=8
249  clpref(1:ilpref)=fa%CHAINC(:ilpref)
250 ENDIF
251 !
252 IF (ilsufu.GE.1) THEN
253  ilsuff=min(ilsufu,int(len(clsuff), jplikb))
254  clsuff(1:ilsuff)=cdsuff(1:ilsuff)
255 ELSE
256  ilsuff=8
257  clsuff(1:ilsuff)=fa%CHAINC(:ilsuff)
258 ENDIF
259 !
260 IF (.NOT.llnomu) THEN
261  ilnomu=min(ilpref,fa%NCPCAD)
262  cdnoma(1:ilnomu)=clpref(1:ilpref)
263 ENDIF
264 !
265 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
266 & '', CDPREF='''''',A,'''''', KNIVAU='',I6, &
267 & '', CDSUFF='''''',A,'''''', LDCOSP= '',L1)') &
268 & krep,knumer,clpref(1:ilpref),knivau,clsuff(1:ilsuff),ldcosp
269 CALL faipar_fort &
270 & (fa, knumer,inimes,irep,llfata,clmess, &
271 & clnspr,cdnoma(1:ilnomu),llrlfi)
272 !
273 IF (lhook) CALL dr_hook('FACON1_MT',1,zhook_handle)
274 
275 CONTAINS
276 
277 #include "facom2.llmoer.h"
278 #include "facom2.ixnvms.h"
279 #include "falgra.h"
280 
281 END SUBROUTINE facon1_fort
282 
integer, parameter jplikb
Definition: fa_mod.F90:1
subroutine lfiver_fort(LFI, PVEROU, CDSENS)
Definition: lfiver.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
subroutine fanfar_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, CDNOMA, KB1PAR, KLPRFU, KLSUFU, KLNOMU)
Definition: fanfar.F90:6
subroutine facine_fort(FA, KREP, KRANG, CDNOMA, PCHAMP, LDCOSP, PVALCO, KLONGD, KB1PAR, LDUNDF, PUNDF)
Definition: facine.F90:7
subroutine facodx_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PSEC4, LDCOSP, KVALCO, KLONGD, LDUNDF, PUNDF, YDGR1TAB)
Definition: facodx.F90:7
subroutine faccpl_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, KVALCO, KLONGD)
Definition: faccpl.F90:4
logical lhook
Definition: yomhook.F90:15
subroutine facon1_fort(FA, KREP, KNUMER, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, CDNOMA, KLNOMA, KVALCO, KLONGD, LDUNDF, PUNDF, YDGR1TAB)
Definition: facon1.F90:7
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5
subroutine facgra_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, KVALCO, KLONGD, LDUNDF, PUNDF)
Definition: facgra.F90:5