Salome HOME
Copyrights update 2013
[modules/smesh.git] / src / SMDS / SMDS_Downward.cxx
index 19ca4b24e6399e1c6ffe7d0543e241300617bfcb..6b8a1b7e5d97d86cb41074769465b15089d405df 100644 (file)
@@ -1,9 +1,25 @@
-/*
- * SMDS_Downward.cxx
- *
- *  Created on: Jun 3, 2010
- *      Author: prascle
- */
+// Copyright (C) 2010-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// 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.
+//
+// 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
+//
+
+// File: SMDS_Downward.cxx
+// Created: Jun 3, 2010
+// Author: prascle
 
 #include "SMDS_Downward.hxx"
 #include "SMDS_Mesh.hxx"
@@ -36,14 +52,17 @@ int SMDS_Downward::getCellDimension(unsigned char cellType)
       _cellDimension[VTK_QUADRATIC_TRIANGLE] = 2;
       _cellDimension[VTK_QUAD] = 2;
       _cellDimension[VTK_QUADRATIC_QUAD] = 2;
+      _cellDimension[VTK_BIQUADRATIC_QUAD] = 2;
       _cellDimension[VTK_TETRA] = 3;
       _cellDimension[VTK_QUADRATIC_TETRA] = 3;
       _cellDimension[VTK_HEXAHEDRON] = 3;
       _cellDimension[VTK_QUADRATIC_HEXAHEDRON] = 3;
+      _cellDimension[VTK_TRIQUADRATIC_HEXAHEDRON] = 3;
       _cellDimension[VTK_WEDGE] = 3;
       _cellDimension[VTK_QUADRATIC_WEDGE] = 3;
       _cellDimension[VTK_PYRAMID] = 3;
       _cellDimension[VTK_QUADRATIC_PYRAMID] = 3;
+      _cellDimension[VTK_HEXAGONAL_PRISM] = 3;
     }
   return _cellDimension[cellType];
 }
@@ -63,23 +82,7 @@ SMDS_Downward::SMDS_Downward(SMDS_UnstructuredGrid *grid, int nbDownCells) :
   this->_cellIds.clear();
   this->_cellTypes.clear();
   if (_cellDimension.empty())
-    {
-      _cellDimension.resize(VTK_MAXTYPE + 1, 0);
-      _cellDimension[VTK_LINE] = 1;
-      _cellDimension[VTK_QUADRATIC_EDGE] = 1;
-      _cellDimension[VTK_TRIANGLE] = 2;
-      _cellDimension[VTK_QUADRATIC_TRIANGLE] = 2;
-      _cellDimension[VTK_QUAD] = 2;
-      _cellDimension[VTK_QUADRATIC_QUAD] = 2;
-      _cellDimension[VTK_TETRA] = 3;
-      _cellDimension[VTK_QUADRATIC_TETRA] = 3;
-      _cellDimension[VTK_HEXAHEDRON] = 3;
-      _cellDimension[VTK_QUADRATIC_HEXAHEDRON] = 3;
-      _cellDimension[VTK_WEDGE] = 3;
-      _cellDimension[VTK_QUADRATIC_WEDGE] = 3;
-      _cellDimension[VTK_PYRAMID] = 3;
-      _cellDimension[VTK_QUADRATIC_PYRAMID] = 3;
-    }
+    getCellDimension( VTK_LINE );
 }
 
 SMDS_Downward::~SMDS_Downward()
