Merge pull request #1322 from berndhahnebach/bhbdev130

[0.17] FEM important fix
This commit is contained in:
Yorik van Havre
2018-02-19 17:15:32 -03:00
committed by GitHub
4 changed files with 38 additions and 31 deletions

View File

@@ -1,8 +1,6 @@
# FreeCAD init script of the Fem module
# (c) 2001 Juergen Riegel
# ***************************************************************************
# * (c) Juergen Riegel (juergen.riegel@web.de) 2002 *
# * Copyright (c) 2001 - Juergen Riegel <juergen.riegel@web.de> *
# * Copyright (c) 2016 - Bernd Hahnebach <bernd@bimstatik.org> *
# * *
# * This file is part of the FreeCAD CAx development system. *
# * *
@@ -25,21 +23,31 @@
# * Juergen Riegel 2002 *
# ***************************************************************************/
# FreeCAD init script of the Fem module
import FreeCAD
FreeCAD.addExportType("TetGen file (*.poly)", "feminout.convert2TetGen")
FreeCAD.addImportType("FEM formats (*.unv *.med *.dat *.bdf)", "Fem")
if("BUILD_FEM_VTK" in FreeCAD.__cmake__):
FreeCAD.addImportType("FEM CFD Unstructure Mesh (*.vtk *.vtu)", "Fem")
FreeCAD.addExportType("FEM CFD Unstructure Mesh (*.vtk *.vtu)", "Fem")
FreeCAD.addImportType("FEM results (*.vtk *.vtu)", "feminout.importVTKResults")
FreeCAD.addExportType("FEM CFD Result in VTK format (*.vtk *.vtu)", "feminout.importVTKResults")
FreeCAD.addExportType("FEM formats (*.unv *.med *.dat *.inp)", "Fem")
FreeCAD.addImportType("CalculiX result (*.frd)", "feminout.importCcxFrdResults")
FreeCAD.addImportType("Fenics mesh file (*.xml *.xdmf)", "feminout.importFenicsMesh")
FreeCAD.addExportType("Fenics mesh file (*.xml *.xdmf)", "feminout.importFenicsMesh")
FreeCAD.addImportType("Mesh from Calculix/Abaqus input file (*.inp)", "feminout.importInpMesh")
FreeCAD.addImportType("Z88 mesh (i1) file (*.txt)", "feminout.importZ88Mesh")
FreeCAD.addExportType("Z88 mesh (i1) file (*.txt)", "feminout.importZ88Mesh")
FreeCAD.addImportType("Z88 displacement (o2) result file (*.txt)", "feminout.importZ88O2Results")
FreeCAD.addExportType("FEM mesh TetGen (*.poly)", "feminout.convert2TetGen")
FreeCAD.addImportType("FEM mesh formats (*.unv *.med *.dat *.bdf)", "Fem")
FreeCAD.addExportType("FEM mesh formats (*.unv *.med *.dat *.inp)", "Fem")
FreeCAD.addImportType("FEM mesh CalculiX/Abaqus (*.inp)", "feminout.importInpMesh")
FreeCAD.addImportType("FEM result CalculiX (*.frd)", "feminout.importCcxFrdResults")
FreeCAD.addImportType("FEM mesh Fenics (*.xml *.xdmf)", "feminout.importFenicsMesh")
FreeCAD.addExportType("FEM mesh Fenics (*.xml *.xdmf)", "feminout.importFenicsMesh")
FreeCAD.addImportType("FEM mesh Z88 (*i1.txt)", "feminout.importZ88Mesh")
FreeCAD.addExportType("FEM mesh Z88 (*i1.txt)", "feminout.importZ88Mesh")
FreeCAD.addImportType("FEM result Z88 displacements (*o2.txt)", "feminout.importZ88O2Results")
if("BUILD_FEM_VTK" in FreeCAD.__cmake__):
FreeCAD.addImportType("FEM mesh VTK Unstructure format (*.vtk *.vtu)", "Fem")
FreeCAD.addExportType("FEM mesh VTK Unstructure format (*.vtk *.vtu)", "Fem")
FreeCAD.addImportType("FEM result VTK Unstructure format (*.vtk *.vtu)", "importVTKResults")
FreeCAD.addExportType("FEM result VTK Unstructure format (*.vtk *.vtu)", "importVTKResults")

View File

@@ -41,10 +41,8 @@ class GmshTools():
self.mesh_obj = gmsh_mesh_obj
if analysis:
self.analysis = analysis
# group meshing turned on
else:
self.analysis = None
# group meshing turned off
# part to mesh
self.part_obj = self.mesh_obj.Part
@@ -563,7 +561,7 @@ class GmshTools():
geo.write("//\n")
geo.write("// to run Gmsh and keep file in Gmsh GUI (with log), run in bash:\n")
geo.write("// " + self.gmsh_bin + " " + self.temp_file_geo + "\n")
geo.close
geo.close()
def run_gmsh_with_geo(self):
comandlist = [self.gmsh_bin, '-', self.temp_file_geo]

View File

