SURFEX v8.1
General documentation of Surfex
faisan.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 faisan_fort &
4 & (fa, krep, knumer, cdnoma, kdonne, klongd)
5 USE fa_mod, ONLY : fa_com
6 USE parkind1, ONLY : jprb
7 USE yomhook , ONLY : lhook, dr_hook
9 IMPLICIT NONE
10 !****
11 ! Sous-programme d'ecriture d'un article de donnees non assimila-
12 ! bles a un champ horizontal sur un fichier ARPEGE.
13 ! ( Integration Simple d'un Article Non code )
14 !**
15 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
16 ! KNUMER (Entree) ==> Numero de l'unite logique;
17 ! CDNOMA (Entree) ==> Nom de l'article;
18 ! ( Tableau ) KDONNE (Entree) ==> Donnees a ecrire;
19 ! KLONGD (Entree) ==> Nombre de mots a ecrire.
20 !
21 !
22 !
23 TYPE(fa_com) :: FA
24 INTEGER (KIND=JPLIKB) KREP, KNUMER, KLONGD
25 !
26 INTEGER (KIND=JPLIKB) ILCDNO, IRANG, IREP
27 INTEGER (KIND=JPLIKB) ILNOMA, INIMES, ILACTI
28 !
29 INTEGER (KIND=JPLIKB) KDONNE (klongd)
30 !
31 LOGICAL LLVERF, LLRLFI
32 !
33 CHARACTER CDNOMA*(*)
34 !
35 CHARACTER(LEN=FA%JPXNOM) CLACTI
36 CHARACTER(LEN=FA%JPXNOM) CLNOMA
37 CHARACTER(LEN=FA%JPLMES) CLMESS
38 CHARACTER(LEN=FA%JPLSPX) CLNSPR
39 LOGICAL LLFATA
40 LOGICAL LLECRI
41 
42 !**
43 ! 1. - CONTROLES ET INITIALISATIONS.
44 !-----------------------------------------------------------------------
45 !
46 REAL(KIND=JPRB) :: ZHOOK_HANDLE
47 IF (lhook) CALL dr_hook('FAISAN_MT',0,zhook_handle)
48 clacti=''
49 llverf=.false.
50 llrlfi=.false.
51 ilcdno=int(len(cdnoma), jplikb)
52 CALL fanumu_fort &
53 & (fa, knumer,irang)
54 
55 !
56 IF (irang.EQ.0) THEN
57  irep=-51
58  GOTO 1001
59 ELSEIF (klongd.LE.0) THEN
60  irep=-64
61  GOTO 1001
62 ELSEIF (ilcdno.LE.0) THEN
63  irep=-65
64  GOTO 1001
65 ENDIF
66 !
67 ! Verrouillage eventuel du fichier.
68 !
69 IF (fa%LFAMUL) CALL lfiver_fort &
70 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'ON')
71 llverf=fa%LFAMUL
72 !
73 IF (fa%FICHIER(irang)%LCREAF) THEN
74  irep=-85
75  GOTO 1001
76 ELSEIF (cdnoma.EQ.fa%CPCACH.OR.cdnoma.EQ.fa%CPCADI.OR. &
77 & cdnoma.EQ.fa%CPCAFS.OR.cdnoma.EQ.fa%CPCARP.OR. &
78 & cdnoma.EQ.fa%CPDATE.OR.cdnoma.EQ.fa%CPDATX.OR. &
79 & cdnoma.EQ.fa%FICHIER(irang)%CIDENT) THEN
80  irep=-111
81  GOTO 1001
82 ENDIF
83 !**
84 ! 2. - ECRITURE DE L'ARTICLE DE DONNEES SUR LE FICHIER.
85 !-----------------------------------------------------------------------
86 !
87 ilnoma=min( fa%NCPCAD, int(len(cdnoma), jplikb) )
88 clnoma(1:ilnoma)=cdnoma(1:ilnoma)
89 !
90 
91 llecri = .false.
92 IF (fa%FICHIER(irang)%NCOGRIF (12) > 0) THEN
93  CALL wgrib1 (llecri)
94 ENDIF
95 IF (.NOT. llecri) THEN
96  CALL lfiecr_fort &
97  & (fa%LFI, irep,knumer,clnoma(1:ilnoma), &
98  & kdonne,klongd)
99 ENDIF
100 llrlfi=irep.NE.0
101 !**
102 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
103 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
104 !-----------------------------------------------------------------------
105 !
106 1001 CONTINUE
107 krep=irep
108 llfata=llmoer(irep,irang)
109 !
110 ! Deverrouillage eventuel du fichier.
111 !
112 IF (llverf) CALL lfiver_fort &
113 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'OFF')
114 !
115 IF (llfata) THEN
116  inimes=2
117 ELSE
118  inimes=ixnvms(irang)
119 ENDIF
120 !
121 IF (.NOT.llfata.AND.inimes.NE.2) THEN
122  IF (lhook) CALL dr_hook('FAISAN_MT',1,zhook_handle)
123  RETURN
124 ENDIF
125 !
126 clnspr='FAISAN'
127 !
128 IF (irep.NE.-65) THEN
129  ilacti=min(ilcdno,fa%NCPCAD)
130  clacti(1:ilacti)=cdnoma(:ilacti)
131 ELSE
132  ilacti=8
133  clacti(1:ilacti)=fa%CHAINC(:ilacti)
134 ENDIF
135 !
136 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
137 & '', CDNOMA='''''',A,'''''', KLONGD='',I8)') &
138 & krep,knumer,clacti(1:ilacti),klongd
139 CALL faipar_fort &
140 & (fa, knumer,inimes,irep,llfata,clmess, &
141 & clnspr, clacti(1:ilacti),llrlfi)
142 !
143 IF (lhook) CALL dr_hook('FAISAN_MT',1,zhook_handle)
144 
145 CONTAINS
146 
147 #include "facom2.llmoer.h"
148 #include "facom2.ixnvms.h"
149 #include "falgra.h"
150 
151 SUBROUTINE wgrib1 (LDECRI)
153 LOGICAL :: LDECRI
154 
155 INTEGER (KIND=JPLIKB), PARAMETER :: ILONGD = 5_jplikb
156 
157 INTEGER (KIND=JPLIKB) IDONNE (ilongd)
158 CHARACTER(LEN=16) CLGRIB, CL7777
159 INTEGER (KIND=JPLIKB) J, IL7777, INGRIB, IREP8, ILGRIBA, ILGRIBB, IGRIBED
160 LOGICAL LLNOMM, LLERFA, LLIMST
161 CHARACTER (LEN=256) CLNOMF, CLNOMD, CLNOMB
162 CHARACTER (LEN=16) CLSTTU
163 INTEGER (KIND=JPLIKB) INIMES
164 INTEGER (KIND=JPLIKM) IREP4
165 
166 ldecri = .false.
167 
168 IF (klongd < 10) RETURN ! Trop petit pour etre un GRIB1
169 
170 ingrib = kdonne(1) ! Methode de codage
171 clgrib = transfer(kdonne(4:5), clgrib) ! Debut de l'entete GRIB1
172 
173 IF ((ingrib /= 3) .AND. (.NOT. falgra(ingrib))) RETURN
174 
175 IF (clgrib(1:4) /= 'GRIB') RETURN
176 
177 igribed = mod(ichar(clgrib(8:8)), 256)
178 
179 IF ((igribed /= 1) .AND. (igribed /= 2)) RETURN
180 
181 ! Recuperation de la longueur du message GRIB
182 
183 ilgriba = 0
184 
185 IF (igribed == 1) THEN
186  DO j = 5, 7
187  ilgriba = 256 * ilgriba + mod(ichar(clgrib(j:j)), 256)
188  ENDDO
189 ELSE
190  DO j = 9, 16
191  ilgriba = 256 * ilgriba + mod(ichar(clgrib(j:j)), 256)
192  ENDDO
193 ENDIF
194 
195 ! On cherche maintenant la fin du message GRIB1
196 
197 cl7777 = transfer(kdonne(klongd-1:klongd), cl7777)
198 il7777 = len(cl7777)
199 
200 DO j = 0, il7777-4
201  IF (cl7777(il7777-j-3:il7777-j) == '7777') EXIT
202 ENDDO
203 
204 IF (j == -1) RETURN
205 
206 ! Calcul de la longueur du message GRIB en octets
207 
208 ilgribb = (klongd-3)*8 - j
209 
210 ! On verifie que les deux longueurs correspondent
211 
212 IF (ilgriba /= ilgribb) RETURN
213 
214 ! Ouverture du fichier externe
215 
216 IF (fa%FICHIER(irang)%NFILEP == 0) THEN
217  CALL lfiopt_fort &
218 & (fa%LFI, irep, knumer, llnomm, clnomf, &
219 & clsttu, llerfa, llimst, inimes)
220  IF (irep /= 0) RETURN
221  CALL fileparse (clnomf, clnomd, clnomb)
222  clnomf = trim(clnomd)//'GRIB'//trim(clnomb)
223  CALL fi_fopen (fa%FICHIER(irang)%NFILEP, clnomf, "a")
224  IF (fa%FICHIER(irang)%NFILEP == 0) THEN
225  CALL fi_errno (irep4)
226  irep = irep4
227  RETURN
228  ENDIF
229 ENDIF
230 
231 ! Ecriture de l'article GRIB
232 
233 CALL fi_fwrite (irep8, kdonne(4), ilgriba, 1_jplikb, &
234  & fa%FICHIER(irang)%NFILEP)
235 IF (irep8 /= 1) THEN
236  CALL fi_errno (irep4)
237  irep = irep4
238 ELSE
239  irep = 0
240 ENDIF
241 
242 fa%FICHIER(irang)%NOFFST = fa%FICHIER(irang)%NOFFST + ilgriba
243 
244 ! Ecriture d'un article referencant le champ GRIB
245 
246 idonne(1:3) = kdonne(1:3)
247 idonne(4) = fa%FICHIER(irang)%NOFFST
248 idonne(5) = ilongd
249 
250 CALL lfiecr_fort &
251 & (fa%LFI, irep, knumer, clnoma(1:ilnoma), &
252 & idonne, ilongd)
253 
254 IF (irep /= 0) RETURN
255 
256 ldecri = .true.
257 
258 END SUBROUTINE wgrib1
259 
260 SUBROUTINE fileparse (CDNOMF, CDNOMD, CDNOMB)
262 CHARACTER (LEN=*) :: CDNOMF, CDNOMD, CDNOMB
263 
264 INTEGER (KIND=JPLIKB) :: I
265 
266 i = index(cdnomf, "/", .true.)
267 
268 IF (i == 0) THEN
269  cdnomd = ''
270  cdnomb = cdnomf
271 ELSE
272  cdnomd = cdnomf(1:i)
273  cdnomb = cdnomf(i+1:)
274 ENDIF
275 
276 END SUBROUTINE fileparse
277 
278 END SUBROUTINE faisan_fort
279 
280 
281 
282 ! Oct-2012 P. Marguinaud 64b LFI
283 SUBROUTINE faisan64 &
284 & (krep, knumer, cdnoma, kdonne, klongd)
285 USE fa_mod, ONLY : fa => fa_com_default, &
288 USE lfi_precision
289 IMPLICIT NONE
290 ! Arguments
291 INTEGER (KIND=JPLIKB) KREP ! OUT
292 INTEGER (KIND=JPLIKB) KNUMER ! IN
293 CHARACTER (LEN=*) CDNOMA ! IN
294 INTEGER (KIND=JPLIKB) KLONGD ! IN
295 INTEGER (KIND=JPLIKB) KDONNE (klongd) ! IN
296 
297 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
298 
299 CALL faisan_fort &
300 & (fa, krep, knumer, cdnoma, kdonne, klongd)
301 
302 END SUBROUTINE faisan64
303 
304 SUBROUTINE faisan &
305 & (krep, knumer, cdnoma, kdonne, klongd)
306 USE fa_mod, ONLY : fa => fa_com_default, &
309 USE lfi_precision
310 IMPLICIT NONE
311 ! Arguments
312 INTEGER (KIND=JPLIKM) KREP ! OUT
313 INTEGER (KIND=JPLIKM) KNUMER ! IN
314 CHARACTER (LEN=*) CDNOMA ! IN
315 INTEGER (KIND=JPLIKM) KLONGD ! IN
316 INTEGER (KIND=JPLIKB) KDONNE (klongd) ! IN
317 
318 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
319 
320 CALL faisan_mt &
321 & (fa, krep, knumer, cdnoma, kdonne, klongd)
322 
323 END SUBROUTINE faisan
324 
325 SUBROUTINE faisan_mt &
326 & (fa, krep, knumer, cdnoma, kdonne, klongd)
327 USE fa_mod, ONLY : fa_com
328 USE lfi_precision
329 IMPLICIT NONE
330 ! Arguments
331 type(fa_com) fa ! INOUT
332 INTEGER (KIND=JPLIKM) KREP ! OUT
333 INTEGER (KIND=JPLIKM) KNUMER ! IN
334 CHARACTER (LEN=*) CDNOMA ! IN
335 INTEGER (KIND=JPLIKM) KLONGD ! IN
336 INTEGER (KIND=JPLIKB) KDONNE (klongd) ! IN
337 ! Local integers
338 INTEGER (KIND=JPLIKB) IREP ! OUT
339 INTEGER (KIND=JPLIKB) INUMER ! IN
340 INTEGER (KIND=JPLIKB) ILONGD ! IN
341 ! Convert arguments
342 
343 inumer = int( knumer, jplikb)
344 ilongd = int( klongd, jplikb)
345 
346 CALL faisan_fort &
347 & (fa, irep, inumer, cdnoma, kdonne, ilongd)
348 
349 krep = int( irep, jplikm)
350 
351 END SUBROUTINE faisan_mt
352 
353 !INTF KREP OUT
354 !INTF KNUMER IN
355 !INTF CDNOMA IN
356 !INTF KDONNE IN KDIMS=KLONGD
357 !INTF KLONGD IN
358 
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
subroutine lfiecr_fort(LFI, KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfiecr.F90:6
integer, parameter jplikb
subroutine fileparse(CDNOMF, CDNOMD, CDNOMB)
Definition: faisan.F90:261
subroutine faisan64(KREP, KNUMER, CDNOMA, KDONNE, KLONGD)
Definition: faisan.F90:285
logical, save fa_com_default_init
Definition: fa_mod.F90:477
subroutine lfiopt_fort(LFI, KREP, KNUMER, LDNOMM, CDNOMF, CDSTTO, LDERFA, LDIMST, KNIMES)
Definition: lfiopt.F90:8
subroutine faisan_fort(FA, KREP, KNUMER, CDNOMA, KDONNE, KLONGD)
Definition: faisan.F90:5
subroutine new_fa_default()
Definition: fa_mod.F90:649
Definition: fa_mod.F90:1
subroutine faisan_mt(FA, KREP, KNUMER, CDNOMA, KDONNE, KLONGD)
Definition: faisan.F90:327
subroutine lfiver_fort(LFI, PVEROU, CDSENS)
Definition: lfiver.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
integer, parameter jplikm
type(fa_com), target, save fa_com_default
Definition: fa_mod.F90:476
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
subroutine faisan(KREP, KNUMER, CDNOMA, KDONNE, KLONGD)
Definition: faisan.F90:306
subroutine wgrib1(LDECRI)
Definition: faisan.F90:152
ERROR in index
Definition: ecsort_shared.h:90
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5