Merge pull request #239 from berndhahnebach/femprechecksandmaterials
FEM better prechecks for materials
This commit is contained in:
@@ -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!')
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user