@@ -157,7 +157,7 @@ def get_femnodes_ele_table(femnodes_mesh, femelement_table):
for ele_node in ele_list:
femnodes_ele_table[ele_node].append([ele, pos])
pos = pos << 1
print('len femnodes_ele_table:' + str(len(femnodes_ele_table)))
print('len femnodes_ele_table: ' + str(len(femnodes_ele_table)))
# print('femnodes_ele_table: ', femnodes_ele_table)
return femnodes_ele_table
@@ -182,7 +182,7 @@ def get_bit_pattern_dict(femelement_table, femnodes_ele_table, node_set):
The number in the ele_dict is organized as a bit array.
The corresponding bit is set, if the node of the node_set is contained in the element.
'''
print('len femnodes_ele_table:' + str(len(femnodes_ele_table)))
print('len femnodes_ele_table: ' + str(len(femnodes_ele_table)))
print('len node_set: ' + str(len(node_set)))
# print('node_set: ', node_set)
bit_pattern_dict = get_copy_of_empty_femelement_table(femelement_table)
@@ -193,7 +193,7 @@ def get_bit_pattern_dict(femelement_table, femnodes_ele_table, node_set):
for node in node_set:
for nList in femnodes_ele_table[node]:
bit_pattern_dict[nList[0]][1] += nList[1]
print('len bit_pattern_dict:' + str(len(bit_pattern_dict)))
print('len bit_pattern_dict: ' + str(len(bit_pattern_dict)))
# print('bit_pattern_dict: ', bit_pattern_dict)
return bit_pattern_dict
@@ -270,7 +270,7 @@ def get_femelements_by_femnodes_bin(femelement_table, femnodes_ele_table, node_l
15: 32767,
20: 1048575}
# Now we are looking for nodes inside of the Volumes = filling the bit_pattern_dict
print('len femnodes_ele_table:' + str(len(femnodes_ele_table)))
print('len femnodes_ele_table: ' + str(len(femnodes_ele_table)))
bit_pattern_dict = get_bit_pattern_dict(femelement_table, femnodes_ele_table, node_list)
# search
ele_list = [] # The ele_list contains the result of the search.
@@ -610,7 +610,7 @@ def get_force_obj_edge_nodeload_table(femmesh, femelement_table, femnodes_mesh,
ratio_refedge_lengths = sum_node_lengths / ref_edge.Length
if ratio_refedge_lengths < 0.99 or ratio_refedge_lengths > 1.01:
FreeCAD.Console.PrintError('Error on: ' + frc_obj.Name + ' --> ' + o.Name + '.' + elem + '\n')
print(' sum_node_lengths:', sum_node_lengths)
print(' sum_node_lengths: ', sum_node_lengths)
print(' refedge_length: ', ref_edge.Length)
bad_refedge = ref_edge
sum_ref_edge_node_length += sum_node_lengths
@@ -745,7 +745,7 @@ def get_force_obj_face_nodeload_table(femmesh, femelement_table, femnodes_mesh,
ratio_refface_areas = sum_node_areas / ref_face.Area
if ratio_refface_areas < 0.99 or ratio_refface_areas > 1.01:
FreeCAD.Console.PrintError('Error on: ' + frc_obj.Name + ' --> ' + o.Name + '.' + elem + '\n')
print(' sum_node_areas:', sum_node_areas)
print(' sum_node_areas: ', sum_node_areas)
print(' ref_face_area: ', ref_face.Area)
sum_ref_face_node_area += sum_node_areas
@@ -916,7 +916,7 @@ def build_mesh_faces_of_volume_elements(face_table, femelement_table):
index = femelement_table[veID].index(n)
# print(index)
face_nodenumber_table[veID].append(index + 1) # local node number = index + 1
# print('VolElement:', veID)
# print('VolElement: ', veID)
# print(' --> ', femelement_table[veID])
# print(' --> ', face_table[veID])
# print(' --> ', face_nodenumber_table[veID])

View File

@@ -241,6 +241,7 @@ class FemInputWriter():
def get_material_elements(self):
# it only works if either Volumes or Shellthicknesses or Beamsections are in the material objects
# it means it does not work for mixed meshes and multiple materials, this is checked in check_prerequisites
# the femelement_table is only calculated for the hightest dimension in get_femelement_table
FreeCAD.Console.PrintMessage('Materials\n')
if self.femmesh.Volumes:
# we only could do this for volumes, if a mesh contains volumes we're going to use them in the analysis
@@ -252,8 +253,8 @@ class FemInputWriter():
FreeCAD.Console.PrintMessage(all_found)
FreeCAD.Console.PrintMessage('\n')
if all_found is False:
if not self.femelement_volumes_table:
self.femelement_volumes_table = FemMeshTools.get_femelement_volumes_table(self.femmesh)
if not self.femelement_table:
self.femelement_table = FemMeshTools.get_femelement_table(self.femmesh)
# we're going to use the binary search for get_femelements_by_femnodes()
# thus we need the parameter values self.femnodes_ele_table
if not self.femnodes_mesh: