예제 #1
0
    class VtkType(elements.ElementType):
        """
    Class defining a VTK element type
    """

        _vtkTypeIdToElementTypeId = { \
            VTK_UNKNOWN:elements.ELEMENT_UNKNOWN, \
            VTK_EMPTY_CELL:elements.ELEMENT_EMPTY, \
            VTK_VERTEX:elements.ELEMENT_VERTEX, \
            VTK_LINE:elements.ELEMENT_LINE, VTK_QUADRATIC_LINE:elements.ELEMENT_QUADRATIC_LINE, \
            VTK_TRIANGLE:elements.ELEMENT_TRIANGLE, VTK_QUADRATIC_TRIANGLE:elements.ELEMENT_QUADRATIC_TRIANGLE, VTK_QUAD:elements.ELEMENT_QUAD, \
            VTK_TETRAHEDRON:elements.ELEMENT_TETRAHEDRON, VTK_QUADRATIC_TETRAHEDRON:elements.ELEMENT_QUADRATIC_TETRAHEDRON, VTK_HEXAHEDRON:elements.ELEMENT_HEXAHEDRON \
          }
        _elementTypeIdToVtkTypeId = utils.DictInverse(
            _vtkTypeIdToElementTypeId)

        def __init__(self, dim=None, nodeCount=None, vtkTypeId=None):
            if vtkTypeId is None:
                elements.ElementType.__init__(self,
                                              dim=dim,
                                              nodeCount=nodeCount)
            else:
                elements.ElementType.__init__(
                    self,
                    elementTypeId=self._vtkTypeIdToElementTypeId[vtkTypeId])

            self._UpdateVtkTypeId()
            self.RegisterEventHandler("elementTypeIdChange",
                                      self._UpdateVtkTypeId)

            return

        def _UpdateVtkTypeId(self):
            """
      Update the VTK type ID to reflect the element type ID
      """

            self._vtkTypeId = self._elementTypeIdToVtkTypeId[
                self._elementTypeId]

            return

        def GetVtkTypeId(self):
            return self._vtkTypeId

        def SetVtkTypeId(self, vtkTypeId):
            self.SetElementTypeId(self._vtkTypeIdToElementTypeId[vtkTypeId])

            return
예제 #2
0
class GmshElementType(elements.ElementType):
    """
  Class defining a Gmsh element type
  """

    _gmshElementTypeIdToElementTypeId = { \
        GMSH_UNKNOWN:elements.ELEMENT_UNKNOWN, \
        GMSH_LINE:elements.ELEMENT_LINE, \
        GMSH_TRIANGLE:elements.ELEMENT_TRIANGLE, GMSH_QUAD:elements.ELEMENT_QUAD, \
        GMSH_TETRAHEDRON:elements.ELEMENT_TETRAHEDRON, GMSH_HEXAHEDRON:elements.ELEMENT_HEXAHEDRON, \
        GMSH_POINT:elements.ELEMENT_VERTEX
      }
    _elementTypeIdToGmshElementTypeId = utils.DictInverse(
        _gmshElementTypeIdToElementTypeId)

    def __init__(self, dim=None, nodeCount=None, gmshElementTypeId=None):
        if gmshElementTypeId is None:
            elements.ElementType.__init__(self, dim=dim, nodeCount=nodeCount)
        else:
            elements.ElementType.__init__(
                self,
                elementTypeId=self.
                _gmshElementTypeIdToElementTypeId[gmshElementTypeId])

        self._UpdateGmshElementTypeId()
        self.RegisterEventHandler("elementTypeIdChange",
                                  self._UpdateGmshElementTypeId)

        return

    def _UpdateGmshElementTypeId(self):
        """
    Update the Gmsh type ID to reflect the element type ID
    """

        self._gmshElementTypeId = self._elementTypeIdToGmshElementTypeId[
            self._elementTypeId]

        return

    def GetGmshElementTypeId(self):
        return self._gmshElementTypeId

    def SetGmshElementTypeId(self, gmshElementTypeId):
        self.SetElementTypeId(
            self._gmshElementTypeIdToElementTypeId[gmshElementTypeId])

        return
