1 // Copyright (C) 2007-2013 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
21 #include "MEDCouplingUMeshDesc.hxx"
22 #include "CellModel.hxx"
23 #include "MEDCouplingMemArray.hxx"
24 #include "MEDCouplingAutoRefCountObjectPtr.hxx"
29 using namespace ParaMEDMEM;
31 MEDCouplingUMeshDesc::MEDCouplingUMeshDesc():_mesh_dim(-2),_desc_connec(0),_desc_connec_index(0),
32 _nodal_connec_face(0),_nodal_connec_face_index(0)
36 MEDCouplingUMeshDesc::~MEDCouplingUMeshDesc()
39 _desc_connec->decrRef();
40 if(_desc_connec_index)
41 _desc_connec_index->decrRef();
42 if(_nodal_connec_face)
43 _nodal_connec_face->decrRef();
44 if(_nodal_connec_face_index)
45 _nodal_connec_face_index->decrRef();
48 MEDCouplingUMeshDesc *MEDCouplingUMeshDesc::New()
50 return new MEDCouplingUMeshDesc;
53 MEDCouplingUMeshDesc *MEDCouplingUMeshDesc::New(const char *meshName, int meshDim)
55 MEDCouplingUMeshDesc *ret=new MEDCouplingUMeshDesc;
56 ret->setName(meshName);
57 ret->setMeshDimension(meshDim);
61 std::size_t MEDCouplingUMeshDesc::getHeapMemorySize() const
65 ret+=_desc_connec->getHeapMemorySize();
66 if(_desc_connec_index)
67 ret+=_desc_connec_index->getHeapMemorySize();
68 if(_nodal_connec_face)
69 ret+=_nodal_connec_face->getHeapMemorySize();
70 if(_nodal_connec_face_index)
71 ret+=_nodal_connec_face_index->getHeapMemorySize();
72 return MEDCouplingPointSet::getHeapMemorySize()+ret;
76 MEDCouplingMesh *MEDCouplingUMeshDesc::deepCpy() const
78 throw INTERP_KERNEL::Exception("Not implemented yet !");
82 MEDCouplingPointSet *MEDCouplingUMeshDesc::deepCpyConnectivityOnly() const throw(INTERP_KERNEL::Exception)
84 throw INTERP_KERNEL::Exception("Not implemented yet !");
87 void MEDCouplingUMeshDesc::shallowCopyConnectivityFrom(const MEDCouplingPointSet *other) throw(INTERP_KERNEL::Exception)
89 throw INTERP_KERNEL::Exception("Not implemented yet !");
92 void MEDCouplingUMeshDesc::checkCoherency() const throw(INTERP_KERNEL::Exception)
94 for(std::set<INTERP_KERNEL::NormalizedCellType>::const_iterator iter=_types.begin();iter!=_types.end();iter++)
96 if((int)INTERP_KERNEL::CellModel::GetCellModel(*iter).getDimension()!=_mesh_dim)
98 std::ostringstream message;
99 message << "MeshDesc invalid because dimension is " << _mesh_dim << " and there is presence of cell(s) with type " << (*iter);
100 throw INTERP_KERNEL::Exception(message.str().c_str());
105 void MEDCouplingUMeshDesc::checkCoherency1(double eps) const throw(INTERP_KERNEL::Exception)
110 void MEDCouplingUMeshDesc::checkCoherency2(double eps) const throw(INTERP_KERNEL::Exception)
112 checkCoherency1(eps);
115 void MEDCouplingUMeshDesc::checkDeepEquivalOnSameNodesWith(const MEDCouplingMesh *other, int cellCompPol, double prec,
116 DataArrayInt *&cellCor) const throw(INTERP_KERNEL::Exception)
118 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::checkDeepEquivalOnSameNodesWith : not implemented yet !");
121 void MEDCouplingUMeshDesc::setMeshDimension(unsigned meshDim)
127 int MEDCouplingUMeshDesc::getNumberOfCells() const
129 if(_desc_connec_index)
130 return _desc_connec_index->getNumberOfTuples()-1;
132 throw INTERP_KERNEL::Exception("Unable to get number of cells because no connectivity specified !");
135 int MEDCouplingUMeshDesc::getNumberOfFaces() const
137 if(_nodal_connec_face_index)
138 return _nodal_connec_face_index->getNumberOfTuples()-1;
140 throw INTERP_KERNEL::Exception("Unable to get number of faces because no connectivity specified !");
143 int MEDCouplingUMeshDesc::getCellMeshLength() const
145 return _desc_connec->getNbOfElems();
148 int MEDCouplingUMeshDesc::getFaceMeshLength() const
150 return _nodal_connec_face->getNbOfElems();
153 INTERP_KERNEL::NormalizedCellType MEDCouplingUMeshDesc::getTypeOfCell(int cellId) const
155 const int *desc_connec=_desc_connec->getConstPointer();
156 const int *desc_connec_index=_desc_connec_index->getConstPointer();
157 return (INTERP_KERNEL::NormalizedCellType)desc_connec[desc_connec_index[cellId]+1];
160 std::set<INTERP_KERNEL::NormalizedCellType> MEDCouplingUMeshDesc::getAllGeoTypes() const
165 DataArrayInt *MEDCouplingUMeshDesc::giveCellsWithType(INTERP_KERNEL::NormalizedCellType type) const throw(INTERP_KERNEL::Exception)
167 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::giveCellsWithType : not implemented yet !");
170 DataArrayInt *MEDCouplingUMeshDesc::computeNbOfNodesPerCell() const throw(INTERP_KERNEL::Exception)
172 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::computeNbOfNodesPerCell : not implemented yet !");
175 DataArrayInt *MEDCouplingUMeshDesc::computeNbOfFacesPerCell() const throw(INTERP_KERNEL::Exception)
177 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::computeNbOfFacesPerCell : not implemented yet !");
180 DataArrayInt *MEDCouplingUMeshDesc::computeEffectiveNbOfNodesPerCell() const throw(INTERP_KERNEL::Exception)
182 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::computeEffectiveNbOfNodesPerCell : not implemented yet !");
185 int MEDCouplingUMeshDesc::getNumberOfCellsWithType(INTERP_KERNEL::NormalizedCellType type) const
187 const int *desc_connec=_desc_connec->getConstPointer();
188 const int *desc_connec_index=_desc_connec_index->getConstPointer();
189 int nbOfCells=getNumberOfCells();
191 for(int i=0;i<nbOfCells;i++)
192 if((INTERP_KERNEL::NormalizedCellType) desc_connec[desc_connec_index[i]]==type)
197 void MEDCouplingUMeshDesc::getNodeIdsOfCell(int cellId, std::vector<int>& conn) const
199 throw INTERP_KERNEL::Exception("Not implemented yet !");
202 std::string MEDCouplingUMeshDesc::simpleRepr() const
204 std::string ret("Unstructured mesh with descending connectivity : ");
210 std::string MEDCouplingUMeshDesc::advancedRepr() const
212 std::string ret("Unstructured mesh with descending connectivity : ");
218 void MEDCouplingUMeshDesc::setConnectivity(DataArrayInt *descConn, DataArrayInt *descConnIndex, DataArrayInt *nodalFaceConn, DataArrayInt *nodalFaceConnIndx)
220 DataArrayInt::SetArrayIn(descConn,_desc_connec);
221 DataArrayInt::SetArrayIn(descConnIndex,_desc_connec_index);
222 DataArrayInt::SetArrayIn(nodalFaceConn,_nodal_connec_face);
223 DataArrayInt::SetArrayIn(nodalFaceConnIndx,_nodal_connec_face_index);
227 std::vector<int> MEDCouplingUMeshDesc::getDistributionOfTypes() const throw(INTERP_KERNEL::Exception)
229 throw INTERP_KERNEL::Exception("Not implemented yet !");
232 DataArrayInt *MEDCouplingUMeshDesc::checkTypeConsistencyAndContig(const std::vector<int>& code, const std::vector<const DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception)
234 throw INTERP_KERNEL::Exception("Not implemented yet !");
237 void MEDCouplingUMeshDesc::splitProfilePerType(const DataArrayInt *profile, std::vector<int>& code, std::vector<DataArrayInt *>& idsInPflPerType, std::vector<DataArrayInt *>& idsPerType) const throw(INTERP_KERNEL::Exception)
239 throw INTERP_KERNEL::Exception("Not implemented yet !");
242 void MEDCouplingUMeshDesc::getTinySerializationInformation(std::vector<double>& tinyInfoD, std::vector<int>& tinyInfo, std::vector<std::string>& littleStrings) const
244 MEDCouplingPointSet::getTinySerializationInformation(tinyInfoD,tinyInfo,littleStrings);
245 tinyInfo.push_back(getMeshDimension());
246 tinyInfo.push_back(getNumberOfNodes());
247 tinyInfo.push_back(getNumberOfCells());
248 tinyInfo.push_back(getCellMeshLength());
249 tinyInfo.push_back(getNumberOfFaces());
250 tinyInfo.push_back(getFaceMeshLength());
253 bool MEDCouplingUMeshDesc::isEmptyMesh(const std::vector<int>& tinyInfo) const
255 return tinyInfo[5]<=0;
258 void MEDCouplingUMeshDesc::resizeForUnserialization(const std::vector<int>& tinyInfo, DataArrayInt *a1, DataArrayDouble *a2, std::vector<std::string>& littleStrings) const
260 std::vector<int> tinyInfoTmp(tinyInfo.begin()+1,tinyInfo.end());
261 MEDCouplingPointSet::resizeForUnserialization(tinyInfoTmp,a1,a2,littleStrings);
262 a1->alloc(tinyInfo[5]+tinyInfo[4]+1+tinyInfo[7]+tinyInfo[6]+1,1);
265 void MEDCouplingUMeshDesc::serialize(DataArrayInt *&a1, DataArrayDouble *&a2) const
267 MEDCouplingPointSet::serialize(a1,a2);
269 a1=DataArrayInt::New();
270 a1->alloc(getCellMeshLength()+getNumberOfCells()+1+getFaceMeshLength()+getNumberOfFaces()+1,1);
271 int *ptA1=a1->getPointer();
272 const int *descConn=_desc_connec->getConstPointer();
273 const int *descConnIndex=_desc_connec_index->getConstPointer();
274 const int *faceConn=_nodal_connec_face->getConstPointer();
275 const int *faceConnIndex=_nodal_connec_face_index->getConstPointer();
276 ptA1=std::copy(descConn,descConn+getCellMeshLength(),ptA1);
277 ptA1=std::copy(descConnIndex,descConnIndex+getNumberOfCells()+1,ptA1);
278 ptA1=std::copy(faceConn,faceConn+getFaceMeshLength(),ptA1);
279 std::copy(faceConnIndex,faceConnIndex+getNumberOfFaces()+1,ptA1);
282 void MEDCouplingUMeshDesc::unserialization(const std::vector<double>& tinyInfoD, const std::vector<int>& tinyInfo, const DataArrayInt *a1, DataArrayDouble *a2, const std::vector<std::string>& littleStrings)
284 std::vector<int> tinyInfoTmp(tinyInfo.begin()+1,tinyInfo.end());
285 MEDCouplingPointSet::unserialization(tinyInfoD,tinyInfoTmp,a1,a2,littleStrings);
287 const int *recvBuffer=a1->getConstPointer();
288 DataArrayInt *descConn=DataArrayInt::New();
289 descConn->alloc(tinyInfo[5],1);
290 std::copy(recvBuffer,recvBuffer+tinyInfo[5],descConn->getPointer());
291 DataArrayInt *descConnIndex=DataArrayInt::New();
292 descConnIndex->alloc(tinyInfo[4]+1,1);
293 std::copy(recvBuffer+tinyInfo[5],recvBuffer+tinyInfo[5]+tinyInfo[4]+1,descConnIndex->getPointer());
294 DataArrayInt *faceConn=DataArrayInt::New();
295 faceConn->alloc(tinyInfo[7],1);
296 std::copy(recvBuffer+tinyInfo[5]+tinyInfo[4]+1,recvBuffer+tinyInfo[5]+tinyInfo[4]+1+tinyInfo[7],faceConn->getPointer());
297 DataArrayInt *faceConnIndex=DataArrayInt::New();
298 faceConnIndex->alloc(tinyInfo[6]+1,1);
299 std::copy(recvBuffer+tinyInfo[5]+tinyInfo[4]+1+tinyInfo[7],
300 recvBuffer+tinyInfo[5]+tinyInfo[5]+1+tinyInfo[7]+tinyInfo[6]+1,faceConnIndex->getPointer());
301 setConnectivity(descConn,descConnIndex,faceConn,faceConnIndex);
303 descConnIndex->decrRef();
305 faceConnIndex->decrRef();
306 setMeshDimension(tinyInfo[2]);
309 DataArrayInt *MEDCouplingUMeshDesc::getCellsInBoundingBox(const double *bbox, double eps) const
311 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> elems=DataArrayInt::New(); elems->alloc(0,1);
312 int dim=getSpaceDimension();
313 double* elem_bb=new double[2*dim];
314 const int* conn = _desc_connec->getConstPointer();
315 const int* conn_index= _desc_connec_index->getConstPointer();
316 const int* face = _nodal_connec_face->getConstPointer();
317 const int* face_index= _nodal_connec_face_index->getConstPointer();
318 const double* coords = getCoords()->getConstPointer();
319 int nbOfCells=getNumberOfCells();
320 for ( int ielem=0; ielem<nbOfCells;ielem++ )
322 for (int i=0; i<dim; i++)
324 elem_bb[i*2]=std::numeric_limits<double>::max();
325 elem_bb[i*2+1]=-std::numeric_limits<double>::max();
328 for (int jface=conn_index[ielem]+1; jface<conn_index[ielem+1]; jface++)//+1 due to offset of cell type.
330 int iface=conn[jface];
331 for(int inode=face_index[iface]+1;inode<face_index[iface+1];inode++)
333 int node=face[inode];
334 for (int idim=0; idim<dim; idim++)
336 if ( coords[node*dim+idim] < elem_bb[idim*2] )
338 elem_bb[idim*2] = coords[node*dim+idim] ;
340 if ( coords[node*dim+idim] > elem_bb[idim*2+1] )
342 elem_bb[idim*2+1] = coords[node*dim+idim] ;
347 if(intersectsBoundingBox(elem_bb, bbox, dim, eps))
348 elems->pushBackSilent(ielem);
354 DataArrayInt *MEDCouplingUMeshDesc::getCellsInBoundingBox(const INTERP_KERNEL::DirectedBoundingBox &bbox, double eps)
356 MEDCouplingAutoRefCountObjectPtr<DataArrayInt> elems=DataArrayInt::New(); elems->alloc(0,1);
357 int dim=getSpaceDimension();
358 double* elem_bb=new double[2*dim];
359 const int* conn = _desc_connec->getConstPointer();
360 const int* conn_index= _desc_connec_index->getConstPointer();
361 const int* face = _nodal_connec_face->getConstPointer();
362 const int* face_index= _nodal_connec_face_index->getConstPointer();
363 const double* coords = getCoords()->getConstPointer();
364 int nbOfCells=getNumberOfCells();
365 for ( int ielem=0; ielem<nbOfCells;ielem++ )
367 for (int i=0; i<dim; i++)
369 elem_bb[i*2]=std::numeric_limits<double>::max();
370 elem_bb[i*2+1]=-std::numeric_limits<double>::max();
373 for (int jface=conn_index[ielem]+1; jface<conn_index[ielem+1]; jface++)//+1 due to offset of cell type.
375 int iface=conn[jface];
376 for(int inode=face_index[iface]+1;inode<face_index[iface+1];inode++)
378 int node=face[inode];
379 for (int idim=0; idim<dim; idim++)
381 if ( coords[node*dim+idim] < elem_bb[idim*2] )
383 elem_bb[idim*2] = coords[node*dim+idim] ;
385 if ( coords[node*dim+idim] > elem_bb[idim*2+1] )
387 elem_bb[idim*2+1] = coords[node*dim+idim] ;
392 if (intersectsBoundingBox(bbox, elem_bb, dim, eps))
393 elems->pushBackSilent(ielem);
399 MEDCouplingPointSet *MEDCouplingUMeshDesc::mergeMyselfWithOnSameCoords(const MEDCouplingPointSet *other) const
401 throw INTERP_KERNEL::Exception("Not implemented yet !");
404 MEDCouplingPointSet *MEDCouplingUMeshDesc::buildPartOfMySelfNode(const int *start, const int *end, bool fullyIn) const
406 throw INTERP_KERNEL::Exception("Not implemented yet !");
410 MEDCouplingPointSet *MEDCouplingUMeshDesc::buildFacePartOfMySelfNode(const int *start, const int *end, bool fullyIn) const
412 throw INTERP_KERNEL::Exception("Not implemented yet !");
416 MEDCouplingPointSet *MEDCouplingUMeshDesc::buildPartOfMySelfKeepCoords(const int *begin, const int *end) const
418 throw INTERP_KERNEL::Exception("Not implemented yet !");
421 MEDCouplingPointSet *MEDCouplingUMeshDesc::buildPartOfMySelfKeepCoords2(int start, int end, int step) const
423 throw INTERP_KERNEL::Exception("Not implemented yet !");
426 void MEDCouplingUMeshDesc::computeNodeIdsAlg(std::vector<bool>& nodeIdsInUse) const throw(INTERP_KERNEL::Exception)
428 throw INTERP_KERNEL::Exception("Not implemented yet !");
431 DataArrayInt *MEDCouplingUMeshDesc::simplexize(int policy) throw(INTERP_KERNEL::Exception)
433 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::simplexize : Not implemented yet !");
436 DataArrayInt *MEDCouplingUMeshDesc::findBoundaryNodes() const
438 throw INTERP_KERNEL::Exception("Not implemented yet !");
441 MEDCouplingPointSet *MEDCouplingUMeshDesc::buildBoundaryMesh(bool keepCoords) const
443 throw INTERP_KERNEL::Exception("Not implemented yet !");
447 MEDCouplingUMesh *MEDCouplingUMeshDesc::buildUnstructured() const throw(INTERP_KERNEL::Exception)
449 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::buildUnstructured : not implemented yet !");
452 void MEDCouplingUMeshDesc::renumberCells(const int *old2NewBg, bool check) throw(INTERP_KERNEL::Exception)
454 throw INTERP_KERNEL::Exception("Available for UMesh desc but not implemented yet !");
457 void MEDCouplingUMeshDesc::renumberNodesInConn(const int *newNodeNumbersO2N)
459 throw INTERP_KERNEL::Exception("Not implemented yet !");
462 MEDCouplingFieldDouble *MEDCouplingUMeshDesc::getMeasureField(bool isAbs) const
464 throw INTERP_KERNEL::Exception("Not implemented yet !");
468 MEDCouplingFieldDouble *MEDCouplingUMeshDesc::getMeasureFieldOnNode(bool isAbs) const
470 throw INTERP_KERNEL::Exception("Not implemented yet !");
474 MEDCouplingFieldDouble *MEDCouplingUMeshDesc::buildOrthogonalField() const
476 if(getMeshDimension()!=2)
477 throw INTERP_KERNEL::Exception("Expected a cmesh with meshDim == 2 !");
478 throw INTERP_KERNEL::Exception("Not implemented yet !");
482 DataArrayInt *MEDCouplingUMeshDesc::zipCoordsTraducer() throw(INTERP_KERNEL::Exception)
484 throw INTERP_KERNEL::Exception("Not implemented yet !");
488 void MEDCouplingUMeshDesc::findCommonCells(int compType, int startCellId, DataArrayInt *& commonCellsArr, DataArrayInt *& commonCellsIArr) const throw(INTERP_KERNEL::Exception)
490 throw INTERP_KERNEL::Exception("Not implemented yet !");
493 void MEDCouplingUMeshDesc::getReverseNodalConnectivity(DataArrayInt *revNodal, DataArrayInt *revNodalIndx) const throw(INTERP_KERNEL::Exception)
495 throw INTERP_KERNEL::Exception("Not implemented yet !");
498 void MEDCouplingUMeshDesc::computeTypes()
500 if(_desc_connec && _desc_connec_index)
503 const int *conn=_desc_connec->getConstPointer();
504 const int *connIndex=_desc_connec_index->getConstPointer();
505 int nbOfElem=_desc_connec_index->getNbOfElems()-1;
506 for(const int *pt=connIndex;pt!=connIndex+nbOfElem;pt++)
507 _types.insert((INTERP_KERNEL::NormalizedCellType)conn[*pt]);
511 void MEDCouplingUMeshDesc::checkFullyDefined() const throw(INTERP_KERNEL::Exception)
513 if(!_desc_connec || !_desc_connec_index || !_nodal_connec_face || !_nodal_connec_face_index || !_coords)
514 throw INTERP_KERNEL::Exception("full connectivity and coordinates not set in unstructured mesh.");
517 MEDCouplingMesh *MEDCouplingUMeshDesc::mergeMyselfWith(const MEDCouplingMesh *other) const
519 throw INTERP_KERNEL::Exception("Not implemented yet !");
523 DataArrayInt *MEDCouplingUMeshDesc::getNodeIdsInUse(int& nbrOfNodesInUse) const throw(INTERP_KERNEL::Exception)
525 throw INTERP_KERNEL::Exception("Not implemented yet !");
528 void MEDCouplingUMeshDesc::fillCellIdsToKeepFromNodeIds(const int *begin, const int *end, bool fullyIn, DataArrayInt *&cellIdsKeptArr) const
530 throw INTERP_KERNEL::Exception("Not implemented yet !");
533 DataArrayDouble *MEDCouplingUMeshDesc::getBarycenterAndOwner() const
535 throw INTERP_KERNEL::Exception("Not implemented yet !");
539 int MEDCouplingUMeshDesc::getCellContainingPoint(const double *pos, double eps) const
541 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::getCellContainingPoint : not implemented yet !");
544 void MEDCouplingUMeshDesc::writeVTKLL(std::ostream& ofs, const std::string& cellData, const std::string& pointData) const throw(INTERP_KERNEL::Exception)
546 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::writeVTKLL : not implemented yet !");
549 std::string MEDCouplingUMeshDesc::getVTKDataSetType() const throw(INTERP_KERNEL::Exception)
551 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::getVTKDataSetType : not implemented yet !");
554 DataArrayDouble *MEDCouplingUMeshDesc::computeIsoBarycenterOfNodesPerCell() const throw(INTERP_KERNEL::Exception)
556 throw INTERP_KERNEL::Exception("MEDCouplingUMeshDesc::computeIsoBarycenterOfNodesPerCell : not implemented yet !");
559 void MEDCouplingUMeshDesc::reprQuickOverview(std::ostream& stream) const throw(INTERP_KERNEL::Exception)
561 stream << "MEDCouplingUMeshDesc C++ instance at " << this << ". Name : \"" << getName() << "\".";