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") frd_file = pyopen(frd_input, "r")
nodes = {} nodes = {}
elements_hexa8 = {} elements_hexa8 = {}
elements_penta6 = {}
elements_tetra4 = {} elements_tetra4 = {}
elements_tetra10 = {} elements_tetra10 = {}
elements_penta15 = {}
elements_hexa20 = {}
elements_tria3 = {} elements_tria3 = {}
elements_tria6 = {} elements_tria6 = {}
elements_quad4 = {} elements_quad4 = {}
@ -55,6 +58,7 @@ def readResult(frd_input):
nodes_found = False nodes_found = False
mode_stress_found = False mode_stress_found = False
elements_found = False elements_found = False
input_continues = False
eigenmode = 0 eigenmode = 0
elem = -1 elem = -1
elemType = 0 elemType = 0
@ -88,6 +92,15 @@ def readResult(frd_input):
node_id_3 = int(line[63:73]) node_id_3 = int(line[63:73])
node_id_4 = int(line[73:83]) 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) 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 #then the 4 id's for the TETRA4 element
if elements_found and (line[1:3] == "-2") and elemType == 3: if elements_found and (line[1:3] == "-2") and elemType == 3:
node_id_2 = int(line[3:13]) node_id_2 = int(line[3:13])
@ -95,6 +108,55 @@ def readResult(frd_input):
node_id_3 = int(line[23:33]) node_id_3 = int(line[23:33])
node_id_4 = int(line[33:43]) node_id_4 = int(line[33:43])
elements_tetra4[elem] = (node_id_1, node_id_2, node_id_3, node_id_4) 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 #then the 10 id's for the TETRA10 element
if elements_found and (line[1:3] == "-2") and elemType == 6: if elements_found and (line[1:3] == "-2") and elemType == 6:
node_id_2 = int(line[3:13]) node_id_2 = int(line[3:13])
@ -193,8 +255,11 @@ def readResult(frd_input):
elements_found = False elements_found = False
frd_file.close() frd_file.close()
return {'Nodes': nodes, 'Hexa8Elem': elements_hexa8, 'Tetra4Elem': elements_tetra4, 'Tetra10Elem': elements_tetra10, 'Tria3Elem': elements_tria3, return {'Nodes': nodes,
'Tria6Elem': elements_tria6, 'Quad4Elem': elements_quad4, 'Quad8Elem': elements_quad8, 'Seg2Elem': elements_seg2, 'Results': results} '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): def calculate_von_mises(i):
@ -238,10 +303,10 @@ def importFrd(filename, analysis=None):
z_span = abs(p_z_max - p_z_min) z_span = abs(p_z_max - p_z_min)
span = max(x_span, y_span, z_span) span = max(x_span, y_span, z_span)
if (not analysis) and ('Nodes' in m) and (('Hexa8Elem' in m) or if (not analysis) and ('Nodes' in m) and \
('Tetra4Elem' in m) or ('Tetra10Elem' in m) or ('Tria3Elem' in m) or (('Hexa8Elem' in m) or ('Penta6Elem' in m) or ('Tetra4Elem' in m) or ('Tetra10Elem' in m) or \
('Tria6Elem' in m) or ('Quad4Elem' in m) or ('Quad8Elem' in m) or ('Penta6Elem' in m) or ('Hexa20Elem' in m) or ('Tria3Elem' in m) or ('Tria6Elem' in m) or \
('Seg2Elem' in m)): ('Quad4Elem' in m) or ('Quad8Elem' in m) or ('Seg2Elem' in m)):
mesh = Fem.FemMesh() mesh = Fem.FemMesh()
nds = m['Nodes'] nds = m['Nodes']
@ -252,6 +317,10 @@ def importFrd(filename, analysis=None):
for i in elms_hexa8: for i in elms_hexa8:
e = elms_hexa8[i] e = elms_hexa8[i]
mesh.addVolume([e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7]], 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'] elms_tetra4 = m['Tetra4Elem']
for i in elms_tetra4: for i in elms_tetra4:
e = elms_tetra4[i] e = elms_tetra4[i]
@ -260,6 +329,16 @@ def importFrd(filename, analysis=None):
for i in elms_tetra10: for i in elms_tetra10:
e = elms_tetra10[i] 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) 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'] elms_tria3 = m['Tria3Elem']
for i in elms_tria3: for i in elms_tria3:
e = elms_tria3[i] e = elms_tria3[i]
@ -280,10 +359,10 @@ def importFrd(filename, analysis=None):
for i in elms_seg2: for i in elms_seg2:
e = elms_seg2[i] e = elms_seg2[i]
mesh.addEdge(e[0], e[1]) mesh.addEdge(e[0], e[1])
print ("imported mesh: {} nodes, {} HEXA8, {} TETRA4, {} TETRA10".format( print ("imported mesh: {} nodes, {} HEXA8, {} PENTA6, {} TETRA4, {} TETRA10, {} PENTA15".format(
len(nds), len(elms_hexa8), len(elms_tetra4), len(elms_tetra10))) len(nds), len(elms_hexa8), len(elms_penta6), len(elms_tetra4), len(elms_tetra10), len(elms_penta15)))
print ("imported mesh: {} TRIA3, {} TRIA6, {} QUAD4, {} QUAD8, {} SEG2".format( print ("imported mesh: {} HEXA20, {} TRIA3, {} TRIA6, {} QUAD4, {} QUAD8, {} SEG2".format(
len(elms_tria3), len(elms_tria6), len(elms_quad4), len(elms_quad8), len(elms_seg2))) len(elms_hexa20), len(elms_tria3), len(elms_tria6), len(elms_quad4), len(elms_quad8), len(elms_seg2)))
if len(nds) > 0: if len(nds) > 0:
mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', 'ResultMesh') mesh_object = FreeCAD.ActiveDocument.addObject('Fem::FemMeshObject', 'ResultMesh')
mesh_object.FemMesh = mesh mesh_object.FemMesh = mesh