Salome HOME
0021543: EDF 1978 SMESH: Viscous layer for 2D meshes
[modules/smesh.git] / src / SMESHDS / SMESHDS_Mesh.cxx
index 7e625ecdef7ba8a9b3ed8e5493c4ea6740d69b6d..75e83be01d99bd8e12cf38120c31072de4e81e38 100644 (file)
@@ -1,30 +1,29 @@
-//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
 //
-//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 //
-//  This library is free software; you can redistribute it and/or
-//  modify it under the terms of the GNU Lesser General Public
-//  License as published by the Free Software Foundation; either
-//  version 2.1 of the License.
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
 //
-//  This library is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//  Lesser General Public License for more details.
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
 //
-//  You should have received a copy of the GNU Lesser General Public
-//  License along with this library; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+// You should have received a copy of the GNU Lesser General Public
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
 //  SMESH SMESHDS : management of mesh data and SMESH document
 //  File   : SMESH_Mesh.cxx
 //  Author : Yves FRICAUD, OCC
 //  Module : SMESH
-//  $Header: 
 //
 #include "SMESHDS_Mesh.hxx"
 
 #include "SMDS_SpacePosition.hxx"
 #include "SMDS_Downward.hxx"
 #include "SMESHDS_GroupOnGeom.hxx"
+#include "SMESHDS_Script.hxx"
 
 #include <Standard_ErrorHandler.hxx>
 #include <Standard_OutOfRange.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Face.hxx>
 #include <TopoDS_Iterator.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Solid.hxx>
+#include <TopoDS_Vertex.hxx>
 
 #include "utilities.h"
 
 using namespace std;
 
-/*Standard_Boolean IsEqual( const TopoDS_Shape& S1, const TopoDS_Shape& S2 ) 
-  {
-    return S1.IsSame( S2 );
-  }*/
-
 //=======================================================================
 //function : Create
 //purpose  : 
@@ -74,6 +74,8 @@ bool SMESHDS_Mesh::IsEmbeddedMode()
 //================================================================================
 /*!
  * \brief Store ID persistent during lifecycle
+ *
+ * Initially it was used to have a persistent reference to the mesh from the hypothesis
  */
 //================================================================================
 
@@ -303,10 +305,40 @@ SMDS_Mesh0DElement* SMESHDS_Mesh::Add0DElement(const SMDS_MeshNode * node)
   return anElem;
 }
 
+//=======================================================================
+//function :AddBallWithID
+//purpose  : 
+//=======================================================================
+
+SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(int node, double diameter, int ID)
+{
+  SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
+  if (anElem) myScript->AddBall(anElem->GetID(), node, diameter);
+  return anElem;
+}
+
+SMDS_BallElement* SMESHDS_Mesh::AddBallWithID(const SMDS_MeshNode * node,
+                                              double                diameter,
+                                              int                   ID)
+{
+  SMDS_BallElement* anElem = SMDS_Mesh::AddBallWithID(node,diameter,ID);
+  if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
+  return anElem;
+}
+
+SMDS_BallElement* SMESHDS_Mesh::AddBall (const SMDS_MeshNode * node,
+                                         double                diameter)
+{
+  SMDS_BallElement* anElem = SMDS_Mesh::AddBall(node,diameter);
+  if (anElem) myScript->AddBall(anElem->GetID(), node->GetID(), diameter);
+  return anElem;
+}
+
 //=======================================================================
 //function :AddEdgeWithID
 //purpose  : 
 //=======================================================================
+
 SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID)
 {
   SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID);
@@ -585,6 +617,81 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
   return anElem;
 }
 
