#include "SMDS_QuadraticFaceOfNodes.hxx"
#include "SMDS_QuadraticVolumeOfNodes.hxx"
#include "SMDS_SpacePosition.hxx"
+#include "SMDS_UnstructuredGrid.hxx"
#include <vtkUnstructuredGrid.h>
#include <vtkUnstructuredGridWriter.h>
myElementIDFactory(new SMDS_MeshElementIDFactory()),
myHasConstructionEdges(false), myHasConstructionFaces(false),
myHasInverseElements(true),
- myNodeMin(0), myNodeMax(0), myCellLinksSize(0),
+ myNodeMin(0), myNodeMax(0),
myNodePool(0), myEdgePool(0), myFacePool(0), myVolumePool(0)
{
myMeshId = _meshList.size(); // --- index of the mesh to push back in the vector
myCells.clear();
myIDElements.clear();
myVtkIndex.clear();
- myGrid = vtkUnstructuredGrid::New();
+ myGrid = SMDS_UnstructuredGrid::New();
myGrid->Initialize();
myGrid->Allocate();
vtkPoints* points = vtkPoints::New();
vector<vtkIdType> nodeIds;
nodeIds.clear();
nodeIds.push_back(n1->getId());
- nodeIds.push_back(n3->getId());
nodeIds.push_back(n2->getId());
+ nodeIds.push_back(n3->getId());
nodeIds.push_back(n4->getId());
- nodeIds.push_back(n6->getId());
nodeIds.push_back(n5->getId());
+ nodeIds.push_back(n6->getId());
SMDS_VtkVolume *volvtk = myVolumePool->getNew();
volvtk->init(nodeIds, this);
if ((IDelem < 0) || IDelem >= myCells.size())
{
MESSAGE("----------------------------------- bad IDelem " << IDelem << " " << myCells.size());
+ assert(0);
return 0;
}
return myCells[IDelem];
void SMDS_Mesh::Clear()
{
- if (myParent!=NULL) {
+ if (myParent!=NULL)
+ {
SMDS_ElemIteratorPtr eIt = elementsIterator();
while ( eIt->more() )
myElementIDFactory->ReleaseID(eIt->next()->GetID());
SMDS_NodeIteratorPtr itn = nodesIterator();
while (itn->more())
myNodeIDFactory->ReleaseID(itn->next()->GetID());
- }
- else {
+ }
+ else
+ {
myNodeIDFactory->Clear();
myElementIDFactory->Clear();
- }
+ }
SMDS_ElemIteratorPtr itv = elementsIterator();
while (itv->more())
- delete itv->next();
+ {
+ SMDS_MeshElement* elem = (SMDS_MeshElement*)(itv->next());
+ SMDSAbs_ElementType aType = elem->GetType();
+ switch (aType)
+ {
+ case SMDSAbs_0DElement:
+ delete elem;
+ break;
+ case SMDSAbs_Edge:
+ myEdgePool->destroy(static_cast<SMDS_VtkEdge*>(elem));
+ break;
+ case SMDSAbs_Face:
+ myFacePool->destroy(static_cast<SMDS_VtkFace*>(elem));
+ break;
+ case SMDSAbs_Volume:
+ myVolumePool->destroy(static_cast<SMDS_VtkVolume*>(elem));
+ break;
+ default:
+ break;
+ }
+ }
myCells.clear();
-// SMDS_VolumeIteratorPtr itv = volumesIterator();
-// while (itv->more())
-// delete itv->next();
-// myVolumes.Clear();
-//
-// SMDS_FaceIteratorPtr itf = facesIterator();
-// while (itf->more())
-// delete itf->next();
-// myFaces.Clear();
-//
-// SMDS_EdgeIteratorPtr ite = edgesIterator();
-// while (ite->more())
-// delete ite->next();
-// myEdges.Clear();
-//
-// SMDS_0DElementIteratorPtr it0d = elements0dIterator();
-// while (it0d->more())
-// delete it0d->next();
-// my0DElements.Clear();
-
SMDS_NodeIteratorPtr itn = nodesIterator();
while (itn->more())
- delete itn->next();
+ {
+ SMDS_MeshNode *node = (SMDS_MeshNode*)(itn->next());
+ myNodePool->destroy(node);
+ }
myNodes.clear();
list<SMDS_Mesh*>::iterator itc=myChildren.begin();
(*itc)->Clear();
myInfo.Clear();
+
+ myGrid->Initialize();
+ myGrid->Allocate();
+ vtkPoints* points = vtkPoints::New();
+ points->SetNumberOfPoints(SMDS_Mesh::chunkSize);
+ myGrid->SetPoints( points );
+ points->Delete();
+ myGrid->BuildLinks();
}
///////////////////////////////////////////////////////////////////////////////
list<const SMDS_MeshElement *>& removedNodes,
bool removenodes)
{
- MESSAGE("SMDS_Mesh::RemoveElement " << elem->GetID() << " " << removenodes);
+ //MESSAGE("SMDS_Mesh::RemoveElement " << elem->GetID() << " " << removenodes);
// get finite elements built on elem
set<const SMDS_MeshElement*> * s1;
if (elem->GetType() == SMDSAbs_0DElement ||
case SMDSAbs_0DElement:
myCells[(*it)->GetID()] = 0; // -PR- ici ou dans myElementIDFactory->ReleaseID ?
myInfo.remove(*it);
+ removedElems.push_back( (*it) );
+ myElementIDFactory->ReleaseID((*it)->GetID());
+ delete (*it);
break;
case SMDSAbs_Edge:
myCells[(*it)->GetID()] = 0;
myInfo.RemoveEdge(*it);
+ removedElems.push_back( (*it) );
+ myElementIDFactory->ReleaseID((*it)->GetID());
+ if (const SMDS_VtkEdge* vtkElem = dynamic_cast<const SMDS_VtkEdge*>(*it))
+ myEdgePool->destroy((SMDS_VtkEdge*)vtkElem);
+ else delete (*it);
break;
case SMDSAbs_Face:
myCells[(*it)->GetID()] = 0;
myInfo.RemoveFace(*it);
+ removedElems.push_back( (*it) );
+ myElementIDFactory->ReleaseID((*it)->GetID());
+ if (const SMDS_VtkFace* vtkElem = dynamic_cast<const SMDS_VtkFace*>(*it))
+ myFacePool->destroy((SMDS_VtkFace*)vtkElem);
+ else delete (*it);
break;
case SMDSAbs_Volume:
myCells[(*it)->GetID()] = 0;
myInfo.RemoveVolume(*it);
+ removedElems.push_back( (*it) );
+ myElementIDFactory->ReleaseID((*it)->GetID());
+ if (const SMDS_VtkVolume* vtkElem = dynamic_cast<const SMDS_VtkVolume*>(*it))
+ myVolumePool->destroy((SMDS_VtkVolume*)vtkElem);
+ else delete (*it);
break;
}
- //MESSAGE( "SMDS: RM elem " << (*it)->GetID() );
- removedElems.push_back( (*it) );
- myElementIDFactory->ReleaseID((*it)->GetID());
- MYASSERT("problem delete elem")
- delete (*it);
it++;
}
myInfo.myNbNodes--;
myNodeIDFactory->ReleaseID((*it)->GetID());
removedNodes.push_back( (*it) );
- MYASSERT("problem delete node")
- delete *it;
+ if (const SMDS_MeshNode* vtkElem = dynamic_cast<const SMDS_MeshNode*>(*it))
+ myNodePool->destroy((SMDS_MeshNode*)vtkElem);
+ else delete (*it);
it++;
}
}
void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem)
{
int elemId = elem->GetID();
- MESSAGE("SMDS_Mesh::RemoveFreeElement " << elemId);
+ //MESSAGE("SMDS_Mesh::RemoveFreeElement " << elemId);
SMDSAbs_ElementType aType = elem->GetType();
SMDS_MeshElement* todest = (SMDS_MeshElement*)(elem);
if (aType == SMDSAbs_Node) {
int ID)
{
if ( !n1 || !n2 || !n12 ) return 0;
- SMDS_QuadraticEdge* edge = new SMDS_QuadraticEdge(n1,n2,n12);
- if(myElementIDFactory->BindID(ID, edge)) {
- SMDS_MeshNode *node1,*node2, *node12;
- //node1 = const_cast<SMDS_MeshNode*>(n1);
- //node2 = const_cast<SMDS_MeshNode*>(n2);
- //node12 = const_cast<SMDS_MeshNode*>(n12);
- //node1->AddInverseElement(edge); // --- fait avec BindID
- //node2->AddInverseElement(edge);
- //node12->AddInverseElement(edge);
- adjustmyCellsCapacity(ID);
- myCells[ID] = edge;
- myInfo.myNbQuadEdges++;
- return edge;
- }
- else {
- delete edge;
- return NULL;
+
+ // --- retrieve nodes ID
+ vector<vtkIdType> nodeIds;
+ nodeIds.clear();
+ nodeIds.push_back(n1->getId());
+ nodeIds.push_back(n2->getId());
+ nodeIds.push_back(n12->getId());
+
+ SMDS_MeshEdge * edge = 0;
+ SMDS_VtkEdge *edgevtk = myEdgePool->getNew();
+ edgevtk->init(nodeIds, this);
+ edge = edgevtk;
+ adjustmyCellsCapacity(ID);
+ myCells[ID] = edge;
+ myInfo.myNbQuadEdges++;
+
+ if (!registerElement(ID, edge)) {
+ RemoveElement(edge, false);
+ edge = NULL;
}
+ return edge;
+
}
// creation quadratic edges - not implemented
return 0;
}
- SMDS_QuadraticFaceOfNodes* face =
- new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n12,n23,n31);
+ else
+ {
+ // --- retrieve nodes ID
+ vector<vtkIdType> nodeIds;
+ nodeIds.clear();
+ nodeIds.push_back(n1->getId());
+ nodeIds.push_back(n2->getId());
+ nodeIds.push_back(n3->getId());
+ nodeIds.push_back(n12->getId());
+ nodeIds.push_back(n23->getId());
+ nodeIds.push_back(n31->getId());
+
+ SMDS_MeshFace * face = 0;
+ SMDS_VtkFace *facevtk = myFacePool->getNew();
+ facevtk->init(nodeIds, this);
+ face = facevtk;
adjustmyCellsCapacity(ID);
- myCells[ID] = face;
- myInfo.myNbQuadTriangles++;
+ myCells[ID] = face;
+ myInfo.myNbQuadTriangles++;
- if (!registerElement(ID, face)) {
- RemoveElement(face, false);
- face = NULL;
+ if (!registerElement(ID, face)) {
+ RemoveElement(face, false);
+ face = NULL;
+ }
+ return face;
}
- return face;
}
if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n34 || !n41) return 0;
if(hasConstructionEdges()) {
// creation quadratic edges - not implemented
+ return 0;
}
- SMDS_QuadraticFaceOfNodes* face =
- new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n4,n12,n23,n34,n41);
+ else
+ {
+ // --- retrieve nodes ID
+ vector<vtkIdType> nodeIds;
+ nodeIds.clear();
+ nodeIds.push_back(n1->getId());
+ nodeIds.push_back(n2->getId());
+ nodeIds.push_back(n3->getId());
+ nodeIds.push_back(n4->getId());
+ nodeIds.push_back(n12->getId());
+ nodeIds.push_back(n23->getId());
+ nodeIds.push_back(n34->getId());
+ nodeIds.push_back(n41->getId());
+
+ SMDS_MeshFace * face = 0;
+ SMDS_VtkFace *facevtk = myFacePool->getNew();
+ facevtk->init(nodeIds, this);
+ face = facevtk;
adjustmyCellsCapacity(ID);
- myCells[ID] = face;
- myInfo.myNbQuadQuadrangles++;
+ myCells[ID] = face;
+ myInfo.myNbQuadQuadrangles++;
- if (!registerElement(ID, face)) {
- RemoveElement(face, false);
- face = NULL;
+ if (!registerElement(ID, face)) {
+ RemoveElement(face, false);
+ face = NULL;
+ }
+ return face;
}
- return face;
}
// creation quadratic faces - not implemented
return 0;
}
- SMDS_QuadraticVolumeOfNodes * volume =
- new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34);
- adjustmyCellsCapacity(ID);
- myCells[ID] = volume;
+ // --- retrieve nodes ID
+ vector<vtkIdType> nodeIds;
+ nodeIds.clear();
+ nodeIds.push_back(n1->getId());
+ nodeIds.push_back(n3->getId());
+ nodeIds.push_back(n2->getId());
+ nodeIds.push_back(n4->getId());
+
+ nodeIds.push_back(n31->getId());
+ nodeIds.push_back(n23->getId());
+ nodeIds.push_back(n12->getId());
+
+ nodeIds.push_back(n14->getId());
+ nodeIds.push_back(n34->getId());
+ nodeIds.push_back(n24->getId());
+
+ SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+ volvtk->init(nodeIds, this);
+ adjustmyCellsCapacity(ID);
+ myCells[ID] = volvtk;
myInfo.myNbQuadTetras++;
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
+ if (!registerElement(ID, volvtk)) {
+ RemoveElement(volvtk, false);
+ volvtk = NULL;
}
- return volume;
+ return volvtk;
}
// creation quadratic faces - not implemented
return 0;
}
- SMDS_QuadraticVolumeOfNodes * volume =
- new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n12,n23,
- n34,n41,n15,n25,n35,n45);
- adjustmyCellsCapacity(ID);
- myCells[ID] = volume;
+ // --- retrieve nodes ID
+ vector<vtkIdType> nodeIds;
+ nodeIds.clear();
+ nodeIds.push_back(n1->getId());
+ nodeIds.push_back(n4->getId());
+ nodeIds.push_back(n3->getId());
+ nodeIds.push_back(n2->getId());
+ nodeIds.push_back(n5->getId());
+
+ nodeIds.push_back(n41->getId());
+ nodeIds.push_back(n34->getId());
+ nodeIds.push_back(n23->getId());
+ nodeIds.push_back(n12->getId());
+
+ nodeIds.push_back(n15->getId());
+ nodeIds.push_back(n45->getId());
+ nodeIds.push_back(n35->getId());
+ nodeIds.push_back(n25->getId());
+
+ SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+ volvtk->init(nodeIds, this);
+ adjustmyCellsCapacity(ID);
+ myCells[ID] = volvtk;
myInfo.myNbQuadPyramids++;
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
+ if (!registerElement(ID, volvtk)) {
+ RemoveElement(volvtk, false);
+ volvtk = NULL;
}
- return volume;
+ return volvtk;
}
// creation quadratic faces - not implemented
return 0;
}
- SMDS_QuadraticVolumeOfNodes * volume =
- new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n12,n23,n31,
- n45,n56,n64,n14,n25,n36);
- adjustmyCellsCapacity(ID);
- myCells[ID] = volume;
+ // --- retrieve nodes ID
+ vector<vtkIdType> nodeIds;
+ nodeIds.clear();
+ nodeIds.push_back(n1->getId());
+ nodeIds.push_back(n2->getId());
+ nodeIds.push_back(n3->getId());
+
+ nodeIds.push_back(n4->getId());
+ nodeIds.push_back(n5->getId());
+ nodeIds.push_back(n6->getId());
+
+ nodeIds.push_back(n12->getId());
+ nodeIds.push_back(n23->getId());
+ nodeIds.push_back(n31->getId());
+
+ nodeIds.push_back(n45->getId());
+ nodeIds.push_back(n56->getId());
+ nodeIds.push_back(n64->getId());
+
+ nodeIds.push_back(n14->getId());
+ nodeIds.push_back(n25->getId());
+ nodeIds.push_back(n36->getId());
+
+ SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+ volvtk->init(nodeIds, this);
+ adjustmyCellsCapacity(ID);
+ myCells[ID] = volvtk;
myInfo.myNbQuadPrisms++;
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
+ if (!registerElement(ID, volvtk)) {
+ RemoveElement(volvtk, false);
+ volvtk = NULL;
}
- return volume;
+ return volvtk;
}
return 0;
// creation quadratic faces - not implemented
}
- SMDS_QuadraticVolumeOfNodes * volume =
- new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
- n56,n67,n78,n85,n15,n26,n37,n48);
- adjustmyCellsCapacity(ID);
- myCells[ID] = volume;
+ // --- retrieve nodes ID
+ vector<vtkIdType> nodeIds;
+ nodeIds.clear();
+ nodeIds.push_back(n1->getId());
+ nodeIds.push_back(n4->getId());
+ nodeIds.push_back(n3->getId());
+ nodeIds.push_back(n2->getId());
+
+ nodeIds.push_back(n5->getId());
+ nodeIds.push_back(n8->getId());
+ nodeIds.push_back(n7->getId());
+ nodeIds.push_back(n6->getId());
+
+ nodeIds.push_back(n41->getId());
+ nodeIds.push_back(n34->getId());
+ nodeIds.push_back(n23->getId());
+ nodeIds.push_back(n12->getId());
+
+ nodeIds.push_back(n85->getId());
+ nodeIds.push_back(n78->getId());
+ nodeIds.push_back(n67->getId());
+ nodeIds.push_back(n56->getId());
+
+ nodeIds.push_back(n15->getId());
+ nodeIds.push_back(n48->getId());
+ nodeIds.push_back(n37->getId());
+ nodeIds.push_back(n26->getId());
+
+ SMDS_VtkVolume *volvtk = myVolumePool->getNew();
+ volvtk->init(nodeIds, this);
+ adjustmyCellsCapacity(ID);
+ myCells[ID] = volvtk;
myInfo.myNbQuadHexas++;
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
+ if (!registerElement(ID, volvtk)) {
+ RemoveElement(volvtk, false);
+ volvtk = NULL;
}
- return volume;
+ return volvtk;
}
void SMDS_Mesh::updateNodeMinMax()
void SMDS_Mesh::dumpGrid(string ficdump)
{
MESSAGE("SMDS_Mesh::dumpGrid " << ficdump);
- vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
- aWriter->SetFileName(ficdump.c_str());
- aWriter->SetInput(myGrid);
- if(myGrid->GetNumberOfCells())
- {
- aWriter->Write();
- }
- aWriter->Delete();
+// vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
+// aWriter->SetFileName(ficdump.c_str());
+// aWriter->SetInput(myGrid);
+// if(myGrid->GetNumberOfCells())
+// {
+// aWriter->Write();
+// }
+// aWriter->Delete();
ficdump = ficdump + "_connectivity";
ofstream ficcon(ficdump.c_str(), ios::out);
int nbPoints = myGrid->GetNumberOfPoints();
ficcon << "-------------------------------- cells " << nbCells << endl;
for (int i=0; i<nbCells; i++)
{
+// MESSAGE(i << " " << myGrid->GetCell(i));
+// MESSAGE(" " << myGrid->GetCell(i)->GetCellType());
ficcon << i << " - " << myGrid->GetCell(i)->GetCellType() << " -";
int nbptcell = myGrid->GetCell(i)->GetNumberOfPoints();
vtkIdList *listid = myGrid->GetCell(i)->GetPointIds();