SURFEX v8.1
General documentation of Surfex
faien1.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 faien1_fort &
4 & (fa, krep, knumer, cdpref, knivau, cdsuff, &
5 & pchamp, ldcosp, ldundf, pundf, ydgr1tab)
6 USE fa_mod, ONLY : fa_com, fagr1tab
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! Sous-programme d'ECRITURE d'un CHAMP HORIZONTAL sur un fichier
13 ! ARPEGE.
14 ! ( Integration par Ecriture d'un (Nouveau ?) Champ )
15 !**
16 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
17 ! KNUMER (Entree) ==> Numero de l'unite logique;
18 ! CDPREF (Entree) ==> Prefixe eventuel du nom d'article;
19 ! KNIVAU (Entree) ==> Niveau vertical eventuel;
20 ! CDSUFF (Entree) ==> Suffixe eventuel du nom d'article;
21 ! ( Tableau ) PCHAMP (Entree) ==> Valeurs REELLES du champ a ecrire;
22 ! LDCOSP (Entree) ==> Vrai si le champ est represente
23 ! par des coefficients spectraux.
24 ! LDUNDF (Entree) ==> Vrai si ce champ a des valeurs
25 ! indefinies
26 ! PUNDF (Entree) ==> Dans le cas ou LDUNDF est vrai,
27 ! valeur non definie
28 !
29 ! Modifications
30 ! -------------
31 !
32 ! Avril 1998: Partie "codage" (paragraphe 3 du sous-programme)
33 ! demenagee dans un sous-programme a usage interne au
34 ! logiciel (FACINE). Le but est de pouvoir, sur machine
35 ! a memoire distribuee, separer codage (via FACOND) et
36 ! ecriture (via FAISAN) afin de paralleliser le codage.
37 !
38 ! Avril 2004, D. Paradis, DSI/DEV:
39 !
40 ! -Declaration IVALCO en ALLOCATABLE (gain memoire)
41 !
42 !
43 !
44 TYPE(fa_com) :: FA
45 TYPE(fagr1tab) :: YDGR1TAB
46 INTEGER (KIND=JPLIKB) KREP, KNUMER, KNIVAU
47 !
48 REAL (KIND=JPDBLR) PCHAMP (*)
49 !
50 CHARACTER CDPREF*(*), CDSUFF*(*)
51 !
52 INTEGER (KIND=JPLIKB) IREP, ILPRFU, ILSUFU, ILNOMU
53 INTEGER (KIND=JPLIKB) ILONGA, IRANG, INIMES
54 INTEGER (KIND=JPLIKB) ILPREF, ILSUFF
55 !
56 INTEGER (KIND=JPLIKB), ALLOCATABLE :: IVALCO(:)
57 INTEGER (KIND=JPLIKB) IB1PAR (fa%jplb1p)
58 !
59 INTEGER (KIND=JPLIKB) IVALC1, IRANGC, ILCHAM, INGRIB, IPFAOS
60 !
61 LOGICAL LLVERF, LLRLFI, LDCOSP, LLNOMU, LLMLAM, LLNOPA, LDUNDF
62 !
63 REAL (KIND=JPDBLR) :: PUNDF
64 !
65 CHARACTER CLPREF*(fa%jpxnom), CLSUFF*(fa%jpxsuf)
66 !
67 CHARACTER(LEN=FA%JPXNOM) CLNOMA
68 CHARACTER(LEN=FA%JPLMES) CLMESS
69 CHARACTER(LEN=FA%JPLSPX) CLNSPR
70 LOGICAL LLFATA
71 
72 !**
73 ! 1. - CONTROLES ET INITIALISATIONS.
74 !-----------------------------------------------------------------------
75 !
76 REAL(KIND=JPRB) :: ZHOOK_HANDLE
77 IF (lhook) CALL dr_hook('FAIEN1_MT',0,zhook_handle)
78 llverf=.false.
79 llrlfi=.false.
80 llnomu=.false.
81 llnopa=.false.
82 ilprfu=int(len(cdpref), jplikb)
83 ilsufu=int(len(cdsuff), jplikb)
84 CALL fanumu_fort &
85 & (fa, knumer,irang)
86 !
87 IF (irang.EQ.0) THEN
88  irep=-51
89  GOTO 1001
90 ENDIF
91 !
92 ! Verrouillage eventuel du fichier.
93 !
94 IF (fa%LFAMUL) CALL lfiver_fort &
95 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'ON')
96 llverf=fa%LFAMUL
97 !
98 IF (fa%FICHIER(irang)%LCREAF) THEN
99  irep=-85
100  GOTO 1001
101 ENDIF
102 !**
103 ! 2. - FABRICATION DU NOM D'ARTICLE VIA LE SOUS-PROGRAMME "FANFAR"
104 ! ( controles de CDPREF, KNIVAU, CDSUFF inclus )
105 !-----------------------------------------------------------------------
106 !
107 CALL fanfar_fort &
108 & (fa, irep,irang,cdpref,knivau,cdsuff,clnoma, &
109 & ib1par(6), ilprfu,ilsufu,ilnomu)
110 IF (irep.NE.0) GOTO 1001
111 llnomu=.true.
112 !**
113 ! 3. - CALCUL D'UN MAJORANT POUR LA LONGUEUR DE L'ARTICLE (mots)
114 ! ( on va prendre le nombre de valeurs du champ +2 :
115 ! l'absence de compactage est un majorant et les 2 mots
116 ! correspondent a l'enrobage FA dans ce cas )
117 !-----------------------------------------------------------------------
118 !
119 ivalc1=fa%FICHIER(irang)%NFGRIB
120 irangc=fa%FICHIER(irang)%NUCADR
121 llmlam=fa%CADRE(irangc)%LIMLAM
122 IF (ldcosp) THEN
123  IF (llmlam) THEN
124  ilcham=fa%CADRE(irangc)%NSFLAM
125  ELSE
126  IF (ivalc1.EQ.-1 .OR. ivalc1.EQ.3) THEN
127  ilcham=(1+fa%CADRE(irangc)%MTRONC)*(2+fa%CADRE(irangc)%MTRONC)
128  ELSE
129  ilcham=(1+fa%CADRE(irangc)%MTRONC)**2
130  ENDIF
131  ENDIF
132 ELSE
133  ilcham=fa%CADRE(irangc)%NVAPDG
134 ENDIF
135 !
136 
137 CALL fasgra_fort (fa, irep, fa%CADRE(irangc)%CNOMCA, ipfaos)
138 
139 IF (irep.NE.0) GOTO 1001
140 
141 ilonga = ilcham+ipfaos
142 
143 ALLOCATE (ivalco(ilonga))
144 ivalco = 0
145 !**
146 ! 4. - FABRICATION DE L'ARTICLE A ECRIRE SUR LE FICHIER.
147 !-----------------------------------------------------------------------
148 !
149 ! Controle de l'homogeneite du type de rangement de coeff. spectraux
150 ! parmi les champs lus/ecrits: ces champs compactes avec
151 ! FA%NIGRIB=-1 ou 3 doivent etre ranges comme dans le modele ("verticalement"
152 ! soit selon des colonnes JM=cst consecutives) et contrairement si compactes
153 ! avec FA%NIGRIB= 0,1 ou 2.
154 !
155 irangc=fa%FICHIER(irang)%NUCADR
156 IF (ldcosp) THEN
157  IF (fa%FICHIER(irang)%NFGRIB.EQ.-1 .OR. fa%FICHIER(irang)%NFGRIB.EQ.3) THEN
158  fa%FICHIER(irang)%NRASVE=fa%FICHIER(irang)%NRASVE+1
159  IF (fa%FICHIER(irang)%NRASVE.EQ.1 .AND. fa%FICHIER(irang)%NRASHO.GT.0) THEN
160  WRITE(fa%NULOUT,*) &
161 & '------------------------------------------------'
162  WRITE(fa%NULOUT,*)' FAIEN1 : WARNING !!!!! '
163  WRITE(fa%NULOUT,*)' Un champ de coeff. spectraux avec'
164  WRITE(fa%NULOUT,*) &
165 & ' rangement type modele va etre ecrit alors que'
166  WRITE(fa%NULOUT,*) &
167 & ' les autres champs ont un rangement different.'
168  WRITE(fa%NULOUT,*) &
169 & '------------------------------------------------'
170  ENDIF
171  ELSEIF (fa%FICHIER(irang)%NFGRIB.GE.0 .AND. fa%FICHIER(irang)%NFGRIB.LE.2) THEN
172  fa%FICHIER(irang)%NRASHO=fa%FICHIER(irang)%NRASHO+1
173  IF (fa%FICHIER(irang)%NRASHO.EQ.1 .AND. fa%FICHIER(irang)%NRASVE.GT.0) THEN
174  WRITE(fa%NULOUT,*) &
175 & '------------------------------------------------'
176  WRITE(fa%NULOUT,*)' FAIEN1 : WARNING !!!!! '
177  WRITE(fa%NULOUT,*)' Un champ de coeff. spectraux avec'
178  WRITE(fa%NULOUT,*) &
179 & ' rangt autre que celui du modele va etre ecrit'
180  WRITE(fa%NULOUT,*) &
181 & ' alors que d''autres champs ont le rangt modele'
182  WRITE(fa%NULOUT,*) &
183 & '------------------------------------------------'
184  ENDIF
185  ENDIF
186 ENDIF
187 !
188 500 CONTINUE
189 !
190 IF (fa%FICHIER(irang)%NFGRIB.EQ.3) THEN
191 ! Cas d'un champ qu'il faut "griber" avec GRIBEX
192  CALL facodx_fort &
193 & (fa, irep, irang, cdpref, knivau, cdsuff, &
194 & pchamp(1), ldcosp, ivalco, ilonga, &
195 & ldundf, pundf, ydgr1tab)
196 !
197 ! Cas particulier de l'erreur GRIBEX num 710: OUTPUT ARRAY TOO SMALL
198 ! On s'en sert pour detecter un probleme de compactage lie a ce que
199 ! le champ compacte + les descripteurs prennent plus de place que le
200 ! champ non compacte...
201 ! On sort donc du compactage (FACODX) pour demander un codage sans
202 ! compactage (FACINE) avec rangement des valeurs selon le modele:
203 ! FA%NFGRIB=-1.
204 !
205  IF (irep==-1710) THEN
206  irep = 0
207  fa%FICHIER(irang)%NFGRIB = -1
208  llnopa = .true.
209  GOTO 500
210  ENDIF
211 ELSEIF (falgra(fa%FICHIER(irang)%NFGRIB)) THEN
212 ! Cas d'un champ qu'il faut "griber" avec GRIB_API
213  IF (ldcosp .AND. (falgra_sp(fa%FICHIER(irang)%NFGRIB) == 102)) THEN
214  ingrib = fa%FICHIER(irang)%NFGRIB
215  fa%FICHIER(irang)%NFGRIB = 2_jplikb
216  CALL facine_fort &
217 & (fa, irep, irang, clnoma(1:ilnomu), pchamp, &
218 & ldcosp, ivalco, ilonga, ib1par, &
219 & ldundf, pundf)
220  fa%FICHIER(irang)%NFGRIB = ingrib
221  ELSE
222  CALL facgra_fort (fa, irep, irang, cdpref, knivau, cdsuff, &
223  & pchamp(1), ldcosp, ivalco, ilonga, &
224  & ldundf, pundf)
225  ENDIF
226 ELSEIF (fa%FICHIER(irang)%NFGRIB.EQ.4) THEN
227  CALL faccpl_fort &
228 & (fa, irep, irang, cdpref, knivau, cdsuff, &
229 & pchamp(1), ldcosp, ivalco, ilonga, ib1par)
230 ELSE
231  CALL facine_fort &
232 & (fa, irep, irang, clnoma(1:ilnomu), pchamp, &
233 & ldcosp, ivalco, ilonga, ib1par, &
234 & ldundf, pundf)
235  IF (llnopa) fa%FICHIER(irang)%NFGRIB = 3
236 ! Le codage num 3 avait ete demande mais se revelait etre
237 ! plus gourmand en place que le num -1: on avait donc force
238 ! l'absence de compactage (-1). On revient maintenant au codage
239 ! num 3 pour ce cadre IRANG et les eventuels codages suivants.
240 !
241 ENDIF
242 IF (irep.NE.0) GOTO 1001
243 !**
244 ! 5. - ECRITURE DE L'ARTICLE "CHAMP" SUR LE FICHIER.
245 !-----------------------------------------------------------------------
246 !
247 CALL faisan_fort (fa, irep, knumer, clnoma(1:ilnomu), ivalco, ilonga)
248 llrlfi=irep.NE.0
249 !**
250 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
251 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
252 !-----------------------------------------------------------------------
253 !
254 1001 CONTINUE
255 IF (ALLOCATED( ivalco )) DEALLOCATE ( ivalco )
256 krep=irep
257 llfata=llmoer(irep,irang)
258 !
259 ! Deverrouillage eventuel du fichier.
260 !
261 IF (llverf) CALL lfiver_fort &
262 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'OFF')
263 !
264 IF (llfata) THEN
265  inimes=2
266 ELSE
267  inimes=ixnvms(irang)
268 ENDIF
269 !
270 IF (.NOT.llfata.AND.inimes.NE.2) THEN
271  IF (lhook) CALL dr_hook('FAIEN1_MT',1,zhook_handle)
272  RETURN
273 ENDIF
274 !
275 clnspr='FAIEN1'
276 !
277 IF (ilprfu.GE.1) THEN
278  ilpref=min(ilprfu,int(len(clpref), jplikb))
279  clpref(1:ilpref)=cdpref(1:ilpref)
280 ELSE
281  ilpref=8
282  clpref(1:ilpref)=fa%CHAINC(:ilpref)
283 ENDIF
284 !
285 IF (ilsufu.GE.1) THEN
286  ilsuff=min(ilsufu,int(len(clsuff), jplikb))
287  clsuff(1:ilsuff)=cdsuff(1:ilsuff)
288 ELSE
289  ilsuff=8
290  clsuff(1:ilsuff)=fa%CHAINC(:ilsuff)
291 ENDIF
292 !
293 IF (.NOT.llnomu) THEN
294  ilnomu=min(ilpref,fa%NCPCAD)
295  clnoma(1:ilnomu)=clpref(1:ilpref)
296 ENDIF
297 !
298 WRITE (unit=clmess,fmt='(''KREP='',I5,'', KNUMER='',I3, &
299 & '', CDPREF='''''',A,'''''', KNIVAU='',I6, &
300 & '', CDSUFF='''''',A,'''''', LDCOSP= '',L1)') &
301 & krep,knumer,clpref(1:ilpref),knivau,clsuff(1:ilsuff),ldcosp
302 CALL faipar_fort &
303 & (fa, knumer,inimes,irep,llfata,clmess, &
304 & clnspr, clnoma(1:ilnomu),llrlfi)
305 !
306 IF (lhook) CALL dr_hook('FAIEN1_MT',1,zhook_handle)
307 
308 CONTAINS
309 
310 #include "facom2.llmoer.h"
311 #include "facom2.ixnvms.h"
312 #include "falgra.h"
313 
314 END SUBROUTINE faien1_fort
integer, parameter jplikb
subroutine faisan_fort(FA, KREP, KNUMER, CDNOMA, KDONNE, KLONGD)
Definition: faisan.F90:5
subroutine fasgra_fort(FA, KREP, CDNOMC, KLONGD)
Definition: fasgra.F90:3
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 faien1_fort(FA, KREP, KNUMER, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, LDUNDF, PUNDF, YDGR1TAB)
Definition: faien1.F90:6
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