From 052ff9237b82a7b2daee882da846411aae4ca670 Mon Sep 17 00:00:00 2001 From: FEA-eng <59876896+FEA-eng@users.noreply.github.com> Date: Mon, 18 Aug 2025 17:33:49 +0200 Subject: [PATCH] FEM: Add support for CalculiX membrane elements (#22912) * FEM: Update solver.py * FEM: Update write_femelement_geometry.py * FEM: Update write_mesh.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * FEM: Update solver_calculix.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/Mod/Fem/femobjects/solver_calculix.py | 18 +++++++++++++++++- src/Mod/Fem/femsolver/calculix/solver.py | 10 ++++++++++ .../calculix/write_femelement_geometry.py | 9 ++++++++- src/Mod/Fem/femsolver/calculix/write_mesh.py | 5 ++++- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/Mod/Fem/femobjects/solver_calculix.py b/src/Mod/Fem/femobjects/solver_calculix.py index 6405da800d..3e007dcca8 100644 --- a/src/Mod/Fem/femobjects/solver_calculix.py +++ b/src/Mod/Fem/femobjects/solver_calculix.py @@ -320,5 +320,21 @@ class SolverCalculiX(base_fempythonobject.BaseFemPythonObject): value=["electrostatic"], ) ) - + prop.append( + _PropHelper( + type="App::PropertyBool", + name="ExcludeBendingStiffness", + group="Solver", + doc="Exclude bending stiffness to replace shells with membranes", + value=False, + ) + ) return prop + + def onDocumentRestored(self, obj): + # update old project with new properties + for prop in self._get_properties(): + try: + obj.getPropertyByName(prop.name) + except Base.PropertyError: + prop.add_to_object(obj) diff --git a/src/Mod/Fem/femsolver/calculix/solver.py b/src/Mod/Fem/femsolver/calculix/solver.py index b589f206c1..64b3da0b9b 100644 --- a/src/Mod/Fem/femsolver/calculix/solver.py +++ b/src/Mod/Fem/femsolver/calculix/solver.py @@ -423,6 +423,16 @@ class _BaseSolverCalculix: ) obj.BucklingAccuracy = 0.01 + if not hasattr(obj, "ExcludeBendingStiffness"): + obj.addProperty( + "App::PropertyBool", + "ExcludeBendingStiffness", + "Fem", + "Exclude bending stiffness to replace shells with membranes", + locked=True, + ) + obj.ExcludeBendingStiffness = False + class Proxy(solverbase.Proxy, _BaseSolverCalculix): """The Fem::FemSolver's Proxy python type, add solver specific properties""" diff --git a/src/Mod/Fem/femsolver/calculix/write_femelement_geometry.py b/src/Mod/Fem/femsolver/calculix/write_femelement_geometry.py index c08c65e546..a839093bab 100644 --- a/src/Mod/Fem/femsolver/calculix/write_femelement_geometry.py +++ b/src/Mod/Fem/femsolver/calculix/write_femelement_geometry.py @@ -115,7 +115,14 @@ def write_femelement_geometry(f, ccxwriter): shellth_obj = matgeoset["shellthickness_obj"] if ccxwriter.solver_obj.ModelSpace == "3D": offset = shellth_obj.Offset - section_def = f"*SHELL SECTION, {elsetdef}{material}, OFFSET={offset:.13G}\n" + if ccxwriter.solver_obj.ExcludeBendingStiffness: + section_def = ( + f"*MEMBRANE SECTION, {elsetdef}{material}, OFFSET={offset:.13G}\n" + ) + else: + section_def = ( + f"*SHELL SECTION, {elsetdef}{material}, OFFSET={offset:.13G}\n" + ) else: section_def = f"*SOLID SECTION, {elsetdef}{material}\n" thickness = shellth_obj.Thickness.getValueAs("mm").Value diff --git a/src/Mod/Fem/femsolver/calculix/write_mesh.py b/src/Mod/Fem/femsolver/calculix/write_mesh.py index e67bf5e707..859c5b3cc9 100644 --- a/src/Mod/Fem/femsolver/calculix/write_mesh.py +++ b/src/Mod/Fem/femsolver/calculix/write_mesh.py @@ -48,7 +48,10 @@ def write_mesh(ccxwriter): # Use 2D elements if model space is not set to 3D if ccxwriter.solver_obj.ModelSpace == "3D": - face_variant = "shell" + if ccxwriter.solver_obj.ExcludeBendingStiffness: + face_variant = "membrane" + else: + face_variant = "shell" elif ccxwriter.solver_obj.ModelSpace == "plane stress": face_variant = "stress" elif ccxwriter.solver_obj.ModelSpace == "plane strain":