med/med-hdf5-1.12.patch

447 lines
22 KiB
Diff
Raw Normal View History

2021-12-03 08:51:15 +00:00
diff -rupN med-4.1.0/config/cmake_files/medMacros.cmake med-4.1.0-new/config/cmake_files/medMacros.cmake
--- med-4.1.0/config/cmake_files/medMacros.cmake 2021-12-03 09:35:30.675827163 +0100
+++ med-4.1.0-new/config/cmake_files/medMacros.cmake 2021-12-03 09:32:31.894994147 +0100
@@ -447,7 +447,7 @@ MACRO(MED_FIND_HDF5)
##
## Requires 1.10.x version
##
- IF (NOT HDF_VERSION_MAJOR_REF EQUAL 1 OR NOT HDF_VERSION_MINOR_REF EQUAL 10 OR NOT HDF_VERSION_RELEASE_REF GREATER 1)
+ IF (HDF5_VERSION VERSION_LESS 1.10.2)
MESSAGE(FATAL_ERROR "HDF5 version is ${HDF_VERSION_REF}. Only versions >= 1.10.2 are supported.")
ENDIF()
##
diff -rupN med-4.1.0/src/ci/MEDfileCompatibility.c med-4.1.0-new/src/ci/MEDfileCompatibility.c
--- med-4.1.0/src/ci/MEDfileCompatibility.c 2021-12-03 09:35:30.676827162 +0100
+++ med-4.1.0-new/src/ci/MEDfileCompatibility.c 2021-12-03 09:33:26.292942149 +0100
@@ -71,7 +71,7 @@ MEDfileCompatibility(const char* const f
_hversionMMR=10000*_hmajeur+100*_hmineur+_hrelease;
/* ISCRUTE(_hversionMMR); */
/* ISCRUTE(HDF_VERSION_NUM_REF); */
- if ( (_hversionMMR >= HDF_VERSION_NUM_REF) && (_hmineur == HDF_VERSION_MINOR_REF) ) *hdfok = MED_TRUE;
+ if (_hversionMMR >= HDF_VERSION_NUM_REF) *hdfok = MED_TRUE;
/* TODO : Vérifier si la version mineure HDF du fichier est supérieure
à la version mineure de la bibliothèque HDF utilisée :
@@ -113,7 +113,7 @@ MEDfileCompatibility(const char* const f
#if MED_NUM_MAJEUR != 4
#error "Don't forget to update the test version here when you change the major version of the library !"
#endif
-#if H5_VERS_MINOR > 10
+#if H5_VERS_MINOR > 12
#error "Don't forget to check the compatibility version of the library, depending on the internal hdf model choice !"
#error "Cf. _MEDfileCreate ..."
#endif
diff -rupN med-4.1.0/src/hdfi/_MEDattributeNumWrByName.c med-4.1.0-new/src/hdfi/_MEDattributeNumWrByName.c
--- med-4.1.0/src/hdfi/_MEDattributeNumWrByName.c 2020-03-11 10:36:37.000000000 +0100
+++ med-4.1.0-new/src/hdfi/_MEDattributeNumWrByName.c 2021-12-03 09:33:08.851958696 +0100
@@ -68,7 +68,7 @@ med_err _MEDattributeNumWrByName(med_idt
if ( (_attid=H5Aopen_by_name( pid, path, attname, H5P_DEFAULT, H5P_DEFAULT )) >= 0 ) {
- if ( H5Oget_info( pid, &_oinfo ) <0) {
+ if ( H5Oget_info( pid, &_oinfo, H5O_INFO_ALL ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info");
goto ERROR;
}
diff -rupN med-4.1.0/src/hdfi/_MEDattributeNumWr.c med-4.1.0-new/src/hdfi/_MEDattributeNumWr.c
--- med-4.1.0/src/hdfi/_MEDattributeNumWr.c 2020-03-11 10:36:37.000000000 +0100
+++ med-4.1.0-new/src/hdfi/_MEDattributeNumWr.c 2021-12-03 09:33:11.840955852 +0100
@@ -77,7 +77,7 @@ med_err _MEDattributeNumWr(med_idt pid,
if ( (_attid=H5Aopen( pid, attname, H5P_DEFAULT )) >= 0 ) {
- if ( H5Oget_info( pid, &_oinfo ) <0) {
+ if ( H5Oget_info( pid, &_oinfo, H5O_INFO_ALL ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info");
goto ERROR;
}
diff -rupN med-4.1.0/src/hdfi/_MEDcheckAttributeStringFunc.c med-4.1.0-new/src/hdfi/_MEDcheckAttributeStringFunc.c
--- med-4.1.0/src/hdfi/_MEDcheckAttributeStringFunc.c 2020-03-11 10:36:37.000000000 +0100
+++ med-4.1.0-new/src/hdfi/_MEDcheckAttributeStringFunc.c 2021-12-03 09:33:14.266953546 +0100
@@ -40,7 +40,7 @@ med_err _MEDcheckAttributeStringFunc(med
oinfo.type=H5G_LINK;
break;
case H5L_TYPE_HARD:
- if ( H5Oget_info_by_name( id, lname, &oinfo, H5P_DEFAULT ) <0) {
+ if ( H5Oget_info_by_name( id, lname, &oinfo, H5O_INFO_ALL, H5P_DEFAULT ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info_by_name");
SSCRUTE(lname);
}
diff -rupN med-4.1.0/src/hdfi/_MEDchecknSublinkFunc.c med-4.1.0-new/src/hdfi/_MEDchecknSublinkFunc.c
--- med-4.1.0/src/hdfi/_MEDchecknSublinkFunc.c 2020-03-11 10:36:36.000000000 +0100
+++ med-4.1.0-new/src/hdfi/_MEDchecknSublinkFunc.c 2021-12-03 09:33:16.487951437 +0100
@@ -41,7 +41,7 @@ med_err _MEDchecknSublinkFunc(med_idt id
oinfo.type=H5G_LINK;
break;
case H5L_TYPE_HARD:
- if ( H5Oget_info_by_name( id, lname, &oinfo, H5P_DEFAULT ) <0) {
+ if ( H5Oget_info_by_name( id, lname, &oinfo, H5O_INFO_ALL, H5P_DEFAULT ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info_by_name");
SSCRUTE(lname);
}
diff -rupN med-4.1.0/src/hdfi/_MEDdatagroupExist.c med-4.1.0-new/src/hdfi/_MEDdatagroupExist.c
--- med-4.1.0/src/hdfi/_MEDdatagroupExist.c 2020-03-11 10:36:37.000000000 +0100
+++ med-4.1.0-new/src/hdfi/_MEDdatagroupExist.c 2021-12-03 09:33:18.742949298 +0100
@@ -45,7 +45,7 @@ med_err _MEDdatagroupExist(const med_idt
case H5L_TYPE_HARD:
*isasoftlink = MED_FALSE;
- if ( H5Oget_info_by_name( gid, datagroupname, &_oinfo, H5P_DEFAULT ) <0) {
+ if ( H5Oget_info_by_name( gid, datagroupname, &_oinfo, H5O_INFO_ALL, H5P_DEFAULT ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info_by_name");
SSCRUTE( datagroupname);
}
diff -rupN med-4.1.0/src/hdfi/_MEDdatasetExist.c med-4.1.0-new/src/hdfi/_MEDdatasetExist.c
--- med-4.1.0/src/hdfi/_MEDdatasetExist.c 2020-03-11 10:36:37.000000000 +0100
+++ med-4.1.0-new/src/hdfi/_MEDdatasetExist.c 2021-12-03 09:33:24.158944167 +0100
@@ -47,7 +47,7 @@ med_err _MEDdatasetExist(const med_idt
case H5L_TYPE_HARD:
*isasoftlink = MED_FALSE;
- if ( H5Oget_info_by_name( gid, datasetname, &_oinfo, H5P_DEFAULT ) <0) {
+ if ( H5Oget_info_by_name( gid, datasetname, &_oinfo, H5O_INFO_ALL, H5P_DEFAULT ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info_by_name");
SSCRUTE( datasetname);
}
diff -rupN med-4.1.0/src/hdfi/_MEDfileCreate.c med-4.1.0-new/src/hdfi/_MEDfileCreate.c
--- med-4.1.0/src/hdfi/_MEDfileCreate.c 2021-12-03 09:35:30.677827161 +0100
+++ med-4.1.0-new/src/hdfi/_MEDfileCreate.c 2021-12-03 09:32:31.894994147 +0100
@@ -159,7 +159,7 @@ med_idt _MEDfileCreate(const char * cons
* En HDF5-1.10.0p1 cela n'a aucun effet !
* Un test autoconf permet de fixer un intervalle de version HDF à MED.
*/
-#if H5_VERS_MINOR > 10
+#if H5_VERS_MINOR > 12
#error "Don't forget to change the compatibility version of the library !"
#endif
diff -rupN med-4.1.0/src/hdfi/_MEDfileOpen.c med-4.1.0-new/src/hdfi/_MEDfileOpen.c
--- med-4.1.0/src/hdfi/_MEDfileOpen.c 2021-12-03 09:35:30.677827161 +0100
+++ med-4.1.0-new/src/hdfi/_MEDfileOpen.c 2021-12-03 09:32:31.894994147 +0100
@@ -72,7 +72,7 @@ med_idt _MEDfileOpen(const char * const
• The creation order tracking property, H5P_CRT_ORDER_TRACKED, has been set in the group creation property list (see H5Pset_link_creation_order).
*/
-#if H5_VERS_MINOR > 10
+#if H5_VERS_MINOR > 12
#error "Don't forget to change the compatibility version of the library !"
#endif
/* L'avantage de bloquer le modèle interne HDF5
diff -rupN med-4.1.0/src/hdfi/_MEDlinkObjs.c med-4.1.0-new/src/hdfi/_MEDlinkObjs.c
--- med-4.1.0/src/hdfi/_MEDlinkObjs.c 2020-03-11 10:36:37.000000000 +0100
+++ med-4.1.0-new/src/hdfi/_MEDlinkObjs.c 2021-12-03 09:33:21.096947067 +0100
@@ -62,7 +62,7 @@ med_err _MEDlinkobjs(med_idt id,const ch
sur un lien hard
Sur un lien soft H5O_TYPE_UNKNOWN
*/
- if ( H5Oget_info_by_name( id, lname, &oinfo, H5P_DEFAULT ) <0) {
+ if ( H5Oget_info_by_name( id, lname, &oinfo, H5O_INFO_ALL, H5P_DEFAULT ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info_by_name");
SSCRUTE(lname);
}
diff -rupN med-4.1.0/src/hdfi/_MEDmemFileOpen.c med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c
--- med-4.1.0/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:35:30.678827160 +0100
+++ med-4.1.0-new/src/hdfi/_MEDmemFileOpen.c 2021-12-03 09:32:31.894994147 +0100
@@ -434,7 +434,7 @@ med_idt _MEDmemFileOpen(const char * con
goto ERROR;
}
-#if H5_VERS_MINOR > 10
+#if H5_VERS_MINOR > 12
#error "Don't forget to change the compatibility version of the library !"
#endif
if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18) ) {
diff -rupN med-4.1.0/src/hdfi/_MEDparFileCreate.c med-4.1.0-new/src/hdfi/_MEDparFileCreate.c
--- med-4.1.0/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:35:30.678827160 +0100
+++ med-4.1.0-new/src/hdfi/_MEDparFileCreate.c 2021-12-03 09:32:31.894994147 +0100
@@ -64,7 +64,7 @@ med_idt _MEDparFileCreate(const char * c
* En HDF5-1.10.0p1 cela n'a aucun effet !
* Un test autoconf permet de fixer un intervalle de version HDF à MED.
*/
-#if H5_VERS_MINOR > 10
+#if H5_VERS_MINOR > 12
#error "Don't forget to change the compatibility version of the library !"
#endif
diff -rupN med-4.1.0/src/hdfi/_MEDparFileOpen.c med-4.1.0-new/src/hdfi/_MEDparFileOpen.c
--- med-4.1.0/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:35:30.679827159 +0100
+++ med-4.1.0-new/src/hdfi/_MEDparFileOpen.c 2021-12-03 09:32:31.894994147 +0100
@@ -55,7 +55,7 @@ med_idt _MEDparFileOpen(const char * con
MED_ERR_(_fid,MED_ERR_INIT,MED_ERR_PROPERTY,MED_ERR_PARALLEL_MSG);
goto ERROR;
}
-#if H5_VERS_MINOR > 10
+#if H5_VERS_MINOR > 12
#error "Don't forget to change the compatibility version of the library !"
#endif
if ( H5Pset_libver_bounds( _fapl, H5F_LIBVER_18, H5F_LIBVER_18 ) ) {
diff -rupN med-4.1.0/tools/medimport/2.3.6/_MEDconvertStringDatasets.c med-4.1.0-new/tools/medimport/2.3.6/_MEDconvertStringDatasets.c
--- med-4.1.0/tools/medimport/2.3.6/_MEDconvertStringDatasets.c 2020-03-11 10:36:40.000000000 +0100
+++ med-4.1.0-new/tools/medimport/2.3.6/_MEDconvertStringDatasets.c 2021-12-03 09:34:42.715870908 +0100
@@ -52,7 +52,7 @@ med_err _MEDconvertStringDatasets(med_id
oinfo.type=(H5O_type_t) H5G_LINK;
break;
case H5L_TYPE_HARD:
- if ( H5Oget_info_by_name( id, lname, &oinfo, H5P_DEFAULT ) <0) {
+ if ( H5Oget_info_by_name( id, lname, &oinfo, H5O_INFO_ALL, H5P_DEFAULT ) <0) {
MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"H5Oget_info_by_name");
SSCRUTE(lname);
}
diff -rupN med-4.1.0/tools/medimport/4.0.0/_MEDfieldValueUpdateEntityList41.c med-4.1.0-new/tools/medimport/4.0.0/_MEDfieldValueUpdateEntityList41.c
--- med-4.1.0/tools/medimport/4.0.0/_MEDfieldValueUpdateEntityList41.c 1970-01-01 01:00:00.000000000 +0100
+++ med-4.1.0-new/tools/medimport/4.0.0/_MEDfieldValueUpdateEntityList41.c 2020-03-11 10:52:20.000000000 +0100
@@ -0,0 +1,253 @@
+/* This file is part of MED.
+ *
+ * COPYRIGHT (C) 1999 - 2020 EDF R&D, CEA/DEN
+ * MED is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MED is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with MED. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include <med.h>
+#include <med_config.h>
+#include <med_outils.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* Inclus par med.h.in */
+/* #include <stdint.h> */
+
+/* #define NDEBUG */
+/* #include <assert.h> */
+
+/* const char * const _MEDgetEntityListAttributeIName(const med_entity_type entitytype) { */
+/* switch( entitytype ) { */
+/* case MED_UNDEF_ENTITY_TYPE : return MED_NOM_LEN; break; */
+/* case MED_CELL : return MED_NOM_LGC; break; */
+/* case MED_NODE : return MED_NOM_LGN; break; */
+/* case MED_DESCENDING_FACE : return MED_NOM_LGF; break; */
+/* case MED_DESCENDING_EDGE : return MED_NOM_LGE; break; */
+/* case MED_NODE_ELEMENT : return MED_NOM_LGT; break; */
+/* case MED_STRUCT_ELEMENT : return MED_NOM_LGS; break; */
+/* } */
+/* } */
+/* /\*ALL : Toutes les étapes de calcul.*\/ */
+/* const char * const _MEDgetEntityListAttributeINameAll(const med_entity_type entitytype) { */
+/* switch( entitytype ) { */
+/* case MED_UNDEF_ENTITY_TYPE : return MED_NOM_LAA; break; */
+/* case MED_CELL : return MED_NOM_LCA; break; */
+/* case MED_NODE : return MED_NOM_LNA; break; */
+/* case MED_DESCENDING_FACE : return MED_NOM_LFA; break; */
+/* case MED_DESCENDING_EDGE : return MED_NOM_LEA; break; */
+/* case MED_NODE_ELEMENT : return MED_NOM_LTA; break; */
+/* case MED_STRUCT_ELEMENT : return MED_NOM_LSA; break; */
+/* } */
+/* } */
+
+
+/*Mise à jour de la liste des types d'entités/géométriques utilisés globlalement au niveau du datagroup _gid0 et
+ Mise à jour de la liste des types d'entités/géométriques utilisés localement au niveau du datagroup _gid1
+ Les gidname sont utilisés pour générér des messages d'erreur avec des informations significatives (todo : retrouver le nom avec l'objid)
+*/
+
+med_int _MEDfieldValueUpdateEntityList(const char * const gid0name ,
+ const char * const gid1name ,
+ const med_idt gid0 ,
+ const med_idt gid1 ,
+ const med_entity_type entitytype ,
+ const med_geometry_type geotype ,
+ const med_bool forentity ) {
+
+ med_bool _attexist = MED_FALSE;
+ med_err _ret = -1;
+ uint32_t _lentitytype1 = 0;
+ uint32_t _lentitytype2 = 0;
+ uint32_t _lentitytype1sav = 0;
+ uint32_t _lentitytype2sav = 0;
+ uint32_t _lgeotype = 0;
+ med_int _nsamelentitype = 0;
+ med_int _nsamelentitypesav = 0;
+ med_idt _gid = gid0;
+ med_idt _datagroup1 = gid1;
+ const char * _attname = NULL;
+ const char * _attallname = NULL;
+ const char * fieldname = gid0name;
+ const char * _datagroupname1 = gid1name;
+ med_entity_type _entytypeforattname = MED_UNDEF_ENTITY_TYPE;
+ int _it = 0;
+
+
+ /*Si l'on met à jour la liste des types géométriques (forentity==0), il faut récupérer :
+ - le nom de l'attribut qui les stocke pour l'entitytype passé en paramètre
+ - le nom de l'attribut qui stocke le nombre d'étapes de calcul qui ont la même liste
+ Sinon, on récupère, les noms d'attributs associés à la liste des type d'entités
+ */
+ if (! forentity) _entytypeforattname = entitytype;
+ _attname = _MEDgetEntityListAttributeIName (_entytypeforattname);
+ _attallname = _MEDgetEntityListAttributeINameAll (_entytypeforattname);
+
+ /* - La fonction MEDgetEntityGeometyTypeIt(entitytype,geotype) nous permet d'obtenir un numéro d'itération de type géométrique
+ (commence à 1 et est incrémental) que l'on associe à un numéro de bit d'un entier 32bits (1 entier pour chaque type d'entité)
+ - Cet entier est stocké pour chaque étape de calcul et globalement au champ (si au moins un type géométrique existe pour ce type d'entité).
+ Cela permet de limiter la taille du stockage et d'accéder directement par type d'entité aux types géométriques présents.
+ */
+ if (forentity)
+ _it=entitytype;
+ else
+ _it=MEDgetEntityGeometryTypeIt(entitytype, geotype)-1;
+
+ /* ISCRUTE_int(entitytype);ISCRUTE_int(geotype); */
+ /* SSCRUTE(MED_GET_ENTITY_TYPENAME[MEDgetEntityTypeIt(entitytype)]); */
+ /*TODO : Etudier la possibilité de récupérer le nom avec l'id de l'objet */
+
+ /* SSCRUTE(fieldname); */
+ /* SSCRUTE(MEDgetEntityTypeName(entitytype)); SSCRUTE(MEDgetGeometryTypeName(geotype)); */
+ /* SSCRUTE(_attname); SSCRUTE(_attallname); */
+
+ /*Lire l'attribut _attname s'il exite, sinon la valeur lue est nulle */
+ _MEDattributeExist(_gid,".",_attname,&_attexist);
+ if (_attexist) {
+/* if ( forentity) */
+ if (_MEDattributeInt32Rd(_gid,_attname,&_lentitytype1sav) < 0) {
+ MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG);
+ SSCRUTE(fieldname);SSCRUTE(_attname);goto ERROR;
+ }
+ }
+ _lentitytype1 = _lentitytype1sav;
+
+ /* _MEDset32bits(&_lentitytype1, MEDgetEntityTypeIt(entitytype)); */
+ /* On utilise directement la valeur de l'enum pour l'entitype, ainsi on utilise le décalage de 0 (on économise 1bit) */
+ /* Mise à jour de la liste d'entités/types géométriques au niveau du champ */
+ /* */
+ /* ISCRUTE_int8(_lentitytype1sav); */
+ /* _MEDset32bits(&_lentitytype1, MEDgetEntityTypeIt(entitytype)); */
+ /* Utilise le numéro d'itération pour le type géométrique du type d'entité donné pour positionner le bit de même position (-1) */
+ _MEDset32bits(&_lentitytype1, _it);
+ /* ISCRUTE_int8(_lentitytype1); */
+
+ /* Ecriture de la liste globale des types */
+ /*REM : Si l'attribut n'existait pas _lentitytype1sav == 0 et il ne se peut pas que _lentitytype1 == 0 même si entitytype == 0
+ à cause du _MEDsetNbits() */
+ if ( _lentitytype1sav != _lentitytype1 ) {
+/* if ( forentity) */
+ if ( _MEDattributeInt32Wr(_gid,_attname,&_lentitytype1) < 0) {
+ MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG);
+ SSCRUTE(fieldname);SSCRUTE(_attname);goto ERROR;
+ }
+ }
+
+ /*
+ * Il faut mettre à jour au niveau 2 (étape de calcul)
+ * la liste des types d'entités ou des types géométriques d'entités utilisées
+ */
+ _MEDattributeExist(_datagroup1,".",_attname,&_attexist);
+ if (_attexist) {
+ if (_MEDattributeInt32Rd(_datagroup1,_attname,&_lentitytype2sav) < 0) {
+ MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG);
+ SSCRUTE(fieldname);SSCRUTE(_datagroupname1);SSCRUTE(_attname);goto ERROR;
+ }
+ }
+ _lentitytype2 = _lentitytype2sav;
+
+ /* Mise à jour de la liste d'entités*/
+ /* ISCRUTE_int8(_lentitytype2sav); */
+ _MEDset32bits(&_lentitytype2, _it);
+ /* ISCRUTE_int8(_lentitytype2); */
+
+ if ( _lentitytype2sav != _lentitytype2 )
+ if ( _MEDattributeInt32Wr(_datagroup1,_attname,&_lentitytype2) < 0) {
+ MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG);
+ SSCRUTE(fieldname);SSCRUTE(_datagroupname1);SSCRUTE(_attname);goto ERROR;
+ }
+
+ /* GESTION DU NOMBRE D'ETAPES DE CALCUL */
+
+ /* Il faut pouvoir indiquer à l'utilisateur qu'il n'a pas besoin d'interroger toutes les étapes de calcul
+ pour connaître la liste des types d'entités utilisées si cette liste est la même pour toutes les étapes.
+ On vérifie que la liste des types d'entités utilisées à cette étape de calcul est le même que celle au niveau du champ global :
+
+ - Si la liste des types d'entités ou des types géométriques d'entité utilisés globalement
+ avant l'appel à cette fonction était identique à la notre avant m.a.j. :
+ _lentitytype1sav == _lentitytype2sav =>
+ * Si la nouvelle liste est toujours identique :
+ Ne rien faire, on le change pas le nbre d'étapes de calcul ayant la même liste
+ * Si la nouvelle liste devient différente (ajout d'un nouveau type à la liste) :
+ positionner le nombre d'étapes de calcul ayant la même liste de types d'entités à 1 (la notre)
+ - Si la liste des types d'entités utilisés avant l'appel à cette fonction était différente
+ entre celle de tous les autres étapes de calcul et celle de notre étape de calcul :
+ _lentitytype1sav != _lentitytype2sav =>
+ * Si la nouvelle liste est identique incrémenter le nombre d'étapes de calcul ayant la même liste de types d'entités
+ * Si la nouvelle liste est toujours différente :
+ Si notre type d'entité n'appartenait pas à la liste globale initiale => 0 sinon Ne rien faire,
+ on le change pas le nbre d'étapes de calcul ayant la même liste.
+ */
+
+ /* Cree l'attribut _attallname s'il n'exite pas déjà au niveau 0, sinon lit sa valeur */
+ /* Nombre d'étapes de calcul partageant la même liste d'entités/types géométriques */
+ _MEDattributeExist(_gid,".",_attallname,&_attexist);
+ if (_attexist) {
+ if (_MEDattrEntierLire(_gid,_attallname,&_nsamelentitype) < 0) {
+ MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG);
+ SSCRUTE(fieldname);SSCRUTE(_attallname);goto ERROR;
+ }
+ } else
+ _nsamelentitype = 0;
+ _nsamelentitypesav = _nsamelentitype;
+
+ /** Il faut vérifier pour notre type d'entité indépendemment des autres déjà positionnées **/
+ /*(VERIF:) En HDF//, le mécanisme fonctionne car l'écriture d'attribut n'est pas // */
+ /* Si les listes de types d'entitées étaient identiques */
+ if ( _lentitytype1sav == _lentitytype2sav ) {
+ if ( (_lentitytype1sav != _lentitytype1 /*faux : idem _lentitytype2*/ ) || (!_lentitytype1sav) ) {
+ /*Le fait que l'on en ajoute ou en supprime un modifie le nbre d'étape de calcul ayant la meme liste */
+ /*Si on ajoute un nouveau type d'entite, il n'y a plus que notre étape en adéquation. */
+ _nsamelentitype=1;
+ /*La supression d'un type d'entité écrit en MED n'est pas possible*/
+ /* ISCRUTE(_nsamelentitype); */
+ } else {
+ /*Il n'y a rien à faire car notre liste de type est toujours la même que la globale*/
+ /* ISCRUTE(_nsamelentitype); */
+ }
+ } else {
+ /* Si les listes de types d'entitées étaient déjà différentes */
+ /*Si nos listes sont devenues les mêmes*/
+ if (_lentitytype1 == _lentitytype2) {
+ /*Les liste de types d'entités deviennent identiques, il faut alors incrémenter le nbre d'étapes utilisant
+ la même liste.*/
+ ++_nsamelentitype;
+ /* ISCRUTE(_nsamelentitype); */
+ } else {
+ /*Si nos listes ne sont pas devenues les mêmes*/
+ /*Ds ce cas de figure l'étape de calcul concernée n'utilisait pas
+ * la liste de types d'entité du champ (il n'était pas comptabilisé dans le Nb. d'étapes de même liste d'entité).
+ * La nouvelle liste d'entité utilisée par cette étape n'est toujours pas devenue la même que celle du champ.
+ * Soit parcequ'il lui manque toujours certains type d'entités, soit parcequ'il utilise un nouveau type d'entité.
+ */
+ /* Si notre type d'entité n'appartenait pas à la liste globale initiale => 0 sinon on ne fait rien */
+ if (!_MEDtest32bits(_lentitytype1sav,_it) ) _nsamelentitype=0;
+ /* ISCRUTE(_nsamelentitype); */
+ }
+ }
+
+ if ( _nsamelentitypesav != _nsamelentitype ) {
+/* if ( forentity) */
+ if ( _MEDattributeIntWr(_gid,_attallname,&_nsamelentitype) < 0) {
+ MED_ERR_(_ret,MED_ERR_WRITE,MED_ERR_ATTRIBUTE,MED_ERR_FIELD_MSG);
+ SSCRUTE(fieldname);SSCRUTE(_attallname);goto ERROR;
+ }
+ }
+
+ _ret = 0;
+
+ ERROR:
+ return _ret;
+}
+