FEM: Add AnalysisStats object
This commit add a new object to Analysis: AnalysisStats. AnalysisStats contains list with 15 values (an example): -0.000776373 <-- minimum X displacement -7.74494e-06 <-- average X displacement 0.000774115 <-- maximum X displacement -0.00416267 <-- minimum Y displacement -0.00204191 <-- average Y displacement 0 <-- maximum Y displacement -0.000775108 <-- minimum Z displacement 1.09288e-05 <-- average Z displacement 0.000775122 <-- maximum Z displacement 0 <-- minimum Abs displacement 0.00214509 <-- average Abs displacement 0.00430481 <-- maximum Abs displacement 0.390598 <-- minimum Von Mises Stress 0.93509 <-- average Von Mises Stress 1.47765 <-- maximum Von Mises Stress Those values will be used to set field values in FEM results dialog instead of currently used values returned by setNodeColorByResult function. Signed-off-by: Przemo Firszt <przemo@firszt.eu>
This commit is contained in:
@@ -34,6 +34,10 @@ if open.__module__ == '__builtin__':
|
||||
pyopen = open # because we'll redefine open below
|
||||
|
||||
|
||||
displacement = []
|
||||
mstress = []
|
||||
|
||||
|
||||
# read a calculix result file and extract the nodes, displacement vectores and stress values.
|
||||
def readResult(frd_input):
|
||||
frd_file = pyopen(frd_input, "r")
|
||||
@@ -90,6 +94,7 @@ def readResult(frd_input):
|
||||
disp_y = float(line[25:37])
|
||||
disp_z = float(line[37:49])
|
||||
disp[elem] = FreeCAD.Vector(disp_x, disp_y, disp_z)
|
||||
displacement.append((disp_x, disp_y, disp_z))
|
||||
if line[5:11] == "STRESS":
|
||||
stress_found = True
|
||||
#we found a displacement line in the frd file
|
||||
@@ -157,7 +162,6 @@ def importFrd(filename, Analysis=None):
|
||||
stress = m['Stress']
|
||||
if len(stress) > 0:
|
||||
o = FreeCAD.ActiveDocument.addObject('Fem::FemResultValue', 'MisesStress')
|
||||
mstress = []
|
||||
for i in stress.values():
|
||||
# Von mises stress (http://en.wikipedia.org/wiki/Von_Mises_yield_criterion)
|
||||
s11 = i[0]
|
||||
@@ -178,6 +182,31 @@ def importFrd(filename, Analysis=None):
|
||||
if(MeshObject):
|
||||
o.Mesh = MeshObject
|
||||
AnalysisObject.Member = AnalysisObject.Member + [o]
|
||||
|
||||
l = len(displacement)
|
||||
x_max, y_max, z_max = map(max, zip(*displacement))
|
||||
x_min, y_min, z_min = map(min, zip(*displacement))
|
||||
sum_list = map(sum, zip(*displacement))
|
||||
x_avg, y_avg, z_avg = [i / l for i in sum_list]
|
||||
s_max = max(mstress)
|
||||
s_min = min(mstress)
|
||||
s_avg = sum(mstress) / l
|
||||
disp_abs = []
|
||||
for d in displacement:
|
||||
disp_abs.append(sqrt(pow(d[0], 2) + pow(d[1], 2) + pow(d[2], 2)))
|
||||
a_max = max(disp_abs)
|
||||
a_min = min(disp_abs)
|
||||
a_avg = sum(disp_abs) / l
|
||||
stats = FreeCAD.ActiveDocument.addObject('Fem::FemResultValue', 'AnalysisStats')
|
||||
stats.Values = [x_min, x_avg, x_max,
|
||||
y_min, y_avg, y_max,
|
||||
z_min, z_avg, z_max,
|
||||
a_min, a_avg, a_max,
|
||||
s_min, s_avg, s_max]
|
||||
stats.DataType = 'AnalysisStats'
|
||||
stats.ElementNumbers = len(stats.Values)
|
||||
AnalysisObject.Member = AnalysisObject.Member + [stats]
|
||||
|
||||
if(FreeCAD.GuiUp):
|
||||
import FemGui
|
||||
import FreeCADGui
|
||||
|
||||
Reference in New Issue
Block a user