Skip to content

Commit

Permalink
Fem: Fix in CalculiX file if not supported shapes are used for constr…
Browse files Browse the repository at this point in the history
…aints
  • Loading branch information
berndhahnebach committed Mar 6, 2015
1 parent baba116 commit 4a8e1a5
Showing 1 changed file with 47 additions and 20 deletions.
67 changes: 47 additions & 20 deletions src/Mod/Fem/MechanicalAnalysis.py
Expand Up @@ -388,9 +388,18 @@ def writeCalculixInputFile(self):
inpfile.write('*NSET,NSET=' + NodeSetName + '\n')
for o,f in FixedObject.References:
fo = o.Shape.getElement(f)
n = MeshObject.FemMesh.getNodesByFace(fo)
for i in n:
inpfile.write( str(i)+',\n')
if fo.ShapeType == 'Face':
FixedObjectType = 'AreaSupport'
n = MeshObject.FemMesh.getNodesByFace(fo)
for i in n:
inpfile.write( str(i)+',\n')
elif fo.ShapeType == 'Edge':
FixedObjectType = 'LineSupport'
print 'Line Supports are not yet implemented to export to CalculiX'
# getNodesByEdge(fo) # not implemented yet
elif fo.ShapeType == 'Vertex':
FixedObjectType = 'PointSupport'
print 'Point Supports are not yet implemented to export to CalculiX'

# write load node set
NodeSetNameForce = ForceObject.Name
Expand All @@ -400,10 +409,19 @@ def writeCalculixInputFile(self):
NbrForceNods = 0
for o,f in ForceObject.References:
fo = o.Shape.getElement(f)
n = MeshObject.FemMesh.getNodesByFace(fo)
for i in n:
inpfile.write( str(i)+',\n')
NbrForceNods = NbrForceNods + 1
if fo.ShapeType == 'Face':
ForceObjectType = 'AreaLoad'
n = MeshObject.FemMesh.getNodesByFace(fo)
for i in n:
inpfile.write( str(i)+',\n')
NbrForceNods = NbrForceNods + 1
elif fo.ShapeType == 'Edge':
ForceObjectType = 'LineLoad'
print 'Line Loads are not yet implemented to export to CalculiX'
# getNodesByEdge(fo) # not implemented yet
elif fo.ShapeType == 'Vertex':
ForceObjectType = 'PointLoad'
print 'Point Loads are not yet implemented to export to CalculiX'

# get material properties
YM = FreeCAD.Units.Quantity(MathObject.Material['Mechanical_youngsmodulus'])
Expand Down Expand Up @@ -436,24 +454,33 @@ def writeCalculixInputFile(self):

# write constaints
inpfile.write('\n\n** constaints\n')
inpfile.write('*BOUNDARY\n')
inpfile.write(NodeSetName + ',1,3,0.0\n')

if FixedObjectType == 'AreaSupport':
inpfile.write('*BOUNDARY\n')
inpfile.write(NodeSetName + ',1,3,0.0\n')
elif FixedObjectType == 'LineSupport':
pass # ToDo
elif FixedObjectType == 'PointSupport':
pass # ToDo

# write loads
#inpfile.write('*DLOAD\n')
#inpfile.write('Eall,NEWTON\n')
Force = (ForceObject.Force * 1000.0) / NbrForceNods
vec = ForceObject.DirectionVector
inpfile.write('\n\n** loads\n')
inpfile.write('** direction: ' + str(vec) + '\n')
inpfile.write('** concentrated load [N] distributed on the area of the given faces.\n')
inpfile.write('** ' + str(ForceObject.Force) + ' N * 1000 / ' + str(NbrForceNods) + ' Nodes = ' + str(Force) + ' mN on each node\n')
inpfile.write('*CLOAD\n')
inpfile.write(NodeSetNameForce + ',1,' + `vec.x * Force` + '\n')
inpfile.write(NodeSetNameForce + ',2,' + `vec.y * Force` + '\n')
inpfile.write(NodeSetNameForce + ',3,' + `vec.z * Force` + '\n')

if ForceObjectType == 'AreaLoad':
Force = (ForceObject.Force * 1000.0) / NbrForceNods
vec = ForceObject.DirectionVector
inpfile.write('** direction: ' + str(vec) + '\n')
inpfile.write('** concentrated load [N] distributed on the area of the given faces.\n')
inpfile.write('** ' + str(ForceObject.Force) + ' N * 1000 / ' + str(NbrForceNods) + ' Nodes = ' + str(Force) + ' mN on each node\n')
inpfile.write('*CLOAD\n')
inpfile.write(NodeSetNameForce + ',1,' + `vec.x * Force` + '\n')
inpfile.write(NodeSetNameForce + ',2,' + `vec.y * Force` + '\n')
inpfile.write(NodeSetNameForce + ',3,' + `vec.z * Force` + '\n')
elif ForceObjectType == 'LineLoad':
pass # ToDo
elif ForceObjectType == 'PointLoad':
pass # ToDo

# write outputs, both are needed by FreeCAD
inpfile.write('\n\n** outputs --> frd file\n')
inpfile.write('*NODE FILE\n')
Expand Down

0 comments on commit 4a8e1a5

Please sign in to comment.