- _cell_fam_ids=DataArrayInt::Aggregate(famIds);
-}
-
-void MEDUMeshMultiLev::selectPartOfNodes(const DataArrayInt *pflNodes)
-{
- if(!pflNodes || !pflNodes->isAllocated())
- return ;
- std::size_t sz(_parts.size());
- std::vector< MEDCouplingAutoRefCountObjectPtr<DataArrayInt> > a(sz);
- std::vector< const DataArrayInt *> aa(sz);
- for(std::size_t i=0;i<sz;i++)
- {
-
- const DataArrayInt *pfl(_pfls[i]);
- MEDCouplingAutoRefCountObjectPtr<MEDCoupling1GTUMesh> m(_parts[i]);
- if(pfl)
- m=dynamic_cast<MEDCoupling1GTUMesh *>(_parts[i]->buildPartOfMySelfKeepCoords(pfl->begin(),pfl->end()));
- DataArrayInt *cellIds=0;
- m->fillCellIdsToKeepFromNodeIds(pflNodes->begin(),pflNodes->end(),true,cellIds);
- MEDCouplingAutoRefCountObjectPtr<DataArrayInt> cellIdsSafe(cellIds);
- MEDCouplingAutoRefCountObjectPtr<MEDCouplingPointSet> m2(m->buildPartOfMySelfKeepCoords(cellIds->begin(),cellIds->end()));
- int tmp=-1;
- MEDCouplingAutoRefCountObjectPtr<DataArrayInt> o2n(m2->getNodeIdsInUse(tmp));
- a[i]=o2n->invertArrayO2N2N2O(tmp); aa[i]=a[i];
- if(pfl)
- _pfls[i]=pfl->selectByTupleIdSafe(cellIds->begin(),cellIds->end());
- else
- _pfls[i]=cellIdsSafe;
- }
- _node_reduction=DataArrayInt::Aggregate(aa);
- _node_reduction->sort(true);
- _node_reduction=_node_reduction->buildUnique();
+ _cell_fam_ids=DataArrayIdType::Aggregate(famIds);
+ std::vector< MCAuto<DataArrayIdType> > numIdsSafe(sz);
+ std::vector<const DataArrayIdType *> numIds(sz);
+ bool n(true);
+ for(std::size_t i=0;i<sz;i++)
+ {
+ numIdsSafe[i]=m->extractNumberFieldOnGeoType(gts[i]);
+ numIds[i]=numIdsSafe[i];
+ if(!numIds[i])
+ n=false;
+ }
+ if(n)
+ _cell_num_ids=DataArrayIdType::Aggregate(numIds);
+ // node ids management
+ const DataArrayIdType *nodeFamIds(m->getFamilyFieldAtLevel(1));
+ if(nodeFamIds)
+ { _node_fam_ids=const_cast<DataArrayIdType*>(nodeFamIds); nodeFamIds->incrRef(); }
+ const DataArrayIdType *nodeNumIds(m->getNumberFieldAtLevel(1));
+ if(nodeNumIds)
+ { _node_num_ids=const_cast<DataArrayIdType*>(nodeNumIds); nodeNumIds->incrRef(); }
+}
+
+void MEDUMeshMultiLev::selectPartOfNodes(const DataArrayIdType *pflNodes)
+{
+ if(!pflNodes || !pflNodes->isAllocated())
+ return ;
+ std::size_t sz(_parts.size());
+ std::vector< MCAuto<DataArrayIdType> > a(sz);
+ std::vector< const DataArrayIdType *> aa(sz);
+ for(std::size_t i=0;i<sz;i++)
+ {
+ const DataArrayIdType *pfl(_pfls[i]);
+ MCAuto<MEDCoupling1GTUMesh> m(_parts[i]);
+ if(pfl)
+ m=dynamic_cast<MEDCoupling1GTUMesh *>(_parts[i]->buildPartOfMySelfKeepCoords(pfl->begin(),pfl->end()));
+ DataArrayIdType *cellIds=0;
+ m->fillCellIdsToKeepFromNodeIds(pflNodes->begin(),pflNodes->end(),true,cellIds);
+ MCAuto<DataArrayIdType> cellIdsSafe(cellIds);
+ MCAuto<MEDCouplingPointSet> m2(m->buildPartOfMySelfKeepCoords(cellIds->begin(),cellIds->end()));
+ mcIdType tmp=-1;
+ MCAuto<DataArrayIdType> o2n(m2->getNodeIdsInUse(tmp));
+ a[i]=o2n->invertArrayO2N2N2O(tmp); aa[i]=a[i];
+ if(pfl)
+ _pfls[i]=pfl->selectByTupleIdSafe(cellIds->begin(),cellIds->end());
+ else
+ _pfls[i]=cellIdsSafe;
+ }
+ if(!aa.empty())
+ _node_reduction=DataArrayIdType::Aggregate(aa);//general case
+ else
+ _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())
+ return ;//This is the classical case where the input node profile corresponds perfectly to a subset of cells in _parts
+ 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...
+ MCAuto<DataArrayIdType> pflNodes2(pflNodes->deepCopy());
+ pflNodes2->sort(true);
+ MCAuto<DataArrayIdType> diff(pflNodes2->buildSubstractionOptimized(_node_reduction));
+ appendVertices(diff,pflNodes2);