From d8c294c54d45d3e46614eae2c254ad890e0c0709 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 1 Aug 2016 21:56:31 +0100 Subject: [PATCH] FEM: solver CalculiX: add geometrical nonlinear analysis --- src/Mod/Fem/FemInputWriterCcx.py | 8 ++++++-- src/Mod/Fem/FemToolsCcx.py | 1 + src/Mod/Fem/_FemSolverCalculix.py | 9 +++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 0b7fa25c0..1aa363942 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -225,8 +225,12 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): f.write('\n***********************************************************\n') f.write('** One step is needed to run the mechanical analysis of FreeCAD\n') f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) - f.write('*STEP\n') - f.write('*STATIC\n') + static_frequency_step = '*STEP' + if self.solver_obj.GeometricalNonlinearity == "nonlinear" and self.analysis_type == 'static': + static_frequency_step += ', NLGEOM' # https://www.comsol.com/blogs/what-is-geometric-nonlinearity/ + elif self.solver_obj.GeometricalNonlinearity == "nonlinear" and self.analysis_type == 'frequency': + print('Analysis type frequency and geometrical nonlinear analyis are not allowed together, linear is used instead!') + f.write(static_frequency_step + '\n') def write_constraints_fixed(self, f): f.write('\n***********************************************************\n') diff --git a/src/Mod/Fem/FemToolsCcx.py b/src/Mod/Fem/FemToolsCcx.py index d7cb4a530..64443e596 100644 --- a/src/Mod/Fem/FemToolsCcx.py +++ b/src/Mod/Fem/FemToolsCcx.py @@ -35,6 +35,7 @@ from PySide import QtCore class FemToolsCcx(FemTools.FemTools): known_analysis_types = ["static", "frequency"] + known_geom_nonlinear_types = ["linear", "nonlinear"] finished = QtCore.Signal(int) ## The constructor diff --git a/src/Mod/Fem/_FemSolverCalculix.py b/src/Mod/Fem/_FemSolverCalculix.py index 8b195fd54..cfe707472 100644 --- a/src/Mod/Fem/_FemSolverCalculix.py +++ b/src/Mod/Fem/_FemSolverCalculix.py @@ -50,6 +50,15 @@ class _FemSolverCalculix(): analysis_type = fem_prefs.GetInt("AnalysisType", 0) obj.AnalysisType = FemToolsCcx.FemToolsCcx.known_analysis_types[analysis_type] + known_geom_nonlinear_types = ["linear", "nonlinear"] + obj.addProperty("App::PropertyEnumeration", "GeometricalNonlinearity", "Fem", "Type of geometrical nonlinearity") + obj.GeometricalNonlinearity = known_geom_nonlinear_types + geom = ccx_prefs.GetBool("NonlinearGeometry", False) + if geom is True: + obj.GeometricalNonlinearity = known_geom_nonlinear_types[1] # nonlinear + else: + obj.GeometricalNonlinearity = known_geom_nonlinear_types[0] # linear + obj.addProperty("App::PropertyIntegerConstraint", "NumberOfEigenmodes", "Fem", "Number of modes for frequency calculations") noe = fem_prefs.GetInt("NumberOfEigenmodes", 10) obj.NumberOfEigenmodes = (noe, 1, 100, 1)