예제 #3
0
class ElementType(events.Evented):
  """
  Class defining an element type
  """

  _elementTypeIdsMap = {
      (0, 0):ELEMENT_EMPTY, \
      (0, 1):ELEMENT_VERTEX, \
      (1, 2):ELEMENT_LINE, (1, 3):ELEMENT_QUADRATIC_LINE, \
      (2, 3):ELEMENT_TRIANGLE, (2, 6):ELEMENT_QUADRATIC_TRIANGLE, (2, 4):ELEMENT_QUAD, \
      (3, 4):ELEMENT_TETRAHEDRON, (3, 10):ELEMENT_QUADRATIC_TETRAHEDRON, (3, 8):ELEMENT_HEXAHEDRON \
    }
  _elementTypeIdsMapInverse = utils.DictInverse(_elementTypeIdsMap)

  _elementDegreeMap = {
      ELEMENT_EMPTY:0, \
      ELEMENT_VERTEX:0, \
      ELEMENT_LINE:1, ELEMENT_QUADRATIC_LINE:2, \
      ELEMENT_TRIANGLE:1, ELEMENT_QUADRATIC_TRIANGLE:2, ELEMENT_QUAD:1, \
      ELEMENT_TETRAHEDRON:1, ELEMENT_QUADRATIC_TETRAHEDRON:2, ELEMENT_HEXAHEDRON:1 \
    }

  _elementFamilyIdMap = {
      ELEMENT_EMPTY:ELEMENT_FAMILY_UNKNOWN, \
      ELEMENT_VERTEX:ELEMENT_FAMILY_SIMPLEX, \
      ELEMENT_LINE:ELEMENT_FAMILY_SIMPLEX, ELEMENT_QUADRATIC_LINE:ELEMENT_FAMILY_SIMPLEX, \
      ELEMENT_TRIANGLE:ELEMENT_FAMILY_SIMPLEX, ELEMENT_QUADRATIC_TRIANGLE:ELEMENT_FAMILY_SIMPLEX, ELEMENT_QUAD:ELEMENT_FAMILY_CUBIC, \
      ELEMENT_TETRAHEDRON:ELEMENT_FAMILY_SIMPLEX, ELEMENT_QUADRATIC_TETRAHEDRON:ELEMENT_FAMILY_SIMPLEX, ELEMENT_HEXAHEDRON:ELEMENT_FAMILY_CUBIC \
    }
    
  def __init__(self, dim = None, nodeCount = None, elementTypeId = None):
    events.Evented.__init__(self, ["elementTypeIdChange"])
    
    if dim is None:
      assert(nodeCount is None)
      assert(not elementTypeId is None)
      self.SetElementTypeId(elementTypeId)
    else:
      assert(not nodeCount is None)
      assert(elementTypeId is None)
      assert(dim >= 0)
      assert(nodeCount >= 0)
      self._SetElementTypeIdFromData(dim, nodeCount)
      self._dim, self._nodeCount = dim, nodeCount
      
    return
    
  def __str__(self):
    return "Element type: " + str(self.GetNodeCount()) + " nodes, " + str(self.GetDim()) + " dimensions"
    
  def _SetElementTypeIdFromData(self, dim, nodeCount):
    if (dim, nodeCount) in self._elementTypeIdsMap:
      self._elementTypeId = self._elementTypeIdsMap[(dim, nodeCount)]
    else:
      debug.deprint("Warning: Unknown element type with " + str(nodeCount) + " nodes in " + str(dim) + " dimensions")
      self._elementTypeId = ELEMENT_UNKNOWN
    
    self._RaiseEvent("elementTypeIdChange")
    
    return
    
  def GetElementTypeId(self):
    return self._elementTypeId
    
  def SetElementTypeId(self, elementTypeId):  
    self._dim, self._nodeCount = self._elementTypeIdsMapInverse[elementTypeId]
    self._elementTypeId = elementTypeId
    
    self._RaiseEvent("elementTypeIdChange")
    
    return
    
  def GetDim(self):
    return self._dim
    
  def SetDim(self, dim):
    self._SetElementTypeIdFromData(dim, self.GetNodeCount())
    assert(dim >= 0)
    self._dim = dim
    
    return
    
  def GetNodeCount(self):
    return self._nodeCount
    
  def SetNodeCount(self, nodeCount):
    self._SetElementTypeIdFromData(self.GetDim(), nodeCount)
    assert(nodeCount >= 0)
    self._nodeCount = nodeCount
    
    return
    
  def GetDegree(self):
    return self._elementDegreeMap[self.GetElementTypeId()]
    
  def GetElementFamilyId(self):
    return self._elementFamilyIdMap[self.GetElementTypeId()]