The TELEMAC-MASCARET system  trunk
read_fic_conc.f
Go to the documentation of this file.
1 ! ************************
2  SUBROUTINE read_fic_conc
3 ! ************************
4 !
5  &(cgl , what , at , nfic , found )
6 !
7 !***********************************************************************
8 ! TELEMAC2D V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief READS AND INTERPOLATES VALUES FROM THE LIQUID BOUNDARY FILE.
12 !
13 !history J-M HERVOUET (LNHE)
14 !+ 10/08/2009
15 !+ V6P0
16 !+
17 !
18 !history J-M HERVOUET (LNHE)
19 !+ 28/06/2010
20 !+ V6P0
21 !+ SIZE OF LIGN PARAMETERIZED (SEE SIZELIGN)
22 !
23 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
24 !+ 13/07/2010
25 !+ V6P0
26 !+ Translation of French comments within the FORTRAN sources into
27 !+ English comments
28 !
29 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
30 !+ 21/08/2010
31 !+ V6P0
32 !+ Creation of DOXYGEN tags for automated documentation and
33 !+ cross-referencing of the FORTRAN sources
34 !
35 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
36 !| AT |-->| TIME_RFC IN SECONDS
37 !| NFIC |-->| LOGICAL UNIT OF FILE
38 !| CGL |<--| VARIABLE READ AND INTERPOLATED
39 !| FOUND |<--| IF FALSE: VARIABLE NOT FOUND
40 !| WHAT |-->| VARIABLE TO LOOK FOR IN 8 CHARACTERS
41 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 !
44  & choix_rfc,il1_rfc,il2_rfc,
45  & tl1_rfc,tl2_rfc,nvalue_rfc,
46  & lastwhat_rfc,lastat_rfc,nlig_rfc,
47  & maxval_rfc
49  IMPLICIT NONE
50 !
51 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
52 !
53  CHARACTER(LEN=8) , INTENT(IN) :: WHAT
54  DOUBLE PRECISION, INTENT(IN) :: AT
55  DOUBLE PRECISION, INTENT(INOUT) :: CGL
56  INTEGER , INTENT(IN) :: NFIC
57  LOGICAL , INTENT(OUT) :: FOUND
58 !
59 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 !
61 ! MAXIMUM NUMBER OF CHARACTERS PER LIGN (MAY BE CHANGED)
62 !
63  INTEGER, PARAMETER :: SIZELIGN = 3000
64 !
65  INTEGER IVALUE,ILIG,OK,J,IWHAT,IDEB,IFIN
66  DOUBLE PRECISION TETA
67  DOUBLE PRECISION, PARAMETER :: TOL = 1.d-3
68 !
69  CHARACTER(LEN=SIZELIGN) :: LIGNE
70 !
71 !
72  INTRINSIC abs
73 !
74 !-----------------------------------------------------------------------
75 !
76 ! 1) (AT FIRST CALL)
77 ! READS THE LIQUID BOUNDARY FILE
78 ! INITIALISES CURRENT LINES AND INTERVAL OF TIME_RFC
79 !
80  IF(.NOT.deja_rfc) THEN
81  rewind(nfic)
82 ! SKIPS COMMENTS
83 1 READ(nfic,fmt='(A)',err=10) ligne
84  GO TO 20
85 10 CONTINUE
86  WRITE(lu,*) 'READ ERROR IN THE'
87  WRITE(lu,*) 'LIQUID BOUNDARIES FILE FOR CONC'
88  WRITE(lu,*) 'PROBABLY A PROBLEM OF FORMAT'
89  WRITE(lu,*) 'ANY WINDOWS CARRIAGE RETURNS ON UNIX OR LINUX'
90  WRITE(lu,*) 'GUILTY LINE:'
91  WRITE(lu,*) ligne
92  CALL plante(1)
93  stop
94 20 CONTINUE
95  IF(ligne(1:1).EQ.'#') GO TO 1
96 !
97 ! FINDS OUT WHAT AND HOW MANY VALUES ARE GIVEN IN THE FILE
98 !
99  nvalue_rfc = -1
100  ifin = 1
101 40 ideb = ifin
102 !
103 ! IDENTIFIES FIRST CHARACTER OF NAME
104 50 IF(ligne(ideb:ideb).EQ.' '.AND.ideb.LT.sizelign) THEN
105  ideb=ideb+1
106  GO TO 50
107  ENDIF
108 ! IDENTIFIES LAST CHARACTER OF NAME
109  ifin = ideb
110 60 IF(ligne(ifin:ifin).NE.' '.AND.ifin.LT.sizelign) THEN
111  ifin=ifin+1
112  GO TO 60
113  ENDIF
114 !
115  IF(ideb.EQ.ifin) GO TO 4
116 !
117  nvalue_rfc = nvalue_rfc + 1
118  IF(nvalue_rfc.EQ.0) THEN
119  IF(ligne(ideb:ifin-1).NE.'T') THEN
120  WRITE(lu,*) 'FIRST VALUE MUST BE TIME_RFC, DENOTED T'
121  WRITE(lu,*) 'IN FILE OF LIQUID BOUNDARIES'
122  CALL plante(1)
123  stop
124  ENDIF
125  ELSEIF(nvalue_rfc.LE.maxval_rfc) THEN
126  choix_rfc(nvalue_rfc)=' '
127  choix_rfc(nvalue_rfc)(1:ifin-ideb+1)=ligne(ideb:ifin-1)
128  ELSE
129  WRITE(lu,*) 'INCREASE MAXVAL_RFC IN DECLARATIONS_SISYPHE'
130  CALL plante(1)
131  stop
132  ENDIF
133  IF(ifin.LT.sizelign) GO TO 40
134 !
135 ! SKIPS THE LINE WITH UNITS OR NAMES
136 4 READ(nfic,fmt='(A)',err=10) ligne
137  IF(ligne(1:1).EQ.'#') GO TO 4
138 !
139 ! COUNTS LINES OF DATA
140  nlig_rfc = 0
141 998 READ(nfic,*,end=1000,err=999) ligne
142  IF(ligne(1:1).NE.'#') nlig_rfc=nlig_rfc+1
143  GO TO 998
144 999 CONTINUE
145  WRITE(lu,*) 'READING ERROR ON THE LIQUID BOUNDARIES FILE'
146  WRITE(lu,*) 'AT LINE OF DATA : ',nlig_rfc
147  WRITE(lu,*) '(COMMENTS EXCLUDED)'
148  CALL plante(1)
149  stop
150 1000 CONTINUE
151 !
152 ! DYNAMICALLY ALLOCATES TIME_RFC AND INFIC_RFC
153 !
154  ALLOCATE(time_rfc(nlig_rfc),stat=ok)
155  IF(ok.NE.0) WRITE(lu,*) 'MEMORY ALLOCATION ERROR FOR TIME_RFC'
156  ALLOCATE(infic_rfc(nvalue_rfc,nlig_rfc),stat=ok)
157  IF(ok.NE.0) WRITE(lu,*) 'MEMORY ALLOCATION ERROR FOR INFIC_RFC'
158 !
159 ! FINAL READ OF TIME_RFC AND INFIC_RFC
160 !
161  rewind(nfic)
162 ! SKIPS COMMENTS AND FIRST TWO MANDATORY LINES
163 2 READ(nfic,fmt='(A)') ligne
164  IF(ligne(1:1).EQ.'#') GO TO 2
165  READ(nfic,fmt='(A)') ligne
166 !
167  DO ilig=1,nlig_rfc
168 3 READ(nfic,fmt='(A)') ligne
169  IF(ligne(1:1).EQ.'#') THEN
170  GO TO 3
171  ELSE
172  backspace(nfic)
173  READ(nfic,*) time_rfc(ilig),
174  & (infic_rfc(ivalue,ilig),ivalue=1,nvalue_rfc)
175  ENDIF
176  ENDDO
177 !
178  CLOSE(nfic)
179  deja_rfc = .true.
180 !
181  il1_rfc = 1
182  il2_rfc = 2
183  tl1_rfc = time_rfc(1)
184  tl2_rfc = time_rfc(2)
185 !
186  WRITE(lu,*) 'THE LIQUID BOUNDARIES FILE CONTAINS'
187  WRITE(lu,*) nlig_rfc,' LINES WITH:'
188  WRITE(lu,*) (choix_rfc(ivalue),ivalue=1,nvalue_rfc)
189 !
190  ENDIF
191 !
192 !-----------------------------------------------------------------------
193 !
194 ! 2) INTERPOLATES THE DATA TO GET THE CORRECT TIME_RFC
195 !
196 ! 2.A) FINDS THE ADDRESS IN THE ARRAY OF STORED DATA
197 !
198 ! 2.B) INTERPOLATES DATA FROM THE ARRAY INFIC_RFC
199 !
200 !-----------------------------------------------------------------------
201 !
202 !
203 ! WHICH VARIABLE ?
204  iwhat = 0
205  DO j=1,nvalue_rfc
206  IF(what.EQ.choix_rfc(j)) iwhat=j
207  ENDDO
208  IF(iwhat.EQ.0) THEN
209  found=.false.
210  RETURN
211  ENDIF
212 !
213 !
214 !
215 70 IF(at.GE.tl1_rfc-tol.AND.at.LE.tl2_rfc+tol) THEN
216  teta = (at-tl1_rfc)/(tl2_rfc-tl1_rfc)
217  ELSE
218  DO j=1,nlig_rfc-1
219  IF(at.GE.time_rfc(j)-tol.AND.at.LE.time_rfc(j+1)+tol) THEN
220  tl1_rfc=time_rfc(j)
221  tl2_rfc=time_rfc(j+1)
222  il1_rfc=j
223  il2_rfc=j+1
224  GO TO 70
225  ENDIF
226  ENDDO
227  il1_rfc=il2_rfc
228  il2_rfc=il2_rfc+1
229  IF(il2_rfc.GT.nlig_rfc) THEN
230  WRITE(lu,*) 'T=',at,' OUT OF RANGE'
231  WRITE(lu,*) 'OF THE FILE OF LIQUID BOUNDARIES'
232  CALL plante(1)
233  stop
234  ENDIF
235  tl1_rfc=time_rfc(il1_rfc)
236  tl2_rfc=time_rfc(il2_rfc)
237 
238  GO TO 70
239  ENDIF
240 !
241  cgl = (1.d0-teta)*infic_rfc(iwhat,il1_rfc)
242  & + teta *infic_rfc(iwhat,il2_rfc)
243 !
244  found=.true.
245 
246  lastat_rfc=at
247  lastwhat_rfc=what
248 !
249 !-----------------------------------------------------------------------
250 !
251  RETURN
252  END
subroutine read_fic_conc(CGL, WHAT, AT, NFIC, FOUND)
Definition: read_fic_conc.f:7
double precision, dimension(:), allocatable time_rfc
double precision, dimension(:,:), allocatable infic_rfc
double precision function cgl(I, AT)
Definition: cgl.f:7