SURFEX v8.1
General documentation of Surfex
lfiren.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe LFI
3 
4 SUBROUTINE lfiren_fort &
5 & (lfi, krep, knumer, cdnom1, cdnom2 )
6 USE lfimod, ONLY : lficom
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! SOUS-PROGRAMME PERMETTANT DE RENOMMER UN ARTICLE (DE DONNEES)
13 ! SUR UNE UNITE LOGIQUE OUVERTE POUR LE LOGICIEL DE FICHIERS INDEXES
14 ! *LFI*. LE NOUVEAU NOM D'ARTICLE NE DOIT PAS Y ETRE DEJA UTILISE.
15 !**
16 ! ARGUMENTS : KREP (SORTIE) ==> CODE-REPONSE DU SOUS-PROGRAMME;
17 ! KNUMER (ENTREE) ==> LFI%NUMERO DE L'UNITE LOGIQUE;
18 ! CDNOM1 (ENTREE) ==> NOM DE L'ARTICLE A RENOMMER;
19 ! CDNOM2 (ENTREE) ==> NOUVEAU NOM A DONNER A L'ARTICLE.
20 !
21 !
22 TYPE(lficom) :: LFI
23 CHARACTER CDNOM1*(*), CDNOM2*(*), CLNOM1*(lfi%jpncpn), &
24 & CLNOM2*(LFI%JPNCPN)
25 !
26 INTEGER (KIND=JPLIKB) KREP, KNUMER, IRANG, IREP, ILCDN1
27 INTEGER (KIND=JPLIKB) ILCLN1, ILCDN2, ILCLN2
28 INTEGER (KIND=JPLIKB) IDECBL, IPOSBL, IARTEX, INBALO
29 INTEGER (KIND=JPLIKB) IRGPIM, IRETIN, INIMES
30 !
31 LOGICAL LLECR, LLVERF
32 !
33 CHARACTER(LEN=LFI%JPLSPX) CLNSPR
34 CHARACTER(LEN=LFI%JPLMES) CLMESS
35 CHARACTER(LEN=LFI%JPLFTX) CLACTI
36 LOGICAL LLFATA
37 
38 !**
39 ! 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
40 !-----------------------------------------------------------------------
41 !
42 ! Appel legerement anticipe a LFINUM, garantissant l'initialisa-
43 ! tion des variables globales du logiciel a la 1ere utilisation.
44 !
45 REAL(KIND=JPRB) :: ZHOOK_HANDLE
46 IF (lhook) CALL dr_hook('LFIREN_FORT',0,zhook_handle)
47 clacti=''
48 CALL lfinum_fort &
49 & (lfi, knumer,irang)
50 llverf=.false.
51 irep=0
52 llecr=.false.
53 ilcdn1=int(len(cdnom1), jplikb)
54 ilcdn2=int(len(cdnom2), jplikb)
55 !
56 IF (min(ilcdn1,ilcdn2).LE.0) THEN
57 !
58  irep=-15
59 !
60  IF (ilcdn1.LE.0) THEN
61  clnom1=lfi%CHINCO(:lfi%JPNCPN)
62  ilcln1=lfi%JPNCPN
63  ELSE
64  ilcln1=min(ilcdn1,lfi%JPNCPN)
65  clnom1=cdnom1(:ilcln1)
66  ENDIF
67 !
68  IF (ilcdn2.LE.0) THEN
69  clnom2=lfi%CHINCO(:lfi%JPNCPN)
70  ilcln2=lfi%JPNCPN
71  ELSE
72  ilcln2=min(ilcdn2,lfi%JPNCPN)
73  clnom2=cdnom2(:ilcln2)
74  ENDIF
75 !
76  GOTO 1001
77 !
78 ELSEIF (cdnom1.EQ.' '.OR.cdnom2.EQ.' ') THEN
79 !
80  irep=-18
81 !
82  IF (cdnom1.EQ.' ') THEN
83  clnom1=' '
84  ilcln1=1
85  ELSE
86  ilcln1=min(ilcdn1,lfi%JPNCPN)
87  clnom1=cdnom1(:ilcln1)
88  ENDIF
89 !
90  IF (cdnom2.EQ.' ') THEN
91  clnom2=' '
92  ilcln2=1
93  ELSE
94  ilcln2=min(ilcdn2,lfi%JPNCPN)
95  clnom2=cdnom2(:ilcln2)
96  ENDIF
97 !
98  GOTO 1001
99 !
100 ENDIF
101 !
102 ! Recherche de la longueur "utile" des noms d'article specifies.
103 ! (c'est-a-dire sans tenir compte des blancs terminaux eventuels)
104 !
105 idecbl=0
106 !
107 101 CONTINUE
108 iposbl=idecbl+int(index(cdnom1(idecbl+1:),' '), jplikb)
109 !
110 IF (iposbl.LE.idecbl) THEN
111  ilcln1=ilcdn1
112 ELSEIF (cdnom1(iposbl:).EQ.' ') THEN
113  ilcln1=iposbl-1
114 ELSE
115  idecbl=iposbl
116  GOTO 101
117 ENDIF
118 !
119 idecbl=0
120 !
121 102 CONTINUE
122 iposbl=idecbl+int(index(cdnom2(idecbl+1:),' '), jplikb)
123 !
124 IF (iposbl.LE.idecbl) THEN
125  ilcln2=ilcdn2
126 ELSEIF (cdnom2(iposbl:).EQ.' ') THEN
127  ilcln2=iposbl-1
128 ELSE
129  idecbl=iposbl
130  GOTO 102
131 ENDIF
132 !
133 IF (ilcln1.GT.lfi%JPNCPN) THEN
134  ilcln1=lfi%JPNCPN
135  irep=-15
136 ENDIF
137 !
138 IF (ilcln2.GT.lfi%JPNCPN) THEN
139  ilcln2=lfi%JPNCPN
140  irep=-15
141 ENDIF
142 !
143 clnom1=cdnom1(:ilcln1)
144 clnom2=cdnom2(:ilcln2)
145 IF (irep.NE.0) GOTO 1001
146 !
147 IF (irang.EQ.0) THEN
148  irep=-1
149  GOTO 1001
150 ENDIF
151 !
152  IF (lfi%LMULTI) CALL lfiver_fort &
153 & (lfi, lfi%VERRUE(irang),'ON')
154 llverf=lfi%LMULTI
155 !
156 IF (lfi%NEXPOR(irang).GT.0) THEN
157 !
158 ! Fichier en cours d'export... la seule modification acceptee
159 ! est l'ajout de nouveaux articles.
160 !
161  irep=-37
162  GOTO 1001
163 ENDIF
164 !
165 iartex=0
166 inbalo=lfi%MDES1D(ixm(lfi%JPNALO,irang))
167 !
168 IF (inbalo.NE.0) THEN
169 !**
170 ! 2. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
171 ! A LA RECHERCHE DU NOUVEAU NOM D'ARTICLE, QUI NE DOIT
172 ! PAS ETRE LE NOM D'UN ARTICLE EXISTANT.
173 !-----------------------------------------------------------------------
174 !
175  CALL lfiran_fort &
176 & (lfi, irep,irang,clnom2(:ilcln2), &
177 & irgpim,iartex,iretin)
178 !
179  IF (iretin.EQ.1) THEN
180  GOTO 903
181  ELSEIF (iretin.EQ.2) THEN
182  GOTO 904
183  ELSEIF (iretin.NE.0) THEN
184  GOTO 1001
185  ENDIF
186 !
187  IF (iartex.NE.0) THEN
188  irep=-25
189  clacti=clnom2(:ilcln2)
190  GOTO 1001
191  ENDIF
192 !**
193 ! 3. - EXPLORATION DES (PAIRES DE) PAGES ET ARTICLES D'INDEX,
194 ! A LA RECHERCHE DE L'ARTICLE LOGIQUE A RENOMMER.
195 !-----------------------------------------------------------------------
196 !
197  CALL lfiran_fort &
198 & (lfi, irep,irang,clnom1(:ilcln1), &
199 & irgpim,iartex,iretin)
200 !
201  IF (iretin.EQ.1) THEN
202  GOTO 903
203  ELSEIF (iretin.EQ.2) THEN
204  GOTO 904
205  ELSEIF (iretin.NE.0) THEN
206  GOTO 1001
207  ENDIF
208 !
209 ENDIF
210 !
211 IF (iartex.EQ.0) THEN
212  irep=-20
213  clacti=clnom1(:ilcln1)
214  GOTO 1001
215 ENDIF
216 !**
217 ! 4. - TOUT EST OK... ON EFFECTUE LE CHANGEMENT DE NOM.
218 !-----------------------------------------------------------------------
219 !
220 lfi%CNOMAR(ixc(iartex,irgpim))=clnom2(:ilcln2)
221 lfi%LECRPI(irgpim,1)=.true.
222 lfi%NBRENO(irang)=lfi%NBRENO(irang)+1
223 !
224 ! On met a jour ce qui a trait aux acces pseudo-sequentiels...
225 !
226 lfi%NDERGF(irang)=lfi%JPNAPP*lfi%MFACTM(irang)* &
227 & (lfi%MRGPIF(irgpim)-1)+iartex
228 lfi%CNDERA(irang)=clnom2(:ilcln2)
229 lfi%NSUIVF(irang)=lfi%JPNIL
230 lfi%NPRECF(irang)=lfi%JPNIL
231 !
232 IF (.NOT.lfi%LMODIF(irang)) THEN
233 !
234 ! CAS DE LA PREMIERE MODIFICATION DEPUIS L'OUVERTURE DU FICHIER.
235 !
236  lfi%LMODIF(irang)=.true.
237  CALL lfimoe_fort &
238 & (lfi, irep,irang,iretin)
239 !
240  IF (iretin.EQ.1) THEN
241  GOTO 903
242  ELSEIF (iretin.EQ.2) THEN
243  GOTO 904
244  ELSEIF (iretin.NE.0) THEN
245  GOTO 1001
246  ENDIF
247 !
248 ENDIF
249 !
250 GOTO 1001
251 !**
252 ! 9. - CI-DESSOUS, ETIQUETTES DE BRANCHEMENT EN CAS D'ERREUR E/S.
253 !-----------------------------------------------------------------------
254 !
255 903 CONTINUE
256 clacti='WRITE'
257 GOTO 909
258 !
259 904 CONTINUE
260 clacti='READ'
261 !
262 909 CONTINUE
263 !
264 ! AU CAS OU, ON FORCE LE CODE-REPONSE ENTREE/SORTIE A ETRE POSITIF.
265 !
266 irep=abs(irep)
267 !**
268 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
269 ! VIA LE SOUS-PROGRAMME "LFIEMS" .
270 !-----------------------------------------------------------------------
271 !
272 1001 CONTINUE
273 krep=irep
274 llfata=llmoer(irep,irang)
275 !
276 IF (irang.NE.0) THEN
277  lfi%NDEROP(irang)=13
278  lfi%NDERCO(irang)=irep
279  IF (llverf) CALL lfiver_fort &
280 & (lfi, lfi%VERRUE(irang),'OFF')
281 ENDIF
282 !
283 IF (llfata.OR.ixnims(irang).EQ.2) THEN
284  inimes=2
285 ELSE
286  IF (lhook) CALL dr_hook('LFIREN_FORT',1,zhook_handle)
287  RETURN
288 ENDIF
289 !
290 clnspr='LFIREN'
291 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
292 & '', CDNOM1='''''',A,'''''', CDNOM2='''''',A,'''''''')') &
293 & krep,knumer,clnom1(:ilcln1),clnom2(:ilcln2)
294 CALL lfiems_fort &
295 & (lfi, knumer,inimes,irep,llfata, &
296 & clmess,clnspr,clacti)
297 !
298 IF (lhook) CALL dr_hook('LFIREN_FORT',1,zhook_handle)
299 
300 CONTAINS
301 
302 #include "lficom2.ixc.h"
303 #include "lficom2.ixm.h"
304 #include "lficom2.ixnims.h"
305 #include "lficom2.llmoer.h"
306 
307 END SUBROUTINE lfiren_fort
308 
309 
310 
311 ! Oct-2012 P. Marguinaud 64b LFI
312 SUBROUTINE lfiren64 &
313 & (krep, knumer, cdnom1, cdnom2)
314 USE lfimod, ONLY : lfi => lficom_default, &
317 USE lfi_precision
318 IMPLICIT NONE
319 ! Arguments
320 INTEGER (KIND=JPLIKB) KREP ! OUT
321 INTEGER (KIND=JPLIKB) KNUMER ! IN
322 CHARACTER (LEN=*) CDNOM1 ! IN
323 CHARACTER (LEN=*) CDNOM2 ! IN
324 
325 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
326 
327 CALL lfiren_fort &
328 & (lfi, krep, knumer, cdnom1, cdnom2)
329 
330 END SUBROUTINE lfiren64
331 
332 SUBROUTINE lfiren &
333 & (krep, knumer, cdnom1, cdnom2)
334 USE lfimod, ONLY : lfi => lficom_default, &
337 USE lfi_precision
338 IMPLICIT NONE
339 ! Arguments
340 INTEGER (KIND=JPLIKM) KREP ! OUT
341 INTEGER (KIND=JPLIKM) KNUMER ! IN
342 CHARACTER (LEN=*) CDNOM1 ! IN
343 CHARACTER (LEN=*) CDNOM2 ! IN
344 
345 IF (.NOT. lficom_default_init) CALL new_lfi_default ()
346 
347 CALL lfiren_mt &
348 & (lfi, krep, knumer, cdnom1, cdnom2)
349 
350 END SUBROUTINE lfiren
351 
352 SUBROUTINE lfiren_mt &
353 & (lfi, krep, knumer, cdnom1, cdnom2)
354 USE lfimod, ONLY : lficom
355 USE lfi_precision
356 IMPLICIT NONE
357 ! Arguments
358 type(lficom) lfi ! INOUT
359 INTEGER (KIND=JPLIKM) KREP ! OUT
360 INTEGER (KIND=JPLIKM) KNUMER ! IN
361 CHARACTER (LEN=*) CDNOM1 ! IN
362 CHARACTER (LEN=*) CDNOM2 ! IN
363 ! Local integers
364 INTEGER (KIND=JPLIKB) IREP ! OUT
365 INTEGER (KIND=JPLIKB) INUMER ! IN
366 ! Convert arguments
367 
368 inumer = int( knumer, jplikb)
369 
370 CALL lfiren_fort &
371 & (lfi, irep, inumer, cdnom1, cdnom2)
372 
373 krep = int( irep, jplikm)
374 
375 END SUBROUTINE lfiren_mt
376 
377 !INTF KREP OUT
378 !INTF KNUMER IN
379 !INTF CDNOM1 IN
380 !INTF CDNOM2 IN
subroutine lfimoe_fort(LFI, KREP, KRANG, KRETIN)
Definition: lfimoe.F90:5
subroutine lfiren(KREP, KNUMER, CDNOM1, CDNOM2)
Definition: lfiren.F90:334
integer, parameter jplikb
subroutine lfiran_fort(LFI, KREP, KRANG, CDNOMA, KRGPIM, KARTEX, KRETIN)
Definition: lfiran.F90:6
subroutine new_lfi_default()
Definition: lfimod.F90:376
logical, save lficom_default_init
Definition: lfimod.F90:371
subroutine lfinum_fort(LFI, KNUMER, KRANG)
Definition: lfinum.F90:6
subroutine lfiver_fort(LFI, PVEROU, CDSENS)
Definition: lfiver.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
subroutine lfiren_fort(LFI, KREP, KNUMER, CDNOM1, CDNOM2)
Definition: lfiren.F90:6
type(lficom), target, save lficom_default
Definition: lfimod.F90:370
logical lhook
Definition: yomhook.F90:15
subroutine lfiren_mt(LFI, KREP, KNUMER, CDNOM1, CDNOM2)
Definition: lfiren.F90:354
subroutine lfiren64(KREP, KNUMER, CDNOM1, CDNOM2)
Definition: lfiren.F90:314
integer, parameter jplikm
subroutine lfiems_fort(LFI, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI)
Definition: lfiems.F90:7
Definition: lfimod.F90:1
ERROR in index
Definition: ecsort_shared.h:90