Validation Case: NAFEMS LE11 “Solid cylinder/taper/sphere-temperature” benchmark
Problem statement
This thermomechanical simulation is part of the NAFEMS benchmark cases. It consists of a quarter of a solid cylindrical object with an imposed temperature field. The predicted stress due to thermomechanical expansion from the simulation results is compared against the reference solution given by the NAFEMS benchmark book [1].
Geometry
The geometry is a thick hollow cylinder as shown in Fig. 1. All planar surfaces have symmetry boundary conditions such that only a quarter of the cylinder is represented in the simulation.
The CAD file for this geometry is available as an Onshape document. The dimensions of the base sketch are shown in Fig. 2.
Boundary Conditions
Symmetry boundary conditions are imposed on all planar surfaces. The temperature field is specified with an algebraic expression and imposed on the entire domain.
\begin{align*} T(x,y,z) = \sqrt{x^2+y^2} + z\end{align*}
The reference temperature is 0 ºC.
Material Properties
Homogeneous isotropic linear elastic properties are used, as specified in the original problem formulation [1].
Figure 1. NAFEMS LE11 3D CAD
Figure 2. NAFEMS LE11 dimensions
Property | Symbol | Value |
---|---|---|
Young modulus | E | 210 GPa |
Poisson’s ratio | \nu | 0.3 |
Thermal expansion coefficient | \alpha | 2.3 \times 10^{-4}~\text{ºC}^{-1} |
Mesh
OnScale Solve generated a second-order tetrahedral mesh.
Five simulations are run with the mesh density ranging from very coarse to very fine. Convergence toward the reference solution is shown in the results.
Mesh density | # of elements | # of dofs |
---|---|---|
very coarse | 765 | 5,912 |
coarse | 2,200 | 15,380 |
medium | 5,599 | 36,936 |
fine | 14,318 | 90,368 |
very fine | 82,198 | 494,148 |
Results
The z component of stress \sigma_z at point A from the simulation is compared against the reference solution \sigma_z = -105 MPa [1].
In this case we are interested in the stress at a single point which requires a relatively refined mesh in that region. OnScale computes the stress precisely at the requested point coordinates. Often if only deflections are of interest, a less refined mesh can be used.
Mesh density | # of dofs | Ref. \sigma_z MPa | Sim. \sigma_z MPa | Diff. % |
---|---|---|---|---|
very coarse | 5,912 | -105 | -97.00 | 7.6 |
coarse | 15,380 | -105 | -101.38 | 3.4 |
medium | 39,936 | -105 | -102.36 | 2.5 |
fine | 90,368 | -105 | -102.99 | 1.9 |
very fine | 494,148 | -105 | -104.65 | 0.3 |
Simulation Definition
The complete simulation definition is given below. The metadata tags for parts and faces correspond to the version of the CAD file that was imported from Onshape.
""" Auto-generated simulation code. """
import
onscale
as
on
with
on.
Simulation
(
'Simulation'
,
'Generated in SOLVE'
, version
=
'0.8.2'
)
as
sim:
# General simulation settings
on.settings.
AmbientTemperature
(
0
) on.settings.
EnabledPhysics
([
"mechanical"
,
"thermal"
]) on.settings.
Mesher
(use_feature_detection=True, mesh_index=4
) coord
=
on.
GlobalCoordinates
()
# Define geometry
geometry
=
on.
CadFile
(
'Assembly_1.x_t'
, unit
=
"m"
) point
=
on.
Point
(
1
,
0
,
0
)
# Define material database and materials
materials
=
on.
CloudMaterials
(
'onscale'
) structural_steel
=
materials[
'Structural steel'
] structural_steel.alias
=
'Customer Structural steel 1'
structural_steel
>>
geometry.parts.
search
(
'Mvy45FHalSAFz5PDD'
, field
=
'partIDTag'
) structural_steel.
set
(
'youngs_modulus'
,
210000000000.0
) structural_steel.
set
(
'thermal_expansion'
,
0.00023
)
# Define and apply loads
symmetry
=
on.loads.
Symmetry
(alias
=
'Symmetry 3'
) symmetry_2
=
on.loads.
Symmetry
(alias
=
'Symmetry 4'
) symmetry_3
=
on.loads.
Symmetry
(alias
=
'Symmetry 1'
) symmetry_3
>>
geometry.parts.
search
(
'Mvy45FHalSAFz5PDD'
, field
=
'partIDTag'
).faces.
search
(
'JFW'
, field
=
'faceIDTag'
) symmetry_4
=
on.loads.
Symmetry
(alias
=
'Symmetry 2'
) symmetry_4
>>
geometry.parts.
search
(
'Mvy45FHalSAFz5PDD'
, field
=
'partIDTag'
).faces.
search
(
'JFG'
, field
=
'faceIDTag'
) symmetry
>>
geometry.parts.
search
(
'Mvy45FHalSAFz5PDD'
, field
=
'partIDTag'
).faces.
search
(
'JFK'
, field
=
'faceIDTag'
) symmetry_2
>>
geometry.parts.
search
(
'Mvy45FHalSAFz5PDD'
, field
=
'partIDTag'
).faces.
search
(
'JFS'
, field
=
'faceIDTag'
) temperature
=
on.loads.
Temperature
(
f'sqrt(
{coord.x}
**2+
{coord.y}
**2)+
{coord.z}
'
, alias
=
'Temperature 1'
) temperature
>>
geometry.parts.
search
(
'Mvy45FHalSAFz5PDD'
, field
=
'partIDTag'
)
# Define output variables
probe_sensor
=
on.sensors.
ProbeSensor
(data
=
"Stress"
) probe_sensor
>>
point field_sensor
=
on.sensors.
FieldSensor
(data
=
[
"Displacement"
,
"VonMises"
,
"Stress"
,
"Strain"
,
"PrincipalStress"
,
"PrincipalStrain"
,
"StrainEnergyDensity"
,
"EigenVector"
,
"Temperature"
], alias
=
'Global Sensor'
) field_sensor
>>
geometry reaction_sensor
=
on.sensors.
ReactionSensor
() reaction_sensor
>>
symmetry reaction_sensor_2
=
on.sensors.
ReactionSensor
() reaction_sensor_2
>>
symmetry_2 reaction_sensor_3
=
on.sensors.
ReactionSensor
() reaction_sensor_3
>>
symmetry_3 reaction_sensor_4
=
on.sensors.
ReactionSensor
() reaction_sensor_4
>>
symmetry_4
References
The standard NAFEMS benchmarks. Glasgow, U.K.: East Kilbride, 1990.