Salome HOME
As OCCT issue 0022809 has been fixed, remove temporary workaround in the Cartesian...
[modules/smesh.git] / src / StdMeshers / StdMeshers_ViscousLayers.cxx
index 4326b4f7aa2c63f46addb3800a7c256bffc34fec..ff812ac7b2c4a00969a86174c6ee9e150dfba0ac 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2011  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2012  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
@@ -15,6 +15,7 @@
 // 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      : StdMeshers_ViscousLayers.cxx
 // Created   : Wed Dec  1 15:15:34 2010
@@ -122,7 +123,9 @@ namespace VISCOUS
    */
   class _SrinkShapeListener : SMESH_subMeshEventListener
   {
-    _SrinkShapeListener(): SMESH_subMeshEventListener(/*isDeletable=*/false) {}
+    _SrinkShapeListener()
+      : SMESH_subMeshEventListener(/*isDeletable=*/false,
+                                   "StdMeshers_ViscousLayers::_SrinkShapeListener") {}
     static SMESH_subMeshEventListener* Get() { static _SrinkShapeListener l; return &l; }
   public:
     virtual void ProcessEvent(const int                       event,
@@ -162,7 +165,9 @@ namespace VISCOUS
    */
   class _ViscousListener : SMESH_subMeshEventListener
   {
-    _ViscousListener(): SMESH_subMeshEventListener(/*isDeletable=*/false) {}
+    _ViscousListener():
+      SMESH_subMeshEventListener(/*isDeletable=*/false,
+                                 "StdMeshers_ViscousLayers::_ViscousListener") {}
     static SMESH_subMeshEventListener* Get() { static _ViscousListener l; return &l; }
   public:
     virtual void ProcessEvent(const int                       event,
@@ -522,7 +527,8 @@ namespace VISCOUS
     virtual SMDSAbs_ElementType  GetType() const              { return SMDSAbs_Face; }
     virtual vtkIdType GetVtkType() const                      { return -1; }
     virtual SMDSAbs_EntityType   GetEntityType() const        { return SMDSEntity_Last; }
-    virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const
+    virtual SMDSAbs_GeometryType GetGeomType() const          { return SMDSGeom_TRIANGLE; }
+virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const
     { return SMDS_ElemIteratorPtr( new SMDS_NodeVectorElemIterator( _nn.begin(), _nn.end()));}
   };
   //--------------------------------------------------------------------------------
@@ -3454,6 +3460,7 @@ bool _ViscousBuilder::shrink()
   }
 
   SMESH_MesherHelper helper( *_mesh );
+  helper.ToFixNodeParameters( true );
 
   // EDGE's to shrink
   map< int, _Shrinker1D > e2shrMap;
@@ -4432,6 +4439,8 @@ bool _ViscousBuilder::addBoundaryElements()
         F = e2f->second.Oriented( TopAbs_FORWARD );
         reverse = ( helper.GetSubShapeOri( F, E ) == TopAbs_REVERSED );
         if ( helper.GetSubShapeOri( data._solid, F ) == TopAbs_REVERSED )
+          reverse = !reverse, F.Reverse();
+        if ( SMESH_Algo::IsReversedSubMesh( TopoDS::Face(F), getMeshDS() ))
           reverse = !reverse;
       }
       else
@@ -4463,12 +4472,28 @@ bool _ViscousBuilder::addBoundaryElements()
         vector< const SMDS_MeshNode*>&  nn1 = ledges[j-dj1]->_nodes;
         vector< const SMDS_MeshNode*>&  nn2 = ledges[j-dj2]->_nodes;
         if ( isOnFace )
-          for ( unsigned z = 1; z < nn1.size(); ++z )
+          for ( size_t z = 1; z < nn1.size(); ++z )
             sm->AddElement( getMeshDS()->AddFace( nn1[z-1], nn2[z-1], nn2[z], nn1[z] ));
         else
-          for ( unsigned z = 1; z < nn1.size(); ++z )
+          for ( size_t z = 1; z < nn1.size(); ++z )
             sm->AddElement( new SMDS_FaceOfNodes( nn1[z-1], nn2[z-1], nn2[z], nn1[z]));
       }
+
+      // Make edges
+      for ( int isFirst = 0; isFirst < 2; ++isFirst )
+      {
+        _LayerEdge* edge = isFirst ? ledges.front() : ledges.back();
+        if ( !edge->_sWOL.IsNull() && edge->_sWOL.ShapeType() == TopAbs_EDGE )
+        {
+          vector< const SMDS_MeshNode*>&  nn = edge->_nodes;
+          if ( nn[1]->GetInverseElementIterator( SMDSAbs_Edge )->more() )
+            continue;
+          helper.SetSubShape( edge->_sWOL );
+          helper.SetElementsOnShape( true );
+          for ( size_t z = 1; z < nn.size(); ++z )
+            helper.AddEdge( nn[z-1], nn[z] );
+        }
+      }
     }
   }