The TELEMAC-MASCARET system  trunk
realu.f
Go to the documentation of this file.
1 ! *******************************
2  DOUBLE PRECISION FUNCTION realu
3 ! *******************************
4 !
5  &( icol , ligne )
6 !
7 !***********************************************************************
8 ! DAMOCLES V6P2 21/08/2010
9 !***********************************************************************
10 !
11 !brief DECODES A REAL, FROM COLUMN ICOL+1 OF THE LINE.
12 !+ MOVES THE POINTER ICOL TO THE LAST DECODED CHARACTER.
13 !+ ACCEPTS F FORMAT OR E FORMAT.
14 !+ ACCEPTS REALS WITH DECIMAL POINTS; ACCEPTS ',' FOR '.'.
15 !+ IF THE STRING IS NOT COMPLETE, GOES TO THE NEXT LINE
16 !+ IF NEED BE.
17 !+ MOVES THE POINTER ICOL TO THE LAST DECODED CHARACTER
18 !+ OR TO ICOL=0 IF THE NEXT LINE WAS READ.
19 !
20 !note PORTABILITY : IBM,CRAY,HP,SUN
21 !
22 !warning IF THE VALUE READ IS NOT A REAL, COULD YIELD A
23 !+ NON-CONTROLLED ERROR BY THE PROGRAM
24 !
25 !history J.M. HERVOUET (LNH); A. YESSAYAN
26 !+ 30/09/1993
27 !+ V5P1
28 !+
29 !
30 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
31 !+ 13/07/2010
32 !+ V6P0
33 !+ Translation of French comments within the FORTRAN sources into
34 !+ English comments
35 !
36 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
37 !+ 21/08/2010
38 !+ V6P0
39 !+ Creation of DOXYGEN tags for automated documentation and
40 !+ cross-referencing of the FORTRAN sources
41 !
42 !history J-M HERVOUET (LNHE)
43 !+ 30/05/2012
44 !+ Test CDEB.EQ.'E'.OR.CDEB.EQ.'E'.OR.CDEB.EQ.'D'.OR.CDEB.EQ.'D'
45 !+ Replaced by CDEB.EQ.'E'.OR.CDEB.EQ.'D', other stupid tests alike.
46 !
47 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
48 !| ICOL |<->| POSITION COURANTE DU POINTEUR DANS LA LIGNE
49 !| LIGNE |<->| LIGNE EN COURS DE DECODAGE
50 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
51 !
54  IMPLICIT NONE
55 !
56  INTEGER ICOL
57  CHARACTER(LEN=*) LIGNE
58 !
59  INTEGER NEXT,PREVAL
60  EXTERNAL next,preval
61 !
62 !-----------------------------------------------------------------------
63 !
64  INTRINSIC log10,dble,int,char
65 !
66  INTEGER I,I1,I2,ILONG,IPOINT,IFDECI,ILDECI,JD1,JD2,I3
67  LOGICAL FORMAE,LUFIC,LISUIV,VUPOIN
68  CHARACTER(LEN=1) CODE,CDEB,CDEB2,TABUL
69  CHARACTER(LEN=3) LLONG,LLDECI
70  CHARACTER(LEN=72) FORMA,LIGNE2
71  DOUBLE PRECISION RSIGNE , RVAL
72 !
73 !***********************************************************************
74 !
75  lufic = .false.
76  lisuiv = .false.
77  vupoin = .false.
78  tabul = char(9)
79 !
80  i1 = next( icol+1 , ligne )
81 !
82 ! //// DETERMINES THE FORMAT: F OR E ////
83 !
84  formae = .false.
85 !
86 ! //// DECODES THE SIGN IF NEED BE ////
87 !
88  rsigne = +1.d0
89  IF ( ligne(i1:i1).EQ.'-' ) THEN
90  rsigne = -1.d0
91  i1 = next( i1+1 , ligne )
92  ELSE IF ( ligne(i1:i1).EQ.'+' ) THEN
93  rsigne = +1.d0
94  i1 = next( i1+1 , ligne )
95  ENDIF
96 !
97 ! //// SEEKS THE FIRST WHITE CHARACTER FOLLOWING THE NUMBER ////
98 ! OR A SEPARATOR ';'
99 !
100  i2 = preval( i1 , ligne , ' ' , ';' ,tabul)
101 !
102 ! CASE WHERE THE REAL DOES NOT FINISH ON THE LINE LINE
103 !
104  IF (i2.GT.longli) THEN
105  lufic=.true.
106  READ(nfic,end=900,err=998,fmt='(A)') ligne2
107  cdeb = ligne2(1:1)
108  cdeb2 = ligne2(2:2)
109 !
110  IF ((cdeb.EQ.'0'.OR.cdeb.EQ.'1'.OR.cdeb.EQ.'2'.OR.
111  & cdeb.EQ.'3'.OR.cdeb.EQ.'4'.OR.cdeb.EQ.'5'.OR.
112  & cdeb.EQ.'6'.OR.cdeb.EQ.'7'.OR.cdeb.EQ.'8'.OR.
113  & cdeb.EQ.'9'.OR.cdeb.EQ.'.'.OR.cdeb.EQ.'+'.OR.
114  & cdeb.EQ.'-'.OR.cdeb.EQ.',')
115 !
116  & .OR.
117 !
118 ! CASE WHERE IT DEPENDS ON THE SECOND CHARACTER OF THE FOLLOWING LINE
119 !
120  & ( (cdeb.EQ.'E'.OR.cdeb.EQ.'D')
121  & .AND.
122  & ( cdeb2.EQ.'0'.OR.cdeb2.EQ.'1'.OR.cdeb2.EQ.'2'.OR.
123  & cdeb2.EQ.'3'.OR.cdeb2.EQ.'4'.OR.cdeb2.EQ.'5'.OR.
124  & cdeb2.EQ.'6'.OR.cdeb2.EQ.'7'.OR.cdeb2.EQ.'8'.OR.
125  & cdeb2.EQ.'9'.OR.cdeb2.EQ.'+'.OR.cdeb2.EQ.'-' )))
126 !
127  & THEN
128 !
129  lisuiv = .true.
130  i3=1
131  i3=preval(i3,ligne2 , ' ' , ';' ,tabul)
132  IF (i1.LE.longli) THEN
133  ligne = ligne(i1:longli)//ligne2(1:i3)
134  ELSE
135  ligne = ligne2(1:i3)
136  ENDIF
137  i2 = longli-i1+1+i3
138  i1 = 1
139  ENDIF
140  ENDIF
141  GOTO 910
142 !
143  900 CONTINUE
144  retour = .true.
145  910 CONTINUE
146 !
147 ! ILONG: LENGTH OF THE REAL
148  ilong = i2 - i1
149  ipoint = i2 - 1
150  ifdeci = i2 - 1
151  DO i = i1 , i2-1
152 ! ACCEPTS '.' AND ','
153  IF ( ligne(i:i).EQ.'.' ) THEN
154  ipoint = i
155  vupoin=.true.
156  ELSEIF ( ligne(i:i).EQ.',' ) THEN
157  ligne(i:i)='.'
158  ipoint = i
159  vupoin=.true.
160  ELSEIF (ligne(i:i).EQ.'E') THEN
161 ! ACCEPTS BOTH FORMATS E AND D
162  formae = .true.
163  ifdeci = i-1
164  ELSEIF (ligne(i:i).EQ.'D') THEN
165  ligne(i:i)='E'
166  formae = .true.
167  ifdeci = i-1
168  ENDIF
169  ENDDO ! I
170 !
171 ! //// NUMBER OF DECIMAL POINTS ///
172 !
173  IF (vupoin) THEN
174  ildeci = ifdeci - ipoint
175  ELSE
176  ildeci = 0
177  ENDIF
178 !
179 ! //// DECODING FORMAT ////
180 !
181  code = 'F'
182  IF ( formae ) code = 'E'
183  jd1 = 3 - int(log10(dble(ilong)))
184  WRITE (llong,'(I3)') ilong
185  jd2 = 3
186  IF ( ildeci.GT.0 ) jd2 = 3-int(log10(dble(ildeci)))
187  WRITE (lldeci,'(I3)') ildeci
188  IF ( i1.GT.1 ) THEN
189  WRITE ( forma , 1010 ) i1-1,code,llong(jd1:3),lldeci(jd2:3)
190  ELSE
191  WRITE ( forma , 1020 ) code,llong(jd1:3),lldeci(jd2:3)
192  ENDIF
193 !
194 1010 FORMAT('(',i3,'X,',a1,a,'.',a,')' )
195 1020 FORMAT('(',a1,a,'.',a,')' )
196 !
197 ! //// DECODES ////
198 !
199  READ ( ligne , forma , err=995 ) rval
200  realu = rsigne * rval
201 !
202 ! //// UPDATES THE POINTER ////
203 !
204  IF (lufic) THEN
205  nlign = nlign + 1
206  ligne = ligne2
207  IF (lisuiv) THEN
208  icol = i3-1
209  ELSE
210  icol = 0
211  ENDIF
212  ELSE
213  icol = i2 - 1
214  ENDIF
215 !
216 !-----------------------------------------------------------------------
217 !
218  RETURN
219 !
220 ! TREATS THE ERRORS DUE TO THE INTERNAL READ FOR CONVERSION
221 !
222 995 CONTINUE
223  WRITE(lu,1996) nlign
224  WRITE(lu,*) ligne
225 1996 FORMAT(1x,'ERREUR LINE ',1i6,', REAL EXPECTED : ',/)
226  erreur=.true.
227  RETURN
228 !
229 ! TREATS THE ERRORS DUE TO FILE MISREADING
230 !
231 998 CONTINUE
232  WRITE(lu,1999) nfic,nlign+1
233 1999 FORMAT(1x,'LOGICAL UNIT ',1i2,' ERROR LINE ',1i6)
234  retour = .true.
235  RETURN
236 !
237  END
double precision function realu(ICOL, LIGNE)
Definition: realu.f:7
logical erreur
Y. AUDOUIN (EDF LAB, LNHE) 09/05/2014 V7P0 First version.