From cd046a8787550e0bbbdef9ff697e052d6d898576 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Wed, 19 Apr 2017 11:59:03 +0200 Subject: [PATCH] In progress --- src/MEDLoader/MEDFileMesh.cxx | 212 ++++++++++++---------- src/MEDLoader/MEDFileMesh.hxx | 1 + src/MEDLoader/MEDFileMeshReadSelector.cxx | 17 +- src/MEDLoader/MEDFileMeshReadSelector.hxx | 2 + src/MEDLoader/Swig/MEDLoaderCommon.i | 2 + 5 files changed, 139 insertions(+), 95 deletions(-) diff --git a/src/MEDLoader/MEDFileMesh.cxx b/src/MEDLoader/MEDFileMesh.cxx index 3d59c0b95..29e34fc2b 100644 --- a/src/MEDLoader/MEDFileMesh.cxx +++ b/src/MEDLoader/MEDFileMesh.cxx @@ -2357,6 +2357,7 @@ std::vector MEDFileUMesh::getDirectChildrenWithNull() c ret.push_back((const DataArrayDouble*)_coords); ret.push_back((const DataArrayInt *)_fam_coords); ret.push_back((const DataArrayInt *)_num_coords); + ret.push_back((const DataArrayInt *)_global_num_coords); ret.push_back((const DataArrayInt *)_rev_num_coords); ret.push_back((const DataArrayAsciiChar *)_name_coords); ret.push_back((const PartDefinition *)_part_coords); @@ -2382,15 +2383,17 @@ MEDFileUMesh *MEDFileUMesh::deepCopy() const { MCAuto ret(new MEDFileUMesh(*this)); ret->deepCpyEquivalences(*this); - if((const DataArrayDouble*)_coords) + if(_coords.isNotNull()) ret->_coords=_coords->deepCopy(); - if((const DataArrayInt*)_fam_coords) + if(_fam_coords.isNotNull()) ret->_fam_coords=_fam_coords->deepCopy(); - if((const DataArrayInt*)_num_coords) + if(_num_coords.isNotNull()) ret->_num_coords=_num_coords->deepCopy(); - if((const DataArrayInt*)_rev_num_coords) + if(_global_num_coords.isNotNull()) + ret->_global_num_coords=_global_num_coords->deepCopy(); + if(_rev_num_coords.isNotNull()) ret->_rev_num_coords=_rev_num_coords->deepCopy(); - if((const DataArrayAsciiChar*)_name_coords) + if(_name_coords.isNotNull()) ret->_name_coords=_name_coords->deepCopy(); std::size_t i=0; for(std::vector< MCAuto >::const_iterator it=_ms.begin();it!=_ms.end();it++,i++) @@ -2438,54 +2441,74 @@ bool MEDFileUMesh::isEqual(const MEDFileMesh *other, double eps, std::string& wh return false; } } - const DataArrayInt *famc1=_fam_coords; - const DataArrayInt *famc2=otherC->_fam_coords; - if((famc1==0 && famc2!=0) || (famc1!=0 && famc2==0)) - { - what="Mismatch of families arr on nodes ! One is defined and not other !"; - return false; - } - if(famc1) - { - bool ret=famc1->isEqual(*famc2); - if(!ret) - { - what="Families arr on node differ !"; - return false; - } - } - const DataArrayInt *numc1=_num_coords; - const DataArrayInt *numc2=otherC->_num_coords; - if((numc1==0 && numc2!=0) || (numc1!=0 && numc2==0)) - { - what="Mismatch of numbering arr on nodes ! One is defined and not other !"; - return false; - } - if(numc1) - { - bool ret=numc1->isEqual(*numc2); - if(!ret) - { - what="Numbering arr on node differ !"; - return false; - } - } - const DataArrayAsciiChar *namec1=_name_coords; - const DataArrayAsciiChar *namec2=otherC->_name_coords; - if((namec1==0 && namec2!=0) || (namec1!=0 && namec2==0)) - { - what="Mismatch of naming arr on nodes ! One is defined and not other !"; - return false; - } - if(namec1) - { - bool ret=namec1->isEqual(*namec2); - if(!ret) - { - what="Names arr on node differ !"; - return false; - } - } + { + const DataArrayInt *famc1(_fam_coords),*famc2(otherC->_fam_coords); + if((famc1==0 && famc2!=0) || (famc1!=0 && famc2==0)) + { + what="Mismatch of families arr on nodes ! One is defined and not other !"; + return false; + } + if(famc1) + { + bool ret=famc1->isEqual(*famc2); + if(!ret) + { + what="Families arr on node differ !"; + return false; + } + } + } + { + const DataArrayInt *numc1(_num_coords),*numc2(otherC->_num_coords); + if((numc1==0 && numc2!=0) || (numc1!=0 && numc2==0)) + { + what="Mismatch of numbering arr on nodes ! One is defined and not other !"; + return false; + } + if(numc1) + { + bool ret=numc1->isEqual(*numc2); + if(!ret) + { + what="Numbering arr on node differ !"; + return false; + } + } + } + { + const DataArrayInt *gnumc1(_global_num_coords),*gnumc2(otherC->_global_num_coords); + if((gnumc1==0 && gnumc2!=0) || (gnumc1!=0 && gnumc2==0)) + { + what="Mismatch of numbering arr on nodes ! One is defined and not other !"; + return false; + } + if(gnumc1) + { + bool ret=gnumc1->isEqual(*gnumc2); + if(!ret) + { + what="Global numbering arr on node differ !"; + return false; + } + } + } + { + const DataArrayAsciiChar *namec1(_name_coords),*namec2(otherC->_name_coords); + if((namec1==0 && namec2!=0) || (namec1!=0 && namec2==0)) + { + what="Mismatch of naming arr on nodes ! One is defined and not other !"; + return false; + } + if(namec1) + { + bool ret=namec1->isEqual(*namec2); + if(!ret) + { + what="Names arr on node differ !"; + return false; + } + } + } if(_ms.size()!=otherC->_ms.size()) { what="Number of levels differs !"; @@ -2534,15 +2557,15 @@ void MEDFileUMesh::checkConsistency() const throw INTERP_KERNEL::Exception("MEDFileUMesh::checkConsistency(): coords are null but some mesh parts are present!"); if (!_fam_coords) throw INTERP_KERNEL::Exception("MEDFileUMesh::checkConsistency(): coords are null but not the internal node family array!"); - if (!_num_coords || !_rev_num_coords) + if (_num_coords.isNotNull() || _rev_num_coords.isNotNull() || _global_num_coords.isNotNull()) throw INTERP_KERNEL::Exception("MEDFileUMesh::checkConsistency(): coords are null but not the internal node numbering array!"); } else { int nbCoo = _coords->getNumberOfTuples(); - if (_fam_coords) + if (_fam_coords.isNotNull()) _fam_coords->checkNbOfTuplesAndComp(nbCoo,1,"MEDFileUMesh::checkConsistency(): inconsistent internal node family array!"); - if (_num_coords) + if (_num_coords.isNotNull()) { _num_coords->checkNbOfTuplesAndComp(nbCoo,1,"MEDFileUMesh::checkConsistency(): inconsistent internal node numbering array!"); int pos; @@ -2550,6 +2573,10 @@ void MEDFileUMesh::checkConsistency() const if (!_rev_num_coords || _rev_num_coords->getNumberOfTuples() != (maxValue+1)) throw INTERP_KERNEL::Exception("MEDFileUMesh::checkConsistency(): inconsistent internal revert node numbering array!"); } + if (_global_num_coords.isNotNull()) + { + _global_num_coords->checkNbOfTuplesAndComp(nbCoo,1,"MEDFileUMesh::checkConsistency(): inconsistent global node numbering array!"); + } if ((_num_coords && !_rev_num_coords) || (!_num_coords && _rev_num_coords)) throw INTERP_KERNEL::Exception("MEDFileUMesh::checkConsistency(): inconsistent internal numbering arrays (one is null)!"); if (_num_coords && !_num_coords->hasUniqueValues()) @@ -2600,13 +2627,13 @@ void MEDFileUMesh::checkSMESHConsistency() const */ void MEDFileUMesh::clearNodeAndCellNumbers() { - _num_coords = 0; - _rev_num_coords = 0; - for (std::vector< MCAuto >::iterator it=_ms.begin(); - it != _ms.end(); it++) + _num_coords.nullify(); + _rev_num_coords.nullify(); + for (std::vector< MCAuto >::iterator it=_ms.begin(); it != _ms.end(); it++) { - (*it)->_num = 0; - (*it)->_rev_num = 0; + (*it)->_num.nullify(); + (*it)->_rev_num.nullify(); + (*it)->_global_num_coords.nullify(); } } @@ -2616,30 +2643,25 @@ void MEDFileUMesh::clearNodeAndCellNumbers() void MEDFileUMesh::clearNonDiscrAttributes() const { MEDFileMesh::clearNonDiscrAttributes(); - const DataArrayDouble *coo1=_coords; - if(coo1) - (const_cast(coo1))->setName("");//This parameter is not discriminant for comparison - const DataArrayInt *famc1=_fam_coords; - if(famc1) - (const_cast(famc1))->setName("");//This parameter is not discriminant for comparison - const DataArrayInt *numc1=_num_coords; - if(numc1) - (const_cast(numc1))->setName("");//This parameter is not discriminant for comparison - const DataArrayAsciiChar *namc1=_name_coords; - if(namc1) - (const_cast(namc1))->setName("");//This parameter is not discriminant for comparison + if(_coords.isNotNull()) + _coords->setName("");//This parameter is not discriminant for comparison + if(_fam_coords.isNotNull()) + _fam_coords->setName("");//This parameter is not discriminant for comparison + if(_num_coords.isNotNull()) + _num_coords->setName("");//This parameter is not discriminant for comparison + if(_name_coords.isNotNull()) + _name_coords->setName("");//This parameter is not discriminant for comparison for(std::vector< MCAuto >::const_iterator it=_ms.begin();it!=_ms.end();it++) { - const MEDFileUMeshSplitL1 *tmp=(*it); - if(tmp) - tmp->clearNonDiscrAttributes(); + if((*it).isNotNull()) + (*it)->clearNonDiscrAttributes(); } } void MEDFileUMesh::setName(const std::string& name) { for(std::vector< MCAuto >::iterator it=_ms.begin();it!=_ms.end();it++) - if((MEDFileUMeshSplitL1 *)(*it)!=0) + if((*it).isNotNull()) (*it)->setName(name); MEDFileMesh::setName(name); } @@ -2847,6 +2869,8 @@ void MEDFileUMesh::dispatchLoadedPart(med_idt fid, const MEDFileUMeshL2& loaderl _num_coords=loaderl2.getCoordsNum(); if(!mrs || mrs->isNodeNameFieldReading()) _name_coords=loaderl2.getCoordsName(); + if(!mrs || mrs->isGlobalNodeNumFieldReading()) + _global_num_coords=loaderl2.getGlobalCoordsNum(); _part_coords=loaderl2.getPartDefOfCoo(); computeRevNum(); } @@ -2939,8 +2963,7 @@ std::vector MEDFileUMesh::getFamArrNonEmptyLevelsExt() const std::vector MEDFileUMesh::getNumArrNonEmptyLevelsExt() const { std::vector ret; - const DataArrayInt *numCoo(_num_coords); - if(numCoo) + if(_num_coords.isNotNull()) ret.push_back(1); int lev=0; for(std::vector< MCAuto >::const_iterator it=_ms.begin();it!=_ms.end();it++,lev--) @@ -3339,11 +3362,11 @@ const DataArrayInt *MEDFileUMesh::getRevNumberFieldAtLevel(int meshDimRelToMaxEx { if(meshDimRelToMaxExt==1) { - if(!((const DataArrayInt *)_num_coords)) + if(_num_coords.isNotNull()) throw INTERP_KERNEL::Exception("MEDFileUMesh::getRevNumberFieldAtLevel : no coordinates renum specified !"); return _rev_num_coords; } - const MEDFileUMeshSplitL1 *l1=getMeshAtLevSafe(meshDimRelToMaxExt); + const MEDFileUMeshSplitL1 *l1(getMeshAtLevSafe(meshDimRelToMaxExt)); return l1->getRevNumberField(); } @@ -3784,12 +3807,11 @@ void MEDFileUMesh::setCoords(DataArrayDouble *coords) return ; coords->checkAllocated(); int nbOfTuples(coords->getNumberOfTuples()); - _coords=coords; - coords->incrRef(); + _coords.takeRef(coords); _fam_coords=DataArrayInt::New(); _fam_coords->alloc(nbOfTuples,1); _fam_coords->fillWithZero(); - _num_coords=0; _rev_num_coords=0; _name_coords=0; + _num_coords.nullify(); _rev_num_coords.nullify(); _name_coords.nullify(); _global_num_coords.nullify(); for(std::vector< MCAuto >::iterator it=_ms.begin();it!=_ms.end();it++) if((MEDFileUMeshSplitL1 *)(*it)) (*it)->setCoords(coords); @@ -4007,8 +4029,8 @@ void MEDFileUMesh::buildInnerBoundaryAlongM1Group(const std::string& grpNameM1, _fam_coords=newFam; } - _num_coords = 0; - _rev_num_coords = 0; + _num_coords.nullify(); _rev_num_coords.nullify(); _global_num_coords.nullify(); + for (std::vector< MCAuto >::iterator it=_ms.begin(); it != _ms.end(); it++) { @@ -4148,12 +4170,14 @@ DataArrayInt *MEDFileUMesh::zipCoords() MCAuto newNameCoords; if((const DataArrayInt *)_fam_coords) newFamCoords=_fam_coords->selectByTupleIdSafe(ret2->begin(),ret2->end()); - MCAuto newNumCoords; - if((const DataArrayInt *)_num_coords) + MCAuto newNumCoords,newGlobalNumCoords; + if(_num_coords.isNotNull()) newNumCoords=_num_coords->selectByTupleIdSafe(ret2->begin(),ret2->end()); - if((const DataArrayAsciiChar *)_name_coords) + if(_global_num_coords.isNotNull()) + newGlobalNumCoords=_global_num_coords->selectByTupleIdSafe(ret2->begin(),ret2->end()); + if(_name_coords.isNotNull()) newNameCoords=static_cast(_name_coords->selectByTupleIdSafe(ret2->begin(),ret2->end())); - _coords=newCoords; _fam_coords=newFamCoords; _num_coords=newNumCoords; _name_coords=newNameCoords; _rev_num_coords=0; + _coords=newCoords; _fam_coords=newFamCoords; _num_coords=newNumCoords; _global_num_coords=newGlobalNumCoords; _name_coords=newNameCoords; _rev_num_coords.nullify(); for(std::vector< MCAuto >::iterator it=_ms.begin();it!=_ms.end();it++) { if((MEDFileUMeshSplitL1*)*it) @@ -5169,8 +5193,8 @@ void MEDFileUMesh::setRenumFieldArr(int meshDimRelToMaxExt, DataArrayInt *renumA { if(!renumArr) { - _num_coords=0; - _rev_num_coords=0; + _num_coords.nullify(); + _rev_num_coords.nullify(); return ; } DataArrayDouble *coo(_coords); @@ -5272,7 +5296,7 @@ std::list< MCAuto > MEDFileUMesh::getAllNonNullFamilyIds() const void MEDFileUMesh::computeRevNum() const { - if((const DataArrayInt *)_num_coords) + if(_num_coords.isNotNull()) { int pos; int maxValue=_num_coords->getMaxValue(pos); diff --git a/src/MEDLoader/MEDFileMesh.hxx b/src/MEDLoader/MEDFileMesh.hxx index ba5c8fe40..6ab16bc7e 100644 --- a/src/MEDLoader/MEDFileMesh.hxx +++ b/src/MEDLoader/MEDFileMesh.hxx @@ -385,6 +385,7 @@ namespace MEDCoupling MCAuto _coords; MCAuto _fam_coords; MCAuto _num_coords; + MCAuto _global_num_coords; MCAuto _name_coords; mutable MCAuto _rev_num_coords; MCAuto _part_coords; diff --git a/src/MEDLoader/MEDFileMeshReadSelector.cxx b/src/MEDLoader/MEDFileMeshReadSelector.cxx index 3a48c2731..44d9c318c 100644 --- a/src/MEDLoader/MEDFileMeshReadSelector.cxx +++ b/src/MEDLoader/MEDFileMeshReadSelector.cxx @@ -70,6 +70,11 @@ bool MEDFileMeshReadSelector::isNodeNumFieldReading() const return _code & 0x00000020; } +bool MEDFileMeshReadSelector::isGlobalNodeNumFieldReading() const +{ + return _code & 0x00000040; +} + void MEDFileMeshReadSelector::setCellFamilyFieldReading(bool b) { unsigned int code(_code & 0xFFFFFFFE); @@ -124,6 +129,15 @@ void MEDFileMeshReadSelector::setNodeNumFieldReading(bool b) _code=code; } +void MEDFileMeshReadSelector::setGlobalNodeNumFieldReading(bool b) +{ + unsigned int code(_code & 0xFFFFFFBF); + unsigned int b2=b?1:0; + b2<<=6; + code+=b2; + _code=code; +} + void MEDFileMeshReadSelector::reprAll(std::ostream& str) const { str << "MEDFileMeshReadSelector (code=" << _code << ") : \n"; @@ -132,7 +146,8 @@ void MEDFileMeshReadSelector::reprAll(std::ostream& str) const str << "Read name field on cells : " << ReprStatus(isCellNameFieldReading()) << std::endl; str << "Read name field on nodes : " << ReprStatus(isNodeNameFieldReading()) << std::endl; str << "Read number field on cells : " << ReprStatus(isCellNumFieldReading()) << std::endl; - str << "Read number field name on nodes : " << ReprStatus(isNodeNumFieldReading()); + str << "Read number field name on nodes : " << ReprStatus(isNodeNumFieldReading()) << std::end; + str << "Read global number field name on nodes : " << ReprStatus(isGlobalNodeNumFieldReading()); } std::string MEDFileMeshReadSelector::ReprStatus(bool v) diff --git a/src/MEDLoader/MEDFileMeshReadSelector.hxx b/src/MEDLoader/MEDFileMeshReadSelector.hxx index 8d05643ed..35c61144d 100644 --- a/src/MEDLoader/MEDFileMeshReadSelector.hxx +++ b/src/MEDLoader/MEDFileMeshReadSelector.hxx @@ -41,12 +41,14 @@ namespace MEDCoupling bool isNodeNameFieldReading() const; bool isCellNumFieldReading() const; bool isNodeNumFieldReading() const; + bool isGlobalNodeNumFieldReading() const; void setCellFamilyFieldReading(bool b); void setNodeFamilyFieldReading(bool b); void setCellNameFieldReading(bool b); void setNodeNameFieldReading(bool b); void setCellNumFieldReading(bool b); void setNodeNumFieldReading(bool b); + void setGlobalNodeNumFieldReading(bool b); void reprAll(std::ostream& str) const; private: static std::string ReprStatus(bool v); diff --git a/src/MEDLoader/Swig/MEDLoaderCommon.i b/src/MEDLoader/Swig/MEDLoaderCommon.i index c205a3e78..51cbad917 100644 --- a/src/MEDLoader/Swig/MEDLoaderCommon.i +++ b/src/MEDLoader/Swig/MEDLoaderCommon.i @@ -628,12 +628,14 @@ namespace MEDCoupling bool isNodeNameFieldReading() const; bool isCellNumFieldReading() const; bool isNodeNumFieldReading() const; + bool isGlobalNodeNumFieldReading() const; void setCellFamilyFieldReading(bool b); void setNodeFamilyFieldReading(bool b); void setCellNameFieldReading(bool b); void setNodeNameFieldReading(bool b); void setCellNumFieldReading(bool b); void setNodeNumFieldReading(bool b); + void setGlobalNodeNumFieldReading(bool b); %extend { std::string __str__() const throw(INTERP_KERNEL::Exception) -- 2.39.2