Skip to content

Commit

Permalink
FEM: ccxInpWriter, write vertex loads the same way like edge loads an…
Browse files Browse the repository at this point in the history
…d face loads
  • Loading branch information
berndhahnebach authored and wwmayer committed May 16, 2016
1 parent 9326794 commit 2a6a57c
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 77 deletions.
13 changes: 13 additions & 0 deletions src/Mod/Fem/FemMeshTools.py
Expand Up @@ -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 = []
Expand Down
120 changes: 43 additions & 77 deletions src/Mod/Fem/ccxInpWriter.py
Expand Up @@ -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)
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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)
Expand All @@ -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')
Expand Down

0 comments on commit 2a6a57c

Please sign in to comment.