+
+//=======================================================================
+//function :AddVolume
+//purpose  : add hexagonal prism
+//=======================================================================
+SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
+                                               int n5, int n6, int n7, int n8,
+                                               int n9, int n10, int n11, int n12,
+                                               int ID)
+{
+  SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, ID);
+  if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
+  return anElem;
+}
+
+SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+                                               const SMDS_MeshNode * n2,
+                                               const SMDS_MeshNode * n3,
+                                               const SMDS_MeshNode * n4,
+                                               const SMDS_MeshNode * n5,
+                                               const SMDS_MeshNode * n6,
+                                               const SMDS_MeshNode * n7,
+                                               const SMDS_MeshNode * n8, 
+                                               const SMDS_MeshNode * n9, 
+                                               const SMDS_MeshNode * n10, 
+                                               const SMDS_MeshNode * n11, 
+                                               const SMDS_MeshNode * n12, 
+                                               int ID)
+{
+  return AddVolumeWithID(n1->GetID(), 
+                         n2->GetID(),
+                         n3->GetID(),
+                         n4->GetID(),
+                         n5->GetID(),
+                         n6->GetID(),
+                         n7->GetID(),
+                         n8->GetID(),
+                         n9->GetID(),
+                         n10->GetID(),
+                         n11->GetID(),
+                         n12->GetID(),
+                         ID);
+}
+
+SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
+                                         const SMDS_MeshNode * n2,
+                                         const SMDS_MeshNode * n3,
+                                         const SMDS_MeshNode * n4,
+                                         const SMDS_MeshNode * n5,
+                                         const SMDS_MeshNode * n6,
+                                         const SMDS_MeshNode * n7,
+                                         const SMDS_MeshNode * n8, 
+                                         const SMDS_MeshNode * n9, 
+                                         const SMDS_MeshNode * n10, 
+                                         const SMDS_MeshNode * n11, 
+                                         const SMDS_MeshNode * n12)
+{
+  SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12);
+  if(anElem) myScript->AddVolume(anElem->GetID(), 
+                                 n1->GetID(),
+                                 n2->GetID(),
+                                 n3->GetID(),
+                                 n4->GetID(),
+                                 n5->GetID(),
+                                 n6->GetID(),
+                                 n7->GetID(),
+                                 n8->GetID(),
+                                 n9->GetID(),
+                                 n10->GetID(),
+                                 n11->GetID(),
+                                 n12->GetID());
+  return anElem;
+}
+
+
 //=======================================================================
 //function : AddPolygonalFace
 //purpose  : 
