Help > OnScale Solve Validation Cases > Validation Case: NAFEMS LE11 “Solid cylinder/taper/sphere-temperature” benchmark

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].


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}


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


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.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

    [1]       National Agency for Finite Element Methods & Standards,
               The standard NAFEMS benchmarks.
    Glasgow, U.K.: East Kilbride, 1990.