X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FSauvMedConvertor.cxx;h=30448af450cc69da2f8ba6d3ec18a4a29dde7148;hb=b607ffc713080a567fb90595118069ac18181e99;hp=f9dd4f6d5188e7dc8ac28e26cec1b5952ce9ee8b;hpb=1123dccd6613b2e8abba35182759d5c4a11ecc8d;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/SauvMedConvertor.cxx b/src/MEDLoader/SauvMedConvertor.cxx index f9dd4f6d5..30448af45 100644 --- a/src/MEDLoader/SauvMedConvertor.cxx +++ b/src/MEDLoader/SauvMedConvertor.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -46,11 +46,12 @@ #endif #ifdef HAS_XDR +#include #include #endif using namespace SauvUtilities; -using namespace ParaMEDMEM; +using namespace MEDCoupling; namespace { @@ -209,7 +210,7 @@ namespace */ struct TCellByIDCompare { - bool operator () (const Cell* i1, const Cell* i2) + bool operator () (const Cell* i1, const Cell* i2) const { return i1->_number < i2->_number; } @@ -234,11 +235,11 @@ namespace isRelocated = ( c2oIt->second != newOrder ); if ( isRelocated ) - { - grp->_relocTable.resize( cell2order.size() ); - for ( newOrder = 0, c2oIt = cell2order.begin(); c2oIt != c2oEnd; ++c2oIt, ++newOrder ) - grp->_relocTable[ c2oIt->second ] = newOrder; - } + { + grp->_relocTable.resize( cell2order.size() ); + for ( newOrder = 0, c2oIt = cell2order.begin(); c2oIt != c2oEnd; ++c2oIt, ++newOrder ) + grp->_relocTable[ c2oIt->second ] = newOrder; + } } } @@ -261,7 +262,7 @@ namespace // define default GAUSS points TInt GetNbRef() const { return myNbRef; } - TCoordSlice GetCoord(TInt theRefId) { return &myRefCoord[0] + theRefId * myDim; } + TCoordSlice GetCoord(std::size_t theRefId) { return &myRefCoord[0] + theRefId * myDim; } }; //--------------------------------------------------------------- /*! @@ -280,9 +281,9 @@ namespace // define default GAUSS points * \param geomType - element geometry (EGeometrieElement or med_geometrie_element) * \param nbPoints - nb gauss point * \param variant - [1-3] to choose the variant of definition - * + * * Throws in case of invalid parameters - * variant == 1 refers to "Fonctions de forme et points d'integration + * variant == 1 refers to "Fonctions de forme et points d'integration * des elements finis" v7.4 by J. PELLET, X. DESROCHES, 15/09/05 * variant == 2 refers to the same doc v6.4 by J.P. LEFEBVRE, X. DESROCHES, 03/07/03 * variant == 3 refers to the same doc v6.4, second variant for 2D elements @@ -290,7 +291,7 @@ namespace // define default GAUSS points TGaussDef(const int geomType, const int nbPoints, const int variant=1); int dim() const { return SauvUtilities::getDimension( NormalizedCellType( myType )); } - int nbPoints() const { return myWeights.capacity(); } + std::size_t nbPoints() const { return myWeights.capacity(); } private: void add(const double x, const double weight); @@ -668,8 +669,8 @@ namespace // define default GAUSS points THexa20a::THexa20a(TInt theDim, TInt theNbRef): TShapeFun(theDim,theNbRef) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break; @@ -700,8 +701,8 @@ namespace // define default GAUSS points THexa27a::THexa27a(): THexa20a(3,27) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 20: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break; @@ -737,8 +738,8 @@ namespace // define default GAUSS points THexa20b::THexa20b(TInt theDim, TInt theNbRef): TShapeFun(theDim,theNbRef) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break; @@ -769,8 +770,8 @@ namespace // define default GAUSS points TPenta6a::TPenta6a(): TShapeFun(3,6) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; @@ -786,8 +787,8 @@ namespace // define default GAUSS points TPenta6b::TPenta6b(): TShapeFun(3,6) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; @@ -803,8 +804,8 @@ namespace // define default GAUSS points TPenta15a::TPenta15a(): TShapeFun(3,15) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; @@ -830,8 +831,8 @@ namespace // define default GAUSS points TPenta15b::TPenta15b(): TShapeFun(3,15) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; @@ -857,8 +858,8 @@ namespace // define default GAUSS points TPyra5a::TPyra5a(): TShapeFun(3,5) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; @@ -873,10 +874,10 @@ namespace // define default GAUSS points TPyra5b::TPyra5b(): TShapeFun(3,5) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); - switch(aRefId){ + switch(aRefId){ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; case 3: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; @@ -889,8 +890,8 @@ namespace // define default GAUSS points TPyra13a::TPyra13a(): TShapeFun(3,13) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; @@ -914,8 +915,8 @@ namespace // define default GAUSS points TPyra13b::TPyra13b(): TShapeFun(3,13) { - TInt aNbRef = myRefCoord.size(); - for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + std::size_t aNbRef = myRefCoord.size(); + for(std::size_t aRefId = 0; aRefId < aNbRef; aRefId++){ TCoordSlice aCoord = GetCoord(aRefId); switch(aRefId){ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; @@ -965,7 +966,7 @@ namespace // define default GAUSS points const double P1 = 1./1.8; const double P2 = 1./1.125; add( -a, P1 ); - add( 0, P2 ); + add( 0, P2 ); add( a, P1 ); break; } case 4: { @@ -973,7 +974,7 @@ namespace // define default GAUSS points const double P1 = 0.652145154862546, P2 = 0.347854845137454 ; add( a, P1 ); add( -a, P1 ); - add( b, P2 ); + add( b, P2 ); add( -b, P2 ); break; } default: @@ -1005,11 +1006,11 @@ namespace // define default GAUSS points case 6: { // FPG6 const double P1 = 0.11169079483905, P2 = 0.0549758718227661; const double a = 0.445948490915965, b = 0.091576213509771; - add( b, b, P2 ); + add( b, b, P2 ); add( 1-2*b, b, P2 ); add( b, 1-2*b, P2 ); add( a, 1-2*a, P1 ); - add( a, a, P1 ); + add( a, a, P1 ); add( 1-2*a, a, P1 ); break; } case 7: { // FPG7 @@ -1017,11 +1018,11 @@ namespace // define default GAUSS points const double B = 0.101286507323456; const double P1 = 0.066197076394253; const double P2 = 0.062969590272413; - add( 1/3., 1/3., 9/80. ); - add( A, A, P1 ); + add( 1/3., 1/3., 9/80. ); + add( A, A, P1 ); add( 1-2*A, A, P1 ); add( A, 1-2*A, P1 ); - add( B, B, P2 ); + add( B, B, P2 ); add( 1-2*B, B, P2 ); add( B, 1-2*B, P2 ); break; } @@ -1033,10 +1034,10 @@ namespace // define default GAUSS points const double P1 = 0.025422453185103; const double P2 = 0.058393137863189; const double P3 = 0.041425537809187; - add( A, A, P1 ); + add( A, A, P1 ); add( 1-2*A, A, P1 ); add( A, 1-2*A, P1 ); - add( B, B, P2 ); + add( B, B, P2 ); add( 1-2*B, B, P2 ); add( B, 1-2*B, P2 ); add( C, D, P3 ); @@ -1048,7 +1049,7 @@ namespace // define default GAUSS points } default: THROW_IK_EXCEPTION("TGaussDef: Invalid nb of gauss points for TRIA, variant 1: " - <_number, _nodes[i]->_number ); else @@ -1525,14 +1526,14 @@ SauvUtilities::Link Cell::link(int i) const const TID* Cell::getSortedNodes() const { if ( !_sortedNodeIDs ) - { - size_t l=_nodes.size(); - _sortedNodeIDs = new int[ l ]; + { + size_t l=_nodes.size(); + _sortedNodeIDs = new TID[ l ]; - for (size_t i=0; i!=l; ++i) - _sortedNodeIDs[i]=_nodes[i]->_number; - std::sort( _sortedNodeIDs, _sortedNodeIDs + l ); - } + for (size_t i=0; i!=l; ++i) + _sortedNodeIDs[i]=_nodes[i]->_number; + std::sort( _sortedNodeIDs, _sortedNodeIDs + l ); + } return _sortedNodeIDs; } @@ -1547,9 +1548,9 @@ bool Cell::operator< (const Cell& ma) const if ( _nodes.size() == 1 ) return _nodes[0] < ma._nodes[0]; - const int* v1 = getSortedNodes(); - const int* v2 = ma.getSortedNodes(); - for ( const int* vEnd = v1 + _nodes.size(); v1 < vEnd; ++v1, ++v2 ) + const TID* v1 = getSortedNodes(); + const TID* v2 = ma.getSortedNodes(); + for ( const TID* vEnd = v1 + _nodes.size(); v1 < vEnd; ++v1, ++v2 ) if(*v1 != *v2) return *v1 < *v2; return false; @@ -1587,9 +1588,9 @@ std::ostream& SauvUtilities::operator<< (std::ostream& os, const SauvUtilities:: */ //================================================================================ -int Group::size() const +mcIdType Group::size() const { - int sizze = 0; + std::size_t sizze = 0; if ( !_relocTable.empty() ) sizze = _relocTable.size(); else if ( _medGroup ) @@ -1599,7 +1600,7 @@ int Group::size() const else for ( size_t i = 0; i < _groups.size(); ++i ) sizze += _groups[i]->size(); - return sizze; + return ToIdType( sizze ); } //================================================================================ @@ -1738,13 +1739,13 @@ bool ASCIIReader::getLine(char* & line) bool aResult = true; // Check the state of the buffer; // if there is too little left, read the next portion of data - int nBytesRest = _eptr - _ptr; + std::size_t nBytesRest = _eptr - _ptr; if (nBytesRest < GIBI_MaxOutputLen) { if (nBytesRest > 0) { // move the remaining portion to the buffer beginning - for ( int i = 0; i < nBytesRest; ++i ) + for ( std::size_t i = 0; i < nBytesRest; ++i ) _start[i] = _ptr[i]; //memcpy (_tmpBuf, _ptr, nBytesRest); //memcpy (_start, _tmpBuf, nBytesRest); @@ -1754,9 +1755,9 @@ bool ASCIIReader::getLine(char* & line) nBytesRest = 0; } _ptr = _start; - const int nBytesRead = ::read (_file, - &_start [nBytesRest], - GIBI_BufferSize - nBytesRest); + const std::size_t nBytesRead = ::read (_file, + &_start [nBytesRest], + GIBI_BufferSize - nBytesRest); nBytesRest += nBytesRead; _eptr = &_start [nBytesRest]; } @@ -1818,7 +1819,6 @@ void ASCIIReader::init( int nbToRead, int nbPosInLine, int width, int shift /*= { _curPos = 0; } - _curLocale.clear(); } //================================================================================ @@ -1851,11 +1851,7 @@ void ASCIIReader::initIntReading(int nbValues) void ASCIIReader::initDoubleReading(int nbValues) { - init( nbValues, 3, 22 ); - - // Correction 2 of getDouble(): set "C" numeric locale to read numbers - // with dot decimal point separator, as it is in SAUVE files - _curLocale = setlocale(LC_NUMERIC, "C"); + init( nbValues, 3, 22 ); } //================================================================================ @@ -1902,11 +1898,6 @@ void ASCIIReader::next() else { _curPos = 0; - if ( !_curLocale.empty() ) - { - setlocale(LC_NUMERIC, _curLocale.c_str()); - _curLocale.clear(); - } } } @@ -1924,7 +1915,7 @@ int ASCIIReader::getInt() const // 53619905 | 1 2 6 8 // 53619906 | SCALAIRE // 53619907 | -63312600499 1 0 0 0 -2 0 2 - // where -63312600499 is actualy -633 and 12600499 + // where -63312600499 is actually -633 and 12600499 char hold=_curPos[_width]; _curPos[_width] = '\0'; int result = atoi( _curPos ); @@ -1941,7 +1932,7 @@ int ASCIIReader::getInt() const float ASCIIReader::getFloat() const { - return getDouble(); + return (float)getDouble(); } //================================================================================ @@ -1971,7 +1962,7 @@ double ASCIIReader::getDouble() const //0123456789012345678901234567890123456789012345678901234567890123456789 const size_t posE = 18; std::string aStr (_curPos); - if ( aStr.find('E') < 0 && aStr.find('e') < 0 ) + if ( aStr.find('E') == std::string::npos && aStr.find('e') == std::string::npos ) { if ( aStr.size() < posE+1 ) THROW_IK_EXCEPTION("No more doubles (line #" << lineNb() << ")"); @@ -2013,7 +2004,7 @@ XDRReader::XDRReader(const char* fileName) :FileReader(fileName), _xdrs_file(NUL XDRReader::~XDRReader() { -#ifdef HAS_XDR +#ifdef HAS_XDR if ( _xdrs_file ) { xdr_destroy((XDR*)_xdrs); @@ -2047,29 +2038,29 @@ bool XDRReader::open() #ifdef HAS_XDR #ifdef WIN32 if ((_xdrs_file = ::fopen(_fileName.c_str(), "rb"))) -#else - if ((_xdrs_file = ::fopen(_fileName.c_str(), "r"))) +#else + if ((_xdrs_file = ::fopen(_fileName.c_str(), "r"))) #endif - { - _xdrs = (XDR *)malloc(sizeof(XDR)); - xdrstdio_create((XDR*)_xdrs, _xdrs_file, XDR_DECODE); + { + _xdrs = (XDR *)malloc(sizeof(XDR)); + xdrstdio_create((XDR*)_xdrs, _xdrs_file, XDR_DECODE); - const int maxsize = 10; - char icha[maxsize+1]; - char* icha2 = icha; - if (( xdr_ok = xdr_string((XDR*)_xdrs, &icha2, maxsize))) - { - icha[maxsize] = '\0'; - xdr_ok = (strcmp(icha, "CASTEM XDR") == 0); - } - if ( !xdr_ok ) - { - xdr_destroy((XDR*)_xdrs); - free((XDR*)_xdrs); - fclose(_xdrs_file); - _xdrs_file = NULL; - } - } + const int maxsize = 10; + char icha[maxsize+1]; + char* icha2 = icha; + if (( xdr_ok = xdr_string((XDR*)_xdrs, &icha2, maxsize))) + { + icha[maxsize] = '\0'; + xdr_ok = (strcmp(icha, "CASTEM XDR") == 0); + } + if ( !xdr_ok ) + { + xdr_destroy((XDR*)_xdrs); + free((XDR*)_xdrs); + fclose(_xdrs_file); + _xdrs_file = NULL; + } + } #endif return xdr_ok; } @@ -2310,7 +2301,7 @@ void IntermediateMED::checkDataAvailability() const Group* IntermediateMED::addNewGroup(std::vector* groupsToFix) { - if ( _groups.size() == _groups.capacity() ) // re-allocation would occure + if ( _groups.size() == _groups.capacity() ) // re-allocation would occur { std::vector newGroups( _groups.size() ); newGroups.push_back( Group() ); @@ -2326,7 +2317,7 @@ Group* IntermediateMED::addNewGroup(std::vector* groupsTo // correct pointers to sub-groups for ( size_t j = 0; j < _groups[i]._groups.size(); ++j ) { - int iG = _groups[i]._groups[j] - &_groups[0]; + std::size_t iG = _groups[i]._groups[j] - &_groups[0]; newGroups[i]._groups[j] = & newGroups[ iG ]; } } @@ -2336,7 +2327,7 @@ Group* IntermediateMED::addNewGroup(std::vector* groupsTo for ( size_t i = 0; i < groupsToFix->size(); ++i ) if ( (*groupsToFix)[i] ) { - int iG = (*groupsToFix)[i] - &_groups[0]; + std::size_t iG = (*groupsToFix)[i] - &_groups[0]; (*groupsToFix)[i] = & newGroups[ iG ]; } @@ -2350,12 +2341,12 @@ Group* IntermediateMED::addNewGroup(std::vector* groupsTo for ( size_t j = 0; j < fields[i]->_sub.size(); ++j ) if ( fields[i]->_sub[j]._support ) { - int iG = fields[i]->_sub[j]._support - &_groups[0]; + std::size_t iG = fields[i]->_sub[j]._support - &_groups[0]; fields[i]->_sub[j]._support = & newGroups[ iG ]; } if ( fields[i]->_group ) { - int iG = fields[i]->_group - &_groups[0]; + std::size_t iG = fields[i]->_group - &_groups[0]; fields[i]->_group = & newGroups[ iG ]; } } @@ -2372,17 +2363,17 @@ Group* IntermediateMED::addNewGroup(std::vector* groupsTo //================================================================================ /*! - * \brief Makes ParaMEDMEM::MEDFileData from self + * \brief Makes MEDCoupling::MEDFileData from self */ //================================================================================ -ParaMEDMEM::MEDFileData* IntermediateMED::convertInMEDFileDS() +MEDCoupling::MEDFileData* IntermediateMED::convertInMEDFileDS() { - MEDCouplingAutoRefCountObjectPtr< MEDFileUMesh > mesh = makeMEDFileMesh(); - MEDCouplingAutoRefCountObjectPtr< MEDFileFields > fields = makeMEDFileFields(mesh); + MCAuto< MEDFileUMesh > mesh = makeMEDFileMesh(); + MCAuto< MEDFileFields > fields = makeMEDFileFields(mesh); - MEDCouplingAutoRefCountObjectPtr< MEDFileMeshes > meshes = MEDFileMeshes::New(); - MEDCouplingAutoRefCountObjectPtr< MEDFileData > medData = MEDFileData::New(); + MCAuto< MEDFileMeshes > meshes = MEDFileMeshes::New(); + MCAuto< MEDFileData > medData = MEDFileData::New(); meshes->pushMesh( mesh ); medData->setMeshes( meshes ); if ( fields ) medData->setFields( fields ); @@ -2392,16 +2383,18 @@ ParaMEDMEM::MEDFileData* IntermediateMED::convertInMEDFileDS() //================================================================================ /*! - * \brief Creates ParaMEDMEM::MEDFileUMesh from its data + * \brief Creates MEDCoupling::MEDFileUMesh from its data */ //================================================================================ -ParaMEDMEM::MEDFileUMesh* IntermediateMED::makeMEDFileMesh() +MEDCoupling::MEDFileUMesh* IntermediateMED::makeMEDFileMesh() { // check if all needed piles are present checkDataAvailability(); - // set long names + decreaseHierarchicalDepthOfSubgroups(); + + // set long names (before orienting!) setGroupLongNames(); // fix element orientation @@ -2411,7 +2404,6 @@ ParaMEDMEM::MEDFileUMesh* IntermediateMED::makeMEDFileMesh() orientElements3D(); // process groups - decreaseHierarchicalDepthOfSubgroups(); eraseUselessGroups(); //detectMixDimGroups(); @@ -2443,6 +2435,16 @@ ParaMEDMEM::MEDFileUMesh* IntermediateMED::makeMEDFileMesh() void IntermediateMED::setGroupLongNames() { + if ( _listGIBItoMED_mail.empty() ) + return; + + // IMP 0023285: only keep the meshes named in the table MED_MAIL + // clear all group names + for ( size_t i = 0; i < _groups.size(); ++i ) + if ( !_groups[i]._isProfile ) + _groups[i]._name.clear(); + + // IMP 0020434: mapping GIBI names to MED names // set med names to objects (mesh, fields, support, group or other) @@ -2473,6 +2475,41 @@ void IntermediateMED::setGroupLongNames() grp._refNames.push_back( _mapStrings[ (*itGIBItoMED).med_id ]); } } + + // IMP 0023285: only keep the meshes named in the table MED_MAIL + // remove all cells belonging to non-named groups only + + // use Cell::_reverse to mark cells to keep + for ( size_t i = 0; i < _groups.size(); ++i ) + { + SauvUtilities::Group & grp = _groups[i]; + if ( grp._isProfile || !grp._name.empty() ) + { + for ( size_t iC = 0; iC < grp._cells.size(); ++iC ) + grp._cells[iC]->_reverse = true; + + for (size_t j = 0; j < grp._groups.size(); ++j ) + for ( size_t iC = 0; iC < grp._groups[j]->_cells.size(); ++iC ) + grp._groups[j]->_cells[iC]->_reverse = true; + } + } + // remove non-marked cells (with _reverse == false) + CellsByDimIterator cellsIt( *this ); + while ( cellsIt.nextType() ) + { + std::set & cells = _cellsByType[ cellsIt.type() ]; + std::set::iterator cIt = cells.begin(); + while ( cIt != cells.end() ) + if ( cIt->_reverse ) + { + cIt->_reverse = false; + ++cIt; + } + else + { + cells.erase( cIt++ ); + } + } } //================================================================================ @@ -2510,8 +2547,8 @@ void IntermediateMED::setFieldLongNames(std::set< std::string >& usedNames) if (medName.find( fields[ifi]->_name + "." ) == 0 ) { std::vector& aSubDs = fields[ifi]->_sub; - int nbSub = aSubDs.size(); - for (int isu = 0; isu < nbSub; isu++) + std::size_t nbSub = aSubDs.size(); + for (std::size_t isu = 0; isu < nbSub; isu++) for (int ico = 0; ico < aSubDs[isu].nbComponents(); ico++) { if (aSubDs[isu].compName(ico) == gibiName) @@ -2540,28 +2577,28 @@ void IntermediateMED::setFieldLongNames(std::set< std::string >& usedNames) void IntermediateMED::decreaseHierarchicalDepthOfSubgroups() { for (size_t i=0; i!=_groups.size(); ++i) - { - Group& grp = _groups[i]; - for (size_t j = 0; j < grp._groups.size(); ++j ) { - Group & sub_grp = *grp._groups[j]; - if ( !sub_grp._groups.empty() ) - { - // replace j with its 1st subgroup - grp._groups[j] = sub_grp._groups[0]; - // push back the rest subs - grp._groups.insert( grp._groups.end(), ++sub_grp._groups.begin(), sub_grp._groups.end() ); - } + Group& grp = _groups[i]; + for (size_t j = 0; j < grp._groups.size(); ++j ) + { + Group & sub_grp = *grp._groups[j]; + if ( !sub_grp._groups.empty() ) + { + // replace j with its 1st subgroup + grp._groups[j] = sub_grp._groups[0]; + // push back the rest subs + grp._groups.insert( grp._groups.end(), ++sub_grp._groups.begin(), sub_grp._groups.end() ); + } + } + // remove empty sub-_groups + std::vector< Group* > newSubGroups; + newSubGroups.reserve( grp._groups.size() ); + for (size_t j = 0; j < grp._groups.size(); ++j ) + if ( !grp._groups[j]->empty() ) + newSubGroups.push_back( grp._groups[j] ); + if ( newSubGroups.size() < grp._groups.size() ) + grp._groups.swap( newSubGroups ); } - // remove empty sub-_groups - std::vector< Group* > newSubGroups; - newSubGroups.reserve( grp._groups.size() ); - for (size_t j = 0; j < grp._groups.size(); ++j ) - if ( !grp._groups[j]->empty() ) - newSubGroups.push_back( grp._groups[j] ); - if ( newSubGroups.size() < grp._groups.size() ) - grp._groups.swap( newSubGroups ); - } } //================================================================================ @@ -2583,32 +2620,32 @@ void IntermediateMED::eraseUselessGroups() std::set groups2convert; // keep not named sub-groups of field supports for (size_t i=0; i!=_groups.size(); ++i) - { - Group& grp = _groups[i]; - if ( grp._isProfile && !grp._groups.empty() ) - groups2convert.insert( grp._groups.begin(), grp._groups.end() ); - } + { + Group& grp = _groups[i]; + if ( grp._isProfile && !grp._groups.empty() ) + groups2convert.insert( grp._groups.begin(), grp._groups.end() ); + } // keep named groups and their subgroups for (size_t i=0; i!=_groups.size(); ++i) - { - Group& grp = _groups[i]; - if ( !grp._name.empty() && !grp.empty() ) { - groups2convert.insert( &grp ); - groups2convert.insert( grp._groups.begin(), grp._groups.end() ); + Group& grp = _groups[i]; + if ( !grp._name.empty() && !grp.empty() ) + { + groups2convert.insert( &grp ); + groups2convert.insert( grp._groups.begin(), grp._groups.end() ); + } } - } // erase groups that are not in groups2convert and not _isProfile for (size_t i=0; i!=_groups.size(); ++i) - { - Group* grp = &_groups[i]; - if ( !grp->_isProfile && !groups2convert.count( grp ) ) { - grp->_cells.clear(); - grp->_groups.clear(); + Group* grp = &_groups[i]; + if ( !grp->_isProfile && !groups2convert.count( grp ) ) + { + grp->_cells.clear(); + grp->_groups.clear(); + } } - } } //================================================================================ @@ -2621,26 +2658,26 @@ void IntermediateMED::detectMixDimGroups() { //hasMixedCells = false; for ( size_t i=0; i < _groups.size(); ++i ) - { - Group& grp = _groups[i]; - if ( grp._groups.size() < 2 ) - continue; - - // check if sub-groups have different dimension - unsigned dim1 = getDim( &grp ); - for ( size_t j = 1; j < grp._groups.size(); ++j ) { - unsigned dim2 = getDim( grp._groups[j] ); - if ( dim1 != dim2 ) - { - grp._cells.clear(); - grp._groups.clear(); - if ( !grp._name.empty() ) - std::cout << "Erase a group with elements of different dim |" << grp._name << "|"<< std::endl; - break; - } + Group& grp = _groups[i]; + if ( grp._groups.size() < 2 ) + continue; + + // check if sub-groups have different dimension + unsigned dim1 = getDim( &grp ); + for ( size_t j = 1; j < grp._groups.size(); ++j ) + { + unsigned dim2 = getDim( grp._groups[j] ); + if ( dim1 != dim2 ) + { + grp._cells.clear(); + grp._groups.clear(); + if ( !grp._name.empty() ) + std::cout << "Erase a group with elements of different dim |" << grp._name << "|"<< std::endl; + break; + } + } } - } } //================================================================================ @@ -2683,42 +2720,43 @@ void IntermediateMED::orientElements2D() // -------------------------- // orient faces clockwise // -------------------------- - int iQuad = isQuadratic ? 2 : 1; - for ( elemIt = faces->begin(), elemEnd = faces->end(); elemIt != elemEnd; elemIt++ ) - { - // look for index of the most left node - int iLeft = 0, iNode, nbNodes = elemIt->_nodes.size() / iQuad; - double x, minX = nodeCoords( elemIt->_nodes[0] )[0]; - for ( iNode = 1; iNode < nbNodes; ++iNode ) - if (( x = nodeCoords( elemIt->_nodes[ iNode ])[ 0 ]) < minX ) - minX = x, iLeft = iNode; - - // indeces of the nodes neighboring the most left one - int iPrev = ( iLeft - 1 < 0 ) ? nbNodes - 1 : iLeft - 1; - int iNext = ( iLeft + 1 == nbNodes ) ? 0 : iLeft + 1; - // find components of prev-left and left-next vectors - double xP = nodeCoords( elemIt->_nodes[ iPrev ])[ 0 ]; - double yP = nodeCoords( elemIt->_nodes[ iPrev ])[ 1 ]; - double xN = nodeCoords( elemIt->_nodes[ iNext ])[ 0 ]; - double yN = nodeCoords( elemIt->_nodes[ iNext ])[ 1 ]; - double xL = nodeCoords( elemIt->_nodes[ iLeft ])[ 0 ]; - double yL = nodeCoords( elemIt->_nodes[ iLeft ])[ 1 ]; - double xPL = xL - xP, yPL = yL - yP; // components of prev-left vector - double xLN = xN - xL, yLN = yN - yL; // components of left-next vector - // normalise y of the vectors - double modPL = sqrt ( xPL * xPL + yPL * yPL ); - double modLN = sqrt ( xLN * xLN + yLN * yLN ); - if ( modLN > std::numeric_limits::min() && - modPL > std::numeric_limits::min() ) - { - yPL /= modPL; - yLN /= modLN; - // summary direction of neighboring links must be positive - bool clockwise = ( yPL + yLN > 0 ); - if ( !clockwise ) - reverse( *elemIt, swapVec ); - } - } + // COMMENTED for issue 0022612 note 17739 + // int iQuad = isQuadratic ? 2 : 1; + // for ( elemIt = faces->begin(), elemEnd = faces->end(); elemIt != elemEnd; elemIt++ ) + // { + // // look for index of the most left node + // int iLeft = 0, iNode, nbNodes = elemIt->_nodes.size() / iQuad; + // double x, minX = nodeCoords( elemIt->_nodes[0] )[0]; + // for ( iNode = 1; iNode < nbNodes; ++iNode ) + // if (( x = nodeCoords( elemIt->_nodes[ iNode ])[ 0 ]) < minX ) + // minX = x, iLeft = iNode; + + // // indices of the nodes neighboring the most left one + // int iPrev = ( iLeft - 1 < 0 ) ? nbNodes - 1 : iLeft - 1; + // int iNext = ( iLeft + 1 == nbNodes ) ? 0 : iLeft + 1; + // // find components of prev-left and left-next vectors + // double xP = nodeCoords( elemIt->_nodes[ iPrev ])[ 0 ]; + // double yP = nodeCoords( elemIt->_nodes[ iPrev ])[ 1 ]; + // double xN = nodeCoords( elemIt->_nodes[ iNext ])[ 0 ]; + // double yN = nodeCoords( elemIt->_nodes[ iNext ])[ 1 ]; + // double xL = nodeCoords( elemIt->_nodes[ iLeft ])[ 0 ]; + // double yL = nodeCoords( elemIt->_nodes[ iLeft ])[ 1 ]; + // double xPL = xL - xP, yPL = yL - yP; // components of prev-left vector + // double xLN = xN - xL, yLN = yN - yL; // components of left-next vector + // // normalise y of the vectors + // double modPL = sqrt ( xPL * xPL + yPL * yPL ); + // double modLN = sqrt ( xLN * xLN + yLN * yLN ); + // if ( modLN > std::numeric_limits::min() && + // modPL > std::numeric_limits::min() ) + // { + // yPL /= modPL; + // yLN /= modLN; + // // summary direction of neighboring links must be positive + // bool clockwise = ( yPL + yLN > 0 ); + // if ( !clockwise ) + // reverse( *elemIt, swapVec ); + // } + // } } } @@ -2731,7 +2769,8 @@ void IntermediateMED::orientElements2D() void IntermediateMED::orientElements3D() { // set _reverse flags of faces - orientFaces3D(); + // COMMENTED for issue 0022612 note 17739 + //orientFaces3D(); // ----------------- // fix connectivity @@ -2741,29 +2780,30 @@ void IntermediateMED::orientElements3D() std::vector< std::pair > swapVec; for ( int dim = 1; dim <= 3; ++dim ) - { - CellsByDimIterator cellsIt( *this, dim ); - while ( const std::set * elems = cellsIt.nextType() ) { - TCellType cellType = cellsIt.type(); - bool isQuadratic = getGibi2MedQuadraticInterlace( cellType ); - getReverseVector( cellType, swapVec ); + CellsByDimIterator cellsIt( *this, dim ); + while ( const std::set * elems = cellsIt.nextType() ) + { + TCellType cellType = cellsIt.type(); + bool isQuadratic = getGibi2MedQuadraticInterlace( cellType ); + getReverseVector( cellType, swapVec ); - elemIt = elems->begin(), elemEnd = elems->end(); - for ( ; elemIt != elemEnd; elemIt++ ) - { - // GIBI connectivity -> MED one - if( isQuadratic ) - ConvertQuadratic( cellType, *elemIt ); + elemIt = elems->begin(), elemEnd = elems->end(); + for ( ; elemIt != elemEnd; elemIt++ ) + { + // GIBI connectivity -> MED one + if( isQuadratic ) + ConvertQuadratic( cellType, *elemIt ); - // reverse faces - if ( elemIt->_reverse ) - reverse ( *elemIt, swapVec ); - } + // reverse faces + if ( elemIt->_reverse ) + reverse ( *elemIt, swapVec ); + } + } } - } - orientVolumes(); + // COMMENTED for issue 0022612 note 17739 + //orientVolumes(); } //================================================================================ @@ -2787,7 +2827,7 @@ void IntermediateMED::orientFaces3D() for ( size_t j = 0; j < grp._cells.size(); ++j ) if ( faces.insert( grp._cells[j] ).second ) { - for ( size_t k = 0; k < grp._cells[j]->_nodes.size(); ++k ) + for ( unsigned int k = 0; k < grp._cells[j]->_nodes.size(); ++k ) linkFacesMap[ grp._cells[j]->link( k ) ].push_back( grp._cells[j] ); fgm.insert( std::make_pair( grp._cells[j], &grp )); } @@ -2804,7 +2844,7 @@ void IntermediateMED::orientFaces3D() // Each oriented link must appear in one face only, else a face is reversed. std::queue faceQueue; /* the queue contains well oriented faces - whose neighbors orientation is to be checked */ + whose neighbors orientation is to be checked */ bool manifold = true; while ( !linkFacesMap.empty() ) { @@ -3039,7 +3079,7 @@ void IntermediateMED::numberElements() // check if re-numeration is needed (to try to keep elem oreder as in sauve file ) bool ok = true, renumEntity = false; CellsByDimIterator cellsIt( *this, dim ); - int prevNbElems = 0; + mcIdType prevNbElems = 0; while ( const std::set * typeCells = cellsIt.nextType() ) { TID minNumber = std::numeric_limits::max(), maxNumber = 0; @@ -3048,27 +3088,26 @@ void IntermediateMED::numberElements() if ( elemIt->_number < minNumber ) minNumber = elemIt->_number; if ( elemIt->_number > maxNumber ) maxNumber = elemIt->_number; } - TID typeSize = typeCells->size(); + mcIdType typeSize = ToIdType( typeCells->size() ); if ( typeSize != maxNumber - minNumber + 1 ) ok = false; - if ( prevNbElems != 0 ) { - if ( minNumber == 1 ) - renumEntity = true; - else if ( prevNbElems+1 != (int)minNumber ) - ok = false; - } + if ( prevNbElems+1 != (int)minNumber ) + ok = false; + if ( prevNbElems != 0 && minNumber == 1 ) + renumEntity = true; + prevNbElems += typeSize; } if ( ok && renumEntity ) // each geom type was numerated separately { cellsIt.init( dim ); - prevNbElems = cellsIt.nextType()->size(); // no need to renumber the first type + prevNbElems = ToIdType( cellsIt.nextType()->size()); // no need to renumber the first type while ( const std::set * typeCells = cellsIt.nextType() ) { for ( elemIt = typeCells->begin(), elemEnd = typeCells->end(); elemIt!=elemEnd; ++elemIt) elemIt->_number += prevNbElems; - prevNbElems += typeCells->size(); + prevNbElems += ToIdType( typeCells->size() ); } } if ( !ok ) @@ -3088,12 +3127,12 @@ void IntermediateMED::numberElements() */ //================================================================================ -ParaMEDMEM::DataArrayDouble * IntermediateMED::getCoords() +MEDCoupling::DataArrayDouble * IntermediateMED::getCoords() { DataArrayDouble* coordArray = DataArrayDouble::New(); coordArray->alloc( _nbNodes, _spaceDim ); double * coordPrt = coordArray->getPointer(); - for ( int i = 0, nb = _points.size(); i < nb; ++i ) + for ( unsigned int i = 0; i < _points.size(); ++i ) { Node* n = getNode( i+1 ); if ( n->isUsed() ) @@ -3114,8 +3153,8 @@ ParaMEDMEM::DataArrayDouble * IntermediateMED::getCoords() */ //================================================================================ -void IntermediateMED::setConnectivity( ParaMEDMEM::MEDFileUMesh* mesh, - ParaMEDMEM::DataArrayDouble* coords ) +void IntermediateMED::setConnectivity( MEDCoupling::MEDFileUMesh* mesh, + MEDCoupling::DataArrayDouble* coords ) { int meshDim = 0; @@ -3123,54 +3162,54 @@ void IntermediateMED::setConnectivity( ParaMEDMEM::MEDFileUMesh* mesh, std::set::const_iterator elemIt, elemEnd; for ( int dim = 3; dim > 0; --dim ) - { - CellsByDimIterator dimCells( *this, dim ); + { + CellsByDimIterator dimCells( *this, dim ); - int nbOfCells = 0; - while ( const std::set * cells = dimCells.nextType() ) - nbOfCells += cells->size(); - if ( nbOfCells == 0 ) - continue; + mcIdType nbOfCells = 0; + while ( const std::set * cells = dimCells.nextType() ) + nbOfCells += ToIdType( cells->size() ); + if ( nbOfCells == 0 ) + continue; - if ( !meshDim ) meshDim = dim; + if ( !meshDim ) meshDim = dim; - MEDCouplingUMesh* dimMesh = MEDCouplingUMesh::New(); - dimMesh->setCoords( coords ); - dimMesh->setMeshDimension( dim ); - dimMesh->allocateCells( nbOfCells ); + MEDCouplingUMesh* dimMesh = MEDCouplingUMesh::New(); + dimMesh->setCoords( coords ); + dimMesh->setMeshDimension( dim ); + dimMesh->allocateCells( nbOfCells ); - int prevNbCells = 0; - dimCells.init( dim ); - while ( const std::set * cells = dimCells.nextType() ) - { - // fill connectivity array to take into account order of elements in the sauv file - const int nbCellNodes = cells->begin()->_nodes.size(); - std::vector< TID > connectivity( cells->size() * nbCellNodes ); - int * nodalConnOfCell; - for ( elemIt = cells->begin(), elemEnd = cells->end(); elemIt != elemEnd; ++elemIt ) - { - const Cell& cell = *elemIt; - const int index = cell._number - 1 - prevNbCells; - nodalConnOfCell = &connectivity[ index * nbCellNodes ]; - if ( cell._reverse ) - for ( int i = nbCellNodes-1; i >= 0; --i ) - *nodalConnOfCell++ = cell._nodes[i]->_number - 1; - else - for ( int i = 0; i < nbCellNodes; ++i ) - *nodalConnOfCell++ = cell._nodes[i]->_number - 1; - } - prevNbCells += cells->size(); + mcIdType prevNbCells = 0; + dimCells.init( dim ); + while ( const std::set * cells = dimCells.nextType() ) + { + // fill connectivity array to take into account order of elements in the sauv file + const mcIdType nbCellNodes = ToIdType( cells->begin()->_nodes.size() ); + std::vector< TID > connectivity( cells->size() * nbCellNodes ); + TID * nodalConnOfCell; + for ( elemIt = cells->begin(), elemEnd = cells->end(); elemIt != elemEnd; ++elemIt ) + { + const Cell& cell = *elemIt; + const TID index = cell._number - 1 - prevNbCells; + nodalConnOfCell = &connectivity[ index * nbCellNodes ]; + if ( cell._reverse ) + for ( mcIdType i = nbCellNodes-1; i >= 0; --i ) + *nodalConnOfCell++ = cell._nodes[i]->_number - 1; + else + for ( mcIdType i = 0; i < nbCellNodes; ++i ) + *nodalConnOfCell++ = cell._nodes[i]->_number - 1; + } + prevNbCells += ToIdType( cells->size() ); - // fill dimMesh - TCellType cellType = dimCells.type(); - nodalConnOfCell = &connectivity[0]; - for ( size_t i = 0; i < cells->size(); ++i, nodalConnOfCell += nbCellNodes ) - dimMesh->insertNextCell( cellType, nbCellNodes, nodalConnOfCell ); - } - dimMesh->finishInsertingCells(); - mesh->setMeshAtLevel( dim - meshDim, dimMesh ); - dimMesh->decrRef(); - } + // fill dimMesh + TCellType cellType = dimCells.type(); + nodalConnOfCell = &connectivity[0]; + for ( size_t i = 0; i < cells->size(); ++i, nodalConnOfCell += nbCellNodes ) + dimMesh->insertNextCell( cellType, nbCellNodes, nodalConnOfCell ); + } + dimMesh->finishInsertingCells(); + mesh->setMeshAtLevel( dim - meshDim, dimMesh ); + dimMesh->decrRef(); + } } //================================================================================ @@ -3180,7 +3219,7 @@ void IntermediateMED::setConnectivity( ParaMEDMEM::MEDFileUMesh* mesh, */ //================================================================================ -void IntermediateMED::setGroups( ParaMEDMEM::MEDFileUMesh* mesh ) +void IntermediateMED::setGroups( MEDCoupling::MEDFileUMesh* mesh ) { bool isMeshNameSet = false; const int meshDim = mesh->getMeshDimension(); @@ -3188,8 +3227,8 @@ void IntermediateMED::setGroups( ParaMEDMEM::MEDFileUMesh* mesh ) { const int meshDimRelToMaxExt = ( dim == 0 ? 1 : dim - meshDim ); - std::vector medGroups; - std::vector > refGroups; + std::vector medGroups; + std::vector > refGroups; for ( size_t i = 0; i < _groups.size(); ++i ) { Group& grp = _groups[i]; @@ -3235,13 +3274,13 @@ void IntermediateMED::setGroups( ParaMEDMEM::MEDFileUMesh* mesh ) } } // create a med group - grp._medGroup = DataArrayInt::New(); + grp._medGroup = DataArrayIdType::New(); grp._medGroup->setName( grp._name.c_str() ); grp._medGroup->alloc( cell2order.size(), /*nbOfCompo=*/1 ); - int * idsPrt = grp._medGroup->getPointer(); + TID * idsPtr = grp._medGroup->getPointer(); TCellToOrderMap::iterator cell2orderIt, cell2orderEnd = cell2order.end(); for ( cell2orderIt = cell2order.begin(); cell2orderIt != cell2orderEnd; ++cell2orderIt ) - *idsPrt++ = (*cell2orderIt).first->_number - 1; + *idsPtr++ = (*cell2orderIt).first->_number - 1; // try to set the mesh name if ( !isMeshNameSet && @@ -3262,10 +3301,13 @@ void IntermediateMED::setGroups( ParaMEDMEM::MEDFileUMesh* mesh ) // Issue 0021311. Use case: a gibi group has references (recorded in pile 1) // and several names (pile 27) refer (pile 10) to this group. // We create a copy of this group per each named reference + std::set uniqueNames; + uniqueNames.insert( grp._name ); for ( unsigned iRef = 0 ; iRef < grp._refNames.size(); ++iRef ) - if ( !grp._refNames[ iRef ].empty() ) + if ( !grp._refNames[ iRef ].empty() && + uniqueNames.insert( grp._refNames[ iRef ]).second ) // for name uniqueness (23155) { - refGroups.push_back( grp._medGroup->deepCpy() ); + refGroups.push_back( grp._medGroup->deepCopy() ); refGroups.back()->setName( grp._refNames[ iRef ].c_str() ); medGroups.push_back( refGroups.back() ); } @@ -3284,17 +3326,18 @@ bool IntermediateMED::isOnAll( const Group* grp, int & dimRel ) const { int dim = getDim( grp ); - int nbElems = 0; - CellsByDimIterator dimCells( *this, dim ); - while ( const std::set * cells = dimCells.nextType() ) - nbElems += cells->size(); - - const bool onAll = ( nbElems == grp->size() ); - + mcIdType nbElems = 0; if ( dim == 0 ) - dimRel = 0; + { + nbElems = _nbNodes; + dimRel = 0; + } else { + CellsByDimIterator dimCells( *this, dim ); + while ( const std::set * cells = dimCells.nextType() ) + nbElems += ToIdType( cells->size() ); + int meshDim = 3; for ( ; meshDim > 0; --meshDim ) { @@ -3304,6 +3347,8 @@ bool IntermediateMED::isOnAll( const Group* grp, int & dimRel ) const } dimRel = dim - meshDim; } + + bool onAll = ( nbElems == grp->size() ); return onAll; } @@ -3313,7 +3358,7 @@ bool IntermediateMED::isOnAll( const Group* grp, int & dimRel ) const */ //================================================================================ -ParaMEDMEM::MEDFileFields * IntermediateMED::makeMEDFileFields(ParaMEDMEM::MEDFileUMesh* mesh) +MEDCoupling::MEDFileFields * IntermediateMED::makeMEDFileFields(MEDCoupling::MEDFileUMesh* mesh) { if ( _nodeFields.empty() && _cellFields.empty() ) return 0; @@ -3323,10 +3368,10 @@ ParaMEDMEM::MEDFileFields * IntermediateMED::makeMEDFileFields(ParaMEDMEM::MEDFi MEDFileFields* fields = MEDFileFields::New(); - for ( size_t i = 0; i < _nodeFields.size(); ++i ) + for ( unsigned int i = 0; i < _nodeFields.size(); ++i ) setFields( _nodeFields[i], fields, mesh, i+1, usedFieldNames ); - for ( size_t i = 0; i < _cellFields.size(); ++i ) + for ( unsigned int i = 0; i < _cellFields.size(); ++i ) setFields( _cellFields[i], fields, mesh, i+1, usedFieldNames ); return fields; @@ -3339,8 +3384,8 @@ ParaMEDMEM::MEDFileFields * IntermediateMED::makeMEDFileFields(ParaMEDMEM::MEDFi //================================================================================ void IntermediateMED::setFields( SauvUtilities::DoubleField* fld, - ParaMEDMEM::MEDFileFields* medFields, - ParaMEDMEM::MEDFileUMesh* mesh, + MEDCoupling::MEDFileFields* medFields, + MEDCoupling::MEDFileUMesh* mesh, const TID castemID, std::set< std::string >& usedFieldNames) { @@ -3360,7 +3405,7 @@ void IntermediateMED::setFields( SauvUtilities::DoubleField* fld, std::cout << "Castem field #" << castemID << " <" << fld->_name << "> is incompatible with MED format, so we split it into several fields:" << std::endl; - for ( size_t iSub = 0; iSub < fld->_sub.size(); ) + for ( unsigned int iSub = 0; iSub < fld->_sub.size(); ) { // set field name if ( !uniteSubs || fld->_name.empty() ) @@ -3374,8 +3419,8 @@ void IntermediateMED::setFields( SauvUtilities::DoubleField* fld, double * valPtr = values->getPointer(); if ( uniteSubs ) { - int nbElems = fld->_group->size(); - for ( int elemShift = 0; elemShift < nbElems && iSub < fld->_sub.size(); ) + mcIdType nbElems = fld->_group->size(); + for ( mcIdType elemShift = 0; elemShift < nbElems && iSub < fld->_sub.size(); ) elemShift += fld->setValues( valPtr, iSub++, elemShift ); setTS( fld, values, medFields, mesh ); } @@ -3384,7 +3429,7 @@ void IntermediateMED::setFields( SauvUtilities::DoubleField* fld, fld->setValues( valPtr, iSub ); setTS( fld, values, medFields, mesh, iSub++ ); - std::cout << fld->_name << " with compoments"; + std::cout << fld->_name << " with components"; for ( size_t i = 0; i < (size_t)fld->_sub[iSub-1].nbComponents(); ++i ) std::cout << " " << fld->_sub[iSub-1]._comp_names[ i ]; std::cout << std::endl; @@ -3399,9 +3444,9 @@ void IntermediateMED::setFields( SauvUtilities::DoubleField* fld, //================================================================================ void IntermediateMED::setTS( SauvUtilities::DoubleField* fld, - ParaMEDMEM::DataArrayDouble* values, - ParaMEDMEM::MEDFileFields* medFields, - ParaMEDMEM::MEDFileUMesh* mesh, + MEDCoupling::DataArrayDouble* values, + MEDCoupling::MEDFileFields* medFields, + MEDCoupling::MEDFileUMesh* mesh, const int iSub) { // treat a field support @@ -3423,25 +3468,25 @@ void IntermediateMED::setTS( SauvUtilities::DoubleField* fld, // set the mesh if ( onAll ) { - MEDCouplingAutoRefCountObjectPtr + MCAuto < MEDCouplingUMesh > dimMesh = mesh->getMeshAtLevel( dimRel ); timeStamp->setMesh( dimMesh ); } - else if ( timeStamp->getTypeOfField() == ParaMEDMEM::ON_NODES ) + else if ( timeStamp->getTypeOfField() == MEDCoupling::ON_NODES ) { DataArrayDouble * coo = mesh->getCoords(); - MEDCouplingAutoRefCountObjectPtr + MCAuto subCoo = coo->selectByTupleId(support->_medGroup->begin(), - support->_medGroup->end()); - MEDCouplingAutoRefCountObjectPtr< MEDCouplingUMesh > nodeSubMesh = + support->_medGroup->end()); + MCAuto< MEDCouplingUMesh > nodeSubMesh = MEDCouplingUMesh::Build0DMeshFromCoords( subCoo ); timeStamp->setMesh( nodeSubMesh ); } else { - MEDCouplingAutoRefCountObjectPtr + MCAuto < MEDCouplingUMesh > dimMesh = mesh->getMeshAtLevel( dimRel ); - MEDCouplingAutoRefCountObjectPtr + MCAuto subMesh = dimMesh->buildPart(support->_medGroup->begin(), support->_medGroup->end()); timeStamp->setMesh( subMesh); @@ -3452,10 +3497,11 @@ void IntermediateMED::setTS( SauvUtilities::DoubleField* fld, timeStamp->setArray( values ); values->decrRef(); // set gauss points - if ( timeStamp->getTypeOfField() == ParaMEDMEM::ON_GAUSS_PT ) + if ( timeStamp->getTypeOfField() == MEDCoupling::ON_GAUSS_PT ) { - TGaussDef gaussDef( support->_cellType, fld->_sub[iSub].nbGauss() ); - timeStamp->setGaussLocalizationOnType( support->_cellType, + TGaussDef gaussDef( fld->_sub[iSub]._support->_cellType, + fld->_sub[iSub].nbGauss() ); + timeStamp->setGaussLocalizationOnType( fld->_sub[iSub]._support->_cellType, gaussDef.myRefCoords, gaussDef.myCoords, gaussDef.myWeights ); @@ -3474,7 +3520,7 @@ void IntermediateMED::setTS( SauvUtilities::DoubleField* fld, timeStamp->setOrder( nbTS ); // add the time-stamp - timeStamp->checkCoherency(); + timeStamp->checkConsistencyLight(); if ( onAll ) fld->_curMedField->appendFieldNoProfileSBT( timeStamp ); else @@ -3604,7 +3650,7 @@ bool DoubleField::isMultiTimeStamps() const bool DoubleField::isMedCompatible(bool& sameNbGauss) const { - for ( size_t iSub = 0; iSub < _sub.size(); ++iSub ) + for ( unsigned int iSub = 0; iSub < _sub.size(); ++iSub ) { if ( !getSupport(iSub) || !getSupport(iSub)->_medGroup ) THROW_IK_EXCEPTION("SauvReader INTERNAL ERROR: NULL field support"); @@ -3631,14 +3677,14 @@ bool DoubleField::hasSameComponentsBySupport() const std::vector< _Sub_data >::const_iterator sub_data = _sub.begin(); const _Sub_data& first_sub_data = *sub_data; for ( ++sub_data ; sub_data != _sub.end(); ++sub_data ) - { - if ( first_sub_data._comp_names != sub_data->_comp_names ) - return false; // diff names of components + { + if ( first_sub_data._comp_names != sub_data->_comp_names ) + return false; // diff names of components - if ( first_sub_data._nb_gauss != sub_data->_nb_gauss && - first_sub_data._support->_cellType == sub_data->_support->_cellType) - return false; // diff nb of gauss points on same cell type - } + if ( first_sub_data._nb_gauss != sub_data->_nb_gauss && + first_sub_data._support->_cellType == sub_data->_support->_cellType) + return false; // diff nb of gauss points on same cell type + } return true; } @@ -3648,7 +3694,7 @@ bool DoubleField::hasSameComponentsBySupport() const */ //================================================================================ -ParaMEDMEM::TypeOfField DoubleField::getMedType( const int iSub ) const +MEDCoupling::TypeOfField DoubleField::getMedType( const int iSub ) const { using namespace INTERP_KERNEL; @@ -3670,7 +3716,7 @@ ParaMEDMEM::TypeOfField DoubleField::getMedType( const int iSub ) const */ //================================================================================ -ParaMEDMEM::TypeOfTimeDiscretization DoubleField::getMedTimeDisc() const +MEDCoupling::TypeOfTimeDiscretization DoubleField::getMedTimeDisc() const { return ONE_TIME; // NO_TIME = 4, @@ -3685,9 +3731,9 @@ ParaMEDMEM::TypeOfTimeDiscretization DoubleField::getMedTimeDisc() const */ //================================================================================ -int DoubleField::getNbTuples( const int iSub ) const +mcIdType DoubleField::getNbTuples( const int iSub ) const { - int nb = 0; + mcIdType nb = 0; if ( hasCommonSupport() && !_group->_groups.empty() ) for ( size_t i = 0; i < _group->_groups.size(); ++i ) nb += _sub[i].nbGauss() * _sub[i]._support->size(); @@ -3702,7 +3748,7 @@ int DoubleField::getNbTuples( const int iSub ) const */ //================================================================================ -int DoubleField::setValues( double * valPtr, const int iSub, const int elemShift ) const +mcIdType DoubleField::setValues( double * valPtr, const int iSub, const mcIdType elemShift ) const { // find values for iSub int iComp = 0; @@ -3712,41 +3758,41 @@ int DoubleField::setValues( double * valPtr, const int iSub, const int elemShift // Set values - const std::vector< unsigned >& relocTable = getSupport( iSub )->_relocTable; + const std::vector< mcIdType >& relocTable = getSupport( iSub )->_relocTable; - const int nbElems = _sub[iSub]._support->size(); + const mcIdType nbElems = _sub[iSub]._support->size(); const int nbGauss = _sub[iSub].nbGauss(); const int nbComponents = _sub[iSub].nbComponents(); const int nbValsByElem = nbComponents * nbGauss; // check nb values - int nbVals = 0; + mcIdType nbVals = 0; for ( iComp = 0; iComp < nbComponents; ++iComp ) - nbVals += compValues[iComp].size(); + nbVals += ToIdType( compValues[iComp].size() ); const bool isConstField = ( nbVals == nbComponents ); // one value per component (issue 22321) if ( !isConstField && nbVals != nbElems * nbValsByElem ) THROW_IK_EXCEPTION("SauvMedConvertor.cxx: support size mismatches field size"); // compute nb values in previous subs - int valsShift = 0; - for ( int iS = iSub-1, shift = elemShift; shift > 0; --iS) + mcIdType valsShift = 0; + for ( mcIdType iS = iSub-1, shift = elemShift; shift > 0; --iS) { - int nbE = _sub[iS]._support->size(); + mcIdType nbE = _sub[iS]._support->size(); shift -= nbE; valsShift += nbE * _sub[iS].nbComponents() * _sub[iS].nbGauss(); } if ( isConstField ) - for ( int iE = 0; iE < nbElems; ++iE ) + for ( mcIdType iE = 0; iE < nbElems; ++iE ) { - int iMed = valsShift + nbValsByElem * ( relocTable.empty() ? iE : relocTable[iE+elemShift]-elemShift ); + mcIdType iMed = valsShift + nbValsByElem * ( relocTable.empty() ? iE : relocTable[iE+elemShift]-elemShift ); for ( iComp = 0; iComp < nbComponents; ++iComp ) valPtr[ iMed + iComp ] = compValues[iComp][ 0 ]; } else - for ( int iE = 0; iE < nbElems; ++iE ) + for ( mcIdType iE = 0; iE < nbElems; ++iE ) { - int iMed = valsShift + nbValsByElem * ( relocTable.empty() ? iE : relocTable[iE+elemShift]-elemShift ); + mcIdType iMed = valsShift + nbValsByElem * ( relocTable.empty() ? iE : relocTable[iE+elemShift]-elemShift ); for ( iComp = 0; iComp < nbComponents; ++iComp ) for ( int iG = 0; iG < nbGauss; ++iG ) valPtr[ iMed + iG * nbComponents + iComp ] = compValues[iComp][ iE * nbGauss + iG ]; @@ -3787,7 +3833,7 @@ CellsByDimIterator::CellsByDimIterator( const IntermediateMED & medi, int dimm) init( dimm ); } /*! - * \brief Initialize iteration on cells of given dimention + * \brief Initialize iteration on cells of given dimension */ void CellsByDimIterator::init(const int dimm) { @@ -3817,4 +3863,3 @@ int CellsByDimIterator::dim(const bool last) const return typp < myTypeEnd ? getDimension( TCellType( typp )) : 4; } // END CellsByDimIterator ======================================================== -