-# Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2015 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
import salome
from salome.geom import geomBuilder
-import SMESH
+import SMESH, StdMeshers
## The base class to define meshing algorithms
#
# @code
# meshMethod = "MyAlgorithm"
# @endcode
-# then an instance of @c MyPlugin_Algorithm can be created by the direct invokation of the function
+# then an instance of @c MyPlugin_Algorithm can be created by the direct invocation of the function
# of smesh.Mesh class:
# @code
# my_algo = mesh.MyAlgorithm()
## Private method
def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so",
- UseExisting=0, CompareMethod=""):
+ UseExisting=0, CompareMethod="", toAdd=True):
from salome.smesh.smeshBuilder import TreatHypoStatus, GetName
hypo = None
if UseExisting:
geomName=""
if self.geom:
geomName = GetName(self.geom)
- status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
- TreatHypoStatus( status, GetName(hypo), geomName, 0 )
+ if toAdd:
+ status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
+ TreatHypoStatus( status, GetName(hypo), geomName, 0, self.mesh )
return hypo
## Returns entry of the shape to mesh in the study
## Defines "ViscousLayers" hypothesis to give parameters of layers of prisms to build
# near mesh boundary. This hypothesis can be used by several 3D algorithms:
- # NETGEN 3D, GHS3D, Hexahedron(i,j,k)
+ # NETGEN 3D, MG-Tetra, Hexahedron(i,j,k)
# @param thickness total thickness of layers of prisms
# @param numberOfLayers number of layers of prisms
# @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
# the value of \a isFacesToIgnore parameter.
# @param isFacesToIgnore if \c True, the Viscous layers are not generated on the
# faces specified by the previous parameter (\a faces).
+ # @param extrMethod extrusion method defines how position of new nodes are found during
+ # prism construction and how creation of distorted and intersecting prisms is
+ # prevented. Possible values are:
+ # - StdMeshers.SURF_OFFSET_SMOOTH (default) method extrudes nodes along normal
+ # to underlying geometrical surface. Smoothing of internal surface of
+ # element layers can be used to avoid creation of invalid prisms.
+ # - StdMeshers.FACE_OFFSET method extrudes nodes along average normal of
+ # surrounding mesh faces till intersection with a neighbor mesh face
+ # translated along its own normal by the layers thickness. Thickness
+ # of layers can be limited to avoid creation of invalid prisms.
+ # - StdMeshers.NODE_OFFSET method extrudes nodes along average normal of
+ # surrounding mesh faces by the layers thickness. Thickness of
+ # layers can be limited to avoid creation of invalid prisms.
# @ingroup l3_hypos_additi
def ViscousLayers(self, thickness, numberOfLayers, stretchFactor,
- faces=[], isFacesToIgnore=True ):
+ faces=[], isFacesToIgnore=True, extrMethod=StdMeshers.SURF_OFFSET_SMOOTH ):
if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo):
raise TypeError, "ViscousLayers are supported by 3D algorithms only"
if not "ViscousLayers" in self.GetCompatibleHypothesis():
raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ):
- faces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in faces ]
+ import GEOM
+ faceIDs = []
+ for f in faces:
+ if self.mesh.geompyD.ShapeIdToType( f.GetType() ) == "GROUP":
+ faceIDs += f.GetSubShapeIndices()
+ else:
+ faceIDs += [self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f)]
+ faces = faceIDs
hyp = self.Hypothesis("ViscousLayers",
- [thickness, numberOfLayers, stretchFactor, faces])
- hyp.SetTotalThickness(thickness)
- hyp.SetNumberLayers(numberOfLayers)
- hyp.SetStretchFactor(stretchFactor)
- hyp.SetFaces(faces, isFacesToIgnore)
+ [thickness, numberOfLayers, stretchFactor, faces, isFacesToIgnore],
+ toAdd=False)
+ hyp.SetTotalThickness( thickness )
+ hyp.SetNumberLayers( numberOfLayers )
+ hyp.SetStretchFactor( stretchFactor )
+ hyp.SetFaces( faces, isFacesToIgnore )
+ hyp.SetMethod( extrMethod )
+ self.mesh.AddHypothesis( hyp, self.geom )
return hyp
## Defines "ViscousLayers2D" hypothesis to give parameters of layers of quadrilateral
# elements to build near mesh boundary. This hypothesis can be used by several 2D algorithms:
- # NETGEN 2D, NETGEN 1D-2D, Quadrangle (mapping), MEFISTO, BLSURF
+ # NETGEN 2D, NETGEN 1D-2D, Quadrangle (mapping), MEFISTO, MG-CADSurf
# @param thickness total thickness of layers of quadrilaterals
# @param numberOfLayers number of layers
# @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
if edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ):
edges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in edges ]
hyp = self.Hypothesis("ViscousLayers2D",
- [thickness, numberOfLayers, stretchFactor,
- edges, isEdgesToIgnore])
+ [thickness, numberOfLayers, stretchFactor, edges, isEdgesToIgnore],
+ toAdd=False)
hyp.SetTotalThickness(thickness)
hyp.SetNumberLayers(numberOfLayers)
hyp.SetStretchFactor(stretchFactor)
hyp.SetEdges(edges, isEdgesToIgnore)
+ self.mesh.AddHypothesis( hyp, self.geom )
return hyp
## Transform a list of either edges or tuples (edge, 1st_vertex_of_edge)