The TELEMAC-MASCARET system  trunk
hermes_index_file.f
Go to the documentation of this file.
1 ! ************************
2  MODULE hermes_index_file
3 ! ************************
4 !
5 !***********************************************************************
6 ! HERMES 2018
7 !***********************************************************************
8 !
9 !brief Implementation of the index files use by concatenated serafin
10 ! and MED
11 !
12 !history YOANN AUDOUIN
13 !+ 10/05/2018
14 !+ Initial version
15 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16 !
17  IMPLICIT NONE
18 !
19  INTERFACE read_index
20  MODULE PROCEDURE
21  & read_index32,
22  & read_index64
23  END INTERFACE read_index
24  INTERFACE write_index
25  MODULE PROCEDURE
26  & write_index32,
28  END INTERFACE write_index
29 !
30  CONTAINS
31 
32 !***********************************************************************
33  SUBROUTINE open_index
34 !***********************************************************************
35 !
36  &(filename, file_id)
37 !
38 !***********************************************************************
39 ! HERMES 10/05/2018
40 !***********************************************************************
41 !
42 !BRIEF Open an index file, either for writing or reading and return
43 ! the file id.
44 !
45 !HISTORY Judicaël Grasset (Daresbury Lab & EDF)
46 !+ 10/05/2018
47 !+
48 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49 !| FILENAME |<--| NAME OF THE FILE ASSOCIATED TO THE INDEX
50 !| FILE_ID |<--| FILE DESCRIPTOR
51 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53  CHARACTER(LEN=*), INTENT(IN) :: FILENAME
54  INTEGER, INTENT(OUT) :: FILE_ID
55  !
56  CHARACTER(LEN=MAXLENFILE) :: INDEX_FILENAME
57  INTEGER :: FILENAME_SIZE,IERR
58  LOGICAL :: ISOPEN
59  CALL get_free_id(file_id)
60  !IF THE FILE IS CONCATENATED, THEN THE INDEX FILE IS IN A
61  !FILE OF THE SAME NAME WITH THE 'CONCAT' SUFFIX REPLACED
62  !BY 'INDEX'
63  index_filename=filename
64  filename_size=len_trim(index_filename)
65  index_filename(filename_size-5:filename_size) = 'INDEX '
66 
67  INQUIRE(file=index_filename,opened=isopen)
68  IF(isopen)THEN
69  INQUIRE(file=index_filename,number=file_id)
70  ELSE
71  OPEN(unit=file_id,file=trim(index_filename),action='READWRITE'
72  & ,form='UNFORMATTED', access='STREAM',iostat=ierr)
73  IF(ierr.NE.0) THEN
74  error_message = 'ERROR IN '//
75  & trim(index_filename)//': '//
76  & 'OPEN_INDEX_FILE:OPEN'
77  RETURN
78  ENDIF
79  ENDIF
80  END SUBROUTINE
81 !***********************************************************************
82  SUBROUTINE read_index64
83 !***********************************************************************
84 !
85  &(idx_id,openmode,mesh_number,offset_begin,offset_end)
86 !
87 !***********************************************************************
88 ! HERMES 10/05/2018
89 !***********************************************************************
90 !
91 !BRIEF Read offsets from the index file. If openmode is read then we
92 ! read the offset needed for reading our part. If openmode is
93 ! write we read the offset needed to write after our part.
94 !
95 !HISTORY Judicaël Grasset (Daresbury Lab & EDF)
96 !+ 10/05/2018
97 !+
98 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99 !| IDX_ID |-->| FILE ID OF THE INDEX FILE
100 !| OPENMODE |-->| OPENMODE OF THE FILE ASSOCIATED TO THE INDEX
101 !| MESH_NUMBER |-->| NUMBER OF THE MESH WE ARE WORKING WITH
102 !| OFFSET_BEGIN |<--| OFFSET TO THE BEGINING OF OUR PART
103 !| OFFSET_END |<--| OFFSET TO THE END OF OUR PART
104 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
106  INTEGER, INTENT(IN) :: IDX_ID
107  CHARACTER(LEN=9), INTENT(IN) :: OPENMODE
108  INTEGER, INTENT(IN) :: MESH_NUMBER
109  INTEGER(KIND=K8), INTENT(OUT) :: OFFSET_BEGIN
110  INTEGER(KIND=K8), INTENT(OUT) :: OFFSET_END
111 
112  INTEGER(KIND=K8) :: POS
113  !GET THE OFFSET OF OUR PART.
114  !THE OFFSETS ARE PAIRS OF 64 BITS INTEGER (8 BYTES * 2)
115  !IF WE ARE IN READ MODE, THEN WE CAN READ OUR BEGINING OFFSET
116  !AND OUR END OFFSET.
117  !IF WE ARE IN WRITE MODE, WE CAN ONLY READ OUR BEGINING OFFSET
118  !SINCE WE DO NOT KNOW WHERE WE WILL STOP WRITING.
119  IF(openmode(1:5)=='WRITE')THEN
120  IF(mesh_number==1)THEN
121  offset_begin=1
122  ELSE
123  pos=(mesh_number-2)*8*2+1
124  READ(idx_id,pos=pos)offset_begin,offset_end
125  offset_begin=offset_end
126  ENDIF
127  offset_end=-1
128  ELSE IF(openmode(1:4)=='READ')THEN
129  pos=(mesh_number-1)*8*2+1
130  READ(idx_id,pos=pos)offset_begin,offset_end
131  ENDIF
132  END SUBROUTINE
133 !***********************************************************************
134  SUBROUTINE write_index64
135 !***********************************************************************
136 !
137  &(idx_id,mesh_number,offset_begin,offset_end)
138 !
139 !***********************************************************************
140 ! HERMES 10/05/2018
141 !***********************************************************************
142 !
143 !BRIEF Write the offset of our part into the index file
144 !
145 !HISTORY Judicaël Grasset (Daresbury Lab & EDF)
146 !+ 10/05/2018
147 !+
148 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
149 !| IDX_ID |-->| FILE ID OF THE INDEX FILE
150 !| MESH_NUMBER |-->| NUMBER OF THE MESH WE ARE WORKING WITH
151 !| OFFSET_BEGIN |-->| OFFSET TO THE BEGINING OF OUR PART
152 !| OFFSET_END |-->| OFFSET TO THE END OF OUR PART
153 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
155  INTEGER, INTENT(IN) :: IDX_ID
156  INTEGER, INTENT(IN) :: MESH_NUMBER
157  INTEGER(KIND=K8), INTENT(IN) :: OFFSET_BEGIN
158  INTEGER(KIND=K8), INTENT(IN) :: OFFSET_END
159 
160  INTEGER(KIND=K8) :: POS
161  pos=(mesh_number-1)*8*2+1
162  WRITE(unit=idx_id,pos=pos)offset_begin,offset_end
163  END SUBROUTINE
164 !***********************************************************************
165  SUBROUTINE read_index32
166 !***********************************************************************
167 !
168  &(idx_id,openmode,mesh_number,offset_begin,offset_end)
169 !
170 !***********************************************************************
171 ! HERMES 10/05/2018
172 !***********************************************************************
173 !
174 !BRIEF Read offsets from the index file. If openmode is read then we
175 ! read the offset needed for reading our part. If openmode is
176 ! write we read the offset needed to write after our part.
177 !
178 !HISTORY Judicaël Grasset (Daresbury Lab & EDF)
179 !+ 10/05/2018
180 !+
181 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
182 !| IDX_ID |-->| FILE ID OF THE INDEX FILE
183 !| OPENMODE |-->| OPENMODE OF THE FILE ASSOCIATED TO THE INDEX
184 !| MESH_NUMBER |-->| NUMBER OF THE MESH WE ARE WORKING WITH
185 !| OFFSET_BEGIN |<--| OFFSET TO THE BEGINING OF OUR PART
186 !| OFFSET_END |<--| OFFSET TO THE END OF OUR PART
187 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
189  INTEGER, INTENT(IN) :: IDX_ID
190  CHARACTER(LEN=9), INTENT(IN) :: OPENMODE
191  INTEGER, INTENT(IN) :: MESH_NUMBER
192  INTEGER, INTENT(OUT) :: OFFSET_BEGIN
193  INTEGER, INTENT(OUT) :: OFFSET_END
194 
195  INTEGER(KIND=K8) :: POS
196  !GET THE OFFSET OF OUR PART.
197  !THE OFFSETS ARE PAIRS OF 32 BITS INTEGER (4 BYTES * 2)
198  !IF WE ARE IN READ MODE, THEN WE CAN READ OUR BEGINING OFFSET
199  !AND OUR END OFFSET.
200  !IF WE ARE IN WRITE MODE, WE CAN ONLY READ OUR BEGINING OFFSET
201  !SINCE WE DO NOT KNOW WHERE WE WILL STOP WRITING.
202  IF(openmode(1:5)=='WRITE')THEN
203  IF(mesh_number==1)THEN
204  offset_begin=1
205  ELSE
206  pos=(mesh_number-2)*4*2+1
207  READ(idx_id,pos=pos)offset_begin,offset_end
208  offset_begin=offset_end
209  ENDIF
210  offset_end=-1
211  ELSE IF(openmode(1:4)=='READ')THEN
212  pos=(mesh_number-1)*4*2+1
213  READ(idx_id,pos=pos)offset_begin,offset_end
214  ENDIF
215  END SUBROUTINE
216 !***********************************************************************
217  SUBROUTINE write_index32
218 !***********************************************************************
219 !
220  &(idx_id,mesh_number,offset_begin,offset_end)
221 !
222 !***********************************************************************
223 ! HERMES 10/05/2018
224 !***********************************************************************
225 !
226 !BRIEF Write the offset of our part into the index file
227 !
228 !HISTORY Judicaël Grasset (Daresbury Lab & EDF)
229 !+ 10/05/2018
230 !+
231 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
232 !| IDX_ID |-->| FILE ID OF THE INDEX FILE
233 !| MESH_NUMBER |-->| NUMBER OF THE MESH WE ARE WORKING WITH
234 !| OFFSET_BEGIN |-->| OFFSET TO THE BEGINING OF OUR PART
235 !| OFFSET_END |-->| OFFSET TO THE END OF OUR PART
236 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
238  INTEGER, INTENT(IN) :: IDX_ID
239  INTEGER, INTENT(IN) :: MESH_NUMBER
240  INTEGER, INTENT(IN) :: OFFSET_BEGIN
241  INTEGER, INTENT(IN) :: OFFSET_END
242 
243  INTEGER(KIND=K8) :: POS
244  pos=(mesh_number-1)*4*2+1
245  WRITE(unit=idx_id,pos=pos)offset_begin,offset_end
246  END SUBROUTINE
247 !
248  END MODULE hermes_index_file
YOANN AUDOUIN 10/05/2018 Initial version
subroutine read_index32(IDX_ID, OPENMODE, MESH_NUMBER, OFFSET_BEGIN, OFFSET_END)
subroutine read_index64(IDX_ID, OPENMODE, MESH_NUMBER, OFFSET_BEGIN, OFFSET_END)
subroutine write_index32(IDX_ID, MESH_NUMBER, OFFSET_BEGIN, OFFSET_END)
character(len=200) error_message
subroutine write_index64(IDX_ID, MESH_NUMBER, OFFSET_BEGIN, OFFSET_END)
subroutine open_index(FILENAME, FILE_ID)