Log in
Log in Simulate Now
Log in Simulate Now
Help > OnScale Solve Validation Cases > Validation Case: Elongation of a Solid Tapered Bar

Validation Case: Elongation of a Solid Tapered Bar

Problem statement

This mechanical simulation is part of the series of validation cases performed using OnScale Solve. It consists of a tapered steel bar of square cross section which is fixed at one end face and a tensile force is applied to the other end face. The predicted axial elongation in the bar and the axial stress at the middle of the bar from the simulation results are compared against the reference solution given by Harris’ Introduction to Stress Analysis [1].


The geometry is a 200 millimeter long tapered beam as shown in fig. 1. The CAD file for this geometry is available as an Onshape document. The bar width taperes from 50 \times 50 mm to a 25 \times 25 mm.

Figure 1: Tapered Bar 3D CAD

Boundary Conditions

A restraint boundary condition is imposed on the larger end face of the bar in all directions. A 10,000 N tensile force is imposed at the other end face of the bar.

Material Properties

Homogeneous isotropic linear elastic properties of structural steel are used.

Young modulusE200 GPa
Poisson’s ratio\nu0.3


OnScale Solve generated a second-order tetrahedral mesh. Five simulations are run with the mesh density ranging from very coarse to very fine.

Mesh density# of elements# of dofs
very coarse7644,413
very fine62,251290,208


The axial elongation \Delta \ell in the bar from the simulation is compared against the reference solution [1]. The variables for the reference solution are as shown in fig. 2.

Figure 2: Variables for the Analytical Reference Solution

The reference solution for the axial elongation \Delta \ell in the bar is given by:

\Delta \ell = \frac{P \cdot L}{E \cdot d_1 \cdot d_2}

Where P is the imposed tensile force, L is the length of the bar, E is the Young’s Modulus of the bar material, d_1 is the width of the bar at the largest end face and d_2 is the width of the bar at the smallest end face as shown in fig. 2. The axial elongation is calculated to be \Delta \ell = 8 \cdot 10^{-3}~\text{mm}. The axial stress \sigma_z at a point z along the length of the bar L compared against the reference solution. The reference solution for the axial stress \sigma_z in the bar is given by:

\sigma_z(z) = \frac{P}{A(z)}

Where A(z) is the cross-sectional area at a distance z along the length of the bar L from the largest end face and P is the imposed tensile force as shown in fig. 2. The axial stress at a distance z = 100 mm along the length of the bar is calculated to be \sigma_z(100) = 7.11 MPa. Note the reference solution is not expected to converge towards zero as the reference solution is approximate because it does not take \nu into account. Also, 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 by interpolating around the probe location. Often if only displacements are of interest, a less refined mesh can be used.

Mesh density# of dofsRef. \Delta \ell\mum]Sim. \Delta \ell\mum]Diff. [%]Ref. \sigma_z [MPa]Sim. \sigma_z [MPa]Diff. [%]
very coarse4,4138.0000008.0570180.717.110007.162530.74
very fine290,2088.0000008.0565960.717.110007.158510.68
Figure 3: Axial Elongation Results

Simulation Definition

The complete simulation definition is given below.

    Auto-generated simulation code.
import onscale as on
with on.Simulation('Simulation', 'Generated in SOLVE', version = '0.8.1') as sim:
    # General simulation settings
    # Define geometry
    geometry = on.CadFile('Case_26_JLD.x_t', unit="m")
    point = on.Point(0, 0, -0.1)
    # Define meshing
    # Define material database and materials
    materials = on.CloudMaterials('onscale')
    structural_steel = materials['Structural steel']
    structural_steel >> geometry.parts[0]
    # Define and apply loads
    restraint = on.loads.Restraint(x=True, y=True, z=True, alias='Fixture 1')
    restraint >> geometry.parts[0].faces[0]
    force = on.loads.Force(-10000, [0, 0, 1], alias='Force 1')
    force >> geometry.parts[0].faces[1]
    # Define output variables
    field_sensor = on.sensors.FieldSensor(data=["Displacement", "VonMises", "Stress",
                                                "Strain", "PrincipalStress", 
                                                "PrincipalStrain", "StrainEnergyDensity",
                                                "EigenVector"], alias='Global Sensor')
    field_sensor >> geometry
    probe_sensor = on.sensors.ProbeSensor(data="Displacement", alias='Sensor 2')
    probe_sensor >> geometry.parts[0]
    probe_sensor_2 = on.sensors.ProbeSensor(data=["Stress", "VonMises"], alias='Sensor 1')
    probe_sensor_2 >> point
    reaction_sensor = on.sensors.ReactionSensor(alias='Reaction_Fixture 1')
    reaction_sensor >> restraint


C. O. Harris, Introduction to stress analysis. New York: The Macmillan Co., 1959.