The TELEMAC-MASCARET system  trunk
utils_med.F
Go to the documentation of this file.
1 ! ****************
2  MODULE utils_med
3 ! ****************
4 !
5 !***********************************************************************
6 ! HERMES V7P0 2015
7 !***********************************************************************
8 !
9 !brief INTERFACES OF MED PUBLIC SUBROUTINES
10 !
11 !warning NOTE THAT THIS INTERFACE IS FOR THE LIBRARY INCLUDED IN MED
12 !+ V3.0.4 CHANGES MIGHT BE REQUIRED WITH FUTURE VERSIONS OF MED.
13 !
14 !history YOANN AUDOUIN
15 !+ 25/05/2015
16 !+ V7P0
17 !+ ADAPTING CODE TO MED V3.0.4
18 !
19 !history VINCENT STOBIAC
20 !+ 23/05/2014
21 !+ V6P3
22 !+ ADDING GENERAL MED SUBROUTINES
23 !
24 !history J. GRASSET (Daresbury Lab & EDF)
25 !+ 01/05/2018
26 !+ Add code for managing concatenated mesh
27 !
28 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
29 !
31  USE hash_table
32 !
33  IMPLICIT NONE
34 #if defined (HAVE_MED)
35  include 'med.hf'
36 #endif
37  INTEGER, PARAMETER :: kid=k8
38 !
39 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
40 ! NEW OBJECT RELATED TO MESHES IN A MED FILE
41  TYPE med_info
42  INTEGER(KIND=KID) :: id
43  CHARACTER(LEN=250) :: file_name
44  INTEGER :: ncli
45  INTEGER, ALLOCATABLE :: nbor(:)
46  ! Numbering for boundary segment
47  INTEGER, ALLOCATABLE :: nbor_seg(:)
48  ! For each boundary point gives segments containing it
49  INTEGER, ALLOCATABLE :: pt2seg(:,:)
50  ! Contains for each boundary element type if it is indeed a boundary
51  LOGICAL, ALLOCATABLE :: is_bnd(:)
52  LOGICAL :: no_bnd
53  ! Number of boundary groups
54  INTEGER :: nbnd_grp, nbnd_used_grp
55  ! Contains for each boundary group its values for h u v tracer
56  INTEGER, ALLOCATABLE :: bnd_grp_val(:,:)
57  ! Contains for each family its number and the index of the boundary group associated
58  ! 0 if it is not a boundary family
59  INTEGER, ALLOCATABLE :: bnd_fam(:,:)
60 #if defined HAVE_MED
61  CHARACTER(LEN=MED_NAME_SIZE) :: mesh_name
62  ! Contains for boundary group its name
63  CHARACTER(LEN=MED_LNAME_SIZE), ALLOCATABLE :: bnd_grp_name(:)
64 #endif
65  !NUMBER OF OUR PART OF THE MESH, USED IN THE MED FUNCTION TO
66  !ACCESS THE RIGHT MESH IN THE FILE
67  INTEGER :: mesh_number
68  CHARACTER(LEN=50) :: mesh_number_str
69  !CLI INDEX FILE
70  INTEGER :: cli_idx_id
71  INTEGER :: cli_line_begin
72  END TYPE med_info
73 !
74 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75 !
76 !
77 ! HASH TABLE FOR FILES
78  INTEGER :: hash(max_file) = 0
79 !
80  TYPE(med_info) :: med_obj_tab(max_file)
81  ! Value of lihbor for a solid boundary
82  INTEGER, PARAMETER :: sol_bnd = 2
83  ! OFFSET for families on points when in parallel
84  INTEGER,PARAMETER :: offset = 1000
85 !
86 !-----------------------------------------------------------------------
87 !
88  CONTAINS
89 !
90 !-----------------------------------------------------------------------
91 !
92  SUBROUTINE open_mesh_med(FILE_NAME,FILE_ID,OPEN_MODE,IERR,
93  & MESH_NUMBER)
94 !
95 !BRIEF OPENS A MESH FILE
96 !
97 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
98 !| FILE_NAME |<--| NAME OF THE MED FILE
99 !| FILE_ID |<--| MED FILE DESCRIPTOR
100 !| OPEN_MODE |<--| OPENING MODE (READ/READWRITE/WRITE)
101 !| IERR |-->| ERROR TAG
102 !| MESH_NUMBER |-->| IF PRESENT, THIS IS THE NUMBER OF THE PART OF
103 ! THE CONCATENATED FILE WE WANT TO ACCESS
104 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
105 !
106  IMPLICIT NONE
107 !
108  CHARACTER(LEN=*), INTENT(IN) :: FILE_NAME
109  INTEGER, INTENT(OUT) :: FILE_ID
110  CHARACTER(LEN=9), INTENT(IN) :: OPEN_MODE
111  INTEGER, INTENT(OUT) :: IERR
112  INTEGER, OPTIONAL, INTENT(IN) :: MESH_NUMBER
113 !
114 #if defined (HAVE_MED)
115  LOGICAL :: HDFOK, MEDOK ! CHECK COMPATIBILITY
116  INTEGER :: MED_MODE ! MED OPENING MODE
117  INTEGER :: MAJOR, MINOR, REL ! MED VERSION OF THE FILE
118  INTEGER :: MED_ID
119  INTEGER(KIND=KID) :: FID
120  CHARACTER(LEN=200) :: CFILE_NAME
121  CHARACTER(LEN=MED_NAME_SIZE) :: TITLE_MED
122  CHARACTER(LEN=MED_SNAME_SIZE) :: DT_UNIT
123  CHARACTER(LEN=MED_SNAME_SIZE),ALLOCATABLE :: COOR_NAME(:)
124  CHARACTER(LEN=MED_SNAME_SIZE),ALLOCATABLE :: COOR_UNIT(:)
125  CHARACTER(LEN=MED_COMMENT_SIZE) :: COMMENT
126 !
127  INTEGER :: IMESH ! MESH DESCRIPTOR
128  INTEGER :: NB_DIM_PB ! NUMBER OF PHYSICAL DIMENSIONS
129  INTEGER :: NB_DIM_MESH ! NUMBER OF MESH DIMENSIONS
130  INTEGER :: MESH_TYPE ! TYPE OF THE MESH
131  INTEGER :: ORDER ! SORTING ORDER FOR IT AND DT
132  INTEGER :: NCOMP ! NUMBER OF COMPUTATION STEPS
133  INTEGER :: COOR_TYPE ! TYPE OF COORDINATES
134  INTEGER :: NAXIS ! NUMBER OF AXES
135 !
136 !-----------------------------------------------------------------------
137 !
138 ! CHECK THE MODE. POSSIBLE MODES ARE READONLY, WRITEONLY OR
139 ! READWRITE. OTHER MODES ARE INVALID
140  SELECT CASE(open_mode)
141  CASE('READ ')
142  med_mode = med_acc_rdonly
143  CASE('READWRITE')
144  med_mode = med_acc_rdwr
145  CASE('WRITE ')
146  IF(PRESENT(mesh_number).AND.partel_concat)THEN
147  med_mode = med_acc_rdwr
148  ELSE
149  med_mode = med_acc_creat
150  ENDIF
151  CASE DEFAULT
152 ! OPEN MODE IS INVALID
154  error_message = 'ERROR IN '//
155  & trim(file_name)//': '//
156  & 'OPEN_MESH_MED'
157  RETURN
158  END SELECT
159  cfile_name = trim(file_name)//char(0)
160 
161  hdfok = .true.
162  medok = .true.
163  IF(med_mode.EQ.med_acc_rdonly) THEN
164 ! CHECK IF THE FILE IS BOTH A MED & HDF5 FILE
165  CALL mficom(cfile_name, hdfok, medok, ierr)
166  IF(ierr.NE.0) THEN
167  error_message = 'ERROR IN '//
168  & trim(file_name)//': '//
169  & 'OPEN_MESH_MED:MFICOM'
170  RETURN
171  ENDIF
172  ENDIF
173 !
174 ! MESH FILE NOT COMPATIBLE WITH HDF5 OR MED
175  IF (.NOT. hdfok) THEN
177  error_message = 'ERROR IN '//
178  & trim(file_name)//': '//
179  & 'OPEN_MESH_MED'
180  RETURN
181  ENDIF
182  IF (.NOT. medok) THEN
184  error_message = 'ERROR IN '//
185  & trim(file_name)//': '//
186  & 'OPEN_MESH_MED'
187  RETURN
188  ENDIF
189 !
190 ! OPEN THE MED FILE AND CHECK RETURN CODE
191  CALL mfiope(fid, cfile_name, med_mode, ierr)
192  IF(ierr.NE.0) THEN
193  error_message = 'ERROR IN '//
194  & trim(file_name)//': '//
195  & 'OPEN_MESH_MED:MFIOPE'
196  RETURN
197  ENDIF
198  file_id = maxval(hash) + 100
199 
200 ! CREATE A NEW OBJECT FOR THE NEW MED FILE
201  CALL add_obj(hash,file_id,med_id,ierr)
202  IF(ierr.NE.0) THEN
203  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
204  & 'OPEN_MESH_MED:ADD_OBJ'
205  RETURN
206  ENDIF
207  med_obj_tab(med_id)%FILE_NAME = file_name
208  med_obj_tab(med_id)%ID = fid
209 !
210 !
211  IF(med_mode.EQ.med_acc_rdonly) THEN
212 ! CHECK COMPATIBILITY (EXPECTED)
213  CALL mfinvr (fid, major, minor, rel, ierr)
214  IF(ierr.NE.0) THEN
215  error_message = 'ERROR IN '//
216  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
217  & 'OPEN_MESH_MED:MFINVR'
218  RETURN
219  ENDIF
220 ! MED FILE IS TOO OLD AND SHOULD BE CONVERTED WITH MEDIMPORT
221  IF (major.LT.3) THEN
223  RETURN
224  ENDIF
225  ENDIF
226 !
227  !
228  IF(PRESENT(mesh_number).AND.partel_concat)THEN
229  med_obj_tab(med_id)%MESH_NUMBER=mesh_number
230  !CONVERT INT TO STRING
231  WRITE(med_obj_tab(med_id)%MESH_NUMBER_STR,'(I0)')mesh_number
232  ELSE
233  med_obj_tab(med_id)%MESH_NUMBER=1
234  med_obj_tab(med_id)%MESH_NUMBER_STR=''
235  ENDIF
236 !
237 ! Identify the name of the mesh if in read only
238  IF(med_mode.EQ.med_acc_rdonly.OR.
239  & (med_mode.EQ.med_acc_rdwr.AND..NOT.(partel_concat))) THEN
240 ! ONLY ONE MESH PER FILE FOR NOW
241  imesh = med_obj_tab(med_id)%MESH_NUMBER
242 !
243  CALL mmhnax(fid,imesh,naxis,ierr)
244  IF(ierr.NE.0) THEN
245  error_message = 'ERROR IN '//
246  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
247  & 'OPEN_MESH_MED:MMHMII'
248  RETURN
249  ENDIF
250  ALLOCATE(coor_name(naxis),stat=ierr)
251  IF(ierr.NE.0) THEN
252  error_message = 'ERROR IN '//
253  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
254  & 'ALLOCATING OPEN_MESH_MED:COOR_NAME'
255  RETURN
256  ENDIF
257  ALLOCATE(coor_unit(naxis),stat=ierr)
258  IF(ierr.NE.0) THEN
259  error_message = 'ERROR IN '//
260  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
261  & 'ALLOCATING OPEN_MESH_MED:COOR_UNIT'
262  RETURN
263  ENDIF
264 !
265 ! READ MESH TITLE
266  CALL mmhmii(fid,imesh,title_med,nb_dim_pb,nb_dim_mesh,
267  & mesh_type,comment,dt_unit,order,ncomp,coor_type,coor_name,
268  & coor_unit,ierr)
269  IF(ierr.NE.0) THEN
270  error_message = 'ERROR IN '//
271  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
272  & 'OPEN_MESH_MED:MMHMII'
273  RETURN
274  ENDIF
275  DEALLOCATE(coor_name)
276  DEALLOCATE(coor_unit)
277 !
278  med_obj_tab(med_id)%MESH_NAME = trim(title_med)
279  ENDIF
280 !
281 #else
282 !
283  file_id = 0
284 ! MED LIBRARY NOT LOADED
286 !
287 #endif
288 !
289  RETURN
290  END SUBROUTINE
291 !
292 !-----------------------------------------------------------------------
293 !
294  SUBROUTINE close_mesh_med (FILE_ID, IERR)
295 !
296 !BRIEF CLOSES A MESH FILE
297 !
298 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
299 !| FILE_ID |<--| MED FILE DESCRIPTOR
300 !| IERR |-->| ERROR TAG
301 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
302 !
303  IMPLICIT NONE
304 !
305  INTEGER, INTENT(IN) :: FILE_ID
306  INTEGER, INTENT(OUT) :: IERR
307 !
308  INTEGER MED_ID
309  INTEGER(KIND=KID) :: FID
310 !
311 !-----------------------------------------------------------------------
312 !
313 #if defined (HAVE_MED)
314 !
315  CALL get_obj(hash,file_id,med_id,ierr)
316  IF(ierr.NE.0) THEN
317  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
318  & 'CLOSE_MESH_MED:GET_OBJ'
319  RETURN
320  ENDIF
321 !
322  ! Clearing id in the hash table
323  hash(med_id) = 0
324 !
325  fid = med_obj_tab(med_id)%ID
326 ! CLOSE MED FILE
327  CALL mficlo(fid, ierr)
328  IF(ierr.NE.0) THEN
329  error_message = 'ERROR IN '//
330  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
331  & 'CLOSE_MESH_MED:MFICLO'
332  RETURN
333  ENDIF
334 !
335  ! CLEAN UP OF STRUCTURE
336  med_obj_tab(med_id)%ID = 0
337  med_obj_tab(med_id)%NCLI = 0
338  med_obj_tab(med_id)%NO_BND = .true.
339  med_obj_tab(med_id)%NBND_GRP = 0
340  med_obj_tab(med_id)%NBND_USED_GRP = 0
341  med_obj_tab(med_id)%MESH_NAME = repeat(' ',med_name_size)
342  IF(ALLOCATED(med_obj_tab(med_id)%BND_GRP_VAL)) THEN
343  DEALLOCATE(med_obj_tab(med_id)%BND_GRP_VAL)
344  ENDIF
345  IF(ALLOCATED(med_obj_tab(med_id)%BND_GRP_NAME)) THEN
346  DEALLOCATE(med_obj_tab(med_id)%BND_GRP_NAME)
347  ENDIF
348  med_obj_tab(med_id)%MESH_NUMBER=-1
349  med_obj_tab(med_id)%MESH_NUMBER_STR=''
350  med_obj_tab(med_id)%CLI_LINE_BEGIN=-1
351  med_obj_tab(med_id)%CLI_IDX_ID=-1
352  med_obj_tab(med_id)%ID = 0
353  med_obj_tab(med_id)%NCLI = 0
354  IF(ALLOCATED(med_obj_tab(med_id)%NBOR)) THEN
355  DEALLOCATE(med_obj_tab(med_id)%NBOR)
356  ENDIF
357  IF(ALLOCATED(med_obj_tab(med_id)%NBOR_SEG)) THEN
358  DEALLOCATE(med_obj_tab(med_id)%NBOR_SEG)
359  ENDIF
360  IF(ALLOCATED(med_obj_tab(med_id)%IS_BND)) THEN
361  DEALLOCATE(med_obj_tab(med_id)%IS_BND)
362  ENDIF
363  IF(ALLOCATED(med_obj_tab(med_id)%BND_FAM)) THEN
364  DEALLOCATE(med_obj_tab(med_id)%BND_FAM)
365  ENDIF
366  IF(ALLOCATED(med_obj_tab(med_id)%PT2SEG)) THEN
367  DEALLOCATE(med_obj_tab(med_id)%PT2SEG)
368  ENDIF
369 !
370 #else
371 !
372 ! MED LIBRARY NOT LOADED
374 !
375 #endif
376 !
377  RETURN
378  END SUBROUTINE
379 !
380 !
381 !-----------------------------------------------------------------------
382 !
383  SUBROUTINE open_bnd_med(FILE_NAME,FILE_ID,OPEN_MODE,IERR,
384  & MESH_NUMBER)
385 !
386 !BRIEF OPEN BOUNDARY FILE
387 !
388 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
389 !| FILE_NAME |<--| NAME OF THE BOUNDARY FILE
390 !| FILE_ID |<--| ID OF THE FILE
391 !| OPEN_MODE |<--| OPENING MODE (READ/READWRITE/WRITE)
392 !| IERR |-->| ERROR TAG
393 !| MESH_NUMBER |-->| IF PRESENT, THIS IS THE NUMBER OF THE PART OF
394 ! THE CONCATENATED FILE WE WANT TO ACCESS
395 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
396 !
398  IMPLICIT NONE
399 !
400  CHARACTER(LEN=*), INTENT(IN) :: FILE_NAME
401  INTEGER, INTENT(IN) :: FILE_ID
402  CHARACTER(LEN=9), INTENT(IN) :: OPEN_MODE
403  INTEGER, INTENT(OUT) :: IERR
404  INTEGER, OPTIONAL, INTENT(IN) :: MESH_NUMBER
405 !
406 #if defined (HAVE_MED)
407  INTEGER :: MED_ID,NCLI,NBND_GRP,I,DUMMY
408  LOGICAL :: ISOPENED
409  CHARACTER(LEN=9) :: REAL_OPENMODE
410 !
411 !-----------------------------------------------------------------------
412 !
413  CALL get_obj(hash,file_id,med_id,ierr)
414  IF(ierr.NE.0) THEN
415  error_message = 'ERROR IN '//
416  & trim(file_name)//': '//
417  & 'OPEN_MED_BND:GET_OBJ'
418  RETURN
419  ENDIF
420  !
421  real_openmode=open_mode
422  !
423  med_obj_tab(med_id)%CLI_LINE_BEGIN=1
424  IF(PRESENT(mesh_number).AND.partel_concat)THEN
425  !If we concatenate we need to be able to move into the file,
426  !which can only be done by reading, so we need readwrite access
427  IF(open_mode(1:5)=='WRITE')THEN
428  real_openmode='READWRITE'
429  ENDIF
430  CALL open_index(file_name,med_obj_tab(med_id)%CLI_IDX_ID)
431  CALL read_index(med_obj_tab(med_id)%CLI_IDX_ID,
432  & open_mode,mesh_number,
433  & med_obj_tab(med_id)%CLI_LINE_BEGIN,dummy)
434  ENDIF
435 !
436  ! First we check if the file is already opened
437  ! Telemac is using one boundary file for all the mesh file
438  ! so it could have been opened by another mesh before hand
439  INQUIRE(file=file_name,opened=isopened)
440  IF(isopened) THEN
441  ! Id the file is already opened get its id
442  INQUIRE(file=file_name,number=med_obj_tab(med_id)%NCLI)
443  ELSE
444  ! Otherwise open the file
445  CALL get_free_id(med_obj_tab(med_id)%NCLI)
446  OPEN(unit=med_obj_tab(med_id)%NCLI,file=file_name,
447  & form='FORMATTED',action=real_openmode,iostat=ierr)
448  ENDIF
449  IF(open_mode(1:4).EQ.'READ') THEN
450  ! Getting the name of the boundary groups
451  ncli = med_obj_tab(med_id)%NCLI
452  rewind(ncli)
453  !If the file is a concatenation, we need to move to the
454  !begining of our part
455  IF(partel_concat)THEN
456  DO i=1,med_obj_tab(med_id)%CLI_LINE_BEGIN-1
457  READ(med_obj_tab(med_id)%NCLI,*)
458  ENDDO
459  ENDIF
460 ! LOOP ON THE INFO IN THE FILE
461  READ(unit=ncli,fmt=*,iostat=ierr) nbnd_grp
462  IF(ierr.NE.0) THEN
463  error_message = 'ERROR IN '//
464  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
465  & 'OPEN_BND_MED:READ'
466  RETURN
467  ENDIF
468  med_obj_tab(med_id)%NBND_GRP = nbnd_grp
469  ALLOCATE(med_obj_tab(med_id)%BND_GRP_VAL(nbnd_grp,4),
470  & stat=ierr)
471  IF(ierr.NE.0) THEN
472  error_message = 'ERROR IN '//
473  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
474  & 'ALLOCATING BND_GRP_VAL'
475  RETURN
476  ENDIF
477  ALLOCATE(med_obj_tab(med_id)%BND_GRP_NAME(nbnd_grp),stat=ierr)
478  IF(ierr.NE.0) THEN
479  error_message = 'ERROR IN '//
480  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
481  & 'ALLOCATING BND_GRP_NAME'
482  RETURN
483  ENDIF
484  DO i=1,nbnd_grp
485  READ(unit=ncli,fmt=*,iostat=ierr)
486  & med_obj_tab(med_id)%BND_GRP_VAL(i,1),
487  & med_obj_tab(med_id)%BND_GRP_VAL(i,2),
488  & med_obj_tab(med_id)%BND_GRP_VAL(i,3),
489  & med_obj_tab(med_id)%BND_GRP_VAL(i,4),
490  & med_obj_tab(med_id)%BND_GRP_NAME(i)
491  IF(ierr.NE.0) THEN
492  error_message = 'ERROR IN '//
493  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
494  & 'OPEN_BND_MED:READ'
495  RETURN
496  ENDIF
497  ENDDO
498  ELSE
499  med_obj_tab(med_id)%NBND_GRP = 0
500  ENDIF
501 
502 #else
503 !
504 ! MED LIBRARY NOT LOADED
506 !
507 #endif
508 !
509  RETURN
510  END SUBROUTINE
511 !
512 !
513 !-----------------------------------------------------------------------
514 !
515  SUBROUTINE close_bnd_med (FILE_ID, IERR, MESH_NUMBER)
516 !
517 !BRIEF CLOSES A MESH BOUNDARY FILE
518 !
519 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
520 !| FILE_ID |<--| MED FILE DESCRIPTOR
521 !| IERR |-->| ERROR TAG
522 !| MESH_NUMBER |-->| IF PRESENT, THIS IS THE NUMBER OF THE PART OF
523 ! THE CONCATENATED FILE WE WANT TO ACCESS
524 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
525 !
527  IMPLICIT NONE
528 !
529  INTEGER, INTENT(IN) :: FILE_ID
530  INTEGER, INTENT(OUT) :: IERR
531  INTEGER, OPTIONAL, INTENT(IN) :: MESH_NUMBER
532 !
533  INTEGER MED_ID, LINE_BEGIN, LINE_END
534  LOGICAL ISOPENED
535 !
536 !-----------------------------------------------------------------------
537 !
538  CALL get_obj(hash,file_id,med_id,ierr)
539  IF(ierr.NE.0) THEN
540  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
541  & 'CLOSE_BND_MED:GET_OBJ'
542  RETURN
543  ENDIF
544 !
545  isopened = .false.
546  ! CHECK IF THE FILE IS STILL OPENED AS IT COULD HAVE BEEN CLOSED
547  ! BY ANOTHER MESH FILE (SEE OPEN_BND_SRF FOR MORE INFORMATION)
548  INQUIRE(unit=med_obj_tab(med_id)%NCLI,opened=isopened)
549  ierr = 0
550  IF(isopened) THEN
551  !If we manage a concatenated cli file, then we need to write
552  !the current offsets
553  IF(PRESENT(mesh_number).AND.partel_concat)THEN
554  line_begin = med_obj_tab(med_id)%CLI_LINE_BEGIN
555  line_end = med_obj_tab(med_id)%NBND_USED_GRP+1+ line_begin
556  !
557  CALL write_index(med_obj_tab(med_id)%CLI_IDX_ID,
558  & mesh_number, line_begin, line_end)
559  CLOSE(med_obj_tab(med_id)%CLI_IDX_ID)
560  ENDIF
561  CLOSE(med_obj_tab(med_id)%NCLI,iostat=ierr)
562  ENDIF
563  IF(ierr.NE.0) THEN
564  error_message = 'ERROR IN '//
565  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
566  & 'CLOSE_BND_MED:CLOSE'
567  RETURN
568  ENDIF
569 !
570  RETURN
571  END SUBROUTINE
572 !
573 !-----------------------------------------------------------------------
574 !
575  SUBROUTINE get_mesh_title_med (FILE_ID, TITLE, IERR)
576 !
577 !BRIEF READS THE MESH TITLE
578 !
579 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
580 !| FILE_ID |<--| MED FILE DESCRIPTOR
581 !| TITLE |-->| MESH TITLE OR NAME
582 !| IERR |-->| ERROR TAG
583 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
584 !
585  IMPLICIT NONE
586 !
587  INTEGER, INTENT(IN) :: FILE_ID
588  CHARACTER(LEN=80), INTENT(OUT) :: TITLE
589  INTEGER, INTENT(OUT) :: IERR
590 !
591 #if defined (HAVE_MED)
592 !
593  INTEGER :: MED_ID
594  CHARACTER(LEN=MED_COMMENT_SIZE) :: TITLE_MED
595  INTEGER(KIND=KID) :: FID
596 !
597 !-----------------------------------------------------------------------
598 !
599 ! STORE THE NAME OF THE MESH IN THE MED FILE OBJECT
600  CALL get_obj(hash,file_id,med_id,ierr)
601  IF(ierr.NE.0) THEN
602  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
603  & 'GET_MESH_TITLE_MED:GET_OBJ'
604  RETURN
605  ENDIF
606  title_med = repeat(' ',med_comment_size)
607  fid = med_obj_tab(med_id)%ID
608 ! READS THE TITLE OF THE MESH IF ther is one
609  CALL mficor(fid,title_med,ierr)
610  IF (ierr.LT.0) THEN
611  title = 'NO TITLE'
612  ierr = 0
613  ELSE
614  title = title_med(1:80)
615  ENDIF
616 !
617 #else
618 !
619  title = repeat(' ', 80)
620 ! MED LIBRARY NOT LOADED
622 !
623 #endif
624 !
625  RETURN
626  END SUBROUTINE
627 !
628 !-----------------------------------------------------------------------
629 !
630  SUBROUTINE get_mesh_nelem_med (FILE_ID, TYPE_ELEM, NELEM, IERR)
631 !
632 !BRIEF READS TOTAL NUMBER OF ELEMENTS FOR A GIVEN TYPE
633 !
634 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
635 !| FILE_ID |<--| MED FILE DESCRIPTOR
636 !| TYPE_ELEM |<--| TYPE OF ELEMENT
637 !| NELEM |-->| NUMBER OF ELEMENTS
638 !| IERR |-->| ERROR TAG
639 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
640 !
641  IMPLICIT NONE
642 !
643  INTEGER, INTENT(IN) :: FILE_ID
644  INTEGER, INTENT(IN) :: TYPE_ELEM
645  INTEGER, INTENT(OUT) :: NELEM
646  INTEGER, INTENT(OUT) :: IERR
647 !
648 #if defined (HAVE_MED)
649  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
650 !
651  INTEGER :: TYPE_ELEM_MED ! ELEMENT TYPE IN MED NUMBERING
652  INTEGER :: CHGT,TSF ! INDICATORS OF MESH MODIF
653  INTEGER :: MED_ID
654  INTEGER(KIND=KID) :: FID
655 !
656 !-----------------------------------------------------------------------
657 !
658 ! GET INFO FROM THE MED FILE OBJECT
659  CALL get_obj(hash,file_id,med_id,ierr)
660  IF(ierr.NE.0) THEN
661  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
662  & 'GET_MESH_NELEM_MED:GET_OBJ'
663  RETURN
664  ENDIF
665  mname = med_obj_tab(med_id)%MESH_NAME
666  fid = med_obj_tab(med_id)%ID
667 !
668 ! CONVERTS TYPE OF ELEMENTS
669  CALL convert_elem_type(type_elem, type_elem_med, ierr)
670  IF(ierr.NE.0) THEN
671  error_message = 'ERROR IN '//
672  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
673  & 'GET_MESH_NELEM_MED:CONVERT_ELEM_TYPE'
674  RETURN
675  ENDIF
676 !
677 ! READ TOTAL NUMBER OF ELEMENTS
678  nelem = 0
679  CALL mmhnme(fid,mname,med_no_dt,med_no_it,med_cell,
680  & type_elem_med,med_connectivity,med_nodal,chgt,tsf,nelem,ierr)
681  IF(ierr.NE.0) THEN
682  error_message = 'ERROR IN '//
683  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
684  & 'GET_MESH_NELEM_MED:MMHNME'
685  RETURN
686  ENDIF
687 !
688 #else
689 !
690  nelem = 0
691 ! MED LIBRARY NOT LOADED
693 !
694 #endif
695 !
696  RETURN
697  END SUBROUTINE
698 !
699 !-----------------------------------------------------------------------
700 !
701  SUBROUTINE get_mesh_npoin_per_element_med (TYPE_ELEM, NDP, IERR)
702 !
703 !BRIEF READS NUMBER OF NODES PER ELEMENT
704 !
705 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
706 !| TYPE_ELEM |<--| TYPE OF ELEMENT
707 !| NDP |-->| NUMBER OF NODES PER ELEMENT
708 !| IERR |-->| ERROR TAG
709 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
710 !
711  IMPLICIT NONE
712 !
713  INTEGER, INTENT(IN) :: TYPE_ELEM
714  INTEGER, INTENT(OUT) :: NDP
715  INTEGER, INTENT(OUT) :: IERR
716 !
717 #if defined (HAVE_MED)
718 !
719  INTEGER :: TYPE_ELEM_MED ! ELEMENT TYPE IN MED NUMBERING
720 !
721 !-----------------------------------------------------------------------
722 !
723 ! CONVERTS TYPE OF ELEMENTS
724  CALL convert_elem_type(type_elem, type_elem_med, ierr)
725  IF(ierr.NE.0) RETURN
726 !
727 ! DEDUCES NUMBER OF NODES PER ELEMENT FROM THE ELEMENT TYPE
728  CALL ndp_from_element_type_med(type_elem_med,ndp,ierr)
729  IF(ierr.NE.0) RETURN
730 !
731 #else
732 !
733  ndp = 0
734 ! MED LIBRARY NOT LOADED
736 !
737 #endif
738 !
739  RETURN
740  END SUBROUTINE
741 !
742 !-----------------------------------------------------------------------
743 !
744  SUBROUTINE get_mesh_connectivity_med (FILE_ID,TYPE_ELEM,IKLE,
745  & NELEM,NDP,IERR)
746 !
747 !BRIEF READS THE CONNECTIVITY TABLE
748 !
749 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
750 !| FILE_ID |<--| MED FILE DESCRIPTOR
751 !| TYPE_ELEM |<--| TYPE OF THE ELEMENT IN FORMAT SLF
752 !| IKLE |-->| CONNECTIVITY TABLE
753 !| NELEM |<--| NUMBER OF ELEMENTS
754 !| NDP |<--| NUMBER OF NODES PER ELEMENT
755 !| IERR |-->| ERROR TAG
756 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
757 !
758  IMPLICIT NONE
759 !
760  INTEGER, INTENT(IN) :: FILE_ID
761  INTEGER, INTENT(IN) :: TYPE_ELEM
762  INTEGER, INTENT(IN) :: NELEM
763  INTEGER, INTENT(IN) :: NDP
764  INTEGER, INTENT(INOUT) :: IKLE(nelem*ndp)
765  INTEGER, INTENT(OUT) :: IERR
766 !
767 #if defined (HAVE_MED)
768  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
769 !
770  INTEGER :: MED_ID, TYPE_ELEM_MED
771  INTEGER(KIND=KID) :: FID
772 !
773 !-----------------------------------------------------------------------
774 !
775 ! GET INFO FROM THE MED FILE OBJECT
776  CALL get_obj(hash,file_id,med_id,ierr)
777  IF(ierr.NE.0) THEN
778  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
779  & 'GET_MESH_CONNECTIVITY_MED:GET_OBJ'
780  RETURN
781  ENDIF
782  mname = med_obj_tab(med_id)%MESH_NAME
783  fid = med_obj_tab(med_id)%ID
784 !
785 ! CONVERTS TYPE OF ELEMENTS
786  CALL convert_elem_type(type_elem, type_elem_med, ierr)
787  IF(ierr.NE.0) THEN
788  error_message = 'ERROR IN '//
789  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
790  & 'GET_MESH_CONNECTIVITY_MED:CONVERT_ELEM_TYPE'
791  RETURN
792  ENDIF
793 !
794 ! READ THE CONNECTIVITY TABLE
795  CALL mmhcyr(fid,mname,med_no_dt,med_no_it,med_cell,
796  & type_elem_med,med_nodal,med_full_interlace,ikle,ierr)
797  IF(ierr.NE.0) THEN
798  error_message = 'ERROR IN '//
799  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
800  & 'GET_MESH_CONNECTIVITY_MED:MMHCYR'
801  RETURN
802  ENDIF
803 !
804 #else
805 !
806 ! MED LIBRARY NOT LOADED
808 !
809 #endif
810 !
811  RETURN
812  END SUBROUTINE
813 !
814 !-----------------------------------------------------------------------
815 !
816  SUBROUTINE get_mesh_npoin_med (FILE_ID,TYPE_ELEM,NPOIN,IERR)
817 !
818 !BRIEF READS TOTAL NUMBER OF NODES IN A MED FILE
819 !
820 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
821 !| FILE_ID |<--| MED FILE DESCRIPTOR
822 !| TYPE_ELEM |<--| ELEMENT TYPE IN SLF FORMAT
823 !| NPOIN |-->| TOTAL NUMBER OF NODES
824 !| IERR |-->| ERROR TAG
825 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
826 !
827  IMPLICIT NONE
828 !
829  INTEGER, INTENT(IN) :: FILE_ID
830  INTEGER, INTENT(IN) :: TYPE_ELEM
831  INTEGER, INTENT(OUT) :: NPOIN
832  INTEGER, INTENT(OUT) :: IERR
833 !
834 #if defined (HAVE_MED)
835  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
836 !
837  INTEGER :: CHGT,TSF ! INDICATORS OF MESH MODIF
838  INTEGER :: MED_ID, TYPE_ELEM_MED
839  INTEGER(KIND=KID) :: FID
840 !
841 !-----------------------------------------------------------------------
842 !
843 ! GET INFO FROM THE MED FILE OBJECT
844  CALL get_obj(hash,file_id,med_id,ierr)
845  IF(ierr.NE.0) THEN
846  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
847  & 'GET_MESH_NPOIN_MED:GET_OBJ'
848  RETURN
849  ENDIF
850  mname = med_obj_tab(med_id)%MESH_NAME
851 !
852  fid = med_obj_tab(med_id)%ID
853 ! CONVERTS TYPE OF ELEMENTS
854  CALL convert_elem_type(type_elem, type_elem_med, ierr)
855  IF(ierr.NE.0) THEN
856  error_message = 'ERROR IN '//
857  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
858  & 'GET_MESH_NPOIN_MED:CONVERT_ELEM_TYPE'
859  RETURN
860  ENDIF
861 !
862 ! READ THE TOTAL NUMBER OF NODES
863  CALL mmhnme(fid,mname,med_no_dt,med_no_it,med_node,
864  & type_elem_med,med_coordinate,med_nodal,chgt,tsf,npoin,ierr)
865  IF(ierr.NE.0) THEN
866  error_message = 'ERROR IN '//
867  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
868  & 'GET_MESH_NPOIN_MED:MMHNME'
869  RETURN
870  ENDIF
871 !
872 #else
873 !
874  npoin = 0
875 ! MED LIBRARY NOT LOADED
877 !
878 #endif
879 !
880  RETURN
881  END SUBROUTINE
882 !
883 !-----------------------------------------------------------------------
884 !
885  SUBROUTINE get_mesh_dimension_med (FILE_ID, NDIM, IERR)
886 !
887 !BRIEF READS THE NUMBER OF DIMENSION OF THE MESH
888 !
889 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
890 !| FILE_ID |<--| MED FILE DESCRIPTOR
891 !| NDIM |-->| NUMBER OF DIMENSION OF THE MESH
892 !| IERR |-->| ERROR TAG
893 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
894 !
895  IMPLICIT NONE
896 !
897  INTEGER, INTENT(IN) :: FILE_ID
898  INTEGER, INTENT(OUT) :: NDIM
899  INTEGER, INTENT(OUT) :: IERR
900 !
901 #if defined (HAVE_MED)
902  CHARACTER(LEN=MED_NAME_SIZE) :: TITLE_MED
903  CHARACTER(LEN=MED_NAME_SIZE) :: DT_UNIT
904  CHARACTER(LEN=MED_SNAME_SIZE),ALLOCATABLE :: COOR_NAME(:)
905  CHARACTER(LEN=MED_SNAME_SIZE),ALLOCATABLE :: COOR_UNIT(:)
906  CHARACTER(LEN=MED_COMMENT_SIZE) :: COMMENT
907 !
908  INTEGER :: IMESH ! MESH DESCRIPTOR
909  INTEGER :: NB_DIM_PB ! NUMBER OF PHYSICAL DIMENSIONS
910  INTEGER :: MESH_TYPE ! TYPE OF THE MESH
911  INTEGER :: ORDER ! SORTING ORDER FOR IT AND DT
912  INTEGER :: NCOMP ! NUMBER OF COMPUTATION STEPS
913  INTEGER :: COOR_TYPE ! TYPE OF COORDINATES
914  INTEGER :: NAXIS ! NUMBER OF AXES
915  INTEGER :: MED_ID
916  INTEGER(KIND=KID) :: FID
917 !
918 !----------------------------------------------------------------------
919 !
920  CALL get_obj(hash,file_id,med_id,ierr)
921  IF(ierr.NE.0) THEN
922  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
923  & 'GET_MESH_DIMENSION:GET_MESH_OBJ_FILE'
924  RETURN
925  ENDIF
926  imesh = med_obj_tab(med_id)%MESH_NUMBER
927  fid = med_obj_tab(med_id)%ID
928 !
929  CALL mmhnax(fid,imesh,naxis,ierr)
930  IF(ierr.NE.0) THEN
931  error_message = 'ERROR IN '//
932  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
933  & 'GET_MESH_DIMENSION_MED:MMHNAX'
934  RETURN
935  ENDIF
936  ALLOCATE(coor_name(naxis),stat=ierr)
937  IF(ierr.NE.0) THEN
938  error_message = 'ERROR IN '//
939  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
940  & 'ALLOCATING GET_MESH_DIMENSION_MED:COOR_NAME'
941  RETURN
942  ENDIF
943  ALLOCATE(coor_unit(naxis),stat=ierr)
944  IF(ierr.NE.0) THEN
945  error_message = 'ERROR IN '//
946  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
947  & 'ALLOCATING GET_MESH_DIMENSION_MED:COOR_UNIT'
948  RETURN
949  ENDIF
950 !
951 ! READ MESH INFORMATIONS
952  CALL mmhmii(fid,imesh,title_med,nb_dim_pb,ndim,mesh_type,
953  & comment,dt_unit,order,ncomp,coor_type,coor_name,coor_unit,ierr)
954  IF(ierr.NE.0) THEN
955  error_message = 'ERROR IN '//
956  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
957  & 'GET_MESH_DIMENSION_MED:MMHMII'
958  RETURN
959  ENDIF
960  DEALLOCATE(coor_name)
961  DEALLOCATE(coor_unit)
962 !
963 #else
964 !
965  ndim = 0
966 ! MED LIBRARY NOT LOADED
968 !
969 #endif
970 !
971  RETURN
972  END SUBROUTINE
973 !
974 !-----------------------------------------------------------------------
975 !
976  SUBROUTINE get_mesh_coord_med(FILE_ID,JDIM,NDIM,NPOIN,COORD_AXE,
977  & IERR)
978 !
979 !BRIEF READS THE COORDINATES OF THE MESH
980 !
981 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
982 !| FILE_ID |<--| MED FILE DESCRIPTOR
983 !| JDIM |<--| DIMENSION NUMBER (X, Y OR Z)
984 !| NDIM |<--| NUMBER OF DIMENSION OF THE MESH
985 !| NPOIN |<--| TOTAL NUMBER OF NODES
986 !| COORD_AXE |-->| COORDINATES OF THE MESH
987 !| IERR |-->| ERROR TAG
988 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
989 !
990  IMPLICIT NONE
991 !
992  INTEGER, INTENT(IN) :: FILE_ID, JDIM, NDIM, NPOIN
993  INTEGER, INTENT(OUT) :: IERR
994  DOUBLE PRECISION, INTENT(INOUT) :: COORD_AXE(npoin)
995 !
996 #if defined (HAVE_MED)
997  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
998 !
999  INTEGER :: MED_ID
1000  DOUBLE PRECISION, ALLOCATABLE :: COORD(:)
1001  INTEGER(KIND=KID) :: FID
1002 !
1003 !----------------------------------------------------------------------
1004 !
1005 ! GET INFO FROM THE MED FILE OBJECT
1006  CALL get_obj(hash,file_id,med_id,ierr)
1007  IF(ierr.NE.0) THEN
1008  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1009  & 'COORD_MED:GET_MESH_OBJ_FILE'
1010  RETURN
1011  ENDIF
1012  mname = med_obj_tab(med_id)%MESH_NAME
1013  fid = med_obj_tab(med_id)%ID
1014 !
1015 ! TEMPORARY TABLE ALLOCATION
1016  ALLOCATE(coord(3*npoin),stat=ierr)
1017  IF(ierr.NE.0) THEN
1018  error_message = 'ERROR IN '//
1019  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1020  & 'ALLOCATING GET_MESH_COORD_MED:COORD'
1021  RETURN
1022  ENDIF
1023 !
1024 ! READ THE COORDINATES OF THE MESH
1025  CALL mmhcor(fid,mname,med_no_dt,med_no_it,med_no_interlace,
1026  & coord,ierr)
1027  IF(ierr.NE.0) THEN
1028  error_message = 'ERROR IN '//
1029  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1030  & 'GET_MESH_COORD_MED:MMHCOR'
1031  RETURN
1032  ENDIF
1033 !
1034 ! STORE ONLY THE DIMENSION DEFINED BY JDIM
1035  IF ((jdim.GE.0).AND.(jdim.LE.ndim)) THEN
1036  coord_axe(1:npoin)=coord((jdim-1)*npoin+1:jdim*npoin)
1037  ELSE
1038 ! ERROR ON JDIM
1039  ierr = hermes_wrong_axe_err
1040  ENDIF
1041  DEALLOCATE(coord)
1042 !
1043 #else
1044 !
1045 ! MED LIBRARY NOT LOADED
1047 !
1048 #endif
1049 !
1050  RETURN
1051  END SUBROUTINE
1052 !
1053 !----------------------------------------------------------------------
1054 !
1055  SUBROUTINE get_mesh_l2g_numbering_med(FILE_ID, KNOLG, NPOIN, IERR)
1056 !
1057 !BRIEF READS THE INDEX TABLE OF NODES WHICH CONVERT THE LOCAL
1058 ! NUMBERING TO THE GLOBAL
1059 !
1060 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1061 !| FILE_ID |<--| MED FILE DESCRIPTOR
1062 !| KNOLG |-->| NODES INDEX TABLE FROM LOCAL TO GLOBAL
1063 !| NPOIN |<--| TOTAL NUMBER OF NODES
1064 !| IERR |-->| ERROR TAG
1065 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1066 !
1067  IMPLICIT NONE
1068 !
1069  INTEGER, INTENT(IN) :: FILE_ID
1070  INTEGER, INTENT(IN) :: NPOIN
1071  INTEGER, INTENT(OUT) :: IERR
1072  INTEGER, INTENT(INOUT) :: KNOLG(npoin)
1073 !
1074 #if defined (HAVE_MED)
1075  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
1076 !
1077  INTEGER :: MED_ID
1078  INTEGER(KIND=KID) :: FID
1079 !
1080 !----------------------------------------------------------------------
1081 !
1082 ! GET INFO FROM THE MED FILE OBJECT
1083  CALL get_obj(hash,file_id,med_id,ierr)
1084  IF(ierr.NE.0) THEN
1085  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1086  & 'GET_MESH_L2G_NUMBERING_MED:GET_OBJ'
1087  RETURN
1088  ENDIF
1089  mname = med_obj_tab(med_id)%MESH_NAME
1090  fid = med_obj_tab(med_id)%ID
1091 !
1092 ! READ THE NODES INDEX TABLE FROM LOCAL TO GLOBAL
1093  CALL mmhgnr(fid,mname,med_no_dt,med_no_it,med_node,med_none,
1094  & knolg,ierr)
1095  IF(ierr.NE.0) THEN
1096  error_message = 'ERROR IN '//
1097  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1098  & 'GET_MESH_L2G_NUMBERING_MED:MMHGNR'
1099  RETURN
1100  ENDIF
1101 !
1102 #else
1103 !
1104 ! MED LIBRARY NOT LOADED
1106 !
1107 #endif
1108 !
1109  RETURN
1110  END SUBROUTINE
1111 !
1112 !----------------------------------------------------------------------
1113 !
1114  SUBROUTINE get_mesh_nptir_med (FILE_ID, NPTIR, IERR)
1115 !
1116 !BRIEF READS TOTAL NUMBER OF INTERFACE NODES IN A MED FILE
1117 ! ONLY FOR PARALLEL MODE
1118 !
1119 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1120 !| FILE_ID |<--| MED FILE DESCRIPTOR
1121 !| NPTIR |-->| NUMBER OF INTERFACE NODES FOR THE SUB-DOMAIN
1122 !| IERR |-->| ERROR TAG
1123 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1124 !
1125  IMPLICIT NONE
1126 !
1127  INTEGER, INTENT(IN) :: FILE_ID
1128  INTEGER, INTENT(OUT) :: NPTIR
1129  INTEGER, INTENT(OUT) :: IERR
1130 !
1131 #if defined (HAVE_MED)
1132  INTEGER :: MED_ID
1133  CHARACTER(LEN=MED_NAME_SIZE) :: PNAME
1134  INTEGER :: NSTEP,ITYP,NPARAM,I
1135  CHARACTER(LEN=MED_NAME_SIZE) :: DTUNIT
1136  CHARACTER(LEN=MED_COMMENT_SIZE) :: DESC
1137  LOGICAL :: FOUND
1138  CHARACTER(LEN=MED_NAME_SIZE) :: NPTIR_NAME
1139  INTEGER(KIND=KID) :: FID
1140 !
1141 !-----------------------------------------------------------------------
1142 !
1143 ! GET INFO FROM THE MED FILE OBJECT
1144  CALL get_obj(hash,file_id,med_id,ierr)
1145  IF(ierr.NE.0) THEN
1146  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1147  & 'GET_MESH_NPTIR_MED:GET_OBJ'
1148  RETURN
1149  ENDIF
1150 !
1151 !
1152  fid = med_obj_tab(med_id)%ID
1153 !
1154 ! INITIALISATION
1155  nptir = 0
1156  nptir_name='NPTIR'//trim(med_obj_tab(med_id)%MESH_NUMBER_STR)
1157  ! Looping on all parameter to check if nplan is in
1158  CALL mprnpr(fid,nparam,ierr)
1159  IF(ierr.NE.0) THEN
1160  error_message = 'ERROR IN '//
1161  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1162  & 'GET_MESH_NPTIR_MED:MPRNPR'
1163  RETURN
1164  ENDIF
1165  found = .false.
1166  DO i=1,nparam
1167  CALL mprpri(fid,i,pname,ityp,desc,dtunit,nstep,ierr)
1168  IF(ierr.NE.0) THEN
1169  error_message = 'ERROR IN '//
1170  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1171  & 'GET_MESH_NPTIR_MED:MPRNPR'
1172  RETURN
1173  ENDIF
1174  IF(trim(pname).EQ.trim(nptir_name)) THEN
1175  found = .true.
1176  ENDIF
1177  ENDDO
1178  IF(found) THEN
1179  pname = nptir_name
1180  CALL mprivr(fid,pname,med_no_dt,med_no_it,nptir,ierr)
1181  IF(ierr.NE.0) THEN
1182  error_message = 'ERROR IN '//
1183  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1184  & 'GET_MESH_NPTIR_MED:MPRIVR'
1185  RETURN
1186  ENDIF
1187  ELSE
1188  nptir = 0
1189  ENDIF
1190 !
1191 #else
1192 !
1193  nptir = 0
1194 ! MED LIBRARY NOT LOADED
1196 !
1197 #endif
1198 !
1199  RETURN
1200  END SUBROUTINE
1201 !
1202 !----------------------------------------------------------------------
1203 !
1204  SUBROUTINE get_mesh_orig_med (FILE_ID, X_ORIG, Y_ORIG, IERR)
1205 !
1206 !BRIEF READS ORIGIN OF COORDINATES
1207 !
1208 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1209 !| FILE_ID |<--| MED FILE DESCRIPTOR
1210 !| X_ORIG |<->| Off set of the X coordinates
1211 !| Y_ORIG |<->| Off set of the Y coordinates
1212 !| IERR |-->| ERROR TAG
1213 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1214 !
1215  IMPLICIT NONE
1216 !
1217  INTEGER, INTENT(IN) :: FILE_ID
1218  INTEGER, INTENT(OUT) :: X_ORIG, Y_ORIG
1219  INTEGER, INTENT(OUT) :: IERR
1220 !
1221 #if defined (HAVE_MED)
1222  INTEGER :: MED_ID,NSTEP,ITYP,NPARAM,I
1223  CHARACTER(LEN=MED_NAME_SIZE) :: PNAME,DTUNIT
1224  CHARACTER(LEN=MED_COMMENT_SIZE) :: DESC
1225  LOGICAL :: FOUND
1226  INTEGER(KIND=KID) :: FID
1227 !
1228 !-----------------------------------------------------------------------
1229 !
1230 ! GET INFO FROM THE MED FILE OBJECT
1231  CALL get_obj(hash,file_id,med_id,ierr)
1232  IF(ierr.NE.0) THEN
1233  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1234  & 'GET_MESH_ORIG_MED:GET_OBJ'
1235  RETURN
1236  ENDIF
1237 !
1238  fid = med_obj_tab(med_id)%ID
1239 ! INITIALISATION
1240  ! Looping on all parameter to check if nplan is in
1241  CALL mprnpr(fid,nparam,ierr)
1242  IF(ierr.NE.0) THEN
1243  error_message = 'ERROR IN '//
1244  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1245  & 'GET_MESH_ORIG_MED:MPRNPR'
1246  RETURN
1247  ENDIF
1248  found = .false.
1249  DO i=1,nparam
1250  CALL mprpri(fid,i,pname,ityp,desc,dtunit,nstep,ierr)
1251  IF(ierr.NE.0) THEN
1252  error_message = 'ERROR IN '//
1253  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1254  & 'GET_MESH_ORIG_MED:MPRNPR'
1255  RETURN
1256  ENDIF
1257  IF(pname(1:5).EQ.'X_ORIG') THEN
1258  found = .true.
1259  ENDIF
1260  ENDDO
1261  IF(found) THEN
1262  pname = 'X_ORIG'//char(0)
1263  CALL mprivr(fid,pname,med_no_dt,med_no_it,x_orig,ierr)
1264  IF(ierr.NE.0) THEN
1265  error_message = 'ERROR IN '//
1266  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1267  & 'GET_MESH_ORIG_MED:MPRIVR'
1268  RETURN
1269  ENDIF
1270  pname = 'Y_ORIG'//char(0)
1271  CALL mprivr(fid,pname,med_no_dt,med_no_it,y_orig,ierr)
1272  IF(ierr.NE.0) THEN
1273  error_message = 'ERROR IN '//
1274  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1275  & 'GET_MESH_ORIG_MED:MPRIVR'
1276  RETURN
1277  ENDIF
1278  ELSE
1279  x_orig = 0
1280  y_orig = 0
1281  ENDIF
1282 !
1283 #else
1284 !
1285  x_orig = 0
1286  y_orig = 0
1287 ! MED LIBRARY NOT LOADED
1289 !
1290 #endif
1291 !
1292  RETURN
1293  END SUBROUTINE
1294 !
1295 !-----------------------------------------------------------------------
1296 !
1297  SUBROUTINE get_mesh_nplan_med (FILE_ID, NPLAN, IERR)
1298 !
1299 !BRIEF READS NUMBER OF PLANES (3D)
1300 !
1301 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1302 !| FILE_ID |<--| MED FILE DESCRIPTOR
1303 !| NPLAN |-->| NUMBER OF PLANES
1304 !| IERR |-->| ERROR TAG
1305 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1306 !
1307  IMPLICIT NONE
1308 !
1309  INTEGER, INTENT(IN) :: FILE_ID
1310  INTEGER, INTENT(OUT) :: NPLAN
1311  INTEGER, INTENT(OUT) :: IERR
1312 !
1313 #if defined (HAVE_MED)
1314  INTEGER :: MED_ID,NSTEP,ITYP,NPARAM,I
1315  CHARACTER(LEN=MED_NAME_SIZE) :: PNAME,DTUNIT
1316  CHARACTER(LEN=MED_COMMENT_SIZE) :: DESC
1317  LOGICAL :: FOUND
1318  INTEGER(KIND=KID) :: FID
1319 !
1320 !-----------------------------------------------------------------------
1321 !
1322 ! GET INFO FROM THE MED FILE OBJECT
1323  CALL get_obj(hash,file_id,med_id,ierr)
1324  IF(ierr.NE.0) THEN
1325  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1326  & 'GET_MESH_NPLAN_MED:GET_OBJ'
1327  RETURN
1328  ENDIF
1329 !
1330  nplan = 0
1331  fid = med_obj_tab(med_id)%ID
1332 ! INITIALISATION
1333  ! Looping on all parameter to check if nplan is in
1334  CALL mprnpr(fid,nparam,ierr)
1335  IF(ierr.NE.0) THEN
1336  error_message = 'ERROR IN '//
1337  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1338  & 'GET_MESH_NPLAN_MED:MPRNPR'
1339  RETURN
1340  ENDIF
1341  found = .false.
1342  DO i=1,nparam
1343  CALL mprpri(fid,i,pname,ityp,desc,dtunit,nstep,ierr)
1344  IF(ierr.NE.0) THEN
1345  error_message = 'ERROR IN '//
1346  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1347  & 'GET_MESH_NPLAN_MED:MPRNPR'
1348  RETURN
1349  ENDIF
1350  IF(pname(1:5).EQ.'NPLAN') THEN
1351  found = .true.
1352  ENDIF
1353  ENDDO
1354  IF(found) THEN
1355  pname = 'NPLAN'//char(0)
1356  CALL mprivr(fid,pname,med_no_dt,med_no_it,nplan,ierr)
1357  IF(ierr.NE.0) THEN
1358  error_message = 'ERROR IN '//
1359  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1360  & 'GET_MESH_NPLAN_MED:MPRIVR'
1361  RETURN
1362  ENDIF
1363  ELSE
1364  nplan = 0
1365  ENDIF
1366 !
1367 #else
1368 !
1369  nplan = 0
1370 ! MED LIBRARY NOT LOADED
1372 !
1373 #endif
1374 !
1375  RETURN
1376  END SUBROUTINE
1377 !
1378 !-----------------------------------------------------------------------
1379 !
1380  SUBROUTINE get_mesh_date_med (FILE_ID, DATE, IERR)
1381 !
1382 !BRIEF READS NUMBER OF PLANES (3D)
1383 !
1384 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1385 !| FILE_ID |<--| MED FILE DESCRIPTOR
1386 !| NPLAN |-->| NUMBER OF PLANES
1387 !| IERR |-->| ERROR TAG
1388 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1389 !
1390  IMPLICIT NONE
1391 !
1392  INTEGER, INTENT(IN) :: FILE_ID
1393  INTEGER, INTENT(OUT) :: DATE(6)
1394  INTEGER, INTENT(OUT) :: IERR
1395 !
1396 #if defined (HAVE_MED)
1397  INTEGER :: MED_ID,NSTEP,ITYP,NPARAM,I
1398  CHARACTER(LEN=MED_NAME_SIZE) :: PNAME,DTUNIT
1399  CHARACTER(LEN=MED_COMMENT_SIZE) :: DESC
1400  LOGICAL :: FOUND
1401  INTEGER :: MYDATE
1402  INTEGER(KIND=KID) :: FID
1403 !
1404 !-----------------------------------------------------------------------
1405 !
1406 ! GET INFO FROM THE MED FILE OBJECT
1407  CALL get_obj(hash,file_id,med_id,ierr)
1408  IF(ierr.NE.0) THEN
1409  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1410  & 'GET_MESH_NPLAN_MED:GET_OBJ'
1411  RETURN
1412  ENDIF
1413 !
1414  fid = med_obj_tab(med_id)%ID
1415 ! INITIALISATION
1416  ! Looping on all parameter to check if nplan is in
1417  CALL mprnpr(fid,nparam,ierr)
1418  IF(ierr.NE.0) THEN
1419  error_message = 'ERROR IN '//
1420  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1421  & 'GET_MESH_NPLAN_MED:MPRNPR'
1422  RETURN
1423  ENDIF
1424  found = .false.
1425  DO i=1,nparam
1426  CALL mprpri(fid,i,pname,ityp,desc,dtunit,nstep,ierr)
1427  IF(ierr.NE.0) THEN
1428  error_message = 'ERROR IN '//
1429  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1430  & 'GET_MESH_NPLAN_MED:MPRNPR'
1431  RETURN
1432  ENDIF
1433  IF(pname(1:5).EQ.'DATE') THEN
1434  found = .true.
1435  ENDIF
1436  ENDDO
1437  IF(found) THEN
1438  pname = 'DATE'//char(0)
1439  CALL mprivr(fid,pname,med_no_dt,med_no_it,mydate,ierr)
1440  IF(ierr.NE.0) THEN
1441  error_message = 'ERROR IN '//
1442  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1443  & 'GET_MESH_NPLAN_MED:MPRIVR'
1444  RETURN
1445  ENDIF
1446  date(1) = mydate/10000
1447  mydate = mydate - date(1)*10000
1448  date(2) = mydate/100
1449  mydate = mydate - date(2)*100
1450  date(3) = mydate
1451  pname = 'TIME'//char(0)
1452  CALL mprivr(fid,pname,med_no_dt,med_no_it,mydate,ierr)
1453  IF(ierr.NE.0) THEN
1454  error_message = 'ERROR IN '//
1455  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1456  & 'GET_MESH_NPLAN_MED:MPRIVR'
1457  RETURN
1458  ENDIF
1459  date(4) = mydate/10000
1460  mydate = mydate - date(4)*10000
1461  date(5) = mydate/100
1462  mydate = mydate - date(5)*100
1463  date(6) = mydate
1464  ELSE
1465  date(:) = 0
1466  ENDIF
1467 !
1468 #else
1469 !
1470  date(:) = 0
1471 ! MED LIBRARY NOT LOADED
1473 !
1474 #endif
1475 !
1476  RETURN
1477  END SUBROUTINE
1478 !
1479 !-----------------------------------------------------------------------
1480 !
1481  SUBROUTINE get_bnd_ipobo_med(FILE_ID,TYPE_ELEM_BND,NPOIN,
1482  & IPOBO,IERR)
1483 !
1484 !BRIEF DETERMINES THE TABLE IPOBO: 1 IF BOUNDARY NODE, 0 OTHERWISE
1485 !
1486 !WARNING ONLY WORKS FOR ONE TYPE OF BOUNDARY ELEMENTS
1487 !
1488 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1489 !| FILE_ID |<--| MED FILE DESCRIPTOR
1490 !| TYPE_ELEM_BND |<--| BOUNDARY ELEMENT TYPE IN SLF FORMAT
1491 !| NPOIN |<--| TOTAL NUMBER OF NODES
1492 !| IPOBO |-->| LOGICAL TABLE FOR BOUNDARY NODES
1493 !| IERR |-->| ERROR TAG
1494 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1495 !
1496  IMPLICIT NONE
1497 !
1498  INTEGER, INTENT(IN) :: FILE_ID, TYPE_ELEM_BND, NPOIN
1499  INTEGER, INTENT(INOUT) :: IPOBO(npoin)
1500  INTEGER, INTENT(OUT) :: IERR
1501 !
1502 #if defined (HAVE_MED)
1503 !
1504  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
1505 !
1506  INTEGER :: I,J, MED_ID
1507  INTEGER :: NDP_BND_ELE ! NUMBER OF NODES PER ELEMENT
1508  INTEGER :: TYPE_ELEM_MED
1509  INTEGER, ALLOCATABLE :: BND_IKLE(:)
1510  INTEGER, ALLOCATABLE :: NBOR(:)
1511  INTEGER :: NELEM
1512  INTEGER :: NPTFR
1513  INTEGER(KIND=KID) :: FID
1514 !
1515 !-----------------------------------------------------------------------
1516 !
1517 ! INITIALISATION
1518  DO i = 1, npoin
1519  ipobo(i) = 0
1520  ENDDO
1521 !
1522 ! GET INFO FROM THE MED FILE OBJECT
1523  CALL get_obj(hash,file_id,med_id,ierr)
1524  IF(ierr.NE.0) THEN
1525  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1526  & 'GET_BND_IPOBO_MED:GET_OBJ'
1527  RETURN
1528  ENDIF
1529  mname = med_obj_tab(med_id)%MESH_NAME
1530  IF(med_obj_tab(med_id)%NO_BND) THEN
1531  ierr = 0
1532  RETURN
1533  ENDIF
1534 !
1535  fid = med_obj_tab(med_id)%ID
1536 ! CONVERTS TYPE OF ELEMENTS
1537  CALL convert_elem_type(type_elem_bnd, type_elem_med, ierr)
1538  IF(ierr.NE.0) THEN
1539  error_message = 'ERROR IN '//
1540  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1541  & 'GET_BND_IPOBO_MED:CONVERT_ELEM_TYPE'
1542  RETURN
1543  ENDIF
1544 !
1545 ! Identify bnd element if necessary
1546  CALL identify_bnd_elmt(file_id,type_elem_bnd,ierr)
1547  IF(ierr.NE.0) THEN
1548  error_message = 'ERROR IN '//
1549  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1550  & 'GET_BND_IPOBO_MED:IDENTIFY_BND_ELMT'
1551  RETURN
1552  ENDIF
1553 !
1554 ! DETERMINE THE NUMBER OF NODES PER ELEMENT FROM THE TYPE
1555  CALL ndp_from_element_type_med(type_elem_med,ndp_bnd_ele,ierr)
1556  IF(ierr.NE.0) THEN
1557  error_message = 'ERROR IN '//
1558  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1559  & 'GET_BND_IPOBO_MED:NDP_FROM_ELT_TYPE_MED'
1560  RETURN
1561  ENDIF
1562 !
1563 ! Get the number of element of the boundary type
1564  CALL get_mesh_nelem_med(file_id,type_elem_bnd,nelem,ierr)
1565  IF(ierr.NE.0) THEN
1566  error_message = 'ERROR IN '//
1567  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1568  & 'GET_BND_IPOBO_MED:GET_MESH_NELEM_MED'
1569  RETURN
1570  ENDIF
1571 !
1572 !
1573  IF(type_elem_bnd.EQ.point_bnd_elt_type) THEN
1574  CALL get_bnd_npoin_med(file_id,type_elem_bnd,nptfr,ierr)
1575  IF(ierr.NE.0) THEN
1576  error_message = 'ERROR IN '//
1577  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1578  & 'GET_BND_IPOBO_MED:GET_BND_NPOIN'
1579  RETURN
1580  ENDIF
1581  ALLOCATE(nbor(nptfr),stat=ierr)
1582  IF(ierr.NE.0) THEN
1583  error_message = 'ERROR IN '//
1584  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1585  & 'ALLOCATING NBOR'
1586  RETURN
1587  ENDIF
1588 
1589  CALL get_bnd_numbering_med(file_id,type_elem_bnd,nptfr,
1590  & nbor,ierr)
1591  IF(ierr.NE.0) THEN
1592  error_message = 'ERROR IN '//
1593  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1594  & 'GET_BND_IPOBO_MED:GET_BND_NPOIN'
1595  RETURN
1596  ENDIF
1597  DO i = 1, nptfr
1598  ipobo(nbor(i)) = 1
1599  ENDDO
1600  DEALLOCATE(nbor)
1601  ELSE
1602 ! READ THE ONNECTIVITY TABLE OF THE BOUNDARY ELEMENTS
1603  ALLOCATE(bnd_ikle(ndp_bnd_ele*nelem),stat=ierr)
1604  IF(ierr.NE.0) THEN
1605  error_message = 'ERROR IN '//
1606  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1607  & 'ALLOCATING GET_BND_IPOBO_MED:BND_IKLE'
1608  RETURN
1609  ENDIF
1610 !
1611  CALL mmhcyr(fid,mname,med_no_dt,med_no_it,med_cell,
1612  & type_elem_med,med_nodal,med_no_interlace,bnd_ikle,ierr)
1613  IF(ierr.NE.0) THEN
1614  error_message = 'ERROR IN '//
1615  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1616  & 'GET_BND_IPOBO_MED:MMHCYR'
1617  RETURN
1618  ENDIF
1619 ! LOOP ON THE BOUNDARY ELEMENTS TO MODIFY IPOBO
1620  DO i = 1, nelem
1621  ! Skipping non boundary elements
1622  IF(.NOT.med_obj_tab(med_id)%IS_BND(i)) cycle
1623  DO j=1,ndp_bnd_ele
1624  ipobo(bnd_ikle((j-1)*nelem+i)) = 1
1625  ENDDO
1626  ENDDO
1627 !
1628 ! FREE MEMORY
1629  DEALLOCATE(bnd_ikle)
1630  ENDIF
1631 !
1632 #else
1633 !
1634 ! MED LIBRARY NOT LOADED
1636 !
1637 #endif
1638  RETURN
1639  END SUBROUTINE
1640 !
1641 !-----------------------------------------------------------------------
1642 !
1643  SUBROUTINE get_bnd_numbering_med(FILE_ID,TYPE_ELEM_BND,NPTFR,
1644  & NBOR,IERR)
1645 !
1646 !BRIEF GET THE TABLE OF THE BOUNDARY NODES
1647 !
1648 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1649 !| FILE_ID |<--| MED FILE DESCRIPTOR
1650 !| TYPE_ELEM_BND |<--| BOUNDARY ELEMENT TYPE IN SLF FORMAT
1651 !| NPTFR |<--| TOTAL NUMBER OF BOUNDARY NODES
1652 !| NBOR |-->| LOGICAL TABLE FOR BOUNDARY NODES
1653 !| IERR |-->| ERROR TAG
1654 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1655 !
1656  IMPLICIT NONE
1657 !
1658  INTEGER, INTENT(IN) :: FILE_ID,NPTFR,TYPE_ELEM_BND
1659  INTEGER, INTENT(INOUT) :: NBOR(nptfr)
1660  INTEGER, INTENT(OUT) :: IERR
1661 !
1662 #if defined HAVE_MED
1663 !
1664  INTEGER :: NELEBD,NDP,I,J
1665  INTEGER :: MED_ID,TYPE_ELEM_MED
1666  INTEGER, ALLOCATABLE :: IKLE(:)
1667  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
1668 !
1669  INTEGER :: ISUIV, NOEUD1, NOEUD2
1670  INTEGER :: IILE,NILE,NPOIN,NELEM
1671  INTEGER, ALLOCATABLE :: TRAV1(:,:)
1672  INTEGER, ALLOCATABLE :: KP1BOR(:)
1673  DOUBLE PRECISION :: SOM1,SOM2,Y2
1674  DOUBLE PRECISION, PARAMETER :: EPSILO = 1.d-6
1675  DOUBLE PRECISION, ALLOCATABLE :: X(:),Y(:)
1676  LOGICAL :: SWAP
1677  INTEGER(KIND=KID) :: FID
1678 !
1679 !-----------------------------------------------------------------------
1680 !
1681 ! GET INFO FROM THE MED FILE OBJECT
1682  CALL get_obj(hash,file_id,med_id,ierr)
1683  IF(ierr.NE.0) THEN
1684  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
1685  & 'GET_BND_NUMBERING_MED:GET_OBJ'
1686  RETURN
1687  ENDIF
1688  mname = med_obj_tab(med_id)%MESH_NAME
1689  fid = med_obj_tab(med_id)%ID
1690 !
1691  IF(med_obj_tab(med_id)%NO_BND) THEN
1692  ierr = 0
1693  RETURN
1694  ENDIF
1695 
1696  IF(type_elem_bnd.EQ.point_bnd_elt_type) THEN
1697 !
1698  CALL mmhcyr(fid,mname,med_no_dt,med_no_it,med_cell,
1699  & med_point1,med_nodal,med_no_interlace,nbor,ierr)
1700  IF(ierr.NE.0) THEN
1701  error_message = 'ERROR IN '//
1702  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1703  & 'GET_BND_CONNECTIVITY_MED:MMHCYR'
1704  RETURN
1705  ENDIF
1706 !
1707  ELSE IF(ALLOCATED(med_obj_tab(med_id)%NBOR)) THEN
1708 !
1709  DO i=1,nptfr
1710  nbor(i) = med_obj_tab(med_id)%NBOR(i)
1711  ENDDO
1712 !
1713  ELSE
1714 !
1715 ! OTHERWISE COMPUTING NBOR
1716 ! CONVERTS TYPE OF ELEMENTS
1717  CALL convert_elem_type(type_elem_bnd, type_elem_med, ierr)
1718  IF(ierr.NE.0) THEN
1719  error_message = 'ERROR IN '//
1720  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1721  & 'GET_BND_NUMBERING_MED:CONVERT_ELEM_TYPE'
1722  RETURN
1723  ENDIF
1724 !
1725 ! Identify bnd element if necessary
1726  CALL identify_bnd_elmt(file_id,type_elem_bnd,ierr)
1727  IF(ierr.NE.0) THEN
1728  error_message = 'ERROR IN '//
1729  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1730  & 'GET_BND_IPOBO_MED:IDENTIFY_BND_ELMT'
1731  RETURN
1732  ENDIF
1733 !
1734 ! DETERMINE THE NUMBER OF NODES PER ELEMENT FROM THE TYPE
1735  CALL ndp_from_element_type_med(type_elem_med,ndp,ierr)
1736  IF(ierr.NE.0) THEN
1737  error_message = 'ERROR IN '//
1738  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1739  & 'GET_BND_NUMBERING_MED:NDP_FROM_ELT_TYPE_MED'
1740  RETURN
1741  ENDIF
1742 !
1743 ! Get the number of element of the boundary type
1744  CALL get_mesh_nelem_med(file_id,type_elem_bnd,nelem,ierr)
1745  IF(ierr.NE.0) THEN
1746  error_message = 'ERROR IN '//
1747  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1748  & 'GET_BND_NUMBERING_MED:GET_MESH_NELEM_MED'
1749  RETURN
1750  ENDIF
1751 !
1752 ! READ THE CONNECTIVITY TABLE OF THE ELEMENTS
1753  ALLOCATE(ikle(ndp*nelem),stat=ierr)
1754  IF(ierr.NE.0) THEN
1755  error_message = 'ERROR IN '//
1756  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1757  & 'ALLOCATING GET_BND_NUMBERING_MED:BND_IKLE'
1758  RETURN
1759  ENDIF
1760 !
1761  CALL mmhcyr(fid,mname,med_no_dt,med_no_it,med_cell,
1762  & type_elem_med,med_nodal,med_no_interlace,ikle,ierr)
1763  IF(ierr.NE.0) THEN
1764  error_message = 'ERROR IN '//
1765  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1766  & 'GET_BND_NUMBERING_MED:MMHCYR'
1767  RETURN
1768  ENDIF
1769 !
1770 ! REORDER THE BOUNDARY POINT TO COMPLY WITH TELEMAC CONVENTION (SEE DOCUMENTATION)
1771  CALL get_mesh_npoin_med(file_id,type_elem_bnd,npoin,ierr)
1772  IF(ierr.NE.0) THEN
1773  error_message = 'ERROR IN '//
1774  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1775  & 'GET_BND_NUMBERING_MED:GET_MESH_COORD_MED:X'
1776  RETURN
1777  ENDIF
1778 !
1779  ALLOCATE(trav1(nptfr,2),stat=ierr)
1780  IF(ierr.NE.0) THEN
1781  error_message = 'ERROR IN '//
1782  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1783  & 'ALLOCATING GET_BND_NUMBERING_MED:TRAV1'
1784  RETURN
1785  ENDIF
1786 
1787  ALLOCATE(kp1bor(nptfr*2),stat=ierr)
1788  IF(ierr.NE.0) THEN
1789  error_message = 'ERROR IN '//
1790  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1791  & 'ALLOCATING GET_BND_NUMBERING_MED:KP1BOR'
1792  RETURN
1793  ENDIF
1794 
1795  ALLOCATE(med_obj_tab(med_id)%PT2SEG(nptfr,2),stat=ierr)
1796  IF(ierr.NE.0) THEN
1797  error_message = 'ERROR IN '//
1798  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1799  & 'ALLOCATING GET_BND_NUMBERING_MED:PT2SEG'
1800  RETURN
1801  ENDIF
1802 !
1803 ! Only take into account the real boundary elements
1804  nelebd = 0
1805  DO i=1,nelem
1806  ! Skipping non boundary elements
1807  IF(.NOT.med_obj_tab(med_id)%IS_BND(i)) cycle
1808  nelebd = nelebd + 1
1809  trav1(nelebd,1) = ikle(i)
1810  trav1(nelebd,2) = ikle(i+nelem)
1811  ENDDO
1812  ! Initialising boundary element renumbering
1813  ALLOCATE(med_obj_tab(med_id)%NBOR_SEG(nelebd))
1814  j = 0
1815  DO i=1,nelem
1816  ! Skipping non boundary elements
1817  IF(.NOT.med_obj_tab(med_id)%IS_BND(i)) cycle
1818  j = j + 1
1819  med_obj_tab(med_id)%NBOR_SEG(j) = j
1820  ENDDO
1821 !
1822 ! GET MESH COORDINATES
1823  ALLOCATE(x(npoin),stat=ierr)
1824  IF(ierr.NE.0) THEN
1825  error_message = 'ERROR IN '//
1826  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1827  & 'ALLOCATING GET_BND_NUMBERING_MED:X'
1828  RETURN
1829  ENDIF
1830  ALLOCATE(y(npoin),stat=ierr)
1831  IF(ierr.NE.0) THEN
1832  error_message = 'ERROR IN '//
1833  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1834  & 'ALLOCATING GET_BND_NUMBERING_MED:Y'
1835  RETURN
1836  ENDIF
1837  CALL get_mesh_coord_med(file_id,1,2,npoin,x,ierr)
1838  IF(ierr.NE.0) THEN
1839  error_message = 'ERROR IN '//
1840  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1841  & 'GET_BND_NUMBERING_MED:GET_MESH_COORD_MED:X'
1842  RETURN
1843  ENDIF
1844  CALL get_mesh_coord_med(file_id,2,2,npoin,y,ierr)
1845  IF(ierr.NE.0) THEN
1846  error_message = 'ERROR IN '//
1847  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
1848  & 'GET_BND_NUMBERING_MED:GET_MESH_COORD_MED:Y'
1849  RETURN
1850  ENDIF
1851 !
1852 ! EDGE ARE STORED CONTINUOUSLY
1853 ! IT STARTS WITH SOUTH-WESTERNMOST POINT (OR SOUTHMORE POINT IN CASE OF
1854 ! CONFLICT) IN ORDER TO START ON THE BOUNDARY AND NOT ON A ISLAND
1855  som2 = x(1) + y(1)
1856  y2 = y(1)
1857 !
1858  DO i=1,nptfr
1859 !
1860  som1 = x(trav1(i,1)) + y(trav1(i,1))
1861  IF (abs(som1-som2).LE.abs(epsilo*som1)) THEN
1862  IF (y(trav1(i,1)).LE.y2) THEN
1863  y2 = y(trav1(i,1))
1864  som2 = som1
1865  isuiv = i
1866  ENDIF
1867  ELSEIF (som1.LE.som2) THEN
1868  y2 = y(trav1(i,1))
1869  som2 = som1
1870  isuiv = i
1871  ENDIF
1872 !
1873  ENDDO
1874 !
1875  noeud1 = trav1(isuiv,1)
1876  noeud2 = trav1(isuiv,2)
1877  trav1(isuiv,1) = trav1(1,1)
1878  trav1(isuiv,2) = trav1(1,2)
1879  trav1(1,1) = noeud1
1880  trav1(1,2) = noeud2
1881  noeud1 = med_obj_tab(med_id)%NBOR_SEG(isuiv)
1882  med_obj_tab(med_id)%NBOR_SEG(isuiv) =
1883  & med_obj_tab(med_id)%NBOR_SEG(1)
1884  med_obj_tab(med_id)%NBOR_SEG(1) = noeud1
1885 !
1886  iile = 0
1887  nile = 1
1888 !
1889  DO i=2,nptfr
1890  swap = .false.
1891  med_obj_tab(med_id)%PT2SEG(i,1) =
1892  & med_obj_tab(med_id)%NBOR_SEG(i-1)
1893 !
1894 ! SEACH OF THE EDGE WHOSE FIRST NODE IS IDENTICAL TO THE SECOND ONE
1895 ! OF THE PREVIOUS EDGE
1896  DO isuiv=i,nptfr
1897 !
1898  IF (trav1(isuiv,1).EQ.trav1(i-1,2)) THEN
1899 !
1900 ! PERMUTATION OF EDGE WITH NUMBER I+1 AND ISUIV
1901  noeud1 = trav1(isuiv,1)
1902  noeud2 = trav1(isuiv,2)
1903  trav1(isuiv,1) = trav1(i,1)
1904  trav1(isuiv,2) = trav1(i,2)
1905  trav1(i,1) = noeud1
1906  trav1(i,2) = noeud2
1907  noeud1 = med_obj_tab(med_id)%NBOR_SEG(isuiv)
1908  med_obj_tab(med_id)%NBOR_SEG(isuiv) =
1909  & med_obj_tab(med_id)%NBOR_SEG(i)
1910  med_obj_tab(med_id)%NBOR_SEG(i) = noeud1
1911  kp1bor(i+nptfr) = i-1
1912  kp1bor(i-1) = i
1913  swap = .true.
1914  EXIT
1915 !
1916  ENDIF
1917 !
1918  ENDdo! ISUIV
1919  IF(.NOT.swap) THEN
1920  DO isuiv=i,nptfr
1921 !
1922  IF (trav1(isuiv,2).EQ.trav1(i-1,2)) THEN
1923 !
1924 ! PERMUTATION OF EDGE WITHIN ITSELF
1925  noeud1 = trav1(isuiv,2)
1926  noeud2 = trav1(isuiv,1)
1927  trav1(isuiv,1) = trav1(i,1)
1928  trav1(isuiv,2) = trav1(i,2)
1929  trav1(i,1) = noeud1
1930  trav1(i,2) = noeud2
1931  noeud1 = med_obj_tab(med_id)%NBOR_SEG(isuiv)
1932  med_obj_tab(med_id)%NBOR_SEG(isuiv) =
1933  & med_obj_tab(med_id)%NBOR_SEG(i)
1934  med_obj_tab(med_id)%NBOR_SEG(i) = noeud1
1935  kp1bor(i+nptfr) = i-1
1936  kp1bor(i-1) = i
1937  swap = .true.
1938  EXIT
1939 !
1940  ENDIF
1941 !
1942  ENDdo! ISUIV
1943  ENDIF
1944  med_obj_tab(med_id)%PT2SEG(i,2) =
1945  & med_obj_tab(med_id)%NBOR_SEG(i)
1946  IF(swap) cycle
1947 !
1948 ! IF NO FOLLOWING POINT IS FOUND, WE VERIFY THAT THE LAST AND THE FIRST
1949 ! POINTS ARE IDENTICAL. IT MEANS WE FOUND AN ISLAND, SO WE RETURN TO THE
1950 ! GLOBAL LOOP
1951  IF (trav1(nile,1).NE.trav1(i-1,2)) THEN
1952 !
1953 ! OTHERWISE IT IS AN ERROR
1954  WRITE(error_message,4500) trav1(i-1,2)
1955 4500 FORMAT(1x,'ERROR IN THE EDGE SEGMENTS MISSING SEGMENT',/,
1956  & 1x,'FOR THE NODE ',i5)
1957  ierr = -1
1958  RETURN
1959  ENDIF
1960 !
1961  kp1bor(nile+nptfr) = i-1
1962  kp1bor(i-1) = nile
1963  med_obj_tab(med_id)%PT2SEG(nile,1) =
1964  & med_obj_tab(med_id)%NBOR_SEG(i-1)
1965  med_obj_tab(med_id)%PT2SEG(nile,2) =
1966  & med_obj_tab(med_id)%NBOR_SEG(nile)
1967  iile = iile+1
1968  nile = i
1969 !
1970  ENDdo! I
1971 !
1972 ! WE VERIFY THAT THE LAST ISLAND IS CLOSED
1973  IF (trav1(nile,1).NE.trav1(nptfr,2)) THEN
1974  WRITE(error_message,5000) trav1(nile,1),trav1(nptfr,2)
1975 5000 FORMAT(1x,'ERROR, THE BOUNDARY IS NOT CLOSED :',/,
1976  & 1x,'FIRST POINT :',i5,2x,'LAST POINT : ',i5)
1977  ierr = -1
1978  RETURN
1979  ENDIF
1980 !
1981  kp1bor(nile+nptfr) = nptfr
1982  kp1bor(nptfr) = nile
1983  med_obj_tab(med_id)%PT2SEG(nile,1) =
1984  & med_obj_tab(med_id)%NBOR_SEG(nptfr)
1985  med_obj_tab(med_id)%PT2SEG(nile,2) =
1986  & med_obj_tab(med_id)%NBOR_SEG(nile)
1987 !
1988 ! THE TABLE NBOR IS FILLED AND THE COLOR OF THE BOUNDARY NODES IS STORED
1989 ! IN THE TABLE NCOLFR
1990  ALLOCATE(med_obj_tab(med_id)%NBOR(nptfr))
1991  DO i=1,nptfr
1992  nbor(i ) = trav1(i,1)
1993  med_obj_tab(med_id)%NBOR(i) = nbor(i)
1994  ENDDO
1995 
1996  DEALLOCATE(ikle)
1997  DEALLOCATE(x,y)
1998  DEALLOCATE(trav1)
1999  DEALLOCATE(kp1bor)
2000  ENDIF
2001 #else
2002 !
2003 ! MED LIBRARY NOT LOADED
2005 !
2006 #endif
2007  RETURN
2008  END SUBROUTINE
2009 !
2010 !-----------------------------------------------------------------------
2011 !
2012  SUBROUTINE get_bnd_nelem_med (FILE_ID, TYPE_ELEM, BND_NELEM, IERR)
2013 !
2014 !BRIEF READS THE TOTAL NUMBER OF BOUNDARY ELEMENTS FOR A GIVEN TYPE
2015 ! OF BOUNDARY ELEMENT
2016 !
2017 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2018 !| FILE_ID |<--| MED FILE DESCRIPTOR
2019 !| TYPE_ELEM |<--| TYPE OF ELEMENT IN SLF FORMAT
2020 !| BND_NELEM |-->| NUMBER OF BOUNDARY ELEMENTS
2021 !| IERR |-->| ERROR TAG
2022 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2023 !
2024  IMPLICIT NONE
2025 !
2026  INTEGER, INTENT(IN) :: FILE_ID
2027  INTEGER, INTENT(IN) :: TYPE_ELEM
2028  INTEGER, INTENT(OUT) :: BND_NELEM
2029  INTEGER, INTENT(OUT) :: IERR
2030 !
2031 #if defined (HAVE_MED)
2032  INTEGER :: MED_ID, TYPE_ELEM_MED
2033 !
2034 !-----------------------------------------------------------------------
2035 !
2036 ! GET INFO FROM THE MED FILE OBJECT
2037  CALL get_obj(hash,file_id,med_id,ierr)
2038  IF(ierr.NE.0) THEN
2039  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2040  & 'GET_BND_NELEM_MED:MMHCYR'
2041  RETURN
2042  ENDIF
2043 !
2044 ! CONVERTS TYPE OF ELEMENTS
2045  CALL convert_elem_type(type_elem, type_elem_med, ierr)
2046  IF(ierr.NE.0) THEN
2047  error_message = 'ERROR IN '//
2048  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2049  & 'GET_BND_NELEM_MED:CONVERT_ELEM_TYPE'
2050  RETURN
2051  ENDIF
2052 !
2053 ! Identify bnd element if necessary
2054  CALL identify_bnd_elmt(file_id,type_elem,ierr)
2055  IF(ierr.NE.0) THEN
2056  error_message = 'ERROR IN '//
2057  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2058  & 'GET_BND_NELEM_MED:IDENTIFY_BND_ELMT'
2059  RETURN
2060  ENDIF
2061 !
2062  IF(med_obj_tab(med_id)%NO_BND) THEN
2063  ierr = 0
2064  bnd_nelem = 0
2065  RETURN
2066  ENDIF
2067 !
2068 ! Compute the total number of element
2069  bnd_nelem = count(med_obj_tab(med_id)%IS_BND)
2070 !
2071 #else
2072 !
2073  bnd_nelem = 0
2074 ! MED LIBRARY NOT LOADED
2076 !
2077 #endif
2078 !
2079  RETURN
2080  END SUBROUTINE
2081 !
2082 !-----------------------------------------------------------------------
2083 !
2084  SUBROUTINE get_bnd_connectivity_med (FILE_ID, TYPE_ELEM, NELEBD,
2085  & NDP, BND_IKLE, IERR)
2086 !
2087 !BRIEF READS THE CONNECTIVITY TABLE OF BOUNDARY ELEMENTS FOR A GIVEN
2088 ! TYPE OF BOUNDARY ELEMENT
2089 !
2090 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2091 !| FILE_ID |<--| MED FILE DESCRIPTOR
2092 !| TYPE_ELEM |<--| TYPE OF THE ELEMENT IN MED FORMAT
2093 !| NELEBD |<--| TOTAL NUMBER OF ELEMENTS
2094 !| NDP |<--| NUMBER OF NODES PER ELEMENT
2095 !| BND_IKLE |-->| CONNECTIVITY TABLE OF BOUNDARY ELEMENTS
2096 !| IERR |-->| ERROR TAG
2097 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2098 !
2099  IMPLICIT NONE
2100 !
2101  INTEGER, INTENT(IN) :: FILE_ID
2102  INTEGER, INTENT(IN) :: NELEBD
2103  INTEGER, INTENT(IN) :: NDP
2104  INTEGER, INTENT(IN) :: TYPE_ELEM
2105  INTEGER, INTENT(INOUT) :: BND_IKLE(nelebd*ndp)
2106  INTEGER, INTENT(OUT) :: IERR
2107 !
2108 #if defined (HAVE_MED)
2109  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
2110 !
2111  INTEGER :: TYPE_ELEM_MED,MED_ID
2112  INTEGER,ALLOCATABLE :: IKLE(:)
2113  INTEGER :: IBND,NELEM,I
2114  INTEGER(KIND=KID) ::FID
2115 !
2116 !-----------------------------------------------------------------------
2117 !
2118 ! GET INFO FROM THE MED FILE OBJECT
2119  CALL get_obj(hash,file_id,med_id,ierr)
2120  IF(ierr.NE.0) THEN
2121  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2122  & 'GET_BND_CONNECTIVITY_MED:GET_OBJ'
2123  RETURN
2124  ENDIF
2125  mname = med_obj_tab(med_id)%MESH_NAME
2126 
2127 !
2128  fid = med_obj_tab(med_id)%ID
2129 ! CONVERT
2130  CALL convert_elem_type(type_elem, type_elem_med, ierr)
2131  IF(ierr.NE.0) THEN
2132  error_message = 'ERROR IN '//
2133  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2134  & 'GET_BND_CONNECTIVITY_MED:CONVERT'
2135  RETURN
2136  ENDIF
2137 !
2138 ! Identify bnd element if necessary
2139  CALL identify_bnd_elmt(file_id,type_elem,ierr)
2140  IF(ierr.NE.0) THEN
2141  error_message = 'ERROR IN '//
2142  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2143  & 'GET_BND_CONNECTIVITY_MED:IDENTIFY_BND_ELMT'
2144  RETURN
2145  ENDIF
2146 
2147  IF(med_obj_tab(med_id)%NO_BND) THEN
2148  ierr = 0
2149  RETURN
2150  ENDIF
2151 !
2152  CALL get_mesh_nelem_med(file_id,type_elem,nelem,ierr)
2153  IF(ierr.NE.0) THEN
2154  error_message = 'ERROR IN '//
2155  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2156  & 'GET_BND_CONNECTIVITY_MED:GET_MESH_NELEM'
2157  RETURN
2158  ENDIF
2159  IF(nelem.GT.0) THEN
2160  ALLOCATE(ikle(nelem*ndp),stat=ierr)
2161  IF(ierr.NE.0) THEN
2162  error_message = 'ERROR IN '//
2163  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2164  & 'ALLOCATING GET_BND_CONNECTIVITY_MED:IKLE'
2165  RETURN
2166  ENDIF
2167 ! Read the connectivity table of the elements
2168  CALL mmhcyr(fid,mname,med_no_dt,med_no_it,med_cell,
2169  & type_elem_med,med_nodal,med_no_interlace,ikle,ierr)
2170  IF(ierr.NE.0) THEN
2171  error_message = 'ERROR IN '//
2172  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2173  & 'GET_BND_CONNECTIVITY_MED:MMHCYR'
2174  RETURN
2175  ENDIF
2176 !
2177  ! Compute the boundary elements connectivity table
2178  ibnd = 0
2179  DO i=1,nelem
2180  ! Skipping no boundary elements
2181  IF(.NOT.med_obj_tab(med_id)%IS_BND(i)) cycle
2182  ibnd = ibnd + 1
2183  bnd_ikle(ibnd) = ikle(i)
2184  bnd_ikle(ibnd+nelebd) = ikle(i+nelem)
2185  ENDDO
2186  DEALLOCATE(ikle)
2187  ENDIF
2188 !
2189 #else
2190 !
2191 ! MED LIBRARY NOT LOADED
2193 !
2194 #endif
2195 !
2196  RETURN
2197  END SUBROUTINE
2198 !
2199 !-----------------------------------------------------------------------
2200 !
2201  SUBROUTINE get_bnd_grp_value_med (FILE_ID, GRP_NAME, VALUE, IERR)
2202 !
2203 !BRIEF GIVES THE VALUE OF THE BOUNDARY CONDITIONS ASSOCIATED TO A
2204 ! FAMILY NAME
2205 !
2206 !WARNING THIS FUNCTION COULD BE OPTIMIZED BY READING ALL THE INFO AT
2207 ! THE BEGINNING. HOWEVER THE COST IT LOW AS THE SIZE OF THE FILE
2208 ! IS LIMITED (I.E. TOTAL NUMBER OF GROUP
2209 !
2210 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2211 !| FILE_ID |<--| MED FILE DESCRIPTOR
2212 !| GRP_NAME |<--| NAME OF THE FAMILY
2213 !| VALUE |-->| VALUE OF THE BOUNDARY CONDITIONS
2214 !| IERR |-->| ERROR TAG
2215 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2216 !
2217  IMPLICIT NONE
2218 !
2219  INTEGER, INTENT(IN) :: FILE_ID
2220  CHARACTER(LEN=16), INTENT(IN) :: GRP_NAME
2221  INTEGER, INTENT(INOUT) :: VALUE
2222  INTEGER, INTENT(OUT) :: IERR
2223 !
2224  INTEGER :: NCLI,MED_ID,I1,I2,I3,I4,I
2225  INTEGER :: NGROUP
2226  CHARACTER(LEN=16) :: TEMP_NAME
2227  LOGICAL :: FOUND
2228 !
2229 !-----------------------------------------------------------------------
2230 !
2231 ! GET INFO FROM THE MED FILE OBJECT
2232  CALL get_obj(hash,file_id,med_id,ierr)
2233  IF(ierr.NE.0) THEN
2234  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2235  & 'GET_BND_GRP_VALUE_MED:MMHCYR'
2236  RETURN
2237  ENDIF
2238  ncli = med_obj_tab(med_id)%NCLI
2239  IF(med_obj_tab(med_id)%NO_BND) THEN
2240  ierr = 0
2241  RETURN
2242  ENDIF
2243 !
2244 ! INITIALIZATION
2245  found = .false.
2246  ierr = 0
2247  rewind(ncli)
2248 !
2249 ! LOOP ON THE INFO IN THE FILE
2250  READ(unit=ncli,fmt=*,iostat=ierr) ngroup
2251  IF(ierr.NE.0) THEN
2252  error_message = 'ERROR IN '//
2253  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2254  & 'GET_BND_GRP_VALUE:READ'
2255  RETURN
2256  ENDIF
2257  DO i=1,ngroup
2258  READ(unit=ncli,fmt=*,iostat=ierr) i1,i2,i3,i4,temp_name
2259  IF(ierr.NE.0) THEN
2260  error_message = 'ERROR IN '//
2261  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2262  & 'GET_BND_GRP_VALUE:READ'
2263  RETURN
2264  ENDIF
2265 !
2266 ! IF THE FAMILY IS FOUND, THE VALUE IS STORED
2267  IF (temp_name .EQ. grp_name) THEN
2268  found = .true.
2269  VALUE = i1*1000+i2*100+i3*10+i4
2270  EXIT
2271  ENDIF
2272  ENDDO
2273 !
2274  IF(.NOT.found) ierr = hermes_unknown_group_err
2275 !
2276  RETURN
2277  END SUBROUTINE
2278 !
2279 !-----------------------------------------------------------------------
2280 !
2281  SUBROUTINE get_bnd_family_med (FILE_ID, TYPE_BND_ELEM, NELEBD,
2282  & FAMILY, IERR)
2283 !
2284 !BRIEF CREATE THE FAMILY NAME FOR EACH BOUNDARY ELEMENT
2285 !
2286 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2287 !| FILE_ID |<--| MED FILE DESCRIPTOR
2288 !| TYPE_BND_ELEM |<--| TYPE OF THE BOUNDARY ELEMENT
2289 !| NELEBD |<--| TOTAL NUMBER OF BOUNDARY ELEMENTS
2290 !| FAMILY |-->| TABLE OF BOUNDARY ELEMENT'S FAMILY NAME
2291 !| IERR |-->| ERROR TAG
2292 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2293 !
2294  IMPLICIT NONE
2295 !
2296  INTEGER, INTENT(IN) :: FILE_ID, TYPE_BND_ELEM, NELEBD
2297  INTEGER, DIMENSION(NELEBD), INTENT(INOUT) :: FAMILY
2298  INTEGER, INTENT(OUT) :: IERR
2299 !
2300 #if defined (HAVE_MED)
2301  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
2302 !
2303  INTEGER :: IELEM, IGRP
2304  INTEGER :: MED_ID, TYPE_ELEM_MED, NB_FAMILY
2305  INTEGER, DIMENSION(:), ALLOCATABLE :: NUM_FAMILY
2306  INTEGER :: NELEM, IBND
2307  INTEGER(KIND=KID) :: FID
2308 !
2309 !-----------------------------------------------------------------------
2310 !
2311 ! GET INFO FROM THE MED FILE OBJECT
2312  CALL get_obj(hash,file_id,med_id,ierr)
2313  IF(ierr.NE.0) THEN
2314  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2315  & 'GET_BND_FAMILY_MED:GET_OBJ_FILE'
2316  RETURN
2317  ENDIF
2318  mname = med_obj_tab(med_id)%MESH_NAME
2319 !
2320  fid = med_obj_tab(med_id)%ID
2321 ! CONVERTS TYPE OF ELEMENTS
2322  CALL convert_elem_type(type_bnd_elem, type_elem_med, ierr)
2323  IF(ierr.NE.0) THEN
2324  error_message = 'ERROR IN '//
2325  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2326  & 'GET_BND_FAMILY_MED:CONVERT_ELEM_TYPE'
2327  RETURN
2328  ENDIF
2329 !
2330 ! Identify bnd element if necessary
2331  CALL identify_bnd_elmt(file_id,type_bnd_elem,ierr)
2332  IF(ierr.NE.0) THEN
2333  error_message = 'ERROR IN '//
2334  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2335  & 'GET_BND_FAMILY_MED:IDENTIFY_BND_ELMT'
2336  RETURN
2337  ENDIF
2338 !
2339  IF(type_bnd_elem.EQ.point_bnd_elt_type) THEN
2340 ! Get the number of elements
2341  CALL get_bnd_nelem_med(file_id,type_bnd_elem,nelem,ierr)
2342  IF(ierr.NE.0) THEN
2343  error_message = 'ERROR IN '//
2344  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2345  & 'GET_BND_FAMILY_MED:GET_MESH_NELEM'
2346  RETURN
2347  ENDIF
2348  ELSE
2349 ! Get the number of elements
2350  CALL get_mesh_nelem_med(file_id,type_bnd_elem,nelem,ierr)
2351  IF(ierr.NE.0) THEN
2352  error_message = 'ERROR IN '//
2353  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2354  & 'GET_BND_FAMILY_MED:GET_MESH_NELEM'
2355  RETURN
2356  ENDIF
2357  ENDIF
2358 !
2359 ! READ THE FAMILY NUMBER FOR EACH ELEMENT
2360  ALLOCATE(num_family(nelem),stat=ierr)
2361  IF(ierr.NE.0) THEN
2362  error_message = 'ERROR IN '//
2363  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2364  & 'ALLOCATING NUM_FAMILY'
2365  RETURN
2366  ENDIF
2367 
2368  CALL mmhfnr(fid,mname,med_no_dt,med_no_it,med_cell,
2369  & type_elem_med,num_family,ierr)
2370  IF(ierr.NE.0) THEN
2371  error_message = 'ERROR IN '//
2372  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2373  & 'GET_BND_FAMILY_MED:MMHFNR'
2374  RETURN
2375  ENDIF
2376 !
2377 ! READ THE TOTAL NUMBER OF FAMILY
2378  CALL mfanfa(fid,mname,nb_family,ierr)
2379  IF(ierr.NE.0) THEN
2380  error_message = 'ERROR IN '//
2381  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2382  & 'GET_BND_FAMILY_MED:MFANFA'
2383  RETURN
2384  ENDIF
2385 !
2386  ibnd = 0
2387  DO ielem = 1, nelem
2388 !
2389  IF(.NOT.med_obj_tab(med_id)%IS_BND(ielem)) cycle
2390 ! LOOP ON FAMILY
2391  ibnd = ibnd + 1
2392  DO igrp = 1, nb_family
2393  ! Skipping non boundary families
2394  IF(med_obj_tab(med_id)%BND_FAM(igrp,2).EQ.0) cycle
2395  IF (num_family(ielem).EQ.
2396  & med_obj_tab(med_id)%BND_FAM(igrp,1)) THEN
2397  family(ibnd) = med_obj_tab(med_id)%BND_FAM(igrp,2)
2398  ENDIF
2399  ENDDO
2400  ENDDO
2401 !
2402 ! FREE MEMORY
2403  DEALLOCATE(num_family)
2404 !
2405 #else
2406 !
2407 ! MED LIBRARY NOT LOADED
2409 !
2410 #endif
2411 !
2412  RETURN
2413  END SUBROUTINE
2414 !
2415 !-----------------------------------------------------------------------
2416 !
2417  SUBROUTINE get_bnd_npoin_med(FILE_ID,TYPE_BND_ELEM,NPTFR,IERR)
2418 !
2419 !BRIEF DETERMINE THE NUMBER OF BOUNDARY POINTS
2420 !
2421 !WARNING FIND ANOTHER SOLUTION THIS ONE IS WAY TOO EXPENSIVE
2422 ! SEE WITH MED PEOPLE IF THER IS ANOTHER WAY
2423 !
2424 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2425 !| FILE_ID |<--| MED FILE DESCRIPTOR
2426 !| TYPE_BND_ELEM |<--| TYPE OF THE BOUNDARY ELEMENT
2427 !| NPTFR |-->| NUMBER OF BOUNDARY NODES
2428 !| IERR |-->| ERROR TAG
2429 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2430 !
2431  IMPLICIT NONE
2432 !
2433  INTEGER, INTENT(IN) :: FILE_ID, TYPE_BND_ELEM
2434  INTEGER, INTENT(OUT) :: NPTFR
2435  INTEGER, INTENT(OUT) :: IERR
2436 !
2437 #if defined (HAVE_MED)
2438  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
2439 !
2440  INTEGER :: CHGT,TSF ! INDICATORS OF MESH MODIF
2441  INTEGER :: MED_ID, TYPE_BND_ELEM_MED
2442  INTEGER :: NELEBD, NPOIN, I, J, NDP
2443  INTEGER, ALLOCATABLE :: IKLE(:)
2444  LOGICAL, ALLOCATABLE :: IS_BND(:)
2445  INTEGER(KIND=KID) :: FID
2446 !
2447 !-----------------------------------------------------------------------
2448 !
2449 ! GET INFO FROM THE MED FILE OBJECT
2450  CALL get_obj(hash,file_id,med_id,ierr)
2451  IF(ierr.NE.0) THEN
2452  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2453  & 'GET_BND_NPOIN_MED:GET_OBJ'
2454  RETURN
2455  ENDIF
2456  mname = med_obj_tab(med_id)%MESH_NAME
2457  fid = med_obj_tab(med_id)%ID
2458 !
2459 ! CONVERTS TYPE OF ELEMENTS
2460  CALL convert_elem_type(type_bnd_elem, type_bnd_elem_med, ierr)
2461  IF(ierr.NE.0) THEN
2462  error_message = 'ERROR IN '//
2463  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2464  & 'GET_BND_NPOIN_MED:CONVERT_ELEM_TYPE'
2465  RETURN
2466  ENDIF
2467 !
2468  nelebd = 0
2469 ! GET THE NUMBER OF BOUNDARY ELEMENTS
2470  CALL get_bnd_nelem_med(file_id,type_bnd_elem,nelebd,ierr)
2471  IF(ierr.NE.0) THEN
2472  error_message = 'ERROR IN '//
2473  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2474  & 'GET_BND_NPOIN_MED:GET_BND_NELEM_MED'
2475  RETURN
2476  ENDIF
2477  IF(type_bnd_elem.EQ.point_bnd_elt_type) THEN
2478  nptfr = nelebd
2479  RETURN
2480  ENDIF
2481 !
2482 ! CONTINUE ONLY IF BOUNDARY ELEMENTS EXIST
2483  IF(nelebd.GT.0) THEN
2484 !
2485 ! GET THE NUMBER OF POINT IN THE MESH
2486  CALL mmhnme(fid,mname,med_no_dt,med_no_it,med_node,
2487  & type_bnd_elem_med,med_coordinate,med_nodal,
2488  & chgt,tsf,npoin,ierr)
2489  IF(ierr.NE.0) THEN
2490  error_message = 'ERROR IN '//
2491  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2492  & 'GET_BND_NPOIN_MED:MMHNME'
2493  RETURN
2494  ENDIF
2495 !
2496 ! GET THE NUMBER OF POINTS PER ELEMENT
2497  CALL get_nodes_per_element(type_bnd_elem,ndp)
2498 !
2499 ! ALLOCATE CONNECTIVITY TABLE OF BOUNDARY ELEMENTS
2500  ALLOCATE(ikle(nelebd*ndp),stat=ierr)
2501  IF(ierr.NE.0) THEN
2502  error_message = 'ERROR IN '//
2503  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2504  & 'ALLOCAING GET_BND_NPOIN_MED:IKLE'
2505  RETURN
2506  ENDIF
2507 !
2508 ! GET THE CONNECTIVITY TABLE FOR THE BOUNDARY ELEMENTS
2509  CALL get_bnd_connectivity_med(file_id, type_bnd_elem, nelebd,
2510  & ndp, ikle, ierr)
2511  IF(ierr.NE.0) THEN
2512  error_message = 'ERROR IN '//
2513  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2514  & 'GET_BND_NPOIN_MED:GET_BND_CONNECTIVITY_MED'
2515  RETURN
2516  ENDIF
2517 !
2518  ALLOCATE(is_bnd(npoin),stat=ierr)
2519  IF(ierr.NE.0) THEN
2520  error_message = 'ERROR IN '//
2521  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2522  & 'ALLOCATING GET_BND_NPOIN_MED:IKLE'
2523  RETURN
2524  ENDIF
2525 !
2526 ! INITIALIZE
2527  DO i=1,npoin
2528  is_bnd(i) = .false.
2529  ENDDO
2530 !
2531 ! Loop on all the points of the boundary elements set their value to true
2532  DO i=1,nelebd
2533  DO j=1,ndp
2534  is_bnd(ikle(i+(j-1)*nelebd)) = .true.
2535  ENDDO
2536  ENDDO
2537 !
2538 ! COUNT THE NUMBER OF TRUE THIS WILL GIVE US THE NUMBER OF BOUNDARY POINTS
2539  nptfr = count(is_bnd.EQV..true.)
2540  DEALLOCATE(ikle)
2541  DEALLOCATE(is_bnd)
2542 !
2543  ELSE
2544  nptfr = 0
2545  ENDIF
2546 !
2547 #else
2548 !
2549  nptfr = 0
2550 ! MED LIBRARY NOT LOADED
2552 !
2553 #endif
2554  RETURN
2555  END SUBROUTINE
2556 !
2557 !-----------------------------------------------------------------------
2558 !
2559  SUBROUTINE get_bnd_value_med(FILE_ID,TYPE_BND_ELEM,NELEBD,
2560  & LIHBOR,LIUBOR,LIVBOR,TRAC,LITBOR,
2561  & NPTFR,IERR)
2562 !
2563 !BRIEF DETERMINE THE NUMBER OF BOUNDARY POINTS
2564 !
2565 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2566 !| FILE_ID |<--| MED FILE DESCRIPTOR
2567 !| TYPE_BND_ELEM |<--| TYPE OF THE BOUNDARY ELEMENT
2568 !| NELEBD |<--| NUMBER OF BOUNDARY ELEMENTS
2569 !| LIHBOR |-->| TYPE OF BOUNDARY CONDITIONS ON DEPTH
2570 !| LIUBOR |-->| TYPE OF BOUNDARY CONDITIONS ON U
2571 !| LIVBOR |-->| TYPE OF BOUNDARY CONDITIONS ON V
2572 !| TRAC |-->| IF YES, THERE ARE TRACERS
2573 !| LITBOR |-->| PHYSICAL BOUNDARY CONDITIONS FOR TRACERS
2574 !| NPTFR |<--| NUMBER OF BOUNDARY NODES
2575 !| IERR |-->| ERROR TAG
2576 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2577 !
2578  IMPLICIT NONE
2579 !
2580  INTEGER, INTENT(IN) :: FILE_ID
2581  INTEGER, INTENT(IN) :: TYPE_BND_ELEM
2582  INTEGER, INTENT(IN) :: NELEBD
2583  INTEGER, INTENT(IN) :: NPTFR
2584  INTEGER, INTENT(INOUT) :: LIUBOR(nptfr),LIVBOR(nptfr)
2585  INTEGER, INTENT(INOUT) :: LIHBOR(nptfr),LITBOR(*)
2586  LOGICAL, INTENT(IN) :: TRAC
2587  INTEGER, INTENT(OUT) :: IERR
2588 !
2589 #if defined (HAVE_MED)
2590  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
2591  INTEGER, ALLOCATABLE :: FAMILY(:)
2592  INTEGER, ALLOCATABLE :: IKLE(:)
2593  INTEGER, ALLOCATABLE :: NBOR(:)
2594  INTEGER :: NDP,IGRP,MED_ID
2595  INTEGER :: INODE,IPTFR
2596  INTEGER :: TYPE_ELEM_MED
2597  INTEGER :: IGRP_CUR, IGRP_NXT
2598  INTEGER :: BND_TYP_CUR, BND_TYP_NXT
2599  INTEGER :: CURRENT, NEXT
2600  INTEGER :: NPTIR
2601  INTEGER :: IELEB
2602 !
2603 !-----------------------------------------------------------------------
2604 !
2605 ! GET INFO FROM THE MED FILE OBJECT
2606  CALL get_obj(hash,file_id,med_id,ierr)
2607  IF(ierr.NE.0) THEN
2608  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2609  & 'GET_BND_VALUE_MED:GET_OBJ'
2610  RETURN
2611  ENDIF
2612  mname = med_obj_tab(med_id)%MESH_NAME
2613 ! CONVERTS TYPE OF ELEMENTS
2614  CALL convert_elem_type(type_bnd_elem, type_elem_med, ierr)
2615  IF(ierr.NE.0) THEN
2616  error_message = 'ERROR IN '//
2617  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2618  & 'GET_BND_VALUE_MED:CONVERT_ELEM_TYPE'
2619  RETURN
2620  ENDIF
2621 !
2622 ! DETERMINE THE NUMBER OF NODES PER ELEMENT FROM THE TYPE
2623  CALL ndp_from_element_type_med(type_elem_med,ndp,ierr)
2624  IF(ierr.NE.0) THEN
2625  error_message = 'ERROR IN '//
2626  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2627  & 'GET_BND_VALUE_MED:NDP_FROM_ELT_TYPE_MED'
2628  RETURN
2629  ENDIF
2630 !
2631 ! Identify bnd element if necessary
2632  CALL identify_bnd_elmt(file_id,type_bnd_elem,ierr)
2633  IF(ierr.NE.0) THEN
2634  error_message = 'ERROR IN '//
2635  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2636  & 'GET_BND_VALUE_MED:IDENTIFY_BND_ELMT'
2637  RETURN
2638  ENDIF
2639 !
2640  CALL get_mesh_nptir_med(file_id, nptir, ierr)
2641  IF(ierr.NE.0) THEN
2642  error_message = 'ERROR IN '//
2643  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2644  & 'GET_BND_VALUE_MED:GET_MESH_NPTIR_MED'
2645  RETURN
2646  ENDIF
2647 
2648  ! If no boundary doing nothing
2649  IF(med_obj_tab(med_id)%NO_BND) THEN
2650  ierr = 0
2651  RETURN
2652  ENDIF
2653 !
2654  DO iptfr=1,nptfr
2655  lihbor(iptfr) = 0
2656  liubor(iptfr) = 0
2657  livbor(iptfr) = 0
2658  IF (trac) THEN
2659  litbor(iptfr) = 0
2660  ENDIF
2661  ENDDO
2662 
2663  ! IF we have a partitionned file groups are on points
2664  ! otherwise they are on elements
2665  IF(nptir.NE.0) THEN
2666  ALLOCATE(family(nptfr),stat=ierr)
2667  IF(ierr.NE.0) THEN
2668  error_message = 'ERROR IN '//
2669  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2670  & 'ALLOCATING GET_BND_VALUE_MED:FAMILY'
2671  RETURN
2672  ENDIF
2673  CALL get_bnd_family_med(file_id, type_bnd_elem, nptfr,
2674  & family,ierr)
2675 ! WRITE FAMILY NUMBER IN THE MED FILE
2676 
2677  IF(ierr.NE.0) THEN
2678  error_message = 'ERROR IN '//
2679  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2680  & 'GET_BND_VALUE_MED:GET_BND_FAMILY_MED'
2681  RETURN
2682  ENDIF
2683  DO iptfr=1,nptfr
2684  igrp = family(iptfr)
2685  lihbor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,1)
2686  liubor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,2)
2687  livbor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,3)
2688  IF (trac) THEN
2689  litbor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,4)
2690  ENDIF
2691  ENDDO
2692  DEALLOCATE(family)
2693  ELSE
2694  ALLOCATE(family(nelebd),stat=ierr)
2695  IF(ierr.NE.0) THEN
2696  error_message = 'ERROR IN '//
2697  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2698  & 'ALLOCATING GET_BND_VALUE_MED:FAMILY'
2699  RETURN
2700  ENDIF
2701  CALL get_bnd_family_med(file_id,type_bnd_elem,nelebd,
2702  & family,ierr)
2703  IF(ierr.NE.0) THEN
2704  error_message = 'ERROR IN '//
2705  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2706  & 'GET_BND_VALUE_MED:GET_BND_FAMILY_MED'
2707  RETURN
2708  ENDIF
2709 !
2710  ALLOCATE(ikle(nelebd*ndp),stat=ierr)
2711  IF(ierr.NE.0) THEN
2712  error_message = 'ERROR IN '//
2713  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2714  & 'ALLOCATING GET_BND_VALUE_MED:IKLE'
2715  RETURN
2716  ENDIF
2717 !
2718 ! GET THE CONNECTIVITY TABLE
2719  CALL get_bnd_connectivity_med(file_id, type_bnd_elem, nelebd,
2720  & ndp, ikle, ierr)
2721  IF(ierr.NE.0) THEN
2722  error_message = 'ERROR IN '//
2723  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2724  & 'GET_BND_VALUE_MED:GET_BND_CONN_MED'
2725  RETURN
2726  ENDIF
2727 !
2728  ! In case nbor was not build before
2729  IF(.NOT. ALLOCATED(med_obj_tab(med_id)%NBOR))THEN
2730  ALLOCATE(nbor(nptfr))
2731  CALL get_bnd_numbering_med(file_id,type_bnd_elem,nptfr,
2732  & nbor,ierr)
2733  DEALLOCATE(nbor)
2734  ENDIF
2735 ! LOOP ON ALL BOUNDARY POINTS
2736  DO iptfr=1,nptfr
2737  current = med_obj_tab(med_id)%PT2SEG(iptfr,1)
2738  next = med_obj_tab(med_id)%PT2SEG(iptfr,2)
2739  inode = med_obj_tab(med_id)%NBOR(iptfr)
2740 !
2741 ! STORE VALUE OF THE GIVEN NODE
2742  igrp_cur = family(current)
2743  igrp_nxt = family(next)
2744  bnd_typ_cur = med_obj_tab(med_id)%BND_GRP_VAL(igrp_cur,1)
2745  bnd_typ_nxt = med_obj_tab(med_id)%BND_GRP_VAL(igrp_nxt,1)
2746  ! Identifying which boundary to take
2747  CALL seg2point(current,next,bnd_typ_cur,bnd_typ_nxt,ieleb)
2748  igrp = family(ieleb)
2749  ! Defining values
2750  lihbor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,1)
2751  liubor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,2)
2752  livbor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,3)
2753  IF (trac) THEN
2754  litbor(iptfr) = med_obj_tab(med_id)%BND_GRP_VAL(igrp,4)
2755  ENDIF
2756  ENDDO
2757 !
2758 ! FREE MEMORY
2759  DEALLOCATE(family)
2760  DEALLOCATE(ikle)
2761  ENDIF
2762 #else
2763 !
2764 ! MED LIBRARY NOT LOADED
2766 !
2767 #endif
2768 !
2769  END SUBROUTINE
2770 !
2771 !-----------------------------------------------------------------------
2772 !
2773  SUBROUTINE get_data_nvar_med (FILE_ID, NVAR, IERR)
2774 !
2775 !BRIEF READS THE NUMBER OF DATA IN A MED FILE
2776 !
2777 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2778 !| FILE_ID |<--| MED FILE DESCRIPTOR
2779 !| NVAR |-->| NUMBER OF DATA
2780 !| IERR |-->| ERROR TAG
2781 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2782 !
2783  IMPLICIT NONE
2784 !
2785  INTEGER, INTENT(IN) :: FILE_ID
2786  INTEGER, INTENT(OUT) :: NVAR
2787  INTEGER, INTENT(OUT) :: IERR
2788 !
2789 !-----------------------------------------------------------------------
2790 !
2791 #if defined (HAVE_MED)
2792 !
2793  INTEGER MED_ID
2794  INTEGER(KIND=KID) :: FID
2795 !
2796 ! GET INFO FROM THE MED FILE OBJECT
2797  CALL get_obj(hash,file_id,med_id,ierr)
2798  IF(ierr.NE.0) THEN
2799  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2800  & 'GET_BND_VALUE_MED:GET_OBJ'
2801  RETURN
2802  ENDIF
2803  fid = med_obj_tab(med_id)%ID
2804 ! READ THE NUMBER OF DATA
2805  CALL mfdnfd(fid,nvar,ierr)
2806  IF(ierr.NE.0) THEN
2807  error_message = 'ERROR IN '//
2808  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2809  & 'GET_DATA_NVAR_MED:MFDNFD'
2810  RETURN
2811  ENDIF
2812 !
2813 #else
2814 !
2815  nvar = 0
2816 ! MED LIBRARY NOT LOADED
2818 !
2819 #endif
2820 !
2821  RETURN
2822  END SUBROUTINE
2823 !
2824 !-----------------------------------------------------------------------
2825 !
2826  SUBROUTINE get_data_var_list_med (FILE_ID, NVAR, VAR_LIST,
2827  & UNIT_LIST, IERR)
2828 !
2829 !BRIEF READS THE LIST OF THE DATA NAME
2830 !
2831 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2832 !| FILE_ID |<--| MED FILE DESCRIPTOR
2833 !| NVAR |<--| NUMBER OF DATA
2834 !| VAR_LIST |-->| LIST OF THE DATA NAME
2835 !| IERR |-->| ERROR TAG
2836 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2837 !
2838  IMPLICIT NONE
2839 !
2840  INTEGER, INTENT(IN) :: FILE_ID
2841  INTEGER, INTENT(IN) :: NVAR
2842  CHARACTER(LEN=16), DIMENSION(:), INTENT(OUT) :: VAR_LIST
2843  CHARACTER(LEN=16), DIMENSION(:), INTENT(OUT) :: UNIT_LIST
2844  INTEGER, INTENT(OUT) :: IERR
2845  INTEGER(KIND=KID) :: FID
2846 !
2847 #if defined (HAVE_MED)
2848  CHARACTER(LEN=MED_NAME_SIZE) :: VAR_NAME, MNAME
2849  CHARACTER(LEN=MED_SNAME_SIZE) :: CUNIT, CNAME, DTUNIT
2850 !
2851  INTEGER :: MED_ID, I, ITYPE, NSTEP, IMESH
2852 !
2853 !-----------------------------------------------------------------------
2854 !
2855 ! GET INFO FROM THE MED FILE OBJECT
2856  CALL get_obj(hash,file_id,med_id,ierr)
2857  IF(ierr.NE.0) THEN
2858  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2859  & 'GET_DATA_VAR_LIST_MED:GET_OBJ'
2860  RETURN
2861  ENDIF
2862  mname = med_obj_tab(med_id)%MESH_NAME
2863  fid = med_obj_tab(med_id)%ID
2864 !
2865 ! LOOP ON THE VARIABLES
2866  DO i = 1, nvar
2867 !
2868 ! READ THE NAME OF THE VARIABLE
2869  CALL mfdfdi(fid,i,var_name,mname,imesh,itype,
2870  & cname,cunit,dtunit,nstep,ierr)
2871  IF(ierr.NE.0) THEN
2872  error_message = 'ERROR IN '//
2873  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2874  & 'GET_DATA_VAR_LIST_MED:MFDFDI'
2875  RETURN
2876  ENDIF
2877 !
2878 ! CONVERT MED FORMAT TO SLF
2879  var_list(i) = var_name(1:16)
2880  unit_list(i) = cunit
2881  ENDDO
2882 !
2883 #else
2884 !
2885  var_list = ' '
2886  unit_list = ' '
2887 ! MED LIBRARY NOT LOADED
2889 !
2890 #endif
2891 !
2892  RETURN
2893  END SUBROUTINE
2894 !
2895 !-----------------------------------------------------------------------
2896 !
2897  SUBROUTINE get_data_ntimestep_med (FILE_ID, NTIMESTEP, IERR)
2898 !
2899 !BRIEF READS THE NUMBER OF TIME STEP FOR A GIVEN VARIABLE
2900 !
2901 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2902 !| FILE_ID |<--| MED FILE DESCRIPTOR
2903 !| NTIMESTEP |-->| NUMBER OF TIME STEP
2904 !| IERR |-->| ERROR TAG
2905 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2906 !
2907  IMPLICIT NONE
2908 !
2909  INTEGER, INTENT(IN) :: FILE_ID
2910  INTEGER, INTENT(OUT) :: NTIMESTEP
2911  INTEGER, INTENT(OUT) :: IERR
2912 !
2913 #if defined (HAVE_MED)
2914  CHARACTER(LEN=MED_NAME_SIZE) :: VAR_NAME_MED, MNAME
2915  CHARACTER(LEN=MED_SNAME_SIZE) :: CUNIT,CNAME,DTUNIT
2916 !
2917  INTEGER :: ITYPE, MED_ID, IMESH, NVAR
2918  INTEGER(KIND=KID) :: FID
2919 !
2920 !-----------------------------------------------------------------------
2921 !
2922 ! GET INFO FROM THE MED FILE OBJECT
2923  CALL get_obj(hash,file_id,med_id,ierr)
2924  IF(ierr.NE.0) THEN
2925  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
2926  & 'GET_DATA_NTIMESTEP_MED:GET_OBJ'
2927  RETURN
2928  ENDIF
2929  mname = med_obj_tab(med_id)%MESH_NAME
2930  fid = med_obj_tab(med_id)%ID
2931 !
2932 ! READ THE NUMBER OF VARIABLES
2933  CALL mfdnfd(fid,nvar,ierr)
2934  IF(ierr.NE.0) THEN
2935  error_message = 'ERROR IN '//
2936  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2937  & 'GET_DATA_NTIMESTEP_MED:MFDNFD'
2938  RETURN
2939  ENDIF
2940 !
2941  IF(nvar.NE.0) THEN
2942 !
2943 ! READ THE NUMBER OF TIME STEP FROM THE FIRST VARIABLE AS ALL
2944 ! VARIABLE HAVE THE SAME NUMBER OF TIMESTEP
2945  CALL mfdfdi(fid,1,var_name_med,mname,imesh,
2946  & itype,cunit,cname,dtunit,ntimestep,ierr)
2947  IF(ierr.NE.0) THEN
2948  error_message = 'ERROR IN '//
2949  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
2950  & 'GET_DATA_NTIMESTEP_MED:MFDFDI'
2951  RETURN
2952  ENDIF
2953  ELSE
2954 
2955  ntimestep = 0
2956  ENDIF
2957 !
2958 #else
2959 !
2960  ntimestep = 0
2961 ! MED LIBRARY NOT LOADED
2963 !
2964 #endif
2965  RETURN
2966  END SUBROUTINE
2967 !
2968 !-----------------------------------------------------------------------
2969 !
2970  SUBROUTINE get_data_time_med (FILE_ID, RECORD, TIME, IERR)
2971 !
2972 !BRIEF READS PHYSICAL TIME FOR A GIVEN ITERATION NUMBER
2973 !
2974 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2975 !| FILE_ID |<--| MED FILE DESCRIPTOR
2976 !| RECORD |<--| ITERATION NUMBER
2977 !| TIME |-->| PHYSICAL TIME
2978 !| IERR |-->| ERROR TAG
2979 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2980 !
2981  IMPLICIT NONE
2982 !
2983  INTEGER, INTENT(IN) :: FILE_ID, RECORD
2984  DOUBLE PRECISION, INTENT(OUT) :: TIME
2985  INTEGER, INTENT(OUT) :: IERR
2986 !
2987 #if defined (HAVE_MED)
2988  CHARACTER(LEN=MED_NAME_SIZE) :: VAR_NAME_MED
2989  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
2990  CHARACTER(LEN=MED_SNAME_SIZE) :: CNAME,CUNIT,DTUNIT
2991  INTEGER :: N, MED_ID, LMESH
2992  INTEGER :: FTYPE
2993  INTEGER :: DT,IT
2994  INTEGER :: MED_ITER
2995  INTEGER(KIND=KID) :: FID
2996 !
2997 !-----------------------------------------------------------------------
2998 !
2999 ! GET INFO FROM THE MED FILE OBJECT
3000  CALL get_obj(hash,file_id,med_id,ierr)
3001  IF(ierr.NE.0) THEN
3002  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
3003  & 'GET_DATA_TIME_MED:GET_OBJ'
3004  RETURN
3005  ENDIF
3006  mname = med_obj_tab(med_id)%MESH_NAME
3007  fid = med_obj_tab(med_id)%ID
3008 !
3009 ! GET THE NAME OF THE FIRST FIELD TO HAVE ACCESS TO THE TIME
3010  CALL mfdfdi(fid,1,var_name_med,mname,lmesh,ftype,
3011  & cname,cunit,dtunit,n,ierr)
3012  IF(ierr.NE.0) THEN
3013  error_message = 'ERROR IN '//
3014  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3015  & 'GET_DATA_TIME_MED:MFDFDI'
3016  RETURN
3017  ENDIF
3018 !
3019 ! READ THE PHYSICAL TIME TIME
3020  dt=med_no_dt
3021  it=med_no_it
3022  ! Iterations start from 1 and records start from 0
3023  med_iter = record + 1
3024  CALL mfdcsi(fid,var_name_med,med_iter,dt,it,
3025  & time,ierr)
3026  IF(ierr.NE.0) THEN
3027  error_message = 'ERROR IN '//
3028  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3029  & 'GET_DATA_TIME_MED:MFDCSI'
3030  RETURN
3031  ENDIF
3032 !
3033 #else
3034 !
3035  time = 0.0
3036 ! MED LIBRARY NOT LOADED
3038 !
3039 #endif
3040  RETURN
3041  END SUBROUTINE
3042 !
3043 !-----------------------------------------------------------------------
3044 !
3045  SUBROUTINE get_data_value_med (FILE_ID,RECORD,VAR_NAME,
3046  & RES_VALUE,N,IERR)
3047 !
3048 !BRIEF READS DATA VALUES FOR A GIVEN ITERATION
3049 !
3050 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3051 !| FILE_ID |<--| MED FILE DESCRIPTOR
3052 !| RECORD |<--| ITERATION NUMBER
3053 !| VAR_NAME |<--| NAME OF THE DATA
3054 !| RES_VALUE |-->| VECTOR WITH THE VALUE OF THE VARIABLE
3055 !| IERR |-->| ERROR TAG
3056 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3057 !
3058  IMPLICIT NONE
3059 !
3060  INTEGER, INTENT(IN) :: FILE_ID, RECORD, N
3061  CHARACTER(LEN=16), INTENT(IN) :: VAR_NAME
3062  DOUBLE PRECISION, INTENT(INOUT) :: RES_VALUE(n)
3063  INTEGER, INTENT(OUT) :: IERR
3064 !
3065 #if defined (HAVE_MED)
3066  CHARACTER(LEN=MED_NAME_SIZE) :: VAR_NAME_MED
3067 !
3068  INTEGER :: MED_ID
3069  INTEGER :: LMESH, ITYPE, NSTEP
3070  CHARACTER(LEN=MED_SNAME_SIZE) :: CNAME,CUNIT,DTUNIT
3071  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
3072  INTEGER :: NCOMP
3073  INTEGER(KIND=KID) :: FID
3074 !
3075 !-----------------------------------------------------------------------
3076 !
3077 ! GET INFO FROM THE MED FILE OBJECT
3078  CALL get_obj(hash,file_id,med_id,ierr)
3079  IF(ierr.NE.0) THEN
3080  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
3081  & 'GET_DATA_VALUE_MED:GET_OBJ'
3082  RETURN
3083  ENDIF
3084  mname = med_obj_tab(med_id)%MESH_NAME
3085  fid = med_obj_tab(med_id)%ID
3086 !
3087 ! CONVERT SLF FORMAT TO MED
3088  var_name_med = trim(var_name)//char(0)
3089 !
3090 ! CHECKING THAT THE VARIABLE IS THE FILE
3091  CALL mfdncn(fid,var_name_med,ncomp,ierr)
3092  IF(ierr.NE.0) THEN
3093  error_message = 'ERROR IN '//
3094  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3095  & var_name_med//' IS UNKNOWN'
3096  ierr = hermes_var_unknown_err
3097  RETURN
3098  ENDIF
3099 !
3100 ! CHECKING THAT THE RECORD IS A VALID ONE (BETWEEN 0 AND NTIMESTEP-1)
3101 ! READ THE NAME OF THE VARIABLE
3102  CALL mfdfin(fid,var_name_med,mname,lmesh,itype,
3103  & cname,cunit,dtunit,nstep,ierr)
3104  IF(ierr.NE.0) THEN
3105  error_message = 'ERROR IN '//
3106  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3107  & 'GET_DATA_VALUE_MED:MFDFIN'
3108  RETURN
3109  ENDIF
3110 
3111  IF(record.GE.nstep.OR.record.LT.0) THEN
3112  error_message = 'ERROR IN '//
3113  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3114  & i2char(record)//' IS NOT BETWEEN 0 AND'//i2char(nstep)
3116  RETURN
3117  ENDIF
3118 !
3119 ! READ THE VALUE FOR THIS VARIABLE AT THIS TIMESTEP
3120  CALL mfdrvr(fid,var_name_med,record,med_no_it,med_node,
3121  & med_none,med_no_interlace,1,res_value,ierr)
3122  IF(ierr.NE.0) THEN
3123  error_message = 'ERROR IN '//
3124  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3125  & 'GET_DATA_VALUE_MED:MFDRVR'
3126  RETURN
3127  ENDIF
3128 !
3129 #else
3130 !
3131 ! MED LIBRARY NOT LOADED
3133 !
3134 #endif
3135  RETURN
3136  END SUBROUTINE
3137 !
3138 !-----------------------------------------------------------------------
3139 !
3140  SUBROUTINE set_header_med(FILE_ID,TITLE,IERR)
3141 !
3142 !BRIEF WRITES THE TITLE OF THE MESH
3143 !
3144 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3145 !| FILE_ID |<--| MED FILE DESCRIPTOR
3146 !| TITLE |<--| TITLE OF THE MESH
3147 !| IERR |-->| ERROR TAG
3148 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3149 !
3150  IMPLICIT NONE
3151 !
3152  INTEGER, INTENT(IN) :: FILE_ID
3153  CHARACTER(LEN=80), INTENT(IN) :: TITLE
3154  INTEGER, INTENT(OUT) :: IERR
3155 !
3156 #if defined (HAVE_MED)
3157  CHARACTER(LEN=MED_COMMENT_SIZE) :: TITLE_MED
3158  INTEGER :: MED_ID
3159  INTEGER(KIND=KID) :: FID
3160 !
3161 !-----------------------------------------------------------------------
3162 !
3163 ! GET INFO FROM THE MED FILE OBJECT
3164  CALL get_obj(hash,file_id,med_id,ierr)
3165  IF(ierr.NE.0) THEN
3166  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
3167  & 'SET_HEADER_MED:GET_OBJ'
3168  RETURN
3169  ENDIF
3170 !
3171  fid = med_obj_tab(med_id)%ID
3172 ! CONVERSION FROM SLF FORMAT TO MED
3173  title_med = title
3174 ! WRITES THE TITLE OF THE MESH
3175  CALL mficow(fid,title_med,ierr)
3176  IF(ierr.NE.0) THEN
3177  error_message = 'ERROR IN '//
3178  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3179  & 'SET_HEADER_MED:MFICOW'
3180  RETURN
3181  ENDIF
3182 !
3183  med_obj_tab(med_id)%MESH_NAME = 'MESH'//
3184  & trim(med_obj_tab(med_id)%MESH_NUMBER_STR)
3185 !
3186 #else
3187 !
3188 ! MED LIBRARY NOT LOADED
3190 !
3191 #endif
3192  RETURN
3193  END SUBROUTINE
3194 !
3195 !-----------------------------------------------------------------------
3196 !
3197  SUBROUTINE set_mesh_med(FILE_ID,NB_DIM_PB,NB_DIM_MESH,TYPE_ELEM,
3198  & NDP,NPTIR,NELEM,NPOIN,IKLE,KNOLG,COORD,NPLAN,
3199  & DATE,TIME,X_ORIG,Y_ORIG,IERR)
3200 !
3201 !BRIEF WRITES A MESH IN A MED FILE
3202 !
3203 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3204 !| FILE_ID |<--| MED FILE DESCRIPTOR
3205 !| NB_DIM_PB |<--| NUMBER OF DIMENSION OF THE PHYSICAL DOMAIN
3206 !| NB_DIM_MESH |<--| NUMBER OF DIMENSION OF THE MESH
3207 !| TYPE_ELEM |<--| TYPE OF THE ELEMENT IN SLF FORMAT
3208 !| NDP |<--| NUMBER OF POINTS PER ELEMENT
3209 !| NPTIR |<--| NUMBER OF INTERFACE NODES FOR THE SUB-DOMAIN
3210 !| NELEM |<--| TOTAL NUMBER OF ELEMENTS
3211 !| NPOIN |<--| TOTAL NUMBER OF NODES
3212 !| IKLE |<--| CONNECTIVITY TABLE
3213 !| KNOLG |<--| NODES INDEX TABLE FROM LOCAL TO GLOBAL
3214 !| COORD |<--| COORDINATES OF THE NODES
3215 !| NPLAN |<--| NUMBER OF PLANES
3216 !| DATE |<--| DATE OF THE FILE
3217 !| TIME |<--| TIME OF THE FILE
3218 !| X_ORIG |<--| Off set of the X coordinates
3219 !| Y_ORIG |<--| Off set of the Y coordinates
3220 !| IERR |-->| ERROR TAG
3221 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3222 !
3223  IMPLICIT NONE
3224 !
3225  INTEGER, INTENT(IN) :: FILE_ID, NB_DIM_PB, NB_DIM_MESH
3226  INTEGER, INTENT(IN) :: NELEM, NPOIN, TYPE_ELEM, NDP, NPTIR
3227  INTEGER, INTENT(IN) :: NPLAN, X_ORIG, Y_ORIG
3228  INTEGER, INTENT(IN) :: IKLE(ndp*nelem), KNOLG(*)
3229  DOUBLE PRECISION, INTENT(IN) :: COORD(nb_dim_mesh*npoin)
3230  INTEGER, INTENT(IN) :: DATE(3), TIME(3)
3231  INTEGER, INTENT(OUT) :: IERR
3232 !
3233 #if defined (HAVE_MED)
3234  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
3235  CHARACTER(LEN=MED_NAME_SIZE) :: DT_UNIT_MED
3236  CHARACTER(LEN=MED_NAME_SIZE) :: FAM_ZERO
3237  CHARACTER(LEN=MED_NAME_SIZE) :: PNAME
3238  CHARACTER(LEN=MED_SNAME_SIZE),ALLOCATABLE :: COOR_NAME_MED(:)
3239  CHARACTER(LEN=MED_SNAME_SIZE),ALLOCATABLE :: COOR_UNIT_MED(:)
3240  CHARACTER(LEN=MED_SNAME_SIZE) :: COOR_X, COOR_Y, COOR_Z
3241  CHARACTER(LEN=MED_SNAME_SIZE) :: COOR_UNIT
3242  CHARACTER(LEN=MED_COMMENT_SIZE) :: COMMENT
3243 !
3244  INTEGER :: IFAM, MED_ID, TYPE_ELEM_MED,I, MYDATE
3245  INTEGER :: NPLAN_TMP
3246  INTEGER(KIND=KID) :: FID
3247 !
3248 !-----------------------------------------------------------------------
3249 !
3250 ! INITIALISE COORDINATE UNIT AND NAME
3251  comment = 'TELEMAC GENERATED MESH'//char(0)
3252  coor_x = 'X'//char(0)
3253  coor_y = 'Y'//char(0)
3254  coor_z = 'Z'//char(0)
3255  coor_unit = 'M'//char(0)
3256  ALLOCATE(coor_name_med(nb_dim_pb),stat=ierr)
3257  IF(ierr.NE.0) THEN
3258  error_message = 'ERROR IN '//
3259  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3260  & 'ALLOCATING COOR_NAME_MED'
3261  RETURN
3262  ENDIF
3263  ALLOCATE(coor_unit_med(nb_dim_pb),stat=ierr)
3264  IF(ierr.NE.0) THEN
3265  error_message = 'ERROR IN '//
3266  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3267  & 'ALLOCATING COOR_UNIT_MED'
3268  RETURN
3269  ENDIF
3270  coor_name_med(1) = coor_x
3271  coor_name_med(2) = coor_y
3272  IF (nb_dim_pb.EQ.3) coor_name_med(3) = coor_z
3273  DO i=1,nb_dim_pb
3274  coor_unit_med(i) = coor_unit
3275  ENDDO
3276 !
3277 ! INITIALISE TIME UNIT
3278  dt_unit_med = 'S'//char(0)
3279 !
3280 ! GET INFO FROM THE MED FILE OBJECT
3281  CALL get_obj(hash,file_id,med_id,ierr)
3282  IF(ierr.NE.0) THEN
3283  error_message = 'ERROR IN '//
3284  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3285  & 'SET_MESH_MED:GET_OBJ'
3286  RETURN
3287  ENDIF
3288  mname = med_obj_tab(med_id)%MESH_NAME
3289 !
3290  fid = med_obj_tab(med_id)%ID
3291 ! CONVERTS TYPE OF ELEMENTS
3292  CALL convert_elem_type(type_elem,type_elem_med,ierr)
3293  IF(ierr.NE.0) THEN
3294  error_message = 'ERROR IN '//
3295  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3296  & 'SET_MESH_MED:CONVERT_ELEM_TYPE'
3297  RETURN
3298  ENDIF
3299 !
3300 ! CREATES A MESH IN THE MED FILE
3301  CALL mmhcre(fid,mname,nb_dim_pb,nb_dim_mesh,
3302  & med_unstructured_mesh,comment,dt_unit_med,med_sort_dtit,
3303  & med_cartesian,coor_name_med,coor_unit_med,ierr)
3304  IF(ierr.NE.0) THEN
3305  error_message = 'ERROR IN '//
3306  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3307  & 'SET_MESH_MED:MMHCRE'
3308  RETURN
3309  ENDIF
3310  DEALLOCATE(coor_name_med)
3311  DEALLOCATE(coor_unit_med)
3312 !
3313 ! WRITES NODE COORDINATES
3314  CALL mmhcow(fid,mname,med_no_dt,med_no_it,0.d0,
3315  & med_no_interlace,npoin,coord,ierr)
3316  IF(ierr.NE.0) THEN
3317  error_message = 'ERROR IN '//
3318  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3319  & 'SET_MESH_MED:MMHCOW'
3320  RETURN
3321  ENDIF
3322 !
3323 ! WRITES CONNECTIVITY TABLE
3324  CALL mmhcyw(fid,mname,med_no_dt,med_no_it,0.0,med_cell,
3325  & type_elem_med,med_nodal,med_no_interlace,nelem,ikle,ierr)
3326  IF(ierr.NE.0) THEN
3327  error_message = 'ERROR IN '//
3328  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3329  & 'SET_MESH_MED:MMHCYW'
3330  RETURN
3331  ENDIF
3332 !
3333 ! WRITES THE NUMBER OF PMANES
3334  pname = 'NPLAN'//char(0)
3335  comment = 'Number of planes'//char(0)
3336 !
3337 ! CREATES THE PARAMETER
3338  CALL mprcre(fid,pname,med_int,comment,dt_unit_med,ierr)
3339  IF(ierr.NE.0) THEN
3340  error_message = 'ERROR IN '//
3341  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3342  & 'SET_MESH_MED:MPRCRE'
3343  RETURN
3344  ENDIF
3345 !
3346 ! SETS THE VALUE
3347  IF(nplan.LE.1) THEN
3348  nplan_tmp = 0
3349  ELSE
3350  nplan_tmp = nplan
3351  ENDIF
3352  CALL mprivw(fid,pname,med_no_dt,med_no_it,0.0,nplan_tmp,ierr)
3353  IF(ierr.NE.0) THEN
3354  error_message = 'ERROR IN '//
3355  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3356  & 'SET_MESH_MED:MPRIVW'
3357  RETURN
3358  ENDIF
3359 ! WRITES THE ORIGIN
3360  pname = 'X_ORIG'//char(0)
3361  comment = 'X origin'//char(0)
3362 !
3363 ! CREATES THE PARAMETER
3364  CALL mprcre(fid,pname,med_int,comment,dt_unit_med,ierr)
3365  IF(ierr.NE.0) THEN
3366  error_message = 'ERROR IN '//
3367  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3368  & 'SET_MESH_MED:MPRCRE'
3369  RETURN
3370  ENDIF
3371  ! write value
3372  CALL mprivw(fid,pname,med_no_dt,med_no_it,0.0,x_orig,ierr)
3373  IF(ierr.NE.0) THEN
3374  error_message = 'ERROR IN '//
3375  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3376  & 'SET_MESH_MED:MPRIVW'
3377  RETURN
3378  ENDIF
3379  pname = 'Y_ORIG'//char(0)
3380  comment = 'Y origin'//char(0)
3381 !
3382 ! CREATES THE PARAMETER
3383  CALL mprcre(fid,pname,med_int,comment,dt_unit_med,ierr)
3384  IF(ierr.NE.0) THEN
3385  error_message = 'ERROR IN '//
3386  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3387  & 'SET_MESH_MED:MPRCRE'
3388  RETURN
3389  ENDIF
3390 !
3391  ! write value
3392  CALL mprivw(fid,pname,med_no_dt,med_no_it,0.0,y_orig,ierr)
3393  IF(ierr.NE.0) THEN
3394  error_message = 'ERROR IN '//
3395  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3396  & 'SET_MESH_MED:MPRIVW'
3397  RETURN
3398  ENDIF
3399 !
3400 ! WRITES THE DATE
3401  pname = 'DATE'//char(0)
3402  comment = 'Date of the file'//char(0)
3403 !
3404 ! CREATES THE PARAMETER
3405  CALL mprcre(fid,pname,med_int,comment,dt_unit_med,ierr)
3406  IF(ierr.NE.0) THEN
3407  error_message = 'ERROR IN '//
3408  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3409  & 'SET_MESH_MED:MPRCRE'
3410  RETURN
3411  ENDIF
3412 !
3413 ! SETS THE VALUE
3414  mydate = date(1)*10000 +
3415  & date(2)*100 +
3416  & date(3)
3417  CALL mprivw(fid,pname,med_no_dt,med_no_it,0.0,mydate,ierr)
3418  IF(ierr.NE.0) THEN
3419  error_message = 'ERROR IN '//
3420  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3421  & 'SET_MESH_MED:MPRIVW'
3422  RETURN
3423  ENDIF
3424 !
3425 ! WRITES THE TIME
3426  pname = 'TIME'//char(0)
3427  comment = 'Time of the file'//char(0)
3428 !
3429 ! CREATES THE PARAMETER
3430  CALL mprcre(fid,pname,med_int,comment,dt_unit_med,ierr)
3431  IF(ierr.NE.0) THEN
3432  error_message = 'ERROR IN '//
3433  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3434  & 'SET_MESH_MED:MPRCRE'
3435  RETURN
3436  ENDIF
3437 !
3438 ! SETS THE VALUE
3439  mydate = time(1)*10000 +
3440  & time(2)*100 +
3441  & time(3)
3442  CALL mprivw(fid,pname,med_no_dt,med_no_it,0.0,mydate,ierr)
3443  IF(ierr.NE.0) THEN
3444  error_message = 'ERROR IN '//
3445  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3446  & 'SET_MESH_MED:MPRIVW'
3447  RETURN
3448  ENDIF
3449 !
3450 ! IF PARTITIONNED FILE
3451  IF(nptir.NE.0) THEN
3452 !
3453 ! WRITES THE GLOBAL NUMBERING
3454  CALL mmhgnw(fid,mname,med_no_dt,med_no_it,med_node,
3455  & med_none,npoin,knolg,ierr)
3456  IF(ierr.NE.0) THEN
3457  error_message = 'ERROR IN '//
3458  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3459  & 'SET_MESH_MED:MMHGNW'
3460  RETURN
3461  ENDIF
3462 !
3463 ! WRITES THE NUMBER OF INTERFACE POINT AS A SCALAR PARAMETER
3464  pname = 'NPTIR'//trim(med_obj_tab(med_id)%MESH_NUMBER_STR)
3465  & //char(0)
3466  comment = 'Number of interface points'//char(0)
3467 !
3468 ! CREATES THE PARAMETER
3469  CALL mprcre(fid,pname,med_int,comment,dt_unit_med,ierr)
3470  IF(ierr.NE.0) THEN
3471  error_message = 'ERROR IN '//
3472  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3473  & 'SET_MESH_MED:MPRCRE'
3474  RETURN
3475  ENDIF
3476 !
3477 ! SETS THE VALUE
3478  CALL mprivw(fid,pname,med_no_dt,med_no_it,0.0,nptir,ierr)
3479  IF(ierr.NE.0) THEN
3480  error_message = 'ERROR IN '//
3481  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3482  & 'SET_MESH_MED:MPRIVW'
3483  RETURN
3484  ENDIF
3485  ENDIF
3486 !
3487 ! CREATE FAMILLY ZERO
3488 ! DEFAULT FAMILY NEEDED BY MED FILE
3489  fam_zero = 'FAMILY_ZERO'//char(0)
3490  ifam = 0
3491  CALL mfacre(fid,mname,fam_zero,ifam,0,' ',ierr)
3492  IF(ierr.NE.0) THEN
3493  error_message = 'ERROR IN '//
3494  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3495  & 'SET_MESH_MED:MFACRE'
3496  RETURN
3497  ENDIF
3498 !
3499 #endif
3500 !
3501  RETURN
3502  END SUBROUTINE
3503 !
3504 !-----------------------------------------------------------------------
3505 !
3506  SUBROUTINE add_data_med (FILE_ID, VAR_NAME, TIME, RECORD,
3507  & VAR_VALUE, N, IERR)
3508 !
3509 !BRIEF WRITE DATA VALUES FOR A GIVEN VARIABLE
3510 ! ONLY FOR VALUES WITH DOUBLE PRECISION, ONE COMPONENT AND VALUE
3511 ! ON THE NODES
3512 !
3513 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3514 !| FILE_ID |<--| MED FILE DESCRIPTOR
3515 !| VAR_NAME |<--| NAME OF THE DATA
3516 !| TIME |<--| PHYSICAL TIME
3517 !| RECORD |<--| ITERATION NUMBER
3518 !| VAR_VALUE |<--| TABLE OF VARIABLE VALUES
3519 !| N |<--| NUMBER OF ELEMENTS
3520 !| IERR |-->| ERROR TAG
3521 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3522 !
3523  IMPLICIT NONE
3524 !
3525  INTEGER, INTENT(IN) :: FILE_ID, N
3526  INTEGER, INTENT(IN) :: RECORD
3527  CHARACTER(LEN=32), INTENT(IN) :: VAR_NAME
3528  DOUBLE PRECISION, INTENT(IN) :: TIME
3529  DOUBLE PRECISION, INTENT(IN) :: VAR_VALUE(n)
3530  INTEGER, INTENT(OUT) :: IERR
3531 !
3532 #if defined (HAVE_MED)
3533  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME, VAR_NAME_MED
3534  CHARACTER(LEN=MED_SNAME_SIZE) :: VAR_COMP_MED, UNIT_VAR_MED
3535  CHARACTER(LEN=MED_SNAME_SIZE) :: UNIT_TIME_MED
3536  INTEGER :: NB_COMP
3537  INTEGER :: MED_ID
3538  INTEGER(KIND=KID) :: FID
3539 !
3540 !-----------------------------------------------------------------------
3541 !
3542 ! GET INFO FROM THE MED FILE OBJECT
3543  CALL get_obj(hash,file_id,med_id,ierr)
3544  IF(ierr.NE.0) THEN
3545  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
3546  & 'ADD_DATA_MED:GET_MED_OBJ'
3547  RETURN
3548  ENDIF
3549  mname = med_obj_tab(med_id)%MESH_NAME
3550  nb_comp = 1! ONLY ONE COMPONENT
3551  fid = med_obj_tab(med_id)%ID
3552 !
3553 ! CONVERT SLF FORMAT TO MED
3554  var_name_med = trim(var_name(1:16))//char(0)
3555  var_comp_med = trim(var_name(1:16))//char(0)
3556  unit_var_med = trim(var_name(17:32))//char(0)
3557  unit_time_med = 'S'//char(0)
3558 !
3559  IF(record.EQ.0) THEN
3560 ! CREATE A NEW VARIABLE (DOUBLE PRECISION WITH ONE COMPONENT)
3561  CALL mfdcre(fid,var_name_med,med_float64,nb_comp,
3562  & var_comp_med,unit_var_med,unit_time_med,mname,ierr)
3563  IF(ierr.NE.0) THEN
3564  error_message = 'ERROR IN '//
3565  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3566  & 'ADD_DATA_MED:MFDCRE'
3567  RETURN
3568  ENDIF
3569  ENDIF
3570 !
3571 ! WRITE DATA VALUES FOR A GIVEN VARIABLE
3572  CALL mfdrvw(fid,var_name_med,record,med_no_it,time,med_node,
3573  & med_none,med_no_interlace,nb_comp,n,var_value,ierr)
3574  IF(ierr.NE.0) THEN
3575  error_message = 'ERROR IN '//
3576  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
3577  & 'ADD_DATA_MED:MFDRVW'
3578  RETURN
3579  ENDIF
3580 !
3581 #else
3582 !
3583 ! MED LIBRARY NOT LOADED
3585 !
3586 #endif
3587  RETURN
3588  END SUBROUTINE
3589 #if defined HAVE_MED
3590  SUBROUTINE transfer_group_info_common_med(SOURCE_ID,DEST_ID,
3591  & MNAME_SRC,MNAME_DST,HAS_FAM_ON_POINT,IERR)
3592 !BRIEF Transfer group and families definition from source_id into dest_id
3594 !history Y AUDOUIN (LNHE)
3595 !+ 24/03/2014
3596 !+ V7P0
3597 !+
3598 !
3599 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3600 !| SOURCE_ID |-->| FILE DESCRIPTOR OF INPUT FILE
3601 !| DEST_ID |-->| FILE DESCRIPTOR OF OUTPUT FILE
3602 !| MNAME_SRC |<->| MESH NAME FOR INPUT FILE
3603 !| MNAME_DST |<->| MESH NAME FOR OUTPUT FILE
3604 !| HAS_FAM_ON_POINT|-->| CONNECTIVITY FOR OUTPUT FILE BOUNDARY ELEMENTS
3605 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
3606 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3607 !
3608  IMPLICIT NONE
3609 !
3610  INTEGER, INTENT(IN) :: SOURCE_ID
3611  INTEGER, INTENT(IN) :: DEST_ID
3612  CHARACTER(LEN=MED_NAME_SIZE), INTENT(INOUT):: MNAME_SRC, MNAME_DST
3613  LOGICAL, INTENT(OUT) :: HAS_FAM_ON_POINT
3614  INTEGER, INTENT(OUT) :: IERR
3615 !
3616  INTEGER :: MED_ID_SRC, MED_ID_DST
3617  INTEGER :: NB_GRP, NBND_GRP
3618  CHARACTER(LEN=MED_LNAME_SIZE),ALLOCATABLE :: GRP_NAME(:)
3619  CHARACTER(LEN=MED_NAME_SIZE) FAM_NAME
3620  INTEGER :: I
3621  INTEGER :: INUM, IFAM, NB_FAMILY
3622  INTEGER :: NPTIR
3623  INTEGER(KIND=KID) :: SOURCE_FID, DEST_FID
3624 
3625 ! GET INFO FROM THE MED FILE OBJECT
3626  CALL get_obj(hash,source_id,med_id_src,ierr)
3627  IF(ierr.NE.0) THEN
3628  error_message = 'ERROR WITH '//i2char(source_id)//': '//
3629  & 'TRANSFER_GROUP_INFO_COMMON_MED:GET_OBJ'
3630  RETURN
3631  ENDIF
3632 ! GET INFO FROM THE MED FILE OBJECT
3633  CALL get_obj(hash,dest_id,med_id_dst,ierr)
3634  IF(ierr.NE.0) THEN
3635  error_message = 'ERROR WITH ID'//i2char(dest_id)//': '//
3636  & 'TRANSFER_GROUP_INFO_COMMON_MED:GET_OBJ'
3637  RETURN
3638  ENDIF
3639  mname_src = med_obj_tab(med_id_src)%MESH_NAME
3640  mname_dst = med_obj_tab(med_id_dst)%MESH_NAME
3641  source_fid = med_obj_tab(med_id_src)%ID
3642  dest_fid = med_obj_tab(med_id_dst)%ID
3643 !
3644  CALL mfanfa(source_fid,mname_src,nb_family,ierr)
3645  IF(ierr.NE.0) THEN
3646  error_message = 'ERROR IN '//
3647  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3648  & 'TRANSFER_GROUP_INFO_COMMON_MED:MFANFA'
3649  RETURN
3650  ENDIF
3651 !
3652  has_fam_on_point = .false.
3653  ! Creating all the families that are in src into dest
3654  DO ifam = 1, nb_family
3655 !
3656 ! READ THE NUMBER OF GROUP PER FAMILY
3657  CALL mfanfg(source_fid,mname_src,ifam,nb_grp,ierr)
3658  IF(ierr.NE.0) THEN
3659  error_message = 'ERROR IN '//
3660  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3661  & 'TRANSFER_GROUP_INFO_COMMON_MED:MFANFG'
3662  RETURN
3663  ENDIF
3664 !
3665  ALLOCATE(grp_name(max(nb_grp,1)),stat=ierr)
3666  IF(ierr.NE.0) THEN
3667  error_message = 'ERROR IN '//
3668  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3669  & 'ALLOCATING TRANSFER_GROUP_INFO_COMMON_MED:GRP_NAME'
3670  RETURN
3671  ENDIF
3672  grp_name(:) = repeat(' ',med_lname_size)
3673 
3674 ! READ THE TYPE OF FAMILY
3675  CALL mfafai(source_fid,mname_src,ifam,fam_name,inum,
3676  & grp_name,ierr)
3677  IF(ierr.NE.0) THEN
3678  error_message = 'ERROR IN '//
3679  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3680  & 'TRANSFER_GROUP_INFO_COMMON_MED:MFAFAI'
3681  RETURN
3682  ENDIF
3683  ! Skipping famille_zero
3684  IF(inum.EQ.0) THEN
3685  DEALLOCATE(grp_name)
3686  cycle
3687  ENDIF
3688  ! Families on point have a positive number
3689  IF(inum.GT.0) has_fam_on_point = .true.
3690 !
3691  ! WRITE THE FAMILY
3692  CALL mfacre(dest_fid,mname_dst,fam_name,inum,max(nb_grp,1),
3693  & grp_name,ierr)
3694  IF(ierr.NE.0) THEN
3695  error_message = 'ERROR IN '//
3696  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3697  & 'TRANSFER_GROUP_INFO_COMMON_MED:MFACRE'
3698  RETURN
3699  ENDIF
3700 !
3701  DEALLOCATE(grp_name)
3702  ENDDO
3703 
3704  CALL get_mesh_nptir_med(dest_id, nptir, ierr)
3705  IF(ierr.NE.0) THEN
3706  error_message = 'ERROR IN '//
3707  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3708  & 'TRANSFER_GROUP_INFO_COMMON_MED:GET_MESH_NPTIR_MED'
3709  RETURN
3710  ENDIF
3711 
3712  ! Only writing grp info if not in a partitionned file
3713  IF(nptir.EQ.0) THEN
3714  ! Transfering group values from SRC_ID
3715  med_obj_tab(med_id_dst)%NBND_GRP =
3716  & med_obj_tab(med_id_src)%NBND_GRP
3717  nbnd_grp = med_obj_tab(med_id_dst)%NBND_GRP
3718  ALLOCATE(med_obj_tab(med_id_dst)%BND_GRP_VAL(nbnd_grp,4),
3719  & stat=ierr)
3720  IF(ierr.NE.0) THEN
3721  error_message = 'ERROR IN '//
3722  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3723  & 'ALLOCATING TRANSFER_GROUP_INFO_COMMON_MED:BND_GRP_VAL'
3724  RETURN
3725  ENDIF
3726  ALLOCATE(med_obj_tab(med_id_dst)%BND_GRP_NAME(nbnd_grp),
3727  & stat=ierr)
3728  IF(ierr.NE.0) THEN
3729  error_message = 'ERROR IN '//
3730  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3731  & 'ALLOCATING TRANSFER_GROUP_INFO_COMMON_MED:BND_GRP_NAME'
3732  RETURN
3733  ENDIF
3734  DO i=1,nbnd_grp
3735  med_obj_tab(med_id_dst)%BND_GRP_VAL(i,1) =
3736  & med_obj_tab(med_id_src)%BND_GRP_VAL(i,1)
3737  med_obj_tab(med_id_dst)%BND_GRP_VAL(i,2) =
3738  & med_obj_tab(med_id_src)%BND_GRP_VAL(i,2)
3739  med_obj_tab(med_id_dst)%BND_GRP_VAL(i,3) =
3740  & med_obj_tab(med_id_src)%BND_GRP_VAL(i,3)
3741  med_obj_tab(med_id_dst)%BND_GRP_VAL(i,4) =
3742  & med_obj_tab(med_id_src)%BND_GRP_VAL(i,4)
3743  med_obj_tab(med_id_dst)%BND_GRP_NAME(i)(:) =
3744  & med_obj_tab(med_id_src)%BND_GRP_NAME(i)
3745  ENDDO
3746  ENDIF
3747  END SUBROUTINE
3748 #endif
3749 !
3750  SUBROUTINE transfer_group_part_info_med(
3751  & SOURCE_ID, DEST_ID,
3752  & TYP_BND_ELEM, IKLE_BND_DEST, NELEBD_DEST,
3753  & NDP_DEST, NELEBD_SRC, KNOGL_BND,
3754  & TRANS_POINT, NPOIN_SRC, NPOIN_DEST, KNOLG, IERR)
3755 !BRIEF Transfer group information from source_id into dest_id
3756 !+ Writes boundary elements as well where dest_id is a partition
3757 !+ of source_id
3758 !
3759 !history Y AUDOUIN (LNHE)
3760 !+ 24/03/2014
3761 !+ V7P0
3762 !+
3763 !
3764 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3765 !| SOURCE_ID |-->| FILE DESCRIPTOR OF INPUT FILE
3766 !| DEST_ID |-->| FILE DESCRIPTOR OF OUTPUT FILE
3767 !| TYPE_ELEM |-->| TYPE OF THE ELEMENTS
3768 !| TYPE_BND_ELEM |-->| TYPE OF THE BOUNDARY ELEMENTS
3769 !| IKLE_BND_DEST |-->| CONNECTIVITY FOR OUTPUT FILE BOUNDARY ELEMENTS
3770 !| NELEBD_DEST |-->| NUMBER OF BOUNDARY ELEMENTS IN OUTPUT FILE
3771 !| NDP_DEST |-->| Number of node per element in output file
3772 !| NELEBD_SRC |-->| Number of noudary elements in the input file
3773 !| KNOGL_BND |-->| Local to global numbering for boundary elements
3774 !| TRANS_POINT |-->| IF TRUE TRANSFERING GROUP ON POINTS AS WELL
3775 !| NPOIN_SRC |-->| Number of points in input file
3776 !| NPOIN_DEST |-->| Number if points in output file
3777 !| KNOLG |-->| Local to global numbering
3778 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
3779 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3780 !
3781 !
3782  IMPLICIT NONE
3783 !
3784  INTEGER, INTENT(IN) :: SOURCE_ID
3785  INTEGER, INTENT(IN) :: DEST_ID
3786  INTEGER, INTENT(IN) :: NELEBD_DEST
3787  INTEGER, INTENT(IN) :: NDP_DEST
3788  INTEGER, INTENT(IN) :: IKLE_BND_DEST(nelebd_dest*ndp_dest)
3789  INTEGER, INTENT(IN) :: TYP_BND_ELEM
3790  INTEGER, INTENT(IN) :: NELEBD_SRC
3791  INTEGER, INTENT(IN) :: KNOGL_BND(nelebd_src)
3792  LOGICAL, INTENT(IN) :: TRANS_POINT
3793  INTEGER, INTENT(IN) :: NPOIN_SRC
3794  INTEGER, INTENT(IN) :: NPOIN_DEST
3795  INTEGER, INTENT(IN) :: KNOLG(npoin_dest)
3796  INTEGER, INTENT(OUT) :: IERR
3797 !
3798 #if defined HAVE_MED
3799  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME, MNAME2
3800  INTEGER :: TYPE_ELEM_MED
3801  INTEGER, ALLOCATABLE :: FAM_NUM(:)
3802  INTEGER, ALLOCATABLE :: FAM_NUM_DEST(:)
3803  INTEGER :: I,J
3804  INTEGER :: NELEM_SRC
3805  LOGICAL :: HAS_FAM_ON_POINT
3806  INTEGER :: MED_ID_SRC, MED_ID_DST
3807  INTEGER(KIND=KID) :: SOURCE_FID, DEST_FID
3808 !
3809 
3810  ! Transferring families and group info
3811  CALL transfer_group_info_common_med(source_id, dest_id, mname,
3812  & mname2, has_fam_on_point, ierr)
3813  IF(ierr.NE.0) RETURN
3814 ! GET INFO FROM THE MED FILE OBJECT
3815  CALL get_obj(hash,source_id,med_id_src,ierr)
3816  IF(ierr.NE.0) THEN
3817  error_message = 'ERROR WITH ID '//i2char(source_id)//': '//
3818  & 'TRANSFER_GROUP_PART_INFO_MED:GET_OBJ'
3819  RETURN
3820  ENDIF
3821 
3822  CALL get_obj(hash,dest_id,med_id_dst,ierr)
3823  IF(ierr.NE.0) THEN
3824  error_message = 'ERROR WITH ID '//i2char(source_id)//': '//
3825  & 'TRANSFER_GROUP_PART_INFO_MED:GET_OBJ'
3826  RETURN
3827  ENDIF
3828  source_fid = med_obj_tab(med_id_src)%ID
3829  dest_fid = med_obj_tab(med_id_dst)%ID
3830 
3831  ! For boundary elements
3832  IF(typ_bnd_elem.NE.0.AND.nelebd_dest.NE.0) THEN
3833 ! READ THE FAMILY NUMBER FOR EACH ELEMENT
3834  CALL convert_elem_type(typ_bnd_elem, type_elem_med, ierr)
3835  IF(ierr.NE.0) THEN
3836  error_message = 'ERROR IN '//
3837  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3838  & 'ALLOCATING TRANSFER_GROUP_PART_INFO_MED:CONVERT_ELEM_TYPE'
3839  RETURN
3840  ENDIF
3841 
3842 ! WRITES CONNECTIVITY TABLE
3843  CALL mmhcyw(dest_fid,mname2,med_no_dt,med_no_it,0.0,med_cell,
3844  & type_elem_med,med_nodal,med_no_interlace,nelebd_dest,
3845  & ikle_bnd_dest,ierr)
3846  IF(ierr.NE.0) THEN
3847  error_message = 'ERROR IN '//
3848  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3849  & 'TRANSFER_GROUP_PART_INFO_MED:MMHCYW:BND'
3850  RETURN
3851  ENDIF
3852 
3853  ! Number of element of type typ_bnd_elem
3854  CALL get_mesh_nelem_med(source_id, typ_bnd_elem,
3855  & nelem_src, ierr)
3856  IF(ierr.NE.0) THEN
3857  error_message = 'ERROR IN '//
3858  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3859  & 'TRANSFER_GROUP_PART_INFO_MED:CONVERT_ELEM_TYPE'
3860  RETURN
3861  ENDIF
3862 
3863  ! Getting family number of every boundary element in input file
3864  ALLOCATE(fam_num(nelem_src),stat=ierr)
3865  IF(ierr.NE.0) THEN
3866  error_message = 'ERROR IN '//
3867  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3868  & 'ALLOCATING TRANSFER_GROUP_PART_INFO_MED:FAM_NUM:BND'
3869  RETURN
3870  ENDIF
3871 
3872  CALL mmhfnr(source_fid,mname,med_no_dt,med_no_it,med_cell,
3873  & type_elem_med,fam_num,ierr)
3874  IF(ierr.NE.0) THEN
3875  error_message = 'ERROR IN '//
3876  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3877  & 'TRANSFER_GROUP_PART_INFO_MED:MMHFNR:BND'
3878  RETURN
3879  ENDIF
3880 
3881  ! Building family number for ouput file using knolg_bnd
3882  ALLOCATE(fam_num_dest(nelebd_dest),stat=ierr)
3883  IF(ierr.NE.0) THEN
3884  error_message = 'ERROR IN '//
3885  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3886  & 'ALLOCATING FAM_NUM_DEST:BND'
3887  RETURN
3888  ENDIF
3889  j = 0
3890  DO i=1,nelem_src
3891  IF(med_obj_tab(med_id_src)%IS_BND(i)) THEN
3892  j = j+1
3893  IF(knogl_bnd(j).EQ.0) THEN
3894  cycle
3895  ENDIF
3896  fam_num_dest(knogl_bnd(j)) = fam_num(i)
3897  ENDIF
3898  ENDDO
3899  ! Writting family number for boundary element
3900  CALL mmhfnw(dest_fid,mname2,med_no_dt,med_no_it,med_cell,
3901  & type_elem_med,nelebd_dest,fam_num_dest,ierr)
3902  IF(ierr.NE.0) THEN
3903  error_message = 'ERROR IN '//
3904  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3905  & 'TRANSFER_GROUP_PART_INFO_MED:MMHFNW:BND'
3906  RETURN
3907  ENDIF
3908 
3909  DEALLOCATE(fam_num)
3910  DEALLOCATE(fam_num_dest)
3911  ENDIF
3912 
3913  ! For nodes
3914  IF(trans_point.AND.has_fam_on_point) THEN
3915 ! READ THE FAMILY NUMBER FOR EACH ELEMENT
3916 
3917  ALLOCATE(fam_num(npoin_src),stat=ierr)
3918  IF(ierr.NE.0) THEN
3919  error_message = 'ERROR IN '//
3920  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3921  & 'ALLOCATING TRANSFER_GROUP_PART_INFO_MED:FAM_NUM'
3922  RETURN
3923  ENDIF
3924 
3925  CALL mmhfnr(source_fid,mname,med_no_dt,med_no_it,med_node,
3926  & med_none,fam_num,ierr)
3927  IF(ierr.NE.0) THEN
3928  error_message = 'ERROR IN '//
3929  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3930  & 'TRANSFER_GROUP_PART_INFO_MED:MMHFNR'
3931  RETURN
3932  ENDIF
3933 
3934  ! Building family number for ouput file using knolg
3935  ALLOCATE(fam_num_dest(npoin_dest),stat=ierr)
3936  IF(ierr.NE.0) THEN
3937  error_message = 'ERROR IN '//
3938  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
3939  & 'ALLOCATING FAM_NUM_DEST'
3940  RETURN
3941  ENDIF
3942  DO i=1,npoin_dest
3943  fam_num_dest(i) = fam_num(knolg(i))
3944  ENDDO
3945  ! Writting family number for point
3946  CALL mmhfnw(dest_fid,mname2,med_no_dt,med_no_it,med_node,
3947  & med_none,npoin_dest,fam_num_dest,ierr)
3948  IF(ierr.NE.0) THEN
3949  error_message = 'ERROR IN '//
3950  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
3951  & 'TRANSFER_GROUP_PART_INFO_MED:MMHFNW'
3952  RETURN
3953  ENDIF
3954 
3955  DEALLOCATE(fam_num)
3956  DEALLOCATE(fam_num_dest)
3957  ENDIF
3958 #else
3959 !
3960 ! MED LIBRARY NOT LOADED
3962 !
3963 #endif
3964  END SUBROUTINE
3965 !
3966  SUBROUTINE transfer_group_info_med(SOURCE_ID, DEST_ID, TYP_ELEM,
3967  & TYP_BND_ELEM, IKLE_BND, NELEBD,
3968  & NDP, TRANS_ELEM,
3969  & TRANS_POINT, IERR)
3970 !BRIEF Transfer group information from source_id into dest_id
3971 ! Writes boundary elements as well
3972 !
3973 !history Y AUDOUIN (LNHE)
3974 !+ 24/03/2014
3975 !+ V7P0
3976 !+
3977 !
3978 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3979 !| FFORMAT |-->| FORMAT OF THE FILE
3980 !| SOURCE_ID |-->| FILE DESCRIPTOR OF INPUT FILE
3981 !| DEST_ID |-->| FILE DESCRIPTOR OF OUTPUT FILE
3982 !| TYPE_ELT |-->| TYPE OF THE ELEMENTS
3983 !| TYPE_BND_ELT |-->| TYPE OF THE BOUNDARY ELEMENTS
3984 !| TRANS_ELEM |-->| IF TRUE TRANSFERING GROUP ON TYP_ELT AS WELL
3985 !| TRANS_POINT |-->| IF TRUE TRANSFERING GROUP ON POINTS AS WELL
3986 !| IERR |<--| 0 IF NO ERROR DURING THE EXECUTION
3987 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3988 !
3989 !
3990  IMPLICIT NONE
3991 !
3992  INTEGER, INTENT(IN) :: SOURCE_ID
3993  INTEGER, INTENT(IN) :: DEST_ID
3994  INTEGER, INTENT(IN) :: NELEBD
3995  INTEGER, INTENT(IN) :: NDP
3996  INTEGER, INTENT(IN) :: IKLE_BND(nelebd*ndp)
3997  INTEGER, INTENT(IN) :: TYP_ELEM
3998  INTEGER, INTENT(IN) :: TYP_BND_ELEM
3999  LOGICAL, INTENT(IN) :: TRANS_ELEM
4000  LOGICAL, INTENT(IN) :: TRANS_POINT
4001  INTEGER, INTENT(OUT) :: IERR
4002 !
4003 #if defined (HAVE_MED)
4004  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME_SRC, MNAME_DST
4005  INTEGER :: TYPE_ELEM_MED
4006  INTEGER, ALLOCATABLE :: FAM_NUM_SRC(:), FAM_NUM_DST(:)
4007  INTEGER :: NPOIN
4008  INTEGER :: NELEM,NELEBD_SRC
4009  LOGICAL :: HAS_FAM_ON_POINT
4010  INTEGER :: I,J
4011  INTEGER :: MED_ID_SRC, MED_ID_DST
4012  INTEGER(KIND=KID) :: SOURCE_FID, DEST_FID
4013 !
4014  CALL get_obj(hash,source_id,med_id_src,ierr)
4015  IF(ierr.NE.0) THEN
4016  error_message = 'ERROR WITH ID '//i2char(source_id)//': '//
4017  & 'TRANSFER_GROUP_INFO:GET_OBJ'
4018  RETURN
4019  ENDIF
4020 
4021  CALL get_obj(hash,dest_id,med_id_dst,ierr)
4022  IF(ierr.NE.0) THEN
4023  error_message = 'ERROR WITH ID '//i2char(source_id)//': '//
4024  & 'TRANSFER_GROUP_PART_INFO_MED:GET_OBJ'
4025  RETURN
4026  ENDIF
4027  source_fid = med_obj_tab(med_id_src)%ID
4028  dest_fid = med_obj_tab(med_id_dst)%ID
4029 
4030  ! Transferring families and group info
4031  CALL transfer_group_info_common_med(source_id, dest_id, mname_src,
4032  & mname_dst, has_fam_on_point, ierr)
4033  IF(ierr.NE.0) RETURN
4034  ! For boundary elements
4035  IF(typ_bnd_elem.NE.0.AND.nelebd.NE.0) THEN
4036 ! READ THE FAMILY NUMBER FOR EACH ELEMENT
4037  CALL convert_elem_type(typ_bnd_elem, type_elem_med, ierr)
4038  IF(ierr.NE.0) THEN
4039  error_message = 'ERROR IN '//
4040  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4041  & 'TRANSFER_GROUP_INFO:CONVERT_ELEM_TYPE'
4042  RETURN
4043  ENDIF
4044 
4045 ! WRITES CONNECTIVITY TABLE
4046  CALL mmhcyw(dest_fid,mname_dst,med_no_dt,med_no_it,0.0,med_cell,
4047  & type_elem_med,med_nodal,med_no_interlace,nelebd,
4048  & ikle_bnd,ierr)
4049  IF(ierr.NE.0) THEN
4050  error_message = 'ERROR IN '//
4051  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
4052  & 'TRANSFER_GROUP_INFO:MMHCYW'
4053  RETURN
4054  ENDIF
4055 
4056  CALL get_mesh_nelem_med(source_id, typ_bnd_elem,
4057  & nelebd_src, ierr)
4058  IF(ierr.NE.0) THEN
4059  error_message = 'ERROR IN '//
4060  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4061  & 'TRANSFER_GROUP_INFO:CONVERT_ELEM_TYPE'
4062  RETURN
4063  ENDIF
4064 
4065  ALLOCATE(fam_num_src(nelebd_src),stat=ierr)
4066  IF(ierr.NE.0) THEN
4067  error_message = 'ERROR IN '//
4068  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4069  & 'ALLOCATING TRANSFER_GROUP_INFO:FAM_NUM_DST'
4070  RETURN
4071  ENDIF
4072 
4073  CALL mmhfnr(source_fid,mname_src,med_no_dt,med_no_it,med_cell,
4074  & type_elem_med,fam_num_src,ierr)
4075  IF(ierr.NE.0) THEN
4076  error_message = 'ERROR IN '//
4077  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4078  & 'TRANSFER_GROUP_INFO:MMHFNR'
4079  RETURN
4080  ENDIF
4081 
4082  ALLOCATE(fam_num_dst(nelebd),stat=ierr)
4083  IF(ierr.NE.0) THEN
4084  error_message = 'ERROR IN '//
4085  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4086  & 'ALLOCATING TRANSFER_GROUP_INFO:FAM_NUM_DST'
4087  RETURN
4088  ENDIF
4089  j = 0
4090  DO i=1,nelebd_src
4091  IF(med_obj_tab(med_id_src)%IS_BND(i)) THEN
4092  j = j+1
4093  fam_num_dst(j) = fam_num_src(i)
4094  ENDIF
4095  ENDDO
4096 
4097  CALL mmhfnw(dest_fid,mname_dst,med_no_dt,med_no_it,med_cell,
4098  & type_elem_med,nelebd,fam_num_dst,ierr)
4099  IF(ierr.NE.0) THEN
4100  error_message = 'ERROR IN '//
4101  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
4102  & 'TRANSFER_GROUP_INFO:MMHFNW'
4103  RETURN
4104  ENDIF
4105  DEALLOCATE(fam_num_dst)
4106  DEALLOCATE(fam_num_src)
4107  ENDIF
4108 
4109  IF(trans_elem) THEN
4110  ! For elements
4111  CALL get_mesh_nelem_med(source_id, typ_elem, nelem, ierr)
4112  IF(ierr.NE.0) THEN
4113  error_message = 'ERROR IN '//
4114  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4115  & 'TRANSFER_GROUP_INFO:CONVERT_ELEM_TYPE'
4116  RETURN
4117  ENDIF
4118 ! READ THE FAMILY NUMBER FOR EACH ELEMENT
4119  CALL convert_elem_type(typ_elem, type_elem_med, ierr)
4120  IF(ierr.NE.0) THEN
4121  error_message = 'ERROR IN '//
4122  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4123  & 'TRANSFER_GROUP_INFO:CONVERT_ELEM_TYPE'
4124  RETURN
4125  ENDIF
4126 
4127  ALLOCATE(fam_num_dst(nelem),stat=ierr)
4128  IF(ierr.NE.0) THEN
4129  error_message = 'ERROR IN '//
4130  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4131  & 'ALLOCATING TRANSFER_GROUP_INFO:FAM_NUM:ELEM'
4132  RETURN
4133  ENDIF
4134  fam_num_dst(:) = 0
4135 
4136  CALL mmhfnr(source_fid,mname_src,med_no_dt,med_no_it,med_cell,
4137  & type_elem_med,fam_num_dst,ierr)
4138  ! If the function crashed that means we do not have
4139  ! families on the elements
4140  IF(ierr.GE.0) THEN
4141  IF(ierr.NE.0) THEN
4142  error_message = 'ERROR IN '//
4143  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4144  & 'TRANSFER_GROUP_INFO:MMHFNR:ELEM'
4145  RETURN
4146  ENDIF
4147 
4148  CALL mmhfnw(dest_fid,mname_dst,med_no_dt,med_no_it,med_cell,
4149  & type_elem_med,nelem,fam_num_dst,ierr)
4150  IF(ierr.NE.0) THEN
4151  error_message = 'ERROR IN '//
4152  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
4153  & 'TRANSFER_GROUP_INFO:MMHFNW:ELEM'
4154  RETURN
4155  ENDIF
4156  ELSE
4157  ierr = 0
4158  ENDIF
4159  DEALLOCATE(fam_num_dst)
4160  ENDIF
4161 
4162  ! For nodes
4163  IF(trans_point.AND.has_fam_on_point) THEN
4164  CALL get_mesh_npoin_med(source_id, typ_elem, npoin, ierr)
4165  IF(ierr.NE.0) THEN
4166  error_message = 'ERROR IN '//
4167  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4168  & 'TRANSFER_GROUP_INFO:CONVERT_ELEM_TYPE'
4169  RETURN
4170  ENDIF
4171 ! READ THE FAMILY NUMBER FOR EACH ELEMENT
4172 
4173  ALLOCATE(fam_num_dst(npoin),stat=ierr)
4174  IF(ierr.NE.0) THEN
4175  error_message = 'ERROR IN '//
4176  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
4177  & 'ALLOCATING TRANSFER_GROUP_INFO:FAM_NUM_DST'
4178  RETURN
4179  ENDIF
4180 
4181  CALL mmhfnr(source_fid,mname_src,med_no_dt,med_no_it,med_node,
4182  & med_none,fam_num_dst,ierr)
4183  IF(ierr.NE.0) THEN
4184  error_message = 'ERROR IN '//
4185  & trim(med_obj_tab(med_id_src)%FILE_NAME)//': '//
4186  & 'TRANSFER_GROUP_INFO:MMHFNR'
4187  RETURN
4188  ENDIF
4189 
4190  CALL mmhfnw(dest_fid,mname_dst,med_no_dt,med_no_it,med_node,
4191  & med_none,npoin,fam_num_dst,ierr)
4192  IF(ierr.NE.0) THEN
4193  error_message = 'ERROR IN '//
4194  & trim(med_obj_tab(med_id_dst)%FILE_NAME)//': '//
4195  & 'TRANSFER_GROUP_INFO:MMHFNW'
4196  RETURN
4197  ENDIF
4198  DEALLOCATE(fam_num_dst)
4199  ENDIF
4200 #else
4201 !
4202 ! MED LIBRARY NOT LOADED
4204 !
4205 #endif
4206  END SUBROUTINE
4207 !
4208 !-----------------------------------------------------------------------
4209 !
4210  SUBROUTINE set_bnd_med(FILE_ID,TYPE_BND_ELT,NELEBD,NDP,IKLE_BND,
4211  & NPTFR,LIHBOR,LIUBOR,LIVBOR,LITBOR,IERR)
4212 !
4213 !BRIEF WRITE DATA VALUES FOR A GIVEN VARIABLE
4214 ! ONLY FOR VALUES WITH DOUBLE PRECISION, ONE COMPONENT AND VALUE
4215 ! ON THE NODES
4216 !
4217 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4218 !| FILE_ID |<--| MED FILE DESCRIPTOR
4219 !| TYPE_BND_ELT |<--| TYPE OF THE BOUNDARY ELEMENT
4220 !| NELEBD |<--| NUMBER OF BOUNDARY ELEMENT
4221 !| NDP |<--| NUMBER OF NODES PER ELEMENT
4222 !| IKLE |<--| CONNECTIVITY TABLE OF THE BOUNDARY ELEMENTS
4223 !| LIHBOR |-->| TYPE OF BOUNDARY CONDITIONS ON DEPTH
4224 !| LIUBOR |-->| TYPE OF BOUNDARY CONDITIONS ON U
4225 !| LIVBOR |-->| TYPE OF BOUNDARY CONDITIONS ON V
4226 !| LITBOR |-->| PHYSICAL BOUNDARY CONDITIONS FOR TRACERS
4227 !| IERR |-->| ERROR TAG
4228 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4229 !
4230  IMPLICIT NONE
4231 !
4232  INTEGER, INTENT(IN) :: FILE_ID
4233  INTEGER, INTENT(IN) :: TYPE_BND_ELT
4234  INTEGER, INTENT(IN) :: NELEBD
4235  INTEGER, INTENT(IN) :: NDP
4236  INTEGER, INTENT(IN) :: IKLE_BND(nelebd*ndp)
4237  INTEGER, INTENT(IN) :: NPTFR
4238  INTEGER, INTENT(IN) :: LIUBOR(nptfr),LIVBOR(nptfr)
4239  INTEGER, INTENT(IN) :: LIHBOR(nptfr),LITBOR(nptfr)
4240  INTEGER, INTENT(OUT) :: IERR
4241 !
4242 #if defined (HAVE_MED)
4243  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
4244  INTEGER :: MED_ID, TYPE_BND_ELEM_MED
4245  CHARACTER(LEN=MED_LNAME_SIZE) GRP_NAME
4246  CHARACTER(LEN=MED_NAME_SIZE) FAM_NAME
4247  INTEGER :: NCLI,I,J,K,IPTFR
4248  INTEGER,ALLOCATABLE :: FAM_NUM(:)
4249  INTEGER, PARAMETER :: NVAL(3) = (/4,5,3/)
4250  INTEGER :: H_VAL(nval(1))
4251  INTEGER :: U_VAL(nval(2))
4252  INTEGER :: T_VAL(nval(3))
4253  INTEGER :: LIST_VAL(nval(1)*nval(2)*nval(3))
4254  INTEGER :: IFAM
4255  INTEGER(KIND=KID) :: FID
4256  LOGICAL, ALLOCATABLE :: WRITE_GRP(:)
4257 !
4258 !-----------------------------------------------------------------------
4259 !
4260 ! GET INFO FROM THE MED FILE OBJECT
4261  CALL get_obj(hash,file_id,med_id,ierr)
4262  IF(ierr.NE.0) THEN
4263  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
4264  & 'SET_BND_MED:GET_OBJ'
4265  RETURN
4266  ENDIF
4267  mname = med_obj_tab(med_id)%MESH_NAME
4268  ncli = med_obj_tab(med_id)%NCLI
4269  fid = med_obj_tab(med_id)%ID
4270 !
4271 ! CONVERTS TYPE OF ELEMENTS
4272  CALL convert_elem_type(type_bnd_elt,type_bnd_elem_med,ierr)
4273  IF(ierr.NE.0) THEN
4274  error_message = 'ERROR IN '//
4275  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4276  & 'SET_BND_MED:CONVERT_ELEM_TYPE'
4277  RETURN
4278  ENDIF
4279 !
4280  ! If we do not have families in the file creating somes
4281  IF(med_obj_tab(med_id)%NBND_GRP.EQ.0) THEN
4282 ! WRITES CONNECTIVITY TABLE
4283  CALL mmhcyw(fid,mname,med_no_dt,med_no_it,0.0,med_cell,
4284  & type_bnd_elem_med,med_nodal,med_no_interlace,nelebd,
4285  & ikle_bnd,ierr)
4286  IF(ierr.NE.0) THEN
4287  error_message = 'ERROR IN '//
4288  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4289  & 'SET_BND_MED:MMHCYW'
4290  RETURN
4291  ENDIF
4292 !
4293  ! Create all the types of boundary conditions
4294  h_val = (/ 1,4,5,2/)
4295  u_val = (/ 6,0,4,5,2/)
4296  t_val = (/ 4,5,2/)
4297  med_obj_tab(med_id)%NBND_GRP = nval(1)*nval(2)*nval(3)
4298  ALLOCATE(med_obj_tab(med_id)%BND_GRP_VAL(
4299  & med_obj_tab(med_id)%NBND_GRP,4), stat=ierr)
4300  IF(ierr.NE.0) THEN
4301  error_message = 'ERROR IN '//
4302  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4303  & 'ALLOCATING MEDOBJ%BND_GRP_VAL'
4304  RETURN
4305  ENDIF
4306  ALLOCATE(med_obj_tab(med_id)%BND_GRP_NAME(
4307  & med_obj_tab(med_id)%NBND_GRP), stat=ierr)
4308  IF(ierr.NE.0) THEN
4309  error_message = 'ERROR IN '//
4310  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4311  & 'ALLOCATING MEDOBJ%GRP_NAME'
4312  RETURN
4313  ENDIF
4314  ALLOCATE(write_grp(med_obj_tab(med_id)%NBND_GRP), stat=ierr)
4315  IF(ierr.NE.0) THEN
4316  error_message = 'ERROR IN '//
4317  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4318  & 'ALLOCATING WRITE_GRP'
4319  RETURN
4320  ENDIF
4321  write_grp = .false.
4322 
4323  ifam = 1
4324  DO i=1,nval(1)
4325  DO j=1,nval(2)
4326  DO k=1,nval(3)
4327  med_obj_tab(med_id)%BND_GRP_VAL(ifam,1) = h_val(i)
4328  med_obj_tab(med_id)%BND_GRP_VAL(ifam,2) = u_val(j)
4329  med_obj_tab(med_id)%BND_GRP_VAL(ifam,3) = u_val(j)
4330  med_obj_tab(med_id)%BND_GRP_VAL(ifam,4) = t_val(k)
4331  list_val(ifam) =
4332  & h_val(i)*1000 + u_val(j)*100
4333  & + u_val(j)*10 + t_val(k)
4334  grp_name = repeat(' ',med_lname_size)
4335  grp_name = 'CONLIM_'//trim(i2char(h_val(i)))//
4336  & trim(i2char(u_val(j)))//
4337  & trim(i2char(u_val(j)))//
4338  & trim(i2char(t_val(k)))
4339  med_obj_tab(med_id)%BND_GRP_NAME(ifam) = grp_name
4340  ifam = ifam + 1
4341  ENDDO
4342  ENDDO
4343  ENDDO
4344 !
4345 ! DEFINE FAMILY NUMBER
4346  IF(nptfr.GT.0) THEN
4347  ALLOCATE(fam_num(nptfr),stat=ierr)
4348  IF(ierr.NE.0) THEN
4349  error_message = 'ERROR IN '//
4350  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4351  & 'ALLOCATING FAM_NUM'
4352  RETURN
4353  ENDIF
4354  fam_num = 0
4355  DO iptfr=1,nptfr
4356  fam_num(iptfr) = 0
4357  DO j=1,med_obj_tab(med_id)%NBND_GRP
4358  IF(
4359  & lihbor(iptfr).EQ.med_obj_tab(med_id)%BND_GRP_VAL(j,1).AND.
4360  & liubor(iptfr).EQ.med_obj_tab(med_id)%BND_GRP_VAL(j,2).AND.
4361  & livbor(iptfr).EQ.med_obj_tab(med_id)%BND_GRP_VAL(j,3).AND.
4362  & litbor(iptfr).EQ.med_obj_tab(med_id)%BND_GRP_VAL(j,4))
4363  & THEN
4364  fam_num(iptfr) = j + offset
4365  ! Counting families as used
4366  write_grp(j) = .true.
4367  EXIT
4368  ENDIF
4369  ENDDO
4370  IF(fam_num(iptfr).EQ.0) THEN
4372  error_message = 'ERROR IN '//
4373  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4374  & 'UNKNOW BOUNDARY CONDITION LI[HUVT]BOR : '//
4375  & i2char(lihbor(iptfr))//' '//
4376  & i2char(liubor(iptfr))//' '//
4377  & i2char(livbor(iptfr))//' '//
4378  & i2char(litbor(iptfr))
4379  RETURN
4380  ENDIF
4381  ENDDO
4382 
4383  ! Creating families for each boundary type used
4384  DO i=1,med_obj_tab(med_id)%NBND_GRP
4385  IF(write_grp(i)) THEN
4386  grp_name = med_obj_tab(med_id)%BND_GRP_NAME(i)
4387  fam_name = 'FAM_'//trim(grp_name)
4388 ! CREATING THE FAMILIES FOR EACH BOUNDARY TYPES
4389  CALL mfacre(fid,mname,fam_name,i+offset,1,
4390  & grp_name,ierr)
4391  IF(ierr.NE.0) THEN
4392  error_message = 'ERROR IN '//
4393  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4394  & 'SET_BND_MED:MFACRE:'
4395  RETURN
4396  ENDIF
4397  ENDIF
4398  ENDDO
4399 !
4400 ! WRITE FAMILY NUMBER IN THE MED FILE
4401  CALL mmhfnw(fid,mname,med_no_dt,med_no_it,med_cell,
4402  & type_bnd_elem_med,nptfr,fam_num,ierr)
4403  IF(ierr.NE.0) THEN
4404  error_message = 'ERROR IN '//
4405  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4406  & 'FAM_NUM'
4407  RETURN
4408  ENDIF
4409  DEALLOCATE(fam_num)
4410  ENDIF
4411 !
4412  ENDIF
4413 
4414  !If the file is a concatenation, we need to move to the
4415  !begining of our part
4416  IF(partel_concat)THEN
4417  DO i=1,med_obj_tab(med_id)%CLI_LINE_BEGIN-1
4418  READ(med_obj_tab(med_id)%NCLI,*)
4419  ENDDO
4420  ENDIF
4421 ! WRITING THE BOUNDARY FILE
4422  med_obj_tab(med_id)%NBND_USED_GRP = count(write_grp)
4423  WRITE(ncli,*) med_obj_tab(med_id)%NBND_USED_GRP
4424  DO i=1,med_obj_tab(med_id)%NBND_GRP
4425  IF(write_grp(i)) THEN
4426  WRITE(ncli,*)
4427  & med_obj_tab(med_id)%BND_GRP_VAL(i,1),
4428  & med_obj_tab(med_id)%BND_GRP_VAL(i,2),
4429  & med_obj_tab(med_id)%BND_GRP_VAL(i,3),
4430  & med_obj_tab(med_id)%BND_GRP_VAL(i,4),
4431  & trim(med_obj_tab(med_id)%BND_GRP_NAME(i))
4432  ENDIF
4433  ENDDO
4434 
4435 #else
4436 !
4437 ! MED LIBRARY NOT LOADED
4439 !
4440 #endif
4441  END SUBROUTINE
4442 !
4443 !
4444 !-----------------------------------------------------------------------
4445 !
4446  SUBROUTINE update_data_mesh_med (FILE_ID,TIME,RECORD,NB_DIM_MESH,
4447  & NPOIN,COORD,IERR)
4448 !
4449 !BRIEF UPDATE MESH COORDINATES
4450 ! ONLY FOR MOVING MESH
4451 !
4452 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4453 !| FILE_ID |-->| MED FILE DESCRIPTOR
4454 !| TIME |-->| PHYSICAL TIME
4455 !| RECORD |-->| ITERATION NUMBER
4456 !| NB_DIM_MESH |-->| DIMENSION OF THE MESH
4457 !| NPOIN |-->| NUMBER OF POINTS IN THE MESH
4458 !| COORD |-->| COORDINATES TABLE
4459 !| IERR |-->| ERROR TAG
4460 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4461 !
4462  IMPLICIT NONE
4463 !
4464  INTEGER, INTENT(IN) :: FILE_ID
4465  INTEGER, INTENT(IN) :: RECORD
4466  DOUBLE PRECISION, INTENT(IN) :: TIME
4467  INTEGER, INTENT(IN) :: NB_DIM_MESH, NPOIN
4468  DOUBLE PRECISION, INTENT(IN) :: COORD(nb_dim_mesh*npoin)
4469  INTEGER, INTENT(OUT) :: IERR
4470 !
4471 #if defined (HAVE_MED)
4472  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME
4473  INTEGER :: MED_ID
4474  INTEGER(KIND=KID) :: FID
4475 !
4476 !-----------------------------------------------------------------------
4477 !
4478 ! GET INFO FROM THE MED FILE OBJECT
4479  CALL get_obj(hash,file_id,med_id,ierr)
4480  mname = med_obj_tab(med_id)%MESH_NAME
4481  fid = med_obj_tab(med_id)%ID
4482 !
4483 ! UPDATE MESH COORDINATES IF NECESSARY
4484  CALL mmhcow(fid,mname,record,med_no_it,time,
4485  & med_no_interlace,npoin,coord,ierr)
4486  IF(ierr.NE.0) THEN
4487  error_message = 'ERROR IN '//
4488  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4489  & 'UPDATE_DATA_MESH_MED:MMHCOW'
4490  RETURN
4491  ENDIF
4492 !
4493 #else
4494 !
4495 ! MED LIBRARY NOT LOADED
4497 !
4498 #endif
4499  RETURN
4500  END SUBROUTINE
4501 !
4502 !-----------------------------------------------------------------------
4504  SUBROUTINE ifvector_(STRING,COMP_NUM,ISVECTOR)
4505 !
4506 !BRIEF FIND ' U ' ' V ' ' W ' ' X ' ' Y ' ' Z ' IN NAME FIELD OF SCALAR
4507 ! OR VECTOR
4508 !
4509 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4510 !| STRING |<->| THE NAME OF THE VARIABLE TO TEST
4511 !| COMP_NUM |<--| DIRECTION OF VECTOR
4512 !| ISVECTOR |<--| TRUE IF VECTOR
4513 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4514  CHARACTER(LEN=32), INTENT(INOUT) :: STRING
4515  INTEGER, INTENT(INOUT) :: COMP_NUM
4516  LOGICAL, INTENT(INOUT) :: ISVECTOR
4517 !
4518  INTEGER :: J
4519 !
4520 !-----------------------------------------------------------------------
4521 !
4522  isvector = .false.
4523  comp_num = 0
4524  RETURN
4525 
4526  IF (string(1:6)/='COTE Z') THEN
4527  DO j = 2,31
4528  IF (string(j-1:j+1) .EQ. ' U ') THEN
4529  string(j:j) = '*'
4530  comp_num = 1
4531  isvector = .true.
4532  ELSEIF (string(j-1:j+1) .EQ. ' V ') THEN
4533  string(j:j) = '*'
4534  comp_num = 2
4535  isvector = .true.
4536  ELSEIF (string(j-1:j+1) .EQ. ' W ') THEN
4537  string(j:j) = '*'
4538  comp_num = 3
4539  isvector = .true.
4540  ELSEIF (string(j-1:j+1) .EQ. ' X ') THEN
4541  string(j:j) = '*'
4542  comp_num = 1
4543  isvector = .true.
4544  ELSEIF (string(j-1:j+1) .EQ. ' Y ') THEN
4545  string(j:j) = '*'
4546  comp_num = 2
4547  isvector = .true.
4548  ELSEIF (string(j-1:j+1) .EQ. ' Z ') THEN
4549  string(j:j) = '*'
4550  comp_num = 3
4551  isvector = .true.
4552  ELSEIF (string(j-1:j+1) .EQ. 'QX ') THEN
4553  string(j-1:j) = 'Q*'
4554  comp_num = 1
4555  isvector = .true.
4556  ELSEIF (string(j-1:j+1) .EQ. 'QY ') THEN
4557  string(j-1:j) = 'Q*'
4558  comp_num = 2
4559  isvector = .true.
4560  ELSEIF (string(j-1:j+1) .EQ. 'QZ ') THEN
4561  string(j-1:j) = 'Q*'
4562  comp_num = 3
4563  isvector = .true.
4564  ELSEIF (string(j-1:j+1) .EQ. 'U0 ') THEN
4565  string(j-1:j) = '*0'
4566  comp_num = 1
4567  isvector = .true.
4568  ELSEIF (string(j-1:j+1) .EQ. 'V0 ') THEN
4569  string(j-1:j) = '*0'
4570  comp_num = 2
4571  isvector = .true.
4572  ELSEIF (string(j-1:j+1) .EQ. 'W0 ') THEN
4573  string(j-1:j) = '*0'
4574  comp_num = 3
4575  isvector = .true.
4576  ENDIF
4577  ENDDO
4578  ENDIF
4579 !
4580  RETURN
4581  END SUBROUTINE ifvector_
4582 !
4583 !-----------------------------------------------------------------------
4585  SUBROUTINE convert_elem_type(TYPE_ELEM,TYPE_ELEM_MED,IERR)
4586 !
4587 !BRIEF CONVERTS ELEMENT TYPE FROM SLF FORMAT TO MED
4588 !
4589 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4590 !| TYPE_ELEM |<--| ELEMENT TYPE WITH SLF FORMAT
4591 !| TYPE_ELEM_MED |-->| ELEMENT TYPE WITH MED FORMAT
4592 !| IERR |-->| ERROR TAG
4593 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4594 !
4595  INTEGER, INTENT(IN) :: TYPE_ELEM
4596  INTEGER, INTENT(INOUT) :: TYPE_ELEM_MED
4597  INTEGER, INTENT(OUT) :: IERR
4598 !
4599 !-----------------------------------------------------------------------
4600 !
4601 #if defined HAVE_MED
4602 ! INITIALISATION
4603  ierr = 0
4604 !
4605 ! CONVERSION FROM BIEF NUMBERING TO MED
4606  SELECT CASE(type_elem)
4607 !
4608 ! 1 NODES OR 1 SEGMENT WITH 1 NODES
4609  CASE(point_bnd_elt_type)
4610  type_elem_med = med_point1
4611 !
4612 ! SEGMENT WITH 2 NODES
4613  CASE(edge_bnd_elt_type)
4614  type_elem_med = med_seg2
4615 !
4616 ! TRIANGLE WITH 3 NODES
4619  type_elem_med = med_tria3
4620 !
4621 ! QUADRANGLE WITH 4 NODES
4623  type_elem_med = med_quad4
4624 !
4625 ! TETRAHEDRA WITH 4 NODES
4626  CASE(tetrahedron_elt_type)
4627  type_elem_med = med_tetra4
4628 !
4629 ! PRISM WITH 6 NODES
4631  type_elem_med = med_penta6
4632 !
4633 ! ERROR CASE
4634  CASE DEFAULT
4636 !
4637  END SELECT
4638 #endif
4639 !
4640  RETURN
4641  END SUBROUTINE
4642 !
4643 !-----------------------------------------------------------------------
4645  SUBROUTINE ndp_from_element_type_med(TYPE_ELEM_MED,NDP,IERR)
4646 !
4647 !brief DEDUCES NUMBER OF NODES FROM ELEMENT TYPE IN MED NUMBERING
4648 !
4649 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4650 !| TYPE_ELEM_MED |-->| ELEMENT TYPE WITH MED NUMBERING
4651 !| NDP |-->| NUMBER OF NODES PER ELEMENT
4652 !| IERR |-->| ERROR TAG
4653 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4654  INTEGER, INTENT(IN) :: TYPE_ELEM_MED
4655  INTEGER, INTENT(INOUT) :: NDP
4656  INTEGER, INTENT(OUT) :: IERR
4657 !
4658 !-----------------------------------------------------------------------
4659 !
4660 ! INITIALISATION
4661  ierr = 0
4662  ndp = -99
4663 #if defined HAVE_MED
4664 !
4665 ! CONVERSION FROM BIEF NUMBERING TO MED
4666 !
4667 ! 1D ELEMENTS
4668  IF (type_elem_med .EQ. med_point1) ndp = 1 ! SEGM WITH 1 NODES
4669  IF (type_elem_med .EQ. med_seg2) ndp = 2 ! SEGM WITH 2 NODES
4670 !
4671 ! 2D ELEMENTS
4672  IF (type_elem_med .EQ. med_tria3) ndp = 3 ! TRIA WITH 3 NODES
4673  IF (type_elem_med .EQ. med_quad4) ndp = 4 ! QUAD WITH 4 NODES
4674 !
4675 ! 3D ELEMENTS
4676  IF (type_elem_med .EQ. med_tetra4) ndp = 4 ! TETRA WITH 4 NODES
4677  IF (type_elem_med .EQ. med_penta6) ndp = 6 ! PRISM WITH 6 NODES
4678 !
4679 ! ERROR IF UNKNOWN ELEMNT TYPE
4680  IF (ndp .EQ. -99) ierr = hermes_unknown_element_type_err
4681 !
4682 #endif
4683  RETURN
4684  END SUBROUTINE
4685 !
4686 !-----------------------------------------------------------------------
4688  SUBROUTINE identify_bnd_elmt(FILE_ID,TYPE_BND_ELEM,IERR)
4689 !
4690 !brief DEDUCES NUMBER OF NODES FROM ELEMENT TYPE IN MED NUMBERING
4691 !
4692 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4693 !| TYPE_BND_ELEM |-->| ELEMENT TYPE WITH BIEF NUMBERING
4694 !| FILE_ID |-->| ID OF THE MED FILE
4695 !| IERR |-->| ERROR TAG
4696 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4697  INTEGER, INTENT(IN) :: FILE_ID
4698  INTEGER, INTENT(IN) :: TYPE_BND_ELEM
4699  INTEGER, INTENT(OUT) :: IERR
4700 !
4701 !-----------------------------------------------------------------------
4702 !
4703 #if defined HAVE_MED
4704  CHARACTER(LEN=MED_NAME_SIZE) :: MNAME, TEMP_FAM
4705  CHARACTER(LEN=MED_LNAME_SIZE),ALLOCATABLE :: GRP_NAME(:)
4706  INTEGER :: INUM,IFAM,I,MED_ID,TYPE_ELEM_MED
4707  INTEGER :: J
4708  INTEGER :: NELEM,NB_FAMILY,NB_GRP
4709  INTEGER, ALLOCATABLE :: NUM_FAMILY(:)
4710  LOGICAL :: FOUND
4711  INTEGER(KIND=KID) :: FID
4712 !
4713 !-----------------------------------------------------------------------
4714 !
4715 ! GET INFO FROM THE MED FILE OBJECT
4716  CALL get_obj(hash,file_id,med_id,ierr)
4717  IF(ierr.NE.0) THEN
4718  error_message = 'ERROR WITH ID '//i2char(file_id)//': '//
4719  & 'IDENTIFY_BND_ELMT:GET_OBJ_FILE'
4720  RETURN
4721  ENDIF
4722  mname = med_obj_tab(med_id)%MESH_NAME
4723  fid = med_obj_tab(med_id)%ID
4724 ! Only computing the array if it was not done before
4725  IF(.NOT.ALLOCATED(med_obj_tab(med_id)%IS_BND)) THEN
4726 ! CONVERTS TYPE OF ELEMENTS
4727  CALL convert_elem_type(type_bnd_elem, type_elem_med, ierr)
4728  IF(ierr.NE.0) THEN
4729  error_message = 'ERROR IN '//
4730  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4731  & 'IDENTIFY_BND_ELMT:CONVERT_ELEM_TYPE'
4732  RETURN
4733  ENDIF
4734 !
4735  CALL get_mesh_nelem_med(file_id,type_bnd_elem,nelem,ierr)
4736  IF(ierr.NE.0) THEN
4737  error_message = 'ERROR IN '//
4738  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4739  & 'IDENTIFY_BND_ELMT:GET_BND_NELEM_MED'
4740  RETURN
4741  ENDIF
4742  ! In case we do not have boundary element in the mesh
4743  ALLOCATE(med_obj_tab(med_id)%IS_BND(max(nelem,1)),stat=ierr)
4744  IF(ierr.NE.0) THEN
4745  error_message = 'ERROR IN '//
4746  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4747  & 'ALLOCATING IDENTIFY_BND_ELMT:IS_BND'
4748  RETURN
4749  ENDIF
4750 
4751  IF(nelem.NE.0) THEN
4752 !
4753 ! READ THE FAMILY NUMBER FOR EACH ELEMENT
4754  med_obj_tab(med_id)%NO_BND = .false.
4755  ALLOCATE(num_family(nelem),stat=ierr)
4756  IF(ierr.NE.0) THEN
4757  error_message = 'ERROR IN '//
4758  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4759  & 'IDENTIFY_BND_ELMT:NUM_FAMILY'
4760  RETURN
4761  ENDIF
4762 !
4763  CALL mmhfnr(fid,mname,med_no_dt,med_no_it,med_cell,
4764  & type_elem_med,num_family,ierr)
4765  IF(ierr.NE.0) THEN
4766  error_message = 'ERROR IN '//
4767  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4768  & 'IDENTIFY_BND_ELMT:MMHFNR'
4769  RETURN
4770  ENDIF
4771  ELSE
4772  med_obj_tab(med_id)%NO_BND = .true.
4773  med_obj_tab(med_id)%IS_BND(:) = .false.
4774  RETURN
4775  ENDIF
4776 !
4777 ! READ THE TOTAL NUMBER OF FAMILY
4778  CALL mfanfa(fid,mname,nb_family,ierr)
4779  IF(ierr.NE.0) THEN
4780  error_message = 'ERROR IN '//
4781  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4782  & 'IDENTIFY_BND_ELMT:MFANFA'
4783  RETURN
4784  ENDIF
4785  ALLOCATE(med_obj_tab(med_id)%BND_FAM(nb_family,2),stat=ierr)
4786  IF(ierr.NE.0) THEN
4787  error_message = 'ERROR IN '//
4788  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4789  & 'ALLOCATING BND_FAM'
4790  RETURN
4791  ENDIF
4792 !
4793  DO ifam = 1, nb_family
4794 !
4795 ! READ THE NUMBER OF GROUP PER FAMILY
4796  CALL mfanfg(fid,mname,ifam,nb_grp,ierr)
4797  IF(ierr.NE.0) THEN
4798  error_message = 'ERROR IN '//
4799  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4800  & 'IDENTIFY_BND_ELMT:MFANFG'
4801  RETURN
4802  ENDIF
4803 !
4804  ALLOCATE(grp_name(max(nb_grp,1)),stat=ierr)
4805  IF(ierr.NE.0) THEN
4806  error_message = 'ERROR IN '//
4807  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4808  & 'ALLOCATING IDENTIFY_BND_ELMT:GRP_NAME'
4809  RETURN
4810  ENDIF
4811 
4812 ! READ THE TYPE OF FAMILY
4813  CALL mfafai(fid,mname,ifam,temp_fam,inum,grp_name,ierr)
4814  IF(ierr.NE.0) THEN
4815  error_message = 'ERROR IN '//
4816  & trim(med_obj_tab(med_id)%FILE_NAME)//': '//
4817  & 'IDENTIFY_BND_ELMT:MFAFAI'
4818  RETURN
4819  ENDIF
4820  med_obj_tab(med_id)%BND_FAM(ifam,1) = inum
4821  med_obj_tab(med_id)%BND_FAM(ifam,2) = 0
4822  IF(type_bnd_elem.EQ.point_bnd_elt_type) THEN
4823  ! Only check for families on points i.e. num > 0
4824  IF(inum.LE.0) THEN
4825  DEALLOCATE(grp_name)
4826  cycle
4827  ENDIF
4828  ELSE
4829  ! Only check for families on elements i.e. num < 0
4830  IF(inum.GE.0) THEN
4831  DEALLOCATE(grp_name)
4832  cycle
4833  ENDIF
4834  ENDIF
4835  found = .false.
4836  DO j=1,med_obj_tab(med_id)%NBND_GRP
4837  IF(found) EXIT
4838  ! looping on the family groups and if one is in bnd_grp
4839  ! adding it to bnd_fam
4840  IF(nb_grp.EQ.0) EXIT
4841  DO i=1,nb_grp
4842  IF(grp_name(i).EQ.
4843  & med_obj_tab(med_id)%BND_GRP_NAME(j)) THEN
4844  found = .true.
4845  med_obj_tab(med_id)%BND_FAM(ifam,2) = j
4846  EXIT
4847  ENDIF
4848  ENDDO
4849  ENDDO
4850  DEALLOCATE(grp_name)
4851  ENDDO
4852  IF(nelem.NE.0) THEN
4853  ! Looping on all element and checking if their family is in bnd_fam
4854  DO i=1,nelem
4855  med_obj_tab(med_id)%IS_BND(i) = .false.
4856  DO ifam=1,nb_family
4857  IF(num_family(i).EQ.
4858  & med_obj_tab(med_id)%BND_FAM(ifam,1)) THEN
4859  med_obj_tab(med_id)%IS_BND(i) =
4860  & med_obj_tab(med_id)%BND_FAM(ifam,2).NE.0
4861  EXIT
4862  ENDIF
4863  ENDDO
4864  ENDDO
4865  DEALLOCATE(num_family)
4866  ENDIF
4867  ENDIF
4868 !
4869 #endif
4870  RETURN
4871  END SUBROUTINE
4873  SUBROUTINE seg2point(P1,P2,BND_TYP_P1,BND_TYP_P2,POINT)
4874  IMPLICIT NONE
4875  INTEGER, INTENT(IN) :: P1,P2
4876  INTEGER, INTENT(IN) :: BND_TYP_P1
4877  INTEGER, INTENT(IN) :: BND_TYP_P2
4878  INTEGER, INTENT(OUT):: POINT
4879 
4880  IF (bnd_typ_p1.EQ.sol_bnd.AND.
4881  & bnd_typ_p2.EQ.sol_bnd) THEN
4882  point = p1
4883  ELSE IF(bnd_typ_p1.EQ.sol_bnd) THEN
4884  point = p2
4885  ELSE IF(bnd_typ_p2.EQ.sol_bnd) THEN
4886  point = p1
4887  ELSE
4888  IF(bnd_typ_p1.LT.bnd_typ_p2) THEN
4889  point = p1
4890  ELSE
4891  point = p2
4892  ENDIF
4893  ENDIF
4894  END SUBROUTINE
4896  SUBROUTINE point2seg(P1,P2,BND_TYP_P1,BND_TYP_P2,SEG)
4897  IMPLICIT NONE
4898  INTEGER, INTENT(IN) :: P1,P2
4899  INTEGER, INTENT(IN) :: BND_TYP_P1
4900  INTEGER, INTENT(IN) :: BND_TYP_P2
4901  INTEGER, INTENT(OUT):: SEG
4902 
4903  IF(bnd_typ_p1.NE.sol_bnd .AND.
4904  & bnd_typ_p2.NE.sol_bnd) THEN
4905  IF(bnd_typ_p1.LT.bnd_typ_p2) THEN
4906  seg = p1
4907  ELSE
4908  seg = p2
4909  ENDIF
4910  ELSE IF (bnd_typ_p1.EQ.sol_bnd) THEN
4911  seg = p1
4912  ELSE
4913  seg = p2
4914  ENDIF
4915  END SUBROUTINE
4916 !
4917 !-----------------------------------------------------------------------
4918 !
4919  END MODULE utils_med
subroutine set_mesh_med(FILE_ID, NB_DIM_PB, NB_DIM_MESH, TYPE_ELEM, NDP, NPTIR, NELEM, NPOIN, IKLE, KNOLG, COORD, NPLAN, DATE, TIME, X_ORIG, Y_ORIG, IERR)
Definition: utils_med.F:3201
integer, parameter k8
integer, parameter hermes_wrong_med_version_err
subroutine ndp_from_element_type_med(TYPE_ELEM_MED, NDP, IERR)
Definition: utils_med.F:4644
subroutine set_bnd_med(FILE_ID, TYPE_BND_ELT, NELEBD, NDP, IKLE_BND, NPTFR, LIHBOR, LIUBOR, LIVBOR, LITBOR, IERR)
Definition: utils_med.F:4210
subroutine transfer_group_part_info_med(SOURCE_ID, DEST_ID, TYP_BND_ELEM, IKLE_BND_DEST, NELEBD_DEST, NDP_DEST, NELEBD_SRC, KNOGL_BND, TRANS_POINT, NPOIN_SRC, NPOIN_DEST, KNOLG, IERR)
Definition: utils_med.F:3755
subroutine close_bnd_med(FILE_ID, IERR, MESH_NUMBER)
Definition: utils_med.F:517
integer, parameter prism_elt_type
subroutine get_bnd_numbering_med(FILE_ID, TYPE_ELEM_BND, NPTFR, NBOR, IERR)
Definition: utils_med.F:1646
integer, parameter hermes_wrong_hdf_format_err
subroutine open_bnd_med(FILE_NAME, FILE_ID, OPEN_MODE, IERR, MESH_NUMBER)
Definition: utils_med.F:386
integer, parameter triangle_3d_bnd_elt_type
subroutine get_mesh_title_med(FILE_ID, TITLE, IERR)
Definition: utils_med.F:577
subroutine seg2point(P1, P2, BND_TYP_P1, BND_TYP_P2, POINT)
Definition: utils_med.F:4872
subroutine get_data_var_list_med(FILE_ID, NVAR, VAR_LIST, UNIT_LIST, IERR)
Definition: utils_med.F:2829
subroutine get_mesh_npoin_med(FILE_ID, TYPE_ELEM, NPOIN, IERR)
Definition: utils_med.F:818
integer, parameter split_prism_elt_type
subroutine get_mesh_connectivity_med(FILE_ID, TYPE_ELEM, IKLE, NELEM, NDP, IERR)
Definition: utils_med.F:747
subroutine add_obj(HASH, FILE_ID, HASHED_ID, IERR)
Definition: hash_table.f:66
integer, parameter hermes_wrong_med_format_err
integer, parameter hermes_unknown_element_type_err
YOANN AUDOUIN 10/05/2018 Initial version
subroutine convert_elem_type(TYPE_ELEM, TYPE_ELEM_MED, IERR)
Definition: utils_med.F:4584
integer, parameter hermes_wrong_axe_err
subroutine get_bnd_value_med(FILE_ID, TYPE_BND_ELEM, NELEBD, LIHBOR, LIUBOR, LIVBOR, TRAC, LITBOR, NPTFR, IERR)
Definition: utils_med.F:2563
subroutine get_mesh_nelem_med(FILE_ID, TYPE_ELEM, NELEM, IERR)
Definition: utils_med.F:632
subroutine get_bnd_connectivity_med(FILE_ID, TYPE_ELEM, NELEBD, NDP, BND_IKLE, IERR)
Definition: utils_med.F:2087
subroutine get_obj(HASH, FILE_ID, HASHED_ID, IERR)
Definition: hash_table.f:15
integer, parameter triangle_elt_type
subroutine identify_bnd_elmt(FILE_ID, TYPE_BND_ELEM, IERR)
Definition: utils_med.F:4687
subroutine get_bnd_ipobo_med(FILE_ID, TYPE_ELEM_BND, NPOIN, IPOBO, IERR)
Definition: utils_med.F:1484
character(len=200) error_message
integer, parameter sol_bnd
Definition: utils_med.F:83
subroutine get_data_nvar_med(FILE_ID, NVAR, IERR)
Definition: utils_med.F:2775
integer, parameter hermes_unknown_bnd_condition
integer, parameter hermes_invalid_open_mode_err
subroutine get_mesh_coord_med(FILE_ID, JDIM, NDIM, NPOIN, COORD_AXE, IERR)
Definition: utils_med.F:979
integer, parameter quadrangle_bnd_elt_type
subroutine transfer_group_info_med(SOURCE_ID, DEST_ID, TYP_ELEM, TYP_BND_ELEM, IKLE_BND, NELEBD, NDP, TRANS_ELEM, TRANS_POINT, IERR)
Definition: utils_med.F:3969
integer, parameter point_bnd_elt_type
subroutine get_bnd_family_med(FILE_ID, TYPE_BND_ELEM, NELEBD, FAMILY, IERR)
Definition: utils_med.F:2284
subroutine get_mesh_l2g_numbering_med(FILE_ID, KNOLG, NPOIN, IERR)
Definition: utils_med.F:1057
integer, parameter hermes_record_unknown_err
subroutine get_mesh_npoin_per_element_med(TYPE_ELEM, NDP, IERR)
Definition: utils_med.F:703
subroutine get_bnd_grp_value_med(FILE_ID, GRP_NAME, VALUE, IERR)
Definition: utils_med.F:2203
integer, parameter max_file
Definition: hash_table.f:7
integer, parameter edge_bnd_elt_type
subroutine add_data_med(FILE_ID, VAR_NAME, TIME, RECORD, VAR_VALUE, N, IERR)
Definition: utils_med.F:3509
subroutine point2seg(P1, P2, BND_TYP_P1, BND_TYP_P2, SEG)
Definition: utils_med.F:4895
type(med_info), dimension(max_file) med_obj_tab
Definition: utils_med.F:81
subroutine open_mesh_med(FILE_NAME, FILE_ID, OPEN_MODE, IERR, MESH_NUMBER)
Definition: utils_med.F:95
integer, parameter hermes_unknown_group_err
integer, parameter triangle_bnd_elt_type
subroutine get_mesh_dimension_med(FILE_ID, NDIM, IERR)
Definition: utils_med.F:887
subroutine get_mesh_orig_med(FILE_ID, X_ORIG, Y_ORIG, IERR)
Definition: utils_med.F:1206
integer, parameter tetrahedron_elt_type
integer, parameter quadrangle_elt_type
subroutine set_header_med(FILE_ID, TITLE, IERR)
Definition: utils_med.F:3142
integer, parameter hermes_med_not_loaded_err
subroutine close_mesh_med(FILE_ID, IERR)
Definition: utils_med.F:296
subroutine ifvector_(STRING, COMP_NUM, ISVECTOR)
Definition: utils_med.F:4503
subroutine update_data_mesh_med(FILE_ID, TIME, RECORD, NB_DIM_MESH, NPOIN, COORD, IERR)
Definition: utils_med.F:4446
subroutine get_mesh_nptir_med(FILE_ID, NPTIR, IERR)
Definition: utils_med.F:1116
integer, parameter kid
Definition: utils_med.F:38
subroutine get_mesh_nplan_med(FILE_ID, NPLAN, IERR)
Definition: utils_med.F:1299
subroutine transfer_group_info_common_med(SOURCE_ID, DEST_ID, MNAME_SRC, MNAME_DST, HAS_FAM_ON_POINT, IERR)
Definition: utils_med.F:3593
integer, parameter hermes_var_unknown_err
subroutine open_index(FILENAME, FILE_ID)
subroutine get_data_value_med(FILE_ID, RECORD, VAR_NAME, RES_VALUE, N, IERR)
Definition: utils_med.F:3048
integer, dimension(max_file) hash
Definition: utils_med.F:79
subroutine get_mesh_date_med(FILE_ID, DATE, IERR)
Definition: utils_med.F:1382
subroutine get_data_ntimestep_med(FILE_ID, NTIMESTEP, IERR)
Definition: utils_med.F:2899
integer, parameter offset
Definition: utils_med.F:85
subroutine get_bnd_npoin_med(FILE_ID, TYPE_BND_ELEM, NPTFR, IERR)
Definition: utils_med.F:2419
subroutine get_data_time_med(FILE_ID, RECORD, TIME, IERR)
Definition: utils_med.F:2972
subroutine get_bnd_nelem_med(FILE_ID, TYPE_ELEM, BND_NELEM, IERR)
Definition: utils_med.F:2014