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