From c476bcfeb0df44aa7eb8dc3aff5cf59a94d1b431 Mon Sep 17 00:00:00 2001 From: Bernd Hahnebach Date: Mon, 8 Aug 2016 06:25:30 +0200 Subject: [PATCH] FEM: solver object is used to write the eigenmode params to input file --- src/Mod/Fem/FemInputWriter.py | 7 +---- src/Mod/Fem/FemInputWriterCcx.py | 8 ++--- src/Mod/Fem/FemInputWriterZ88.py | 6 ++-- src/Mod/Fem/FemTools.py | 50 ++++++++----------------------- src/Mod/Fem/FemToolsCcx.py | 4 +-- src/Mod/Fem/FemToolsZ88.py | 3 +- src/Mod/Fem/TestFem.py | 10 +++---- src/Mod/Fem/_FemSolverCalculix.py | 1 - 8 files changed, 25 insertions(+), 64 deletions(-) diff --git a/src/Mod/Fem/FemInputWriter.py b/src/Mod/Fem/FemInputWriter.py index f67975e8f9b8..1c892c730075 100644 --- a/src/Mod/Fem/FemInputWriter.py +++ b/src/Mod/Fem/FemInputWriter.py @@ -49,8 +49,7 @@ def __init__(self, selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, shellthickness_obj, - analysis_type, eigenmode_parameters, - dir_name + analysis_type, dir_name ): self.analysis = analysis_obj self.solver_obj = solver_obj @@ -69,10 +68,6 @@ def __init__(self, self.beamsection_objects = beamsection_obj self.shellthickness_objects = shellthickness_obj self.analysis_type = analysis_type - if eigenmode_parameters: - self.no_of_eigenfrequencies = eigenmode_parameters[0] - self.eigenfrequeny_range_low = eigenmode_parameters[1] - self.eigenfrequeny_range_high = eigenmode_parameters[2] self.dir_name = dir_name if not dir_name: print('Error: FemInputWriter has no working_dir --> we gone make a temporary one!') diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 6c5aa2ec3acb..2d08724b3e11 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -44,8 +44,7 @@ def __init__(self, selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, shellthickness_obj, - analysis_type=None, eigenmode_parameters=None, - dir_name=None + analysis_type=None, dir_name=None ): FemInputWriter.FemInputWriter.__init__( @@ -57,8 +56,7 @@ def __init__(self, selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, shellthickness_obj, - analysis_type, eigenmode_parameters, - dir_name) + analysis_type, dir_name) self.file_name = self.dir_name + '/' + self.mesh_object.Name + '.inp' print('FemInputWriterCcx --> self.dir_name --> ' + self.dir_name) print('FemInputWriterCcx --> self.file_name --> ' + self.file_name) @@ -567,7 +565,7 @@ def write_analysis_frequency(self, f): f.write('** Frequency analysis\n') f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) f.write('*FREQUENCY\n') - f.write('{},{},{}\n'.format(self.no_of_eigenfrequencies, self.eigenfrequeny_range_low, self.eigenfrequeny_range_high)) + f.write('{},{},{}\n'.format(self.solver_obj.EigenmodesCount, self.solver_obj.EigenmodeLowLimit, self.solver_obj.EigenmodeHighLimit)) def write_analysis_thermomech(self, f): f.write('\n***********************************************************\n') diff --git a/src/Mod/Fem/FemInputWriterZ88.py b/src/Mod/Fem/FemInputWriterZ88.py index 19432f7abb70..b5d87ac2c6c1 100644 --- a/src/Mod/Fem/FemInputWriterZ88.py +++ b/src/Mod/Fem/FemInputWriterZ88.py @@ -41,8 +41,7 @@ def __init__(self, selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, shellthickness_obj, - analysis_type=None, eigenmode_parameters=None, - dir_name=None + analysis_type=None, dir_name=None ): FemInputWriter.FemInputWriter.__init__( @@ -54,8 +53,7 @@ def __init__(self, selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, shellthickness_obj, - analysis_type, eigenmode_parameters, - dir_name) + analysis_type, dir_name) self.file_name = self.dir_name + '/z88' print('FemInputWriterZ88 --> self.dir_name --> ' + self.dir_name) print('FemInputWriterZ88 --> self.file_name --> ' + self.file_name) diff --git a/src/Mod/Fem/FemTools.py b/src/Mod/Fem/FemTools.py index 258829e5be89..1e8c66da95ab 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -290,6 +290,7 @@ def update_objects(self): def check_prerequisites(self): message = "" + # analysis if not self.analysis: message += "No active Analysis\n" if self.analysis_type not in self.known_analysis_types: @@ -299,6 +300,18 @@ def check_prerequisites(self): import os if not (os.path.isdir(self.working_dir)): message += "Working directory \'{}\' doesn't exist.".format(self.working_dir) + # solver + if not self.solver: + message += "No solver object defined in the analysis\n" + else: + if self.analysis_type == "frequency": + if not hasattr(self.solver, "EigenmodeHighLimit"): + message += "Frequency analysis: Solver has no EigenmodeHighLimit.\n" + elif not hasattr(self.solver, "EigenmodeLowLimit"): + message += "Frequency analysis: Solver has no EigenmodeLowLimit.\n" + elif not hasattr(self.solver, "EigenmodesCount"): + message += "Frequency analysis: Solver has no EigenmodesCount.\n" + # mesh if not self.mesh: message += "No mesh object defined in the analysis\n" if self.mesh: @@ -356,43 +369,6 @@ def check_prerequisites(self): message += "Shell thicknesses defined but FEM mesh has no shell elements.\n" return message - ## Sets eigenmode parameters for CalculiX frequency analysis - # @param self The python object self - # @param number number of eigenmodes that wll be calculated, default read for FEM prefs or 10 if not set in the FEM prefs - # @param limit_low lower value of requested eigenfrequency range, default read for FEM prefs or 0.0 if not set in the FEM prefs - # @param limit_high higher value of requested eigenfrequency range, default read for FEM prefs or 1000000.o if not set in the FEM prefs - def set_eigenmode_parameters(self, number=None, limit_low=None, limit_high=None): - self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem") - if number is not None: - _number = number - else: - try: - _number = self.solver.EigenmodesCount - except: - #Not yet in prefs, so it will always default to 10 - _number = self.fem_prefs.GetInteger("EigenmodesCount", 10) - if _number < 1: - _number = 1 - - if limit_low is not None: - _limit_low = limit_low - else: - try: - _limit_low = self.solver.EigenmodeLowLimit - except: - #Not yet in prefs, so it will always default to 0.0 - _limit_low = self.fem_prefs.GetFloat("EigenmodeLowLimit", 0.0) - - if limit_high is not None: - _limit_high = limit_high - else: - try: - _limit_high = self.solver.EigenmodeHighLimit - except: - #Not yet in prefs, so it will always default to 1000000.0 - _limit_high = self.fem_prefs.GetFloat("EigenmodeHighLimit", 1000000.0) - self.eigenmode_parameters = (_number, _limit_low, _limit_high) - ## Sets base_name # @param self The python object self # @param base_name base name of .inp/.frd file (without extension). It is used to construct .inp file path that is passed to CalculiX ccx diff --git a/src/Mod/Fem/FemToolsCcx.py b/src/Mod/Fem/FemToolsCcx.py index 200ed1380a8f..f718c70f8269 100644 --- a/src/Mod/Fem/FemToolsCcx.py +++ b/src/Mod/Fem/FemToolsCcx.py @@ -69,7 +69,6 @@ def __init__(self, analysis=None, solver=None, test_mode=False): self.results_present = False if self.solver: self.set_analysis_type() - self.set_eigenmode_parameters() self.setup_working_dir() else: raise Exception('FEM: No solver found!') @@ -95,8 +94,7 @@ def write_inp_file(self): self.selfweight_constraints, self.force_constraints, self.pressure_constraints, self.temperature_constraints, self.heatflux_constraints, self.initialtemperature_constraints, self.beam_sections, self.shell_thicknesses, - self.analysis_type, self.eigenmode_parameters, - self.working_dir) + self.analysis_type, self.working_dir) self.inp_file_name = inp_writer.write_calculix_input_file() except: print("Unexpected error when writing CalculiX input file:", sys.exc_info()[0]) diff --git a/src/Mod/Fem/FemToolsZ88.py b/src/Mod/Fem/FemToolsZ88.py index 0c7595b71aca..414179ca198f 100644 --- a/src/Mod/Fem/FemToolsZ88.py +++ b/src/Mod/Fem/FemToolsZ88.py @@ -88,8 +88,7 @@ def write_inp_file(self): self.selfweight_constraints, self.force_constraints, self.pressure_constraints, self.temperature_constraints, self.heatflux_constraints, self.initialtemperature_constraints, self.beam_sections, self.shell_thicknesses, - self.analysis_type, None, - self.working_dir) + self.analysis_type, self.working_dir) self.inp_file_name = inp_writer.write_z88_input() except: print("Unexpected error when writing Z88 input files:", sys.exc_info()[0]) diff --git a/src/Mod/Fem/TestFem.py b/src/Mod/Fem/TestFem.py index db32b80fc488..77ee20b961eb 100644 --- a/src/Mod/Fem/TestFem.py +++ b/src/Mod/Fem/TestFem.py @@ -85,6 +85,9 @@ def create_new_solver(self): self.solver_object.SteadyState = True self.solver_object.MatrixSolverType = 'default' self.solver_object.IterationsControlParameterTimeUse = False + self.solver_object.EigenmodesCount = 10 + self.solver_object.EigenmodeHighLimit = 1000000.0 + self.solver_object.EigenmodeLowLimit = 0.0 self.active_doc.recompute() def create_new_mesh(self): @@ -269,11 +272,6 @@ def test_new_analysis(self): self.assertTrue(True if fea.working_dir == frequency_analysis_dir else False, "Setting working directory {} failed".format(frequency_analysis_dir)) - fcc_print('Setting eigenmode calculation parameters') - fea.set_eigenmode_parameters(number=10, limit_low=0.0, limit_high=1000000.0) - self.assertTrue(True if fea.eigenmode_parameters == (10, 0.0, 1000000.0) else False, - "Setting eigenmode calculation parameters failed") - fcc_print('Checking FEM inp file prerequisites for frequency analysis...') error = fea.check_prerequisites() self.assertFalse(error, "FemToolsCcx check_prerequisites returned error message: {}".format(error)) @@ -569,7 +567,7 @@ def create_cube_test_results(): # frequency fea.reset_all() fea.set_analysis_type('frequency') - fea.set_eigenmode_parameters(1) # we should only have one result object + fea.solver.EigenmodesCount = 1 # we should only have one result object fea.run() fea.load_results() diff --git a/src/Mod/Fem/_FemSolverCalculix.py b/src/Mod/Fem/_FemSolverCalculix.py index 8ad1f9e3dcb9..69c9cd434a8c 100644 --- a/src/Mod/Fem/_FemSolverCalculix.py +++ b/src/Mod/Fem/_FemSolverCalculix.py @@ -65,7 +65,6 @@ def __init__(self, obj): obj.EigenmodesCount = (noe, 1, 100, 1) obj.addProperty("App::PropertyFloatConstraint", "EigenmodeLowLimit", "Fem", "Low frequency limit for eigenmode calculations") - # Not yet in prefs, so it will always default to 0.0 ell = ccx_prefs.GetFloat("EigenmodeLowLimit", 0.0) obj.EigenmodeLowLimit = (ell, 0.0, 1000000.0, 10000.0)