From 98cd075a84722b60220a84ff2fcb2c8db6c900d4 Mon Sep 17 00:00:00 2001 From: fandaL Date: Sat, 28 Nov 2015 22:41:10 +0100 Subject: [PATCH] FEM: frd import mesh - added HEX20, PENTA6, PENTA15 --- src/Mod/Fem/ccxFrdReader.py | 99 +++++++++++++++++++++++++++++++++---- 1 file changed, 89 insertions(+), 10 deletions(-) diff --git a/src/Mod/Fem/ccxFrdReader.py b/src/Mod/Fem/ccxFrdReader.py index ba05663db..496059697 100644 --- a/src/Mod/Fem/ccxFrdReader.py +++ b/src/Mod/Fem/ccxFrdReader.py @@ -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