@@ -800,7 +803,6 @@ void SMDS_Down3D::getNodeIds(int cellId, std::set<int>& nodeSet)
 int SMDS_Down3D::FindFaceByNodes(int cellId, ElemByNodesType& faceByNodes)
 {
   int *faces = &_cellIds[_nbDownCells * cellId];
-  int faceNodeSet[10];
   int npoints = 0;
 
   for (int i = 0; i < _nbDownCells; i++)
@@ -808,11 +810,7 @@ int SMDS_Down3D::FindFaceByNodes(int cellId, ElemByNodesType& faceByNodes)
       if ((faces[i] >= 0) && (faceByNodes.vtkType == _cellTypes[i]))
         {
           if (npoints == 0)
-            {
-              for (int j = 0; j < faceByNodes.nbNodes; j++)
-                faceNodeSet[j] = faceByNodes.nodeIds[j];
-              npoints = faceByNodes.nbNodes;
-            }
+            npoints = faceByNodes.nbNodes;
 
           int nodeSet[10];
           int npts = this->_grid->getDownArray(faceByNodes.vtkType)->getNodeSet(faces[i], nodeSet);
@@ -1364,6 +1362,7 @@ void SMDS_DownPyramid::getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>&
   set<int> tofind;
   int ids[16] = { 0, 1, 2, 3,   0, 3, 4,   3, 2, 4,   2, 1, 4,   1, 0, 4 };
 
+  // Quadrangular face
   tofind.clear();
   for (int i = 0; i < 4; i++)
     tofind.insert(nodes[ids[i]]);
@@ -1373,6 +1372,7 @@ void SMDS_DownPyramid::getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>&
         orderedNodes[i] = nodes[ids[i]];
       return;
     }
+  // Triangular faces
   for (int k = 0; k < 4; k++)
     {
       tofind.clear();
@@ -1491,6 +1491,7 @@ SMDS_DownQuadPyramid::~SMDS_DownQuadPyramid()
 
 void SMDS_DownQuadPyramid::getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& orderedNodes)
 {
+//   MESSAGE("SMDS_DownQuadPyramid::getOrderedNodesOfFace cellId = " << cellId);
   set<int> setNodes;
   setNodes.clear();
   for (int i = 0; i < orderedNodes.size(); i++)
@@ -1505,8 +1506,9 @@ void SMDS_DownQuadPyramid::getOrderedNodesOfFace(int cellId, std::vector<vtkIdTy
   int ids[32] = { 0, 1, 2, 3, 5, 6, 7, 8,
                   0, 3, 4, 8, 12, 9,   3, 2, 4, 7 , 11, 12,   2, 1, 4, 6, 10, 11,   1, 0, 4, 5, 9, 10 };
 
+  // Quadrangular face
   tofind.clear();
-  for (int i = 0; i < 4; i++)
+  for (int i = 0; i < 8; i++)
     tofind.insert(nodes[ids[i]]);
   if (setNodes == tofind)
     {
@@ -1514,6 +1516,7 @@ void SMDS_DownQuadPyramid::getOrderedNodesOfFace(int cellId, std::vector<vtkIdTy
         orderedNodes[i] = nodes[ids[i]];
       return;
     }
+  // Triangular faces
   for (int k = 0; k < 4; k++)
     {
       tofind.clear();
@@ -1527,7 +1530,7 @@ void SMDS_DownQuadPyramid::getOrderedNodesOfFace(int cellId, std::vector<vtkIdTy
         }
     }
   MESSAGE("=== Problem volume " << _vtkCellIds[cellId] << " " << _grid->_mesh->fromVtkToSmds(_vtkCellIds[cellId]));
-  MESSAGE(orderedNodes[0] << " " << orderedNodes[1] << " " << orderedNodes[2]);
+  MESSAGE(orderedNodes[0] << " " << orderedNodes[1] << " " << orderedNodes[2] << " " << orderedNodes[3]);
   MESSAGE(nodes[0] << " " << nodes[1] << " " << nodes[2] << " " << nodes[3]);
 }
 
@@ -1663,6 +1666,7 @@ void SMDS_DownPenta::getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& o
 //int ids[18] = { 0, 2, 1,  3, 4, 5,   0, 1, 4, 3,   1, 2, 5, 4,   2, 0, 3, 5 };
   int ids[18] = { 0, 1, 2,  3, 5, 4,   0, 3, 4, 1,   1, 4, 5, 2,   2, 5, 3, 0 };
 
+  // Triangular faces
   for (int k = 0; k < 2; k++)
     {
       tofind.clear();
@@ -1675,6 +1679,7 @@ void SMDS_DownPenta::getOrderedNodesOfFace(int cellId, std::vector<vtkIdType>& o
           return;
         }
     }
+  // Quadrangular faces
   for (int k = 0; k < 3; k++)
     {
       tofind.clear();
@@ -1812,6 +1817,7 @@ void SMDS_DownQuadPenta::getOrderedNodesOfFace(int cellId, std::vector<vtkIdType
   int ids[36] = { 0, 1, 2, 6, 7, 8,  3, 5, 4, 11, 10, 9,
                   0, 3, 4, 1, 12, 9, 13, 6,   1, 4, 5, 2, 13, 10, 14, 7,   2, 5, 3, 0, 14, 11, 12, 8 };
 
+  // Triangular faces
   for (int k = 0; k < 2; k++)
     {
       tofind.clear();
@@ -1824,6 +1830,7 @@ void SMDS_DownQuadPenta::getOrderedNodesOfFace(int cellId, std::vector<vtkIdType
           return;
         }
     }
+  // Quadrangular faces
   for (int k = 0; k < 3; k++)
     {
       tofind.clear();