X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSMDS%2FSMDS_Mesh.cxx;h=44d4259b219dde3ba1266b1496f394ff18d4c8c2;hb=a331960039452a99397aa0374c40b933bcc4daac;hp=5df2090e9abbf6bb74a520d9de7e39c21d042e58;hpb=4ff5bd61540272713e48de1eee75625028c32155;p=modules%2Fsmesh.git diff --git a/src/SMDS/SMDS_Mesh.cxx b/src/SMDS/SMDS_Mesh.cxx index 5df2090e9..44d4259b2 100644 --- a/src/SMDS/SMDS_Mesh.cxx +++ b/src/SMDS/SMDS_Mesh.cxx @@ -17,7 +17,7 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com #ifdef _MSC_VER #pragma warning(disable:4786) @@ -39,6 +39,61 @@ #include using namespace std; +#ifndef WIN32 +#include +#endif + +//================================================================================ +/*! + * \brief Raise an exception if free memory (ram+swap) too low + * \param doNotRaise - if true, suppres exception, just return free memory size + * \retval int - amount of available memory in MB or negative number in failure case + */ +//================================================================================ + +int SMDS_Mesh::CheckMemory(const bool doNotRaise) throw (std::bad_alloc) +{ +#ifndef WIN32 + struct sysinfo si; + int err = sysinfo( &si ); + if ( err ) + return -1; + + static int limit = -1; + if ( limit < 0 ) { + int status = system("SMDS_MemoryLimit"); // it returns lower limit of free RAM + if (status >= 0 ) { + limit = WEXITSTATUS(status); + } + if ( limit < 20 ) + limit = 20; + else + limit = int( limit * 1.5 ); +#ifdef _DEBUG_ + cout << "SMDS_Mesh::CheckMemory() memory limit = " << limit << " MB" << endl; +#endif + } + + const unsigned long Mbyte = 1024 * 1024; + // compute separately to avoid overflow + int freeMb = + ( si.freeram * si.mem_unit ) / Mbyte + + ( si.freeswap * si.mem_unit ) / Mbyte; + + if ( freeMb > limit ) + return freeMb - limit; + + if ( doNotRaise ) + return 0; +#ifdef _DEBUG_ + cout<<"SMDS_Mesh::CheckMemory() throws as free memory too low: " << freeMb <<" MB" << endl; +#endif + throw std::bad_alloc(); +#else + return -1; +#endif +} + /////////////////////////////////////////////////////////////////////////////// /// Create a new mesh object /////////////////////////////////////////////////////////////////////////////// @@ -96,9 +151,11 @@ SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID) // find the MeshNode corresponding to ID const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID); if(!node){ + CheckMemory(); SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z); myNodes.Add(node); myNodeIDFactory->BindID(ID,node); + myInfo.myNbNodes++; return node; }else return NULL; @@ -141,6 +198,9 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, int ID) { + if ( !n1 || !n2 ) return 0; + + CheckMemory(); SMDS_MeshEdge * edge=new SMDS_MeshEdge(n1,n2); if(myElementIDFactory->BindID(ID, edge)) { SMDS_MeshNode *node1,*node2; @@ -149,6 +209,7 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, node1->AddInverseElement(edge); node2->AddInverseElement(edge); myEdges.Add(edge); + myInfo.myNbEdges++; return edge; } else { @@ -193,7 +254,7 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, { SMDS_MeshFace * face=createTriangle(n1, n2, n3); - if (!registerElement(ID, face)) { + if (face && !registerElement(ID, face)) { RemoveElement(face, false); face = NULL; } @@ -244,7 +305,7 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, { SMDS_MeshFace * face=createQuadrangle(n1, n2, n3, n4); - if (!registerElement(ID, face)) { + if (face && !registerElement(ID, face)) { RemoveElement(face, false); face = NULL; } @@ -276,8 +337,12 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, { if (!hasConstructionEdges()) return NULL; + if ( !e1 || !e2 || !e3 ) return 0; + + CheckMemory(); SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3); myFaces.Add(face); + myInfo.myNbTriangles++; if (!registerElement(ID, face)) { RemoveElement(face, false); @@ -313,8 +378,11 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, { if (!hasConstructionEdges()) return NULL; + if ( !e1 || !e2 || !e3 || !e4 ) return 0; + CheckMemory(); SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3,e4); myFaces.Add(face); + myInfo.myNbQuadrangles++; if (!registerElement(ID, face)) { @@ -374,7 +442,9 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n4, int ID) { - SMDS_MeshVolume* volume; + SMDS_MeshVolume* volume = 0; + if ( !n1 || !n2 || !n3 || !n4) return volume; + CheckMemory(); if(hasConstructionFaces()) { SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n4); @@ -382,6 +452,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, SMDS_MeshFace * f4=FindFaceOrCreate(n2,n3,n4); volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); myVolumes.Add(volume); + myInfo.myNbTetras++; } else if(hasConstructionEdges()) { MESSAGE("Error : Not implemented"); @@ -390,6 +461,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, else { volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4); myVolumes.Add(volume); + myInfo.myNbTetras++; } if (!registerElement(ID, volume)) { @@ -456,7 +528,9 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n5, int ID) { - SMDS_MeshVolume* volume; + SMDS_MeshVolume* volume = 0; + if ( !n1 || !n2 || !n3 || !n4 || !n5) return volume; + CheckMemory(); if(hasConstructionFaces()) { SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n5); @@ -464,6 +538,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, SMDS_MeshFace * f4=FindFaceOrCreate(n3,n4,n5); volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); myVolumes.Add(volume); + myInfo.myNbPyramids++; } else if(hasConstructionEdges()) { MESSAGE("Error : Not implemented"); @@ -472,6 +547,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, else { volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5); myVolumes.Add(volume); + myInfo.myNbPyramids++; } if (!registerElement(ID, volume)) { @@ -542,7 +618,9 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n6, int ID) { - SMDS_MeshVolume* volume; + SMDS_MeshVolume* volume = 0; + if ( !n1 || !n2 || !n3 || !n4 || !n5 || !n6) return volume; + CheckMemory(); if(hasConstructionFaces()) { SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); SMDS_MeshFace * f2=FindFaceOrCreate(n4,n5,n6); @@ -551,6 +629,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, SMDS_MeshFace * f5=FindFaceOrCreate(n3,n6,n4,n1); volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); myVolumes.Add(volume); + myInfo.myNbPrisms++; } else if(hasConstructionEdges()) { MESSAGE("Error : Not implemented"); @@ -559,6 +638,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, else { volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6); myVolumes.Add(volume); + myInfo.myNbPrisms++; } if (!registerElement(ID, volume)) { @@ -640,7 +720,9 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n8, int ID) { - SMDS_MeshVolume* volume; + SMDS_MeshVolume* volume = 0; + if ( !n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n7 || !n8) return volume; + CheckMemory(); if(hasConstructionFaces()) { SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); SMDS_MeshFace * f2=FindFaceOrCreate(n5,n6,n7,n8); @@ -650,6 +732,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, SMDS_MeshFace * f6=FindFaceOrCreate(n3,n4,n8,n7); volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); myVolumes.Add(volume); + myInfo.myNbHexas++; } else if(hasConstructionEdges()) { MESSAGE("Error : Not implemented"); @@ -659,6 +742,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, // volume=new SMDS_HexahedronOfNodes(n1,n2,n3,n4,n5,n6,n7,n8); volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8); myVolumes.Add(volume); + myInfo.myNbHexas++; } if (!registerElement(ID, volume)) { @@ -697,8 +781,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, { if (!hasConstructionFaces()) return NULL; + if ( !f1 || !f2 || !f3 || !f4) return 0; + CheckMemory(); SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4); myVolumes.Add(volume); + myInfo.myNbTetras++; if (!registerElement(ID, volume)) { RemoveElement(volume, false); @@ -738,8 +825,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, { if (!hasConstructionFaces()) return NULL; + if ( !f1 || !f2 || !f3 || !f4 || !f5) return 0; + CheckMemory(); SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); myVolumes.Add(volume); + myInfo.myNbPyramids++; if (!registerElement(ID, volume)) { RemoveElement(volume, false); @@ -781,8 +871,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, { if (!hasConstructionFaces()) return NULL; + if ( !f1 || !f2 || !f3 || !f4 || !f5 || !f6) return 0; + CheckMemory(); SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); myVolumes.Add(volume); + myInfo.myNbPrisms++; if (!registerElement(ID, volume)) { RemoveElement(volume, false); @@ -817,6 +910,7 @@ SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID { SMDS_MeshFace * face; + CheckMemory(); if (hasConstructionEdges()) { MESSAGE("Error : Not implemented"); @@ -824,8 +918,11 @@ SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID } else { + for ( int i = 0; i < nodes.size(); ++i ) + if ( !nodes[ i ] ) return 0; face = new SMDS_PolygonalFaceOfNodes(nodes); myFaces.Add(face); + myInfo.myNbPolygons++; } if (!registerElement(ID, face)) { @@ -878,6 +975,7 @@ SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID const int ID) { SMDS_MeshVolume* volume; + CheckMemory(); if (hasConstructionFaces()) { MESSAGE("Error : Not implemented"); return NULL; @@ -885,8 +983,11 @@ SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID MESSAGE("Error : Not implemented"); return NULL; } else { + for ( int i = 0; i < nodes.size(); ++i ) + if ( !nodes[ i ] ) return 0; volume = new SMDS_PolyhedralVolumeOfNodes(nodes, quantities); myVolumes.Add(volume); + myInfo.myNbPolyhedrons++; } if (!registerElement(ID, volume)) { @@ -944,23 +1045,27 @@ SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1, const SMDS_MeshNode * node2, const SMDS_MeshNode * node3) { - if(hasConstructionEdges()) - { - SMDS_MeshEdge *edge1, *edge2, *edge3; - edge1=FindEdgeOrCreate(node1,node2); - edge2=FindEdgeOrCreate(node2,node3); - edge3=FindEdgeOrCreate(node3,node1); - - SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3); - myFaces.Add(face); - return face; - } - else - { - SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3); - myFaces.Add(face); - return face; - } + if ( !node1 || !node2 || !node3) return 0; + CheckMemory(); + if(hasConstructionEdges()) + { + SMDS_MeshEdge *edge1, *edge2, *edge3; + edge1=FindEdgeOrCreate(node1,node2); + edge2=FindEdgeOrCreate(node2,node3); + edge3=FindEdgeOrCreate(node3,node1); + + SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3); + myFaces.Add(face); + myInfo.myNbTriangles++; + return face; + } + else + { + SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3); + myFaces.Add(face); + myInfo.myNbTriangles++; + return face; + } } /////////////////////////////////////////////////////////////////////////////// @@ -972,24 +1077,28 @@ SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1, const SMDS_MeshNode * node3, const SMDS_MeshNode * node4) { - if(hasConstructionEdges()) - { - SMDS_MeshEdge *edge1, *edge2, *edge3, *edge4; - edge1=FindEdgeOrCreate(node1,node2); - edge2=FindEdgeOrCreate(node2,node3); - edge3=FindEdgeOrCreate(node3,node4); - edge4=FindEdgeOrCreate(node4,node1); - - SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3,edge4); - myFaces.Add(face); - return face; - } - else - { - SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3,node4); - myFaces.Add(face); - return face; - } + if ( !node1 || !node2 || !node3 || !node4 ) return 0; + CheckMemory(); + if(hasConstructionEdges()) + { + SMDS_MeshEdge *edge1, *edge2, *edge3, *edge4; + edge1=FindEdgeOrCreate(node1,node2); + edge2=FindEdgeOrCreate(node2,node3); + edge3=FindEdgeOrCreate(node3,node4); + edge4=FindEdgeOrCreate(node4,node1); + + SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3,edge4); + myFaces.Add(face); + myInfo.myNbQuadrangles++; + return face; + } + else + { + SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3,node4); + myFaces.Add(face); + myInfo.myNbQuadrangles++; + return face; + } } /////////////////////////////////////////////////////////////////////////////// @@ -1067,73 +1176,52 @@ bool SMDS_Mesh::RemoveSubMesh(const SMDS_Mesh * aMesh) //purpose : //======================================================================= -bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, +bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * element, const SMDS_MeshNode * nodes[], const int nbnodes) { // keep current nodes of elem set oldNodes; - SMDS_ElemIteratorPtr itn = elem->nodesIterator(); + SMDS_ElemIteratorPtr itn = element->nodesIterator(); while(itn->more()) oldNodes.insert( itn->next() ); + if ( !element->IsPoly() ) + myInfo.remove( element ); // element may change type + // change nodes bool Ok = false; + SMDS_MeshElement* elem = const_cast(element); switch ( elem->GetType() ) { case SMDSAbs_Edge: { if ( nbnodes == 2 ) { - const SMDS_MeshEdge* edge = dynamic_cast( elem ); - if ( edge ) - Ok = const_cast( edge )->ChangeNodes( nodes[0], nodes[1] ); + if ( SMDS_MeshEdge* edge = dynamic_cast( elem )) + Ok = edge->ChangeNodes( nodes[0], nodes[1] ); } else if ( nbnodes == 3 ) { - const SMDS_QuadraticEdge* edge = dynamic_cast( elem ); - if ( edge ) - Ok = const_cast( edge )->ChangeNodes( nodes[0], nodes[1], nodes[2] ); + if ( SMDS_QuadraticEdge* edge = dynamic_cast( elem )) + Ok = edge->ChangeNodes( nodes[0], nodes[1], nodes[2] ); } break; } case SMDSAbs_Face: { - const SMDS_FaceOfNodes* face = dynamic_cast( elem ); - if ( face ) { - Ok = const_cast( face )->ChangeNodes( nodes, nbnodes ); - } - else { - const SMDS_QuadraticFaceOfNodes* QF = - dynamic_cast( elem ); - if ( QF ) { - Ok = const_cast( QF )->ChangeNodes( nodes, nbnodes ); - } - else { - /// ??? begin - const SMDS_PolygonalFaceOfNodes* face = dynamic_cast(elem); - if (face) { - Ok = const_cast(face)->ChangeNodes(nodes, nbnodes); - } - /// ??? end - } - } + if ( SMDS_FaceOfNodes* face = dynamic_cast( elem )) + Ok = face->ChangeNodes( nodes, nbnodes ); + else + if ( SMDS_QuadraticFaceOfNodes* QF = dynamic_cast( elem )) + Ok = QF->ChangeNodes( nodes, nbnodes ); + else + if (SMDS_PolygonalFaceOfNodes* face = dynamic_cast(elem)) + Ok = face->ChangeNodes(nodes, nbnodes); break; } - //case SMDSAbs_PolygonalFace: { - // const SMDS_PolygonalFaceOfNodes* face = dynamic_cast(elem); - // if (face) { - // Ok = const_cast(face)->ChangeNodes(nodes, nbnodes); - // } - // break; - //} case SMDSAbs_Volume: { - const SMDS_VolumeOfNodes* vol = dynamic_cast( elem ); - if ( vol ) { - Ok = const_cast( vol )->ChangeNodes( nodes, nbnodes ); - } - else { - const SMDS_QuadraticVolumeOfNodes* QV = dynamic_cast( elem ); - if ( QV ) { - Ok = const_cast( QV )->ChangeNodes( nodes, nbnodes ); - } - } + if ( SMDS_VolumeOfNodes* vol = dynamic_cast( elem )) + Ok = vol->ChangeNodes( nodes, nbnodes ); + else + if ( SMDS_QuadraticVolumeOfNodes* QV = dynamic_cast( elem )) + Ok = QV->ChangeNodes( nodes, nbnodes ); break; } default: @@ -1142,18 +1230,19 @@ bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, if ( Ok ) { // update InverseElements + set::iterator it; + // AddInverseElement to new nodes - for ( int i = 0; i < nbnodes; i++ ) - if ( oldNodes.find( nodes[i] ) == oldNodes.end() ) + for ( int i = 0; i < nbnodes; i++ ) { + it = oldNodes.find( nodes[i] ); + if ( it == oldNodes.end() ) // new node const_cast( nodes[i] )->AddInverseElement( elem ); else // remove from oldNodes a node that remains in elem - oldNodes.erase( nodes[i] ); - - + oldNodes.erase( it ); + } // RemoveInverseElement from the nodes removed from elem - set::iterator it; for ( it = oldNodes.begin(); it != oldNodes.end(); it++ ) { SMDS_MeshNode * n = static_cast @@ -1162,7 +1251,8 @@ bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, } } - //MESSAGE ( "::ChangeNodes() Ok = " << Ok); + if ( !element->IsPoly() ) + myInfo.add( element ); // element may change type return Ok; } @@ -1171,9 +1261,9 @@ bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem, //function : ChangePolyhedronNodes //purpose : to change nodes of polyhedral volume //======================================================================= -bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem, - std::vector nodes, - std::vector quantities) +bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem, + const vector& nodes, + const vector & quantities) { if (elem->GetType() != SMDSAbs_Volume) { MESSAGE("WRONG ELEM TYPE"); @@ -1202,18 +1292,19 @@ bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem, // AddInverseElement to new nodes int nbnodes = nodes.size(); + set::iterator it; for (int i = 0; i < nbnodes; i++) { - if (oldNodes.find(nodes[i]) == oldNodes.end()) { + it = oldNodes.find(nodes[i]); + if (it == oldNodes.end()) { // new node const_cast(nodes[i])->AddInverseElement(elem); } else { // remove from oldNodes a node that remains in elem - oldNodes.erase(nodes[i]); + oldNodes.erase(it); } } // RemoveInverseElement from the nodes removed from elem - set::iterator it; for (it = oldNodes.begin(); it != oldNodes.end(); it++) { SMDS_MeshNode * n = static_cast (const_cast( *it )); @@ -1241,20 +1332,18 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2) const const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, const SMDS_MeshNode * node2) { + if ( !node1 ) return 0; const SMDS_MeshEdge * toReturn=NULL; //PROFILER_Init(); //PROFILER_Set(); - SMDS_ElemIteratorPtr it1=node1->edgesIterator(); + SMDS_ElemIteratorPtr it1=node1->GetInverseElementIterator(SMDSAbs_Edge); //PROFILER_Get(0); //PROFILER_Set(); while(it1->more()) { - const SMDS_MeshEdge * e=static_cast (it1->next()); - SMDS_ElemIteratorPtr it2=e->nodesIterator(); - while(it2->more()) { - if(it2->next()->GetID()==node2->GetID()) { - toReturn = e; - break; - } + const SMDS_MeshElement * e = it1->next(); + if ( e->NbNodes() == 2 && e->GetNodeIndex( node2 ) >= 0 ) { + toReturn = static_cast( e ); + break; } } //PROFILER_Get(1); @@ -1270,12 +1359,15 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1, const SMDS_MeshNode * node2) { + if ( !node1 || !node2) return 0; SMDS_MeshEdge * toReturn=NULL; toReturn=const_cast(FindEdge(node1,node2)); if(toReturn==NULL) { + CheckMemory(); toReturn=new SMDS_MeshEdge(node1,node2); myEdges.Add(toReturn); - } + myInfo.myNbEdges++; + } return toReturn; } @@ -1291,7 +1383,6 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2, const SMDS_MeshNode * node1=FindNode(idnode1); const SMDS_MeshNode * node2=FindNode(idnode2); const SMDS_MeshNode * node3=FindNode(idnode3); - if( (node1==NULL) || (node2==NULL) || (node3==NULL) ) return NULL; return FindEdge(node1,node2,node3); } @@ -1299,24 +1390,27 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, const SMDS_MeshNode * node2, const SMDS_MeshNode * node3) { - const SMDS_MeshEdge * toReturn = NULL; - SMDS_ElemIteratorPtr it1 = node1->edgesIterator(); + if ( !node1 ) return 0; + SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Edge); while(it1->more()) { - const SMDS_MeshEdge * e = static_cast (it1->next()); - SMDS_ElemIteratorPtr it2 = e->nodesIterator(); - int tmp = 0; - while(it2->more()) { - int nID = it2->next()->GetID(); - if( nID==node2->GetID() || nID==node3->GetID() ) { - tmp++; - if(tmp==2) { - toReturn = e; + const SMDS_MeshElement * e = it1->next(); + if ( e->NbNodes() == 3 ) { + SMDS_ElemIteratorPtr it2 = e->nodesIterator(); + while(it2->more()) { + const SMDS_MeshElement* n = it2->next(); + if( n!=node1 && + n!=node2 && + n!=node3 ) + { + e = 0; break; } } + if ( e ) + return static_cast (e); } } - return toReturn; + return 0; } @@ -1331,7 +1425,6 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, const SMDS_MeshNode * node1=FindNode(idnode1); const SMDS_MeshNode * node2=FindNode(idnode2); const SMDS_MeshNode * node3=FindNode(idnode3); - if( (node1==NULL) || (node2==NULL) || (node3==NULL) ) return NULL; return FindFace(node1, node2, node3); } @@ -1339,26 +1432,27 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1, const SMDS_MeshNode *node2, const SMDS_MeshNode *node3) { - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - bool node2found, node3found; - - SMDS_ElemIteratorPtr it1 = node1->facesIterator(); + if ( !node1 ) return 0; + SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); while(it1->more()) { - face = static_cast(it1->next()); - if(face->NbNodes()!=3) continue; - SMDS_ElemIteratorPtr it2 = face->nodesIterator(); - node2found = false; - node3found = false; - while(it2->more()) { - node = it2->next(); - if(node->GetID()==node2->GetID()) node2found = true; - if(node->GetID()==node3->GetID()) node3found = true; + const SMDS_MeshElement * e = it1->next(); + if ( e->NbNodes() == 3 ) { + SMDS_ElemIteratorPtr it2 = e->nodesIterator(); + while(it2->more()) { + const SMDS_MeshElement* n = it2->next(); + if( n!=node1 && + n!=node2 && + n!=node3 ) + { + e = 0; + break; + } + } + if ( e ) + return static_cast (e); } - if( node2found && node3found ) - return face; } - return NULL; + return 0; } SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1, @@ -1386,8 +1480,6 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, const SMDS_MeshNode * node2=FindNode(idnode2); const SMDS_MeshNode * node3=FindNode(idnode3); const SMDS_MeshNode * node4=FindNode(idnode4); - if( (node1==NULL) || (node2==NULL) || (node3==NULL) || (node4==NULL) ) - return NULL; return FindFace(node1, node2, node3, node4); } @@ -1396,27 +1488,28 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1, const SMDS_MeshNode *node3, const SMDS_MeshNode *node4) { - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - bool node2found, node3found, node4found; - SMDS_ElemIteratorPtr it1 = node1->facesIterator(); + if ( !node1 ) return 0; + SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); while(it1->more()) { - face = static_cast(it1->next()); - if(face->NbNodes()!=4) continue; - SMDS_ElemIteratorPtr it2 = face->nodesIterator(); - node2found = false; - node3found = false; - node4found = false; - while(it2->more()) { - node=it2->next(); - if(node->GetID()==node2->GetID()) node2found = true; - if(node->GetID()==node3->GetID()) node3found = true; - if(node->GetID()==node4->GetID()) node4found = true; + const SMDS_MeshElement * e = it1->next(); + if ( e->NbNodes() == 4 ) { + SMDS_ElemIteratorPtr it2 = e->nodesIterator(); + while(it2->more()) { + const SMDS_MeshElement* n = it2->next(); + if( n!=node1 && + n!=node2 && + n!=node3 && + n!=node4 ) + { + e = 0; + break; + } + } + if ( e ) + return static_cast (e); } - if( node2found && node3found && node4found ) - return face; } - return NULL; + return 0; } SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(const SMDS_MeshNode *node1, @@ -1448,8 +1541,6 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, const SMDS_MeshNode * node4 = FindNode(idnode4); const SMDS_MeshNode * node5 = FindNode(idnode5); const SMDS_MeshNode * node6 = FindNode(idnode6); - if( (node1==NULL) || (node2==NULL) || (node3==NULL) || - (node4==NULL) || (node5==NULL) || (node6==NULL) ) return NULL; return FindFace(node1, node2, node3, node4, node5, node6); } @@ -1460,26 +1551,30 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1, const SMDS_MeshNode *node5, const SMDS_MeshNode *node6) { - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - SMDS_ElemIteratorPtr it1 = node1->facesIterator(); + if ( !node1 ) return 0; + SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); while(it1->more()) { - face = static_cast(it1->next()); - if(face->NbNodes()!=6) continue; - SMDS_ElemIteratorPtr it2 = face->nodesIterator(); - int tmp = 0; - while(it2->more()) { - node = it2->next(); - if(node->GetID()==node2->GetID()) tmp++; - if(node->GetID()==node3->GetID()) tmp++; - if(node->GetID()==node4->GetID()) tmp++; - if(node->GetID()==node5->GetID()) tmp++; - if(node->GetID()==node6->GetID()) tmp++; + const SMDS_MeshElement * e = it1->next(); + if ( e->NbNodes() == 6 ) { + SMDS_ElemIteratorPtr it2 = e->nodesIterator(); + while(it2->more()) { + const SMDS_MeshElement* n = it2->next(); + if( n!=node1 && + n!=node2 && + n!=node3 && + n!=node4 && + n!=node5 && + n!=node6 ) + { + e = 0; + break; + } + } + if ( e ) + return static_cast (e); } - if( tmp==5 ) - return static_cast(face); } - return NULL; + return 0; } @@ -1501,9 +1596,6 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, const SMDS_MeshNode * node6 = FindNode(idnode6); const SMDS_MeshNode * node7 = FindNode(idnode7); const SMDS_MeshNode * node8 = FindNode(idnode8); - if( (node1==NULL) || (node2==NULL) || (node3==NULL) || (node4==NULL) || - (node5==NULL) || (node6==NULL) || (node7==NULL) || (node8==NULL) ) - return NULL; return FindFace(node1, node2, node3, node4, node5, node6, node7, node8); } @@ -1516,28 +1608,32 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(const SMDS_MeshNode *node1, const SMDS_MeshNode *node7, const SMDS_MeshNode *node8) { - const SMDS_MeshFace * face; - const SMDS_MeshElement * node; - SMDS_ElemIteratorPtr it1 = node1->facesIterator(); + if ( !node1 ) return 0; + SMDS_ElemIteratorPtr it1 = node1->GetInverseElementIterator(SMDSAbs_Face); while(it1->more()) { - face = static_cast(it1->next()); - if(face->NbNodes()!=8) continue; - SMDS_ElemIteratorPtr it2 = face->nodesIterator(); - int tmp = 0; - while(it2->more()) { - node = it2->next(); - if(node->GetID()==node2->GetID()) tmp++; - if(node->GetID()==node3->GetID()) tmp++; - if(node->GetID()==node4->GetID()) tmp++; - if(node->GetID()==node5->GetID()) tmp++; - if(node->GetID()==node6->GetID()) tmp++; - if(node->GetID()==node7->GetID()) tmp++; - if(node->GetID()==node8->GetID()) tmp++; + const SMDS_MeshElement * e = it1->next(); + if ( e->NbNodes() == 8 ) { + SMDS_ElemIteratorPtr it2 = e->nodesIterator(); + while(it2->more()) { + const SMDS_MeshElement* n = it2->next(); + if( n!=node1 && + n!=node2 && + n!=node3 && + n!=node4 && + n!=node5 && + n!=node6 && + n!=node7 && + n!=node8 ) + { + e = 0; + break; + } + } + if ( e ) + return static_cast (e); } - if( tmp==7 ) - return face; } - return NULL; + return 0; } @@ -1569,34 +1665,23 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector nodes_ids) const const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector nodes) { - int nbNodes = nodes.size(); - if (nbNodes < 1) return NULL; - - bool isFound = true; - const SMDS_MeshFace * face; - set faces; - - for (int inode = 0; inode < nbNodes && isFound; inode++) { - set new_faces; - - SMDS_ElemIteratorPtr itF = nodes[inode]->facesIterator(); + if ( nodes.size() > 2 && nodes[0] ) { + SMDS_ElemIteratorPtr itF = nodes[0]->GetInverseElementIterator(SMDSAbs_Face); while (itF->more()) { - face = static_cast(itF->next()); - if (face->NbNodes() == nbNodes) { - if (inode == 0 || faces.find(face) != faces.end()) { - new_faces.insert(face); + const SMDS_MeshElement* f = itF->next(); + if ( f->NbNodes() == nodes.size() ) { + SMDS_ElemIteratorPtr it2 = f->nodesIterator(); + while(it2->more()) { + if ( find( nodes.begin(), nodes.end(), it2->next() ) == nodes.end() ) { + f = 0; + break; + } } + if ( f ) + return static_cast (f); } } - faces = new_faces; - if (new_faces.size() == 0) { - isFound = false; - } } - - if (isFound) - return face; - return NULL; } @@ -2204,14 +2289,17 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, case SMDSAbs_Edge: myEdges.Remove(static_cast (const_cast(*it))); + myInfo.RemoveEdge(*it); break; case SMDSAbs_Face: myFaces.Remove(static_cast (const_cast(*it))); + myInfo.RemoveFace(*it); break; case SMDSAbs_Volume: myVolumes.Remove(static_cast (const_cast(*it))); + myInfo.RemoveVolume(*it); break; } //MESSAGE( "SMDS: RM elem " << (*it)->GetID() ); @@ -2230,6 +2318,7 @@ void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, //MESSAGE( "SMDS: RM node " << (*it)->GetID() ); myNodes.Remove(static_cast (const_cast(*it))); + myInfo.myNbNodes--; myNodeIDFactory->ReleaseID((*it)->GetID()); removedNodes.push_back( (*it) ); delete *it; @@ -2254,6 +2343,7 @@ void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem) SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator(); if (!itFe->more()) { // free node myNodes.Remove(const_cast(n)); + myInfo.myNbNodes--; myNodeIDFactory->ReleaseID(elem->GetID()); delete elem; } @@ -2275,14 +2365,17 @@ void SMDS_Mesh::RemoveFreeElement(const SMDS_MeshElement * elem) case SMDSAbs_Edge: myEdges.Remove(static_cast (const_cast(elem))); + myInfo.RemoveEdge(elem); break; case SMDSAbs_Face: myFaces.Remove(static_cast (const_cast(elem))); + myInfo.RemoveFace(elem); break; case SMDSAbs_Volume: myVolumes.Remove(static_cast (const_cast(elem))); + myInfo.RemoveVolume(elem); break; default: break; @@ -2435,11 +2528,11 @@ SMDSAbs_ElementType SMDS_Mesh::GetElementType( const int id, const bool iselem ) //======================================================================= SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int n1, int n2, int n12, int ID) { - SMDS_MeshNode* node1 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1); - SMDS_MeshNode* node2 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2); - SMDS_MeshNode* node12 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12); - if(!node1 || !node2 || !node12) return NULL; - return SMDS_Mesh::AddEdgeWithID(node1, node2, node12, ID); + return SMDS_Mesh::AddEdgeWithID + ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12), + ID); } //======================================================================= @@ -2462,6 +2555,7 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n12, 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; @@ -2472,6 +2566,7 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, node2->AddInverseElement(edge); node12->AddInverseElement(edge); myEdges.Add(edge); + myInfo.myNbQuadEdges++; return edge; } else { @@ -2503,15 +2598,14 @@ SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n12,int n23,int n31, int ID) { - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2); - SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3); - SMDS_MeshNode * node12 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12); - SMDS_MeshNode * node23 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23); - SMDS_MeshNode * node31 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n31); - if(!node1 || !node2 || !node3 || !node12 || !node23 || !node31) return NULL; - return SMDS_Mesh::AddFaceWithID(node1, node2, node3, - node12, node23, node31, ID); + return SMDS_Mesh::AddFaceWithID + ((SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1) , + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2) , + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3) , + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12), + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23), + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n31), + ID); } //======================================================================= @@ -2526,12 +2620,15 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n31, int ID) { + if ( !n1 || !n2 || !n3 || !n12 || !n23 || !n31) return 0; if(hasConstructionEdges()) { // creation quadratic edges - not implemented + return 0; } SMDS_QuadraticFaceOfNodes* face = new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n12,n23,n31); myFaces.Add(face); + myInfo.myNbQuadTriangles++; if (!registerElement(ID, face)) { RemoveElement(face, false); @@ -2565,18 +2662,16 @@ SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int n12,int n23,int n34,int n41, int ID) { - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2); - SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3); - SMDS_MeshNode * node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n4); - SMDS_MeshNode * node12 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12); - SMDS_MeshNode * node23 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23); - SMDS_MeshNode * node34 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n34); - SMDS_MeshNode * node41 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n41); - if(!node1 || !node2 || !node3 || !node4 || - !node12 || !node23 || !node34 || !node41) return NULL; - return SMDS_Mesh::AddFaceWithID(node1, node2, node3, node4, - node12, node23, node34, node41, ID); + return SMDS_Mesh::AddFaceWithID + ((SMDS_MeshNode *)myNodeIDFactory->MeshElement(n1) , + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n2) , + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n3) , + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n4) , + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n12), + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n23), + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n34), + (SMDS_MeshNode *)myNodeIDFactory->MeshElement(n41), + ID); } //======================================================================= @@ -2593,12 +2688,14 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n41, int ID) { + if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n34 || !n41) return 0; if(hasConstructionEdges()) { // creation quadratic edges - not implemented } SMDS_QuadraticFaceOfNodes* face = new SMDS_QuadraticFaceOfNodes(n1,n2,n3,n4,n12,n23,n34,n41); myFaces.Add(face); + myInfo.myNbQuadQuadrangles++; if (!registerElement(ID, face)) { RemoveElement(face, false); @@ -2638,24 +2735,20 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n12,int n23,int n31, int n14,int n24,int n34, int ID) { - SMDS_MeshNode *node1, *node2, *node3, *node4, *node12, *node23; - SMDS_MeshNode *node31, *node14, *node24, *node34; - node1 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1); - node2 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2); - node3 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3); - node4 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4); - node12 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12); - node23 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23); - node31 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31); - node14 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14); - node24 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n24); - node34 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34); - if( !node1 || !node2 || !node3 || !node4 || !node12 || !node23 || - !node31 || !node14 || !node24 || !node34 ) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node12, node23, - node31, node14, node24, node34, ID); + return SMDS_Mesh::AddVolumeWithID + ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n24), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34), + ID); } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order tetrahedron of 10 nodes @@ -2672,12 +2765,16 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n34, int ID) { + if ( !n1 || !n2 || !n3 || !n4 || !n12 || !n23 || !n31 || !n14 || !n24 || !n34) + return 0; if(hasConstructionFaces()) { // creation quadratic faces - not implemented + return 0; } SMDS_QuadraticVolumeOfNodes * volume = new SMDS_QuadraticVolumeOfNodes(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34); myVolumes.Add(volume); + myInfo.myNbQuadTetras++; if (!registerElement(ID, volume)) { RemoveElement(volume, false); @@ -2721,30 +2818,23 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int int n12,int n23,int n34,int n41, int n15,int n25,int n35,int n45, int ID) { - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5; - SMDS_MeshNode *node12, *node23, *node34, *node41; - SMDS_MeshNode *node15, *node25, *node35, *node45; - node1 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1); - node2 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2); - node3 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3); - node4 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4); - node5 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5); - node12 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12); - node23 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23); - node34 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34); - node41 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41); - node15 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15); - node25 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25); - node35 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n35); - node45 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45); - if( !node1 || !node2 || !node3 || !node4 || !node5 || - !node12 || !node23 || !node34 || !node41 || - !node15 || !node25 || !node35 || !node45 ) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, - node12, node23, node34, node41, - node15, node25, node35, node45, ID); + return SMDS_Mesh::AddVolumeWithID + ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n35), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45), + ID); } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order pyramid of 13 nodes @@ -2764,13 +2854,18 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n45, int ID) { + if (!n1 || !n2 || !n3 || !n4 || !n5 || !n12 || !n23 || + !n34 || !n41 || !n15 || !n25 || !n35 || !n45) + return 0; if(hasConstructionFaces()) { // 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); myVolumes.Add(volume); + myInfo.myNbQuadPyramids++; if (!registerElement(ID, volume)) { RemoveElement(volume, false); @@ -2818,33 +2913,25 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n45,int n56,int n64, int n14,int n25,int n36, int ID) { - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6; - SMDS_MeshNode *node12, *node23, *node31; - SMDS_MeshNode *node45, *node56, *node64; - SMDS_MeshNode *node14, *node25, *node36; - node1 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1); - node2 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2); - node3 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3); - node4 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4); - node5 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5); - node6 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6); - node12 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12); - node23 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23); - node31 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31); - node45 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45); - node56 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56); - node64 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n64); - node14 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14); - node25 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25); - node36 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n36); - if( !node1 || !node2 || !node3 || !node4 || !node5 || !node6 || - !node12 || !node23 || !node31 || !node45 || !node56 || - !node64 || !node14 || !node25 || !node36 ) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, - node12, node23, node31, node45, node56, - node64, node14, node25, node36, ID); + return SMDS_Mesh::AddVolumeWithID + ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6) , + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n31), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n45), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n64), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n14), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n25), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n36), + ID); } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order Pentahedron with 15 nodes @@ -2866,13 +2953,18 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n36, int ID) { + if (!n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n12 || !n23 || + !n31 || !n45 || !n56 || !n64 || !n14 || !n25 || !n36) + return 0; if(hasConstructionFaces()) { // 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); myVolumes.Add(volume); + myInfo.myNbQuadPrisms++; if (!registerElement(ID, volume)) { RemoveElement(volume, false); @@ -2925,43 +3017,30 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n56,int n67,int n78,int n85, int n15,int n26,int n37,int n48, int ID) { - SMDS_MeshNode *node1, *node2, *node3, *node4; - SMDS_MeshNode *node5, *node6, *node7, *node8; - SMDS_MeshNode *node12, *node23, *node34, *node41; - SMDS_MeshNode *node56, *node67, *node78, *node85; - SMDS_MeshNode *node15, *node26, *node37, *node48; - node1 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1); - node2 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2); - node3 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3); - node4 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4); - node5 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5); - node6 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6); - node7 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n7); - node8 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n8); - node12 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12); - node23 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23); - node34 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34); - node41 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41); - node56 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56); - node67 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n67); - node78 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n78); - node85 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n85); - node15 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15); - node26 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n26); - node37 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n37); - node48 = (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n48); - if( !node1 || !node2 || !node3 || !node4 || - !node5 || !node6 || !node7 || !node8 || - !node12 || !node23 || !node34 || !node41 || - !node56 || !node67 || !node78 || !node85 || - !node15 || !node26 || !node37 || !node48 ) return NULL; - return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, - node5, node6, node7, node8, - node12, node23, node34, node41, - node56, node67, node78, node85, - node15, node26, node37, node48, ID); + return SMDS_Mesh::AddVolumeWithID + ((SMDS_MeshNode*) myNodeIDFactory->MeshElement(n1), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n2), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n3), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n4), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n5), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n6), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n7), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n8), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n12), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n23), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n34), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n41), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n56), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n67), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n78), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n85), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n15), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n26), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n37), + (SMDS_MeshNode*) myNodeIDFactory->MeshElement(n48), + ID); } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order Hexahedrons with 20 nodes @@ -2988,13 +3067,18 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, const SMDS_MeshNode * n48, int ID) { + if (!n1 || !n2 || !n3 || !n4 || !n5 || !n6 || !n7 || !n8 || !n12 || !n23 || + !n34 || !n41 || !n56 || !n67 || !n78 || !n85 || !n15 || !n26 || !n37 || !n48) + return 0; if(hasConstructionFaces()) { + 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); myVolumes.Add(volume); + myInfo.myNbQuadHexas++; if (!registerElement(ID, volume)) { RemoveElement(volume, false); @@ -3002,4 +3086,3 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, } return volume; } -