diff --git a/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py b/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py index 19341d19a0..c286cd72d1 100644 --- a/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py +++ b/src/Mod/Fem/femguiobjects/_ViewProviderFemSolverCalculix.py @@ -259,7 +259,6 @@ class _TaskPanelFemSolverCalculix: QApplication.setOverrideCursor(Qt.WaitCursor) self.inp_file_name = "" fea = ccxtools.FemToolsCcx(None, self.solver_object) - fea.set_analysis_type(self.solver_object.AnalysisType) fea.update_objects() fea.write_inp_file() if fea.inp_file_name != "": diff --git a/src/Mod/Fem/femsolver/calculix/tasks.py b/src/Mod/Fem/femsolver/calculix/tasks.py index cd1e4635f7..f8a04fe3ce 100644 --- a/src/Mod/Fem/femsolver/calculix/tasks.py +++ b/src/Mod/Fem/femsolver/calculix/tasks.py @@ -67,7 +67,7 @@ class Prepare(run.Prepare): c.pressure_constraints, c.temperature_constraints, c.heatflux_constraints, c.initialtemperature_constraints, c.beam_sections, c.beam_rotations, c.shell_thicknesses, c.fluid_sections, - self.solver.AnalysisType, self.directory) + self.directory) path = w.write_calculix_input_file() # report to user if task succeeded if path is not None: diff --git a/src/Mod/Fem/femsolver/calculix/writer.py b/src/Mod/Fem/femsolver/calculix/writer.py index 2bf40996d2..b186de363f 100644 --- a/src/Mod/Fem/femsolver/calculix/writer.py +++ b/src/Mod/Fem/femsolver/calculix/writer.py @@ -46,7 +46,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, beamrotation_obj, shellthickness_obj, fluidsection_obj, - analysis_type=None, dir_name=None + dir_name=None ): FemInputWriter.FemInputWriter.__init__( @@ -58,7 +58,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, beamrotation_obj, shellthickness_obj, fluidsection_obj, - analysis_type, dir_name) + dir_name) # self.dir_name does have a slash at the end self.main_file_name = self.mesh_object.Name + '.inp' self.file_name = self.dir_name + self.main_file_name diff --git a/src/Mod/Fem/femsolver/writerbase.py b/src/Mod/Fem/femsolver/writerbase.py index 1e691a4246..f9bf37da4e 100644 --- a/src/Mod/Fem/femsolver/writerbase.py +++ b/src/Mod/Fem/femsolver/writerbase.py @@ -41,10 +41,11 @@ class FemInputWriter(): selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, beamrotation_obj, shellthickness_obj, fluidsection_obj, - analysis_type, dir_name + dir_name ): self.analysis = analysis_obj self.solver_obj = solver_obj + self.analysis_type = self.solver_obj.AnalysisType self.mesh_object = mesh_obj self.material_objects = matlin_obj self.material_nonlinear_objects = matnonlin_obj @@ -63,7 +64,6 @@ class FemInputWriter(): self.beamrotation_objects = beamrotation_obj self.fluidsection_objects = fluidsection_obj self.shellthickness_objects = shellthickness_obj - self.analysis_type = analysis_type self.dir_name = dir_name if not dir_name: print('Error: FemInputWriter has no working_dir --> we are going to make a temporary one!') diff --git a/src/Mod/Fem/femsolver/z88/tasks.py b/src/Mod/Fem/femsolver/z88/tasks.py index d7b37a81dc..329608d197 100644 --- a/src/Mod/Fem/femsolver/z88/tasks.py +++ b/src/Mod/Fem/femsolver/z88/tasks.py @@ -65,7 +65,7 @@ class Prepare(run.Prepare): c.pressure_constraints, c.temperature_constraints, c.heatflux_constraints, c.initialtemperature_constraints, c.beam_sections, c.beam_rotations, c.shell_thicknesses, c.fluid_sections, - self.solver.AnalysisType, self.directory) + self.directory) path = w.write_z88_input() # report to user if task succeeded if path is not None: diff --git a/src/Mod/Fem/femsolver/z88/writer.py b/src/Mod/Fem/femsolver/z88/writer.py index 83c13312b8..84821043c5 100644 --- a/src/Mod/Fem/femsolver/z88/writer.py +++ b/src/Mod/Fem/femsolver/z88/writer.py @@ -43,7 +43,7 @@ class FemInputWriterZ88(FemInputWriter.FemInputWriter): selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, beamrotation_obj, shellthickness_obj, fluidsection_obj, - analysis_type=None, dir_name=None + dir_name=None ): FemInputWriter.FemInputWriter.__init__( @@ -55,7 +55,7 @@ class FemInputWriterZ88(FemInputWriter.FemInputWriter): selfweight_obj, force_obj, pressure_obj, temperature_obj, heatflux_obj, initialtemperature_obj, beamsection_obj, beamrotation_obj, shellthickness_obj, fluidsection_obj, - analysis_type, dir_name) + dir_name) # self.dir_name does have a slash at the end self.file_name = self.dir_name + 'z88' print('FemInputWriterZ88 --> self.dir_name --> ' + self.dir_name) diff --git a/src/Mod/Fem/femtest/testfemcommon.py b/src/Mod/Fem/femtest/testfemcommon.py index dbafa91173..f3b9b0ec80 100644 --- a/src/Mod/Fem/femtest/testfemcommon.py +++ b/src/Mod/Fem/femtest/testfemcommon.py @@ -681,6 +681,7 @@ class FemCcxAnalysisTest(unittest.TestCase): fcc_print('Checking FEM new solver...') solver_object = ObjectsFem.makeSolverCalculixCcxTools(self.active_doc, 'CalculiX') + solver_object.AnalysisType = 'static' solver_object.GeometricalNonlinearity = 'linear' solver_object.ThermoMechSteadyState = False solver_object.MatrixSolverType = 'default' @@ -753,11 +754,6 @@ class FemCcxAnalysisTest(unittest.TestCase): self.assertFalse(error, "ccxtools check_prerequisites returned error message: {}".format(error)) fcc_print('Checking FEM inp file write...') - - fcc_print('Setting analysis type to \'static\"') - fea.set_analysis_type("static") - self.assertTrue(True if fea.analysis_type == 'static' else False, "Setting analysis type to \'static\' failed") - fcc_print('Writing {}/{}.inp for static analysis'.format(static_analysis_dir, mesh_name)) error = fea.write_inp_file() self.assertFalse(error, "Writing failed") @@ -796,8 +792,8 @@ class FemCcxAnalysisTest(unittest.TestCase): fcc_print('Reset Statik analysis') fea.reset_all() fcc_print('Setting analysis type to \'frequency\"') - fea.set_analysis_type("frequency") - self.assertTrue(True if fea.analysis_type == 'frequency' else False, "Setting analysis type to \'frequency\' failed") + solver_object.AnalysisType = 'frequency' + fcc_print('Setting up working directory to {} in order to write frequency calculations'.format(frequency_analysis_dir)) fea.setup_working_dir(frequency_analysis_dir) @@ -926,10 +922,6 @@ class FemCcxAnalysisTest(unittest.TestCase): self.assertTrue(True if fea.working_dir == thermomech_analysis_dir else False, "Setting working directory {} failed".format(thermomech_analysis_dir)) - fcc_print('Setting analysis type to \'thermomech\"') - fea.set_analysis_type("thermomech") - self.assertTrue(True if fea.analysis_type == 'thermomech' else False, "Setting analysis type to \'thermomech\' failed") - fcc_print('Checking FEM inp file prerequisites for thermo-mechanical analysis...') error = fea.check_prerequisites() self.assertFalse(error, "ccxtools check_prerequisites returned error message: {}".format(error)) @@ -1174,10 +1166,6 @@ class FemCcxAnalysisTest(unittest.TestCase): self.assertTrue(True if fea.working_dir == Flow1D_thermomech_analysis_dir else False, "Setting working directory {} failed".format(Flow1D_thermomech_analysis_dir)) - fcc_print('Setting analysis type to \'thermomech\"') - fea.set_analysis_type("thermomech") - self.assertTrue(True if fea.analysis_type == 'thermomech' else False, "Setting analysis type to \'thermomech\' failed") - fcc_print('Checking FEM inp file prerequisites for thermo-mechanical analysis...') error = fea.check_prerequisites() self.assertFalse(error, "ccxtools check_prerequisites returned error message: {}".format(error)) @@ -1536,7 +1524,7 @@ def create_test_results(): print("create frequency result files") fea.reset_all() - fea.set_analysis_type('frequency') + FreeCAD.ActiveDocument.CalculiX.AnalysisType = 'frequency' fea.solver.EigenmodesCount = 1 # we should only have one result object fea.run() fea.load_results() diff --git a/src/Mod/Fem/femtools/ccxtools.py b/src/Mod/Fem/femtools/ccxtools.py index 5c7cd19a61..94a2ee4921 100644 --- a/src/Mod/Fem/femtools/ccxtools.py +++ b/src/Mod/Fem/femtools/ccxtools.py @@ -71,7 +71,6 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): # boolean variable indicating if there are calculation results ready for use self.results_present = False if self.solver: - self.set_analysis_type() self.setup_working_dir() else: raise Exception('FEM: No solver found!') @@ -274,8 +273,6 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): # analysis if not self.analysis: message += "No active Analysis\n" - if self.analysis_type not in self.known_analysis_types: - message += "Unknown analysis type: {}\n".format(self.analysis_type) if not self.working_dir: message += "Working directory not set\n" import os @@ -285,7 +282,9 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): if not self.solver: message += "No solver object defined in the analysis\n" else: - if self.analysis_type == "frequency": + if self.solver.AnalysisType not in self.known_analysis_types: + message += "Unknown analysis type: {}\n".format(self.solver.AnalysisType) + if self.solver.AnalysisType == "frequency": if not hasattr(self.solver, "EigenmodeHighLimit"): message += "Frequency analysis: Solver has no EigenmodeHighLimit.\n" elif not hasattr(self.solver, "EigenmodeLowLimit"): @@ -336,10 +335,10 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): message += "No YoungsModulus defined for at least one material.\n" if 'PoissonRatio' not in mat_map: message += "No PoissonRatio defined for at least one material.\n" # PoissonRatio is allowed to be 0.0 (in ccx), but it should be set anyway. - if self.analysis_type == "frequency" or self.selfweight_constraints: + if self.solver.AnalysisType == "frequency" or self.selfweight_constraints: if 'Density' not in mat_map: message += "No Density defined for at least one material.\n" - if self.analysis_type == "thermomech": + if self.solver.AnalysisType == "thermomech": if 'ThermalConductivity' in mat_map: if not Units.Quantity(mat_map['ThermalConductivity']).Value: message += "Value of ThermalConductivity is set to 0.0.\n" @@ -359,10 +358,10 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): message += "At least two nonlinear materials use the same linear base material. Only one nonlinear material for each linear material allowed.\n" # which analysis needs which constraints # no check in the regard of loads existence (constraint force, pressure, self weight) is done because an analysis without loads at all is an valid analysis too - if self.analysis_type == "static": + if self.solver.AnalysisType == "static": if not (self.fixed_constraints or self.displacement_constraints): message += "Static analysis: Neither constraint fixed nor constraint displacement defined.\n" - if self.analysis_type == "thermomech": + if self.solver.AnalysisType == "thermomech": if not self.initialtemperature_constraints: if not self.fluid_sections: message += "Thermomechanical analysis: No initial temperature defined.\n" @@ -455,7 +454,7 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): if self.fluid_sections: if not self.selfweight_constraints: message += "A fluid network analysis requires self weight constraint to be applied" - if self.analysis_type != "thermomech": + if self.solver.AnalysisType != "thermomech": message += "A fluid network analysis can only be done in a thermomech analysis" has_no_references = False for f in self.fluid_sections: @@ -493,19 +492,6 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): # self.working_dir does have a slash at the end self.inp_file_name = self.working_dir + self.base_name + '.inp' - ## Sets analysis type. - # @param self The python object self - # @param analysis_type type of the analysis. - def set_analysis_type(self, analysis_type=None): - if analysis_type is not None: - self.analysis_type = analysis_type - else: - try: - self.analysis_type = self.solver.AnalysisType - except: - self.fem_prefs = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem/General") - self.analysis_type = self.fem_prefs.GetString("AnalysisType", "static") - ## Sets working dir for solver execution. Called with no working_dir uses WorkingDir from FEM preferences # @param self The python object self # @working_dir directory to be used for writing solver input file or files and executing solver @@ -557,7 +543,7 @@ class FemToolsCcx(QtCore.QRunnable, QtCore.QObject): self.selfweight_constraints, self.force_constraints, self.pressure_constraints, self.temperature_constraints, self.heatflux_constraints, self.initialtemperature_constraints, self.beam_sections, self.beam_rotations, self.shell_thicknesses, self.fluid_sections, - self.analysis_type, self.working_dir) + 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])