@@ -716,7 +823,7 @@ static void removeFromContainers (map<int,SMESHDS_SubMesh*>&     theSubMeshes,
   // Element should belong to only one sub-mesh
   if ( !theSubMeshes.empty() )
   {
-    SMESHDS_Mesh* mesh = theSubMeshes.begin()->second->getParent();
+    SMESHDS_Mesh* mesh = theSubMeshes.begin()->second->GetParent();
     list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
     if ( isNode ) {
       for ( ; elIt != theElems.end(); ++elIt )
@@ -896,7 +1003,7 @@ void SMESHDS_Mesh::ClearMesh()
 //================================================================================
 /*!
  * \brief return submesh by shape
-  * \param shape - the subshape
+  * \param shape - the sub-shape
   * \retval SMESHDS_SubMesh* - the found submesh
   *
  * search of submeshes is optimized
@@ -918,8 +1025,8 @@ SMESHDS_SubMesh* SMESHDS_Mesh::getSubmesh( const TopoDS_Shape & shape )
 
 //================================================================================
 /*!
- * \brief return submesh by subshape index
-  * \param Index - the subshape index
+ * \brief return submesh by sub-shape index
+  * \param Index - the sub-shape index
   * \retval SMESHDS_SubMesh* - the found submesh
  * search of submeshes is optimized
  */
@@ -1072,7 +1179,7 @@ TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const
 
 //=======================================================================
 //function : IsGroupOfSubShapes
-//purpose  : return true if at least one subshape of theShape is a subshape
+//purpose  : return true if at least one sub-shape of theShape is a sub-shape
 //           of myShape or theShape == myShape
 //=======================================================================
 
@@ -1143,6 +1250,21 @@ SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const
   return empty;
 }
 
+//================================================================================
+/*!
+ * \brief returns true if the hypothesis is assigned to any sub-shape
+ */
+//================================================================================
+
+bool SMESHDS_Mesh::IsUsedHypothesis(const SMESHDS_Hypothesis * H) const
+{
+  ShapeToHypothesis::Iterator s2h( myShapeToHypothesis );
+  for ( ; s2h.More(); s2h.Next() )
+    if ( std::find( s2h.Value().begin(), s2h.Value().end(), H ) != s2h.Value().end() )
+      return true;
+  return false;
+}
+
 //=======================================================================
 //function : GetScript
 //purpose  : 
@@ -1499,6 +1621,62 @@ SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
 }
 
 
+//=======================================================================
+//function : AddFace
+//purpose  : 
+//=======================================================================
+SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
+                                     const SMDS_MeshNode * n2,
+                                     const SMDS_MeshNode * n3,
+                                     const SMDS_MeshNode * n4,
+                                     const SMDS_MeshNode * n12,
+                                     const SMDS_MeshNode * n23,
+                                     const SMDS_MeshNode * n34,
+                                     const SMDS_MeshNode * n41, 
+                                     const SMDS_MeshNode * nCenter)
+{
+  SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
+  if(anElem) myScript->AddFace(anElem->GetID(), 
+                               n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
+                               n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
+                               nCenter->GetID());
+  return anElem;
+}
+
+//=======================================================================
+//function : AddFaceWithID
+//purpose  : 
+//=======================================================================
+SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4,
+                                           int n12,int n23,int n34,int n41,
+                                           int nCenter, int ID)
+{
+  SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1,n2,n3,n4,n12,n23,n34,n41,nCenter,ID);
+  if(anElem) myScript->AddFace(ID,n1,n2,n3,n4,n12,n23,n34,n41,nCenter);
+  return anElem;
+}
+
+//=======================================================================
+//function : AddFaceWithID
+//purpose  : 
+//=======================================================================
+SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
+                                           const SMDS_MeshNode * n2,
+                                           const SMDS_MeshNode * n3,
+                                           const SMDS_MeshNode * n4,
+                                           const SMDS_MeshNode * n12,
+                                           const SMDS_MeshNode * n23,
+                                           const SMDS_MeshNode * n34, 
+                                           const SMDS_MeshNode * n41, 
+                                           const SMDS_MeshNode * nCenter, 
+                                           int ID)
+{
+  return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
+                       n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
+                       nCenter->GetID(), ID);
+}
+
+
 //=======================================================================
 //function : AddVolume
 //purpose  : 
@@ -1711,7 +1889,7 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
 
 //=======================================================================
 //function : AddVolume
-//purpose  : 
+//purpose  : add quadratic hexahedron
 //=======================================================================
 SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
                                          const SMDS_MeshNode * n2, 
@@ -1801,6 +1979,117 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
                          ID);
 }
 
