The TELEMAC-MASCARET system  trunk
intlu.f
Go to the documentation of this file.
1 ! **********************
2  INTEGER FUNCTION intlu
3 ! **********************
4 !
5  &( icol , ligne )
6 !
7 !***********************************************************************
8 ! DAMOCLES V7P1
9 !***********************************************************************
10 !
11 !brief DECODES AN INTEGER, FROM COLUMN ICOL+1 OF THE LINE.
12 !+ MOVES THE POINTER ICOL TO THE LAST DECODED CHARACTER.
13 !+ IF THE STRING IS NOT COMPLETE, GOES TO THE NEXT LINE
14 !+ IF NEED BE.
15 !+ MOVES THE POINTER ICOL TO THE LAST DECODED CHARACTER.
16 !+ OR TO ICOL=0 IF THE NEXT LINE WAS READ.
17 !
18 !note PORTABILITY : IBM,CRAY,HP,SUN
19 !
20 !warning IF THE VALUE READ IS NOT AN INTEGER, COULD YIELD A
21 !+ NON-CONTROLLED ERROR BY THE PROGRAM
22 !
23 !history J.M. HERVOUET (LNH); A. YESSAYAN
24 !+ 30/09/1993
25 !+ V5P1
26 !+ First version
27 !
28 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
29 !+ 13/07/2010
30 !+ V6P0
31 !+ Translation of French comments within the FORTRAN sources into
32 !+ English comments
33 !
34 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
35 !+ 21/08/2010
36 !+ V6P0
37 !+ Creation of DOXYGEN tags for automated documentation and
38 !+ cross-referencing of the FORTRAN sources
39 !
40 !history J.M. HERVOUET (EDF LAB, LNHE)
41 !+ 23/06/2015
42 !+ V7P1
43 !+ Mixture of French and English corrected in an error message.
44 !
45 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
46 !| ICOL |<->| POSITION COURANTE DU POINTEUR DANS LA LIGNE
47 !| LIGNE |<->| LIGNE EN COURS DE DECODAGE
48 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49 !
52  IMPLICIT NONE
53 !
54  INTEGER, INTENT(INOUT) :: ICOL
55  CHARACTER(LEN=*), INTENT(INOUT) :: LIGNE
56 !
57  INTEGER NEXT,PREVAL
58  EXTERNAL next,preval
59 !
60 !-----------------------------------------------------------------------
61 !
62  INTRINSIC log10,dble,int,char
63 !
64  INTEGER I1,I2,ILONG,ISIGNE,IVAL,JD1,I3
65  LOGICAL LUFIC,LISUIV
66  CHARACTER(LEN=1) CDEB,TABUL
67  CHARACTER(LEN=3) LLONG
68  CHARACTER(LEN=72) LIGNE2,FORMA
69 !
70 !***********************************************************************
71 !
72  lufic = .false.
73  lisuiv = .false.
74  tabul = char(9)
75 !
76  i1 = next( icol+1 , ligne )
77 !
78 ! //// DECODES THE SIGN IF NEED BE ////
79 !
80  IF ( ligne(i1:i1).EQ.'-' ) THEN
81  isigne = -1
82  i1 = next( i1+1 , ligne )
83  ELSE IF ( ligne(i1:i1).EQ.'+' ) THEN
84  isigne = +1
85  i1 = next( i1+1 , ligne )
86  ELSE
87  isigne = +1
88  ENDIF
89 !
90 ! //// SEEKS THE FIRST WHITE CHARACTER FOLLOWING THE NUMBER ////
91 ! OR A SEPARATOR ';'
92 !
93  i2 = preval( i1 , ligne , ' ' , ';' , tabul)
94 !
95 ! CASE WHERE THE INTEGER DOES NOT FINISH ON THE LINE LINE
96 !
97  IF (i2.GT.longli) THEN
98  lufic=.true.
99  READ(nfic,end=900,err=998,fmt='(A)') ligne2
100  cdeb = ligne2(1:1)
101  IF (cdeb.EQ.'0'.OR.cdeb.EQ.'1'.OR.cdeb.EQ.'2'.OR.
102  & cdeb.EQ.'3'.OR.cdeb.EQ.'4'.OR.cdeb.EQ.'5'.OR.
103  & cdeb.EQ.'6'.OR.cdeb.EQ.'7'.OR.cdeb.EQ.'8'.OR.
104  & cdeb.EQ.'9'.OR.cdeb.EQ.'.') THEN
105  lisuiv = .true.
106  i3=1
107  i3=preval(i3,ligne2 , ' ' , ';', tabul)
108  IF (i1.LE.longli) THEN
109  ligne = ligne(i1:longli)//ligne2(1:i3)
110  ELSE
111  ligne =ligne2(1:i3)
112  ENDIF
113  i2 = longli-i1+1+i3
114  i1 = 1
115  ENDIF
116  ENDIF
117  GOTO 910
118 !
119  900 CONTINUE
120  retour = .true.
121  910 CONTINUE
122 ! ACCEPTS THE CASE WHERE A USER WRITES AN INTEGER IN
123 ! REAL FORM WITH A POINT AT THE END
124  IF(ligne(i2-1:i2-1).EQ.'.') THEN
125  ligne(i2-1:i2-1)=' '
126  i2 = i2 - 1
127  ENDIF
128 !
129 ! ILONG: LENGTH OF THE INTEGER
130  ilong = i2 - i1
131 !
132 ! //// DECODING FORMAT ////
133 !
134  jd1 = 3 - int(log10(dble(ilong)))
135  WRITE ( llong , '(I3)' ) ilong
136 !
137  IF(i1.EQ.1) THEN
138  WRITE (forma , 1101 ) llong(jd1:3)
139  ELSE
140  WRITE (forma , 1100 ) i1-1 , llong(jd1:3)
141  ENDIF
142 !
143 ! //// DECODES ////
144 !
145  READ ( ligne , forma , err=995 ) ival
146  intlu = isigne * ival
147 !
148 ! //// UPDATES THE POINTER ////
149 !
150  IF (lufic) THEN
151  nlign = nlign + 1
152  ligne = ligne2
153  IF (lisuiv) THEN
154  icol = i3-1
155  ELSE
156  icol = 0
157  ENDIF
158  ELSE
159  icol = i2 - 1
160  ENDIF
161 !
162 1100 FORMAT('(',i3,'X,I',a,')')
163 1101 FORMAT('(I',a,')')
164 !
165 !-----------------------------------------------------------------------
166 !
167  RETURN
168 !
169 ! TREATS THE ERRORS DUE TO THE INTERNAL READ FOR CONVERSION
170 !
171 995 CONTINUE
172  WRITE(lu,1996) nlign
173  WRITE(lu,*) ligne
174 1996 FORMAT(1x,'ERROR LINE ',1i6,', INTEGER EXPECTED : ',/)
175  erreur=.true.
176  RETURN
177 !
178 ! TREATS THE ERRORS DUE TO FILE MISREADING
179 !
180 998 CONTINUE
181  WRITE(lu,1999) nfic,nlign+1
182 1999 FORMAT(1x,'LOGICAL UNIT ',1i2,' ERROR LINE ',1i6)
183  retour = .true.
184  RETURN
185 !
186  END
integer function intlu(ICOL, LIGNE)
Definition: intlu.f:7
logical erreur
Y. AUDOUIN (EDF LAB, LNHE) 09/05/2014 V7P0 First version.