return ret;
}
-std::vector<const BigMemoryObject *> MEDFileMeshStruct::getDirectChildren() const
+std::vector<const BigMemoryObject *> MEDFileMeshStruct::getDirectChildrenWithNull() const
{
return std::vector<const BigMemoryObject *>();
}
return 0;
}
-std::vector<const BigMemoryObject *> MEDMeshMultiLev::getDirectChildren() const
+std::vector<const BigMemoryObject *> MEDMeshMultiLev::getDirectChildrenWithNull() const
{
return std::vector<const BigMemoryObject *>();
}
_node_reduction=const_cast<DataArrayInt*>(nr);
}
+void MEDMeshMultiLev::setCellReduction(const DataArrayInt *cr)
+{
+ if(_pfls.size()!=1)
+ throw INTERP_KERNEL::Exception("MEDMeshMultiLev::setCellReduction : can be used only for single geo type mesh !");
+ _pfls[0]=const_cast<DataArrayInt*>(cr);
+ if(cr)
+ cr->incrRef();
+}
+
bool MEDMeshMultiLev::isFastlyTheSameStruct(const MEDFileField1TSStructItem& fst, const MEDFileFieldGlobsReal *globs) const
{
if(fst.getType()==ON_NODES)
presenceOfPfls=true;
}
if(!presenceOfPfls)
- { famIds=const_cast<DataArrayInt *>(fids); famIds->incrRef(); isWithoutCopy=_cell_fam_ids_nocpy; return ; }
+ { famIds=const_cast<DataArrayInt *>(fids); famIds->incrRef(); isWithoutCopy=_mesh->isObjectInTheProgeny(famIds); return ; }
//bad luck the slowest part
isWithoutCopy=false;
std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > retSafe(sz);
presenceOfPfls=true;
}
if(!presenceOfPfls)
- { numIds=const_cast<DataArrayInt *>(nids); numIds->incrRef(); isWithoutCopy=_cell_num_ids_nocpy; return ; }
+ { numIds=const_cast<DataArrayInt *>(nids); numIds->incrRef(); isWithoutCopy=_mesh->isObjectInTheProgeny(numIds); return ; }
//bad luck the slowest part
isWithoutCopy=false;
std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > retSafe(sz);
}
else
{
- isWithoutCopy=_node_fam_ids_nocpy;
famIds=const_cast<DataArrayInt *>(fids); famIds->incrRef();
+ isWithoutCopy=_mesh->isObjectInTheProgeny(famIds);
}
}
}
else
{
- isWithoutCopy=_node_num_ids_nocpy;
numIds=const_cast<DataArrayInt *>(fids); numIds->incrRef();
+ isWithoutCopy=_mesh->isObjectInTheProgeny(numIds);
}
}
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
}
a[1]=tmp;
_cell_fam_ids=DataArrayInt::Aggregate(a);
- _cell_fam_ids_nocpy=false;
}
if(cn)
{
}
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<INTERP_KERNEL::NormalizedCellType>& gts, const std::vector<const DataArrayInt *>& pfls, const std::vector<int>& 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<INTERP_KERNEL::NormalizedCellType>& gts, const std::vector<const DataArrayInt *>& pfls, const std::vector<int>& 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())
}
}
-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)
{
}
return new MEDUMeshMultiLev(m,levs);
}
-MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector<int>& levs):MEDMeshMultiLev(m),_is_holding_a_ref_already_held(true)
+MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector<int>& levs):MEDMeshMultiLev(m)
{
if(!m)
throw INTERP_KERNEL::Exception("MEDUMeshMultiLev constructor : null input pointer !");
_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)
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)
_cell_num_ids=DataArrayInt::Aggregate(tmps);
}
// node part
- _node_fam_ids_nocpy=true;
{
const DataArrayInt *tmp(m->getFamilyFieldAtLevel(1));
if(tmp)
_node_fam_ids=(const_cast<DataArrayInt *>(tmp));
}
}
- _node_num_ids_nocpy=true;
{
const DataArrayInt *tmp(m->getNumberFieldAtLevel(1));
if(tmp)
return new MEDUMeshMultiLev(m,gts,pfls,nbEntities);
}
-MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector<INTERP_KERNEL::NormalizedCellType>& gts, const std::vector<const DataArrayInt *>& pfls, const std::vector<int>& nbEntities):MEDMeshMultiLev(m,m->getNumberOfNodes(),gts,pfls,nbEntities),_is_holding_a_ref_already_held(true)
+MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDFileUMesh *m, const std::vector<INTERP_KERNEL::NormalizedCellType>& gts, const std::vector<const DataArrayInt *>& pfls, const std::vector<int>& nbEntities):MEDMeshMultiLev(m,m->getNumberOfNodes(),gts,pfls,nbEntities)
{
std::size_t sz(gts.size());
if(sz<1)
int lev((int)dim-m->getMeshDimension());
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<DataArrayInt*>(famIds); famIds->incrRef(); }
- _cell_num_ids_nocpy=true;
const DataArrayInt *numIds(m->getNumberFieldAtLevel(lev));
if(numIds)
{ _cell_num_ids=const_cast<DataArrayInt*>(numIds); numIds->incrRef(); }
- _node_fam_ids_nocpy=true;
famIds=m->getFamilyFieldAtLevel(1);
if(famIds)
{ _node_fam_ids=const_cast<DataArrayInt*>(famIds); famIds->incrRef(); }
- _node_num_ids_nocpy=true;
numIds=m->getNumberFieldAtLevel(1);
if(numIds)
{ _node_num_ids=const_cast<DataArrayInt*>(numIds); numIds->incrRef(); }
return ;
}
//
- _cell_fam_ids_nocpy=false;
std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > famIdsSafe(sz);
std::vector<const DataArrayInt *> famIds(sz);
bool f(true);
}
if(f)
_cell_fam_ids=DataArrayInt::Aggregate(famIds);
- _cell_num_ids_nocpy=false;
std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > numIdsSafe(sz);
std::vector<const DataArrayInt *> numIds(sz);
bool n(true);
if(n)
_cell_num_ids=DataArrayInt::Aggregate(numIds);
// node ids management
- _node_fam_ids_nocpy=true;
const DataArrayInt *nodeFamIds(m->getFamilyFieldAtLevel(1));
if(nodeFamIds)
{ _node_fam_ids=const_cast<DataArrayInt*>(nodeFamIds); nodeFamIds->incrRef(); }
- _node_num_ids_nocpy=true;
const DataArrayInt *nodeNumIds(m->getNumberFieldAtLevel(1));
if(nodeNumIds)
{ _node_num_ids=const_cast<DataArrayInt*>(nodeNumIds); nodeNumIds->incrRef(); }
return new MEDUMeshMultiLev(*this);
}
-MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDUMeshMultiLev& other):MEDMeshMultiLev(other),_is_holding_a_ref_already_held(other._is_holding_a_ref_already_held),_parts(other._parts),_coords(other._coords)
+MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDUMeshMultiLev& other):MEDMeshMultiLev(other),_parts(other._parts),_coords(other._coords)
{
}
-MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDStructuredMeshMultiLev& other, const MEDCouplingAutoRefCountObjectPtr<MEDCoupling1GTUMesh>& part):MEDMeshMultiLev(other),_is_holding_a_ref_already_held(false)
+MEDUMeshMultiLev::MEDUMeshMultiLev(const MEDStructuredMeshMultiLev& other, const MEDCouplingAutoRefCountObjectPtr<MEDCoupling1GTUMesh>& part):MEDMeshMultiLev(other)
{
_parts.resize(1);
_parts[0]=part;
{
*dPtr++=connIPtr[1]-connIPtr[0];
dPtr=std::copy(connPtr+connIPtr[0],connPtr+connIPtr[1],dPtr);
- *cPtr++=k; k+=connIPtr[1]-connIPtr[0];
+ *cPtr++=k; k+=connIPtr[1]-connIPtr[0]+1;
}
}
else
reorderNodesIfNecessary(a,d,f);
if(a->getNumberOfComponents()!=3)
a=a->changeNbOfComponents(3,0.);
- coords=a.retn();
- if(!_is_holding_a_ref_already_held)
- {
- if(tmp==((DataArrayDouble *)a))
- {
- if(_parts.empty())
- { const_cast<MEDUMeshMultiLev *>(this)->_coords=0; }
- else
- { const_cast<MEDUMeshMultiLev *>(this)->_parts[0]->setCoords(0); }
- }
- }
- types=b.retn(); cellLocations=c.retn(); cells=d.retn();
+ coords=a.retn(); types=b.retn(); cellLocations=c.retn(); cells=d.retn();
if(!isPolyh)
{ faceLocations=0; faces=0; }
else
{ faceLocations=e.retn(); faces=f.retn(); }
- if(_is_holding_a_ref_already_held)
- return tmp==((DataArrayDouble *)a);
- else
- return false;
+ return _mesh->isObjectInTheProgeny(coords);
}
void MEDUMeshMultiLev::reorderNodesIfNecessary(MEDCouplingAutoRefCountObjectPtr<DataArrayDouble>& coords, DataArrayInt *nodalConnVTK, DataArrayInt *polyhedNodalConnVTK) const
//=
-MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDFileStructuredMesh *m):MEDMeshMultiLev(m),_is_internal(true)
+MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDFileStructuredMesh *m, const std::vector<int>& lev):MEDMeshMultiLev(m),_is_internal(true)
{
+ initStdFieldOfIntegers(m);
}
-MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDFileStructuredMesh *m, const std::vector<int>& lev):MEDMeshMultiLev(m),_is_internal(true)
+MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDFileStructuredMesh *m, int nbOfNodes, const std::vector<INTERP_KERNEL::NormalizedCellType>& gts, const std::vector<const DataArrayInt *>& pfls, const std::vector<int>& nbEntities):MEDMeshMultiLev(m,nbOfNodes,gts,pfls,nbEntities),_is_internal(true)
+{
+ initStdFieldOfIntegers(m);
+}
+
+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)
_cell_num_ids=const_cast<DataArrayInt *>(tmp);
}
//
- _node_fam_ids_nocpy=true; _node_num_ids_nocpy=true;
tmp=0;
tmp=m->getFamilyFieldAtLevel(1);
if(tmp)
tmp->incrRef();
_node_num_ids=const_cast<DataArrayInt *>(tmp);
}
-}
-
-MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDFileStructuredMesh *m, int nbOfNodes, const std::vector<INTERP_KERNEL::NormalizedCellType>& gts, const std::vector<const DataArrayInt *>& pfls, const std::vector<int>& nbEntities):MEDMeshMultiLev(m,nbOfNodes,gts,pfls,nbEntities),_is_internal(true)
-{
- // ids fields management
- _cell_fam_ids_nocpy=true; _cell_num_ids_nocpy=true;
- const DataArrayInt *tmp(0);
- tmp=m->getFamilyFieldAtLevel(0);
- if(tmp)
- {
- tmp->incrRef();
- _cell_fam_ids=const_cast<DataArrayInt *>(tmp);
- }
- tmp=m->getNumberFieldAtLevel(0);
- if(tmp)
- {
- tmp->incrRef();
- _cell_num_ids=const_cast<DataArrayInt *>(tmp);
- }
- //
- _node_fam_ids_nocpy=true; _node_num_ids_nocpy=true;
- tmp=0;
- tmp=m->getFamilyFieldAtLevel(1);
+ // faces (if any)
+ tmp=m->getFamilyFieldAtLevel(-1);
if(tmp)
{
tmp->incrRef();
- _node_fam_ids=const_cast<DataArrayInt *>(tmp);
+ _face_fam_ids=const_cast<DataArrayInt *>(tmp);
}
- tmp=m->getNumberFieldAtLevel(1);
+ tmp=m->getNumberFieldAtLevel(-1);
if(tmp)
{
tmp->incrRef();
- _node_num_ids=const_cast<DataArrayInt *>(tmp);
+ _face_num_ids=const_cast<DataArrayInt *>(tmp);
}
}
-MEDStructuredMeshMultiLev::MEDStructuredMeshMultiLev(const MEDStructuredMeshMultiLev& other):MEDMeshMultiLev(other),_is_internal(true)
+void MEDStructuredMeshMultiLev::moveFaceToCell() const
{
+ const_cast<MEDStructuredMeshMultiLev *>(this)->_cell_fam_ids=_face_fam_ids; const_cast<MEDStructuredMeshMultiLev *>(this)->_face_fam_ids=0;
+ const_cast<MEDStructuredMeshMultiLev *>(this)->_cell_num_ids=_face_num_ids; const_cast<MEDStructuredMeshMultiLev *>(this)->_face_num_ids=0;
}
bool MEDStructuredMeshMultiLev::prepareForImplicitUnstructuredMeshCase(MEDMeshMultiLev *&ret) const
if(!_pfls.empty())
pfl=_pfls[0];
MEDCouplingAutoRefCountObjectPtr<MEDCoupling1GTUMesh> facesIfPresent2(facesIfPresent); facesIfPresent->incrRef();
+ moveFaceToCell();
MEDCouplingAutoRefCountObjectPtr<MEDUMeshMultiLev> ret2(new MEDUMeshMultiLev(*this,facesIfPresent2));
if(pfl)
- throw INTERP_KERNEL::Exception("MEDStructuredMeshMultiLev::prepareForImplicitUnstructuredMeshCase : case is not treated yet for profile on implicit unstructured mesh.");
+ ret2->setCellReduction(pfl);
if(nr)
throw INTERP_KERNEL::Exception("MEDStructuredMeshMultiLev::prepareForImplicitUnstructuredMeshCase : case is not treated yet for node reduction on implicit unstructured mesh.");
ret=ret2.retn();
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)
if(famIds)
{
MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp(famIds->selectByTupleIdSafe(pfl->begin(),pfl->end()));
- ret2->setFamilyIdsOnCells(tmp,false);
+ ret2->setFamilyIdsOnCells(tmp);
}
if(numIds)
{
MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp(numIds->selectByTupleIdSafe(pfl->begin(),pfl->end()));
- ret2->setNumberIdsOnCells(tmp,false);
+ ret2->setNumberIdsOnCells(tmp);
}
return ret2.retn();
if(famIds)
{
MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp(famIds->selectByTupleIdSafe(pfl->begin(),pfl->end()));
- ret2->setFamilyIdsOnCells(tmp,false);
+ ret2->setFamilyIdsOnCells(tmp);
}
if(numIds)
{
MEDCouplingAutoRefCountObjectPtr<DataArrayInt> tmp(numIds->selectByTupleIdSafe(pfl->begin(),pfl->end()));
- ret2->setNumberIdsOnCells(tmp,false);
+ ret2->setNumberIdsOnCells(tmp);
}
return ret2.retn();
}
}
else
{
- arr->setName(NEWLY_CREATED_PFL_NAME);
+ arr->setName(arrs[0]->getName());
std::pair<int,int> p(0,oldNbTuples);
std::string a,b;
MEDFileField1TSStructItem2 ret(gt,p,a,b);
return ret;
}
-std::vector<const BigMemoryObject *> MEDFileField1TSStructItem2::getDirectChildren() const
+std::vector<const BigMemoryObject *> MEDFileField1TSStructItem2::getDirectChildrenWithNull() const
{
std::vector<const BigMemoryObject *> ret;
- const DataArrayInt *pfl(_pfl);
- if(pfl)
- ret.push_back(pfl);
+ ret.push_back((const DataArrayInt *)_pfl);
return ret;
}
return ret;
}
-std::vector<const BigMemoryObject *> MEDFileField1TSStructItem::getDirectChildren() const
+std::vector<const BigMemoryObject *> MEDFileField1TSStructItem::getDirectChildrenWithNull() const
{
std::vector<const BigMemoryObject *> ret;
for(std::vector< MEDFileField1TSStructItem2 >::const_iterator it=_items.begin();it!=_items.end();it++)
return ret;
}
-std::vector<const BigMemoryObject *> MEDFileField1TSStruct::getDirectChildren() const
+std::vector<const BigMemoryObject *> MEDFileField1TSStruct::getDirectChildrenWithNull() const
{
std::vector<const BigMemoryObject *> ret;
for(std::vector<MEDFileField1TSStructItem>::const_iterator it=_already_checked.begin();it!=_already_checked.end();it++)
return ret;
}
-std::vector<const BigMemoryObject *> MEDFileFastCellSupportComparator::getDirectChildren() const
+std::vector<const BigMemoryObject *> MEDFileFastCellSupportComparator::getDirectChildrenWithNull() const
{
std::vector<const BigMemoryObject *> ret;
const MEDFileMeshStruct *mst(_mesh_comp);
if(mst)
ret.push_back(mst);
for(std::vector< MEDCouplingAutoRefCountObjectPtr<MEDFileField1TSStruct> >::const_iterator it=_f1ts_cmps.begin();it!=_f1ts_cmps.end();it++)
- {
- const MEDFileField1TSStruct *cur(*it);
- if(cur)
- ret.push_back(cur);
- }
+ ret.push_back((const MEDFileField1TSStruct *)*it);
return ret;
}