diff --git a/src/Mod/Fem/FemInputWriter.py b/src/Mod/Fem/FemInputWriter.py index f67975e8f9..1c892c7300 100644 --- a/src/Mod/Fem/FemInputWriter.py +++ b/src/Mod/Fem/FemInputWriter.py @@ -49,8 +49,7 @@ class FemInputWriter(): 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 @@ class FemInputWriter(): 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 6c5aa2ec3a..9f02a45832 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -44,8 +44,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): 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 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): 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) @@ -264,62 +262,44 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): f.write('** Materials\n') f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) f.write('** Young\'s modulus unit is MPa = N/mm2\n') - f.write('** Density\'s unit is t/mm^3\n') - f.write('** Thermal conductivity unit is kW/mm/K = t*mm/K*s^3\n') - f.write('** Specific Heat unit is kJ/t/K = mm^2/s^2/K\n') + if self.analysis_type == "frequency" or self.selfweight_objects: + f.write('** Density\'s unit is t/mm^3\n') + if self.analysis_type == "thermomech": + f.write('** Thermal conductivity unit is kW/mm/K = t*mm/K*s^3\n') + f.write('** Specific Heat unit is kJ/t/K = mm^2/s^2/K\n') for femobj in self.material_objects: # femobj --> dict, FreeCAD document object is femobj['Object'] mat_obj = femobj['Object'] - # get material properties - Currently in SI units: M/kg/s/Kelvin - YM_in_MPa = 1 - TC_in_WmK = 1 - TEC_in_mmK = 1 - SH_in_JkgK = 1 - PR = 1 - density_in_tonne_per_mm3 = 1 - try: - YM = FreeCAD.Units.Quantity(mat_obj.Material['YoungsModulus']) - YM_in_MPa = float(YM.getValueAs('MPa')) - except: - FreeCAD.Console.PrintError("No YoungsModulus defined for material: default used\n") - try: - PR = float(mat_obj.Material['PoissonRatio']) - except: - FreeCAD.Console.PrintError("No PoissonRatio defined for material: default used\n") - try: - TC = FreeCAD.Units.Quantity(mat_obj.Material['ThermalConductivity']) - TC_in_WmK = float(TC.getValueAs('W/m/K')) # SvdW: Add factor to force units to results' base units of t/mm/s/K - W/m/K results in no factor needed - except: - FreeCAD.Console.PrintError("No ThermalConductivity defined for material: default used\n") - try: - TEC = FreeCAD.Units.Quantity(mat_obj.Material['ThermalExpansionCoefficient']) - TEC_in_mmK = float(TEC.getValueAs('mm/mm/K')) - except: - FreeCAD.Console.PrintError("No ThermalExpansionCoefficient defined for material: default used\n") - try: - SH = FreeCAD.Units.Quantity(mat_obj.Material['SpecificHeat']) - SH_in_JkgK = float(SH.getValueAs('J/kg/K')) * 1e+06 # SvdW: Add factor to force units to results' base units of t/mm/s/K - except: - FreeCAD.Console.PrintError("No SpecificHeat defined for material: default used\n") mat_info_name = mat_obj.Material['Name'] mat_name = mat_obj.Name + # get material properties, Currently in SI units: M/kg/s/Kelvin + YM = FreeCAD.Units.Quantity(mat_obj.Material['YoungsModulus']) + YM_in_MPa = float(YM.getValueAs('MPa')) + PR = float(mat_obj.Material['PoissonRatio']) + if self.analysis_type == "frequency" or self.selfweight_objects: + density = FreeCAD.Units.Quantity(mat_obj.Material['Density']) + density_in_tonne_per_mm3 = float(density.getValueAs('t/mm^3')) + if self.analysis_type == "thermomech": + TC = FreeCAD.Units.Quantity(mat_obj.Material['ThermalConductivity']) + TC_in_WmK = float(TC.getValueAs('W/m/K')) # SvdW: Add factor to force units to results' base units of t/mm/s/K - W/m/K results in no factor needed + TEC = FreeCAD.Units.Quantity(mat_obj.Material['ThermalExpansionCoefficient']) + TEC_in_mmK = float(TEC.getValueAs('mm/mm/K')) + SH = FreeCAD.Units.Quantity(mat_obj.Material['SpecificHeat']) + SH_in_JkgK = float(SH.getValueAs('J/kg/K')) * 1e+06 # SvdW: Add factor to force units to results' base units of t/mm/s/K # write material properties - f.write('**FreeCAD material name: ' + mat_info_name + '\n') + f.write('** FreeCAD material name: ' + mat_info_name + '\n') f.write('*MATERIAL, NAME=' + mat_name + '\n') f.write('*ELASTIC \n') f.write('{0:.0f}, {1:.3f}\n'.format(YM_in_MPa, PR)) - try: - density = FreeCAD.Units.Quantity(mat_obj.Material['Density']) - density_in_tonne_per_mm3 = float(density.getValueAs('t/mm^3')) - except: - FreeCAD.Console.PrintError("No Density defined for material: default used\n") - f.write('*DENSITY \n') - f.write('{0:.3e}, \n'.format(density_in_tonne_per_mm3)) - f.write('*CONDUCTIVITY \n') - f.write('{0:.3f}, \n'.format(TC_in_WmK)) - f.write('*EXPANSION \n') - f.write('{0:.3e}, \n'.format(TEC_in_mmK)) - f.write('*SPECIFIC HEAT \n') - f.write('{0:.3e}, \n'.format(SH_in_JkgK)) + if self.analysis_type == "frequency" or self.selfweight_objects: + f.write('*DENSITY \n') + f.write('{0:.3e}, \n'.format(density_in_tonne_per_mm3)) + if self.analysis_type == "thermomech": + f.write('*CONDUCTIVITY \n') + f.write('{0:.3f}, \n'.format(TC_in_WmK)) + f.write('*EXPANSION \n') + f.write('{0:.3e}, \n'.format(TEC_in_mmK)) + f.write('*SPECIFIC HEAT \n') + f.write('{0:.3e}, \n'.format(SH_in_JkgK)) def write_femelementsets(self, f): f.write('\n***********************************************************\n') @@ -567,7 +547,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): 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 19432f7abb..b5d87ac2c6 100644 --- a/src/Mod/Fem/FemInputWriterZ88.py +++ b/src/Mod/Fem/FemInputWriterZ88.py @@ -41,8 +41,7 @@ class FemInputWriterZ88(FemInputWriter.FemInputWriter): 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 @@ class FemInputWriterZ88(FemInputWriter.FemInputWriter): 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 258829e5be..9de5680b27 100644 --- a/src/Mod/Fem/FemTools.py +++ b/src/Mod/Fem/FemTools.py @@ -290,6 +290,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): 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 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): 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: @@ -308,6 +321,7 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): message += "FEM mesh has no volume and no shell elements, either define a beam section or provide a FEM mesh with volume elements.\n" if self.mesh.FemMesh.VolumeCount == 0 and self.mesh.FemMesh.FaceCount == 0 and self.mesh.FemMesh.EdgeCount == 0: message += "FEM mesh has neither volume nor shell or edge elements. Provide a FEM mesh with elements!\n" + # materials if not self.materials: message += "No material object defined in the analysis\n" has_no_references = False @@ -316,17 +330,35 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): if has_no_references is True: message += "More than one material has an empty references list (Only one empty references list is allowed!).\n" has_no_references = True + for m in self.materials: + mat_map = m['Object'].Material + if 'YoungsModulus' not in mat_map: + 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" + if self.analysis_type == "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 'ThermalConductivity' not in mat_map: + message += "Thermomechanical analysis: No ThermalConductivity defined for at least one material.\n" + if 'ThermalExpansionCoefficient' not in mat_map: + message += "Thermomechanical analysis: No ThermalExpansionCoefficient defined for at least one material.\n" + if 'SpecificHeat' not in mat_map: + message += "Thermomechanical analysis: No SpecificHeat defined for at least one material.\n" + # constraints if self.analysis_type == "static": if not (self.fixed_constraints or self.displacement_constraints): - message += "Neither a constraint fixed nor a contraint displacement defined in the static analysis\n" + message += "Static analysis: Neither constraint fixed nor constraint displacement defined.\n" if self.analysis_type == "static": if not (self.force_constraints or self.pressure_constraints or self.selfweight_constraints): - message += "Neither constraint force nor constraint pressure or a constraint selfweight defined in the static analysis\n" + message += "Static analysis: Neither constraint force nor constraint pressure or a constraint selfweight defined.\n" if self.analysis_type == "thermomech": if not self.initialtemperature_constraints: - message += "No initial temperature defined in the thermomechanical analysis\n" + message += "Thermomechanical analysis: No initial temperature defined.\n" if len(self.initialtemperature_constraints) > 1: - message += "Only one initial temperature is allowed in thermomechanical analysis\n" + message += "Thermomechanical analysis: Only one initial temperature is allowed.\n" + # beam sections and shell thicknesses if self.beam_sections: if self.shell_thicknesses: # this needs to be checked only once either here or in shell_thicknesses @@ -356,43 +388,6 @@ class FemTools(QtCore.QRunnable, QtCore.QObject): 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 200ed1380a..f718c70f82 100644 --- a/src/Mod/Fem/FemToolsCcx.py +++ b/src/Mod/Fem/FemToolsCcx.py @@ -69,7 +69,6 @@ class FemToolsCcx(FemTools.FemTools): 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 @@ class FemToolsCcx(FemTools.FemTools): 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 0c7595b71a..414179ca19 100644 --- a/src/Mod/Fem/FemToolsZ88.py +++ b/src/Mod/Fem/FemToolsZ88.py @@ -88,8 +88,7 @@ class FemToolsZ88(FemTools.FemTools): 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 db32b80fc4..77ee20b961 100644 --- a/src/Mod/Fem/TestFem.py +++ b/src/Mod/Fem/TestFem.py @@ -85,6 +85,9 @@ class FemTest(unittest.TestCase): 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 @@ class FemTest(unittest.TestCase): 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 8ad1f9e3dc..69c9cd434a 100644 --- a/src/Mod/Fem/_FemSolverCalculix.py +++ b/src/Mod/Fem/_FemSolverCalculix.py @@ -65,7 +65,6 @@ class _FemSolverCalculix(): 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) diff --git a/src/Mod/Fem/_TaskPanelMechanicalMaterial.py b/src/Mod/Fem/_TaskPanelMechanicalMaterial.py index 25faa9d5b7..563b85bfeb 100644 --- a/src/Mod/Fem/_TaskPanelMechanicalMaterial.py +++ b/src/Mod/Fem/_TaskPanelMechanicalMaterial.py @@ -126,22 +126,22 @@ class _TaskPanelMechanicalMaterial: webbrowser.open("http://matweb.com") def check_material_keys(self): - if not 'YoungsModulus' in self.material: + if 'YoungsModulus' not in self.material: print('YoungsModulus not found in material data of: ' + self.material['Name']) self.material['YoungsModulus'] = '0 MPa' - if not 'Density' in self.material: + if 'Density' not in self.material: print('Density not found in material data of: ' + self.material['Name']) self.material['Density'] = '0 kg/m^3' - if not 'PoissonRatio' in self.material: + if 'PoissonRatio' not in self.material: print('PoissonRatio not found in material data of: ' + self.material['Name']) self.material['PoissonRatio'] = '0' - if not 'ThermalConductivity' in self.material: + if 'ThermalConductivity' not in self.material: print('ThermalConductivity not found in material data of: ' + self.material['Name']) self.material['ThermalConductivity'] = '0 W/m/K' - if not 'ThermalExpansionCoefficient' in self.material: + if 'ThermalExpansionCoefficient' not in self.material: print('ThermalExpansionCoefficient not found in material data of: ' + self.material['Name']) self.material['ThermalExpansionCoefficient'] = '0 um/m/K' - if not 'SpecificHeat' in self.material: + if 'SpecificHeat' not in self.material: print('SpecificHeat not found in material data of: ' + self.material['Name']) self.material['SpecificHeat'] = '0 J/kg/K' diff --git a/src/Mod/Fem/test_files/ccx/cube_frequency.inp b/src/Mod/Fem/test_files/ccx/cube_frequency.inp index 13d878f0c3..d73be71730 100644 --- a/src/Mod/Fem/test_files/ccx/cube_frequency.inp +++ b/src/Mod/Fem/test_files/ccx/cube_frequency.inp @@ -469,20 +469,12 @@ Eall ** written by write_materials function ** Young's modulus unit is MPa = N/mm2 ** Density's unit is t/mm^3 -** Thermal conductivity unit is kW/mm/K = t*mm/K*s^3 -** Specific Heat unit is kJ/t/K = mm^2/s^2/K -**FreeCAD material name: Steel-Generic +** FreeCAD material name: Steel-Generic *MATERIAL, NAME=MechanicalMaterial *ELASTIC 200000, 0.300 *DENSITY 7.900e-09, -*CONDUCTIVITY -1.000, -*EXPANSION -1.000e+00, -*SPECIFIC HEAT -1.000e+00, *********************************************************** ** Sections diff --git a/src/Mod/Fem/test_files/ccx/cube_static.inp b/src/Mod/Fem/test_files/ccx/cube_static.inp index 2a1b1075cf..da7c57152c 100644 --- a/src/Mod/Fem/test_files/ccx/cube_static.inp +++ b/src/Mod/Fem/test_files/ccx/cube_static.inp @@ -468,21 +468,10 @@ Eall ** Materials ** written by write_materials function ** Young's modulus unit is MPa = N/mm2 -** Density's unit is t/mm^3 -** Thermal conductivity unit is kW/mm/K = t*mm/K*s^3 -** Specific Heat unit is kJ/t/K = mm^2/s^2/K -**FreeCAD material name: Steel-Generic +** FreeCAD material name: Steel-Generic *MATERIAL, NAME=MechanicalMaterial *ELASTIC 200000, 0.300 -*DENSITY -7.900e-09, -*CONDUCTIVITY -1.000, -*EXPANSION -1.000e+00, -*SPECIFIC HEAT -1.000e+00, *********************************************************** ** Sections diff --git a/src/Mod/Fem/test_files/ccx/spine_thermomech.inp b/src/Mod/Fem/test_files/ccx/spine_thermomech.inp index 7fa8715e7f..a72e049798 100644 --- a/src/Mod/Fem/test_files/ccx/spine_thermomech.inp +++ b/src/Mod/Fem/test_files/ccx/spine_thermomech.inp @@ -98,15 +98,12 @@ Eall ** Materials ** written by write_materials function ** Young's modulus unit is MPa = N/mm2 -** Density's unit is t/mm^3 ** Thermal conductivity unit is kW/mm/K = t*mm/K*s^3 ** Specific Heat unit is kJ/t/K = mm^2/s^2/K -**FreeCAD material name: Steel-Generic +** FreeCAD material name: Steel-Generic *MATERIAL, NAME=MechanicalMaterial *ELASTIC 200000, 0.300 -*DENSITY -7.900e-09, *CONDUCTIVITY 43.270, *EXPANSION