Skip to content

Commit

Permalink
FEM frd import mesh - added HEX20, PENTA6, PENTA15
Browse files Browse the repository at this point in the history
not tested yet
  • Loading branch information
fandaL committed Nov 28, 2015
1 parent 8b745b3 commit 6fa50ff
Showing 1 changed file with 89 additions and 10 deletions.
99 changes: 89 additions & 10 deletions src/Mod/Fem/ccxFrdReader.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,11 @@ def readResult(frd_input):
frd_file = pyopen(frd_input, "r")
nodes = {}
elements_hexa8 = {}
elements_penta6 = {}
elements_tetra4 = {}
elements_tetra10 = {}
elements_penta15 = {}
elements_hexa20 = {}
elements_tria3 = {}
elements_tria6 = {}
elements_quad4 = {}
Expand All @@ -55,6 +58,7 @@ def readResult(frd_input):
nodes_found = False
mode_stress_found = False
elements_found = False
input_continues = False
eigenmode = 0
elem = -1
elemType = 0
Expand Down Expand Up @@ -88,13 +92,71 @@ def readResult(frd_input):
node_id_3 = int(line[63:73])
node_id_4 = int(line[73:83])
elements_hexa8[elem] = (node_id_1, node_id_2, node_id_3, node_id_4, node_id_5, node_id_6, node_id_7, node_id_8)
#then the 6 id's for the PENTA6 element
if elements_found and (line[1:3] == "-2") and elemType == 2:
node_id_4 = int(line[3:13])
node_id_5 = int(line[13:23])
node_id_6 = int(line[23:33])
node_id_1 = int(line[33:43])
node_id_2 = int(line[43:53])
node_id_3 = int(line[53:63])
elements_penta6[elem] = (node_id_1, node_id_2, node_id_3, node_id_4, node_id_5, node_id_6)
#then the 4 id's for the TETRA4 element
if elements_found and (line[1:3] == "-2") and elemType == 3:
node_id_2 = int(line[3:13])
node_id_1 = int(line[13:23])
node_id_3 = int(line[23:33])
node_id_4 = int(line[33:43])
elements_tetra4[elem] = (node_id_1, node_id_2, node_id_3, node_id_4)
#then the 20 id's for the HEXA20 element
if elements_found and (line[1:3] == "-2") and elemType == 4 and input_continues == False:
node_id_5 = int(line[3:13])
node_id_6 = int(line[13:23])
node_id_7 = int(line[23:33])
node_id_8 = int(line[33:43])
node_id_1 = int(line[43:53])
node_id_2 = int(line[53:63])
node_id_3 = int(line[63:73])
node_id_4 = int(line[73:83])
node_id_13 = int(line[83:93])
node_id_14 = int(line[93:103])
input_continues = True
elif elements_found and (line[1:3] == "-2") and elemType == 4 and input_continues == True:
node_id_15 = int(line[3:13])
node_id_16 = int(line[13:23])
node_id_9 = int(line[23:33])
node_id_10 = int(line[33:43])
node_id_11 = int(line[43:53])
node_id_12 = int(line[53:63])
node_id_17 = int(line[63:73])
node_id_18 = int(line[73:83])
node_id_19 = int(line[83:93])
node_id_20 = int(line[93:103])
input_continues = False
elements_hexa20[elem] = ( node_id_1, node_id_2, node_id_3, node_id_4, node_id_5, node_id_6, node_id_7, node_id_8, node_id_9, node_id_10,
node_id_11,node_id_12,node_id_13,node_id_14,node_id_15,node_id_16,node_id_17,node_id_18,node_id_19, node_id_20)
#then the 15 id's for the PENTA15 element
if elements_found and (line[1:3] == "-2") and elemType == 5 and input_continues == False:
node_id_4 = int(line[3:13])
node_id_5 = int(line[13:23])
node_id_6 = int(line[23:33])
node_id_1 = int(line[33:43])
node_id_2 = int(line[43:53])
node_id_3 = int(line[53:63])
node_id_10 = int(line[63:73])
node_id_11 = int(line[73:83])
node_id_12 = int(line[83:93])
node_id_13 = int(line[93:103])
input_continues = True
elif elements_found and (line[1:3] == "-2") and elemType == 5 and input_continues == True:
node_id_14 = int(line[3:13])
node_id_15 = int(line[13:23])
node_id_7 = int(line[23:33])
node_id_8 = int(line[33:43])
node_id_9 = int(line[43:53])
input_continues = False
elements_penta15[elem] = ( node_id_1, node_id_2, node_id_3, node_id_4, node_id_5, node_id_6, node_id_7, node_id_8, node_id_9, node_id_10,
node_id_11,node_id_12,node_id_13,node_id_14,node_id_15)
#then the 10 id's for the TETRA10 element
if elements_found and (line[1:3] == "-2") and elemType == 6:
node_id_2 = int(line[3:13])
Expand Down Expand Up @@ -193,8 +255,11 @@ def readResult(frd_input):
elements_found = False

