FEM: result stats, fix some issues and add all result types
This commit is contained in:
committed by
Yorik van Havre
parent
ad8e311b22
commit
84bb32fe70
@@ -615,26 +615,36 @@ class FemTools(QtCore.QRunnable, QtCore.QObject):
|
||||
# - U1, U2, U3 - deformation
|
||||
# - Uabs - absolute deformation
|
||||
# - Sabs - Von Mises stress
|
||||
# Prin1 Principal stress 1
|
||||
# Prin2 Principal stress 2
|
||||
# Prin3 Principal stress 3
|
||||
# MaxSear maximum shear stress
|
||||
# - Prin1 - Principal stress 1
|
||||
# - Prin2 - Principal stress 2
|
||||
# - Prin3 - Principal stress 3
|
||||
# - MaxSear - maximum shear stress
|
||||
# - Peeq - peeq strain
|
||||
# - Temp - Temperature
|
||||
# - MFlow - MassFlowRate
|
||||
# - NPress - NetworkPressure
|
||||
# - None - always return (0.0, 0.0, 0.0)
|
||||
def get_stats(self, result_type):
|
||||
stats = (0.0, 0.0, 0.0)
|
||||
for m in self.analysis.Member:
|
||||
if m.isDerivedFrom("Fem::FemResultObject"):
|
||||
match = {"U1": (m.Stats[0], m.Stats[1], m.Stats[2]),
|
||||
"U2": (m.Stats[3], m.Stats[4], m.Stats[5]),
|
||||
"U3": (m.Stats[6], m.Stats[7], m.Stats[8]),
|
||||
"Uabs": (m.Stats[9], m.Stats[10], m.Stats[11]),
|
||||
"Sabs": (m.Stats[12], m.Stats[13], m.Stats[14]),
|
||||
"MaxPrin": (m.Stats[15], m.Stats[16], m.Stats[17]),
|
||||
"MidPrin": (m.Stats[18], m.Stats[19], m.Stats[20]),
|
||||
"MinPrin": (m.Stats[21], m.Stats[22], m.Stats[23]),
|
||||
"MaxShear": (m.Stats[24], m.Stats[25], m.Stats[26]),
|
||||
"None": (0.0, 0.0, 0.0)}
|
||||
stats = match[result_type]
|
||||
match_table = {
|
||||
"U1": (m.Stats[0], m.Stats[1], m.Stats[2]),
|
||||
"U2": (m.Stats[3], m.Stats[4], m.Stats[5]),
|
||||
"U3": (m.Stats[6], m.Stats[7], m.Stats[8]),
|
||||
"Uabs": (m.Stats[9], m.Stats[10], m.Stats[11]),
|
||||
"Sabs": (m.Stats[12], m.Stats[13], m.Stats[14]),
|
||||
"MaxPrin": (m.Stats[15], m.Stats[16], m.Stats[17]),
|
||||
"MidPrin": (m.Stats[18], m.Stats[19], m.Stats[20]),
|
||||
"MinPrin": (m.Stats[21], m.Stats[22], m.Stats[23]),
|
||||
"MaxShear": (m.Stats[24], m.Stats[25], m.Stats[26]),
|
||||
"Peeq": (m.Stats[27], m.Stats[28], m.Stats[29]),
|
||||
"Temp": (m.Stats[30], m.Stats[31], m.Stats[32]),
|
||||
"MFlow": (m.Stats[33], m.Stats[34], m.Stats[35]),
|
||||
"NPress": (m.Stats[36], m.Stats[37], m.Stats[38]),
|
||||
"None": (0.0, 0.0, 0.0)
|
||||
}
|
||||
stats = match_table[result_type]
|
||||
return stats
|
||||
|
||||
|
||||
|
||||
@@ -149,17 +149,22 @@ class _TaskPanelFemResultShow:
|
||||
def get_result_stats(self, type_name, analysis=None):
|
||||
if "Stats" in self.result_obj.PropertiesList:
|
||||
Stats = self.result_obj.Stats
|
||||
match_table = {"U1": (Stats[0], Stats[1], Stats[2]),
|
||||
"U2": (Stats[3], Stats[4], Stats[5]),
|
||||
"U3": (Stats[6], Stats[7], Stats[8]),
|
||||
"Uabs": (Stats[9], Stats[10], Stats[11]),
|
||||
"Sabs": (Stats[12], Stats[13], Stats[14]),
|
||||
"MaxPrin": (Stats[15], Stats[16], Stats[17]),
|
||||
"MidPrin": (Stats[18], Stats[19], Stats[20]),
|
||||
"MinPrin": (Stats[21], Stats[22], Stats[23]),
|
||||
"MaxShear": (Stats[24], Stats[25], Stats[26]),
|
||||
"Peeq": (Stats[27], Stats[28], Stats[29]),
|
||||
"None": (0.0, 0.0, 0.0)}
|
||||
match_table = {
|
||||
"U1": (Stats[0], Stats[1], Stats[2]),
|
||||
"U2": (Stats[3], Stats[4], Stats[5]),
|
||||
"U3": (Stats[6], Stats[7], Stats[8]),
|
||||
"Uabs": (Stats[9], Stats[10], Stats[11]),
|
||||
"Sabs": (Stats[12], Stats[13], Stats[14]),
|
||||
"MaxPrin": (Stats[15], Stats[16], Stats[17]),
|
||||
"MidPrin": (Stats[18], Stats[19], Stats[20]),
|
||||
"MinPrin": (Stats[21], Stats[22], Stats[23]),
|
||||
"MaxShear": (Stats[24], Stats[25], Stats[26]),
|
||||
"Peeq": (Stats[27], Stats[28], Stats[29]),
|
||||
"Temp": (Stats[30], Stats[31], Stats[32]),
|
||||
"MFlow": (Stats[33], Stats[34], Stats[35]),
|
||||
"NPress": (Stats[36], Stats[37], Stats[38]),
|
||||
"None": (0.0, 0.0, 0.0)
|
||||
}
|
||||
return match_table[type_name]
|
||||
return (0.0, 0.0, 0.0)
|
||||
|
||||
@@ -216,9 +221,7 @@ class _TaskPanelFemResultShow:
|
||||
QApplication.setOverrideCursor(Qt.WaitCursor)
|
||||
if self.suitable_results:
|
||||
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.Temperature)
|
||||
minm = min(self.result_obj.Temperature)
|
||||
avg = sum(self.result_obj.Temperature) / len(self.result_obj.Temperature)
|
||||
maxm = max(self.result_obj.Temperature)
|
||||
(minm, avg, maxm) = self.get_result_stats("Temp")
|
||||
self.set_result_stats("K", minm, avg, maxm)
|
||||
QtGui.qApp.restoreOverrideCursor()
|
||||
|
||||
@@ -227,9 +230,7 @@ class _TaskPanelFemResultShow:
|
||||
QApplication.setOverrideCursor(Qt.WaitCursor)
|
||||
if self.suitable_results:
|
||||
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.MassFlowRate)
|
||||
minm = min(self.result_obj.MassFlowRate)
|
||||
avg = sum(self.result_obj.MassFlowRate) / len(self.result_obj.MassFlowRate)
|
||||
maxm = max(self.result_obj.MassFlowRate)
|
||||
(minm, avg, maxm) = self.get_result_stats("MFlow")
|
||||
self.set_result_stats("kg/s", minm, avg, maxm)
|
||||
QtGui.qApp.restoreOverrideCursor()
|
||||
|
||||
@@ -238,9 +239,7 @@ class _TaskPanelFemResultShow:
|
||||
QApplication.setOverrideCursor(Qt.WaitCursor)
|
||||
if self.suitable_results:
|
||||
self.mesh_obj.ViewObject.setNodeColorByScalars(self.result_obj.NodeNumbers, self.result_obj.NetworkPressure)
|
||||
minm = min(self.result_obj.NetworkPressure)
|
||||
avg = sum(self.result_obj.NetworkPressure) / len(self.result_obj.NetworkPressure)
|
||||
maxm = max(self.result_obj.NetworkPressure)
|
||||
(minm, avg, maxm) = self.get_result_stats("NPress")
|
||||
self.set_result_stats("MPa", minm, avg, maxm)
|
||||
QtGui.qApp.restoreOverrideCursor()
|
||||
|
||||
|
||||
@@ -190,6 +190,7 @@ def make_femmesh(mesh_data):
|
||||
def fill_femresult_mechanical(results, result_set, span):
|
||||
''' fills an FreeCAD FEM mechanical result object with result data
|
||||
'''
|
||||
no_of_values = None
|
||||
|
||||
if 'number' in result_set:
|
||||
eigenmode_number = result_set['number']
|
||||
@@ -295,6 +296,8 @@ def fill_femresult_mechanical(results, result_set, span):
|
||||
|
||||
if 'mflow' in result_set:
|
||||
MassFlow = result_set['mflow']
|
||||
if not no_of_values:
|
||||
no_of_values = len(MassFlow)
|
||||
if len(MassFlow) > 0:
|
||||
results.MassFlowRate = list(map((lambda x: x), MassFlow.values()))
|
||||
results.Time = step_time
|
||||
@@ -310,19 +313,20 @@ def fill_femresult_mechanical(results, result_set, span):
|
||||
a_max = a_min = a_avg = s_max = s_min = s_avg = 0
|
||||
p1_min = p1_avg = p1_max = p2_min = p2_avg = p2_max = p3_min = p3_avg = p3_max = 0
|
||||
ms_min = ms_avg = ms_max = peeq_min = peeq_avg = peeq_max = 0
|
||||
temp_min = temp_avg = temp_max = mflow_min = mflow_avg = mflow_max = npress_min = npress_avg = npress_max = 0
|
||||
|
||||
if results.DisplacementVectors:
|
||||
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 / no_of_values for i in sum_list]
|
||||
a_max = max(results.DisplacementLengths)
|
||||
a_min = min(results.DisplacementLengths)
|
||||
a_avg = sum(results.DisplacementLengths) / no_of_values
|
||||
a_max = max(results.DisplacementLengths)
|
||||
if results.StressValues:
|
||||
s_max = max(results.StressValues)
|
||||
s_min = min(results.StressValues)
|
||||
s_avg = sum(results.StressValues) / no_of_values
|
||||
s_max = max(results.StressValues)
|
||||
if results.PrincipalMax:
|
||||
p1_min = min(results.PrincipalMax)
|
||||
p1_avg = sum(results.PrincipalMax) / no_of_values
|
||||
@@ -340,9 +344,21 @@ def fill_femresult_mechanical(results, result_set, span):
|
||||
ms_avg = sum(results.MaxShear) / no_of_values
|
||||
ms_max = max(results.MaxShear)
|
||||
if results.Peeq:
|
||||
peeq_max = max(results.Peeq)
|
||||
peeq_min = min(results.Peeq)
|
||||
peeq_avg = sum(results.Peeq) / no_of_values
|
||||
peeq_max = max(results.Peeq)
|
||||
if results.Temperature:
|
||||
temp_min = min(results.Temperature)
|
||||
temp_avg = sum(results.Temperature) / no_of_values
|
||||
temp_max = max(results.Temperature)
|
||||
if results.MassFlowRate:
|
||||
mflow_min = min(results.MassFlowRate)
|
||||
mflow_avg = sum(results.MassFlowRate) / no_of_values
|
||||
mflow_max = max(results.MassFlowRate)
|
||||
if results.NetworkPressure:
|
||||
npress_min = min(results.NetworkPressure)
|
||||
npress_avg = sum(results.NetworkPressure) / no_of_values
|
||||
npress_max = max(results.NetworkPressure)
|
||||
|
||||
results.Stats = [x_min, x_avg, x_max,
|
||||
y_min, y_avg, y_max,
|
||||
@@ -353,7 +369,13 @@ def fill_femresult_mechanical(results, result_set, span):
|
||||
p2_min, p2_avg, p2_max,
|
||||
p3_min, p3_avg, p3_max,
|
||||
ms_min, ms_avg, ms_max,
|
||||
peeq_min, peeq_avg, peeq_max]
|
||||
peeq_min, peeq_avg, peeq_max,
|
||||
temp_min, temp_avg, temp_max,
|
||||
mflow_min, mflow_avg, mflow_max,
|
||||
npress_min, npress_avg, npress_max]
|
||||
# do not forget to adapt the def get_stats in FemTools and _TaskPanelFemResultShow module as well as the TestFem module
|
||||
# stat_types = ["U1", "U2", "U3", "Uabs", "Sabs", "MaxPrin", "MidPrin", "MinPrin", "MaxShear", "Peeq", "Temp", "MFlow", "NPress"]
|
||||
# TODO a dictionary would be far robust than a list, but needs adapten in VTK too because of VTK result import
|
||||
|
||||
return results
|
||||
|
||||
|
||||
Reference in New Issue
Block a user