The TELEMAC-MASCARET system  trunk
read_dataset.f
Go to the documentation of this file.
1 ! ***********************
2  SUBROUTINE read_dataset
3 ! ***********************
4 !
5  &(fformat,fid,varsor,npoin,record,at,var_list,trouve,alire,listin,
6  & lastrecord,maxvar)
7 !
8 !***********************************************************************
9 ! BIEF V7P1
10 !***********************************************************************
11 !
12 !brief Reads the results for a given time step and
13 !+ a given list of variables
14 !
15 !history Y AUDOUIN (LNHE)
16 !+ 19/05/2014
17 !+ V7P1
18 !+ First version
19 !
20 !history R.ATA (LNHE)
21 !+ 13/12/2016
22 !+ V7P2
23 !+ add an additional condition before getting variable values
24 !+ in the call of GET_DATA_VALUE
25 !
26 !
27 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
28 !| FFORMAT |-->| FORMAT OF THE FILE
29 !| FID |-->| LOGICAL UNIT OF FILE
30 !| VARSOR |<->| LIST OF ARRAY THAT WILL CONTAINS THE VARIABLE
31 !| | | VALUE ON EACH POINT
32 !| NPOIN |-->| NUMBER OF POINT IN THE GEOMETRY MESH
33 !| RECORD |-->| TIME STEP OF THE DATASET
34 !| AT |<->| TIME OF THE DATASET
35 !| VAR_LIST |-->| NAMES AND UNITS OF VARIABLES.
36 !| TROUVE |<--| GIVES (TROUVE(K)=1) IF VARIABLES PRESENT IN THE FILE
37 !| | | 0 OTHERWISE
38 !| ALIRE |-->| VARIABLES TO BE READ (FOR OTHERS RECORD SKIPPED)
39 !| | | CLANDESTINE VARIABLES ARE SYSTEMATICALLY READ
40 !| LISTIN |-->| IF YES, INFORMATIONS PRINTED ON LISTING
41 !| LASTRECORD |<->| LASTRECORD = .TRUE. LAST RECORD WILL BE READ
42 !| | | LASTRECORD = .FALSE. : RECORD "RECORD" WILL BE READ
43 !| MAXVAR |-->| DIMENSION OF ARRAY RELATED TO VARIABLES: ALIRE,..
44 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
45 !
47  USE bief_def
48  USE bief, ONLY: ov
49 !
51  IMPLICIT NONE
52 !
53 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
54 !
55  TYPE(bief_obj), INTENT(INOUT) :: VARSOR
56  INTEGER, INTENT(IN) :: NPOIN
57  INTEGER, INTENT(IN) :: MAXVAR
58  INTEGER, INTENT(IN) :: FID
59  INTEGER, INTENT(INOUT) :: RECORD
60  INTEGER, INTENT(INOUT) :: TROUVE(maxvar)
61  INTEGER, INTENT(IN) :: ALIRE(maxvar)
62  CHARACTER(LEN=8), INTENT(IN) :: FFORMAT
63  CHARACTER(LEN=32), INTENT(IN) :: VAR_LIST(maxvar)
64  DOUBLE PRECISION, INTENT(INOUT) :: AT
65  LOGICAL, INTENT(IN) :: LISTIN,LASTRECORD
66 !
67 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 !
69  INTEGER IREC
70  INTEGER :: L,IERR,IPLAN,I,IP1,IP2
71  LOGICAL :: INTERPOLATE
72  INTEGER :: NPOIN_PREV, NPLAN_PREV, NPLAN, NPOIN2
73  DOUBLE PRECISION, ALLOCATABLE :: WD(:)
74  DOUBLE PRECISION :: TETA,ARG
75  CHARACTER(LEN=16), ALLOCATABLE :: VARNAME(:),VARUNIT(:)
76  CHARACTER(LEN=80) :: TITLE
77  INTEGER :: NVAR,IVAR
78  INTRINSIC SIZE
79 !
80 !-----------------------------------------------------------------------
81 !
82 ! We need the number of points to read the data
83 !
84  CALL get_mesh_npoin(fformat,fid,point_bnd_elt_type,
85  & npoin_prev,ierr)
86  CALL check_call(ierr,'READ_DATASET:GET_MESH_NPOIN')
87  CALL get_mesh_nplan(fformat,fid,nplan_prev,ierr)
88  CALL check_call(ierr,'READ_DATASET:GET_MESH_NPLAN')
89 !
90 ! Printout
91 !
92  CALL get_mesh_title(fformat,fid,title,ierr)
93  CALL check_call(ierr,'BIEF_VALIDA:GET_MESH_TITLE')
94 !
95  CALL get_data_nvar(fformat,fid,nvar,ierr)
96  CALL check_call(ierr,'BIEF_VALIDA:GET_DATA_NVAR')
97 !
98  ALLOCATE(varname(nvar),stat=ierr)
99  CALL check_allocate(ierr,'VARNAME')
100  ALLOCATE(varunit(nvar),stat=ierr)
101  CALL check_allocate(ierr,'VARUNIT')
102 !
103  CALL get_data_var_list(fformat,fid,nvar,varname,varunit,ierr)
104  CALL check_call(ierr,'BIEF_VALIDA:GET_DATA_NVAR')
105 
106  IF(listin) WRITE(lu,301) title
107 301 FORMAT(1x,//,1x,'TITLE OF PREVIOUS COMPUTATION: ',a72,/)
108 !
109  DO ivar=1,nvar
110  IF(listin) WRITE(lu,111) varname(ivar),varunit(ivar)
111 111 FORMAT(1x,'NAME: ',a16,' UNIT: ' ,a16)
112  ENDDO ! IVAR
113  DEALLOCATE(varname,varunit)
114 !
115 ! INTERPOLATES ?
116 !
117  interpolate=.false.
118  IF(npoin_prev.NE.npoin) THEN
119  interpolate=.true.
120  npoin2=npoin_prev/nplan_prev
121  nplan=npoin/npoin2
122  ALLOCATE(wd(npoin_prev),stat=ierr)
123  CALL check_allocate(ierr,'READ_DATASET:WD')
124  ENDIF
125 !
126 ! GET THE NUMBER OF TIME STEPS
127 !
128  IF(lastrecord) THEN
129  CALL get_data_ntimestep(fformat,fid,irec,ierr)
130  CALL check_call(ierr,'READ_DATASET:GET_DATA_NTIMESTEP')
131 ! Records go from 0 to ntimestep - 1
132  irec = irec - 1
133  record = irec
134  ELSE
135  irec = record
136  ENDIF
137 !
138 ! GET THE TIME ASSOCIATED WITH THE RECORD
139 !
140  CALL get_data_time(fformat,fid,irec,at,ierr)
141 !
142 ! Check if the record is in the file
143 !
144  IF(ierr.EQ.hermes_record_unknown_err) THEN
145  WRITE(lu,76) irec
146  CALL plante(1)
147  ELSE
148  CALL check_call(ierr,'READ_DATASET:GET_DATA_TIME')
149  ENDIF
150 !
151  DO l=1,min(maxvar,varsor%N)
152 !
153  IF((alire(l).EQ.1) .AND.
154  & (ASSOCIATED(varsor%ADR(l)%P)) .AND.
155  & (var_list(l)(1:1).NE.' ') ) THEN
156 !
157 ! To avoid cases where dim1=0
158  IF(varsor%ADR(l)%P%DIM1.GE.npoin_prev) THEN
159 ! Interpolate the results if necessary
160  IF(interpolate) THEN
161  CALL get_data_value(fformat,fid,irec,var_list(l)(1:16),
162  & wd,npoin_prev,ierr)
163 ! If the variable is not in the file
164  IF(ierr.EQ.hermes_var_unknown_err) THEN
165  trouve(l) = 0
166  CONTINUE
167  ELSE
168  CALL check_call(ierr,'READ_DATASET:GET_DATA_VALUE')
169  trouve(l) = 1
170  ENDIF
171 ! COPIES BOTTOM AND FREE SURFACE
172  CALL ov('X=Y ', x=varsor%ADR(l)%P%R, y=wd,dim1=npoin2)
173  CALL ov('X=Y ',
174  & x=varsor%ADR(l)%P%R(npoin-npoin2+1:npoin),
175  & y=wd(npoin_prev-npoin2+1:npoin_prev),
176  & dim1=npoin2)
177 ! INTERPOLATES OTHER PLANES
178  IF(nplan.GT.2) THEN
179  DO iplan=2,nplan-1
180  arg=(nplan_prev-1)*float(iplan-1)/float(nplan-1)
181  teta=arg-int(arg)
182 ! IP1 : LOWER PLANE NUMBER - 1
183  ip1=int(arg)
184 ! IP2 : UPPER PLANE NUMBER - 1
185  ip2=ip1+1
186  DO i=1,npoin2
187  varsor%ADR(l)%P%R(i+npoin2*(iplan-1))=
188  & teta *wd(i+npoin2*ip2)+(1.d0-teta)*wd(i+npoin2*ip1)
189  ENDDO
190  ENDDO
191  ENDIF
192 ! NO INTERPOLATION
193  ELSE
194 !
195  CALL get_data_value(fformat,fid,irec,var_list(l)(1:16),
196  & varsor%ADR(l)%P%R,npoin_prev,ierr)
197 !
198 ! If the variable is not in the file
199  IF(ierr.EQ.hermes_var_unknown_err) THEN
200  trouve(l) = 0
201  ELSE
202  CALL check_call(ierr,'READ_DATASET:GET_DATA_VALUE')
203  trouve(l) = 1
204  ENDIF
205  ENDIF
206  ENDIF
207 !
208  ELSE
209  ! if the record is not in the file
210  trouve(l) = 0
211  ENDIF
212 !
213  ENDDO ! L
214  IF(interpolate) DEALLOCATE(wd)
215 !
216  IF(listin) WRITE(lu,131) irec+1
217 131 FORMAT(/,1x,'READ_DATASET : READ OF RECORD ',1i5)
218 !
219  IF(listin) WRITE(lu,141) at
220 141 FORMAT(//,1x,'TIME OF RECORD: ',g16.7,' S')
221 !
222 !-----------------------------------------------------------------------
223 !
224 76 FORMAT(/,1x,'TIME STEP : ',i16,/,1x,'IS NOT IN THE FILE')
225 !
226 !-----------------------------------------------------------------------
227 !
228  RETURN
229  END
subroutine get_mesh_npoin(FFORMAT, FID, TYP_ELEM, NPOIN, IERR)
Definition: get_mesh_npoin.f:7
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.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)
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
integer, parameter hermes_record_unknown_err
subroutine get_mesh_title(FFORMAT, FID, TITLE, IERR)
Definition: get_mesh_title.f:7
subroutine get_mesh_nplan(FFORMAT, FID, NPLAN, IERR)
Definition: get_mesh_nplan.f:7
subroutine read_dataset(FFORMAT, FID, VARSOR, NPOIN, RECORD, AT, VAR_LIST, TROUVE, ALIRE, LISTIN, LASTRECORD, MAXVAR)
Definition: read_dataset.f:8
integer, parameter hermes_var_unknown_err
subroutine get_data_time(FFORMAT, FID, RECORD, TIME, IERR)
Definition: get_data_time.f:7
subroutine get_data_ntimestep(FFORMAT, FID, NTIMESTEP, IERR)
Definition: bief.f:3