frd_file.close()
return {'Nodes': nodes, 'Hexa8Elem': elements_hexa8, 'Tetra4Elem': elements_tetra4, 'Tetra10Elem': elements_tetra10, 'Tria3Elem': elements_tria3,
'Tria6Elem': elements_tria6, 'Quad4Elem': elements_quad4, 'Quad8Elem': elements_quad8, 'Seg2Elem': elements_seg2, 'Results': results}
return {'Nodes': nodes,
'Hexa8Elem': elements_hexa8, 'Penta6Elem': elements_penta6, 'Tetra4Elem': elements_tetra4, 'Tetra10Elem': elements_tetra10,
'Penta15Elem': elements_penta15, 'Hexa20Elem': elements_hexa20, 'Tria3Elem': elements_tria3, 'Tria6Elem': elements_tria6,
'Quad4Elem': elements_quad4, 'Quad8Elem': elements_quad8, 'Seg2Elem': elements_seg2,
'Results': results}


def calculate_von_mises(i):
Expand Down Expand Up @@ -238,10 +303,10 @@ def importFrd(filename, analysis=None):
z_span = abs(p_z_max - p_z_min)
span = max(x_span, y_span, z_span)

if (not analysis) and ('Nodes' in m) and (('Hexa8Elem' in m) or
('Tetra4Elem' in m) or ('Tetra10Elem' in m) or ('Tria3Elem' in m) or
('Tria6Elem' in m) or ('Quad4Elem' in m) or ('Quad8Elem' in m) or
('Seg2Elem' in m)):
if (not analysis) and ('Nodes' in m) and \
(('Hexa8Elem' in m) or ('Penta6Elem' in m) or ('Tetra4Elem' in m) or ('Tetra10Elem' in m) or \
('Penta6Elem' in m) or ('Hexa20Elem' in m) or ('Tria3Elem' in m) or ('Tria6Elem' in m) or \
('Quad4Elem' in m) or ('Quad8Elem' in m) or ('Seg2Elem' in m)):
mesh = Fem.FemMesh()
nds = m['Nodes']

Expand All @@ -252,6 +317,10 @@ def importFrd(filename, analysis=None):
for i in elms_hexa8:
e = elms_hexa8[i]
mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7]], i)
elms_penta6 = m['Penta6Elem']
for i in elms_penta6:
e = elms_penta6[i]
mesh.addFace([e[0], e[1], e[2], e[3], e[4], e[5]], i)
elms_tetra4 = m['Tetra4Elem']
for i in elms_tetra4:
e = elms_tetra4[i]
Expand All @@ -260,6 +329,16 @@ def importFrd(filename, analysis=None):
for i in elms_tetra10:
e = elms_tetra10[i]
mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9]], i)
elms_penta6 = m['Penta6Elem']
for i in elms_penta6:
e = elms_penta6[i]
mesh.addFace([ e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9],
e[10],e[11],e[12],e[13],e[14]], i)
elms_hexa20 = m['Hexa20Elem']
for i in elms_hexa20:
e = elms_hexa20[i]
mesh.addVolume([ e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7], e[8], e[9],
e[10],e[11],e[12],e[13],e[14],e[15],e[16],e[17],e[18],e[19]], i)
elms_tria3 = m['Tria3Elem']
for i in elms_tria3:
e = elms_tria3[i]
Expand All @@ -280,10 +359,10 @@ def importFrd(filename, analysis=None):
for i in elms_seg2:
e = elms_seg2[i]
mesh.addEdge(e[0], e[1])
print ("imported mesh: {} nodes, {} HEXA8, {} TETRA4, {} TETRA10".format(
len(nds), len(elms_hexa8), len(elms_tetra4), len(elms_tetra10)))
print ("imported mesh: {} TRIA3, {} TRIA6, {} QUAD4, {} QUAD8, {} SEG2".format(
len(elms_tria3), len(elms_tria6), len(elms_quad4), len(elms_quad8), len(elms_seg2)))
print ("imported mesh: {} nodes, {} HEXA8, {} PENTA6, {} TETRA4, {} TETRA10, {} PENTA6".format(
len(nds), len(elms_hexa8), len(elms_penta6), len(elms_tetra4), len(elms_tetra10), len(elms_penta15)))
print ("imported mesh: {} HEXA20, {} TRIA3, {} TRIA6, {} QUAD4, {} QUAD8, {} SEG2".format(
len(elms_hexa20), len(elms_tria3), len(elms_tria6), len(elms_quad4), len(elms_quad8), len(elms_seg2)))
if len(nds) > 0:
mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', 'ResultMesh')
mesh_object.FemMesh = mesh
Expand Down

0 comments on commit 6fa50ff

Please sign in to comment.