The TELEMAC-MASCARET system  trunk
lecdoi.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE lecdoi
3 ! *****************
4 !
5  &(f1,name1,mode1, f2,name2,mode2,f3,name3,mode3,
6  & npoin2,ndon,fformat,at,tv1,tv2,
7  & f11,f12,f21,f22,f31,f32,indic,chdon,nvar,texte,
8  & trouve,unitime,phastime)
9 !
10 !***********************************************************************
11 ! TOMAWAC V6P3 20/06/2011
12 !***********************************************************************
13 !
14 !brief THIS SUBROUTINE PROJECTS THE CURRENTS / WINDS ON THE
15 !+ COMPUTATION MESH AND INTERPOLATES TO FIRST TIME STEP.
16 !+
17 !+ (INSPIRED FROM SUBROUTINE FOND IN TELEMAC2D AMONGST OTHERS)
18 !
19 !history
20 !+
21 !+ V5P0
22 !+
23 !
24 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
25 !+ 13/07/2010
26 !+ V6P0
27 !+ Translation of French comments within the FORTRAN sources into
28 !+ English comments
29 !
30 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
31 !+ 21/08/2010
32 !+ V6P0
33 !+ Creation of DOXYGEN tags for automated documentation and
34 !+ cross-referencing of the FORTRAN sources
35 !
36 !history G.MATTAROLO (EDF)
37 !+ 05/2011
38 !+ V6P1
39 !+ Bug correction in the reading of the TELEMAC format file
40 !
41 !history G.MATTAROLO (EDF - LNHE)
42 !+ 20/06/2011
43 !+ V6P1
44 !+ Translation of French names of the variables in argument
45 !
46 !history J-M HERVOUET (EDF - LNHE)
47 !+ 16/11/2012
48 !+ V6P3
49 !+ Only SELAFIN format with same mesh kept. A number of arguments
50 !+ removed
51 !
52 !history J-M HERVOUET (EDF - LNHE)
53 !+ 24/01/2013
54 !+ V6P3
55 !+ Generalised for reading 3 variables with given names.
56 !
57 !history Y AUDOUIN (LNHE)
58 !+ 25/05/2015
59 !+ V7P0
60 !+ Modification to comply with the hermes module
61 !
62 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
63 !| AT |-->| COMPUTATION TIME
64 !| FONFMT |-->| DATA FILE FORMAT
65 !| CHDON |-->| NAME OF THE VARIABLE READ FROM THE DATA FILE
66 !| F1 |<--| FIRST VARIABLE TO READ
67 !| F2 |<--| SECOND VARIABLE TO READ
68 !| F3 |<--| THIRD VARIABLE TO READ
69 !| F11 |<->| DATA VALUES AT TIME TV1 IN THE DATA FILE FOR F1
70 !| F12 |<->| DATA VALUES AT TIME TV2 IN THE DATA FILE FOR F1
71 !| F21 |<->| DATA VALUES AT TIME TV1 IN THE DATA FILE FOR F2
72 !| F22 |<->| DATA VALUES AT TIME TV2 IN THE DATA FILE FOR F2
73 !| F31 |<->| DATA VALUES AT TIME TV1 IN THE DATA FILE FOR F3
74 !| F32 |<->| DATA VALUES AT TIME TV2 IN THE DATA FILE FOR F3
75 !| INDIC |-->| FILE FORMAT
76 !| MODE1 |-->| MODE: 0= DO NOT READ
77 !| | | 1= READ IF PRESENT
78 !| | | 2= READ AND STOP IF NOT PRESENT
79 !| MODE2 |-->| LIKE MODE1 FOR SECOND VARIABLE
80 !| MODE3 |-->| LIKE MODE1 FOR THIRD VARIABLE
81 !| NAME1 |-->| NAME OF FIRST VARIABLE
82 !| NAME2 |-->| NAME OF SECOND VARIABLE
83 !| NAME3 |-->| NAME OF THIRD VARIABLE
84 !| NDON |-->| LOGICAL UNIT NUMBER OF THA DATA FILE
85 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D MESH
86 !| NVAR |<--| NUMBER OF VARIABLES READ
87 !| PHASTIME |-->| TIME SHIFT IN FILE
88 !| TEXTE |<->| NAMES OF VARIABLES IN SERAFIN FILE
89 !| TROUVE |<->| 3 LOGICAL, WILL SAY IF VARIABLES HAVE BEEN FOUND
90 !| TV1 |<->| DATA TIME T1
91 !| TV2 |<->| DATA TIME T2
92 !| UNITIME |-->| UNIT OF TIME IN FILE
93 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
94 !
95  USE bief
96  USE interface_tomawac, ex_lecdoi => lecdoi
98 !
100  IMPLICIT NONE
101 !
102 !
103 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
104 !
105  INTEGER, INTENT(IN) :: NDON,NPOIN2,INDIC
106  INTEGER, INTENT(IN) :: MODE1,MODE2,MODE3
107  INTEGER, INTENT(INOUT) :: NVAR
108  DOUBLE PRECISION, INTENT(INOUT) :: F1(npoin2),F2(npoin2)
109  DOUBLE PRECISION, INTENT(INOUT) :: F3(npoin2)
110  DOUBLE PRECISION, INTENT(INOUT) :: F11(npoin2),F12(npoin2)
111  DOUBLE PRECISION, INTENT(INOUT) :: F21(npoin2),F22(npoin2)
112  DOUBLE PRECISION, INTENT(INOUT) :: F31(npoin2),F32(npoin2)
113  DOUBLE PRECISION, INTENT(IN) :: AT,UNITIME,PHASTIME
114  DOUBLE PRECISION, INTENT(INOUT) :: TV1,TV2
115  CHARACTER(LEN=8), INTENT(IN) :: FFORMAT
116  CHARACTER(LEN=7), INTENT(IN) :: CHDON
117  CHARACTER(LEN=32),INTENT(IN) :: NAME1,NAME2,NAME3
118  CHARACTER(LEN=32),INTENT(INOUT) :: TEXTE(30)
119  LOGICAL, INTENT(INOUT) :: TROUVE(3)
120 !
121 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
122 !
123  INTEGER NP,I,J,MODE(3)
124  DOUBLE PRECISION COEF
125  CHARACTER(LEN=80) TITCAS
126  CHARACTER(LEN=32) NAME(3),FULL_NAME(3)
127  CHARACTER(LEN=16), ALLOCATABLE :: VAR_NAME(:), VAR_UNIT(:)
128  DOUBLE PRECISION :: TIME1,TIME2
129  INTEGER :: RECORD1,RECORD2
130  INTEGER :: IERR
131 !
132 !-----------------------------------------------------------------------
133 !
134  mode(1)=mode1
135  mode(2)=mode2
136  mode(3)=mode3
137  name(1)=name1
138  name(2)=name2
139  name(3)=name3
140 !
141 !-----------------------------------------------------------------------
142 ! READS THE POINTS FROM LOGICAL UNIT NDON
143 !-----------------------------------------------------------------------
144 !
145  IF(indic.EQ.3) THEN
146 !
147 ! -----------------------------------------------------------------
148 ! TELEMAC FORMAT,
149 ! VARIABLES 1 AND 2 ARE THE X AND Y COMPONENTS OF THE WIND
150 ! -----------------------------------------------------------------
151 !
152  ! Getting title
153  CALL get_mesh_title(fformat,ndon,titcas,ierr)
154  CALL check_call(ierr,'LECDOI:GET_MESH_TITLE')
155  !
156  CALL get_data_nvar(fformat,ndon,nvar,ierr)
157  CALL check_call(ierr,'LECDOI:GET_DATA_NVAR')
158  !
159  ALLOCATE(var_name(nvar),stat=ierr)
160  CALL check_allocate(ierr,'LECDOI:VAR_NAME')
161  ALLOCATE(var_unit(nvar),stat=ierr)
162  CALL check_allocate(ierr,'LECDOI:VAR_UNIT')
163  CALL get_data_var_list(fformat,ndon,nvar,var_name,var_unit,ierr)
164  CALL check_call(ierr,'LECDOI:GET_DATA_VAR_LIST')
165  DO i=1,nvar
166  texte(i)(1:16) = var_name(i)
167  texte(i)(17:32) = var_unit(i)
168  ! CHECK IF THE VARIABLE ARE IN THE FILE
169  DO j=1,3
170  IF((texte(i).EQ.name(j)).AND.
171  & mode(j).GT.0) THEN
172  trouve(j) = .true.
173  full_name(j) = name(j)
174  ENDIF
175  ENDDO
176  ENDDO
177  DEALLOCATE(var_name)
178  DEALLOCATE(var_unit)
179  ! get the number of point
180  CALL get_mesh_npoin(fformat,ndon,point_bnd_elt_type,np,ierr)
181  CALL check_call(ierr,'LECDOI:GET_MESH_NPOIN')
182  WRITE(lu,*) '--------------------------------------------'
183  WRITE(lu,*) 'LECDOI : READING OF TELEMAC DATA FILE '
184  WRITE(lu,*) ' FILE TITLE : ',titcas
185  WRITE(lu,*) ' NUMBER OF POINTS : ',np
186  WRITE(lu,*) '--------------------------------------------'
187  IF(np.NE.npoin2) THEN
188  WRITE(lu,*) ' '
189  WRITE(lu,*) 'THE MESH OF THE CURRENTS FILE'
190  WRITE(lu,*) 'IS DIFFERENT FROM THE GEOMETRY FILE'
191  WRITE(lu,*) ' '
192  CALL plante(1)
193  stop
194  ENDIF
195  ! Timesteps
196  record1 = 0
197  record2 = 1
198  CALL get_data_time(fformat,ndon,record1,time1,ierr)
199  CALL check_call(ierr,'LECDOI:GET_DATA_TIME')
200  tv1=(time1-phastime)*unitime
201  !
202  IF(tv1.GT.at) THEN
203  WRITE(lu,*) '************************************************'
204  WRITE(lu,*) 'THE FIRST RECORDING OF THE ',chdon,' FILE '
205  WRITE(lu,*) ' ',tv1,' IS OLDER THAN THE BEGINNING '
206  WRITE(lu,*) ' OF THE COMPUTATION',at
207  WRITE(lu,*) '************************************************'
208  CALL plante(1)
209  stop
210  ENDIF
211  !
212  ! Get the two records before and after at for the interpolation
213  DO
214  CALL get_data_time(fformat,ndon,record2,time2,ierr)
215  CALL check_call(ierr,'LECDOI:GET_DATA_TIME')
216  tv2=(time2-phastime)*unitime
217  IF(tv2.LT.at) THEN
218  record1 = record2
219  record2 = record2 + 1
220  tv1 = tv2
221  ELSE
222  EXIT
223  ENDIF
224  ENDDO
225  ! Check if all the variables are found for record1
226  DO j=1,3
227  IF(mode(j).EQ.2.AND..NOT.trouve(j)) THEN
228  WRITE(lu,*) 'LECDOI: VARIABLE ',name1,' NOT FOUND'
229  WRITE(lu,*) trim(name(j)(1:16))
230  CALL plante(1)
231  stop
232  ELSEIF(mode(j).GT.0.AND.trouve(j)) THEN
233  WRITE(lu,*) 'VARIABLE ',j,' READ (',
234  & trim(name(j)(1:16)),') AT TIME ',tv1
235  ! Read the data for varialbe j on record1
236  IF(j.EQ.1) THEN
237  CALL get_data_value(fformat,ndon,record1,
238  & full_name(j),f11,np,ierr)
239  ELSEIF(j.EQ.2) THEN
240  CALL get_data_value(fformat,ndon,record1,
241  & full_name(j),f21,np,ierr)
242  ELSEIF(j.EQ.3) THEN
243  CALL get_data_value(fformat,ndon,record1,
244  & full_name(j),f31,np,ierr)
245  ENDIF
246  ENDIF
247  ENDDO
248  ! Read the variables
249  !
250  ! Check if all the variables are found for record2
251  DO j=1,3
252  IF(mode(j).EQ.2.AND..NOT.trouve(j)) THEN
253  WRITE(lu,*) 'LECDOI: VARIABLE ',name1,' NOT FOUND'
254  WRITE(lu,*) name(j)
255  CALL plante(1)
256  stop
257  ELSEIF(mode(j).GT.0.AND.trouve(j)) THEN
258  WRITE(lu,*) 'VARIABLE ',j,' READ (',
259  & trim(name(j)(1:16)),') AT TIME ',tv2
260  ! Read the data for varialbe j on record1
261  IF(j.EQ.1) THEN
262  CALL get_data_value(fformat,ndon,record2,
263  & full_name(j),f12,np,ierr)
264  ELSEIF(j.EQ.2) THEN
265  CALL get_data_value(fformat,ndon,record2,
266  & full_name(j),f22,np,ierr)
267  ELSEIF(j.EQ.3) THEN
268  CALL get_data_value(fformat,ndon,record2,
269  & full_name(j),f32,np,ierr)
270  ENDIF
271  ENDIF
272  ENDDO
273 !
274  ELSEIF (indic.EQ.4) THEN
275 !
276 ! READS A USER-DEFINED FORMAT
277 !
278  IF(chdon(1:1).EQ.'C') THEN
279 ! READS A CURRENT FIELD
280  trouve(1)=.true.
281  trouve(2)=.true.
282  nvar=2
283  CALL couuti(ndon,fformat)
284  ELSEIF(chdon(1:1).EQ.'V') THEN
285 ! READS A WIND FIELD
286  trouve(1)=.true.
287  trouve(2)=.true.
288  nvar=2
289  CALL venuti(ndon,fformat)
290  ELSEIF(chdon(1:1).EQ.'H') THEN
291 ! READS A DEPTH FIELD
292  trouve(3)=.true.
293  nvar=1
294  CALL maruti(ndon,fformat)
295  ELSE
296  WRITE(lu,*) 'UNKNOWN DATA TYPE'
297  CALL plante(1)
298  stop
299  ENDIF
300 !
301  ELSE
302  WRITE(lu,*) '************************************************'
303  WRITE(lu,*)'LECDOI : UNKNOWN INDICATOR OF FORMAT : ',indic
304  WRITE(lu,*)' FOR THE ',chdon,' DATA FILE '
305  WRITE(lu,*) '************************************************'
306  CALL plante(1)
307  stop
308  ENDIF
309 !
310 !-----------------------------------------------------------------------
311 ! INTERPOLATES IN TIME
312 !-----------------------------------------------------------------------
313 !
314  coef=(at-tv1)/(tv2-tv1)
315 !
316  IF(trouve(1)) THEN
317  DO i=1,npoin2
318  f1(i)=(f12(i)-f11(i))*coef+f11(i)
319  ENDDO
320  ENDIF
321  IF(trouve(2)) THEN
322  DO i=1,npoin2
323  f2(i)=(f22(i)-f21(i))*coef+f21(i)
324  ENDDO
325  ENDIF
326  IF(trouve(3)) THEN
327  DO i=1,npoin2
328  f3(i)=(f32(i)-f31(i))*coef+f31(i)
329  ENDDO
330  ENDIF
331 !
332 !-----------------------------------------------------------------------
333 !
334  RETURN
335  END
336 
subroutine get_mesh_npoin(FFORMAT, FID, TYP_ELEM, NPOIN, IERR)
Definition: get_mesh_npoin.f:7
subroutine maruti(NMAR, FMTMAR)
Definition: maruti.f:7
subroutine get_data_nvar(FFORMAT, FID, NVAR, IERR)
Definition: get_data_nvar.f:7
subroutine get_data_var_list(FFORMAT, FID, NVAR, VARLIST, UNITLIST, IERR)
subroutine venuti(NVEN, FMTVEN)
Definition: venuti.f:7
integer, parameter point_bnd_elt_type
subroutine get_data_value(FFORMAT, FID, RECORD, VAR_NAME, RES_VALUE, N, IERR)
Definition: get_data_value.f:7
subroutine lecdoi(F1, NAME1, MODE1, F2, NAME2, MODE2, F3, NAME3, MODE3, NPOIN2, NDON, FFORMAT, AT, TV1, TV2, F11, F12, F21, F22, F31, F32, INDIC, CHDON, NVAR, TEXTE, TROUVE, UNITIME, PHASTIME)
Definition: lecdoi.f:10
subroutine get_mesh_title(FFORMAT, FID, TITLE, IERR)
Definition: get_mesh_title.f:7
subroutine couuti(NCOU, FMTCOU)
Definition: couuti.f:7
subroutine get_data_time(FFORMAT, FID, RECORD, TIME, IERR)
Definition: get_data_time.f:7
Definition: bief.f:3