The TELEMAC-MASCARET system  trunk
fonstr.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE fonstr
3 ! *****************
4 !
5  &(h,zf,z,chestr,ngeo,fformat,nfon,nomfon,mesh,ffon,listin,
6  & n_names_priv,names_prive,prive)
7 !
8 !***********************************************************************
9 ! BIEF V7P1
10 !***********************************************************************
11 !
12 !brief LOOKS FOR 'BOTTOM' IN THE GEOMETRY FILE.
13 !+
14 !+ LOOKS FOR 'BOTTOM FRICTION' (COEFFICIENTS).
15 !
16 !note THE NAMES OF THE VARIABLES HAVE BEEN DIRECTLY
17 !+ WRITTEN OUT AND ARE NOT READ FROM 'TEXTE'.
18 !+ THIS MAKES IT POSSIBLE TO HAVE A GEOMETRY FILE
19 !+ COMPILED IN ANOTHER LANGUAGE.
20 !
21 !history J-M HERVOUET (LNH)
22 !+ 17/08/94
23 !+ V5P6
24 !+ First version
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 13/07/2010
28 !+ V6P0
29 !+ Translation of French comments within the FORTRAN sources into
30 !+ English comments
31 !
32 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
33 !+ 21/08/2010
34 !+ V6P0
35 !+ Creation of DOXYGEN tags for automated documentation and
36 !+ cross-referencing of the FORTRAN sources
37 !
38 !history R. KOPMANN (EDF R&D, LNHE)
39 !+ 16/04/2013
40 !+ V6P3
41 !+ Adding the format FFORMAT
42 !
43 !history Y AUDOUIN (LNHE)
44 !+ 25/05/2015
45 !+ V7P0
46 !+ Modification to comply with the hermes module
47 !
48 !history J-M HERVOUET (EDF LAB, LNHE)
49 !+ 27/07/2015
50 !+ V7P1
51 !+ Now able to read user variables and put them in PRIVE arrays.
52 !
53 !history R ATA (EDF LAB, LNHE)
54 !+ 24/05/2016
55 !+ V7P2
56 !+ BID initialised for cases of selafin files without records.
57 !
58 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 !| CHESTR |<--| FRICTION COEFFICIENT (DEPENDING ON FRICTION LAW)
60 !| FFON |-->| FRICTION COEFFICIENT IF CONSTANT
61 !| H |<--| WATER DEPTH
62 !| LISTIN |-->| IF YES, WILL GIVE A REPORT
63 !| MESH |-->| MESH STRUCTURE
64 !| N_NAMES_PRIV |-->| NUMBER OF PRIVATE ARRAYS WITH GIVEN NAMES
65 !| NAMES_PRIV |-->| NAMES OF PRIVATE ARRAYS GIVEN BY USER
66 !| NFON |-->| LOGICAL UNIT OF BOTTOM FILE
67 !| NGEO |-->| LOGICAL UNIT OF GEOMETRY FILE
68 !| NOMFON |-->| NAME OF BOTTOM FILE
69 !| PRIVE |<->| BLOCK OF PRIVATE ARRAYS
70 !| Z |<--| FREE SURFACE ELEVATION
71 !| ZF |-->| ELEVATION OF BOTTOM
72 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 !
74  USE bief, ex_fonstr => fonstr
76 !
78  IMPLICIT NONE
79 !
80 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81 !
82  TYPE(bief_obj), INTENT(INOUT) :: H,ZF,Z,CHESTR,PRIVE
83  TYPE(bief_mesh), INTENT(IN) :: MESH
84  DOUBLE PRECISION, INTENT(IN) :: FFON
85  LOGICAL, INTENT(IN) :: LISTIN
86  INTEGER, INTENT(IN) :: NGEO,NFON,N_NAMES_PRIV
87  CHARACTER(LEN=72), INTENT(IN) :: NOMFON
88  CHARACTER(LEN=32), INTENT(IN) :: NAMES_PRIVE(4)
89  CHARACTER(LEN=8), INTENT(IN) :: FFORMAT
90 !
91 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
92 !
93  INTEGER IERR,RECORD,I
94 !
95  DOUBLE PRECISION BID
96 !
97  LOGICAL CALFON,CALFRO,LUZF,LUH,LUZ
98 !
99 !-----------------------------------------------------------------------
100 !
101 ! INITIALISES
102 !
103  luh =.false.
104  luz =.false.
105  luzf =.false.
106  calfro =.true.
107  bid =0.d0
108  record =0
109 !
110 !-----------------------------------------------------------------------
111 !
112 ! LOOKS FOR THE FRICTION COEFFICIENT IN THE FILE
113 !
114  IF(lng.EQ.lng_fr)
115  & CALL find_variable(fformat, ngeo,'FROTTEMENT ',
116  & chestr%R, mesh%NPOIN,
117  & ierr,record=record,time_record=bid)
118  IF(lng.EQ.lng_en)
119  & CALL find_variable(fformat, ngeo,'BOTTOM FRICTION ',
120  & chestr%R, mesh%NPOIN,
121  & ierr,record=record,time_record=bid)
122 ! CASE OF A GEOMETRY FILE IN ANOTHER LANGUAGE
123  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_fr) THEN
124  CALL find_variable(fformat, ngeo,'BOTTOM FRICTION ',
125  & chestr%R, mesh%NPOIN,
126  & ierr,record=record,time_record=bid)
127  ENDIF
128  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_en) THEN
129  CALL find_variable(fformat, ngeo, 'FROTTEMENT ',
130  & chestr%R,mesh%NPOIN,
131  & ierr,record=record,time_record=bid)
132  ENDIF
133  IF(ierr.EQ.0) THEN
134  calfro = .false.
135  WRITE(lu,6)
136 6 FORMAT(1x,'FONSTR : FRICTION COEFFICIENTS READ IN THE',/,
137  & 1x,' GEOMETRY FILE')
138  ENDIF
139 !
140 ! LOOKS FOR THE BOTTOM ELEVATION IN THE FILE
141 !
142  IF(lng.EQ.lng_fr)
143  & CALL find_variable(fformat, ngeo,'FOND ',
144  & zf%R, mesh%NPOIN,
145  & ierr,record=record,time_record=bid)
146  IF(lng.EQ.lng_en) CALL find_variable(fformat, ngeo,
147  & 'BOTTOM ',zf%R, mesh%NPOIN,
148  & ierr,record=record,time_record=bid)
149  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_fr) THEN
150  CALL find_variable(fformat, ngeo,
151  & 'BOTTOM ', zf%R,mesh%NPOIN,
152  & ierr,record=record,time_record=bid)
153  ENDIF
154  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_en) THEN
155  CALL find_variable(fformat, ngeo,
156  & 'FOND ', zf%R,mesh%NPOIN,
157  & ierr,record=record,time_record=bid)
158  ENDIF
159 ! MESHES FROM BALMAT ?
160  IF(ierr.EQ.hermes_var_unknown_err)
161  & CALL find_variable(fformat, ngeo,
162  & 'ALTIMETRIE ', zf%R,mesh%NPOIN,
163  & ierr,record=record,time_record=bid)
164 ! TOMAWAC IN FRENCH ?
165  IF(ierr.EQ.hermes_var_unknown_err)
166  & CALL find_variable(fformat, ngeo,
167  & 'COTE_DU_FOND ', zf%R,mesh%NPOIN,
168  & ierr,record=record,time_record=bid)
169 ! TOMAWAC IN ENGLISH ?
170  IF(ierr.EQ.hermes_var_unknown_err)
171  & CALL find_variable(fformat, ngeo,
172  & 'BOTTOM_LEVEL ', zf%R,mesh%NPOIN,
173  & ierr,record=record,time_record=bid)
174  luzf = ierr.EQ.0
175 !
176  IF(.NOT.luzf) THEN
177 ! LOOKS FOR WATER DEPTH AND FREE SURFACE ELEVATION
178  IF(lng.EQ.lng_fr) CALL find_variable(fformat, ngeo,
179  & 'HAUTEUR D''EAU ', h%R,mesh%NPOIN,
180  & ierr,record=record,time_record=bid)
181  IF(lng.EQ.lng_en) CALL find_variable(fformat, ngeo,
182  & 'WATER DEPTH ', h%R,mesh%NPOIN,
183  & ierr,record=record,time_record=bid)
184  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_fr) THEN
185  CALL find_variable(fformat, ngeo,
186  & 'WATER DEPTH ', h%R,mesh%NPOIN,
187  & ierr,record=record,time_record=bid)
188 
189  ENDIF
190  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_en) THEN
191  CALL find_variable(fformat, ngeo,
192  & 'HAUTEUR D''EAU ', h%R,mesh%NPOIN,
193  & ierr,record=record,time_record=bid)
194  ENDIF
195  luh = ierr.EQ.0
196  IF(lng.EQ.lng_fr) CALL find_variable(fformat, ngeo,
197  & 'SURFACE LIBRE ', z%R,mesh%NPOIN,
198  & ierr, record=record,time_record=bid)
199  IF(lng.EQ.lng_en) CALL find_variable(fformat, ngeo,
200  & 'FREE SURFACE ',z%R, mesh%NPOIN,
201  & ierr, record=record,time_record=bid)
202  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_fr) THEN
203  CALL find_variable(fformat, ngeo,
204  & 'FREE SURFACE ', z%R,mesh%NPOIN,
205  & ierr, record=record,time_record=bid)
206  ENDIF
207  IF((ierr.EQ.hermes_var_unknown_err).AND.lng.EQ.lng_en) THEN
208  CALL find_variable(fformat, ngeo,
209  & 'SURFACE LIBRE ', z%R,mesh%NPOIN,
210  & ierr, record=record,time_record=bid)
211  ENDIF
212  luz = ierr.EQ.0
213  ENDIF
214 !
215 ! INITIALISES THE BOTTOM ELEVATION
216 !
217  IF(luzf) THEN
218 !
219  calfon = .false.
220 !
221  ELSE
222 !
223  IF (luz.AND.luh) THEN
224 !
225  CALL os( 'X=Y-Z ',x=zf,y=z,z=h)
226  WRITE(lu,25)
227 25 FORMAT(1x,'FONSTR (BIEF): ATTENTION, THE BOTTOM RESULTS',/,
228  & ' FROM DEPTH AND SURFACE ELEVATION',
229  & /,' FOUND IN THE GEOMETRY FILE')
230  calfon = .false.
231 !
232  ELSE
233 !
234  calfon = .true.
235 !
236  ENDIF
237 !
238  ENDIF
239 !
240 !-----------------------------------------------------------------------
241 !
242 ! BUILDS THE BOTTOM IF IT WAS NOT IN THE GEOMETRY FILE
243 !
244  IF(nomfon(1:1).NE.' ') THEN
245 ! A BOTTOM FILE WAS GIVEN, (RE)COMPUTES THE BOTTOM ELEVATION
246  IF(listin) THEN
247  WRITE(lu,2224) nomfon
248  IF(.NOT.calfon) THEN
249  WRITE(lu,2226)
250  ENDIF
251  ENDIF
252 2224 FORMAT(/,1x,'FONSTR (BIEF): BATHYMETRY GIVEN IN FILE : ',a72)
253 2226 FORMAT( 1x,' BATHYMETRY FOUND IN THE',/,
254  & 1x,' GEOMETRY FILE IS IGNORED',/)
255 !
256  CALL fond(zf%R,mesh%X%R,mesh%Y%R,mesh%NPOIN,nfon,
257  & mesh%NBOR%I,mesh%KP1BOR%I,mesh%NPTFR)
258 !
259  ELSEIF(calfon) THEN
260  IF(listin) THEN
261  WRITE(lu,2228)
262  ENDIF
263 2228 FORMAT(/,1x,'FONSTR (BIEF): NO BATHYMETRY IN THE GEOMETRY FILE',
264  & /,1x,' AND NO BATHYMETRY FILE. THE BOTTOM',
265  & /,1x,' LEVEL IS FIXED TO ZERO BUT STILL',
266  & /,1x,' CAN BE MODIFIED IN CORFON.',
267  & /,1x)
268  CALL os( 'X=0 ',x=zf)
269  ENDIF
270 !
271 !-----------------------------------------------------------------------
272 !
273 ! LOOKING FOR THE USER VARIABLES
274 !
275  IF(n_names_priv.GT.0) THEN
276  DO i=1,n_names_priv
277  CALL find_variable(fformat,ngeo,names_prive(i)(1:16),
278  & prive%ADR(i)%P%R,mesh%NPOIN,
279  & ierr,record=record,time_record=bid)
280  IF(ierr.EQ.0) THEN
281  WRITE(lu,*) 'VARIABLE ',names_prive(i)(1:32),
282  & ' FOUND IN THE GEOMETRY FILE'
283  ELSE
284  WRITE(lu,*) 'VARIABLE ',names_prive(i)(1:32),
285  & ' NOT FOUND IN THE GEOMETRY FILE'
286  ENDIF
287  ENDDO
288  ENDIF
289 !
290 !-----------------------------------------------------------------------
291 !
292 ! COMPUTES THE BOTTOM FRICTION COEFFICIENT
293 !
294  IF(calfro) THEN
295  CALL os('X=C ', x=chestr, c=ffon)
296  ENDIF
297  CALL strche
298 !
299 !-----------------------------------------------------------------------
300 !
301  RETURN
302  END
303 
integer, parameter lng_en
integer, parameter lng_fr
Y. AUDOUIN & J-M HERVOUET (EDF LAB, LNHE) 09/05/2014 V7P0 First version.
subroutine fonstr(H, ZF, Z, CHESTR, NGEO, FFORMAT, NFON, NOMFON, MESH, FFON, LISTIN, N_NAMES_PRIV, NAMES_PRIVE, PRIVE)
Definition: fonstr.f:8
subroutine strche
Definition: strche.f:4
subroutine fond(ZF, X, Y, NPOIN, NFON, NBOR, KP1BOR, NPTFR)
Definition: fond.f:7
subroutine find_variable(FFORMAT, FID, VAR_NAME, RES, N, IERR, TIME, EPS_TIME, RECORD, TIME_RECORD, OFFSET)
Definition: find_variable.f:8
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
integer, parameter hermes_var_unknown_err
Definition: bief.f:3