FEM Mesh/en: Difference between revisions

From FreeCAD Documentation
(Importing a new version from external source)
(Importing a new version from external source)
Line 148: Line 148:
=== Script one Element of each supported Element Type ===
=== Script one Element of each supported Element Type ===
<syntaxhighlight>
<syntaxhighlight>

import Fem
import Fem
#################################################
#################################################
Line 155: Line 156:
seg2.addNode( 0, 0, 0, 1)
seg2.addNode( 0, 0, 0, 1)
seg2.addNode(10, 0, 0, 2)
seg2.addNode(10, 0, 0, 2)
seg2.addEdge( 1, 2)
seg2.addEdge(1, 2)
seg2
seg2
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","seg2")
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","seg2")
Line 174: Line 175:
tria3.addNode( 6, 12, 0, 2)
tria3.addNode( 6, 12, 0, 2)
tria3.addNode(12, 0, 0, 3)
tria3.addNode(12, 0, 0, 3)
tria3.addFace([ 1, 2, 3])
tria3.addFace([1, 2, 3])
tria3
tria3
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria3")
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria3")
Line 180: Line 181:
obj.Placement.Base = (0,80,0)
obj.Placement.Base = (0,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
# try to add Face with element nomber
elemtria3 = Fem.FemMesh()
nds = tria3.Nodes
for n in nds:
elemtria3.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtria3.addFace([1, 2, 3], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtria3")
obj.FemMesh = elemtria3
obj.Placement.Base = (200,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False




Line 190: Line 204:
tria6.addNode( 9, 6, 0, 5)
tria6.addNode( 9, 6, 0, 5)
tria6.addNode( 6, 0, 0, 6)
tria6.addNode( 6, 0, 0, 6)
tria6.addFace([ 1, 2, 3, 4, 5, 6])
tria6.addFace([1, 2, 3, 4, 5, 6])
tria6
tria6
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria6")
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria6")
Line 196: Line 210:
obj.Placement.Base = (30,80,0)
obj.Placement.Base = (30,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
# try to add Face with element nomber
elemtria6 = Fem.FemMesh()
nds = tria6.Nodes
for n in nds:
elemtria6.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtria6.addFace([1, 2, 3, 4, 5, 6], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtria6")
obj.FemMesh = elemtria6
obj.Placement.Base = (230,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False




Line 206: Line 233:
# quad4.addQuad( 1, 2, 3, 4) # without brackets
# quad4.addQuad( 1, 2, 3, 4) # without brackets
# addQuad adds a Face of four nodes --> see FmMeshPyImp.cpp --> redundant with addFace !
# addQuad adds a Face of four nodes --> see FmMeshPyImp.cpp --> redundant with addFace !
quad4.addFace([ 1, 2, 3, 4])
quad4.addFace([1, 2, 3, 4])
quad4
quad4
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad4")
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad4")
Line 212: Line 239:
obj.Placement.Base = (60,80,0)
obj.Placement.Base = (60,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
# try to add Face with element nomber
elemquad4 = Fem.FemMesh()
nds = quad4.Nodes
for n in nds:
elemquad4.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemquad4.addFace([1, 2, 3, 4], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemquad4")
obj.FemMesh = elemquad4
obj.Placement.Base = (260,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False




Line 224: Line 264:
quad8.addNode( 5, 0, 0, 7)
quad8.addNode( 5, 0, 0, 7)
quad8.addNode( 0, 5, 0, 8)
quad8.addNode( 0, 5, 0, 8)
quad8.addFace([ 1, 2, 3, 4, 5, 6, 7, 8])
quad8.addFace([1, 2, 3, 4, 5, 6, 7, 8])
quad8
quad8
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad8")
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad8")
obj.FemMesh = quad8
obj.FemMesh = quad8
obj.ViewObject.BackfaceCulling = False
obj.Placement.Base = (90,80,0)
obj.Placement.Base = (90,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Face with element nomber
elemquad8 = Fem.FemMesh()
nds = quad8.Nodes
for n in nds:
elemquad8.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemquad8.addFace([1, 2, 3, 4, 5, 6, 7, 8], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemquad8")
obj.FemMesh = elemquad8
obj.Placement.Base = (290,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False




Line 240: Line 293:
tetra4.addNode(12, 0, 18, 3)
tetra4.addNode(12, 0, 18, 3)
tetra4.addNode( 6, 6, 0, 4)
tetra4.addNode( 6, 6, 0, 4)
tetra4.addVolume([ 1, 2, 3, 4])
tetra4.addVolume([1, 2, 3, 4])
tetra4
tetra4
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tetra4")
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tetra4")
obj.FemMesh = tetra4
obj.FemMesh = tetra4
obj.Placement.Base = (0,50,0)
obj.Placement.Base = (0,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemtetra4 = Fem.FemMesh()
nds = tetra4.Nodes
for n in nds:
elemtetra4.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtetra4.addVolume([1, 2, 3, 4], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtetra4")
obj.FemMesh = elemtetra4
obj.Placement.Base = (200,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


Line 267: Line 331:
obj.FemMesh = tetra10
obj.FemMesh = tetra10
obj.Placement.Base = (30,50,0)
obj.Placement.Base = (30,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemtetra10 = Fem.FemMesh()
nds = tetra10.Nodes
for n in nds:
elemtetra10.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtetra10.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtetra10")
obj.FemMesh = elemtetra10
obj.Placement.Base = (230,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


Line 285: Line 360:
obj.FemMesh = hexa8
obj.FemMesh = hexa8
obj.Placement.Base = (60,50,0)
obj.Placement.Base = (60,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemhexa8 = Fem.FemMesh()
nds = hexa8.Nodes
for n in nds:
elemhexa8.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemhexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemhexa8")
obj.FemMesh = elemhexa8
obj.Placement.Base = (260,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


Line 318: Line 404:
obj.FemMesh = hexa20
obj.FemMesh = hexa20
obj.Placement.Base = (90,50,0)
obj.Placement.Base = (90,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemhexa20 = Fem.FemMesh()
nds = hexa20.Nodes
for n in nds:
elemhexa20.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemhexa20.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemhexa20")
obj.FemMesh = elemhexa20
obj.Placement.Base = (290,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


Line 335: Line 432:
obj.Placement.Base = (0,0,0)
obj.Placement.Base = (0,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempenta6 = Fem.FemMesh()
nds = penta6.Nodes
for n in nds:
elempenta6.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elempenta6.addVolume([ 1, 2, 3, 4, 5, 6], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempenta6")
obj.FemMesh = elempenta6
obj.Placement.Base = (200,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"





Line 363: Line 472:
obj.Placement.Base = (40,0,0)
obj.Placement.Base = (40,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempenta15 = Fem.FemMesh()
nds = penta15.Nodes
for n in nds:
elempenta15.addNode(nds[n].x, nds[n].y, nds[n].z, n)


'''
FreeCAD 0.17.8183 crashes by adding a penta15 volume with element nomber
elempenta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempenta15")
obj.FemMesh = elempenta15
obj.Placement.Base = (240,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
'''


# 5 node pyramid --> pyra5 ######################
# 5 node pyramid --> pyra5 ######################
Line 377: Line 499:
obj.FemMesh = pyra5
obj.FemMesh = pyra5
obj.Placement.Base = (80,0,0)
obj.Placement.Base = (80,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempyra5 = Fem.FemMesh()
nds = pyra5.Nodes
for n in nds:
elempyra5.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elempyra5.addVolume([1, 2, 3, 4, 5], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempyra5")
obj.FemMesh = elempyra5
obj.Placement.Base = (280,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


Line 403: Line 536:
obj.Placement.Base = (120,0,0)
obj.Placement.Base = (120,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempyra13 = Fem.FemMesh()
nds = pyra13.Nodes
for n in nds:
elempyra13.addNode(nds[n].x, nds[n].y, nds[n].z, n)

'''
FreeCAD 0.17.8183 crash by adding a pyra13 volume with element nomber
elempyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempyra13")
obj.FemMesh = elempyra13
obj.Placement.Base = (320,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
'''


</syntaxhighlight>
</syntaxhighlight>

Revision as of 22:00, 11 August 2016

Create a FEM Mesh

There are different possibilities to create a FEM Mesh in FreeCAD:

  • The Gui tool Fem MeshFromShape
  • The Gui tool by Python
  • Python directly means make the FEM Mesh by Hand
  • Import a FEM Mesh

Objects created in PartDesign and Part are supported, as well as simple copies of those bodies. There are two meshers available to the user: Netgen and GMSH. Netgen is included in FreeCAD. Refer to FEM Install For FEM Mesh generation by GMSH user psicofil has provided a GMSHMesh Macro.

Import and Export of FEM Mesh Elements
Element Element Import unv Export unv Export inp Import frd Z88 Python create View
Med CalculiX IDEAS IDEAS Abaqus Mesh CalculiX Result Mesh Import, Export FreeCAD API FreeCAD ViewProvider
seg 2 B31
seg 3 B32 -
tria 3 S3 -
tria 6 S6
quad 4 S4 -
quad 8 S8
tetra 4 C3D4
tetra 10 C3D10
pyra 5 - ? ? - - -
pyra 13 - ? ? - - -
hexa 8 C3D8
hexa 20 C3D20
penta 6 C3D6 ?
penta 15 C3D15 ?

("-" means not supported by the interface, thus it is not possible to support it. )

FEM Element Types

General

More informations about the FEM element types and their data structure inside FreeCAD can be find on FEM Element Types.

Segment element

File:Segments.gif


Triangle element

File:Triangles.gif


Quadratic element

File:Quadrangles.gif


Tetrahedron element

File:Tetraedres.gif


Pyramid element

File:Pyramides.gif


Hexahedron element

File:Hexaedres.gif


Pentahedron element

File:Pentaedres.gif


Scripting

Create a FEM Mesh totally py python

Creating a mesh with one Tet-10 Elements

import FreeCAD, Fem
# create a empty mesh
m = Fem.FemMesh()
#create the nodes
m.addNode(0,1,0)
m.addNode(0,0,1)
m.addNode(1,0,0)
m.addNode(0,0,0)
m.addNode(0,0.5,0.5)
m.addNode(0.5,0.03,.5)
m.addNode(0.5,0.5,0.03)
m.addNode(0,0.5,0)
m.addNode(0.03,0,0.5)
m.addNode(0.5,0,0)
# add the volume with the created nodes
m.addVolume([1,2,3,4,5,6,7,8,9,10])

Fem.show(m)

If you want to have predefined element and node numbering:

m.addNode(0.0,1.0,0.0,1)

m.addVolume([1,2,3,4,5,6,7,8,9,10],1)


Visual handling

Highlight some nodes on the view:

import FreeCAD, Fem

m = Fem.FemMesh()

m.addNode(0,1,0)
m.addNode(0,0,1)
m.addNode(1,0,0)
m.addNode(0,0,0)
m.addNode(0,0.5,0.5)
m.addNode(0.5,0.03,.5)
m.addNode(0.5,0.5,0.03)
m.addNode(0,0.5,0)
m.addNode(0.03,0,0.5)
m.addNode(0.5,0,0)
m.addVolume([1,2,3,4,5,6,7,8,9,10])

Fem.show(m)
Gui.ActiveDocument.ActiveObject.HighlightedNodes = [1,2,3]

Postprocessing colors and displacement: Highlight some nodes on the view:

# set the volume 1 to red
Gui.ActiveDocument.ActiveObject.ElementColor= {1:(1,0,0)}
# set the node 1 and 2 to a certain Color and interpolate the survace
Gui.ActiveDocument.ActiveObject.NodeColor= {1:(1,0,0),2:(1,0,0)}
# set the node 1 and 2 to a certain displacement
Gui.ActiveDocument.ActiveObject.NodeDisplacement= {1:FreeCAD.Vector(1,0,0),2:FreeCAD.Vector(1,0,0)}
# double the factor of the displacement shown
Gui.ActiveDocument.ActiveObject.animate(2.0)

Script one Element of each supported Element Type

import Fem
#################################################
# Beams
# 2 node line --> seg2 ##########################
seg2 = Fem.FemMesh()
seg2.addNode( 0,  0, 0, 1)
seg2.addNode(10,  0, 0, 2)
seg2.addEdge(1,  2)
seg2
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","seg2")
obj.FemMesh = seg2
obj.Placement.Base = (0,110,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


# 3 node line --> seg3 ##########################
# not implemented


#################################################
# Shells
# 3 node triangle --> tria3 #####################
tria3 = Fem.FemMesh()
tria3.addNode( 0,  0, 0, 1)
tria3.addNode( 6, 12, 0, 2)
tria3.addNode(12,  0, 0, 3)
tria3.addFace([1,  2,  3])
tria3
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria3")
obj.FemMesh = tria3
obj.Placement.Base = (0,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
# try to add Face with element nomber
elemtria3 = Fem.FemMesh()
nds = tria3.Nodes
for n in nds:
    elemtria3.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtria3.addFace([1,  2,  3], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtria3")
obj.FemMesh = elemtria3
obj.Placement.Base = (200,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False


# 6 node triangle --> tria 6 ####################
tria6 = Fem.FemMesh()
tria6.addNode( 0,  0, 0, 1)
tria6.addNode( 6, 12, 0, 2)
tria6.addNode(12,  0, 0, 3)
tria6.addNode( 3,  6, 0, 4)
tria6.addNode( 9,  6, 0, 5)
tria6.addNode( 6,  0, 0, 6)
tria6.addFace([1,  2, 3,  4, 5, 6])
tria6
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tria6")
obj.FemMesh = tria6
obj.Placement.Base = (30,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
# try to add Face with element nomber
elemtria6 = Fem.FemMesh()
nds = tria6.Nodes
for n in nds:
    elemtria6.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtria6.addFace([1,  2,  3,  4, 5, 6], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtria6")
obj.FemMesh = elemtria6
obj.Placement.Base = (230,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False


# 4 node quad --> quad4 #########################
quad4 = Fem.FemMesh()
quad4.addNode( 0, 10, 0, 1)
quad4.addNode(10, 10, 0, 2)
quad4.addNode(10,  0, 0, 3)
quad4.addNode( 0,  0, 0, 4)
# quad4.addQuad( 1,  2,  3, 4)    # without brackets
# addQuad  adds a Face of four nodes --> see FmMeshPyImp.cpp --> redundant with addFace !
quad4.addFace([1,  2,  3, 4])
quad4
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad4")
obj.FemMesh = quad4
obj.Placement.Base = (60,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False
# try to add Face with element nomber
elemquad4 = Fem.FemMesh()
nds = quad4.Nodes
for n in nds:
    elemquad4.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemquad4.addFace([1,  2,  3,  4], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemquad4")
obj.FemMesh = elemquad4
obj.Placement.Base = (260,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False


# 8 node quad --> quad8 #########################
quad8 = Fem.FemMesh()
quad8.addNode( 0, 10, 0, 1)
quad8.addNode(10, 10, 0, 2)
quad8.addNode(10,  0, 0, 3)
quad8.addNode( 0,  0, 0, 4)
quad8.addNode( 5, 10, 0, 5)
quad8.addNode(10,  5, 0, 6)
quad8.addNode( 5,  0, 0, 7)
quad8.addNode( 0,  5, 0, 8)
quad8.addFace([1,  2,  3, 4, 5, 6, 7, 8])
quad8
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","quad8")
obj.FemMesh = quad8
obj.ViewObject.BackfaceCulling = False
obj.Placement.Base = (90,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Face with element nomber
elemquad8 = Fem.FemMesh()
nds = quad8.Nodes
for n in nds:
    elemquad8.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemquad8.addFace([1,  2,  3,  4, 5, 6, 7, 8], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemquad8")
obj.FemMesh = elemquad8
obj.Placement.Base = (290,80,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
obj.ViewObject.BackfaceCulling = False


#################################################
# Volumes
# 4 node tetrahedron --> tetra4 #################
tetra4 = Fem.FemMesh()
tetra4.addNode( 6, 12, 18, 1)
tetra4.addNode( 0,  0, 18, 2)
tetra4.addNode(12,  0, 18, 3)
tetra4.addNode( 6,  6,  0, 4)
tetra4.addVolume([1,  2,  3, 4])
tetra4
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tetra4")
obj.FemMesh = tetra4
obj.Placement.Base = (0,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemtetra4 = Fem.FemMesh()
nds = tetra4.Nodes
for n in nds:
    elemtetra4.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtetra4.addVolume([1,  2,  3, 4], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtetra4")
obj.FemMesh = elemtetra4
obj.Placement.Base = (200,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


# 10 node tetrahedron --> tetra10 ###############
tetra10 = Fem.FemMesh()
tetra10.addNode( 6, 12, 18, 1)
tetra10.addNode( 0,  0, 18, 2)
tetra10.addNode(12,  0, 18, 3)
tetra10.addNode( 6,  6,  0, 4)

tetra10.addNode( 3,  6, 18, 5)
tetra10.addNode( 6,  0, 18, 6)
tetra10.addNode( 9,  6, 18, 7)

tetra10.addNode( 6,  9,  9, 8)
tetra10.addNode( 3,  3,  9, 9)
tetra10.addNode( 9,  3,  9,10)
tetra10.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
tetra10
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","tetra10")
obj.FemMesh = tetra10
obj.Placement.Base = (30,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemtetra10 = Fem.FemMesh()
nds = tetra10.Nodes
for n in nds:
    elemtetra10.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemtetra10.addVolume([1,  2,  3, 4, 5, 6, 7, 8, 9, 10], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemtetra10")
obj.FemMesh = elemtetra10
obj.Placement.Base = (230,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


# 8 node Hexahedron --> hexa8 ###################
hexa8 = Fem.FemMesh()
hexa8.addNode( 0, 10, 10, 1)
hexa8.addNode( 0,  0, 10, 2)
hexa8.addNode(10,  0, 10, 3)
hexa8.addNode(10, 10, 10, 4)
hexa8.addNode( 0, 10,  0, 5)
hexa8.addNode( 0,  0,  0, 6)
hexa8.addNode(10,  0,  0, 7)
hexa8.addNode(10, 10,  0, 8)
hexa8.addVolume([1, 2, 3, 4, 5, 6, 7, 8])
hexa8
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","hexa8")
obj.FemMesh = hexa8
obj.Placement.Base = (60,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemhexa8 = Fem.FemMesh()
nds = hexa8.Nodes
for n in nds:
    elemhexa8.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemhexa8.addVolume([1,  2,  3, 4, 5, 6, 7, 8], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemhexa8")
obj.FemMesh = elemhexa8
obj.Placement.Base = (260,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


# 20 node Hexahedron --> hexa20 #################
hexa20 = Fem.FemMesh()
hexa20.addNode( 0, 10, 10,  1)
hexa20.addNode( 0,  0, 10,  2)
hexa20.addNode(10,  0, 10,  3)
hexa20.addNode(10, 10, 10,  4)
hexa20.addNode( 0, 10,  0,  5)
hexa20.addNode( 0,  0,  0,  6)
hexa20.addNode(10,  0,  0,  7)
hexa20.addNode(10, 10,  0,  8)

hexa20.addNode( 0,  5, 10,  9)
hexa20.addNode( 5,  0, 10, 10)
hexa20.addNode(10,  5, 10, 11)
hexa20.addNode( 5, 10, 10, 12)

hexa20.addNode( 0,  5,  0, 13)
hexa20.addNode( 5,  0,  0, 14)
hexa20.addNode(10,  5,  0, 15)
hexa20.addNode( 5, 10,  0, 16)

hexa20.addNode( 0, 10,  5, 17)
hexa20.addNode( 0,  0,  5, 18)
hexa20.addNode(10,  0,  5, 19)
hexa20.addNode(10, 10,  5, 20)
hexa20.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
hexa20
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","hexa20")
obj.FemMesh = hexa20
obj.Placement.Base = (90,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elemhexa20 = Fem.FemMesh()
nds = hexa20.Nodes
for n in nds:
    elemhexa20.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elemhexa20.addVolume([1,  2,  3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elemhexa20")
obj.FemMesh = elemhexa20
obj.Placement.Base = (290,50,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


# 6 node pentahedron --> penta6 #################
penta6 = Fem.FemMesh()
penta6.addNode(10,10,10, 1)
penta6.addNode( 0, 0,10, 2)
penta6.addNode(20, 0,10, 3)
penta6.addNode(10,10, 0, 4)
penta6.addNode( 0, 0, 0, 5)
penta6.addNode(20, 0, 0, 6)
penta6.addVolume([1, 2, 3, 4, 5, 6])
penta6
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","penta6")
obj.FemMesh = penta6
obj.Placement.Base = (0,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempenta6 = Fem.FemMesh()
nds = penta6.Nodes
for n in nds:
    elempenta6.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elempenta6.addVolume([ 1,  2,  3, 4, 5, 6], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempenta6")
obj.FemMesh = elempenta6
obj.Placement.Base = (200,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"



# 15 node pentahedron --> penta15 ###############
penta15 = Fem.FemMesh()
penta15.addNode(10,10,10, 1)
penta15.addNode( 0, 0,10, 2)
penta15.addNode(20, 0,10, 3)
penta15.addNode(10,10, 0, 4)
penta15.addNode( 0, 0, 0, 5)
penta15.addNode(20, 0, 0, 6)

penta15.addNode( 5, 5,10, 7)
penta15.addNode(10, 0,10, 8)
penta15.addNode(15, 5,10, 9)

penta15.addNode( 5, 5, 0,10)
penta15.addNode(10, 0, 0,11)
penta15.addNode(15, 5, 0,12)

penta15.addNode(10,10, 5,13)
penta15.addNode( 0, 0, 5,14)
penta15.addNode(20, 0, 5,15)
penta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
penta15
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","penta15")
obj.FemMesh = penta15
obj.Placement.Base = (40,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempenta15 = Fem.FemMesh()
nds = penta15.Nodes
for n in nds:
    elempenta15.addNode(nds[n].x, nds[n].y, nds[n].z, n)

'''
FreeCAD 0.17.8183 crashes by adding a penta15 volume with element nomber
elempenta15.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempenta15")
obj.FemMesh = elempenta15
obj.Placement.Base = (240,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
'''

# 5 node pyramid --> pyra5 ######################
pyra5 = Fem.FemMesh()
pyra5.addNode( 0,20, 0, 1)
pyra5.addNode(20,20, 0, 2)
pyra5.addNode(20, 0, 0, 3)
pyra5.addNode( 0, 0, 0, 4)
pyra5.addNode(10,10,10, 5)
pyra5.addVolume([1, 2, 3, 4, 5])
pyra5
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","pyra5")
obj.FemMesh = pyra5
obj.Placement.Base = (80,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempyra5 = Fem.FemMesh()
nds = pyra5.Nodes
for n in nds:
    elempyra5.addNode(nds[n].x, nds[n].y, nds[n].z, n)

elempyra5.addVolume([1,  2,  3, 4, 5], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempyra5")
obj.FemMesh = elempyra5
obj.Placement.Base = (280,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"


# 13 node pyramid --> pyra13 ####################
pyra13 = Fem.FemMesh()
pyra13.addNode( 0,20, 0, 1)
pyra13.addNode(20,20, 0, 2)
pyra13.addNode(20, 0, 0, 3)
pyra13.addNode( 0, 0, 0, 4)
pyra13.addNode(10,10,10, 5)

pyra13.addNode(10,20, 0, 6)
pyra13.addNode(20,10, 0, 7)
pyra13.addNode(10, 0, 0, 8)
pyra13.addNode( 0,10, 0, 9)

pyra13.addNode( 5,15, 5,10)
pyra13.addNode(15,15, 5,11)
pyra13.addNode(15, 5, 5,12)
pyra13.addNode( 5, 5, 5,13)
pyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
pyra13
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","pyra13")
obj.FemMesh = pyra13
obj.Placement.Base = (120,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
# try to add Volume with element nomber
elempyra13 = Fem.FemMesh()
nds = pyra13.Nodes
for n in nds:
    elempyra13.addNode(nds[n].x, nds[n].y, nds[n].z, n)

'''
FreeCAD 0.17.8183 crash by adding a pyra13 volume with element nomber
elempyra13.addVolume([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 1)
obj = App.ActiveDocument.addObject("Fem::FemMeshObject","elempyra13")
obj.FemMesh = elempyra13
obj.Placement.Base = (320,0,0)
obj.ViewObject.DisplayMode = "Faces, Wireframe & Nodes"
'''

Fem Workbench