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 . + */ + + +#include +#include +#include +#include +#include + +/* Inclus par med.h.in */ +/* #include */ + +/* #define NDEBUG */ +/* #include */ + +/* 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; +} +