FEM: ccx writer, adapt constraint fixed to the mixed meshes

This commit is contained in:
Bernd Hahnebach
2018-02-09 22:26:11 +01:00
committed by wmayer
parent aec496e7d9
commit 1ad03336ab
2 changed files with 58 additions and 12 deletions

View File

@@ -433,9 +433,19 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
fix_obj = femobj['Object']
f.write('** ' + fix_obj.Label + '\n')
f.write('*NSET,NSET=' + fix_obj.Name + '\n')
for n in femobj['Nodes']:
f.write(str(n) + ',\n')
if self.femmesh.Volumes and (len(self.shellthickness_objects) > 0 or len(self.beamsection_objects) > 0):
if len(femobj['NodesSolid']) > 0:
f.write('*NSET,NSET=' + fix_obj.Name + 'Solid\n')
for n in femobj['NodesSolid']:
f.write(str(n) + ',\n')
if len(femobj['NodesFaceEdge']) > 0:
f.write('*NSET,NSET=' + fix_obj.Name + 'FaceEdge\n')
for n in femobj['NodesFaceEdge']:
f.write(str(n) + ',\n')
else:
f.write('*NSET,NSET=' + fix_obj.Name + '\n')
for n in femobj['Nodes']:
f.write(str(n) + ',\n')
def write_node_sets_constraints_displacement(self, f):
# get nodes
@@ -770,15 +780,32 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
f.write('** ' + femobj['Object'].Label + '\n')
fix_obj_name = femobj['Object'].Name
f.write('*BOUNDARY\n')
f.write(fix_obj_name + ',1\n')
f.write(fix_obj_name + ',2\n')
f.write(fix_obj_name + ',3\n')
if self.beamsection_objects or self.shellthickness_objects:
f.write(fix_obj_name + ',4\n')
f.write(fix_obj_name + ',5\n')
f.write(fix_obj_name + ',6\n')
f.write('\n')
if self.femmesh.Volumes and (len(self.shellthickness_objects) > 0 or len(self.beamsection_objects) > 0):
if len(femobj['NodesSolid']) > 0:
f.write('*BOUNDARY\n')
f.write(fix_obj_name + 'Solid' + ',1\n')
f.write(fix_obj_name + 'Solid' + ',2\n')
f.write(fix_obj_name + 'Solid' + ',3\n')
f.write('\n')
if len(femobj['NodesFaceEdge']) > 0:
f.write('*BOUNDARY\n')
f.write(fix_obj_name + 'FaceEdge' + ',1\n')
f.write(fix_obj_name + 'FaceEdge' + ',2\n')
f.write(fix_obj_name + 'FaceEdge' + ',3\n')
f.write(fix_obj_name + 'FaceEdge' + ',4\n')
f.write(fix_obj_name + 'FaceEdge' + ',5\n')
f.write(fix_obj_name + 'FaceEdge' + ',6\n')
f.write('\n')
else:
f.write('*BOUNDARY\n')
f.write(fix_obj_name + ',1\n')
f.write(fix_obj_name + ',2\n')
f.write(fix_obj_name + ',3\n')
if self.beamsection_objects or self.shellthickness_objects:
f.write(fix_obj_name + ',4\n')
f.write(fix_obj_name + ',5\n')
f.write(fix_obj_name + ',6\n')
f.write('\n')
def write_constraints_displacement(self, f):
f.write('\n***********************************************************\n')

View File

@@ -101,6 +101,25 @@ class FemInputWriter():
# add nodes to constraint_conflict_nodes, needed by constraint plane rotation
for node in femobj['Nodes']:
self.constraint_conflict_nodes.append(node)
# if mixed mesh with solids the node set needs to be split because solid nodes do not have rotational degree of freedom
if self.femmesh.Volumes and (len(self.shellthickness_objects) > 0 or len(self.beamsection_objects) > 0):
print('We need to find the solid nodes.')
if not self.femelement_volumes_table:
self.femelement_volumes_table = FemMeshTools.get_femelement_volumes_table(self.femmesh)
for femobj in self.fixed_objects: # femobj --> dict, FreeCAD document object is femobj['Object']
nds_solid = []
nds_faceedge = []
for n in femobj['Nodes']:
solid_node = False
for ve in self.femelement_volumes_table:
if n in self.femelement_volumes_table[ve]:
solid_node = True
nds_solid.append(n)
break
if not solid_node:
nds_faceedge.append(n)
femobj['NodesSolid'] = set(nds_solid)
femobj['NodesFaceEdge'] = set(nds_faceedge)
def get_constraints_displacement_nodes(self):
# get nodes