The TELEMAC-MASCARET system  trunk
utils_serafin.F
Go to the documentation of this file.
1 ! ********************
2  MODULE utils_serafin
3 ! ********************
4 !
5 !***********************************************************************
6 ! HERMES V7P1
7 !***********************************************************************
8 !
9 !brief a number of subroutines dedicated to the serafin format.
10 !
11 !history YOANN AUDOUIN
12 !+ 29/10/2011
13 !+ V7P1
14 !+ Creation of the file
15 !
16 !history J-M HERVOUET (EDF LAB, LNHE)
17 !+ 12/05/2015
18 !+ V7P1
19 !+ Correcting an old mistake on serafin files in prisms when the
20 !+ computation is done with tetrahedra. See SET_MESH_SRF.
21 !
22 !history S.E. BOURBAN (HRW)
23 !+ 11/11/2016
24 !+ V7P2
25 !+ Replacement of K4 (which is compiler depend and therefore not
26 !+ necessary equals to 4) by KS in the SRF_INFO structure.
27 !
28 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
29 !
31  USE hash_table
32  IMPLICIT NONE
33 !
34  INTEGER, PARAMETER :: var_size = 32 ! SIZE OF A VARIABLE TEXT
35  INTEGER, PARAMETER :: title_size = 80 ! SIZE OF A TITLE
36 !
37  TYPE srf_info
38  CHARACTER(LEN=250) :: file_name
39  ! SIZE OF ELEMENTS
40  INTEGER :: ks ! INTEGER SIZE (4 OR 8)
41  INTEGER :: rs ! REAL SIZE (4 OR 8)
42  ! POSITION IN FILE
43  INTEGER(KIND=K8) :: pos_title
44  INTEGER(KIND=K8) :: pos_nvar != POS_TITLE + 4 + TITLE_SIZE + 4
45  INTEGER(KIND=K8) :: pos_varinfo != POS_NVAR + 4 + 2*K4 + 4
46  INTEGER(KIND=K8) :: pos_ib != POS_VARINFO + 4 + NVAR*VAR_SIZE + 4
47  INTEGER(KIND=K8) :: pos_date != POS_IB + 4 + 10*K4 + 4
48  INTEGER(KIND=K8) :: pos_num != POS_DATE + (IB(10).NE.0)*(4 + 6*K4 + 4)
49  INTEGER(KIND=K8) :: pos_ikle != POS_NUM + 4 + 4*K4 + 4
50  INTEGER(KIND=K8) :: pos_ipobo != POS_IKLE + 4 + NELEM*NDP*K4 + 4
51  INTEGER(KIND=K8) :: pos_coord != POS_IPOBO + 4 + NPOIN*K4 + 4
52  INTEGER(KIND=K8) :: pos_data != POS_COORD + (4 + NPOIN*RS + 4)*NDIM
53  ! COMPUTED INFORMATIONS
54  INTEGER :: size_data != 4 + NPOIN*RS + 4
55  INTEGER :: size_data_set != 4 + RS + 4 + NVAR*(4 + NPOIN*RS + 4)
56  ! STOCKED QUANTITIES AND SMALL VARIABLES
57  INTEGER :: ntimestep
58  INTEGER :: npoin
59  INTEGER :: nvar
60  INTEGER :: nelem
61  INTEGER :: ndp
62  INTEGER :: nplan
63  INTEGER :: nptir
64  INTEGER :: ndim
65  INTEGER :: typ_elt
66  CHARACTER(LEN=VAR_SIZE),ALLOCATABLE :: var_list(:)
67  ! BOUNDARY INFORMATIONS
68  INTEGER :: typ_bnd_elt
69  INTEGER :: nptfr
70  INTEGER :: ncli
71  ! COORDINATES OFFSET
72  INTEGER :: x_orig
73  INTEGER :: y_orig
74  !FILE ID OF THE INDEX FILE
75  INTEGER :: mesh_idx_id
76  INTEGER :: cli_idx_id
77  !LINE NUMBER TO OUR PART IN THE CONCATENATED CLI FILE
78  INTEGER :: cli_line_begin
79  INTEGER :: cli_line_end
80  END TYPE srf_info
81 
82  ! HASH TABLE FOR SERAFIN FILES
83  INTEGER :: hash(max_file) = 0
85 !
86 !-----------------------------------------------------------------------
87 !
88  CONTAINS
89 !***********************************************************************
90  SUBROUTINE identify_typ_elt
91 !***********************************************************************
92 !
93  &(ndp,ndim,typ_elt)
94 !
95 !***********************************************************************
96 ! HERMES V7P0 01/05/2014
97 !***********************************************************************
98 !
99 !brief Returns the number of point per element and dimension
100 !+ for the given element type
101 !
102 !history Y AUDOUIN (LNHE)
103 !+ 24/03/2014
104 !+ V7P0
105 !+
106 !
107 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108 !| NDP |<--| NUMBER OF POINT PER ELEMENT
109 !| NDIM |-->| DIMENSION OF THE ELEMENT (2D OR 1D)
110 !| TYP_ELT |-->| TYPE OF THE ELEMENT
111 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
112 !
113  !TODO: Merge with the one in special
114  IMPLICIT NONE
115  !
116  INTEGER, INTENT(IN) :: NDP
117  INTEGER, INTENT(IN) :: NDIM
118  INTEGER, INTENT(OUT) :: TYP_ELT
119  !
120  typ_elt = 0
121  ! Returns the element type by checking the couple
122  ! (dimension, number of point per element)
123  IF(ndim.EQ.3) THEN
124  IF(ndp.EQ.4) typ_elt = tetrahedron_elt_type
125  IF(ndp.EQ.6) typ_elt = prism_elt_type
126  ELSE
127  IF(ndp.EQ.3) typ_elt = triangle_elt_type
128  IF(ndp.EQ.4) typ_elt = quadrangle_elt_type
129  ENDIF
130  END SUBROUTINE
131 !***********************************************************************
132  SUBROUTINE identify_endian_type
133 !***********************************************************************
134 !
135  &(file_name,endian,file_id,ierr)
136 !
137 !***********************************************************************
138 ! HERMES V7P2
139 !***********************************************************************
140 !
141 !brief Read the first tag of a Serafin file to detect if it is in
142 !+ little or big Endian
143 !
144 !history Y AUDOUIN (LNHE)
145 !+ 11/05/2016
146 !+ V7P2
147 !+ First version.
148 !
149 !history S.E. BOURBAN (HRW)
150 !+ 20/06/2016
151 !+ V7P2
152 !+ Compiler specific directive added because not all compilers
153 !+ support OPEN( CONVERT= )
154 !
155 !history J-M HERVOUET (EDF LAB, LNHE)
156 !+ 08/07/2016
157 !+ V7P2
158 !+ Adding FILE_ID in the list of arguments.
159 !
160 !history S.E. BOURBAN (HRW)
161 !+ 11/11/2016
162 !+ V7P2
163 !+ ENDIAN has now an INOUT intent to add flexibility when reading
164 !+ mixed binaries from various files.
165 !
166 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
167 !| FILE_NAME |<--| Name of the file
168 !| ENDIAN |<->| Encoding of integer and real in the file
169 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
170 !
171  IMPLICIT NONE
172 !
173  INTEGER, INTENT(IN) :: FILE_ID
174  CHARACTER(LEN=*), INTENT(IN) :: FILE_NAME
175  CHARACTER(LEN=13),INTENT(INOUT) :: ENDIAN
176  INTEGER, INTENT(OUT) :: IERR
177 !
178  INTEGER(KIND=K4) :: I
179  LOGICAL :: FILE_EXIST
180 !
181  ! IF THE FILE DOES NOT EXIST RETURN BIG OR LITTLE ENDIAN
182  ierr = 0
183  INQUIRE(file=file_name,exist=file_exist)
184  IF(.NOT.file_exist) RETURN
185 !
186 #if defined NO_CONVERT_ENDIAN
187 ! CONVERT= NOT IMPLEMENTED WITH SOME COMPILERS
188  OPEN(file=file_name, action='READ', unit=file_id,
189  & form='UNFORMATTED', access='STREAM', iostat=ierr)
190 #else
191  OPEN(file=file_name, action='READ', unit=file_id,
192  & form='UNFORMATTED', access='STREAM',convert=endian,
193  & iostat=ierr)
194 #endif
195  IF(ierr.NE.0) THEN
196  error_message = 'ERROR IN '//
197  & trim(file_name)//': '//
198  & 'IDENTIFY_ENDIAN_TYPE:OPEN:'//endian
199  RETURN
200  ENDIF
201 !
202  READ(file_id,pos=1,iostat=ierr) i
203  IF(ierr.LT.0) THEN
204  ! WE'VE REACHED THE END OF THE FILE I.E. THE FILE IS EMPTY
205  CLOSE(file_id)
206  RETURN
207  ENDIF
208  IF(i.EQ.80) THEN
209  IF(ierr.NE.0) THEN
210  error_message = 'ERROR IN '//
211  & trim(file_name)//': '//
212  & 'IDENTIFY_ENDIAN_TYPE:READ:'//endian
213  RETURN
214  ENDIF
215  CLOSE(file_id)
216  ELSE
217 #if defined NO_CONVERT_ENDIAN
218 ! IF YOU DO NOT HAVE THE CONVERT OPTION AND YOU WERE NOT ABLE
219 ! TO OPEN THE FILE, THEN THE FILE IS NOT OF THE RIGHT FORMAT.
221  IF(ierr.NE.0) THEN
222  error_message = 'ERROR IN '//
223  & trim(file_name)//': '//
224  & 'IDENTIFY_ENDIAN_TYPE: Wrong endian of the file'
225  RETURN
226  ENDIF
227  CLOSE(file_id)
228 #else
229  IF(ierr.NE.0) THEN
230  error_message = 'ERROR IN '//
231  & trim(file_name)//': '//
232  & 'IDENTIFY_ENDIAN_TYPE:READ:'//endian
233  RETURN
234  ENDIF
235  CLOSE(file_id)
236  IF( endian.EQ.'LITTLE_ENDIAN' ) THEN
237  ENDIAN = 'BIG_ENDIAN '
238  ELSE
239  ENDIAN = 'LITTLE_ENDIAN'
240  ENDIF
241  OPEN(file=file_name, action='READ', unit=file_id,
242  & form='UNFORMATTED', access='STREAM',convert=endian,
243  & iostat=ierr)
244  IF(ierr.NE.0) THEN
245  error_message = 'ERROR IN '//
246  & trim(file_name)//': '//
247  & 'IDENTIFY_ENDIAN_TYPE:OPEN:'//endian
248  RETURN
249  ENDIF
250  READ(file_id,pos=1,iostat=ierr) i
251  IF(i.EQ.80) THEN
252  IF(ierr.NE.0) THEN
253  error_message = 'ERROR IN '//
254  & trim(file_name)//': '//
255  & 'IDENTIFY_ENDIAN_TYPE:READ:'//endian
256  RETURN
257  ENDIF
258  CLOSE(file_id)
259  ELSE
260  ierr = hermes_invalid_serafin_file
261  IF(ierr.NE.0) THEN
262  error_message = 'ERROR IN '//
263  & trim(file_name)//': '//
264  & 'IDENTIFY_ENDIAN_TYPE:READ:'//endian
265  RETURN
266  ENDIF
267  CLOSE(file_id)
268  ENDIF
269 #endif
270  ENDIF
271 !
272  END SUBROUTINE
273 
274 !***********************************************************************
275  SUBROUTINE open_mesh_srf
276 !***********************************************************************
277 !
278  &(file_name,file_id,openmode,fformat,ierr,mesh_number)
279 !
280 !***********************************************************************
281 ! HERMES V7P0 01/05/2014
282 !***********************************************************************
283 !
284 !brief OPENS A MESH FILE
285 !
286 !history Y AUDOUIN (LNHE)
287 !+ 24/03/2014
288 !+ V7P0
289 !+
290 !
291 !history S.E. BOURBAN (HRW)
292 !+ 20/06/2016
293 !+ V7P2
294 !+ Compiler specific directive added because not all compilers
295 !+ support OPEN( CONVERT= )
296 !
297 !history J. GRASSET (Daresbury Lab & EDF)
298 !+ 01/05/2018
299 !+ Add code for managing concatenated mesh
300 !
301 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
302 !| FILE_NAME |-->| NAME OF THE FILE
303 !| FILE_ID |-->| FILE DESCRIPTOR
304 !| OPENMODE |-->| ONE OF THE FOLLOWING VALUE 'READ','READWRITE'
305 !| FFORMAT |<->| FORMAT OF THE FILE, CAN BE MODIFIED IF THE USER
306 !| | | MADE A MISTAKE
307 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
308 !| MESH_NUMBER |-->| IF PRESENT, THIS IS THE NUMBER OF THE PART OF
309 ! THE CONCATENATED FILE WE WANT TO ACCESS
310 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
311 !
313  IMPLICIT NONE
314  !
315  INTEGER, INTENT(OUT) :: FILE_ID
316  CHARACTER(LEN=9), INTENT(IN) :: OPENMODE
317  CHARACTER(LEN=*), INTENT(IN) :: FILE_NAME
318  CHARACTER(LEN=8), INTENT(INOUT) :: FFORMAT
319  INTEGER, INTENT(OUT) :: IERR
320  INTEGER, OPTIONAL, INTENT(IN) :: MESH_NUMBER
321  !
322  INTEGER(KIND=K8) :: MY_POS, I, POS, FSIZE
323  INTEGER(KIND=K8) :: OFFSET_BEGIN, OFFSET_END
324  INTEGER(KIND=K4) :: B1, B2, IB(10), IDUM, TAG
325  INTEGER :: SRF_ID, NTIMESTEP, FD
326  CHARACTER(LEN=9) :: SRF_OPENMODE
327  CHARACTER(LEN=200) :: MSG
328 #if defined NO_INQUIRE_SIZE
329  REAL :: TIME
330 #endif
331  ! Check if the file is already opened and get its id if that is
332  ! the case
333  ! This will return -1 if the file is not opened
334  INQUIRE(file=file_name, number=fd)
335  IF(fd.NE.-1) THEN
336  ! File already opened so just setting file_id
337  ierr = 0
338  file_id = fd
339  RETURN
340  ELSE
341  ! First time opening the file
342  CALL get_free_id(file_id)
343  ! ADD A NEW FILE TO THE HASH TABLE
344  CALL add_obj(hash,file_id,srf_id,ierr)
345  IF(ierr.NE.0) THEN
346  error_message = 'ERROR IN '//
347  & trim(file_name)//': '//
348  & 'OPEN_MESH_SRF:ADD_OBJ'
349  RETURN
350  ENDIF
351  ENDIF
352  srf_obj_tab(srf_id)%FILE_NAME = file_name
353  !
354  ! BECAUSE of the stream mode in write only we need to have read access
355  ! to position the file pointer so if the file is in write only
356  ! we open it in readwrite
357  IF(openmode(1:5).EQ.'WRITE') THEN
358  srf_openmode = 'READWRITE'
359  ELSE
360  srf_openmode = openmode
361  ENDIF
362  ! Get the Endian for the file
363  CALL identify_endian_type(file_name,endian,file_id, ierr)
364  IF(ierr.NE.0) RETURN
365  ! OPEN THE FILE IN STREAM MODE
366 #if defined NO_CONVERT_ENDIAN
367  OPEN(file=file_name, action=srf_openmode, unit=file_id,
368  & form='UNFORMATTED', access='STREAM',
369  & iomsg=msg, iostat=ierr)
370 #else
371  OPEN(file=file_name, action=srf_openmode, unit=file_id,
372  & form='UNFORMATTED', access='STREAM',convert=endian,
373  & iomsg=msg, iostat=ierr)
374 #endif
375  IF(ierr.NE.0) THEN
376  error_message = 'ERROR IN '//
377  & trim(file_name)//': '//
378  & 'OPEN_MESH_SRF:OPEN'//'\n'//msg
379  RETURN
380  ENDIF
381  !
382  IF(PRESENT(mesh_number).AND.partel_concat)THEN
383  CALL open_index(file_name, srf_obj_tab(srf_id)%MESH_IDX_ID)
384  CALL read_index(srf_obj_tab(srf_id)%MESH_IDX_ID, openmode,
385  & mesh_number, offset_begin, offset_end)
386  ELSE
387  offset_begin=1
388  ENDIF
389  ! IT DOES NOT MATTER IF SERAFIN IS DOUBLE PRECISION OR NOT
390  srf_obj_tab(srf_id)%KS = 4
391  ! ONLY DO THE SCAN OF THE FILE IF THE FILE IS NOT WRITE ONLY
392  IF(openmode(1:4).EQ.'READ') THEN
393 !
394  ! IDENTIFY THE POSITION OF THE DIFFERENT MARKER OF THE FILE
395  ! EACH "SET" IS DELIMITED BETWEEN TWO 4 BYTE INTEGER
396  ! INDICATING THE SIZE OF THE SET
397  ! SEE COMMENT FOR TYPE SRF_INFO FOR A DESCRIPTION OF EVERY VARIABLE
398  srf_obj_tab(srf_id)%POS_TITLE = offset_begin
399  srf_obj_tab(srf_id)%POS_NVAR = srf_obj_tab(srf_id)%POS_TITLE
400  & + 4 + title_size + 4
401  srf_obj_tab(srf_id)%POS_VARINFO = srf_obj_tab(srf_id)%POS_NVAR
402  & + 4 + 2*srf_obj_tab(srf_id)%KS + 4
403 !
404  my_pos = srf_obj_tab(srf_id)%POS_NVAR+4
405  READ(file_id,pos=my_pos,iostat=ierr)
406  & b1,b2
407  IF(ierr.NE.0) THEN
408  error_message = 'ERROR IN '//
409  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
410  & 'OPEN_MESH_SRF:READNVAR'
411  RETURN
412  ENDIF
413  srf_obj_tab(srf_id)%NVAR = b1 + b2
414  ALLOCATE(srf_obj_tab(srf_id)%VAR_LIST(b1+b2),stat=ierr)
415  IF(ierr.NE.0) THEN
416  error_message = 'ERROR IN '//
417  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
418  & 'OPEN_MESH_SRF:VAR_LIST'
419  RETURN
420  ENDIF
421  DO i=1,srf_obj_tab(srf_id)%NVAR
422  pos = srf_obj_tab(srf_id)%POS_VARINFO + (i-1)*(4+var_size+4)
423  READ(file_id,pos=pos+4,iomsg=msg,iostat=ierr)
424  & srf_obj_tab(srf_id)%VAR_LIST(i)
425  IF(ierr.NE.0) THEN
426  error_message = 'ERROR IN '//
427  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
428  & 'OPEN_MESH_SRF:READ_VAR_LIST'//'\N'//msg
429  RETURN
430  ENDIF
431  ENDDO
432 !
433  srf_obj_tab(srf_id)%POS_IB = srf_obj_tab(srf_id)%POS_VARINFO
434  & + srf_obj_tab(srf_id)%NVAR*(4 + var_size + 4)
435 !
436  my_pos = srf_obj_tab(srf_id)%POS_IB+4
437  READ(file_id, pos=my_pos, iostat=ierr) ib(1:10)
438  IF(ierr.NE.0) THEN
439  error_message = 'ERROR IN '//
440  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
441  & 'OPEN_MESH_SRF:READ_IB'
442  RETURN
443  ENDIF
444  srf_obj_tab(srf_id)%X_ORIG = ib(3)
445  srf_obj_tab(srf_id)%Y_ORIG = ib(4)
446  srf_obj_tab(srf_id)%NPLAN = ib(7)
447  srf_obj_tab(srf_id)%NPTFR = ib(8)
448  srf_obj_tab(srf_id)%NPTIR = ib(9)
449  IF(ib(7).GT.1) THEN
450  srf_obj_tab(srf_id)%NDIM = 3
451  ELSE
452  srf_obj_tab(srf_id)%NDIM = 2
453  ENDIF
454 !
455  srf_obj_tab(srf_id)%POS_NUM = srf_obj_tab(srf_id)%POS_IB
456  & + 4 + 10*srf_obj_tab(srf_id)%KS + 4
457 !
458  ! IF IB(10).NE.0 THEN WE HAVE A DATE OF 6 INTEGER AFTER IB
459  IF(ib(10).NE.0) THEN
460 
461  srf_obj_tab(srf_id)%POS_DATE = srf_obj_tab(srf_id)%POS_NUM
462  srf_obj_tab(srf_id)%POS_NUM = srf_obj_tab(srf_id)%POS_NUM
463  & + 4 + 6*srf_obj_tab(srf_id)%KS + 4
464  ELSE
465  srf_obj_tab(srf_id)%POS_DATE = 0
466  ENDIF
467 !
468  my_pos = srf_obj_tab(srf_id)%POS_NUM+4
469  READ(file_id,pos=my_pos,iostat=ierr) ib(1:4)
470  IF(ierr.NE.0) THEN
471  error_message = 'ERROR IN '//
472  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
473  & 'OPEN_MESH_SRF:READ_NELEM*'
474  RETURN
475  ENDIF
476 
477  srf_obj_tab(srf_id)%NELEM = ib(1)
478  srf_obj_tab(srf_id)%NPOIN = ib(2)
479  srf_obj_tab(srf_id)%NDP = ib(3)
480 ! Identify the type of element:
481  CALL identify_typ_elt(srf_obj_tab(srf_id)%NDP,
482  & srf_obj_tab(srf_id)%NDIM,
483  & srf_obj_tab(srf_id)%TYP_ELT)
484  srf_obj_tab(srf_id)%TYP_BND_ELT = point_bnd_elt_type
485 !
486 !
487  srf_obj_tab(srf_id)%POS_IKLE = srf_obj_tab(srf_id)%POS_NUM
488  & + (4 + 4*srf_obj_tab(srf_id)%KS + 4)
489  srf_obj_tab(srf_id)%POS_IPOBO = srf_obj_tab(srf_id)%POS_IKLE
490  & + (4 +
491  & srf_obj_tab(srf_id)%NELEM*srf_obj_tab(srf_id)%NDP
492  & * srf_obj_tab(srf_id)%KS
493  & + 4)
494  srf_obj_tab(srf_id)%POS_COORD = srf_obj_tab(srf_id)%POS_IPOBO
495  & + (4 + srf_obj_tab(srf_id)%NPOIN*srf_obj_tab(srf_id)%KS + 4)
496  !
497  !Check if we are indeed in single or double precision
498  ! If we are in single precision the tag for the coordiantes should be:
499  ! npoin*4 if we are in double it will be npoin*8
500  !
501  READ(file_id,pos=srf_obj_tab(srf_id)%POS_COORD) tag
502  IF(tag.EQ.srf_obj_tab(srf_id)%NPOIN*8) THEN
503  fformat = 'SERAFIND'
504  srf_obj_tab(srf_id)%RS = 8
505  ELSEIF(tag.EQ.srf_obj_tab(srf_id)%NPOIN*4) THEN
506  fformat = 'SERAFIN '
507  srf_obj_tab(srf_id)%RS = 4
508  ELSE
509  ierr = hermes_invalid_serafin_file
510  RETURN
511  ENDIF
512 !
513  ! EVEN IN 3D THE SERAFON ONLY CONTAINS THE X AND Y COORDINATES AS THE Y VARIES WITH TIME
514  srf_obj_tab(srf_id)%POS_DATA = srf_obj_tab(srf_id)%POS_COORD
515  & + (4 +
516  & srf_obj_tab(srf_id)%NPOIN*srf_obj_tab(srf_id)%RS
517  & + 4)*2
518  srf_obj_tab(srf_id)%SIZE_DATA =
519  & 4 + srf_obj_tab(srf_id)%NPOIN*srf_obj_tab(srf_id)%RS + 4
520  srf_obj_tab(srf_id)%SIZE_DATA_SET =
521  & 4 + srf_obj_tab(srf_id)%RS + 4
522  & + srf_obj_tab(srf_id)%NVAR*srf_obj_tab(srf_id)%SIZE_DATA
523 !
524  ! IF NPTFR IS NOT IN IB
525  ! WE COMPUTE IT BY COUNTING THE NUMBER OF POINT FOR WHICH IPOBO == 1
526  IF((srf_obj_tab(srf_id)%NPTFR.EQ.0)
527  & .AND. (srf_obj_tab(srf_id)%NPTIR.EQ.0)) THEN
528  ! POSITION OF THE IPOBO ARRAY IN THE FILE
529  my_pos = srf_obj_tab(srf_id)%POS_IPOBO + 4
530  ! Positionning the file pointer
531  READ(file_id,pos=my_pos-4,iostat=ierr) idum
532  ! LOOP ON ALL THE POINTS
533  DO i=1,srf_obj_tab(srf_id)%NPOIN
534  READ(file_id,iostat=ierr) idum
535  IF(ierr.NE.0) THEN
536  error_message = 'ERROR IN '//
537  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
538  & 'OPEN_MESH_SRF:READ_IPOBO_VAL'
539  RETURN
540  ENDIF
541  IF(idum.NE.0) srf_obj_tab(srf_id)%NPTFR =
542  & srf_obj_tab(srf_id)%NPTFR + 1
543  ENDDO
544  ENDIF
545 
546  ! COUTING THE NUMBER OF TIME STEPS
547  ntimestep = 0
548  ierr = 0
549  IF(PRESENT(mesh_number).AND.partel_concat)THEN
550  ntimestep =
551  & int((offset_end-(srf_obj_tab(srf_id)%POS_DATA-1))
552  & /srf_obj_tab(srf_id)%SIZE_DATA_SET, kind=k4)
553  ELSE
554 #if defined NO_INQUIRE_SIZE
555  ! Need this solution for some compilers in which inquire size
556  ! is not implemented
557  my_pos = srf_obj_tab(srf_id)%POS_DATA
558  DO
559  READ(file_id,pos=my_pos+4,iostat=ierr) time
560  IF(ierr.LT.0) EXIT
561  ntimestep = ntimestep + 1
562  my_pos = my_pos + srf_obj_tab(srf_id)%SIZE_DATA_SET
563  ENDDO
564  ! THE LAST READ IS GOING TO CRASH ON PURPOSE BECAUSE
565  ! WE'VE REACHED THE END OF THE FILE
566  ierr = 0
567 #else
568  ! Get the size of the file
569  INQUIRE(unit=file_id,size=fsize)
570  ! Ntimestep = (size_of_fil - size_of_geom)/size_of_a_timestep
571  ntimestep = int((fsize - (srf_obj_tab(srf_id)%POS_DATA - 1) )
572  & /srf_obj_tab(srf_id)%SIZE_DATA_SET, kind=k4)
573 #endif
574  ENDIF
575  srf_obj_tab(srf_id)%NTIMESTEP = ntimestep
576  ELSE
577  ! NOT READ ONLY
578  ! INTIALIZE SRF_OBJ_TAB(SRF_ID) TO ZEROS
579  ! POSITION IN FILE
580  srf_obj_tab(srf_id)%POS_TITLE = offset_begin
581  srf_obj_tab(srf_id)%POS_NVAR = 0
582  srf_obj_tab(srf_id)%POS_VARINFO = 0
583  srf_obj_tab(srf_id)%POS_IB = 0
584  srf_obj_tab(srf_id)%POS_DATE = 0
585  srf_obj_tab(srf_id)%POS_NUM = 0
586  srf_obj_tab(srf_id)%POS_IKLE = 0
587  srf_obj_tab(srf_id)%POS_IPOBO = 0
588  srf_obj_tab(srf_id)%POS_COORD = 0
589  srf_obj_tab(srf_id)%POS_DATA =0
590  ! COMPUTED INFORMATIONS
591  srf_obj_tab(srf_id)%SIZE_DATA = 0
592  srf_obj_tab(srf_id)%SIZE_DATA_SET = 0
593  ! STOCKED QUANTITIES AND SMALL VARIABLES
594  srf_obj_tab(srf_id)%NTIMESTEP = 0
595  srf_obj_tab(srf_id)%NPOIN = 0
596  srf_obj_tab(srf_id)%NVAR = 0
597  srf_obj_tab(srf_id)%NELEM = 0
598  srf_obj_tab(srf_id)%NDP = 0
599  srf_obj_tab(srf_id)%NPLAN = 0
600  srf_obj_tab(srf_id)%NPTFR = 0
601  srf_obj_tab(srf_id)%NPTIR = 0
602  srf_obj_tab(srf_id)%NDIM = 0
603  srf_obj_tab(srf_id)%X_ORIG = 0
604  srf_obj_tab(srf_id)%Y_ORIG = 0
605  srf_obj_tab(srf_id)%TYP_ELT = 0
606  srf_obj_tab(srf_id)%TYP_BND_ELT = 0
607  srf_obj_tab(srf_id)%CLI_LINE_BEGIN = 0
608  srf_obj_tab(srf_id)%CLI_LINE_END = 0
609  ENDIF
610  ! Initialising boundary unit to the same as mesh file
611  srf_obj_tab(srf_id)%NCLI = 0
612 
613  !
614  RETURN
615  END SUBROUTINE
616 !***********************************************************************
617  SUBROUTINE open_bnd_srf
618 !***********************************************************************
619 !
620  &(file_name,file_id,openmode,ierr,mesh_number)
621 !
622 !***********************************************************************
623 ! HERMES V7P0 01/05/2014
624 !***********************************************************************
625 !
626 !brief OPENS A BOUNDARY FILE
627 !
628 !history Y AUDOUIN (LNHE)
629 !+ 24/03/2014
630 !+ V7P0
631 !+
632 !
633 !history J. GRASSET (Daresbury Lab & EDF)
634 !+ 01/05/2018
635 !+ Add code for managing concatenated mesh
636 !
637 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
638 !| FILE_NAME |-->| NAME OF THE BOUNDARY FILE
639 !| FILE_ID |-->| FILE DESCRIPTOR OF THE "MESH" FILE
640 !| OPENMODE |-->| ONE OF THE FOLLOWING VALUE 'READ','WRITE','READWRITE'
641 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
642 !| MESH_NUMBER |-->| IF PRESENT, THIS IS THE NUMBER OF THE PART OF
643 ! THE CONCATENATED FILE WE WANT TO ACCESS
644 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
645 !
647  IMPLICIT NONE
648  !
649  CHARACTER(LEN=*), INTENT(IN) :: FILE_NAME
650  INTEGER, INTENT(IN) :: FILE_ID
651  CHARACTER(LEN=9), INTENT(IN) :: OPENMODE
652  INTEGER, INTENT(OUT) :: IERR
653  INTEGER, OPTIONAL, INTENT(IN) :: MESH_NUMBER
654  !
655  INTEGER SRF_ID,I,NPTFR
656  LOGICAL :: ISOPENED
657  CHARACTER(LEN=9) :: REAL_OPENMODE
658  !
659  CALL get_obj(hash,file_id,srf_id,ierr)
660  IF(ierr.NE.0) THEN
661  error_message = 'ERROR WITH IF '//i2char(file_id)//': '//
662  & 'OPEN_BND_SRF:GET_OBJ'
663  RETURN
664  ENDIF
665  !
666  real_openmode=openmode
667  srf_obj_tab(srf_id)%CLI_LINE_BEGIN=1
668  IF(PRESENT(mesh_number).AND.partel_concat)THEN
669  !If we concatenate we need to be able to move into the file,
670  !which can only be done by reading, so we need readwrite access
671  IF(openmode(1:5)=='WRITE')THEN
672  real_openmode='READWRITE'
673  ENDIF
674  CALL open_index(file_name, srf_obj_tab(srf_id)%CLI_IDX_ID)
675  CALL read_index(srf_obj_tab(srf_id)%CLI_IDX_ID,openmode,
676  & mesh_number,
677  & srf_obj_tab(srf_id)%CLI_LINE_BEGIN,
678  & srf_obj_tab(srf_id)%CLI_LINE_END)
679  ENDIF
680  !
681  ! Open the boundary file with a set id available
682  ! First we check if the file is already opened
683  ! Telemac is using one boundary file for all the mesh file
684  ! so it could have been opened by another mesh before hand
685  INQUIRE(file=file_name,opened=isopened)
686  IF(isopened) THEN
687  INQUIRE(file=file_name,number=srf_obj_tab(srf_id)%NCLI)
688  ELSE
689  ! Otherwise open the file
690  CALL get_free_id(srf_obj_tab(srf_id)%NCLI)
691  OPEN(unit=srf_obj_tab(srf_id)%NCLI,file=file_name,
692  & form='FORMATTED',action=real_openmode,iostat=ierr)
693  IF(ierr.NE.0) THEN
694  error_message = 'ERROR IN '//
695  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
696  & 'OPEN_BND_SRF:OPEN'
697  RETURN
698  ENDIF
699  ENDIF
700  !
701  ! If we are not in write only
702  ! We compute the number of boundary point i.e. number of line in the file
703  IF(real_openmode(1:5).NE.'WRITE') THEN
704  !OFFSET_END SHOULD BE SET TO -1 BY THE SET_BND SUBROUTINE WHEN
705  !WE DON'T HAVE ANY BOUNDARY OR THE FILE IS NOT CONCATENATE
706  IF(PRESENT(mesh_number).AND.partel_concat)THEN
707  IF(srf_obj_tab(srf_id)%CLI_LINE_END >
708  & srf_obj_tab(srf_id)%CLI_LINE_BEGIN)THEN
709  nptfr=srf_obj_tab(srf_id)%CLI_LINE_END
710  & - srf_obj_tab(srf_id)%CLI_LINE_BEGIN
711  ELSE
712  nptfr=0
713  ENDIF
714  ELSE
715  rewind(srf_obj_tab(srf_id)%NCLI)
716  DO i=1,srf_obj_tab(srf_id)%CLI_LINE_BEGIN-1
717  READ(srf_obj_tab(srf_id)%NCLI,*)
718  ENDDO
719  nptfr = 0
720  DO
721  READ(srf_obj_tab(srf_id)%NCLI,*,iostat=ierr)
722  IF (ierr.LT.0) THEN
723  ! END OF FILE REACHED
724  EXIT
725  ELSE IF (ierr.GT.0) THEN
726  ! ERROR DURING READ
727  IF(ierr.NE.0) THEN
728  error_message = 'ERROR IN '//
729  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
730  & 'OPEN_BND_SRF:READ'
731  RETURN
732  ENDIF
733  ENDIF
734  nptfr = nptfr + 1
735  ENDDO
736  ierr = 0
737  ENDIF
738  srf_obj_tab(srf_id)%NPTFR = nptfr
739  ENDIF
740  RETURN
741  !
742  END SUBROUTINE
743 !***********************************************************************
744  SUBROUTINE close_bnd_srf
745 !***********************************************************************
746 !
747  &(file_id,ierr,mesh_number)
748 !
749 !***********************************************************************
750 ! HERMES V7P0 01/05/2014
751 !***********************************************************************
752 !
753 !BRIEF CLOSES A BOUNDARY FILE
754 ! IF MESH_NUMBER IS PROVIDED, THE FUNCTION WILL WRITE THE
755 ! CURRENT SIZE OF THE OFFSET INTO THE INDEX FILE ASSOCIATED TO THE
756 ! CONCATENATED CLI
757 !
758 !HISTORY Y AUDOUIN (LNHE)
759 !+ 24/03/2014
760 !+ V7P0
761 !+
762 !history J. GRASSET (Daresbury Lab & EDF)
763 !+ 01/05/2018
764 !+ Add code for managing concatenated mesh
765 !
766 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
767 !| FILE_ID |-->| FILE DESCRIPTOR
768 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
769 !| MESH_NUMBER |-->| IF PRESENT, THIS IS THE NUMBER OF THE PART OF
770 ! THE CONCATENATED FILE WE WANT TO ACCESS
771 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
772 !
774  IMPLICIT NONE
775  !
776  INTEGER, INTENT(IN) :: FILE_ID
777  INTEGER, INTENT(OUT) :: IERR
778  INTEGER, OPTIONAL, INTENT(IN) :: MESH_NUMBER
779  !
780  INTEGER SRF_ID, LINE_BEGIN, LINE_END
781  !
782  CALL get_obj(hash,file_id,srf_id,ierr)
783  IF(ierr.NE.0) THEN
784  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
785  & 'CLOSE_BND_SRF:GET_OBJ'
786  RETURN
787  ENDIF
788  !
789  ! Check if the file is still opened as it could have been closed
790  ! by another mesh file (see open_bnd_srf for more information)
791  IF(isopened(srf_obj_tab(srf_id)%NCLI)) THEN
792  IF(PRESENT(mesh_number).AND.partel_concat)THEN
793  line_begin = srf_obj_tab(srf_id)%CLI_LINE_BEGIN
794  line_end = srf_obj_tab(srf_id)%NPTFR + line_begin
795  !
796  CALL write_index(srf_obj_tab(srf_id)%CLI_IDX_ID,
797  & mesh_number, line_begin, line_end)
798  CLOSE(srf_obj_tab(srf_id)%CLI_IDX_ID)
799  ENDIF
800  CLOSE(srf_obj_tab(srf_id)%NCLI,iostat=ierr)
801  ENDIF
802  IF(ierr.NE.0) THEN
803  error_message = 'ERROR IN '//
804  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
805  & 'CLOSE_BND_SRF:CLOSE'
806  RETURN
807  ENDIF
808  !
809  END SUBROUTINE
810 !***********************************************************************
811  SUBROUTINE close_mesh_srf
812 !***********************************************************************
813 !
814  &(file_id,ierr,mesh_number)
815 !
816 !***********************************************************************
817 ! HERMES V7P0 01/05/2014
818 !***********************************************************************
819 !
820 !BRIEF CLOSES A MESH FILE
821 ! IF MESH_NUMBER IS PROVIDED, THE FUNCTION WILL WRITE THE
822 ! CURRENT SIZE OF THE MESH INTO THE INDEX FILE ASSOCIATED TO THE
823 ! CONCATENATED MESH
824 !
825 !HISTORY Y AUDOUIN (LNHE)
826 !+ 24/03/2014
827 !+ V7P0
828 !+
829 !history J. GRASSET (Daresbury Lab & EDF)
830 !+ 01/05/2018
831 !+ Add code for managing concatenated mesh
832 !+
833 !
834 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
835 !| FILE_ID |-->| FILE DESCRIPTOR
836 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
837 !| MESH_NUMBER |-->| IF PRESENT, THIS IS THE NUMBER OF THE PART OF
838 ! THE CONCATENATED FILE WE WANT TO ACCESS
839 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
840 !
842  IMPLICIT NONE
843  !
844  INTEGER, INTENT(IN) :: FILE_ID
845  INTEGER, INTENT(OUT) :: IERR
846  INTEGER, OPTIONAL, INTENT(IN) :: MESH_NUMBER
847  !
848  INTEGER SRF_ID
849  INTEGER(KIND=K8) :: OFFSET
850  LOGICAL :: ISOPEN
851  !
852  INQUIRE(unit=file_id, opened=isopen)
853  IF(.NOT.isopen) THEN
854  ierr = 0
855  RETURN
856  ENDIF
857  CALL get_obj(hash,file_id,srf_id,ierr)
858  IF(ierr.NE.0) THEN
859  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
860  & 'CLOSE_MESH:GET_OBJ'
861  RETURN
862  ENDIF
863  !
864  !If mesh_number is present that means we should write the index
865  !at the right place in the index file
866  IF(PRESENT(mesh_number).AND.partel_concat)THEN
867  INQUIRE(file_id,pos=offset)
868  CALL write_index(srf_obj_tab(srf_id)%MESH_IDX_ID,mesh_number,
869  & srf_obj_tab(srf_id)%POS_TITLE,offset)
870  ENDIF
871  !If an index file was open with the mesh we must close it too
872  IF(isopened(srf_obj_tab(srf_id)%MESH_IDX_ID))THEN
873  CLOSE(srf_obj_tab(srf_id)%MESH_IDX_ID)
874  ENDIF
875 
876  ! Clearing id in the hash table
877  hash(srf_id) = 0
878  ! Closing the file
879  CLOSE(file_id,iostat=ierr)
880  IF(ierr.NE.0) THEN
881  error_message = 'ERROR IN '//
882  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
883  & 'CLOSE_MESH_SRF:CLOSE'
884  RETURN
885  ENDIF
886  ! RESET SRF_OBJ_TAB(SRF_ID) TO ZEROS
887  ! POSITION IN FILE
888  srf_obj_tab(srf_id)%POS_TITLE = 1
889  srf_obj_tab(srf_id)%POS_NVAR = 0
890  srf_obj_tab(srf_id)%POS_VARINFO = 0
891  srf_obj_tab(srf_id)%POS_IB = 0
892  srf_obj_tab(srf_id)%POS_DATE = 0
893  srf_obj_tab(srf_id)%POS_NUM = 0
894  srf_obj_tab(srf_id)%POS_IKLE = 0
895  srf_obj_tab(srf_id)%POS_IPOBO = 0
896  srf_obj_tab(srf_id)%POS_COORD = 0
897  srf_obj_tab(srf_id)%POS_DATA =0
898  ! COMPUTED INFORMATIONS
899  srf_obj_tab(srf_id)%SIZE_DATA = 0
900  srf_obj_tab(srf_id)%SIZE_DATA_SET = 0
901  ! STOCKED QUANTITIES AND SMALL VARIABLES
902  srf_obj_tab(srf_id)%NTIMESTEP = 0
903  srf_obj_tab(srf_id)%NPOIN = 0
904  srf_obj_tab(srf_id)%NVAR = 0
905  srf_obj_tab(srf_id)%NELEM = 0
906  srf_obj_tab(srf_id)%NDP = 0
907  srf_obj_tab(srf_id)%NPLAN = 0
908  srf_obj_tab(srf_id)%NPTFR = 0
909  srf_obj_tab(srf_id)%NPTIR = 0
910  srf_obj_tab(srf_id)%NDIM = 0
911  srf_obj_tab(srf_id)%X_ORIG = 0
912  srf_obj_tab(srf_id)%Y_ORIG = 0
913  srf_obj_tab(srf_id)%TYP_ELT = 0
914  srf_obj_tab(srf_id)%TYP_BND_ELT = 0
915  srf_obj_tab(srf_id)%CLI_LINE_BEGIN = 0
916  srf_obj_tab(srf_id)%CLI_LINE_END = 0
917  IF(ALLOCATED(srf_obj_tab(srf_id)%VAR_LIST))
918  & DEALLOCATE(srf_obj_tab(srf_id)%VAR_LIST)
919  !
920  RETURN
921  END SUBROUTINE
922 !
923 ! Mesh functions
924 !
925 !***********************************************************************
926  SUBROUTINE get_mesh_title_srf
927 !***********************************************************************
928 !
929  &(file_id,title,ierr)
930 !
931 !***********************************************************************
932 ! HERMES V7P0 01/05/2014
933 !***********************************************************************
934 !
935 !brief Returns the title from a mesh file
936 !
937 !history Y AUDOUIN (LNHE)
938 !+ 24/03/2014
939 !+ V7P0
940 !+
941 !
942 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
943 !| FILE_ID |-->| FILE DESCRIPTOR
944 !| TITLE |<->| TITLE OF THE MESH FILE
945 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
946 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
947 !
948  IMPLICIT NONE
949  !
950  INTEGER, INTENT(IN) :: FILE_ID
951  CHARACTER(LEN=TITLE_SIZE), INTENT(OUT) :: TITLE
952  INTEGER, INTENT(OUT) :: IERR
953  !
954  INTEGER(KIND=K8) :: MY_POS
955  INTEGER :: SRF_ID
956  !
957  CALL get_obj(hash,file_id,srf_id,ierr)
958  IF(ierr.NE.0) THEN
959  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
960  & 'GET_MESH_TITLE:GET_OBJ'
961  RETURN
962  ENDIF
963  !
964  my_pos = srf_obj_tab(srf_id)%POS_TITLE + 4
965  READ(file_id,pos=my_pos,iostat=ierr)
966  & title(1:title_size)
967  IF(ierr.NE.0) THEN
968  error_message = 'ERROR IN '//
969  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
970  & 'GET_MESH_TITLE_SRF:READ'
971  RETURN
972  ENDIF
973  !
974  RETURN
975  END SUBROUTINE
976 !***********************************************************************
977  SUBROUTINE get_mesh_date_srf
978 !***********************************************************************
979 !
980  &(file_id,date,ierr)
981 !
982 !***********************************************************************
983 ! HERMES V7P0 01/05/2014
984 !***********************************************************************
985 !
986 !brief Returns the date of the mesh file
987 !
988 !history Y AUDOUIN (LNHE)
989 !+ 24/03/2014
990 !+ V7P0
991 !+
992 !
993 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
994 !| FILE_ID |-->| FILE DESCRIPTOR
995 !| DATE |<->| THE DATE
996 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
997 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
998 !
999  IMPLICIT NONE
1000  !
1001  INTEGER, INTENT(IN) :: FILE_ID
1002  INTEGER, INTENT(INOUT) :: DATE(6)
1003  INTEGER, INTENT(OUT) :: IERR
1004  !
1005  INTEGER(KIND=K8) :: MY_POS
1006  INTEGER :: SRF_ID
1007  INTEGER :: I
1008  !
1009  CALL get_obj(hash,file_id,srf_id,ierr)
1010  IF(ierr.NE.0) THEN
1011  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1012  & 'GET_MESH_DATE_SRF:GET_OBJ'
1013  RETURN
1014  ENDIF
1015  !
1016  ! Default value
1017  date(1:6) = (/ 0,0,0,0,0,0 /)
1018  ! POS_DATE=0 <=> NO DATE
1019  IF(srf_obj_tab(srf_id)%POS_DATE.NE.0) THEN
1020  my_pos = srf_obj_tab(srf_id)%POS_DATE + 4
1021  READ(file_id,pos=my_pos,iostat=ierr) (date(i),i=1,6)
1022  IF(ierr.NE.0) THEN
1023  error_message = 'ERROR IN '//
1024  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1025  & 'GET_MESH_DATE_SRF:READ'
1026  RETURN
1027  ENDIF
1028  ENDIF
1029  !
1030  RETURN
1031  END SUBROUTINE
1032 !***********************************************************************
1033  SUBROUTINE get_mesh_nelem_srf
1034 !***********************************************************************
1035 !
1036  &(file_id,typ_elt,nelem,ierr)
1037 !
1038 !***********************************************************************
1039 ! HERMES V7P0 01/05/2014
1040 !***********************************************************************
1041 !
1042 !brief Returns the number of elements of type typ_elem in the mesh file
1043 !
1044 !history Y AUDOUIN (LNHE)
1045 !+ 24/03/2014
1046 !+ V7P0
1047 !+
1048 !
1049 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1050 !| FILE_ID |-->| FILE DESCRIPTOR
1051 !| TYP_ELEM |-->| TYPE OF THE ELEMENT
1052 !| NELEM |<->| THE NUMBER OF ELEMENTS
1053 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1054 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1055 !
1056  IMPLICIT NONE
1057  !
1058  INTEGER, INTENT(IN) :: FILE_ID
1059  INTEGER, INTENT(IN) :: TYP_ELT
1060  INTEGER, INTENT(OUT) :: NELEM
1061  INTEGER, INTENT(OUT) :: IERR
1062  !
1063  INTEGER :: SRF_ID
1064  !
1065  CALL get_obj(hash,file_id,srf_id,ierr)
1066  IF(ierr.NE.0) THEN
1067  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1068  & 'GET_MESH_NELEM_SRF:GET_OBJ'
1069  RETURN
1070  ENDIF
1071  !
1072  IF(typ_elt.EQ.srf_obj_tab(srf_id)%TYP_ELT) THEN
1073  nelem = srf_obj_tab(srf_id)%NELEM
1074  ELSE
1075  nelem = 0
1076  ENDIF
1077  !
1078  RETURN
1079  END SUBROUTINE
1080 !***********************************************************************
1082 !***********************************************************************
1083 !
1084  &(file_id,typ_elt,ndp,ierr)
1085 !
1086 !***********************************************************************
1087 ! HERMES V7P0 01/05/2014
1088 !***********************************************************************
1089 !
1090 !brief Returns the number of point per element of type typ_elem
1091 !
1092 !history Y AUDOUIN (LNHE)
1093 !+ 24/03/2014
1094 !+ V7P0
1095 !+
1096 !
1097 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1098 !| FILE_ID |-->| FILE DESCRIPTOR
1099 !| TYP_ELEM |-->| TYPE OF THE ELEMENT
1100 !| NDP |<->| THE NUMBER OF POINT PER ELEMENT
1101 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1102 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1103 !
1104  IMPLICIT NONE
1105  !
1106  INTEGER, INTENT(IN) :: FILE_ID
1107  INTEGER, INTENT(IN) :: TYP_ELT
1108  INTEGER, INTENT(OUT) :: NDP
1109  INTEGER, INTENT(OUT) :: IERR
1110  !
1111  INTEGER :: SRF_ID
1112  !
1113  CALL get_obj(hash,file_id,srf_id,ierr)
1114  IF(ierr.NE.0) THEN
1115  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1116  & 'GET_MESH_NPOIN_PER_ELEMENT_SRF:GET_OBJ'
1117  RETURN
1118  ENDIF
1119  !
1120  ndp = 0
1121  IF(typ_elt.EQ.srf_obj_tab(srf_id)%TYP_ELT) THEN
1122  ndp = srf_obj_tab(srf_id)%NDP
1123  ENDIF
1124  !
1125  RETURN
1126  END SUBROUTINE
1127 !***********************************************************************
1128  SUBROUTINE get_mesh_connectivity_srf
1129 !***********************************************************************
1130 !
1131  &(file_id,typ_elt,ikle,nelem,ndp,ierr)
1132 !
1133 !***********************************************************************
1134 ! HERMES V7P0 01/05/2014
1135 !***********************************************************************
1136 !
1137 !brief Returns the connectivity table for
1138 !+ the element of type typ_elem in the mesh
1139 !+ will do nothing if there are no element of typ_elem in the mesh
1140 !
1141 !history Y AUDOUIN (LNHE)
1142 !+ 24/03/2014
1143 !+ V7P0
1144 !+
1145 !
1146 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1147 !| FILE_ID |-->| FILE DESCRIPTOR
1148 !| TYP_ELEM |-->| TYPE OF THE ELEMENT
1149 !| IKLE |<->| THE CONNECTIVITY TABLE
1150 !| NELEM |-->| NUMBER OF ELEMENTS
1151 !| NDP |-->| NUMBER OF POINTS PER ELEMENT
1152 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1153 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1154 !
1155  IMPLICIT NONE
1156  !
1157  INTEGER, INTENT(IN) :: FILE_ID
1158  INTEGER, INTENT(IN) :: TYP_ELT
1159  INTEGER, INTENT(IN) :: NELEM
1160  INTEGER, INTENT(IN) :: NDP
1161  INTEGER, INTENT(INOUT) :: IKLE(nelem*ndp)
1162  INTEGER, INTENT(OUT) :: IERR
1163  !
1164  INTEGER :: SRF_ID, ARRAY_SIZE
1165  INTEGER(KIND=K8) :: MY_POS
1166  INTEGER :: I
1167  INTEGER(KIND=K4) :: TMP
1168  !
1169  CALL get_obj(hash,file_id,srf_id,ierr)
1170  IF(ierr.NE.0) THEN
1171  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1172  & 'GET_MESH_CONNECTIVITY_SRF:GET_OBJ'
1173  RETURN
1174  ENDIF
1175  !
1176  array_size = srf_obj_tab(srf_id)%NELEM * srf_obj_tab(srf_id)%NDP
1177  !
1178  IF(typ_elt.EQ.srf_obj_tab(srf_id)%TYP_ELT) THEN
1179  my_pos = srf_obj_tab(srf_id)%POS_IKLE + 4
1180  ! Positioning the file pointer
1181  READ(file_id,pos=my_pos-4,iostat=ierr) tmp
1182  ! WE NEED TO CERTIFY THAT THE INTEGER READ IS ON 4 BYTES
1183  READ(file_id,iostat=ierr) (ikle(i),i=1,array_size)
1184  IF(ierr.NE.0) THEN
1185  error_message = 'ERROR IN '//
1186  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1187  & 'GET_MESH_CONNECTIVITY_SRF:READ'
1188  RETURN
1189  ENDIF
1190  ENDIF
1191  !
1192  RETURN
1193  END SUBROUTINE
1194 !***********************************************************************
1195  SUBROUTINE get_mesh_npoin_srf
1196 !***********************************************************************
1197 !
1198  &(file_id,npoin,ierr)
1199 !
1200 !***********************************************************************
1201 ! HERMES V7P0 01/05/2014
1202 !***********************************************************************
1203 !
1204 !brief Returns the number of point for the given element type in the mesh file
1205 !
1206 !history Y AUDOUIN (LNHE)
1207 !+ 24/03/2014
1208 !+ V7P0
1209 !+
1210 !
1211 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1212 !| FILE_ID |-->| FILE DESCRIPTOR
1213 !| NPOIN |<->| THE NUMBER OF POINTS
1214 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1215 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1216 !
1217  IMPLICIT NONE
1218  !
1219  INTEGER, INTENT(IN) :: FILE_ID
1220  INTEGER, INTENT(OUT) :: NPOIN
1221  INTEGER, INTENT(OUT) :: IERR
1222  !
1223  INTEGER :: SRF_ID
1224  !
1225  CALL get_obj(hash,file_id,srf_id,ierr)
1226  IF(ierr.NE.0) THEN
1227  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1228  & 'GET_MESH_NPOIN_SRF:GET_OBJ'
1229  RETURN
1230  ENDIF
1231  !
1232  npoin = srf_obj_tab(srf_id)%NPOIN
1233  !
1234  RETURN
1235  END SUBROUTINE
1236 !***********************************************************************
1237  SUBROUTINE get_mesh_nplan_srf
1238 !***********************************************************************
1239 !
1240  &(file_id,nplan,ierr)
1241 !
1242 !***********************************************************************
1243 ! HERMES V7P0 01/05/2014
1244 !***********************************************************************
1245 !
1246 !brief Returns the number of layers
1247 !
1248 !history Y AUDOUIN (LNHE)
1249 !+ 24/03/2014
1250 !+ V7P0
1251 !+
1252 !
1253 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1254 !| FILE_ID |-->| FILE DESCRIPTOR
1255 !| NPLAN |<->| THE NUMBER OF LAYERS
1256 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1257 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1258 !
1259  IMPLICIT NONE
1260  !
1261  INTEGER, INTENT(IN) :: FILE_ID
1262  INTEGER, INTENT(OUT) :: NPLAN
1263  INTEGER, INTENT(OUT) :: IERR
1264  !
1265  INTEGER :: SRF_ID
1266  !
1267  CALL get_obj(hash,file_id,srf_id,ierr)
1268  IF(ierr.NE.0) THEN
1269  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1270  & 'GET_MESH_NPLAN_SRF:GET_OBJ'
1271  RETURN
1272  ENDIF
1273  !
1274  nplan = srf_obj_tab(srf_id)%NPLAN
1275  !
1276  RETURN
1277  END SUBROUTINE
1278 !***********************************************************************
1279  SUBROUTINE get_mesh_orig_srf
1280 !***********************************************************************
1281 !
1282  &(file_id,x_orig,y_orig,ierr)
1283 !
1284 !***********************************************************************
1285 ! HERMES V7P0 01/05/2014
1286 !***********************************************************************
1287 !
1288 !brief Returns the X,Y origin of the mesh file
1289 !
1290 !history Y AUDOUIN (LNHE)
1291 !+ 24/03/2014
1292 !+ V7P0
1293 !+
1294 !
1295 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1296 !| FILE_ID |-->| FILE DESCRIPTOR
1297 !| X_ORIG |<->| Off set of the X coordinates
1298 !| Y_ORIG |<->| Off set of the Y coordinates
1299 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1300 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1301 !
1302  IMPLICIT NONE
1303  !
1304  INTEGER, INTENT(IN) :: FILE_ID
1305  INTEGER, INTENT(INOUT) :: X_ORIG, Y_ORIG
1306  INTEGER, INTENT(OUT) :: IERR
1307  !
1308  INTEGER :: SRF_ID
1309  !
1310  CALL get_obj(hash,file_id,srf_id,ierr)
1311  IF(ierr.NE.0) THEN
1312  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1313  & 'GET_MESH_ORIG_SRF:GET_OBJ'
1314  RETURN
1315  ENDIF
1316  !
1317  x_orig = srf_obj_tab(srf_id)%X_ORIG
1318  y_orig = srf_obj_tab(srf_id)%Y_ORIG
1319  !
1320  RETURN
1321  END SUBROUTINE
1322 !***********************************************************************
1323  SUBROUTINE get_mesh_dimension_srf
1324 !***********************************************************************
1325 !
1326  &(file_id,ndim,ierr)
1327 !
1328 !***********************************************************************
1329 ! HERMES V7P0 01/05/2014
1330 !***********************************************************************
1331 !
1332 !brief Returns the number of dimensions of the space
1333 !
1334 !history Y AUDOUIN (LNHE)
1335 !+ 24/03/2014
1336 !+ V7P0
1337 !+
1338 !
1339 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1340 !| FILE_ID |-->| FILE DESCRIPTOR
1341 !| NDIM |<->| NUMBER OF DIMENSION
1342 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1343 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1344 !
1345  IMPLICIT NONE
1346  !
1347  INTEGER, INTENT(IN) :: FILE_ID
1348  INTEGER, INTENT(OUT) :: NDIM
1349  INTEGER, INTENT(OUT) :: IERR
1350  !
1351  INTEGER :: SRF_ID
1352  !
1353  CALL get_obj(hash,file_id,srf_id,ierr)
1354  IF(ierr.NE.0) THEN
1355  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1356  & 'GET_MESH_DIMENSION_SRF:GET_OBJ'
1357  RETURN
1358  ENDIF
1359  !
1360  ndim = srf_obj_tab(srf_id)%NDIM
1361  !
1362  RETURN
1363  END SUBROUTINE
1364 !***********************************************************************
1365  SUBROUTINE get_mesh_coord_srf
1366 !***********************************************************************
1367 !
1368  &(file_id,jdim,npoin,coord,ierr)
1369 !
1370 !***********************************************************************
1371 ! HERMES V7P0 01/05/2014
1372 !***********************************************************************
1373 !
1374 !brief Returns the coordinates for the given dimension
1375 !
1376 !history Y AUDOUIN (LNHE)
1377 !+ 24/03/2014
1378 !+ V7P0
1379 !+
1380 !
1381 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1382 !| FILE_ID |-->| FILE DESCRIPTOR
1383 !| JDIM |-->| DIMENSION NUMBER
1384 !| NPOIN |-->| TOTAL NUMBER OF NODES
1385 !| COORD |<->| LOCAL TO GLOBAL NUMBERING ARRAY
1386 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1387 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1388 !
1389  IMPLICIT NONE
1390  !
1391  INTEGER, INTENT(IN) :: FILE_ID
1392  INTEGER, INTENT(IN) :: JDIM
1393  INTEGER, INTENT(IN) :: NPOIN
1394  DOUBLE PRECISION, INTENT(INOUT) :: COORD(npoin)
1395  INTEGER, INTENT(OUT) :: IERR
1396  !
1397  INTEGER(KIND=K8) :: MY_POS
1398  INTEGER :: SRF_ID
1399  INTEGER :: I, ARRAY_SIZE
1400  INTEGER :: DBL_TYP
1401  INTEGER(KIND=K4) :: TAG
1402  REAL(KIND=R4),ALLOCATABLE :: COORD_2(:)
1403  !
1404  CALL get_obj(hash,file_id,srf_id,ierr)
1405  IF(ierr.NE.0) THEN
1406  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1407  & 'GET_MESH_COORD_SRF:GET_OBJ'
1408  RETURN
1409  ENDIF
1410  !
1411  array_size = srf_obj_tab(srf_id)%NPOIN
1412  dbl_typ = srf_obj_tab(srf_id)%RS
1413  !
1414  ! Move to the position of the coordinates in the mesh file
1415  IF ((jdim.GT.0).AND.(jdim.LE.2)) THEN
1416  my_pos = srf_obj_tab(srf_id)%POS_COORD
1417  & + int((jdim-1)*(4 + array_size*dbl_typ + 4),k8)
1418  & + 4
1419  ELSE
1420 ! ERROR ON JDIM
1421  ierr = hermes_wrong_axe_err
1422  error_message = 'ERROR IN '//
1423  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1424  & 'COORDINATE NUMBER ('//trim(i2char(jdim))//
1425  & ') NOT BETWEEN 0 AND '//i2char(2)
1426  RETURN
1427  ENDIF
1428  ! Positioning the file pointer
1429  READ(file_id,pos=my_pos-4,iostat=ierr) tag
1430  ! Loop on all value depending on real precision (single or double)
1431  IF(dbl_typ.EQ.4) THEN
1432  ALLOCATE(coord_2(array_size),stat=ierr)
1433  IF(ierr.NE.0) THEN
1434  error_message = 'ERROR IN '//
1435  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1436  & 'COORD_2'
1437  RETURN
1438  ENDIF
1439  READ(file_id,iostat=ierr) (coord_2(i),i=1,array_size)
1440  coord = dble(coord_2)
1441  DEALLOCATE(coord_2)
1442  ELSE
1443  READ(file_id,iostat=ierr) (coord(i),i=1,array_size)
1444  ENDIF
1445  IF(ierr.NE.0) THEN
1446  error_message = 'ERROR IN '//
1447  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1448  & 'GET_MESH_COORD_SRF:READ'
1449  RETURN
1450  ENDIF
1451  !
1452  RETURN
1453  END SUBROUTINE
1454 !***********************************************************************
1455  SUBROUTINE get_mesh_l2g_numbering_srf
1456 !***********************************************************************
1457 !
1458  &(file_id,knolg,npoin,ierr)
1459 !
1460 !***********************************************************************
1461 ! HERMES V7P0 01/05/2014
1462 !***********************************************************************
1463 !
1464 !brief Returns the local to global numbering array
1465 !
1466 !history Y AUDOUIN (LNHE)
1467 !+ 24/03/2014
1468 !+ V7P0
1469 !+
1470 !
1471 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1472 !| FFORMAT |-->| FORMAT OF THE FILE
1473 !| FILE_ID |-->| FILE DESCRIPTOR
1474 !| KNOLG |<->| LOCAL TO GLOBAL NUMBERING ARRAY
1475 !| NPOIN |-->| NUMBER OF NODES
1476 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1477 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1478 !
1479  IMPLICIT NONE
1480  !
1481  INTEGER, INTENT(IN) :: FILE_ID
1482  INTEGER, INTENT(IN) :: NPOIN
1483  INTEGER, INTENT(INOUT) :: KNOLG(npoin)
1484  INTEGER, INTENT(OUT) :: IERR
1485  !
1486  INTEGER(KIND=K8) :: MY_POS
1487  INTEGER :: SRF_ID
1488  INTEGER :: ARRAY_SIZE,I
1489  INTEGER(KIND=K4) :: TMP
1490  !
1491  CALL get_obj(hash,file_id,srf_id,ierr)
1492  IF(ierr.NE.0) THEN
1493  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1494  & 'GET_MESH_L2G_NUMBERING_SRF:GET_OBJ'
1495  RETURN
1496  ENDIF
1497  !
1498  array_size = srf_obj_tab(srf_id)%NPOIN
1499  !
1500  my_pos = srf_obj_tab(srf_id)%POS_IPOBO + 4
1501  ! Positionning the file pointer
1502  READ(file_id,pos=my_pos-4,iostat=ierr) tmp
1503  READ(file_id,iostat=ierr) (knolg(i),i=1,array_size)
1504  IF(ierr.NE.0) THEN
1505  error_message = 'ERROR IN '//
1506  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1507  & 'GET_MESH_L2G_NUMBERING_SRF:READ'
1508  RETURN
1509  ENDIF
1510  !
1511  RETURN
1512  END SUBROUTINE
1513 !***********************************************************************
1514  SUBROUTINE get_mesh_nptir_srf
1515 !***********************************************************************
1516 !
1517  &(file_id,nptir,ierr)
1518 !
1519 !***********************************************************************
1520 ! HERMES V7P0 01/05/2014
1521 !***********************************************************************
1522 !
1523 !brief Returns the number of interface point
1524 !
1525 !history Y AUDOUIN (LNHE)
1526 !+ 24/03/2014
1527 !+ V7P0
1528 !+
1529 !
1530 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1531 !| FILE_ID |-->| FILE DESCRIPTOR
1532 !| NPTIR |<->| NUMBER OF INTERFACE POINT
1533 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1534 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1535 !
1536  IMPLICIT NONE
1537  !
1538  INTEGER, INTENT(IN) :: FILE_ID
1539  INTEGER, INTENT(OUT) :: NPTIR
1540  INTEGER, INTENT(OUT) :: IERR
1541  !
1542  INTEGER :: SRF_ID
1543  !
1544  !TODO: Remove that function ??
1545  CALL get_obj(hash,file_id,srf_id,ierr)
1546  IF(ierr.NE.0) THEN
1547  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1548  & 'GET_MESH_NPTIR_SRF:GET_OBJ'
1549  RETURN
1550  ENDIF
1551  !
1552  nptir = srf_obj_tab(srf_id)%NPTIR
1553  !
1554  RETURN
1555  END SUBROUTINE
1556 !
1557 ! Boundary functions
1558 !
1559 !***********************************************************************
1560  SUBROUTINE get_bnd_ipobo_srf
1561 !***********************************************************************
1562 !
1563  &(file_id,npoin,ipobo,ierr)
1564 !
1565 !***********************************************************************
1566 ! HERMES V7P0 01/05/2014
1567 !***********************************************************************
1568 !
1569 !brief Returns an array containing
1570 !+ 1 if a point is a boundary point 0 otherwise
1571 !
1572 !history Y AUDOUIN (LNHE)
1573 !+ 24/03/2014
1574 !+ V7P0
1575 !+
1576 !
1577 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1578 !| FILE_ID |-->| FILE DESCRIPTOR
1579 !| NPOIN |-->| TOTAL NUMBER OF NODES
1580 !| IPOBO |<->| AN ARRAY CONTAINING
1581 !| | | 1 IF A POINT IS A BOUNDARY POINT 0 OTHERWISE
1582 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1583 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1584 !
1585  IMPLICIT NONE
1586  !
1587  INTEGER, INTENT(IN) :: FILE_ID
1588  INTEGER, INTENT(IN) :: NPOIN
1589  INTEGER, INTENT(INOUT) :: IPOBO(npoin)
1590  INTEGER, INTENT(OUT) :: IERR
1591  !
1592  INTEGER(KIND=K8) :: MY_POS
1593  INTEGER :: SRF_ID
1594  INTEGER :: ARRAY_SIZE, I
1595  INTEGER(KIND=K4) TMP
1596  !
1597  CALL get_obj(hash,file_id,srf_id,ierr)
1598  IF(ierr.NE.0) THEN
1599  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1600  & 'GET_BND_IPOBO_SRF:GET_OBJ'
1601  RETURN
1602  ENDIF
1603  !
1604  array_size = srf_obj_tab(srf_id)%NPOIN
1605  !
1606  my_pos = srf_obj_tab(srf_id)%POS_IPOBO + 4
1607  ! Positionning the file pointer
1608  READ(file_id,pos=my_pos-4,iostat=ierr) tmp
1609  READ(file_id,iostat=ierr) (ipobo(i),i=1,array_size)
1610  IF(ierr.NE.0) THEN
1611  error_message = 'ERROR IN '//
1612  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1613  & 'GET_MESH_IPOBO_SRF:READ'
1614  RETURN
1615  ENDIF
1616  !
1617  RETURN
1618  END SUBROUTINE
1619 !
1620 !***********************************************************************
1621  SUBROUTINE get_bnd_numbering_srf
1622 !***********************************************************************
1623 !
1624  &(file_id,typ_elem_bnd,nptfr,nbor,ierr)
1625 !
1626 !***********************************************************************
1627 ! HERMES V7P0 01/05/2014
1628 !***********************************************************************
1629 !
1630 !brief Returns an array containing
1631 !+ The association of boundary numbering to mesh numbering
1632 !
1633 !history Y AUDOUIN (LNHE)
1634 !+ 24/03/2014
1635 !+ V7P0
1636 !+
1637 !
1638 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1639 !| FILE_ID |-->| FILE DESCRIPTOR
1640 !| TYP_BND_ELEM |-->| TYPE OF THE BOUNDARY ELEMENT
1641 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
1642 !| NBOR |<->| AN ARRAY CONTAINING THE NUMBERING IN THE MESH
1643 !| | | OF ALL BOUNDARY POINTS
1644 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1645 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1646 !
1647 !
1648  INTEGER, INTENT(IN) :: FILE_ID,NPTFR,TYP_ELEM_BND
1649  INTEGER, INTENT(INOUT) :: NBOR(nptfr)
1650  INTEGER, INTENT(OUT) :: IERR
1651  !
1652  INTEGER SRF_ID
1653  !
1654  CALL get_obj(hash,file_id,srf_id,ierr)
1655  IF(ierr.NE.0) THEN
1656  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1657  & 'GET_BND_IPOBO_SRF:GET_OBJ'
1658  RETURN
1659  ENDIF
1660  !
1661  CALL get_bnd_connectivity_srf(file_id,typ_elem_bnd,nptfr,
1662  & point_bnd_elt_type,nbor,ierr)
1663  IF(ierr.NE.0) THEN
1664  error_message = 'ERROR IN '//
1665  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1666  & 'GET_BND_NUMBERING_SRF:GET_BND_CONNECTIVITY_SRF'
1667  RETURN
1668  ENDIF
1669  !
1670  RETURN
1671  END SUBROUTINE
1672  SUBROUTINE get_bnd_nelem_srf(FILE_ID,TYPE_BND_ELEM, NELEM,IERR)
1673 !
1674 !***********************************************************************
1675 ! HERMES V7P0 01/05/2014
1676 !***********************************************************************
1677 !
1678 !brief Reads the number of boundary elements
1679 !
1680 !history Y AUDOUIN (LNHE)
1681 !+ 24/03/2014
1682 !+ V7P0
1683 !+
1684 !
1685 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1686 !| FILE_ID |-->| FILE DESCRIPTOR
1687 !| TYPE_BND_ELEM |-->| TYPE OF THE BOUNDARY ELEMENTS
1688 !| NELEM |<->| NUMBER OF BOUNDARY ELEMENTS
1689 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1690 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1691 !
1692  IMPLICIT NONE
1693  !
1694  INTEGER, INTENT(IN) :: FILE_ID
1695  INTEGER, INTENT(IN) :: TYPE_BND_ELEM
1696  INTEGER, INTENT(INOUT) :: NELEM
1697  INTEGER, INTENT(OUT) :: IERR
1698  !
1699  INTEGER :: SRF_ID
1700  !
1701  CALL get_obj(hash,file_id,srf_id,ierr)
1702  IF(ierr.NE.0) THEN
1703  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1704  & 'GET_BND_NELEM_SRF:GET_OBJ'
1705  RETURN
1706  ENDIF
1707  !
1708  ! Checking that we have the right element type
1709  IF(srf_obj_tab(srf_id)%TYP_BND_ELT.EQ.type_bnd_elem) THEN
1710  nelem = srf_obj_tab(srf_id)%NPTFR
1711  ELSE
1712  nelem = 0
1713  ENDIF
1714  !
1715  RETURN
1716  END SUBROUTINE
1717 !***********************************************************************
1718  SUBROUTINE get_bnd_connectivity_srf
1719 !***********************************************************************
1720 !
1721  &(file_id,typ_bnd_elt,nelebd,ndp,ikle,ierr)
1722 !
1723 !***********************************************************************
1724 ! HERMES V7P0 01/05/2014
1725 !***********************************************************************
1726 !
1727 !brief Reads the connectivity of the boundary elements
1728 !
1729 !history Y AUDOUIN (LNHE)
1730 !+ 24/03/2014
1731 !+ V7P0
1732 !+
1733 !
1734 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1735 !| FILE_ID |-->| FILE DESCRIPTOR
1736 !| TYP_BND_ELEM |-->| TYPE OF THE BOUNDARY ELEMENTS
1737 !| NELEBD |-->| NUMBER OF BOUNDARY ELEMENTS
1738 !| NDP |-->| NUMBER OF POINTS PER ELEMENT
1739 !| IKLE |<->| THE CONNECTIVITY OF THE BOUNDARY ELEMENTS
1740 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1741 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1742 !
1743  IMPLICIT NONE
1744  !
1745  INTEGER, INTENT(IN) :: FILE_ID
1746  INTEGER, INTENT(IN) :: TYP_BND_ELT
1747  INTEGER, INTENT(IN) :: NELEBD
1748  INTEGER, INTENT(IN) :: NDP
1749  INTEGER, INTENT(INOUT) :: IKLE(nelebd*ndp)
1750  INTEGER, INTENT(OUT) :: IERR
1751  !
1752  INTEGER :: SRF_ID, I
1753  DOUBLE PRECISION :: DDUM
1754  INTEGER :: IDUM
1755  !
1756  CALL get_obj(hash,file_id,srf_id,ierr)
1757  IF(ierr.NE.0) THEN
1758  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1759  & 'GET_BND_CONNECTIVITY_SRF:GET_OBJ'
1760  RETURN
1761  ENDIF
1762  !
1763  ! Checking that we have the right element type
1764  IF(srf_obj_tab(srf_id)%TYP_BND_ELT.NE.typ_bnd_elt) THEN
1765  ierr = hermes_wrong_element_type_err
1766  error_message = 'GIVEN BOUNDARY ELEMENT TYPE :'//
1767  & i2char(typ_bnd_elt)//
1768  & ' IS NOT THE SAME AS THE ONE IN THE FILE: '//
1769  & i2char(srf_obj_tab(srf_id)%TYP_BND_ELT)
1770  RETURN
1771  ENDIF
1772  ! Read the boundary file we only care about the connectivity
1773  rewind(srf_obj_tab(srf_id)%NCLI)
1774  !If the file is a concatenation, we need to move to the
1775  !begining of our part
1776  DO i=1,srf_obj_tab(srf_id)%CLI_LINE_BEGIN-1
1777  READ(srf_obj_tab(srf_id)%NCLI,*)
1778  ENDDO
1779  DO i=1,srf_obj_tab(srf_id)%NPTFR
1780  READ(srf_obj_tab(srf_id)%NCLI,*,iostat=ierr) idum,idum,idum,
1781  & ddum ,ddum ,ddum,
1782  & ddum ,idum,ddum,ddum,ddum,
1783  & ikle(i),idum
1784  IF(ierr.LT.0) THEN
1785  ! End of file reached
1786  error_message = 'ERROR IN '//
1787  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1788  & 'GET_BND_CONNECTIVITY_SRF:READ:END OF FILE'
1789  RETURN
1790  ELSE IF (ierr.GE.0) THEN
1791  ! Error during read
1792  IF(ierr.NE.0) THEN
1793  error_message = 'ERROR IN '//
1794  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1795  & 'GET_BND_CONNECTIVITY_SRF:READ'
1796  RETURN
1797  ENDIF
1798  ENDIF
1799  ENDDO
1800  !
1801  RETURN
1802  END SUBROUTINE
1803 !***********************************************************************
1804  SUBROUTINE get_bnd_color_srf
1805 !***********************************************************************
1806 !
1807  &(file_id,typ_bnd_elt,nelebd,color,ierr)
1808 !
1809 !***********************************************************************
1810 ! HERMES V7P0 01/05/2014
1811 !***********************************************************************
1812 !
1813 !brief Reads the connectivity of the boundary elements
1814 !
1815 !history Y AUDOUIN (LNHE)
1816 !+ 24/03/2014
1817 !+ V7P0
1818 !+
1819 !
1820 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1821 !| FILE_ID |-->| FILE DESCRIPTOR
1822 !| TYP_BND_ELEM |-->| TYPE OF THE BOUNDARY ELEMENTS
1823 !| NELEBD |-->| NUMBER OF BOUNDARY ELEMENTS
1824 !| COLOR |<->| Boundary color
1825 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1826 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1827 !
1828  IMPLICIT NONE
1829  !
1830  INTEGER, INTENT(IN) :: FILE_ID
1831  INTEGER, INTENT(IN) :: TYP_BND_ELT
1832  INTEGER, INTENT(IN) :: NELEBD
1833  INTEGER, INTENT(INOUT) :: COLOR(nelebd)
1834  INTEGER, INTENT(OUT) :: IERR
1835  !
1836  INTEGER :: SRF_ID, I
1837  DOUBLE PRECISION :: DDUM
1838  INTEGER :: IDUM
1839  !
1840  CALL get_obj(hash,file_id,srf_id,ierr)
1841  IF(ierr.NE.0) THEN
1842  error_message = 'ERROR WITH ID '//
1843  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1844  & 'GET_BND_CONNECTIVITY_SRF:GET_OBJ'
1845  RETURN
1846  ENDIF
1847  !
1848  ! Checking that we have the right element type
1849  IF(srf_obj_tab(srf_id)%TYP_BND_ELT.NE.typ_bnd_elt) THEN
1850  ierr = hermes_wrong_element_type_err
1851  error_message = 'GIVEN BOUNDARY ELEMENT TYPE :'//
1852  & i2char(typ_bnd_elt)//
1853  & ' IS NOT THE SAME AS THE ONE IN THE FILE: '//
1854  & i2char(srf_obj_tab(srf_id)%TYP_BND_ELT)
1855  RETURN
1856  ENDIF
1857  ! Read the boundary file we only care about the connectivity
1858  rewind(srf_obj_tab(srf_id)%NCLI)
1859  !If the file is a concatenation, we need to move to the
1860  !begining of our part
1861  DO i=1,srf_obj_tab(srf_id)%CLI_LINE_BEGIN-1
1862  READ(srf_obj_tab(srf_id)%NCLI,*)
1863  ENDDO
1864  DO i=1,srf_obj_tab(srf_id)%NPTFR
1865  READ(srf_obj_tab(srf_id)%NCLI,*,iostat=ierr) idum,idum,idum,
1866  & ddum ,ddum ,ddum,
1867  & ddum ,idum,ddum,ddum,ddum,
1868  & idum, color(i)
1869  IF(ierr.LT.0) THEN
1870  ! End of file reached
1871  error_message = 'ERROR IN '//
1872  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1873  & 'GET_BND_CONNECTIVITY_SRF:READ:END OF FILE'
1874  RETURN
1875  ELSE IF (ierr.GT.0) THEN
1876  ! Error during read
1877  IF(ierr.NE.0) THEN
1878  error_message = 'ERROR IN '//
1879  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1880  & 'GET_BND_CONNECTIVITY_SRF:READ'
1881  RETURN
1882  ENDIF
1883  ENDIF
1884  ENDDO
1885  !
1886  RETURN
1887  END SUBROUTINE
1888 !***********************************************************************
1889  SUBROUTINE get_bnd_value_srf
1890 !***********************************************************************
1891 !
1892  &(file_id,typ_bnd_elem,nptfr,lihbor,liubor,
1893  & livbor,hbor,ubor,vbor,chbord,trac,
1894  & litbor,tbor,atbor,btbor, ierr)
1895 !
1896 !***********************************************************************
1897 ! HERMES V7P0 01/05/2014
1898 !***********************************************************************
1899 !
1900 !brief Returns an array containing the boundary type for each
1901 !+ boundary point
1902 !
1903 !history Y AUDOUIN (LNHE)
1904 !+ 24/03/2014
1905 !+ V7P0
1906 !+
1907 !
1908 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1909 !| FILE_ID |-->| FILE DESCRIPTOR
1910 !| TYP_BND_ELEM |-->| TYPE OF THE BOUNDARY ELEMENTS
1911 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
1912 !| LIHBOR |-->| TYPE OF BOUNDARY CONDITIONS ON DEPTH
1913 !| LIUBOR |-->| TYPE OF BOUNDARY CONDITIONS ON U
1914 !| LIVBOR |-->| TYPE OF BOUNDARY CONDITIONS ON V
1915 !| HBOR |<--| PRESCRIBED BOUNDARY CONDITION ON DEPTH
1916 !| UBOR |<--| PRESCRIBED BOUNDARY CONDITION ON VELOCITY U
1917 !| VBOR |<--| PRESCRIBED BOUNDARY CONDITION ON VELOCITY V
1918 !| CHBORD |<--| FRICTION COEFFICIENT AT BOUNDARY
1919 !| TRAC |-->| IF YES, THERE ARE TRACERS
1920 !| LITBOR |-->| PHYSICAL BOUNDARY CONDITIONS FOR TRACERS
1921 !| TBOR |<--| PRESCRIBED BOUNDARY CONDITION ON TRACER
1922 !| ATBOR,BTBOR |<--| THERMAL EXCHANGE COEFFICIENTS.
1923 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
1924 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1925 !
1926  !
1927  IMPLICIT NONE
1928  !
1929  INTEGER, INTENT(IN) :: FILE_ID
1930  INTEGER, INTENT(IN) :: TYP_BND_ELEM
1931  INTEGER, INTENT(IN) :: NPTFR
1932  INTEGER, INTENT(INOUT) :: LIUBOR(nptfr),LIVBOR(nptfr)
1933  INTEGER, INTENT(INOUT) :: LIHBOR(nptfr),LITBOR(*)
1934  DOUBLE PRECISION, INTENT(INOUT) :: UBOR(*),VBOR(*)
1935  DOUBLE PRECISION, INTENT(INOUT) :: HBOR(nptfr),CHBORD(nptfr)
1936  DOUBLE PRECISION, INTENT(INOUT) :: TBOR(*),ATBOR(*)
1937  DOUBLE PRECISION, INTENT(INOUT) :: BTBOR(*)
1938  LOGICAL, INTENT(IN) :: TRAC
1939  INTEGER, INTENT(OUT) :: IERR
1940  !
1941  INTEGER :: SRF_ID, I
1942  INTEGER :: IDUM
1943  DOUBLE PRECISION :: DDUM
1944  !
1945  CALL get_obj(hash,file_id,srf_id,ierr)
1946  IF(ierr.NE.0) THEN
1947  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1948  & 'GET_BND_VALUE_SRF:GET_OBJ'
1949  RETURN
1950  ENDIF
1951  !
1952  ! Checking that we have the right element type
1953  IF(srf_obj_tab(srf_id)%TYP_BND_ELT.NE.typ_bnd_elem) THEN
1954  ierr = hermes_wrong_element_type_err
1955  error_message = 'GIVEN BOUNDARY ELEMENT TYPE :'//
1956  & i2char(typ_bnd_elem)//
1957  & ' IS NOT THE SAME AS THE ONE IN THE FILE: '//
1958  & i2char(srf_obj_tab(srf_id)%TYP_BND_ELT)
1959  RETURN
1960  ENDIF
1961  ! Reading the boundary file informations we only care
1962  ! about the boundary type li[huvt]bor
1963  rewind(srf_obj_tab(srf_id)%NCLI)
1964  !If the file is a concatenation, we need to move to the
1965  !begining of our part
1966  DO i=1,srf_obj_tab(srf_id)%CLI_LINE_BEGIN-1
1967  READ(srf_obj_tab(srf_id)%NCLI,*)
1968  ENDDO
1969  DO i=1,srf_obj_tab(srf_id)%NPTFR
1970  IF(trac) THEN
1971  READ(srf_obj_tab(srf_id)%NCLI,*,iostat=ierr)
1972  & lihbor(i),liubor(i),livbor(i),
1973  & hbor(i) ,ubor(i) ,vbor(i),
1974  & chbord(i) ,litbor(i),
1975  & tbor(i),atbor(i),btbor(i),
1976  & idum,idum
1977  ELSE
1978  READ(srf_obj_tab(srf_id)%NCLI,*,iostat=ierr)
1979  & lihbor(i),liubor(i),livbor(i),
1980  & hbor(i) ,ubor(i) ,vbor(i),
1981  & chbord(i) ,idum,ddum,ddum,ddum,
1982  & idum,idum
1983  ENDIF
1984  IF(ierr.LT.0) THEN
1985  ! End of file reached
1986  error_message = 'ERROR IN '//
1987  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1988  & 'GET_BND_VALUE_SRF:READ:END OF FILE'
1989  RETURN
1990  ELSE IF (ierr.GT.0) THEN
1991  ! Error during read
1992  IF(ierr.NE.0) THEN
1993  error_message = 'ERROR IN '//
1994  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
1995  & 'GET_BND_VALUE_SRF:READ'
1996  RETURN
1997  ENDIF
1998  ENDIF
1999  ENDDO
2000  !
2001  RETURN
2002  END SUBROUTINE
2003 !***********************************************************************
2004  SUBROUTINE get_bnd_npoin_srf
2005 !***********************************************************************
2006 !
2007  &(file_id,type_bnd_elem,nptfr,ierr)
2008 !
2009 !***********************************************************************
2010 ! HERMES V7P0 01/05/2014
2011 !***********************************************************************
2012 !
2013 !brief Returns the number of boundary points
2014 !
2015 !history Y AUDOUIN (LNHE)
2016 !+ 24/03/2014
2017 !+ V7P0
2018 !+
2019 !
2020 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2021 !| FILE_ID |-->| FILE DESCRIPTOR
2022 !| TYPE_BND_ELEM |-->| TYPE OF THE BOUNDARY ELEMENTS
2023 !| NPTFR |<->| NUMBER OF BOUNDARY POINTS
2024 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2025 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2026 !
2027  IMPLICIT NONE
2028  !
2029  INTEGER, INTENT(IN) :: FILE_ID
2030  INTEGER, INTENT(IN) :: TYPE_BND_ELEM
2031  INTEGER, INTENT(OUT) :: NPTFR
2032  INTEGER, INTENT(OUT) :: IERR
2033  !
2034  INTEGER :: SRF_ID
2035  !
2036  CALL get_obj(hash,file_id,srf_id,ierr)
2037  IF(ierr.NE.0) THEN
2038  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2039  & 'GET_BND_NPOIN_SRF:GET_OBJ'
2040  RETURN
2041  ENDIF
2042  !
2043  IF(srf_obj_tab(srf_id)%TYP_BND_ELT.EQ.type_bnd_elem) THEN
2044  nptfr = srf_obj_tab(srf_id)%NPTFR
2045  ELSE
2046  nptfr = 0
2047  ENDIF
2048  !
2049  !
2050  RETURN
2051  END SUBROUTINE
2052 !
2053 ! Data functions
2054 !
2055 !***********************************************************************
2056  SUBROUTINE get_data_nvar_srf
2057 !***********************************************************************
2058 !
2059  &(file_id,nvar,ierr)
2060 !
2061 !***********************************************************************
2062 ! HERMES V7P0 01/05/2014
2063 !***********************************************************************
2064 !
2065 !brief Returns the number of varaibles in the mesh file
2066 !
2067 !history Y AUDOUIN (LNHE)
2068 !+ 24/03/2014
2069 !+ V7P0
2070 !+
2071 !
2072 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2073 !| FILE_ID |-->| FILE DESCRIPTOR
2074 !| NVAR |<->| NUMBER OF VARIABLE
2075 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2076 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2078  IMPLICIT NONE
2079  !
2080  INTEGER, INTENT(IN) :: FILE_ID
2081  INTEGER, INTENT(OUT) :: NVAR
2082  INTEGER, INTENT(OUT) :: IERR
2083  !
2084  INTEGER :: SRF_ID
2085  !
2086  CALL get_obj(hash,file_id,srf_id,ierr)
2087  IF(ierr.NE.0) THEN
2088  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2089  & 'GET_DATA_NVAR_SRF:GET_OBJ'
2090  RETURN
2091  ENDIF
2092  !
2093  nvar = srf_obj_tab(srf_id)%NVAR
2094  !
2095  RETURN
2096  END SUBROUTINE
2097 !***********************************************************************
2098  SUBROUTINE get_data_var_list_srf
2099 !***********************************************************************
2100 !
2101  &(file_id,nvar,var_list,unit_list,ierr)
2102 !
2103 !***********************************************************************
2104 ! HERMES V7P0 01/05/2014
2105 !***********************************************************************
2106 !
2107 !brief Returns a list of all the name of the variables in the mesh file
2108 !+ and a list of their units
2109 !
2110 !history Y AUDOUIN (LNHE)
2111 !+ 24/03/2014
2112 !+ V7P0
2113 !+
2114 !
2115 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2116 !| FILE_ID |-->| FILE DESCRIPTOR
2117 !| VARLIST |<->| LIST OF VARIABLE NAME
2118 !| UNTILIST |<->| LIST OF VARIABLE UNIT
2119 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2120 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2121 !
2122  IMPLICIT NONE
2123  !
2124  INTEGER, INTENT(IN) :: FILE_ID
2125  INTEGER, INTENT(IN) :: NVAR
2126  CHARACTER(LEN=16), INTENT(INOUT) :: VAR_LIST(nvar)
2127  CHARACTER(LEN=16), INTENT(INOUT) :: UNIT_LIST(nvar)
2128  INTEGER, INTENT(OUT) :: IERR
2129  !
2130  INTEGER :: SRF_ID
2131  INTEGER :: I
2132  !
2133  CALL get_obj(hash,file_id,srf_id,ierr)
2134  IF(ierr.NE.0) THEN
2135  error_message = 'ERROR IN '//
2136  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2137  & 'GET_DATA_VAR_LIST_SRF:GET_OBJ'
2138  RETURN
2139  ENDIF
2140  !
2141  ! Test if the number of variable given as argument is the same
2142  ! as the one in the file
2143  IF(nvar.NE.srf_obj_tab(srf_id)%NVAR) THEN
2144  ierr = hermes_wrong_array_size_err
2145  error_message = 'ERROR IN '//
2146  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2147  & 'WRON NUMBER OF VARIABLE GIVEN: '//i2char(nvar)//
2148  & 'INSTEAD OF '//i2char(srf_obj_tab(srf_id)%NVAR)
2149  RETURN
2150  ENDIF
2151  DO i=1,srf_obj_tab(srf_id)%NVAR
2152  var_list(i) = trim(srf_obj_tab(srf_id)%VAR_LIST(i)(1:16))
2153  unit_list(i) = trim(srf_obj_tab(srf_id)%VAR_LIST(i)(17:32))
2154  ENDDO
2155  !
2156  RETURN
2157  END SUBROUTINE
2158 !***********************************************************************
2159  SUBROUTINE get_data_ntimestep_srf
2160 !***********************************************************************
2161 !
2162  &(file_id,ntimestep,ierr)
2163 !
2164 !***********************************************************************
2165 ! HERMES V7P0 01/05/2014
2166 !***********************************************************************
2167 !
2168 !brief Returns the number of time step in the mesh file
2169 !
2170 !history Y AUDOUIN (LNHE)
2171 !+ 24/03/2014
2172 !+ V7P0
2173 !+
2174 !
2175 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2176 !| FILE_ID |-->| FILE DESCRIPTOR
2177 !| NTIMESTEP |<->| THE NUMBER OF TIME STEPS
2178 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2179 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2180 !
2181  IMPLICIT NONE
2182  !
2183  INTEGER, INTENT(IN) :: FILE_ID
2184  INTEGER, INTENT(OUT) :: NTIMESTEP
2185  INTEGER, INTENT(OUT) :: IERR
2186  !
2187  INTEGER :: SRF_ID
2188  !
2189  CALL get_obj(hash,file_id,srf_id,ierr)
2190  IF(ierr.NE.0) THEN
2191  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2192  & 'GET_DATA_NTIMSTEP_SRF:GET_OBJ'
2193  RETURN
2194  ENDIF
2195  !
2196  ntimestep = srf_obj_tab(srf_id)%NTIMESTEP
2197  !
2198  RETURN
2199  END SUBROUTINE
2200 !***********************************************************************
2201  SUBROUTINE get_data_time_srf
2202 !***********************************************************************
2203 !
2204  &(file_id,record,time,ierr)
2205 !
2206 !***********************************************************************
2207 ! HERMES V7P0 01/05/2014
2208 !***********************************************************************
2209 !
2210 !brief Returns the time value of a given time step
2211 !
2212 !history Y AUDOUIN (LNHE)
2213 !+ 24/03/2014
2214 !+ V7P0
2215 !+
2216 !
2217 !history R ATA (EDF R&D, LNHE)
2218 !+ 24/05/2016
2219 !+ V7P2
2220 !+ The case with no record in the file was not treated.
2221 !
2222 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2223 !| FILE_ID |-->| FILE DESCRIPTOR
2224 !| RECORD |-->| NUMBER OF THE TIME STEP
2225 !| TIME |<->| TIME IN SECOND OF THE TIME STEP
2226 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2227 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2228 !
2229  IMPLICIT NONE
2230  !
2231  INTEGER, INTENT(IN) :: FILE_ID
2232  INTEGER, INTENT(IN) :: RECORD
2233  DOUBLE PRECISION, INTENT(INOUT) :: TIME
2234  INTEGER, INTENT(OUT) :: IERR
2235  !
2236  INTEGER(KIND=K8) :: MY_POS
2237  INTEGER :: SRF_ID
2238  REAL :: W
2239  INTEGER :: IREC,NTIMESTEP
2240  !
2241  CALL get_obj(hash,file_id,srf_id,ierr)
2242  IF(ierr.NE.0) THEN
2243  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2244  & 'GET_DATA_TIME_SRF:GET_OBJ'
2245  RETURN
2246  ENDIF
2247  !
2248  ntimestep = srf_obj_tab(srf_id)%NTIMESTEP
2249  ! CHECK IF THE RECORD IS IN THE FILE
2250  IF((record.GE.ntimestep.OR.record.LT.0).AND.
2251  & ntimestep.GT.0) THEN
2252  ierr = hermes_record_unknown_err
2253  error_message = 'ERROR IN '//
2254  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2255  & 'RECORD: '//i2char(record)//' IS NOT WITHIN [0, '//
2256  & i2char(ntimestep-1)//']'
2257  RETURN
2258  ELSE
2259  irec = record
2260  ENDIF
2261  ! POSITION OF THE TIME TO READ
2262  my_pos = srf_obj_tab(srf_id)%POS_DATA + 4
2263  & + int(irec,k8)*srf_obj_tab(srf_id)%SIZE_DATA_SET
2264  ! DIFFERENCE BETWEEN REAL AND DOUBLE PRECISION
2265  IF(srf_obj_tab(srf_id)%RS.EQ.4) THEN
2266  READ(file_id,pos=my_pos,iostat=ierr) w
2267  time = dble(w)
2268  ELSE
2269  READ(file_id,pos=my_pos,iostat=ierr) time
2270  ENDIF
2271  IF(ierr.NE.0) THEN
2272  error_message = 'ERROR IN '//
2273  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2274  & 'GET_DATA_TIME_SRF:READ'
2275  RETURN
2276  ENDIF
2277  !
2278  RETURN
2279  END SUBROUTINE
2280 !***********************************************************************
2281  SUBROUTINE get_data_value_srf
2282 !***********************************************************************
2283 !
2284  &(file_id,record,var_name,res_value,n,ierr)
2285 !
2286 !***********************************************************************
2287 ! HERMES V7P2 01/05/2014
2288 !***********************************************************************
2289 !
2290 !brief Returns The value for each point of a given variable
2291 !+ for a given time step
2292 !
2293 !history Y AUDOUIN (LNHE)
2294 !+ 24/03/2014
2295 !+ V7P0
2296 !+ First version.
2297 !
2298 !history R ATA (EDF R&D, LNHE)
2299 !+ 24/05/2016
2300 !+ V7P2
2301 !+ The case with no record in the file was not treated.
2302 !
2303 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2304 !| FILE_ID |-->| FILE DESCRIPTOR
2305 !| RECORD |-->| TIME STEP TO READ IN THE FILE
2306 !| VAR_NAME |-->| VARIABLE FOR WHICH WE NEED THE VALUE
2307 !| RES_VALUE |<->| VALUE FOR EACH POINT AT TIME STEP RECORD
2308 !| | | FOR THE VARIABLE VAR_NAME
2309 !| N |-->| SIZE OF RES_VALUE
2310 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2311 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2312 !
2313  IMPLICIT NONE
2314  !
2315  INTEGER, INTENT(IN) :: FILE_ID
2316  INTEGER, INTENT(IN) :: RECORD, N
2317  CHARACTER(LEN=16), INTENT(IN) :: VAR_NAME
2318  DOUBLE PRECISION, INTENT(INOUT) :: RES_VALUE(n)
2319  INTEGER, INTENT(OUT) :: IERR
2320  !
2321  INTEGER(KIND=K8) :: MY_POS
2322  INTEGER :: SRF_ID, IVAR
2323  INTEGER :: I, ARRAY_SIZE, NTIMESTEP, IREC
2324  REAL(KIND=R4),ALLOCATABLE :: TMP(:)
2325  INTEGER(KIND=K4) :: TAG
2326  !
2327  CALL get_obj(hash,file_id,srf_id,ierr)
2328  IF(ierr.NE.0) THEN
2329  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2330  & 'GET_DATA_VALUE_SRF:GET_OBJ'
2331  RETURN
2332  ENDIF
2333  !
2334  ntimestep = srf_obj_tab(srf_id)%NTIMESTEP
2335  ! CHECK IF THE RECORD IS IN THE FILE
2336  IF((record.GE.ntimestep.OR.record.LT.0).AND.
2337  & ntimestep.GT.0) THEN
2338  ierr = hermes_record_unknown_err
2339  error_message = 'ERROR IN '//
2340  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2341  & 'RECORD: '//i2char(record)//' IS NOT WITHIN [0, '//
2342  & i2char(ntimestep-1)//']'
2343  RETURN
2344  ELSE
2345  irec = record
2346  ENDIF
2347  !
2348  ! GET THE POSITION OF THE VARIABLE
2349  ivar = 0
2350  DO i=1,srf_obj_tab(srf_id)%NVAR
2351  IF(srf_obj_tab(srf_id)%VAR_LIST(i)(1:16).EQ.var_name) THEN
2352  ivar = i
2353  EXIT
2354  ENDIF
2355  ENDDO
2356  ! NO VARIABLE WAS FOUND
2357  IF(ivar.EQ.0) THEN
2358  ierr = hermes_var_unknown_err
2359  error_message = 'ERROR IN '//
2360  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2361  & 'COULD NOT FIND YOUR VARIABLE: '//var_name
2362  RETURN
2363  ENDIF
2364  !
2365  ! Check the size of the array compare to the number of points
2366  IF (srf_obj_tab(srf_id)%NPOIN.LT.n) THEN
2367  ierr = hermes_wrong_size
2368  error_message = 'ERROR IN '//
2369  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2370  & 'WRONG SIZE FOR ARRAY IS: '//i2char(n)//' SHOULD BE '//
2371  & i2char(srf_obj_tab(srf_id)%NPOIN)
2372  RETURN
2373  ENDIF
2374  array_size = srf_obj_tab(srf_id)%NPOIN
2375  !
2376  ! READ THE VARIABLES RESULT FOR THE GIVEN RECORD
2377  my_pos = srf_obj_tab(srf_id)%POS_DATA + 4
2378  & + int(irec,k8)*(srf_obj_tab(srf_id)%SIZE_DATA_SET)
2379  & + 4 + srf_obj_tab(srf_id)%RS + 4 ! THE TIME VALUE
2380  & + int(ivar-1,k8) * srf_obj_tab(srf_id)%SIZE_DATA
2381  ! Quick read to position the file pointer
2382  READ(file_id,pos=my_pos-4,iostat=ierr) tag
2383  IF(srf_obj_tab(srf_id)%RS.EQ.4) THEN
2384  ALLOCATE(tmp(n),stat=ierr)
2385  IF(ierr.NE.0) THEN
2386  error_message = 'ERROR IN '//
2387  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2388  & 'ALLOCATING TMP'
2389  RETURN
2390  ENDIF
2391  READ(file_id,iostat=ierr) (tmp(i),i=1,n)
2392  res_value = dble(tmp)
2393  DEALLOCATE(tmp)
2394  ELSE
2395  READ(file_id,iostat=ierr) (res_value(i),i=1,n)
2396  ENDIF
2397  IF(ierr.NE.0) THEN
2398  error_message = 'ERROR IN '//
2399  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2400  & 'GET_DATA_VALUE_SRF:READ'
2401  RETURN
2402  ENDIF
2403  READ(file_id,iostat=ierr) tag
2404  !
2405  RETURN
2406  END SUBROUTINE
2407 !
2408 ! Writing functions
2409 !
2410 !***********************************************************************
2411  SUBROUTINE set_header_srf
2412 !***********************************************************************
2413 !
2414  &(file_id,title,nvar,var_name,ierr)
2415 !
2416 !***********************************************************************
2417 ! HERMES V7P0 01/05/2014
2418 !***********************************************************************
2419 !
2420 !brief Writes the Title and the name and units of the variables
2421 !
2422 !history Y AUDOUIN (LNHE)
2423 !+ 24/03/2014
2424 !+ V7P0
2425 !+
2426 !
2427 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2428 !| FILE_ID |-->| FILE DESCRIPTOR
2429 !| TITLE |-->| TITLE OF THE MESH
2430 !| NVAR |-->| NUMBER OF VARIABLES
2431 !| VAR_NAME |-->| NAME AND UNITS OF THE VARIABLES
2432 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2433 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2434 !
2435  !
2436  IMPLICIT NONE
2437  !
2438  INTEGER, INTENT(IN) :: FILE_ID
2439  CHARACTER(LEN=TITLE_SIZE), INTENT(IN) :: TITLE
2440  INTEGER, INTENT(IN) :: NVAR
2441  CHARACTER(LEN=VAR_SIZE), INTENT(IN) :: VAR_NAME(nvar)
2442  INTEGER, INTENT(OUT) :: IERR
2443  !
2444  INTEGER(KIND=K8) :: MY_POS
2445  INTEGER :: TAG,I,SRF_ID
2446  INTEGER(KIND=K4) :: TMP, TMP2
2447  !
2448  !
2449  CALL get_obj(hash,file_id,srf_id,ierr)
2450  IF(ierr.NE.0) THEN
2451  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2452  & 'SET_HEADER_SRF:GET_OBJ'
2453  RETURN
2454  ENDIF
2455  !
2456  ! WRITING} THE TITLE RECORD
2457  tag = title_size ! 80 CHARCATERS
2458 
2459  my_pos = srf_obj_tab(srf_id)%POS_TITLE
2460  WRITE(file_id,pos=my_pos,iostat=ierr) tag,title,tag
2461  IF(ierr.NE.0) THEN
2462  error_message = 'ERROR IN '//
2463  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2464  & 'SET_HEADER_SRF:WRITE:TITLE'
2465  RETURN
2466  ENDIF
2467  srf_obj_tab(srf_id)%POS_NVAR = srf_obj_tab(srf_id)%POS_TITLE
2468  & + 4 + title_size + 4
2469  !
2470  ! WRINTING THE NUMBER OF VARIABLE RECORD
2471  tag = 2*srf_obj_tab(srf_id)%KS ! TWO INTEGERS
2472  tmp = nvar
2473  tmp2 = 0
2474  WRITE(file_id,iostat=ierr) tag,tmp,tmp2,tag
2475  IF(ierr.NE.0) THEN
2476  error_message = 'ERROR IN '//
2477  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2478  & 'SET_HEADER_SRF:WRITE'
2479  RETURN
2480  ENDIF
2481  srf_obj_tab(srf_id)%POS_VARINFO = srf_obj_tab(srf_id)%POS_NVAR
2482  & + 4 + 2*srf_obj_tab(srf_id)%KS + 4
2483  !
2484  ! WRITING THE NAME AND UNITS FOR EACH VARIABLE
2485  ! I.E. NVAR RECORD OF VAR_SIZE CHARACTERS
2486  IF(.NOT.ALLOCATED(srf_obj_tab(srf_id)%VAR_LIST)) THEN
2487  ALLOCATE(srf_obj_tab(srf_id)%VAR_LIST(nvar),stat=ierr)
2488  IF(ierr.NE.0) THEN
2489  error_message = 'ERROR IN '//
2490  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2491  & 'ALLOCATING SET_HEADER:SRF_OBJ_TAB%VARLIST'
2492  RETURN
2493  ENDIF
2494  ! Case were user modified nvar between read and write
2495  ELSE IF(len(srf_obj_tab(srf_id)%VAR_LIST).NE.nvar) THEN
2496  DEALLOCATE(srf_obj_tab(srf_id)%VAR_LIST)
2497  ALLOCATE(srf_obj_tab(srf_id)%VAR_LIST(nvar),stat=ierr)
2498  IF(ierr.NE.0) THEN
2499  error_message = 'ERROR IN '//
2500  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2501  & 'ALLOCATING SET_HEADER:SRF_OBJ_TAB%VARLIST'
2502  RETURN
2503  ENDIF
2504  ENDIF
2505  tag = var_size
2506  DO i=1, nvar
2507  WRITE(file_id,iostat=ierr) tag,var_name(i),tag
2508  IF(ierr.NE.0) THEN
2509  error_message = 'ERROR IN '//
2510  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2511  & 'SET_HEADER_SRF:WRITE'
2512  RETURN
2513  ENDIF
2514  srf_obj_tab(srf_id)%VAR_LIST(i) = var_name(i)
2515  ENDDO
2516  ! NOW WE UPDATE THE POSITION INFORMATION IN SRF_OBJ_TAB
2517 !
2518  srf_obj_tab(srf_id)%NVAR = nvar
2519  END SUBROUTINE
2520 !***********************************************************************
2521  PURE FUNCTION compute_next
2522 !***********************************************************************
2523 !
2524  &(n,h,w) result(nx)
2525 !
2526 !***********************************************************************
2527 !brief Helper function for IGETMI. Compute the next element to move.
2528 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2529 !| N |-->| CURRENT ELEMENT
2530 !| H |-->| HEIGHT
2531 !| W |-->| WIDTH
2532 !| NX |<--| NEXT ELEMENT TO MOVE
2533 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2534  INTEGER,INTENT(IN) :: N,H,W
2535  INTEGER :: NX
2536  nx = (mod((n-1),h)*w + (n-1)/h)+1
2537  END FUNCTION
2538 !***********************************************************************
2539  SUBROUTINE igetmi
2540 !***********************************************************************
2541 !
2542  &(m, h, w)
2543 !
2544 !***********************************************************************
2545 !brief Integer GEneral Transpose Matrix In-place
2546 !
2547 ! Perform an in-place transpose of a non-square matrix of
2548 ! integers stored in a single dimension array.
2549 ! The subroutine will use h*w bits of auxilary memory but that
2550 ! will be to the detriment of the execution time.
2551 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2552 !| M |<->| MATRIX TO TRANSPOSE
2553 !| H |-->| HEIGHT
2554 !| W |-->| WIDTH
2555 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2556  IMPLICIT NONE
2557 !
2558  INTEGER, INTENT(INOUT) :: M(:)
2559  INTEGER, INTENT(IN) :: H,W
2560 !
2561  INTEGER INTEGER_SIZE,NUM_BYTES,BYTE_INDEX,BIT_INDEX
2562  INTEGER NUM_BITS, NUM_INTS
2563  INTEGER I,J,NX,START,TMP,TMP2
2564  INTEGER, ALLOCATABLE :: MOVED(:)
2565 
2566 !
2567 #if defined NAGFOR
2568  integer_size=4
2569 #else
2570  integer_size=bit_size(i)/8!SHOULD RETURN A VALUE BETWEEN
2571  !4 OR 8,MAYBE MORE LATER, BUT IT WILL
2572  !FIT INTO AN INT ANYWAY
2573 #endif
2574  num_bits=h*w
2575  num_bytes=num_bits/8
2576  num_ints=num_bytes/integer_size
2577  num_ints=num_ints+1
2578 !
2579  ALLOCATE(moved(num_ints))
2580  moved = 0
2581 !
2582  DO j=2, (h*w)-1
2583  !FIRST CHECK IF WE HAVE ALREADY MOVED THE NUMBER
2584  byte_index=j/bit_size(i) +1
2585  bit_index=mod(j,bit_size(i))
2586  IF (btest(moved(byte_index), bit_index )) cycle
2588  start=j
2589  tmp=m(start)
2590  i=compute_next(start,h,w)
2591  nx=compute_next(i,h,w)
2592  DO
2593  tmp2=m(i)
2594  m(i)=tmp
2595 !
2596  !MARK THE NUMBER AS MOVED
2597  byte_index=i/bit_size(i) +1
2598  bit_index=mod(i,bit_size(i))
2599  moved(byte_index)=ibset(moved(byte_index),bit_index)
2600 !
2601  i=nx
2602  nx=compute_next(nx,h,w)
2603  tmp=tmp2
2604  IF(i==start) EXIT
2605  END DO
2606  m(i)=tmp
2607  END DO
2608  DEALLOCATE(moved)
2609  END SUBROUTINE
2610 !***********************************************************************
2611  SUBROUTINE set_mesh_srf
2612 !***********************************************************************
2613 !
2614  &(fformat,file_id,mesh_dim,typelt,ndp,nptfr,nptir,nelem,npoin,
2615  & ikle,ipobo,knolg,x,y,nplan,date,time,x_orig,y_orig,ierr,in_place)
2616 !
2617 !***********************************************************************
2618 ! HERMES V7P0 01/05/2014
2619 !***********************************************************************
2620 !
2621 !brief Writes the mesh geometry in the file
2622 !
2623 !history Y AUDOUIN (LNHE)
2624 !+ 24/03/2014
2625 !+ V7P0
2626 !+
2627 !
2628 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2629 !| FFORMAT |-->| FORMAT OF THE FILE
2630 !| FILE_ID |-->| FILE DESCRIPTOR
2631 !| MESH_DIM |-->| DIMENSION OF THE MESH
2632 !| TYPELM |-->| TYPE OF THE MESH ELEMENTS
2633 !| NDP |-->| NUMBER OF POINTS PER ELEMENT
2634 !| NPTFR |-->| NUMBER OF BOUNDARY POINT
2635 !| NPTIR |-->| NUMBER OF INTERFACE POINT
2636 !| NELEM |-->| NUMBER OF ELEMENT IN THE MESH
2637 !| NPOIN |-->| NUMBER OF POINTS IN THE MESH
2638 !| IKLE |<->| CONNECTIVITY ARRAY FOR THE MAIN ELEMENT
2639 !| IPOBO |-->| IS A BOUNDARY POINT ? ARRAY
2640 !| KNOLG |-->| LOCAL TO GLOBAL NUMBERING ARRAY
2641 !| X |-->| X COORDINATES OF THE MESH POINTS
2642 !| Y |-->| Y COORDINATES OF THE MESH POINTS
2643 !| NPLAN |-->| NUMBER OF PLANES
2644 !| DATE |-->| DATE OF THE CREATION OF THE MESH
2645 !| TIME |-->| TIME OF THE CREATION OF THE MESH
2646 !| X_ORIG |-->| Off set of the X coordinates
2647 !| Y_ORIG |-->| Off set of the Y coordinates
2648 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2649 !| Z (OPTIONAL) |-->| Z COORDINATES OF THE MESH POINTS
2650 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2651 !
2652  !
2653  IMPLICIT NONE
2654  !
2655  CHARACTER(LEN=8) , INTENT(IN) :: FFORMAT
2656  INTEGER , INTENT(IN) :: FILE_ID,NPLAN
2657  INTEGER, DIMENSION(3), INTENT(IN) :: DATE
2658  INTEGER, DIMENSION(3), INTENT(IN) :: TIME
2659  INTEGER, INTENT(IN) :: MESH_DIM
2660  INTEGER, INTENT(IN) :: TYPELT
2661  INTEGER, INTENT(IN) :: NDP
2662  INTEGER, INTENT(IN) :: NPTFR
2663  INTEGER, INTENT(IN) :: NPTIR
2664  INTEGER, INTENT(IN) :: NELEM
2665  INTEGER, INTENT(IN) :: NPOIN
2666  INTEGER, INTENT(INOUT) :: IKLE(ndp*nelem)
2667  INTEGER, INTENT(IN) :: IPOBO(*)
2668  INTEGER, INTENT(IN) :: KNOLG(*)
2669  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin)
2670  INTEGER, INTENT(IN) :: X_ORIG,Y_ORIG
2671  INTEGER, INTENT(OUT) :: IERR
2672  LOGICAL, OPTIONAL, INTENT(IN) :: IN_PLACE
2673  !
2674  INTEGER(KIND=K8) :: MY_POS
2675  INTEGER :: I,SRF_ID,IKLES_SIZE,IELEM,IPLAN
2676  INTEGER :: NELEM2
2677  INTEGER :: IELEMP,IELEMT,NPOIN2,IELEM2
2678  !
2679  INTEGER(KIND=K4) :: TMP(10), TAG
2680  INTEGER(KIND=K4), ALLOCATABLE :: IKLES(:)
2681  LOGICAL :: TRANSPOSE_IN_PLACE
2682  !
2683  IF(PRESENT(in_place)) THEN
2684  transpose_in_place=in_place
2685  ELSE
2686  transpose_in_place=.false.
2687  END IF
2688  !
2689  CALL get_obj(hash,file_id,srf_id,ierr)
2690  IF(ierr.NE.0) THEN
2691  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2692  & 'GET_MESH_SRF:GET_OBJ'
2693  RETURN
2694  ENDIF
2695  !
2696  ! DEFINES THE SIZE OF REAL IN THE FILE
2697  IF(fformat.EQ.'SERAFIND') THEN
2698  srf_obj_tab(srf_id)%RS = 8
2699  ELSE
2700  srf_obj_tab(srf_id)%RS = 4
2701  ENDIF
2702  ! ASSOCIATE THE ELEMENT TYPE WITH THE NUMBER OF POINT PER ELEMENTS
2703  srf_obj_tab(srf_id)%TYP_ELT = (typelt/10)*10
2704  srf_obj_tab(srf_id)%TYP_BND_ELT = 0
2705  SELECT CASE (srf_obj_tab(srf_id)%TYP_ELT)
2706  CASE (triangle_elt_type) ! TRIANGLES
2707  srf_obj_tab(srf_id)%NDP = 3
2708  CASE (quadrangle_elt_type) ! QUADRANGLES
2709  srf_obj_tab(srf_id)%NDP = 4
2710  CASE (prism_elt_type) ! PRISMS
2711  srf_obj_tab(srf_id)%NDP = 6
2712  CASE (split_prism_elt_type) ! PRISMS SPLIT IN TETRAS
2713  srf_obj_tab(srf_id)%NDP = 6
2714  CASE DEFAULT
2715  ierr = unknown_elt_type_err
2716  error_message = 'ERROR IN '//
2717  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2718  & 'UNKNOWN ELEMENT TYPE: '//
2719  & i2char(srf_obj_tab(srf_id)%TYP_ELT)
2720  RETURN
2721  END SELECT
2722  !
2723  ! BUILDING THE 10 INTEGERS ARRAY
2724  !
2725  IF(nplan.LE.1) THEN
2726  srf_obj_tab(srf_id)%NPLAN = 0
2727  ELSE
2728  srf_obj_tab(srf_id)%NPLAN = nplan
2729  ENDIF
2730  srf_obj_tab(srf_id)%NPTIR = nptir
2731  srf_obj_tab(srf_id)%NPTFR = nptfr
2732  srf_obj_tab(srf_id)%NDIM = mesh_dim
2733  tmp(1) = 1
2734  tmp(2) = 0
2735  tmp(3) = x_orig
2736  tmp(4) = y_orig
2737  tmp(5) = 0
2738  tmp(6) = 0
2739  tmp(7) = srf_obj_tab(srf_id)%NPLAN
2740  tmp(8) = nptfr
2741  tmp(9) = nptir
2742  tmp(10) = 0
2743  IF((date(1)+date(2)+date(3)+time(1)+time(2)+time(3)).NE.0) THEN
2744  tmp(10) = 1
2745  ENDIF
2746  ! WRITING THE RECORD WITH THE TAG
2747  srf_obj_tab(srf_id)%POS_IB = srf_obj_tab(srf_id)%POS_VARINFO
2748  & + srf_obj_tab(srf_id)%NVAR*(4 + var_size + 4)
2749  my_pos = srf_obj_tab(srf_id)%POS_IB
2750  ! Set position for writing
2751  READ(file_id,pos=my_pos-4) tag
2752  tag = 10*srf_obj_tab(srf_id)%KS
2753  WRITE(file_id,iostat=ierr) tag,tmp,tag
2754  IF(ierr.NE.0) THEN
2755  error_message = 'ERROR IN '//
2756  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2757  & 'SET_MESH_SRF:WRITE:10 INTEGERS'
2758  RETURN
2759  ENDIF
2760 
2761  ! WRITING THE DATE RECORD
2762  IF(tmp(10).NE.0) THEN
2763  srf_obj_tab(srf_id)%POS_DATE =
2764  & srf_obj_tab(srf_id)%POS_IB
2765  & + 4 + 10*srf_obj_tab(srf_id)%KS + 4
2766  tag = 6*srf_obj_tab(srf_id)%KS
2767  WRITE(file_id,iostat=ierr) tag,date,time,tag
2768  IF(ierr.NE.0) THEN
2769  error_message = 'ERROR IN '//
2770  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2771  & 'SET_MESH_SRF:WRITE:DATE'
2772  RETURN
2773  ENDIF
2774  srf_obj_tab(srf_id)%POS_NUM = srf_obj_tab(srf_id)%POS_DATE
2775  & + 4 + 6*srf_obj_tab(srf_id)%KS + 4
2776  ELSE
2777  srf_obj_tab(srf_id)%POS_DATE = 0
2778  srf_obj_tab(srf_id)%POS_NUM = srf_obj_tab(srf_id)%POS_IB
2779  & + 4 + 10*srf_obj_tab(srf_id)%KS + 4
2780  ENDIF
2781  !
2782  ! BUILDING THE 4 INTEGER RECORD
2783  !
2784  IF(typelt.EQ.50) THEN
2785  srf_obj_tab(srf_id)%NELEM = nelem/3
2786  ELSE
2787  srf_obj_tab(srf_id)%NELEM = nelem
2788  ENDIF
2789  srf_obj_tab(srf_id)%NPOIN = npoin
2790  tmp(1) = srf_obj_tab(srf_id)%NELEM
2791  tmp(2) = srf_obj_tab(srf_id)%NPOIN
2792  tmp(3) = srf_obj_tab(srf_id)%NDP
2793  tmp(4) = 1
2794  tag = 4*srf_obj_tab(srf_id)%KS
2795  WRITE(file_id,iostat=ierr) tag,tmp(1:4),tag
2796  IF(ierr.NE.0) THEN
2797  error_message = 'ERROR IN '//
2798  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2799  & 'SET_MESH_SRF:WRITE:4 INTEGERS'
2800  RETURN
2801  ENDIF
2802  srf_obj_tab(srf_id)%POS_IKLE = srf_obj_tab(srf_id)%POS_NUM
2803  & + (4 + 4*srf_obj_tab(srf_id)%KS + 4)
2804  !
2805  ! Writing ikle
2806  !
2807  ! Converting ikle-> ikles
2808  ! Building ikles
2809  IF(typelt.NE.50) THEN
2810  ikles_size = nelem*srf_obj_tab(srf_id)%NDP
2811  ELSE
2812 ! tetrahedrons regrouped into prisms
2813 ! nelem*2=(nelem/3)*6
2814  ikles_size = nelem*2
2815  ENDIF
2816  IF(.NOT. transpose_in_place) THEN
2817  ALLOCATE(ikles(ikles_size),stat=ierr)
2818  IF(ierr.NE.0) THEN
2819  error_message = 'ERROR IN '//
2820  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2821  & 'SET_MESH_SRF:IKLES'
2822  RETURN
2823  ENDIF
2824  END IF
2825 ! inversion of ikle in ikles
2826  IF(typelt.NE.50) THEN
2827  IF(.NOT. transpose_in_place) THEN
2828  DO i = 1,srf_obj_tab(srf_id)%NDP
2829  DO ielem = 1,nelem
2830  ikles((ielem-1)*srf_obj_tab(srf_id)%NDP+i) =
2831  & ikle((i-1)*nelem+ielem)
2832  ENDDO
2833  ENDDO
2834  ELSE
2835  CALL igetmi(ikle,nelem,ndp)
2836  END IF
2837  ELSE
2838 ! tetrahedrons regrouped into prisms
2839 ! the first tetrahedrons in a layer have the first 3 points like the bottom of the prism
2840 ! ikle is ikle(NELEM,4)
2841 ! ikles is ikles(6,nelem/3)
2842  nelem2=nelem/3/(nplan-1)
2843  npoin2=npoin/nplan
2844 ! loop on layers
2845  DO iplan=1,nplan-1
2846  DO ielem2=1,nelem2
2847 ! prism number
2848  ielemp=(iplan-1)*nelem2+ielem2
2849 ! tetrahedron number (the first of the 3 in the prism ielemp)
2850  ielemt=(iplan-1)*nelem2*3+ielem2
2851 ! ikles of the prism
2852  ikles((ielemp-1)*6+1) = ikle(ielemt)
2853  ikles((ielemp-1)*6+2) = ikle(nelem+ielemt)
2854  ikles((ielemp-1)*6+3) = ikle(2*nelem+ielemt)
2855  ikles((ielemp-1)*6+4) = ikle(ielemt)+npoin2
2856  ikles((ielemp-1)*6+5) = ikle(nelem+ielemt)+npoin2
2857  ikles((ielemp-1)*6+6) = ikle(2*nelem+ielemt)+npoin2
2858  ENDDO
2859  ENDDO
2860  ENDIF
2861  !
2862  tag = ikles_size*srf_obj_tab(srf_id)%KS
2863  IF(.NOT. transpose_in_place) THEN
2864  WRITE(file_id,iostat=ierr)tag,ikles(1:ikles_size),tag
2865  ELSE
2866  WRITE(file_id,iostat=ierr)tag,ikle(1:ikles_size),tag
2867  END IF
2868  IF(ierr.NE.0) THEN
2869  error_message = 'ERROR IN '//
2870  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2871  & 'SET_MESH_SRF:WRITE:IKLES'
2872  RETURN
2873  ENDIF
2874  srf_obj_tab(srf_id)%POS_IPOBO = srf_obj_tab(srf_id)%POS_IKLE
2875  & + (4 +
2876  & srf_obj_tab(srf_id)%NELEM*srf_obj_tab(srf_id)%NDP
2877  & * srf_obj_tab(srf_id)%KS
2878  & + 4)
2879  IF(.NOT. transpose_in_place) DEALLOCATE(ikles)
2880  !
2881  ! Write ipobo or knolg depending if serial or parallel
2882  !
2883  ! We are in serial if both nptfr and nptir are equal to 0
2884  tag = npoin*srf_obj_tab(srf_id)%KS
2885  IF(nptir.EQ.0) THEN
2886  WRITE(file_id,iostat=ierr) tag,ipobo(1:npoin),tag
2887  ELSE
2888  WRITE(file_id,iostat=ierr) tag,knolg(1:npoin),tag
2889  ENDIF
2890  IF(ierr.NE.0) THEN
2891  error_message = 'ERROR IN '//
2892  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2893  & 'SET_MESH_SRF:WRITE:IPOBO/KNOLG'
2894  RETURN
2895  ENDIF
2896  srf_obj_tab(srf_id)%POS_COORD = srf_obj_tab(srf_id)%POS_IPOBO
2897  & + (4 + srf_obj_tab(srf_id)%NPOIN*srf_obj_tab(srf_id)%KS + 4)
2898  !
2899  ! Writing coordinates
2900  !
2901  tag = srf_obj_tab(srf_id)%RS*npoin
2902  ! convert in real if file in single precision
2903  IF(srf_obj_tab(srf_id)%RS.EQ.4) THEN
2904  ! X COORDINATES
2905  WRITE(file_id,iostat=ierr) tag,(REAL(X(I)),I=1,npoin),tag
2906  IF(ierr.NE.0) THEN
2907  error_message = 'ERROR IN '//
2908  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2909  & 'SET_MESH_SRF:WRITE:X'
2910  RETURN
2911  ENDIF
2912  ! Y COORDINATES
2913  WRITE(file_id,iostat=ierr) tag,(REAL(Y(I)),I=1,npoin),tag
2914  IF(ierr.NE.0) THEN
2915  error_message = 'ERROR IN '//
2916  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2917  & 'SET_MESH_SRF:WRITE:Y'
2918  RETURN
2919  ENDIF
2920  ELSE
2921  ! X Y COORDINATES
2922  WRITE(file_id,iostat=ierr) tag,(x(i),i=1,npoin),tag
2923  IF(ierr.NE.0) THEN
2924  error_message = 'ERROR IN '//
2925  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2926  & 'SET_MESH_SRF:WRITE:X'
2927  RETURN
2928  ENDIF
2929  WRITE(file_id,iostat=ierr) tag,(y(i),i=1,npoin),tag
2930  IF(ierr.NE.0) THEN
2931  error_message = 'ERROR IN '//
2932  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
2933  & 'SET_MESH_SRF:WRITE:Y'
2934  RETURN
2935  ENDIF
2936  ENDIF
2937  srf_obj_tab(srf_id)%POS_DATA = srf_obj_tab(srf_id)%POS_COORD
2938  & + (4 + srf_obj_tab(srf_id)%NPOIN*srf_obj_tab(srf_id)%RS + 4)
2939  & *2
2940  srf_obj_tab(srf_id)%SIZE_DATA =
2941  & 4 + srf_obj_tab(srf_id)%NPOIN*srf_obj_tab(srf_id)%RS + 4
2942  srf_obj_tab(srf_id)%SIZE_DATA_SET =
2943  & 4 + srf_obj_tab(srf_id)%RS + 4
2944  & + srf_obj_tab(srf_id)%NVAR*srf_obj_tab(srf_id)%SIZE_DATA
2945 
2946  END SUBROUTINE
2947 !***********************************************************************
2948  SUBROUTINE add_data_srf
2949 !***********************************************************************
2950 !
2951  &(file_id,var_name,time,record,first_var,var_value,n,ierr)
2952 !
2953 !***********************************************************************
2954 ! HERMES V7P0 01/05/2014
2955 !***********************************************************************
2956 !
2957 !brief Add data information for a given variable and a given time on
2958 !+ all points of the mesh
2959 !
2960 !history Y AUDOUIN (LNHE)
2961 !+ 24/03/2014
2962 !+ V7P0
2963 !+
2964 !
2965 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2966 !| FILE_ID |-->| FILE DESCRIPTOR
2967 !| VAR_NAME |-->| NAME OF THE VARIABLE
2968 !| TIME |-->| TIME OF THE DATA
2969 !| RECORD |-->| TIME STEP OF THE DATA
2970 !| FIRST_VAR |-->| TRUE IF IT IS THE FIRST VARIABLE OF THE DATASET
2971 !| VAR_VALUE |-->| THE VALUE FOR EACH POINT OF THE MESH
2972 !| N |-->| SIZE OF VAR_VALUE
2973 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
2974 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2975 !
2976  !
2977  IMPLICIT NONE
2978  !
2979  INTEGER, INTENT(IN) :: FILE_ID,N
2980  CHARACTER(LEN=VAR_SIZE), INTENT(IN) :: VAR_NAME
2981  DOUBLE PRECISION, INTENT(IN) :: TIME
2982  INTEGER, INTENT(IN) :: RECORD
2983  LOGICAL, INTENT(IN) :: FIRST_VAR
2984  DOUBLE PRECISION, INTENT(IN) :: VAR_VALUE(n)
2985  INTEGER, INTENT(OUT) :: IERR
2986  !
2987  INTEGER(KIND=K8) :: MY_POS
2988  INTEGER :: SRF_ID,I,IVAR, IREC
2989  INTEGER(KIND=K4) :: TAG
2990  !
2991  CALL get_obj(hash,file_id,srf_id,ierr)
2992  IF(ierr.NE.0) THEN
2993  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2994  & 'ADD_DATA_SRF:GET_OBJ'
2995  RETURN
2996  ENDIF
2997  !
2998  ! Get the position of the variable
2999  ivar = 0
3000  DO i=1,srf_obj_tab(srf_id)%NVAR
3001  IF(srf_obj_tab(srf_id)%VAR_LIST(i)(1:16).EQ.var_name(1:16))
3002  & THEN
3003  ivar = i
3004  EXIT
3005  ENDIF
3006  ENDDO
3007  IF(ivar.EQ.0) THEN
3008  ierr = hermes_var_unknown_err
3009  error_message = 'ERROR IN '//
3010  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
3011  & 'COULD NOT FIND YOUR VARIABLE: '//var_name
3012  RETURN
3013  ENDIF
3014  irec = record
3015  IF(irec.LT.0) THEN
3016  ierr = hermes_record_unknown_err
3017  error_message = 'ERROR IN '//
3018  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
3019  & 'RECORD: '//i2char(record)//' IS LOWER THAN 0'
3020  RETURN
3021  ENDIF
3022  ! Write time of the dataset if it is the first variable
3023  IF(first_var) THEN
3024  my_pos = srf_obj_tab(srf_id)%POS_DATA
3025  & + int(irec,k8)*(srf_obj_tab(srf_id)%SIZE_DATA_SET)
3026  READ(file_id,pos=my_pos-4,iostat=ierr) tag
3027  tag = srf_obj_tab(srf_id)%RS
3028  IF(srf_obj_tab(srf_id)%RS.EQ.4) THEN
3029  WRITE(file_id,iostat=ierr) tag,REAL(TIME),TAG
3030  ELSE
3031  WRITE(file_id,iostat=ierr) tag,time,tag
3032  ENDIF
3033  IF(ierr.NE.0) THEN
3034  error_message = 'ERROR IN '//
3035  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
3036  & 'ADD_DATA_SRF:WRITE:TIME'
3037  RETURN
3038  ENDIF
3039  ! We only increase the number of timesteps if we add a new done
3040  ! i.e. irec is greater than ntimesteps
3041  IF(irec.EQ.srf_obj_tab(srf_id)%NTIMESTEP) THEN
3042  srf_obj_tab(srf_id)%NTIMESTEP =
3043  & srf_obj_tab(srf_id)%NTIMESTEP + 1
3044  ENDIF
3045  ELSE
3046  my_pos = srf_obj_tab(srf_id)%POS_DATA
3047  & + int(irec,k8)*(srf_obj_tab(srf_id)%SIZE_DATA_SET)
3048  & + 4 + srf_obj_tab(srf_id)%RS + 4 ! THE TIME VALUE
3049  & + int(ivar-1,k8) * srf_obj_tab(srf_id)%SIZE_DATA
3050  ! Using a read to go to position in file
3051  READ(file_id,pos=my_pos-4,iostat=ierr) tag
3052 
3053  ENDIF
3054  ! If the file is in single precision we convert the data
3055 
3056  IF(srf_obj_tab(srf_id)%RS.EQ.4) THEN
3057  tag = srf_obj_tab(srf_id)%RS*n
3058  WRITE(file_id,iostat=ierr) tag,(REAL(VAR_VALUE(I)),I=1,n),tag
3059  IF(ierr.NE.0) THEN
3060  error_message = 'ERROR IN '//
3061  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
3062  & 'ADD_DATA_SRF:WRITE:VALUE'
3063  RETURN
3064  ENDIF
3065  ELSE
3066  ! write time of the dataset if it is the first variable
3067  ! write the data for that variable
3068  tag = srf_obj_tab(srf_id)%RS*n
3069  WRITE(file_id,iostat=ierr) tag,(var_value(i),i=1,n),tag
3070  IF(ierr.NE.0) THEN
3071  error_message = 'ERROR IN '//
3072  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
3073  & 'ADD_DATA_SRF:WRITE'
3074  RETURN
3075  ENDIF
3076  ENDIF
3077  !
3078  END SUBROUTINE
3079 !
3080 !***********************************************************************
3081  SUBROUTINE set_bnd_srf
3082 !***********************************************************************
3083 !
3084  &(file_id,type_bnd_elt,nelebd,ndp,ikle,
3085  & lihbor,liubor,
3086  & livbor,hbor,ubor,vbor,chbord,
3087  & litbor,tbor,atbor,btbor,color,ierr)
3088 !
3089 !***********************************************************************
3090 ! HERMES V7P0 01/05/2014
3091 !***********************************************************************
3092 !
3093 !brief Writes the boundary information into the mesh file
3094 !
3095 !history Y AUDOUIN (LNHE)
3096 !+ 24/03/2014
3097 !+ V7P0
3098 !+
3099 !
3100 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3101 !| FILE_ID |-->| FILE DESCRIPTOR
3102 !| TYPE_BND_ELT |-->| TYPE OF THE BOUNDARY ELEMENTS
3103 !| NELEBD |-->| NUMBER OF BOUNDARY ELEMENTS
3104 !| NDP |-->| NUMBER OF POINTS PER BOUNDARY ELEMENT
3105 !| IKLE |-->| CONNECTIVITY ARRAY FOR THE BOUNDARY ELEMENTS
3106 !| LIHBOR |-->| TYPE OF BOUNDARY CONDITIONS ON DEPTH
3107 !| LIUBOR |-->| TYPE OF BOUNDARY CONDITIONS ON U
3108 !| LIVBOR |-->| TYPE OF BOUNDARY CONDITIONS ON V
3109 !| HBOR |<--| PRESCRIBED BOUNDARY CONDITION ON DEPTH
3110 !| UBOR |<--| PRESCRIBED BOUNDARY CONDITION ON VELOCITY U
3111 !| VBOR |<--| PRESCRIBED BOUNDARY CONDITION ON VELOCITY V
3112 !| CHBORD |<--| FRICTION COEFFICIENT AT BOUNDARY
3113 !| LITBOR |-->| PHYSICAL BOUNDARY CONDITIONS FOR TRACERS
3114 !| TBOR |<--| PRESCRIBED BOUNDARY CONDITION ON TRACER
3115 !| ATBOR,BTBOR |<--| THERMAL EXCHANGE COEFFICIENTS.
3116 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
3117 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3118 !
3119  !
3120  IMPLICIT NONE
3121  !
3122  INTEGER, INTENT(IN) :: FILE_ID
3123  INTEGER, INTENT(IN) :: TYPE_BND_ELT
3124  INTEGER, INTENT(IN) :: NELEBD
3125  INTEGER, INTENT(IN) :: NDP
3126  INTEGER, INTENT(IN) :: IKLE(nelebd*ndp)
3127  INTEGER, INTENT(IN) :: LIUBOR(nelebd),LIVBOR(nelebd)
3128  INTEGER, INTENT(IN) :: LIHBOR(nelebd),LITBOR(nelebd)
3129  DOUBLE PRECISION, INTENT(IN) :: UBOR(nelebd),VBOR(nelebd)
3130  DOUBLE PRECISION, INTENT(IN) :: HBOR(nelebd),CHBORD(nelebd)
3131  DOUBLE PRECISION, INTENT(IN) :: TBOR(nelebd),ATBOR(nelebd)
3132  DOUBLE PRECISION, INTENT(IN) :: BTBOR(nelebd)
3133  INTEGER, INTENT(IN) :: COLOR(nelebd)
3134  INTEGER, INTENT(OUT) :: IERR
3135  !
3136  INTEGER :: SRF_ID, I, NCLI
3137  !
3138  CALL get_obj(hash,file_id,srf_id,ierr)
3139  IF(ierr.NE.0) THEN
3140  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
3141  & 'SET_BND_SRF:GET_OBJ'
3142  RETURN
3143  ENDIF
3144  !
3145  ncli = srf_obj_tab(srf_id)%NCLI
3146  srf_obj_tab(srf_id)%TYP_BND_ELT = type_bnd_elt
3147  rewind(ncli)
3148  !If the file is a concatenation, we need to move to the
3149  !begining of our part
3150  IF(partel_concat)THEN
3151  DO i=1,srf_obj_tab(srf_id)%CLI_LINE_BEGIN-1
3152  READ(srf_obj_tab(srf_id)%NCLI,*)
3153  ENDDO
3154  ENDIF
3155  DO i=1,nelebd
3156  ! Write connectivity and bnoundary value the rest is set to 0.D0
3157  WRITE(ncli,4000,iostat=ierr) lihbor(i),liubor(i),livbor(i),
3158  & hbor(i),ubor(i),vbor(i),
3159  & chbord(i),litbor(i),
3160  & tbor(i),atbor(i),btbor(i),
3161  & ikle(i),color(i)
3162  4000 FORMAT (1x,i2,1x,2(i1,1x),3(f24.12,1x),1x,
3163  & f24.12,3x,i1,1x,3(f24.12,1x),1i9,1x,1i9,
3164  & 1x,i10,1x,2(f27.15,1x),i8)
3165  IF(ierr.NE.0) THEN
3166  error_message = 'ERROR IN '//
3167  & trim(srf_obj_tab(srf_id)%FILE_NAME)//': '//
3168  & 'SET_BND_SRF:WRITE:NCLI'
3169  RETURN
3170  ENDIF
3171  srf_obj_tab(srf_id)%NPTFR=nelebd
3172  ENDDO
3173 
3174  END SUBROUTINE
3175 !
3176 !***********************************************************************
3177  FUNCTION isopened
3178 !***********************************************************************
3179  &(file_id)
3180 !
3181 !***********************************************************************
3182 ! HERMES V8P1 15/11/2019
3183 !***********************************************************************
3184 !
3185 !brief Check is a file descriptor is opened.
3186 ! Return False if the file descriptor happened to be stdin,
3187 ! stdout or stderr
3188 !
3189 !history Judicael Grasset (STFC-DL)
3190 !+ 15/11/2019
3191 !+ V8P1
3192 !+
3193 !
3194 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3195 !| FILE_ID |-->| FILE DESCRIPTOR
3196 !| ISOPENED |<--| RETURN VALUE
3197 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3198 !
3199  USE iso_fortran_env, ONLY : input_unit,output_unit,error_unit
3200  INTEGER, INTENT(IN) :: FILE_ID
3201  LOGICAL :: ISOPENED
3202  IF(file_id==input_unit.OR.file_id==output_unit
3203  & .OR.file_id==error_unit)THEN
3204  isopened=.false.
3205  ELSE
3206  INQUIRE(unit=file_id,opened=isopened)
3207  ENDIF
3208  END FUNCTION isopened
3209 !
3210  END MODULE utils_serafin
subroutine get_bnd_npoin_srf(FILE_ID, TYPE_BND_ELEM, NPTFR, IERR)
subroutine close_mesh_srf(FILE_ID, IERR, MESH_NUMBER)
integer, parameter prism_elt_type
subroutine get_bnd_connectivity_srf(FILE_ID, TYP_BND_ELT, NELEBD, NDP, IKLE, IERR)
subroutine set_header_srf(FILE_ID, TITLE, NVAR, VAR_NAME, IERR)
subroutine identify_typ_elt(NDP, NDIM, TYP_ELT)
Definition: utils_serafin.F:95
subroutine get_mesh_nplan_srf(FILE_ID, NPLAN, IERR)
subroutine get_bnd_numbering_srf(FILE_ID, TYP_ELEM_BND, NPTFR, NBOR, IERR)
subroutine get_bnd_color_srf(FILE_ID, TYP_BND_ELT, NELEBD, COLOR, IERR)
subroutine get_bnd_value_srf(FILE_ID, TYP_BND_ELEM, NPTFR, LIHBOR, LIUBOR, LIVBOR, HBOR, UBOR, VBOR, CHBORD, TRAC, LITBOR, TBOR, ATBOR, BTBOR, IERR)
YOANN AUDOUIN 10/05/2018 Initial version
integer, parameter title_size
Definition: utils_serafin.F:36
subroutine get_mesh_dimension_srf(FILE_ID, NDIM, IERR)
integer, dimension(max_file) hash
Definition: utils_serafin.F:84
integer, parameter var_size
Definition: utils_serafin.F:35
integer, parameter triangle_elt_type
subroutine get_mesh_nelem_srf(FILE_ID, TYP_ELT, NELEM, IERR)
character(len=200) error_message
subroutine set_mesh_srf(FFORMAT, FILE_ID, MESH_DIM, TYPELT, NDP, NPTFR, NPTIR, NELEM, NPOIN, IKLE, IPOBO, KNOLG, X, Y, NPLAN, DATE, TIME, X_ORIG, Y_ORIG, IERR, IN_PLACE)
logical function isopened(FILE_ID)
subroutine get_mesh_nptir_srf(FILE_ID, NPTIR, IERR)
subroutine get_data_nvar_srf(FILE_ID, NVAR, IERR)
subroutine open_bnd_srf(FILE_NAME, FILE_ID, OPENMODE, IERR, MESH_NUMBER)
integer, parameter hermes_invalid_serafin_file
subroutine identify_endian_type(FILE_NAME, ENDIAN, FILE_ID, IERR)
subroutine get_mesh_coord_srf(FILE_ID, JDIM, NPOIN, COORD, IERR)
subroutine get_mesh_date_srf(FILE_ID, DATE, IERR)
subroutine get_data_var_list_srf(FILE_ID, NVAR, VAR_LIST, UNIT_LIST, IERR)
subroutine get_mesh_npoin_srf(FILE_ID, NPOIN, IERR)
subroutine igetmi(M, H, W)
integer, parameter max_file
Definition: hash_table.f:7
subroutine add_data_srf(FILE_ID, VAR_NAME, TIME, RECORD, FIRST_VAR, VAR_VALUE, N, IERR)
subroutine get_mesh_l2g_numbering_srf(FILE_ID, KNOLG, NPOIN, IERR)
subroutine get_mesh_orig_srf(FILE_ID, X_ORIG, Y_ORIG, IERR)
subroutine get_mesh_connectivity_srf(FILE_ID, TYP_ELT, IKLE, NELEM, NDP, IERR)
subroutine close_bnd_srf(FILE_ID, IERR, MESH_NUMBER)
character(len=13) endian
subroutine get_data_ntimestep_srf(FILE_ID, NTIMESTEP, IERR)
integer, parameter tetrahedron_elt_type
integer, parameter quadrangle_elt_type
subroutine get_mesh_title_srf(FILE_ID, TITLE, IERR)
subroutine get_data_time_srf(FILE_ID, RECORD, TIME, IERR)
subroutine get_data_value_srf(FILE_ID, RECORD, VAR_NAME, RES_VALUE, N, IERR)
subroutine open_index(FILENAME, FILE_ID)
subroutine open_mesh_srf(FILE_NAME, FILE_ID, OPENMODE, FFORMAT, IERR, MESH_NUMBER)
subroutine get_bnd_ipobo_srf(FILE_ID, NPOIN, IPOBO, IERR)
subroutine get_bnd_nelem_srf(FILE_ID, TYPE_BND_ELEM, NELEM, IERR)
subroutine get_mesh_npoin_per_element_srf(FILE_ID, TYP_ELT, NDP, IERR)
type(srf_info), dimension(max_file) srf_obj_tab
Definition: utils_serafin.F:85
pure integer function compute_next(N, H, W)
subroutine set_bnd_srf(FILE_ID, TYPE_BND_ELT, NELEBD, NDP, IKLE, LIHBOR, LIUBOR, LIVBOR, HBOR, UBOR, VBOR, CHBORD, LITBOR, TBOR, ATBOR, BTBOR, COLOR, IERR)