From 20cb8e24809f19f0c2ac198ff4d789512c98e1a4 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Tue, 14 Jul 2020 08:16:57 +0200 Subject: [PATCH] FEM: vtk pipeline, and frd reader, principal stress, revert and improve 35cf9681cc5b --- src/Mod/Fem/App/FemVTKTools.cpp | 15 +++++++++--- src/Mod/Fem/feminout/importCcxFrdResults.py | 27 ++++++++++++++++----- src/Mod/Fem/femobjects/result_mechanical.py | 2 ++ src/Mod/Fem/femresult/resulttools.py | 16 +++++++++--- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/Mod/Fem/App/FemVTKTools.cpp b/src/Mod/Fem/App/FemVTKTools.cpp index 50e62ff451..fe3a345bb0 100644 --- a/src/Mod/Fem/App/FemVTKTools.cpp +++ b/src/Mod/Fem/App/FemVTKTools.cpp @@ -660,7 +660,9 @@ std::map _getFreeCADMechResultVectorProperties() { // App::PropertyVectorList will be a list of vectors in vtk std::map resFCVecProp; resFCVecProp["DisplacementVectors"] = "Displacement"; + // the following three are filled only if there is a reinforced mat object // https://forum.freecadweb.org/viewtopic.php?f=18&t=33106&start=70#p296317 + // https://forum.freecadweb.org/viewtopic.php?f=18&t=33106&p=416006#p412800 resFCVecProp["PS1Vector"] = "Major Principal Stress"; resFCVecProp["PS2Vector"] = "Intermediate Principal Stress"; resFCVecProp["PS3Vector"] = "Minor Principal Stress"; @@ -690,10 +692,17 @@ std::map _getFreeCADMechResultScalarProperties() { resFCScalProp["NodeStrainXZ"] = "Strain xz component"; resFCScalProp["NodeStrainYZ"] = "Strain yz component"; resFCScalProp["Peeq"] = "Equivalent Plastic Strain"; + // the following three are filled in all cases // https://forum.freecadweb.org/viewtopic.php?f=18&t=33106&start=70#p296317 - // resFCScalProp["PrincipalMax"] = "Major Principal Stress"; // can be plotted in Paraview as THE MAJOR PRINCIPAL STRESS MAGNITUDE - // resFCScalProp["PrincipalMed"] = "Intermediate Principal Stress"; // can be plotted in Paraview as THE INTERMEDIATE PRINCIPAL STRESS MAGNITUDE - // resFCScalProp["PrincipalMin"] = "Minor Principal Stress"; // can be plotted in Paraview as THE MINOR PRINCIPAL STRESS MAGNITUDE + // it might be these can be generated in paraview from stress tensor values as + // THE MAJOR PRINCIPAL STRESS MAGNITUDE, THE INTERMEDIATE PRINCIPAL STRESS MAGNITUDE, THE MINOR PRINCIPAL STRESS MAGNITUDE + // but I do not know how (Bernd), for some help see paraview tutorial on FreeCAD wiki + // thus TODO they might not be exported to external file format (first I need to know how to generate them in paraview) + // but there are needed anyway because the pipline in FreeCAD needs the principal stress values + // https://forum.freecadweb.org/viewtopic.php?f=18&t=33106&p=416006#p412800 + resFCScalProp["PrincipalMax"] = "Major Principal Stress"; + resFCScalProp["PrincipalMed"] = "Intermediate Principal Stress"; + resFCScalProp["PrincipalMin"] = "Minor Principal Stress"; resFCScalProp["vonMises"] = "von Mises Stress"; resFCScalProp["Temperature"] = "Temperature"; resFCScalProp["MohrCoulomb"] = "MohrCoulomb"; diff --git a/src/Mod/Fem/feminout/importCcxFrdResults.py b/src/Mod/Fem/feminout/importCcxFrdResults.py index 2316dd8e6c..2be34bcc4d 100644 --- a/src/Mod/Fem/feminout/importCcxFrdResults.py +++ b/src/Mod/Fem/feminout/importCcxFrdResults.py @@ -125,9 +125,11 @@ def importFrd( res_obj.Mesh = result_mesh_object res_obj = importToolsFem.fill_femresult_mechanical(res_obj, result_set) if analysis: + # need to be here, becasause later on, the analysis objs are needed + # see fill of principal stresses analysis.addObject(res_obj) - # complementary result object calculations + # more result object calculations from femresult import resulttools from femtools import femutils if not res_obj.MassFlowRate: @@ -138,7 +140,7 @@ def importFrd( # information 2: # if the result data has multiple result sets there will be multiple result objs # they all will use one mesh obj - # on the first res obj fill the mesh obj will be compacted, thus + # on the first res obj fill: the mesh obj will be compacted, thus # it does not need to be compacted on further result sets # but NodeNumbers need to be compacted for every result set (res object fill) # example frd file: https://forum.freecadweb.org/viewtopic.php?t=32649#p274291 @@ -155,18 +157,31 @@ def importFrd( res_obj = resulttools.add_disp_apps(res_obj) # fill vonMises res_obj = resulttools.add_von_mises(res_obj) + # fill principal stress + # if material reinforced object use add additional values to the res_obj if res_obj.getParentGroup(): has_reinforced_mat = False for obj in res_obj.getParentGroup().Group: - if obj.isDerivedFrom("App::MaterialObjectPython") \ - and femutils.is_of_type(obj, "Fem::MaterialReinforced"): + if femutils.is_of_type(obj, "Fem::MaterialReinforced"): has_reinforced_mat = True + Console.PrintLog( + "Reinfoced material object detected, " + "reinforced principal stresses and standard principal " + " stresses will be added.\n" + ) resulttools.add_principal_stress_reinforced(res_obj) break if has_reinforced_mat is False: + Console.PrintLog( + "No einfoced material object detected, " + "standard principal stresses will be added.\n" + ) # fill PrincipalMax, PrincipalMed, PrincipalMin, MaxShear res_obj = resulttools.add_principal_stress_std(res_obj) else: + Console.PrintLog( + "No Analysis detected, standard principal stresses will be added.\n" + ) # if a pure frd file was opened no analysis and thus no parent group # fill PrincipalMax, PrincipalMed, PrincipalMin, MaxShear res_obj = resulttools.add_principal_stress_std(res_obj) @@ -184,7 +199,7 @@ def importFrd( "- just no frd results where requestet in input file " "(neither 'node file' nor 'el file' in output section')\n" ) - Console.PrintMessage(error_message) + Console.PrintWarning(error_message) # create a result obj, even if we have no results but a result mesh in frd file # see error message above for more information @@ -210,7 +225,7 @@ def importFrd( "Problem on frd file import. No nodes found in frd file.\n" ) # None will be returned - # or would it be better to raise an exception if there are not even nodes in frd file + # or would it be better to raise an exception if there are not even nodes in frd file? return res_obj diff --git a/src/Mod/Fem/femobjects/result_mechanical.py b/src/Mod/Fem/femobjects/result_mechanical.py index d80f33c16b..1dff04f47b 100644 --- a/src/Mod/Fem/femobjects/result_mechanical.py +++ b/src/Mod/Fem/femobjects/result_mechanical.py @@ -114,6 +114,8 @@ class ResultMechanical(base_fempythonobject.BaseFemPythonObject): "Reinforcement ratio z-direction", True ) + # these three principal vectors are used only if there is a reinforced mat obj + # https://forum.freecadweb.org/viewtopic.php?f=18&t=33106&p=416006#p416006 obj.addProperty( "App::PropertyVectorList", "PS1Vector", diff --git a/src/Mod/Fem/femresult/resulttools.py b/src/Mod/Fem/femresult/resulttools.py index 9eab8e20d1..bc3740ea1e 100644 --- a/src/Mod/Fem/femresult/resulttools.py +++ b/src/Mod/Fem/femresult/resulttools.py @@ -374,6 +374,10 @@ def add_von_mises(res_obj): def add_principal_stress_std(res_obj): + # saved into PrincipalMax, PrincipalMed, PrincipalMin + # TODO may be use only one container for principal stresses in result object + # https://forum.freecadweb.org/viewtopic.php?f=18&t=33106&p=416006#p416006 + # but which one is better prinstress1 = [] prinstress2 = [] prinstress3 = [] @@ -396,7 +400,7 @@ def add_principal_stress_std(res_obj): res_obj.PrincipalMed = prinstress2 res_obj.PrincipalMin = prinstress3 res_obj.MaxShear = shearstress - FreeCAD.Console.PrintLog("Added principal stress and max shear values.\n") + FreeCAD.Console.PrintLog("Added standard principal stresses and max shear values.\n") return res_obj @@ -455,6 +459,10 @@ def add_principal_stress_reinforced(res_obj): # # calculate principal and max Shear and fill them in res_obj # + # saved into PS1Vector, PS2Vector, PS3Vector + # TODO may be use only one container for principal stresses in result object + # https://forum.freecadweb.org/viewtopic.php?f=18&t=33106&p=416006#p416006 + # but which one is better prinstress1 = [] prinstress2 = [] prinstress3 = [] @@ -552,9 +560,9 @@ def add_principal_stress_reinforced(res_obj): res_obj.PS2Vector = ps2v res_obj.PS3Vector = ps3v - FreeCAD.Console.PrintMessage( - "Added principal stress and max shear values as well as" - "reinforcment rations, Mohr Coloumb values.\n" + FreeCAD.Console.PrintLog( + "Added reinforcement principal stresses and max shear values as well as " + "reinforcment ratios, Mohr Coloumb values.\n" ) return res_obj