From 2a6a57c5b64630d0c564486b1ebbed529db7946d Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Sat, 14 May 2016 19:44:48 +0100 Subject: [PATCH] FEM: ccxInpWriter, write vertex loads the same way like edge loads and face loads --- src/Mod/Fem/FemMeshTools.py | 13 ++++ src/Mod/Fem/ccxInpWriter.py | 120 +++++++++++++----------------------- 2 files changed, 56 insertions(+), 77 deletions(-) diff --git a/src/Mod/Fem/FemMeshTools.py b/src/Mod/Fem/FemMeshTools.py index de1cc6930bd5..18752b17d99e 100644 --- a/src/Mod/Fem/FemMeshTools.py +++ b/src/Mod/Fem/FemMeshTools.py @@ -148,6 +148,19 @@ def get_elset_short_name(obj, i): print('Error: ', obj.Name, ' --> ', obj.Proxy.Type) +def get_force_obj_vertex_nodeload_table(femmesh, frc_obj): + # force_obj_node_load_table = [('refshape_name.elemname',node_load_table), ..., ('refshape_name.elemname',node_load_table)] + force_obj_node_load_table = [] + node_load = frc_obj.Force / len(frc_obj.References) + for o, elem in frc_obj.References: + elem_o = o.Shape.getElement(elem) + node = femmesh.getNodesByVertex(elem_o) + elem_info_string = 'node load on shape: ' + o.Name + ':' + elem + force_obj_node_load_table.append((elem_info_string, {node[0]: node_load})) + + return force_obj_node_load_table + + def get_force_obj_edge_nodeload_table(femmesh, femelement_table, femnodes_mesh, frc_obj): # force_obj_node_load_table = [('refshape_name.elemname',node_load_table), ..., ('refshape_name.elemname',node_load_table)] force_obj_node_load_table = [] diff --git a/src/Mod/Fem/ccxInpWriter.py b/src/Mod/Fem/ccxInpWriter.py index 40a05153e9e0..33ceea9ec35e 100644 --- a/src/Mod/Fem/ccxInpWriter.py +++ b/src/Mod/Fem/ccxInpWriter.py @@ -78,8 +78,6 @@ def write_calculix_input_file(self): self.write_element_sets_material_and_femelement_type(inpfile) self.write_node_sets_constraints_fixed(inpfile) self.write_node_sets_constraints_displacement(inpfile) - if self.analysis_type is None or self.analysis_type == "static": - self.write_node_sets_constraints_force(inpfile) self.write_materials(inpfile) self.write_femelementsets(inpfile) self.write_step_begin(inpfile) @@ -159,56 +157,6 @@ def write_node_sets_constraints_displacement(self, f): for n in femobj['Nodes']: f.write(str(n) + ',\n') - def write_node_sets_constraints_force(self, f): - # check shape type of reference shape - for femobj in self.force_objects: # femobj --> dict, FreeCAD document object is femobj['Object'] - frc_obj = femobj['Object'] - # in GUI defined frc_obj all ref_shape have the same shape type - # TODO in FemTools: check if all RefShapes really have the same type an write type to dictionary - femobj['RefShapeType'] = '' - if frc_obj.References: - first_ref_obj = frc_obj.References[0] - first_ref_shape = first_ref_obj[0].Shape.getElement(first_ref_obj[1]) - femobj['RefShapeType'] = first_ref_shape.ShapeType - else: - # frc_obj.References could be empty ! # TODO in FemTools: check - FreeCAD.Console.PrintError('At least one Force Object has empty References!\n') - if femobj['RefShapeType'] == 'Vertex': - print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation") - pass - elif femobj['RefShapeType'] == 'Face' and FemMeshTools.is_solid_mesh(self.femmesh) and not FemMeshTools.has_no_face_data(self.femmesh): - print("solid_mesh with face data --> we do not need the femelement_table but we need the femnodes_mesh for node load calculation") - if not self.femnodes_mesh: - self.femnodes_mesh = self.femmesh.Nodes - else: - print("mesh without needed data --> we need the femelement_table and femnodes_mesh for node load calculation") - if not self.femnodes_mesh: - self.femnodes_mesh = self.femmesh.Nodes - if not self.femelement_table: - self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh) - # point loads on vertices, get nodes - for femobj in self.force_objects: - if femobj['RefShapeType'] == 'Vertex': - femobj['Nodes'] = FemMeshTools.get_femnodes_by_references(self.femmesh, femobj['Object'].References) - # calculate node load - if len(femobj['Nodes']) != 0: - femobj['NodeLoad'] = (femobj['Object'].Force) / len(femobj['Nodes']) - # point loads on vertices, write nodes to file - f.write('\n***********************************************************\n') - f.write('** Node sets for loads\n') - f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) - for femobj in self.force_objects: - if femobj['RefShapeType'] == 'Vertex': - frc_obj = femobj['Object'] - f.write('*NSET,NSET=' + frc_obj.Name + '\n') - for n in femobj['Nodes']: - f.write(str(n) + ',\n') - f.write('** concentrated load [N] distributed on all mesh nodes of the given vertieces\n') - f.write('** ' + str(frc_obj.Force) + ' N / ' + str(len(femobj['Nodes'])) + ' Nodes = ' + str(femobj['NodeLoad']) + ' N on each node\n') - f.write('\n') - else: - f.write('** no point load on vertices --> no set for node loads\n') - def write_materials(self, f): f.write('\n***********************************************************\n') f.write('** Materials\n') @@ -322,12 +270,40 @@ def write_constraints_displacement(self, f): f.write('\n') def write_constraints_force(self, f): + # check shape type of reference shape + for femobj in self.force_objects: # femobj --> dict, FreeCAD document object is femobj['Object'] + frc_obj = femobj['Object'] + # in GUI defined frc_obj all ref_shape have the same shape type + # TODO in FemTools: check if all RefShapes really have the same type an write type to dictionary + femobj['RefShapeType'] = '' + if frc_obj.References: + first_ref_obj = frc_obj.References[0] + first_ref_shape = first_ref_obj[0].Shape.getElement(first_ref_obj[1]) + femobj['RefShapeType'] = first_ref_shape.ShapeType + else: + # frc_obj.References could be empty ! # TODO in FemTools: check + FreeCAD.Console.PrintError('At least one Force Object has empty References!\n') + if femobj['RefShapeType'] == 'Vertex': + #print("load on vertices --> we do not need the femelement_table and femnodes_mesh for node load calculation") + pass + elif femobj['RefShapeType'] == 'Face' and FemMeshTools.is_solid_mesh(self.femmesh) and not FemMeshTools.has_no_face_data(self.femmesh): + #print("solid_mesh with face data --> we do not need the femelement_table but we need the femnodes_mesh for node load calculation") + if not self.femnodes_mesh: + self.femnodes_mesh = self.femmesh.Nodes + else: + #print("mesh without needed data --> we need the femelement_table and femnodes_mesh for node load calculation") + if not self.femnodes_mesh: + self.femnodes_mesh = self.femmesh.Nodes + if not self.femelement_table: + self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh) # get node loads for femobj in self.force_objects: # femobj --> dict, FreeCAD document object is femobj['Object'] frc_obj = femobj['Object'] if frc_obj.Force == 0: print(' Warning --> Force = 0') - if femobj['RefShapeType'] == 'Edge': # line load on edges + if femobj['RefShapeType'] == 'Vertex': # point load on vertieces + femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_vertex_nodeload_table(self.femmesh, frc_obj) + elif femobj['RefShapeType'] == 'Edge': # line load on edges femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_edge_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj) elif femobj['RefShapeType'] == 'Face': # area load on faces femobj['NodeLoadTable'] = FemMeshTools.get_force_obj_face_nodeload_table(self.femmesh, self.femelement_table, self.femnodes_mesh, frc_obj) @@ -340,31 +316,21 @@ def write_constraints_force(self, f): frc_obj_name = femobj['Object'].Name direction_vec = femobj['Object'].DirectionVector f.write('** ' + frc_obj_name + '\n') - if femobj['RefShapeType'] == 'Vertex': # point load on vertieces - node_load = femobj['NodeLoad'] - f.write('** force: ' + str(node_load) + ' N, direction: ' + str(direction_vec) + '\n') - v1 = "{:.13E}".format(direction_vec.x * node_load) - v2 = "{:.13E}".format(direction_vec.y * node_load) - v3 = "{:.13E}".format(direction_vec.z * node_load) - f.write(frc_obj_name + ',1,' + v1 + '\n') - f.write(frc_obj_name + ',2,' + v2 + '\n') - f.write(frc_obj_name + ',3,' + v3 + '\n\n') - elif femobj['RefShapeType'] == 'Edge' or femobj['RefShapeType'] == 'Face': - for ref_shape in femobj['NodeLoadTable']: - f.write('** ' + ref_shape[0] + '\n') - for n in sorted(ref_shape[1]): - node_load = ref_shape[1][n] - if (direction_vec.x != 0.0): - v1 = "{:.13E}".format(direction_vec.x * node_load) - f.write(str(n) + ',1,' + v1 + '\n') - if (direction_vec.y != 0.0): - v2 = "{:.13E}".format(direction_vec.y * node_load) - f.write(str(n) + ',2,' + v2 + '\n') - if (direction_vec.z != 0.0): - v3 = "{:.13E}".format(direction_vec.z * node_load) - f.write(str(n) + ',3,' + v3 + '\n') - f.write('\n') + for ref_shape in femobj['NodeLoadTable']: + f.write('** ' + ref_shape[0] + '\n') + for n in sorted(ref_shape[1]): + node_load = ref_shape[1][n] + if (direction_vec.x != 0.0): + v1 = "{:.13E}".format(direction_vec.x * node_load) + f.write(str(n) + ',1,' + v1 + '\n') + if (direction_vec.y != 0.0): + v2 = "{:.13E}".format(direction_vec.y * node_load) + f.write(str(n) + ',2,' + v2 + '\n') + if (direction_vec.z != 0.0): + v3 = "{:.13E}".format(direction_vec.z * node_load) + f.write(str(n) + ',3,' + v3 + '\n') f.write('\n') + f.write('\n') def write_constraints_pressure(self, f): f.write('\n***********************************************************\n')