1/* -*- mode:C; coding:utf-8 -*- */
2/*  This file is part of MED.
3 *
4 *  COPYRIGHT (C) 1999 - 2019  EDF R&D, CEA/DEN
5 *  MED is free software: you can redistribute it and/or modify
6 *  it under the terms of the GNU Lesser General Public License as published by
7 *  the Free Software Foundation, either version 3 of the License, or
8 *  (at your option) any later version.
9 *
10 *  MED is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 *  GNU Lesser General Public License for more details.
14 *
15 *  You should have received a copy of the GNU Lesser General Public License
16 *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef MED_H
20#define MED_H
21
22#include <hdf5.h>
23#ifdef HAVE_STDINT_H
24#include <stdint.h>   // Use the C99 official header
25#endif
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31/* This is the minimum hdf version med must have  */
32#define HDF_VERSION_REF @HDF_VERSION_REF@
33#define HDF_VERSION_MAJOR_REF @HDF_VERSION_MAJOR_REF@
34#define HDF_VERSION_MINOR_REF @HDF_VERSION_MINOR_REF@
35#define HDF_VERSION_RELEASE_REF @HDF_VERSION_RELEASE_REF@
36#define HDF_VERSION_NUM_REF (HDF_VERSION_MAJOR_REF * 10000 + HDF_VERSION_MINOR_REF * 100  + HDF_VERSION_RELEASE_REF )
37
38#define HDF5_VERSION (H5_VERS_MAJOR * 10000 + H5_VERS_MINOR * 100  + H5_VERS_RELEASE )
39
40#define HDF5_SELECT_BUG
41
42/*Le symbole H5F_LIBVER_18 n'existe pas dans hdf5-1.8.4 (uniquement à partir de la version 1.8.6)
43  Pour rester dans le modèle interne hdf introduit en 1.8 quelque soit les futurs modèles internes hdf
44  on impose le modèle 1.8 et non le LATEST (cf _MEDfileCreate).
45  La valeur utilisée est celle définie dans les  version >= 1.8.6 (cf H5Fpublic.h) */
46#ifndef H5F_LIBVER_18
47/** \internal*/
48#define H5F_LIBVER_18 1
49#endif
50
51/*En anglais*/
52#define MED_MAJOR_NUM @MED_NUM_MAJEUR@
53#define MED_MINOR_NUM @MED_NUM_MINEUR@
54#define MED_RELEASE_NUM @MED_NUM_RELEASE@
55#define MED_3_LATEST_MINOR @MED_3_LATEST_MINOR@
56#define MED_4_LATEST_MINOR @MED_NUM_MINEUR@
57/*En franglais*/
58#define MED_NUM_MAJEUR @MED_NUM_MAJEUR@
59#define MED_NUM_MINEUR @MED_NUM_MINEUR@
60#define MED_NUM_RELEASE @MED_NUM_RELEASE@
61
62#define STR(x) #x
63#define _MED_VERSION(x,y,z) STR(x) "." STR(y) "." STR(z)
64#define MED_VERSION_STR _MED_VERSION(MED_NUM_MAJEUR,MED_NUM_MINEUR,MED_NUM_RELEASE)
65
66@MED_DEFINE_MED_HAVE_MPI@
67
68#define MED_NULL       (void *) NULL
69#define MED_MAX_PARA        20
70
71/** Longueurs des chaînes de caractères stockées dans les fichiers */
72#define MED_COMMENT_SIZE 200
73#define MED_IDENT_SIZE 8
74#define MED_NAME_SIZE 64
75#define MED_SNAME_SIZE 16
76#define MED_LNAME_SIZE 80
77
78#define MED_SNAME_BLANK "                "
79#define MED_NAME_BLANK  "                                                                "
80/*                       0123456789012345678901234567890123456789012345678901234567890123*/
81
82#define MED_PATHNAME_SIZE 255
83#define MED_MAX_CHFID_PATH MED_PATHNAME_SIZE  /**< Taille maximum du chemin d'accès au groupe cible pour MEDfileObjectsMountById */
84
85/** \enum med_switch_mode Mode d'entrelacement
86    \details Indique le mode d'entrelacement utilisé en mémoire par l'application.
87*/
88/* 2.3v3.0 ok*/
89typedef enum {MED_FULL_INTERLACE, /**<Exemple avec 3 composantes X,Y,Z : X1Y1Z1X2Y2Z2X3Y3Z3...
90				      Exemple avec 3 MED_TRIA3 T1,T2,T3 : N11N12N13 N21N22N23 N31N32N33 */
91	      MED_NO_INTERLACE,    /**<Exemple avec 3 composantes X,Y,Z : X1X2X3Y1Y2Y3Z1Z2Z3...
92				       Exemple avec 3 MED_TRIA3 T1,T2,T3 : N11N21N31 N12N22N32 N13N23N33 */
93              MED_UNDEF_INTERLACE=-1/**<Mode d'entelacement non défini */
94	}  med_switch_mode;
95
96
97/**\enum med_storage_mode Mode de stockage global ou compact.
98   \details Indique le mode de stockage utilisé par l'application.
99*/
100/* 2.3v3.0 ok*/
101typedef enum { MED_UNDEF_STMODE,  /**< Mode de stockage en mémoire non initialisé*/
102               MED_GLOBAL_STMODE, /**< Le stockage utilisé contient en mémoire toutes les valeurs relatives à toutes les entités d'un même type.*/
103	       MED_COMPACT_STMODE, /**< Le stockage utilisé contient en mémoire contigüe un sous-ensemble de valeurs relatives à un sous-ensemble d'entités d'un même type.*/
104               MED_GLOBAL_PFLMODE=MED_GLOBAL_STMODE,   /**< Old name, do not use it anymore*/
105               MED_COMPACT_PFLMODE=MED_COMPACT_STMODE, /**< Old name, do not use it anymore*/
106               MED_UNDEF_PFLMODE=MED_UNDEF_STMODE      /**< Old name, do not use it anymore*/
107	     }  med_storage_mode;
108
109
110/**\enum med_access_mode
111   \details Permet de choisir le mode d'ouverture d'un fichier MED.
112*/
113typedef enum {MED_ACC_RDONLY, /**<Ouverture en lecture seule*/
114              MED_ACC_RDWR,   /**<Ouverture en lecture/ecriture. L'écriture d'un élément existant écrase l'élément.*/
115              MED_ACC_RDEXT,  /**<Ouverture en lecture/ecriture. L'écriture d'un élément existant génère une erreur.*/
116              MED_ACC_CREAT,  /**<Créer le fichier s'il n'existe pas, l'écrase sinon*/
117              MED_ACC_UNDEF   /**<Variable globale interne initialisée au mode d'ouverture*/
118             } med_access_mode;
119
120/**\enum med_mesh_type
121   \details Permet de choisir le type d'un maillage : non structuré ou structuré.
122*/
123/*2.3v3.0 ok*/
124typedef enum {MED_UNSTRUCTURED_MESH, MED_STRUCTURED_MESH, MED_UNDEF_MESH_TYPE=-1} med_mesh_type;
125
126/**\enum med_grid_type
127   \details Permet de définir le type de grille d'un maillage structuré.
128*/
129/* 2.3v3.0 ok*/
130typedef enum {MED_CARTESIAN_GRID,
131	      MED_POLAR_GRID,
132	      MED_CURVILINEAR_GRID,
133	      MED_UNDEF_GRID_TYPE=-1} med_grid_type;
134
135/* 2.3v3.0 ok*/
136typedef enum {MED_CELL, MED_DESCENDING_FACE, MED_DESCENDING_EDGE, MED_NODE,
137	      MED_NODE_ELEMENT, MED_STRUCT_ELEMENT, MED_ALL_ENTITY_TYPE,
138	      MED_UNDEF_ENTITY_TYPE=-1 } med_entity_type;
139#define MED_N_ENTITY_TYPES 6
140
141/* 2.3v3.0 ok*/
142typedef enum {MED_COORDINATE, MED_CONNECTIVITY, MED_NAME, MED_NUMBER,  MED_FAMILY_NUMBER,
143	MED_COORDINATE_AXIS1, MED_COORDINATE_AXIS2, MED_COORDINATE_AXIS3,
144	MED_INDEX_FACE, MED_INDEX_NODE, MED_GLOBAL_NUMBER,
145	MED_VARIABLE_ATTRIBUTE, MED_COORDINATE_TRSF,MED_UNDEF_DATATYPE=-1} med_data_type;
146
147/* 2.3v3.0 ok*/
148/** \internal*/
149typedef enum {MED_INTERNAL_FLOAT32=4, MED_INTERNAL_FLOAT64=6,
150	      MED_INTERNAL_INT32=24 , MED_INTERNAL_INT64=26, MED_INTERNAL_INT=28,
151	      MED_INTERNAL_NAME=30  , MED_INTERNAL_SNAME=32,
152	      MED_INTERNAL_LNAME=34 , MED_INTERNAL_IDENT=38,
153	      MED_INTERNAL_CHAR=40  , MED_INTERNAL_UNDEF =0 } med_internal_type; /**< \internal */
154
155/*TODO: Réécrire les routines _MEDatt avec med_internal_type au lieu de med_field_type */
156
157  typedef enum {MED_DOUBLE=MED_INTERNAL_FLOAT64,  /**<Type réel 64bits */
158		MED_FLOAT64=MED_INTERNAL_FLOAT64, /**<Type réel 64bits */
159		MED_FLOAT32=MED_INTERNAL_FLOAT32, /**<Type réel 32bits */
160		MED_INT32=MED_INTERNAL_INT32,     /**<Type entier 32bits */
161		MED_INT64=MED_INTERNAL_INT64,     /**<Type entier 64bits */
162		MED_INT=MED_INTERNAL_INT          /**<Type entier med_int dépendant de l'option de configuration --med-int */
163                                        }  med_field_type;
164
165typedef enum {MED_ATT_FLOAT64=MED_INTERNAL_FLOAT64,
166	      MED_ATT_INT=MED_INTERNAL_INT,
167	      MED_ATT_NAME=MED_INTERNAL_NAME,
168	      MED_ATT_UNDEF=MED_INTERNAL_UNDEF }  med_attribute_type;
169
170typedef med_field_type med_parameter_type;
171
172#define MED_ATT_FLOAT64_ctype   med_float       /**< \internal */
173#define MED_ATT_INT_ctype 	med_int         /**< \internal */
174#define MED_ATT_NAME_ctype 	char            /**< \internal */
175#define MED_ATT_UNDEF_ctype   	unknown_ctype   /**< \internal */
176
177#define MED_CTYPE(medatttype) medatttype##_ctype
178
179/* 2.3v3.0 ok : med_type_donnee*/
180typedef enum {MED_MESH, MED_FIELD, MED_LIBRARY, MED_FILE,
181	MED_MESH_SUPPORT,MED_ELSTRUCT, MED_FAMILY,MED_EQUIVALENCE, MED_GROUP, MED_JOINT,
182	MED_LOCALIZATION, MED_PROFILE, MED_FILTER, MED_INTERPOLATION, MED_NUMERICAL_DATA,
183	MED_LINK, MED_CLASS_UNDEF=-1, MED_CLASS_ALL=-2 } med_class;
184
185
186typedef int med_geometry_type;
187
188/* Mailles dont la géométrie à une connectivité fixe*/
189
190#define MED_POINT1 001
191
192#define MED_SEG2 102
193#define MED_SEG3 103
194#define MED_SEG4 104
195#define MED_TRIA3 203
196#define MED_QUAD4 204
197#define MED_TRIA6 206
198#define MED_TRIA7 207
199#define MED_QUAD8 208
200#define MED_QUAD9 209
201
202#define MED_TETRA4 304
203#define MED_PYRA5 305
204#define MED_PENTA6 306
205#define MED_HEXA8 308
206#define MED_TETRA10 310
207#define MED_OCTA12 312
208#define MED_PYRA13 313
209#define MED_PENTA15 315
210#define MED_PENTA18 318
211#define MED_HEXA20 320
212#define MED_HEXA27 327
213
214/* Mailles dont la géométrie à une connectivité variable*/
215#define MED_POLYGON 400
216#define MED_POLYGON2 420
217#define MED_POLYHEDRON 500
218
219/* Mailles dont la géométrie est dynamique (découverte du modèle dans le fichier) */
220#define MED_STRUCT_GEO_INTERNAL 600
221#define MED_STRUCT_GEO_SUP_INTERNAL 700
222
223#define MED_NONE 0
224#define MED_NO_GEOTYPE MED_NONE
225#define MED_UNDEF_GEOTYPE MED_NONE
226#define MED_UNDEF_GEOMETRY_TYPE MED_NONE
227#define MED_ALL_GEOTYPE -1
228#define MED_GEO_ALL MED_ALL_GEOTYPE
229
230#define MED_N_CELL_GEO            25 /**< Nombre de types géométriques de mailles */
231#define MED_N_CELL_FIXED_GEO      24 /**< Nombre de types géométriques statiques de mailles */
232#define MED_N_CELL_GEO_FIXED_CON  21 /**< Nombre de types géométriques statiques de mailles à connectivité fixe */
233
234#define MED_N_FACE_GEO               8
235#define MED_N_FACE_FIXED_GEO         8
236#define MED_N_FACE_GEO_FIXED_CON     6
237
238#define MED_N_EDGE_TYPES             3
239#define MED_N_EDGE_FIXED_GEO         3
240#define MED_N_EDGE_GEO_FIXED_CON     3
241
242#define MED_N_NODE_GEO               1
243#define MED_N_NODE_FIXED_GEO         1
244#define MED_N_NODE_GEO_FIXED_CON     1
245
246/*2.3v3.0 ok*/
247typedef enum {MED_NODAL, MED_DESCENDING, MED_UNDEF_CONNECTIVITY_MODE=-1, MED_NO_CMODE=-1} med_connectivity_mode;
248
249/*2.3v3.0 ok*/
250typedef enum {MED_CARTESIAN, MED_CYLINDRICAL, MED_SPHERICAL, MED_UNDEF_AXIS_TYPE=-1} med_axis_type;
251
252typedef enum {MED_FALSE, MED_TRUE} med_bool ;
253
254#define MED_GAUSS_ELNO "MED_GAUSS_ELNO" /** < Localisation des points d'intégrations aux
255					     noeuds des élements. L'utilisation de cette
256					     localisation ne necessite pas sa création au préalable. */
257#define MED_IPOINT_ELNO MED_GAUSS_ELNO
258
259
260#define MED_NO_NAME ""                  /**< De manière générale une chaîne vide indique l'abscence de nom MED.*/
261
262#define MED_NO_MESHNAME ""              /**< Indique qu'il n'y a pas de maillage */
263#define MED_NO_MESH     ""              /**< Indique qu'il n'y a pas de maillage */
264
265#define MED_NO_MESH_SUPPORT ""          /**< Indique qu'il n'y a pas de maillage support  */
266
267#define MED_NO_LOCALIZATION ""          /**< Indique qu'il n'y a pas de localisation de points d'intégration */
268
269#define MED_NO_INTERPOLATION ""         /**< Indique qu'il n'y a pas de fonction d'interpolation  */
270
271#define MED_NO_IPOINT_INTERNAL 1       /**< \internal */
272
273#define MED_NO_PROFILE ""                     /**< Indique l'absence de profil.
274						 Ce profil est équivalent à celui qui sélectionne
275						 tous les éléments #MED_ALLENTITIES_PROFILE
276						 \internal L'utilisation d'une chaine vide permet de tester rapidement la taille*/
277
278#define MED_NO_GROUP ""                 /**< Indique l'absence de groupe dans la famille 0 */
279
280#define MED_ALLENTITIES_PROFILE MED_NO_PROFILE /**<Indique qu'il s'agit d'un profil qui selectionne toutes les entités.
281						  Ce profil est équivalent à #MED_NO_PROFILE . */
282
283
284#define MED_NO_PROFILE_INTERNAL   "MED_NO_PROFILE_INTERNAL"   /**< \internal*/
285#define MED_SAME_PROFILE_INTERNAL "MED_SAME_PROFILE_INTERNAL" /**< \internal*/
286
287#define MED_ALL_CONSTITUENT 0                 /**<Selectionne tous les constituants d'une valeur.
288						 Les constituants d'une valeur peuvent être les composantes
289						 des coordonnées des noeuds, les noeuds d'une connectivité nodal,
290						 les composantes d'un champ. */
291#define MED_UNDEF_SIZE 0
292#define MED_NO_PROFILE_SIZE 0  /**<Fourni une valeur de taille de profil par défaut d'utilisation de la notion de profil.*/
293
294typedef enum {MED_SORT_DTIT,MED_SORT_ITDT,MED_SORT_UNDEF=-1 } med_sorting_type; /**<Indique l'ordre de tri des séquences de calcul d'un maillage.
295                                                                                    Cette ordre, fixé à la création du maillage
296										    est important pour comparer l'évolution du maillage
297                                                                                    d'une séquence de calcul à une autre.
298										    Utilisé conjointement avec les profils,
299										    il permet de réduire les écritures aux
300										    seules informations modifiées  par rapport
301										    à la séquence de calcul précédente. */
302
303#define MED_NO_DT -1 /**<Indique que l'on n'utilise pas la notion de date.*/
304#define MED_NO_IT -1 /**<Indique que l'on n'utilise pas la notion d'itération.*/
305#define MED_UNDEF_DT 0 /**<Fourni une valeur de date par défaut d'utilisation de la notion de date.*/
306
307#define MED_ATT_NOT_FILLED -1
308
309
310/* correspondance des types avec HDF 5 */
311
312typedef hsize_t        med_size;  /**< \internal */
313typedef hssize_t       med_ssize; /**< \internal */
314typedef hid_t          med_idt;   /**< \internal */
315typedef herr_t         med_err;   /**< \internal */
316
317/* types elementaires */
318
319typedef double         med_float;
320typedef double         med_float64;
321typedef double         med_double;
322typedef float          med_float32;
323
324/*La ligne suivante est déterminée à l'étape de configuration*/
325typedef @LONG_OR_INT@  med_int; /**< La taille du med_int est paramétrable à l'étape de configuration de med fichier. */
326typedef @MED_INT32@  med_int32;     /**< L'entier med de taille fixe 32bits. */
327typedef @MED_INT64@  med_int64; /**< L'entier med  de taille fixe 64bits. */
328
329#define INIT2X( x ) x, x,
330#define INIT4X( x ) x, x, x, x
331#define INIT10X( x ) x, x, x, x, x, x, x, x, x, x
332#define MED_MAX_FILTER_SPACES 4100
333#define MED_MAX_FILTER_SPACES_INIT {INIT4X(INIT10X(INIT10X(INIT10X(0)))), INIT10X(INIT10X(0)) }
334
335/** \struct med_filter
336    \brief  Filtre de sélection.
337*/
338typedef struct {
339  /*PRIVATE attributes*/
340  med_int          nspaces;
341  med_idt          memspace[MED_MAX_FILTER_SPACES];
342  med_idt          diskspace[MED_MAX_FILTER_SPACES];
343  /*PUBLIC IN attributes*/
344  med_int          nentity;
345  med_int          nvaluesperentity;
346  med_int          nconstituentpervalue;
347  med_int          constituentselect;
348  med_switch_mode  switchmode;
349  med_int          filterarraysize;
350  med_size*        filterarray23v30;
351  med_int          profilearraysize;/*PRIVATE attribute en IN et OUT positionnée dans MEDfilterCr*/
352  med_storage_mode storagemode;
353  char             profilename[MED_NAME_SIZE+1];
354} med_filter;
355
356
357#define MED_FILTER_INIT { 0, MED_MAX_FILTER_SPACES_INIT, MED_MAX_FILTER_SPACES_INIT ,0,0,0,0,\
358                          MED_UNDEF_INTERLACE,MED_NO_FILTER_SIZE, NULL , \
359                          MED_NO_PROFILE_SIZE,MED_UNDEF_PFLMODE,MED_NO_PROFILE }
360
361#define MED_NO_FILTER NULL
362#define MED_NO_FILTER_SIZE 0
363#define MED_NO_PROFILE_F "                                "
364
365/** \struct med_file_version
366    \brief  Structure d'acceuil du numéro de version MED d'un fichier.
367*/
368typedef struct {
369  med_int majeur; med_int mineur; med_int release;
370} med_file_version;
371#define MED_FILE_VERSION_INIT {0, 0, 0};
372
373/** \struct med_memfile
374    \brief  Structure d'acceuil du buffer d'un fichier MED en mémoire.
375*/
376typedef struct {
377  void *app_image_ptr; /**< Pointeur de l'emplacement contenant l'image mémoire au format MED */
378  size_t app_image_size; /**< La taille  de l'image mémoire*/
379  int ref_count; /**< Counteur de référence sur le nombre d'utilisation d'une image mémoire */
380
381  void *fapl_image_ptr; /**< \internal Pointer to FAPL buffer */
382  size_t fapl_image_size;/**< \internal Size of FAPL buffer */
383  int fapl_ref_count; /**< \internal Reference counter for FAPL buffer */
384  void *vfd_image_ptr; /**< \internal Pointer to VFD buffer */
385  size_t vfd_image_size; /**< \internal Size of VFD buffer */
386  int vfd_ref_count; /**< \internal Reference counter for VFD buffer */
387  med_access_mode flags; /**< \internal Flags indicate how the file image will be open */
388} med_memfile ;
389
390#define MED_MEMFILE_INIT {NULL, 0, 1, NULL, 0, 0, NULL, 0, 0, MED_ACC_RDONLY}
391
392/** \internal */
393#define AFF_MEMFILE \
394XSCRUTE(memfile->app_image_ptr);\
395ISCRUTE_long(memfile->app_image_size);\
396ISCRUTE_int(memfile->ref_count);\
397XSCRUTE(memfile->fapl_image_ptr);\
398ISCRUTE_long(memfile->fapl_image_size);\
399ISCRUTE_int(memfile->fapl_ref_count);\
400XSCRUTE(memfile->vfd_image_ptr);\
401ISCRUTE_long(memfile->vfd_image_size);\
402ISCRUTE_int(memfile->vfd_ref_count);\
403ISCRUTE_int(memfile->flags);
404
405
406#include "med_proto.h"
407
408/*En cas de modifications/ajouts de type d'entité/géométrique mettre à jour les itérateurs suivants : */
409
410extern MEDC_EXPORT med_entity_type MED_GET_ENTITY_TYPE[MED_N_ENTITY_TYPES+2];
411extern MEDC_EXPORT const char * const MED_GET_ENTITY_TYPENAME[MED_N_ENTITY_TYPES+2];
412extern MEDC_EXPORT med_geometry_type MED_GET_CELL_GEOMETRY_TYPE[MED_N_CELL_FIXED_GEO+2];
413extern MEDC_EXPORT const char * const MED_GET_CELL_GEOMETRY_TYPENAME[MED_N_CELL_FIXED_GEO+2];
414extern MEDC_EXPORT med_geometry_type MED_GET_FACE_GEOMETRY_TYPE[MED_N_FACE_FIXED_GEO+2];
415extern MEDC_EXPORT const char * const MED_GET_FACE_GEOMETRY_TYPENAME[MED_N_FACE_FIXED_GEO+2];
416extern MEDC_EXPORT med_geometry_type MED_GET_EDGE_GEOMETRY_TYPE[MED_N_EDGE_FIXED_GEO+2];
417extern MEDC_EXPORT const char * MED_GET_EDGE_GEOMETRY_TYPENAME[MED_N_EDGE_FIXED_GEO+2];
418extern MEDC_EXPORT med_geometry_type MED_GET_NODE_GEOMETRY_TYPE[MED_N_NODE_FIXED_GEO+2];
419extern MEDC_EXPORT const char * MED_GET_NODE_GEOMETRY_TYPENAME[MED_N_NODE_FIXED_GEO+2];
420
421/*      Predefined names for struct elements            */
422#define MED_PARTICLE_NAME   "MED_PARTICLE"
423#define MED_BALL_NAME       "MED_BALL"
424#define MED_BEAM_NAME       "MED_BEAM"
425
426/* 	Predefined attributes names for struct elements */
427#define MED_PARTICLE_LABEL  "MED_PARTICLE_LABEL"
428#define MED_BALL_DIAMETER   "MED_BALL_DIAMETER"
429#define MED_BEAM_THICKNESS  "MED_BEAM_THICKNESS"
430
431#ifdef __cplusplus
432}
433#endif
434
435#endif  /* MED_H */
436