FEM: frd import mesh - added HEX20, PENTA6, PENTA15

This commit is contained in:
fandaL 2015-11-28 22:41:10 +01:00 committed by Yorik van Havre
parent 32624cbe94
commit 98cd075a84

View File

@ -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 = {}
@ -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
@ -88,6 +92,15 @@ 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])
@ -95,6 +108,55 @@ def readResult(frd_input):
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])
@ -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):
@ -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']
@ -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.addVolume([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]
@ -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_penta15 = m['Penta15Elem']
for i in elms_penta15:
e = elms_penta15[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]], 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]
@ -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, {} PENTA15".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