X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FMEDFileFieldOverView.cxx;h=96feb1ddc6fc3d69f8f79cfff05e9190c1f9a3b2;hb=35287602e212fd35b8a4b11215cb111b929a4875;hp=42b4759ebdfe0c3ae3eb93582fe4e4059d9b6634;hpb=eda854d4aaf7a516cac9a5c685fc25d22f4194f6;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/MEDFileFieldOverView.cxx b/src/MEDLoader/MEDFileFieldOverView.cxx index 42b4759eb..96feb1ddc 100644 --- a/src/MEDLoader/MEDFileFieldOverView.cxx +++ b/src/MEDLoader/MEDFileFieldOverView.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 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 @@ -22,12 +22,13 @@ #include "MEDFileField.hxx" #include "MEDFileMesh.hxx" +#include "MEDCouplingFieldDiscretization.hxx" #include "CellModel.hxx" -using namespace ParaMEDMEM; +using namespace MEDCoupling; const unsigned char MEDMeshMultiLev::PARAMEDMEM_2_VTKTYPE[MEDMeshMultiLev::PARAMEDMEM_2_VTKTYPE_LGTH]= -{1,3,21,5,9,7,22,34,23,28,255,255,255,255,10,14,13,255,12,255,24,255,16,27,255,26,255,29,255,255,25,42,36,4}; +{1,3,21,5,9,7,22,34,23,28,35,255,255,255,10,14,13,255,12,255,24,255,16,27,255,26,255,29,32,255,25,42,36,4}; const unsigned char MEDMeshMultiLev::HEXA27_PERM_ARRAY[27]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,24,22,21,23,20,25,26}; @@ -47,7 +48,7 @@ std::size_t MEDFileMeshStruct::getHeapMemorySizeWithoutChildren() const return ret; } -std::vector MEDFileMeshStruct::getDirectChildren() const +std::vector MEDFileMeshStruct::getDirectChildrenWithNull() const { return std::vector(); } @@ -158,7 +159,7 @@ std::size_t MEDMeshMultiLev::getHeapMemorySizeWithoutChildren() const return 0; } -std::vector MEDMeshMultiLev::getDirectChildren() const +std::vector MEDMeshMultiLev::getDirectChildrenWithNull() const { return std::vector(); } @@ -197,7 +198,7 @@ MEDMeshMultiLev *MEDMeshMultiLev::New(const MEDFileMesh *m, const std::vector ret(MEDMeshMultiLev::New(m,m->getNonEmptyLevels())); + MCAuto ret(MEDMeshMultiLev::New(m,m->getNonEmptyLevels())); ret->selectPartOfNodes(pflOnNode); return ret.retn(); } @@ -253,7 +254,7 @@ bool MEDMeshMultiLev::isFastlyTheSameStruct(const MEDFileField1TSStructItem& fst DataArray *MEDMeshMultiLev::buildDataArray(const MEDFileField1TSStructItem& fst, const MEDFileFieldGlobsReal *globs, const DataArray *vals) const { - MEDCouplingAutoRefCountObjectPtr ret(const_cast(vals)); ret->incrRef(); + MCAuto ret(const_cast(vals)); ret->incrRef(); if(isFastlyTheSameStruct(fst,globs)) return ret.retn(); else @@ -278,10 +279,10 @@ void MEDMeshMultiLev::retrieveFamilyIdsOnCells(DataArrayInt *& famIds, bool& isW presenceOfPfls=true; } if(!presenceOfPfls) - { famIds=const_cast(fids); famIds->incrRef(); isWithoutCopy=_cell_fam_ids_nocpy; return ; } + { famIds=const_cast(fids); famIds->incrRef(); isWithoutCopy=_mesh->isObjectInTheProgeny(famIds); return ; } //bad luck the slowest part isWithoutCopy=false; - std::vector< MEDCouplingAutoRefCountObjectPtr > retSafe(sz); + std::vector< MCAuto > retSafe(sz); std::vector< const DataArrayInt *> ret(sz); int start(0); for(std::size_t i=0;i tmp(fids->selectByTupleId2(start,start+lgth,1)); + MCAuto tmp(fids->selectByTupleIdSafeSlice(start,start+lgth,1)); retSafe[i]=tmp->selectByTupleIdSafe(pfl->begin(),pfl->end()); } else { - retSafe[i]=fids->selectByTupleId2(start,start+lgth,1); + retSafe[i]=fids->selectByTupleIdSafeSlice(start,start+lgth,1); } ret[i]=retSafe[i]; start+=lgth; @@ -321,10 +322,10 @@ void MEDMeshMultiLev::retrieveNumberIdsOnCells(DataArrayInt *& numIds, bool& isW presenceOfPfls=true; } if(!presenceOfPfls) - { numIds=const_cast(nids); numIds->incrRef(); isWithoutCopy=_cell_num_ids_nocpy; return ; } + { numIds=const_cast(nids); numIds->incrRef(); isWithoutCopy=_mesh->isObjectInTheProgeny(numIds); return ; } //bad luck the slowest part isWithoutCopy=false; - std::vector< MEDCouplingAutoRefCountObjectPtr > retSafe(sz); + std::vector< MCAuto > retSafe(sz); std::vector< const DataArrayInt *> ret(sz); int start(0); for(std::size_t i=0;i tmp(nids->selectByTupleId2(start,start+lgth,1)); + MCAuto tmp(nids->selectByTupleIdSafeSlice(start,start+lgth,1)); retSafe[i]=tmp->selectByTupleIdSafe(pfl->begin(),pfl->end()); } else { - retSafe[i]=nids->selectByTupleId2(start,start+lgth,1); + retSafe[i]=nids->selectByTupleIdSafeSlice(start,start+lgth,1); } ret[i]=retSafe[i]; start+=lgth; @@ -363,8 +364,8 @@ void MEDMeshMultiLev::retrieveFamilyIdsOnNodes(DataArrayInt *& famIds, bool& isW } else { - isWithoutCopy=_node_fam_ids_nocpy; famIds=const_cast(fids); famIds->incrRef(); + isWithoutCopy=_mesh->isObjectInTheProgeny(famIds); } } @@ -385,46 +386,66 @@ void MEDMeshMultiLev::retrieveNumberIdsOnNodes(DataArrayInt *& numIds, bool& isW } else { - isWithoutCopy=_node_num_ids_nocpy; numIds=const_cast(fids); numIds->incrRef(); + isWithoutCopy=_mesh->isObjectInTheProgeny(numIds); } } +/*! + * This method returns, if any, a new object containing the global node ids **BUT CONTRARY TO OTHER RETRIEVE METHODS** the returned object is always a NON AGGREGATED object. So the returned object if not null + * can be used as this safely. + */ +DataArrayInt *MEDMeshMultiLev::retrieveGlobalNodeIdsIfAny() const +{ + const MEDFileUMesh *umesh(dynamic_cast(_mesh)); + if(!umesh) + return 0; + const PartDefinition *pd(umesh->getPartDefAtLevel(1)); + if(!pd) + return 0; + MCAuto tmp(pd->toDAI()); + const DataArrayInt *tmpCpp(tmp); + if(!tmpCpp) + return 0; + // + const DataArrayInt *nr(_node_reduction); + if(nr) + return tmp->selectByTupleIdSafe(nr->begin(),nr->end()); + else + return tmp->deepCopy();// Yes a deep copy is needed because this method has to return a non aggregated object ! +} + std::vector< INTERP_KERNEL::NormalizedCellType > MEDMeshMultiLev::getGeoTypes() const { return _geo_types; } -void MEDMeshMultiLev::setFamilyIdsOnCells(DataArrayInt *famIds, bool isNoCopy) +void MEDMeshMultiLev::setFamilyIdsOnCells(DataArrayInt *famIds) { _cell_fam_ids=famIds; if(famIds) famIds->incrRef(); - _cell_fam_ids_nocpy=isNoCopy; } -void MEDMeshMultiLev::setNumberIdsOnCells(DataArrayInt *numIds, bool isNoCopy) +void MEDMeshMultiLev::setNumberIdsOnCells(DataArrayInt *numIds) { _cell_num_ids=numIds; if(numIds) numIds->incrRef(); - _cell_num_ids_nocpy=isNoCopy; } -void MEDMeshMultiLev::setFamilyIdsOnNodes(DataArrayInt *famIds, bool isNoCopy) +void MEDMeshMultiLev::setFamilyIdsOnNodes(DataArrayInt *famIds) { _node_fam_ids=famIds; if(famIds) famIds->incrRef(); - _node_fam_ids_nocpy=isNoCopy; } -void MEDMeshMultiLev::setNumberIdsOnNodes(DataArrayInt *numIds, bool isNoCopy) +void MEDMeshMultiLev::setNumberIdsOnNodes(DataArrayInt *numIds) { _node_num_ids=numIds; if(numIds) numIds->incrRef(); - _node_num_ids_nocpy=isNoCopy; } std::string MEDMeshMultiLev::getPflNameOfId(int id) const @@ -466,28 +487,28 @@ DataArray *MEDMeshMultiLev::constructDataArray(const MEDFileField1TSStructItem& std::string pflName(p.getPflName()); const DataArrayInt *nr(_node_reduction); if(pflName.empty() && !nr) - return vals->deepCpy(); + return vals->deepCopy(); if(pflName.empty() && nr) throw INTERP_KERNEL::Exception("MEDMeshMultiLev::constructDataArray : unexpected situation for nodes 2 !"); if(!pflName.empty() && nr) { - MEDCouplingAutoRefCountObjectPtr p1(globs->getProfile(pflName.c_str())->deepCpy()); - MEDCouplingAutoRefCountObjectPtr p2(nr->deepCpy()); + MCAuto p1(globs->getProfile(pflName.c_str())->deepCopy()); + MCAuto p2(nr->deepCopy()); p1->sort(true); p2->sort(true); if(!p1->isEqualWithoutConsideringStr(*p2)) throw INTERP_KERNEL::Exception("MEDMeshMultiLev::constructDataArray : it appears that a profile on nodes does not cover the cells correctly !"); p1=DataArrayInt::FindPermutationFromFirstToSecond(globs->getProfile(pflName.c_str()),nr); - MEDCouplingAutoRefCountObjectPtr ret(vals->deepCpy()); + MCAuto ret(vals->deepCopy()); ret->renumberInPlace(p1->begin()); return ret.retn(); } if(!pflName.empty() && !nr) { - MEDCouplingAutoRefCountObjectPtr p1(globs->getProfile(pflName.c_str())->deepCpy()); + MCAuto p1(globs->getProfile(pflName.c_str())->deepCopy()); p1->sort(true); - if(!p1->isIdentity() || p1->getNumberOfTuples()!=getNumberOfNodes()) + if(!p1->isIota(getNumberOfNodes())) throw INTERP_KERNEL::Exception("MEDMeshMultiLev::constructDataArray : unexpected situation for nodes 4 !"); - MEDCouplingAutoRefCountObjectPtr ret(vals->deepCpy()); + MCAuto ret(vals->deepCopy()); ret->renumberInPlace(globs->getProfile(pflName.c_str())->begin()); return ret.retn(); } @@ -500,7 +521,7 @@ DataArray *MEDMeshMultiLev::constructDataArray(const MEDFileField1TSStructItem& if(s.size()!=_geo_types.size()) throw INTERP_KERNEL::Exception("MEDMeshMultiLev::constructDataArray : unexpected situation for cells 2 !"); std::vector< const DataArray *> arr(s.size()); - std::vector< MEDCouplingAutoRefCountObjectPtr > arrSafe(s.size()); + std::vector< MCAuto > arrSafe(s.size()); int iii(0); int nc(vals->getNumberOfComponents()); std::vector compInfo(vals->getInfoOnComponents()); @@ -521,7 +542,7 @@ DataArray *MEDMeshMultiLev::constructDataArray(const MEDFileField1TSStructItem& int nbi(ps[0]->getNbOfIntegrationPts(globs)); const DataArrayInt *otherP(ps[0]->getPfl(globs)); const std::pair& strtStop(ps[0]->getStartStop()); - MEDCouplingAutoRefCountObjectPtr ret(vals->selectByTupleId2(strtStop.first,strtStop.second,1)); + MCAuto ret(vals->selectByTupleIdSafeSlice(strtStop.first,strtStop.second,1)); if(!thisP && !otherP) { arrSafe[iii]=ret; arr[iii]=ret; @@ -529,10 +550,10 @@ DataArray *MEDMeshMultiLev::constructDataArray(const MEDFileField1TSStructItem& } if(thisP && otherP) { - MEDCouplingAutoRefCountObjectPtr p1(otherP->invertArrayN2O2O2N(getNumberOfCells(ps[0]->getGeo()))); - MEDCouplingAutoRefCountObjectPtr p2(thisP->deepCpy()); + MCAuto p1(otherP->invertArrayN2O2O2N(getNumberOfCells(ps[0]->getGeo()))); + MCAuto p2(thisP->deepCopy()); p2->transformWithIndArr(p1->begin(),p1->end()); - //p1=p2->getIdsNotEqual(-1); + //p1=p2->findIdsNotEqual(-1); //p1=p2->selectByTupleIdSafe(p1->begin(),p1->end()); ret->rearrange(nbi*nc); ret=ret->selectByTupleIdSafe(p2->begin(),p2->end()); ret->rearrange(nc); ret->setInfoOnComponents(compInfo); arrSafe[iii]=ret; arr[iii]=ret; @@ -540,7 +561,7 @@ DataArray *MEDMeshMultiLev::constructDataArray(const MEDFileField1TSStructItem& } if(!thisP && otherP) { - MEDCouplingAutoRefCountObjectPtr p1(otherP->deepCpy()); + MCAuto p1(otherP->deepCopy()); p1->sort(true); p1->checkAllIdsInRange(0,getNumberOfCells(ps[0]->getGeo())); p1=DataArrayInt::FindPermutationFromFirstToSecond(otherP,p1); @@ -554,45 +575,45 @@ DataArray *MEDMeshMultiLev::constructDataArray(const MEDFileField1TSStructItem& { std::vector< const DataArrayInt * >otherPS(ps.size()); std::vector< const DataArray * > arr2(ps.size()); - std::vector< MEDCouplingAutoRefCountObjectPtr > arr2Safe(ps.size()); + std::vector< MCAuto > arr2Safe(ps.size()); std::vector< const DataArrayInt * > nbis(ps.size()); - std::vector< MEDCouplingAutoRefCountObjectPtr > nbisSafe(ps.size()); + std::vector< MCAuto > nbisSafe(ps.size()); int jj(0); for(std::vector::const_iterator it2=ps.begin();it2!=ps.end();it2++,jj++) { int nbi((*it2)->getNbOfIntegrationPts(globs)); const DataArrayInt *otherPfl((*it2)->getPfl(globs)); const std::pair& strtStop((*it2)->getStartStop()); - MEDCouplingAutoRefCountObjectPtr ret2(vals->selectByTupleId2(strtStop.first,strtStop.second,1)); + MCAuto ret2(vals->selectByTupleIdSafeSlice(strtStop.first,strtStop.second,1)); if(!otherPfl) throw INTERP_KERNEL::Exception("MEDMeshMultiLev::constructDataArray : unexpected situation for cells 4 !"); arr2[jj]=ret2; arr2Safe[jj]=ret2; otherPS[jj]=otherPfl; nbisSafe[jj]=DataArrayInt::New(); nbisSafe[jj]->alloc(otherPfl->getNumberOfTuples(),1); nbisSafe[jj]->fillWithValue(nbi); nbis[jj]=nbisSafe[jj]; } - MEDCouplingAutoRefCountObjectPtr arr3(DataArray::Aggregate(arr2)); - MEDCouplingAutoRefCountObjectPtr otherP(DataArrayInt::Aggregate(otherPS)); - MEDCouplingAutoRefCountObjectPtr zenbis(DataArrayInt::Aggregate(nbis)); - MEDCouplingAutoRefCountObjectPtr otherPN(otherP->invertArrayN2O2O2N(getNumberOfCells(*it))); - MEDCouplingAutoRefCountObjectPtr p1; + MCAuto arr3(DataArray::Aggregate(arr2)); + MCAuto otherP(DataArrayInt::Aggregate(otherPS)); + MCAuto zenbis(DataArrayInt::Aggregate(nbis)); + MCAuto otherPN(otherP->invertArrayN2O2O2N(getNumberOfCells(*it))); + MCAuto p1; if(thisP) p1=DataArrayInt::FindPermutationFromFirstToSecond(otherP,thisP); else - p1=otherP->deepCpy(); - MEDCouplingAutoRefCountObjectPtr zenbisN(zenbis->renumber(p1->begin())); - zenbisN->computeOffsets2(); + p1=otherP->deepCopy(); + MCAuto zenbisN(zenbis->renumber(p1->begin())); + zenbisN->computeOffsetsFull(); jj=0; for(std::vector::const_iterator it2=ps.begin();it2!=ps.end();it2++,jj++) { //int nbi((*it2)->getNbOfIntegrationPts(globs)); const DataArrayInt *otherPfl((*it2)->getPfl(globs)); const std::pair& strtStop((*it2)->getStartStop()); - MEDCouplingAutoRefCountObjectPtr ret2(vals->selectByTupleId2(strtStop.first,strtStop.second,1)); + MCAuto ret2(vals->selectByTupleIdSafeSlice(strtStop.first,strtStop.second,1)); // - MEDCouplingAutoRefCountObjectPtr p2(otherPfl->deepCpy()); + MCAuto p2(otherPfl->deepCopy()); p2->transformWithIndArr(otherPN->begin(),otherPN->end()); p2->transformWithIndArr(p1->begin(),p1->end()); - MEDCouplingAutoRefCountObjectPtr idsN(p2->buildExplicitArrByRanges(zenbisN)); + MCAuto idsN(p2->buildExplicitArrByRanges(zenbisN)); arr3->setPartOfValuesBase3(ret2,idsN->begin(),idsN->end(),0,nc,1); } arrSafe[iii]=arr3; arr[iii]=arr3; @@ -618,7 +639,7 @@ void MEDMeshMultiLev::appendVertices(const DataArrayInt *verticesToAdd, DataArra const DataArrayInt *cf(_cell_fam_ids),*cn(_cell_num_ids),*nf(_node_fam_ids),*nn(_node_num_ids); if(cf) { - MEDCouplingAutoRefCountObjectPtr tmp; + MCAuto tmp; std::vector a(2); a[0]=cf; if(nf) @@ -629,11 +650,10 @@ void MEDMeshMultiLev::appendVertices(const DataArrayInt *verticesToAdd, DataArra } a[1]=tmp; _cell_fam_ids=DataArrayInt::Aggregate(a); - _cell_fam_ids_nocpy=false; } if(cn) { - MEDCouplingAutoRefCountObjectPtr tmp; + MCAuto tmp; std::vector a(2); a[0]=cn; if(nn) @@ -644,15 +664,14 @@ void MEDMeshMultiLev::appendVertices(const DataArrayInt *verticesToAdd, DataArra } a[1]=tmp; _cell_num_ids=DataArrayInt::Aggregate(a); - _cell_num_ids_nocpy=false; } } -MEDMeshMultiLev::MEDMeshMultiLev(const MEDFileMesh *mesh):_mesh(mesh),_nb_nodes(0),_cell_fam_ids_nocpy(false) +MEDMeshMultiLev::MEDMeshMultiLev(const MEDFileMesh *mesh):_mesh(mesh),_nb_nodes(0) { } -MEDMeshMultiLev::MEDMeshMultiLev(const MEDFileMesh *mesh, int nbNodes, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities):_mesh(mesh),_geo_types(gts),_nb_entities(nbEntities),_nb_nodes(nbNodes),_cell_fam_ids_nocpy(false),_cell_num_ids_nocpy(false),_node_fam_ids_nocpy(false),_node_num_ids_nocpy(false) +MEDMeshMultiLev::MEDMeshMultiLev(const MEDFileMesh *mesh, int nbNodes, const std::vector& gts, const std::vector& pfls, const std::vector& nbEntities):_mesh(mesh),_geo_types(gts),_nb_entities(nbEntities),_nb_nodes(nbNodes) { std::size_t sz(_geo_types.size()); if(sz!=pfls.size() || sz!=nbEntities.size()) @@ -666,7 +685,7 @@ MEDMeshMultiLev::MEDMeshMultiLev(const MEDFileMesh *mesh, int nbNodes, const std } } -MEDMeshMultiLev::MEDMeshMultiLev(const MEDMeshMultiLev& other):RefCountObject(other),_mesh(other._mesh),_pfls(other._pfls),_geo_types(other._geo_types),_nb_entities(other._nb_entities),_node_reduction(other._node_reduction),_nb_nodes(other._nb_nodes),_cell_fam_ids(other._cell_fam_ids),_cell_fam_ids_nocpy(other._cell_fam_ids_nocpy),_cell_num_ids(other._cell_num_ids),_cell_num_ids_nocpy(other._cell_num_ids_nocpy),_node_fam_ids(other._node_fam_ids),_node_fam_ids_nocpy(other._node_fam_ids_nocpy),_node_num_ids(other._node_num_ids),_node_num_ids_nocpy(other._node_num_ids_nocpy) +MEDMeshMultiLev::MEDMeshMultiLev(const MEDMeshMultiLev& other):RefCountObject(other),_mesh(other._mesh),_pfls(other._pfls),_geo_types(other._geo_types),_nb_entities(other._nb_entities),_node_reduction(other._node_reduction),_nb_nodes(other._nb_nodes),_cell_fam_ids(other._cell_fam_ids),_cell_num_ids(other._cell_num_ids),_node_fam_ids(other._node_fam_ids),_node_num_ids(other._node_num_ids) { } @@ -708,8 +727,8 @@ MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector _nb_entities[i]=obj->getNumberOfCells(); } // ids fields management - _cell_fam_ids_nocpy=(levs.size()==1); - if(_cell_fam_ids_nocpy) + bool cellFamIdsNoCpy(levs.size()==1); + if(cellFamIdsNoCpy) { const DataArrayInt *tmp(m->getFamilyFieldAtLevel(levs[0])); if(tmp) @@ -731,8 +750,8 @@ MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector if(f && !tmps.empty()) _cell_fam_ids=DataArrayInt::Aggregate(tmps); } - _cell_num_ids_nocpy=(levs.size()==1); - if(_cell_num_ids_nocpy) + bool cellNumIdsNoCpy(levs.size()==1); + if(cellNumIdsNoCpy) { const DataArrayInt *tmp(m->getNumberFieldAtLevel(levs[0])); if(tmp) @@ -755,7 +774,6 @@ MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector _cell_num_ids=DataArrayInt::Aggregate(tmps); } // node part - _node_fam_ids_nocpy=true; { const DataArrayInt *tmp(m->getFamilyFieldAtLevel(1)); if(tmp) @@ -764,7 +782,6 @@ MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector _node_fam_ids=(const_cast(tmp)); } } - _node_num_ids_nocpy=true; { const DataArrayInt *tmp(m->getNumberFieldAtLevel(1)); if(tmp) @@ -803,27 +820,22 @@ MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vectorgetMeshDimension()); if(isSameDim && isNoPfl && m->getGeoTypesAtLevel(lev)==gts)//optimized part { - _cell_fam_ids_nocpy=true; const DataArrayInt *famIds(m->getFamilyFieldAtLevel(lev)); if(famIds) { _cell_fam_ids=const_cast(famIds); famIds->incrRef(); } - _cell_num_ids_nocpy=true; const DataArrayInt *numIds(m->getNumberFieldAtLevel(lev)); if(numIds) { _cell_num_ids=const_cast(numIds); numIds->incrRef(); } - _node_fam_ids_nocpy=true; famIds=m->getFamilyFieldAtLevel(1); if(famIds) { _node_fam_ids=const_cast(famIds); famIds->incrRef(); } - _node_num_ids_nocpy=true; numIds=m->getNumberFieldAtLevel(1); if(numIds) { _node_num_ids=const_cast(numIds); numIds->incrRef(); } return ; } // - _cell_fam_ids_nocpy=false; - std::vector< MEDCouplingAutoRefCountObjectPtr > famIdsSafe(sz); + std::vector< MCAuto > famIdsSafe(sz); std::vector famIds(sz); bool f(true); for(std::size_t i=0;i > numIdsSafe(sz); + std::vector< MCAuto > numIdsSafe(sz); std::vector numIds(sz); bool n(true); for(std::size_t i=0;igetFamilyFieldAtLevel(1)); if(nodeFamIds) { _node_fam_ids=const_cast(nodeFamIds); nodeFamIds->incrRef(); } - _node_num_ids_nocpy=true; const DataArrayInt *nodeNumIds(m->getNumberFieldAtLevel(1)); if(nodeNumIds) { _node_num_ids=const_cast(nodeNumIds); nodeNumIds->incrRef(); } @@ -864,20 +873,20 @@ void MEDUMeshMultiLev::selectPartOfNodes(const DataArrayInt *pflNodes) if(!pflNodes || !pflNodes->isAllocated()) return ; std::size_t sz(_parts.size()); - std::vector< MEDCouplingAutoRefCountObjectPtr > a(sz); + std::vector< MCAuto > a(sz); std::vector< const DataArrayInt *> aa(sz); for(std::size_t i=0;i m(_parts[i]); + MCAuto m(_parts[i]); if(pfl) m=dynamic_cast(_parts[i]->buildPartOfMySelfKeepCoords(pfl->begin(),pfl->end())); DataArrayInt *cellIds=0; m->fillCellIdsToKeepFromNodeIds(pflNodes->begin(),pflNodes->end(),true,cellIds); - MEDCouplingAutoRefCountObjectPtr cellIdsSafe(cellIds); - MEDCouplingAutoRefCountObjectPtr m2(m->buildPartOfMySelfKeepCoords(cellIds->begin(),cellIds->end())); + MCAuto cellIdsSafe(cellIds); + MCAuto m2(m->buildPartOfMySelfKeepCoords(cellIds->begin(),cellIds->end())); int tmp=-1; - MEDCouplingAutoRefCountObjectPtr o2n(m2->getNodeIdsInUse(tmp)); + MCAuto o2n(m2->getNodeIdsInUse(tmp)); a[i]=o2n->invertArrayO2N2N2O(tmp); aa[i]=a[i]; if(pfl) _pfls[i]=pfl->selectByTupleIdSafe(cellIds->begin(),cellIds->end()); @@ -887,7 +896,7 @@ void MEDUMeshMultiLev::selectPartOfNodes(const DataArrayInt *pflNodes) if(!aa.empty()) _node_reduction=DataArrayInt::Aggregate(aa);//general case else - _node_reduction=pflNodes->deepCpy();//case where no cells in read mesh. + _node_reduction=pflNodes->deepCopy();//case where no cells in read mesh. _node_reduction->sort(true); _node_reduction=_node_reduction->buildUnique(); if(_node_reduction->getNumberOfTuples()==pflNodes->getNumberOfTuples()) @@ -895,9 +904,9 @@ void MEDUMeshMultiLev::selectPartOfNodes(const DataArrayInt *pflNodes) if(_node_reduction->getNumberOfTuples()>pflNodes->getNumberOfTuples()) throw INTERP_KERNEL::Exception("MEDUMeshMultiLev::selectPartOfNodes : internal error in MEDCoupling during cell select from a list of nodes !"); // Here the cells available in _parts is not enough to cover all the nodes in pflNodes. So adding vertices cells in _parts... - MEDCouplingAutoRefCountObjectPtr pflNodes2(pflNodes->deepCpy()); + MCAuto pflNodes2(pflNodes->deepCopy()); pflNodes2->sort(true); - MEDCouplingAutoRefCountObjectPtr diff(pflNodes2->buildSubstractionOptimized(_node_reduction)); + MCAuto diff(pflNodes2->buildSubstractionOptimized(_node_reduction)); appendVertices(diff,pflNodes2); } @@ -910,7 +919,7 @@ MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDUMeshMultiLev& other):MEDMeshMultiLe { } -MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDStructuredMeshMultiLev& other, const MEDCouplingAutoRefCountObjectPtr& part):MEDMeshMultiLev(other) +MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDStructuredMeshMultiLev& other, const MCAuto& part):MEDMeshMultiLev(other) { _parts.resize(1); _parts[0]=part; @@ -933,18 +942,18 @@ bool MEDUMeshMultiLev::buildVTUArrays(DataArrayDouble *& coords, DataArrayByte * tmp=_parts[0]->getCoords(); if(!tmp) throw INTERP_KERNEL::Exception("MEDUMeshMultiLev::getVTUArrays : the coordinates are null !"); - MEDCouplingAutoRefCountObjectPtr a(const_cast(tmp)); tmp->incrRef(); + MCAuto a(const_cast(tmp)); tmp->incrRef(); int szBCE(0),szD(0),szF(0); bool isPolyh(false); int iii(0); - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_parts.begin();it!=_parts.end();it++,iii++) + for(std::vector< MCAuto >::const_iterator it=_parts.begin();it!=_parts.end();it++,iii++) { const MEDCoupling1GTUMesh *cur(*it); if(!cur) throw INTERP_KERNEL::Exception("MEDUMeshMultiLev::getVTUArrays : a part is null !"); // const DataArrayInt *pfl(_pfls[iii]); - MEDCouplingAutoRefCountObjectPtr cur2; + MCAuto cur2; if(!pfl) { cur2=const_cast(cur); cur2->incrRef(); } else @@ -957,25 +966,25 @@ bool MEDUMeshMultiLev::buildVTUArrays(DataArrayDouble *& coords, DataArrayByte * else { isPolyh=true; - MEDCouplingAutoRefCountObjectPtr tmp2(cur->computeEffectiveNbOfNodesPerCell()); + MCAuto tmp2(cur->computeEffectiveNbOfNodesPerCell()); szD+=tmp2->accumulate(0)+curNbCells; szF+=2*curNbCells+cur->getNodalConnectivity()->getNumberOfTuples(); } } - MEDCouplingAutoRefCountObjectPtr b(DataArrayByte::New()); b->alloc(szBCE,1); char *bPtr(b->getPointer()); - MEDCouplingAutoRefCountObjectPtr c(DataArrayInt::New()); c->alloc(szBCE,1); int *cPtr(c->getPointer()); - MEDCouplingAutoRefCountObjectPtr d(DataArrayInt::New()); d->alloc(szD,1); int *dPtr(d->getPointer()); - MEDCouplingAutoRefCountObjectPtr e(DataArrayInt::New()),f(DataArrayInt::New()); int *ePtr(0),*fPtr(0); + MCAuto b(DataArrayByte::New()); b->alloc(szBCE,1); char *bPtr(b->getPointer()); + MCAuto c(DataArrayInt::New()); c->alloc(szBCE,1); int *cPtr(c->getPointer()); + MCAuto d(DataArrayInt::New()); d->alloc(szD,1); int *dPtr(d->getPointer()); + MCAuto e(DataArrayInt::New()),f(DataArrayInt::New()); int *ePtr(0),*fPtr(0); if(isPolyh) { e->alloc(szBCE,1); ePtr=e->getPointer(); f->alloc(szF,1); fPtr=f->getPointer(); } int k(0); iii=0; - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_parts.begin();it!=_parts.end();it++,iii++) + for(std::vector< MCAuto >::const_iterator it=_parts.begin();it!=_parts.end();it++,iii++) { const MEDCoupling1GTUMesh *cur(*it); // const DataArrayInt *pfl(_pfls[iii]); - MEDCouplingAutoRefCountObjectPtr cur2; + MCAuto cur2; if(!pfl) { cur2=const_cast(cur); cur2->incrRef(); } else @@ -1081,7 +1090,7 @@ bool MEDUMeshMultiLev::buildVTUArrays(DataArrayDouble *& coords, DataArrayByte * return _mesh->isObjectInTheProgeny(coords); } -void MEDUMeshMultiLev::reorderNodesIfNecessary(MEDCouplingAutoRefCountObjectPtr& coords, DataArrayInt *nodalConnVTK, DataArrayInt *polyhedNodalConnVTK) const +void MEDUMeshMultiLev::reorderNodesIfNecessary(MCAuto& coords, DataArrayInt *nodalConnVTK, DataArrayInt *polyhedNodalConnVTK) const { const DataArrayInt *nr(_node_reduction); if(!nr) @@ -1128,14 +1137,14 @@ void MEDUMeshMultiLev::reorderNodesIfNecessary(MEDCouplingAutoRefCountObjectPtr< if(szExp!=nr->getNumberOfTuples()) throw INTERP_KERNEL::Exception("MEDUMeshMultiLev::reorderNodesIfNecessary : internal error #3 !"); // Go renumbering ! - MEDCouplingAutoRefCountObjectPtr o2n(DataArrayInt::New()); o2n->alloc(sz,1); + MCAuto o2n(DataArrayInt::New()); o2n->alloc(sz,1); int *o2nPtr(o2n->getPointer()); int newId(0); for(int i=0;ibegin()); - MEDCouplingAutoRefCountObjectPtr n2o(o2n->invertArrayO2N2N2O(nr->getNumberOfTuples())); - MEDCouplingAutoRefCountObjectPtr perm(DataArrayInt::FindPermutationFromFirstToSecond(n2o,nr)); + MCAuto n2o(o2n->invertArrayO2N2N2O(nr->getNumberOfTuples())); + MCAuto perm(DataArrayInt::FindPermutationFromFirstToSecond(n2o,nr)); const int *permPtr(perm->begin()); int *work2(nodalConnVTK->getPointer()),*endW2(nodalConnVTK->getPointer()+nodalConnVTK->getNumberOfTuples()); while(work2!=endW2) @@ -1166,7 +1175,7 @@ void MEDUMeshMultiLev::appendVertices(const DataArrayInt *verticesToAdd, DataArr { int nbOfCells(verticesToAdd->getNumberOfTuples());//it is not a bug cells are NORM_POINT1 MEDMeshMultiLev::appendVertices(verticesToAdd,nr); - MEDCouplingAutoRefCountObjectPtr elt(MEDCoupling1SGTUMesh::New("",INTERP_KERNEL::NORM_POINT1)); + MCAuto elt(MEDCoupling1SGTUMesh::New("",INTERP_KERNEL::NORM_POINT1)); elt->allocateCells(nbOfCells); for(int i=0;isetCoords(_parts[0]->getCoords()); - MEDCouplingAutoRefCountObjectPtr elt2((MEDCoupling1SGTUMesh *)elt); elt2->incrRef(); + MCAuto elt2((MEDCoupling1SGTUMesh *)elt); elt2->incrRef(); _parts.push_back(elt2); } @@ -1192,14 +1201,13 @@ MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDFileStructuredMesh initStdFieldOfIntegers(m); } -MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDStructuredMeshMultiLev& other):MEDMeshMultiLev(other),_is_internal(true),_face_fam_ids(other._face_fam_ids),_face_fam_ids_nocpy(other._face_fam_ids_nocpy),_face_num_ids(other._face_num_ids),_face_num_ids_nocpy(other._face_num_ids_nocpy) +MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDStructuredMeshMultiLev& other):MEDMeshMultiLev(other),_is_internal(true),_face_fam_ids(other._face_fam_ids),_face_num_ids(other._face_num_ids) { } void MEDStructuredMeshMultiLev::initStdFieldOfIntegers(const MEDFileStructuredMesh *m) { // ids fields management - _cell_fam_ids_nocpy=true; _cell_num_ids_nocpy=true; const DataArrayInt *tmp(0); tmp=m->getFamilyFieldAtLevel(0); if(tmp) @@ -1214,7 +1222,6 @@ void MEDStructuredMeshMultiLev::initStdFieldOfIntegers(const MEDFileStructuredMe _cell_num_ids=const_cast(tmp); } // - _node_fam_ids_nocpy=true; _node_num_ids_nocpy=true; tmp=0; tmp=m->getFamilyFieldAtLevel(1); if(tmp) @@ -1229,7 +1236,6 @@ void MEDStructuredMeshMultiLev::initStdFieldOfIntegers(const MEDFileStructuredMe _node_num_ids=const_cast(tmp); } // faces (if any) - _face_fam_ids_nocpy=true; _face_num_ids_nocpy=true; tmp=m->getFamilyFieldAtLevel(-1); if(tmp) { @@ -1246,8 +1252,6 @@ void MEDStructuredMeshMultiLev::initStdFieldOfIntegers(const MEDFileStructuredMe void MEDStructuredMeshMultiLev::moveFaceToCell() const { - const_cast(this)->_cell_fam_ids_nocpy=_face_fam_ids_nocpy; - const_cast(this)->_cell_num_ids_nocpy=_face_num_ids_nocpy; const_cast(this)->_cell_fam_ids=_face_fam_ids; const_cast(this)->_face_fam_ids=0; const_cast(this)->_cell_num_ids=_face_num_ids; const_cast(this)->_face_num_ids=0; } @@ -1268,9 +1272,9 @@ bool MEDStructuredMeshMultiLev::prepareForImplicitUnstructuredMeshCase(MEDMeshMu const DataArrayInt *pfl(0),*nr(_node_reduction); if(!_pfls.empty()) pfl=_pfls[0]; - MEDCouplingAutoRefCountObjectPtr facesIfPresent2(facesIfPresent); facesIfPresent->incrRef(); + MCAuto facesIfPresent2(facesIfPresent); facesIfPresent->incrRef(); moveFaceToCell(); - MEDCouplingAutoRefCountObjectPtr ret2(new MEDUMeshMultiLev(*this,facesIfPresent2)); + MCAuto ret2(new MEDUMeshMultiLev(*this,facesIfPresent2)); if(pfl) ret2->setCellReduction(pfl); if(nr) @@ -1281,7 +1285,6 @@ bool MEDStructuredMeshMultiLev::prepareForImplicitUnstructuredMeshCase(MEDMeshMu void MEDStructuredMeshMultiLev::dealWithImplicitUnstructuredMesh(const MEDFileMesh *m) { - _cell_fam_ids_nocpy=true; _cell_num_ids_nocpy=true; const DataArrayInt *tmp(0); tmp=m->getFamilyFieldAtLevel(-1); if(tmp) @@ -1302,8 +1305,8 @@ void MEDStructuredMeshMultiLev::selectPartOfNodes(const DataArrayInt *pflNodes) if(!pflNodes || !pflNodes->isAllocated()) return ; std::vector ngs(getNodeGridStructure()); - MEDCouplingAutoRefCountObjectPtr conn(MEDCouplingStructuredMesh::Build1GTNodalConnectivity(&ngs[0],&ngs[0]+ngs.size())); - MEDCouplingAutoRefCountObjectPtr m(MEDCoupling1SGTUMesh::New("",MEDCouplingStructuredMesh::GetGeoTypeGivenMeshDimension(ngs.size()))); + MCAuto conn(MEDCouplingStructuredMesh::Build1GTNodalConnectivity(&ngs[0],&ngs[0]+ngs.size())); + MCAuto m(MEDCoupling1SGTUMesh::New("",MEDCouplingStructuredMesh::GetGeoTypeGivenMeshDimension(ngs.size()))); m->setNodalConnectivity(conn); const DataArrayInt *pfl(_pfls[0]); if(pfl) @@ -1312,8 +1315,8 @@ void MEDStructuredMeshMultiLev::selectPartOfNodes(const DataArrayInt *pflNodes) } DataArrayInt *cellIds=0; m->fillCellIdsToKeepFromNodeIds(pflNodes->begin(),pflNodes->end(),true,cellIds); - MEDCouplingAutoRefCountObjectPtr cellIdsSafe(cellIds); - MEDCouplingAutoRefCountObjectPtr m2(m->buildPartOfMySelfKeepCoords(cellIds->begin(),cellIds->end())); + MCAuto cellIdsSafe(cellIds); + MCAuto m2(m->buildPartOfMySelfKeepCoords(cellIds->begin(),cellIds->end())); int tmp=-1; _node_reduction=m2->getNodeIdsInUse(tmp); if(pfl) @@ -1357,7 +1360,7 @@ MEDCMeshMultiLev::MEDCMeshMultiLev(const MEDFileCMesh *m, const std::vectorgetMeshDimension()); INTERP_KERNEL::NormalizedCellType gt(MEDCouplingStructuredMesh::GetGeoTypeGivenMeshDimension(mdim)); if(gt==gts[0]) @@ -1395,65 +1398,65 @@ MEDMeshMultiLev *MEDCMeshMultiLev::prepare() const const DataArrayInt *pfl(0),*nr(_node_reduction); if(!_pfls.empty()) pfl=_pfls[0]; - MEDCouplingAutoRefCountObjectPtr nnr; + MCAuto nnr; std::vector cgs,ngs(getNodeGridStructure()); cgs.resize(ngs.size()); std::transform(ngs.begin(),ngs.end(),cgs.begin(),std::bind2nd(std::plus(),-1)); if(pfl) { std::vector< std::pair > cellParts; - MEDCouplingAutoRefCountObjectPtr ret2; + MCAuto ret2; if(MEDCouplingStructuredMesh::IsPartStructured(pfl->begin(),pfl->end(),cgs,cellParts)) { - MEDCouplingAutoRefCountObjectPtr ret(new MEDCMeshMultiLev(*this)); + MCAuto ret(new MEDCMeshMultiLev(*this)); ret->_is_internal=false; if(nr) - { nnr=nr->deepCpy(); nnr->sort(true); ret->setNodeReduction(nnr); } + { nnr=nr->deepCopy(); nnr->sort(true); ret->setNodeReduction(nnr); } ret->_nb_entities[0]=pfl->getNumberOfTuples(); ret->_pfls[0]=0; - std::vector< MEDCouplingAutoRefCountObjectPtr > coords(_coords.size()); + std::vector< MCAuto > coords(_coords.size()); for(std::size_t i=0;i<_coords.size();i++) - coords[i]=_coords[i]->selectByTupleId2(cellParts[i].first,cellParts[i].second+1,1); + coords[i]=_coords[i]->selectByTupleIdSafeSlice(cellParts[i].first,cellParts[i].second+1,1); ret->_coords=coords; ret2=(MEDCMeshMultiLev *)ret; ret2->incrRef(); } else { - MEDCouplingAutoRefCountObjectPtr m(MEDCouplingCMesh::New()); + MCAuto m(MEDCouplingCMesh::New()); for(std::size_t i=0;isetCoordsAt(i,_coords[i]); - MEDCouplingAutoRefCountObjectPtr m2(m->build1SGTUnstructured()); - MEDCouplingAutoRefCountObjectPtr m3=dynamic_cast(m2->buildPartOfMySelfKeepCoords(pfl->begin(),pfl->end())); - MEDCouplingAutoRefCountObjectPtr ret(new MEDUMeshMultiLev(*this,m3)); + MCAuto m2(m->build1SGTUnstructured()); + MCAuto m3=dynamic_cast(m2->buildPartOfMySelfKeepCoords(pfl->begin(),pfl->end())); + MCAuto ret(new MEDUMeshMultiLev(*this,m3)); if(nr) - { m3->zipCoords(); nnr=nr->deepCpy(); nnr->sort(true); ret->setNodeReduction(nnr); } + { m3->zipCoords(); nnr=nr->deepCopy(); nnr->sort(true); ret->setNodeReduction(nnr); } ret2=(MEDUMeshMultiLev *)ret; ret2->incrRef(); } const DataArrayInt *famIds(_cell_fam_ids),*numIds(_cell_num_ids); if(famIds) { - MEDCouplingAutoRefCountObjectPtr tmp(famIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); - ret2->setFamilyIdsOnCells(tmp,false); + MCAuto tmp(famIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); + ret2->setFamilyIdsOnCells(tmp); } if(numIds) { - MEDCouplingAutoRefCountObjectPtr tmp(numIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); - ret2->setNumberIdsOnCells(tmp,false); + MCAuto tmp(numIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); + ret2->setNumberIdsOnCells(tmp); } return ret2.retn(); } else { - MEDCouplingAutoRefCountObjectPtr ret(new MEDCMeshMultiLev(*this)); + MCAuto ret(new MEDCMeshMultiLev(*this)); if(nr) - { nnr=nr->deepCpy(); nnr->sort(true); ret->setNodeReduction(nnr); } + { nnr=nr->deepCopy(); nnr->sort(true); ret->setNodeReduction(nnr); } return ret.retn(); } } /*! - * \a param [out] isInternal if true the returned pointers are those in main data structure. If false those pointers have been built espacially for that method. + * \a param [out] isInternal if true the returned pointers are those in main data structure. If false those pointers have been built especially for that method. */ std::vector< DataArrayDouble * > MEDCMeshMultiLev::buildVTUArrays(bool& isInternal) const { @@ -1499,7 +1502,7 @@ MEDCurveLinearMeshMultiLev::MEDCurveLinearMeshMultiLev(const MEDFileCurveLinearM if(!m) throw INTERP_KERNEL::Exception("MEDCurveLinearMeshMultiLev constructor 2 : null input pointer !"); if(gts.size()!=1 || pfls.size()!=1) - throw INTERP_KERNEL::Exception("MEDCurveLinearMeshMultiLev constructor 2 : lengthes of gts and pfls must be equal to one !"); + throw INTERP_KERNEL::Exception("MEDCurveLinearMeshMultiLev constructor 2 : lengths of gts and pfls must be equal to one !"); INTERP_KERNEL::NormalizedCellType gt(MEDCouplingStructuredMesh::GetGeoTypeGivenMeshDimension(m->getMeshDimension())); if(gt==gts[0]) { @@ -1531,14 +1534,14 @@ MEDMeshMultiLev *MEDCurveLinearMeshMultiLev::prepare() const const DataArrayInt *pfl(0),*nr(_node_reduction); if(!_pfls.empty()) pfl=_pfls[0]; - MEDCouplingAutoRefCountObjectPtr nnr; + MCAuto nnr; std::vector cgs,ngs(getNodeGridStructure()); cgs.resize(ngs.size()); std::transform(ngs.begin(),ngs.end(),cgs.begin(),std::bind2nd(std::plus(),-1)); if(pfl) { std::vector< std::pair > cellParts,nodeParts; - MEDCouplingAutoRefCountObjectPtr ret2; + MCAuto ret2; if(MEDCouplingStructuredMesh::IsPartStructured(pfl->begin(),pfl->end(),cgs,cellParts)) { nodeParts=cellParts; @@ -1548,11 +1551,11 @@ MEDMeshMultiLev *MEDCurveLinearMeshMultiLev::prepare() const nodeParts[i].second++; st[i]=nodeParts[i].second-nodeParts[i].first; } - MEDCouplingAutoRefCountObjectPtr p(MEDCouplingStructuredMesh::BuildExplicitIdsFrom(ngs,nodeParts)); - MEDCouplingAutoRefCountObjectPtr ret(new MEDCurveLinearMeshMultiLev(*this)); + MCAuto p(MEDCouplingStructuredMesh::BuildExplicitIdsFrom(ngs,nodeParts)); + MCAuto ret(new MEDCurveLinearMeshMultiLev(*this)); ret->_is_internal=false; if(nr) - { nnr=nr->deepCpy(); nnr->sort(true); ret->setNodeReduction(nnr); } + { nnr=nr->deepCopy(); nnr->sort(true); ret->setNodeReduction(nnr); } ret->_nb_entities[0]=pfl->getNumberOfTuples(); ret->_pfls[0]=0; ret->_coords=_coords->selectByTupleIdSafe(p->begin(),p->end()); @@ -1561,33 +1564,33 @@ MEDMeshMultiLev *MEDCurveLinearMeshMultiLev::prepare() const } else { - MEDCouplingAutoRefCountObjectPtr m(MEDCouplingCurveLinearMesh::New()); + MCAuto m(MEDCouplingCurveLinearMesh::New()); m->setCoords(_coords); m->setNodeGridStructure(&_structure[0],&_structure[0]+_structure.size()); - MEDCouplingAutoRefCountObjectPtr m2(m->build1SGTUnstructured()); - MEDCouplingAutoRefCountObjectPtr m3=dynamic_cast(m2->buildPartOfMySelfKeepCoords(pfl->begin(),pfl->end())); - MEDCouplingAutoRefCountObjectPtr ret(new MEDUMeshMultiLev(*this,m3)); + MCAuto m2(m->build1SGTUnstructured()); + MCAuto m3=dynamic_cast(m2->buildPartOfMySelfKeepCoords(pfl->begin(),pfl->end())); + MCAuto ret(new MEDUMeshMultiLev(*this,m3)); if(nr) - { m3->zipCoords(); nnr=nr->deepCpy(); nnr->sort(true); ret->setNodeReduction(nnr); } + { m3->zipCoords(); nnr=nr->deepCopy(); nnr->sort(true); ret->setNodeReduction(nnr); } ret2=(MEDUMeshMultiLev *)ret; ret2->incrRef(); } const DataArrayInt *famIds(_cell_fam_ids),*numIds(_cell_num_ids); if(famIds) { - MEDCouplingAutoRefCountObjectPtr tmp(famIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); - ret2->setFamilyIdsOnCells(tmp,false); + MCAuto tmp(famIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); + ret2->setFamilyIdsOnCells(tmp); } if(numIds) { - MEDCouplingAutoRefCountObjectPtr tmp(numIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); - ret2->setNumberIdsOnCells(tmp,false); + MCAuto tmp(numIds->selectByTupleIdSafe(pfl->begin(),pfl->end())); + ret2->setNumberIdsOnCells(tmp); } return ret2.retn(); } else { - MEDCouplingAutoRefCountObjectPtr ret(new MEDCurveLinearMeshMultiLev(*this)); + MCAuto ret(new MEDCurveLinearMeshMultiLev(*this)); if(nr) - { nnr=nr->deepCpy(); nnr->sort(true); ret->setNodeReduction(nnr); } + { nnr=nr->deepCopy(); nnr->sort(true); ret->setNodeReduction(nnr); } return ret.retn(); } } @@ -1677,7 +1680,7 @@ const DataArrayInt *MEDFileField1TSStructItem2::getPfl(const MEDFileFieldGlobsRe } /*! - * \param [in] nbOfEntity - number of entity that can be either cells or nodes. Not other possiblity. + * \param [in] nbOfEntity - number of entity that can be either cells or nodes. Not other possibility. * \param [in] nip - number of integration points. 1 for ON_CELLS and NO_NODES */ void MEDFileField1TSStructItem2::checkInRange(int nbOfEntity, int nip, const MEDFileFieldGlobsReal *globs) @@ -1686,7 +1689,7 @@ void MEDFileField1TSStructItem2::checkInRange(int nbOfEntity, int nip, const MED if(_pfl->getName().empty()) { if(nbOfEntity!=(_start_end.second-_start_end.first)/nip) - throw INTERP_KERNEL::Exception("MEDFileField1TSStructItem2::checkInRange : Mismatch between number of entities and size of node field !"); + throw INTERP_KERNEL::Exception("MEDFileField1TSStructItem2::checkInRange : Mismatch between number of entities and size of field !"); return ; } else @@ -1762,13 +1765,13 @@ MEDFileField1TSStructItem2 MEDFileField1TSStructItem2::BuildAggregationOf(const throw INTERP_KERNEL::Exception("MEDFileField1TSStructItem2::BuildAggregationOf : invalid situation ! Several same geo type chunk must all lie on profiles !"); arrs[i]=globs->getProfile(obj->_pfl->getName().c_str()); } - MEDCouplingAutoRefCountObjectPtr arr(DataArrayInt::Aggregate(arrs)); + MCAuto arr(DataArrayInt::Aggregate(arrs)); arr->sort(); int oldNbTuples(arr->getNumberOfTuples()); arr=arr->buildUnique(); if(oldNbTuples!=arr->getNumberOfTuples()) throw INTERP_KERNEL::Exception("MEDFileField1TSStructItem2::BuildAggregationOf : some entities are present several times !"); - if(arr->isIdentity() && oldNbTuples==nbEntityRef) + if(arr->isIota(nbEntityRef)) { std::pair p(0,nbEntityRef); std::string a,b; @@ -1794,12 +1797,10 @@ std::size_t MEDFileField1TSStructItem2::getHeapMemorySizeWithoutChildren() const return ret; } -std::vector MEDFileField1TSStructItem2::getDirectChildren() const +std::vector MEDFileField1TSStructItem2::getDirectChildrenWithNull() const { std::vector ret; - const DataArrayInt *pfl(_pfl); - if(pfl) - ret.push_back(pfl); + ret.push_back((const DataArrayInt *)_pfl); return ret; } @@ -1944,19 +1945,24 @@ bool MEDFileField1TSStructItem::isCompatibleWithNodesDiscr(const MEDFileField1TS int theFirstLevFull; bool ret0=isFullyOnOneLev(meshSt,theFirstLevFull); const MEDFileField1TSStructItem2& otherNodeIt(other._items[0]); + int nbOfNodes(meshSt->getNumberOfNodes()); if(otherNodeIt.getPflName().empty()) {//on all nodes if(!ret0) return false; - return theFirstLevFull==0; + std::vector nodesFetched(nbOfNodes,false); + meshSt->getTheMesh()->whichAreNodesFetched(*this,globs,nodesFetched); + if(std::find(nodesFetched.begin(),nodesFetched.end(),false)==nodesFetched.end()) + return theFirstLevFull==0; + else + return false; } else { const DataArrayInt *pfl=globs->getProfile(otherNodeIt.getPflName().c_str()); - MEDCouplingAutoRefCountObjectPtr cpyPfl(pfl->deepCpy()); + MCAuto cpyPfl(pfl->deepCopy()); cpyPfl->sort(); - int nbOfNodes(meshSt->getNumberOfNodes()); - if(cpyPfl->isIdentity() && cpyPfl->getNumberOfTuples()==nbOfNodes) + if(cpyPfl->isIota(nbOfNodes)) {//on all nodes also ! if(!ret0) return false; @@ -2010,7 +2016,7 @@ std::size_t MEDFileField1TSStructItem::getHeapMemorySizeWithoutChildren() const return ret; } -std::vector MEDFileField1TSStructItem::getDirectChildren() const +std::vector MEDFileField1TSStructItem::getDirectChildrenWithNull() const { std::vector ret; for(std::vector< MEDFileField1TSStructItem2 >::const_iterator it=_items.begin();it!=_items.end();it++) @@ -2061,7 +2067,6 @@ std::vector MEDFileField1TSStructItem::getGeo MEDFileField1TSStructItem MEDFileField1TSStructItem::BuildItemFrom(const MEDFileAnyTypeField1TS *ref, const MEDFileMeshStruct *meshSt) { - TypeOfField atype; std::vector< MEDFileField1TSStructItem2 > anItems; // std::vector< std::vector > pfls,locs; @@ -2071,17 +2076,15 @@ MEDFileField1TSStructItem MEDFileField1TSStructItem::BuildItemFrom(const MEDFile std::size_t nbOfGeoTypes(geoTypes.size()); if(nbOfGeoTypes==0) throw INTERP_KERNEL::Exception("MEDFileField1TSStruct : not null by empty ref !"); - bool isFirst=true; + if(typesF[0].empty()) + throw INTERP_KERNEL::Exception("MEDFileField1TSStruct : internal error #1 bis !"); + TypeOfField atype(typesF[0][0]); for(std::size_t i=0;i MEDFileField1TSStruct::getDirectChildren() const +std::vector MEDFileField1TSStruct::getDirectChildrenWithNull() const { std::vector ret; for(std::vector::const_iterator it=_already_checked.begin();it!=_already_checked.end();it++) @@ -2208,7 +2219,7 @@ MEDMeshMultiLev *MEDFileField1TSStruct::buildFromScratchDataSetSupport(const MED int pos0(-1),pos1(-1); if(presenceOfCellDiscr(pos0)) { - MEDCouplingAutoRefCountObjectPtr ret(_already_checked[pos0].buildFromScratchDataSetSupportOnCells(mst,globs)); + MCAuto ret(_already_checked[pos0].buildFromScratchDataSetSupportOnCells(mst,globs)); if(presenceOfPartialNodeDiscr(pos1)) ret->setNodeReduction(_already_checked[pos1][0].getPfl(globs)); return ret.retn(); @@ -2261,7 +2272,7 @@ std::vector MEDFileField1TSStruct::getGeoType /*! * Returns true if presence in \a this of discretization ON_CELLS, ON_GAUSS_PT, ON_GAUSS_NE. - * If true is returned the pos of the easiest is returned. The easiest is the first element in \a this having the less splitted subparts. + * If true is returned the pos of the easiest is returned. The easiest is the first element in \a this having the less split subparts. */ bool MEDFileField1TSStruct::presenceOfCellDiscr(int& pos) const { @@ -2323,30 +2334,35 @@ MEDFileFastCellSupportComparator::MEDFileFastCellSupportComparator(const MEDFile _f1ts_cmps.resize(nbPts); for(int i=0;i elt=ref->getTimeStepAtPos(i); - _f1ts_cmps[i]=MEDFileField1TSStruct::New(elt,_mesh_comp); - _f1ts_cmps[i]->checkWithMeshStruct(_mesh_comp,elt); + MCAuto elt=ref->getTimeStepAtPos(i); + try + { + _f1ts_cmps[i]=MEDFileField1TSStruct::New(elt,_mesh_comp); + _f1ts_cmps[i]->checkWithMeshStruct(_mesh_comp,elt); + } + catch(INTERP_KERNEL::Exception& e) + { + std::ostringstream oss; oss << "Problem in field with name \"" << ref->getName() << "\"" << std::endl; + oss << "More Details : " << e.what(); + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } } } std::size_t MEDFileFastCellSupportComparator::getHeapMemorySizeWithoutChildren() const { - std::size_t ret(_f1ts_cmps.capacity()*sizeof(MEDCouplingAutoRefCountObjectPtr)); + std::size_t ret(_f1ts_cmps.capacity()*sizeof(MCAuto)); return ret; } -std::vector MEDFileFastCellSupportComparator::getDirectChildren() const +std::vector MEDFileFastCellSupportComparator::getDirectChildrenWithNull() const { std::vector ret; const MEDFileMeshStruct *mst(_mesh_comp); if(mst) ret.push_back(mst); - for(std::vector< MEDCouplingAutoRefCountObjectPtr >::const_iterator it=_f1ts_cmps.begin();it!=_f1ts_cmps.end();it++) - { - const MEDFileField1TSStruct *cur(*it); - if(cur) - ret.push_back(cur); - } + for(std::vector< MCAuto >::const_iterator it=_f1ts_cmps.begin();it!=_f1ts_cmps.end();it++) + ret.push_back((const MEDFileField1TSStruct *)*it); return ret; } @@ -2360,7 +2376,7 @@ bool MEDFileFastCellSupportComparator::isEqual(const MEDFileAnyTypeFieldMultiTS } for(int i=0;i elt=other->getTimeStepAtPos(i); + MCAuto elt=other->getTimeStepAtPos(i); if(!_f1ts_cmps[i]->isEqualConsideringThePast(elt,_mesh_comp)) if(!_f1ts_cmps[i]->isSupportSameAs(elt,_mesh_comp)) return false; @@ -2378,7 +2394,7 @@ bool MEDFileFastCellSupportComparator::isCompatibleWithNodesDiscr(const MEDFileA } for(int i=0;i elt=other->getTimeStepAtPos(i); + MCAuto elt=other->getTimeStepAtPos(i); if(!_f1ts_cmps[i]->isCompatibleWithNodesDiscr(elt,_mesh_comp)) return false; }