+//=======================================================================
+//function : AddVolume
+//purpose  : add tri-quadratic hexahedron of 27 nodes
+//=======================================================================
+
+SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
+                                         const SMDS_MeshNode * n2, 
+                                         const SMDS_MeshNode * n3,
+                                         const SMDS_MeshNode * n4,
+                                         const SMDS_MeshNode * n5, 
+                                         const SMDS_MeshNode * n6, 
+                                         const SMDS_MeshNode * n7,
+                                         const SMDS_MeshNode * n8, 
+                                         const SMDS_MeshNode * n12,
+                                         const SMDS_MeshNode * n23,
+                                         const SMDS_MeshNode * n34,
+                                         const SMDS_MeshNode * n41, 
+                                         const SMDS_MeshNode * n56,
+                                         const SMDS_MeshNode * n67,
+                                         const SMDS_MeshNode * n78,
+                                         const SMDS_MeshNode * n85, 
+                                         const SMDS_MeshNode * n15,
+                                         const SMDS_MeshNode * n26,
+                                         const SMDS_MeshNode * n37,
+                                         const SMDS_MeshNode * n48, 
+                                         const SMDS_MeshNode * n1234,
+                                         const SMDS_MeshNode * n1256,
+                                         const SMDS_MeshNode * n2367,
+                                         const SMDS_MeshNode * n3478,
+                                         const SMDS_MeshNode * n1458,
+                                         const SMDS_MeshNode * n5678,
+                                         const SMDS_MeshNode * nCenter)
+{
+  SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n5,n6,n7,n8,
+                                                 n12,n23,n34,n41,
+                                                 n56,n67,n78,n85,
+                                                 n15,n26,n37,n48,
+                                                 n1234,n1256,n2367,n3478,n1458,n5678,nCenter);
+  if(anElem)
+    myScript->AddVolume(anElem->GetID(), n1->GetID(), n2->GetID(),
+                        n3->GetID(), n4->GetID(), n5->GetID(),
+                        n6->GetID(), n7->GetID(), n8->GetID(),
+                        n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
+                        n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
+                        n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
+                        n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
+                        n1458->GetID(),n5678->GetID(),nCenter->GetID());
+  return anElem;
+}
+
+SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4,
+                                               int n5, int n6, int n7, int n8,
+                                               int n12,int n23,int n34,int n41,
+                                               int n56,int n67,int n78,int n85,
+                                               int n15,int n26,int n37,int n48,
+                                               int n1234,int n1256,int n2367,int n3478,
+                                               int n1458,int n5678,int nCenter,
+                                               int ID)
+{
+  SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1,n2,n3,n4,n5,n6,n7,n8,
+                                                       n12,n23,n34,n41,
+                                                       n56,n67,n78,n85,
+                                                       n15,n26,n37,n48,
+                                                       n1234, n1256, n2367, n3478,
+                                                       n1458, n5678, nCenter,
+                                                       ID);
+  if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n5,n6,n7,n8,n12,n23,n34,n41,
+                                 n56,n67,n78,n85,n15,n26,n37,n48,
+                                 n1234, n1256, n2367, n3478,
+                                 n1458, n5678, nCenter);
+  return anElem;
+}
+
+SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
+                                               const SMDS_MeshNode * n2,
+                                               const SMDS_MeshNode * n3,
+                                               const SMDS_MeshNode * n4,
+                                               const SMDS_MeshNode * n5, 
+                                               const SMDS_MeshNode * n6, 
+                                               const SMDS_MeshNode * n7,
+                                               const SMDS_MeshNode * n8, 
+                                               const SMDS_MeshNode * n12,
+                                               const SMDS_MeshNode * n23,
+                                               const SMDS_MeshNode * n34,
+                                               const SMDS_MeshNode * n41, 
+                                               const SMDS_MeshNode * n56,
+                                               const SMDS_MeshNode * n67,
+                                               const SMDS_MeshNode * n78,
+                                               const SMDS_MeshNode * n85, 
+                                               const SMDS_MeshNode * n15,
+                                               const SMDS_MeshNode * n26,
+                                               const SMDS_MeshNode * n37,
+                                               const SMDS_MeshNode * n48, 
+                                               const SMDS_MeshNode * n1234,
+                                               const SMDS_MeshNode * n1256,
+                                               const SMDS_MeshNode * n2367,
+                                               const SMDS_MeshNode * n3478,
+                                               const SMDS_MeshNode * n1458,
+                                               const SMDS_MeshNode * n5678,
+                                               const SMDS_MeshNode * nCenter,
+                                               int ID)
+{
+  return AddVolumeWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(),
+                         n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID(),
+                         n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(),
+                         n56->GetID(), n67->GetID(), n78->GetID(), n85->GetID(),
+                         n15->GetID(), n26->GetID(), n37->GetID(), n48->GetID(),
+                         n1234->GetID(),n1256->GetID(),n2367->GetID(),n3478->GetID(),
+                         n1458->GetID(),n5678->GetID(),nCenter->GetID(), ID);
+}
+
 void SMESHDS_Mesh::compactMesh()
 {
   int newNodeSize = 0;