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:
Przemo Firszt
2015-05-21 23:02:55 +01:00
parent 99c7da8610
commit cab75ef79a

View File

@@ -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