Validation Case: Circular Plate with a Localized Distributed Load
Problem Statement
This mechanical simulation is part of a series of validation cases performed using OnScale Solve. A thin circular plate is subject to a distributed load at its center. Numerical analysis results for the displacement due to the prescribed geometry and load are compared against hand calculations of the analytical solution in Roark’s Formulas for Stress and Strain [1].
Geometry
The geometry for this case was composed of a circular disk with a radius of a and a thickness of t. Tbl. 1 shows the value of the dimensions of the geometry which can be downloaded here.
Plate Parameter | Symbol | Dimension [\text{mm}] |
---|---|---|
Plate radius | a | 150 |
Load radius | r_0 | 10 |
Plate Thickness | t | 1.5 |
Boundary Conditions
The circumferential edge of the disk was fixed against both rotation and translation. A pressure q of 10 \text{kPa} was applied over a region of radius r_0 about the center of the disk. Fig. 2 illustrates the applied boundary conditions and loads.
The force load W applied was calculated from W = q \cdot \pi \cdot r_0^2
Material Properties
The disk was made to consist of uniform structural steel material whose relevant properties are below.
Property | Symbol | Value |
---|---|---|
Young’s Modulus | E | 200 \text{GPa} |
Poisson’s Ratio | \nu | 0.29 |
Mesh
OnScale Solve automatically generated a 3D second-order straight-edge tetrahedral mesh. For this study, several levels of mesh refinement were used having the properties in Tbl. 2 along with further refinements using OnScale’s refinement process.
Mesh Density | Number of Cells | Number of Vertices | Degrees of Freedom |
---|---|---|---|
very coarse | 21,861 | 7,760 | 135,099 |
coarse | 35,158 | 12,161 | 214,434 |
medium | 55,866 | 19,064 | 338,733 |
fine | 102,033 | 34,256 | 613,530 |
very fine | 254,270 | 79,452 | 1,464,516 |
Results
The vertical displacement \delta(r) of the disk given by \delta(r) = \frac{-W}{16 \pi D} \left[a^2 - r^2 \left(1 + 2\ln\left(\frac{a}{r}\right)\right) \right]
where r is the radial distance from the centre of the disk, a is the radius of the disk, W is the force load and D the flexural rigidity which is given by the expression D = \frac{E \cdot t^3}{12\cdot(1-\nu^2)}
The displacement equation was evaluated from the solution for the problem of an edge clamped circular disk with a uniformly distributed load over a very small central circular area of radius r_0 [1]. As such, the expression for vertical displacement was an approximation which became a more accurate description as the radius r_0 decreased. This equation for displacement simplifies to the following expression at the centre of the disk where displacement is greatest. \delta_\text{max} = \frac{-W \cdot a^2}{16 \cdot \pi \cdot D}
These expressions gave the maximum displacement at the centre of the disk as being -22.898 \mu\text{m} while 10 mm from the centre of the disk the vertical displacement was -22.245 \mu\text{m} and at 75 mm from the centre of the disk it was -9.238 \mu\text{m}.
Tbl. 3, tbl. 4 and tbl. 5 compares the values obtained using the analytical formula and those obtained from finite element analysis performed with OnScale Solve for the centre of the disk and at a radial distance of 10 mm from the centre of the disk for different mesh densities.

Mesh Density | Degrees of Freedom | Numerical Result [\mu\text{m}] | Difference [\mu\text{m}] | Difference [%] |
---|---|---|---|---|
very coarse | 135,099 | -22.409 | 0.489 | 2.1 |
coarse | 214,434 | -22.440 | 0.458 | 2.0 |
medium | 338,733 | -22.445 | 0.453 | 2.0 |
fine | 613,530 | -22.455 | 0.0443 | 1.9 |
very fine | 1,464,516 | -22.458 | 0.440 | 1.9 |
Mesh Density | Degrees of Freedom | Numerical Result [\mu\text{m}] | Difference [\mu\text{m}] | Difference [%] |
---|---|---|---|---|
very coarse | 135,099 | -21.886 | 0.359 | 1.6 |
coarse | 214,434 | -21.916 | 0.329 | 1.5 |
medium | 338,733 | -21.920 | 0.325 | 1.5 |
fine | 613,530 | -21.930 | 0.315 | 1.4 |
very fine | 1,464,516 | -21.932 | 0.313 | 1.4 |
Mesh Density | Degrees of Freedom | Numerical Result [\mu\text{m}] | Difference [\mu\text{m}] | Difference [%] |
---|---|---|---|---|
very coarse | 135,099 | -9.152 | 0.086 | 0.9 |
coarse | 214,434 | -9.159 | 0.079 | 0.9 |
medium | 338,733 | -9.157 | 0.081 | 0.9 |
fine | 613,530 | -9.162 | 0.076 | 0.8 |
very fine | 1,464,516 | -9.163 | 0.075 | 0.8 |
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.8'
) as sim:
# General simulation settings
on.settings.EnabledPhysics([
"mechanical"
]) coord = on.GlobalCoordinates() on.settings.Mesher(use_feature_detection=True, mesh_index=0, use_regular_mesh_for_tube_model=False)
# Define geometry
geometry = on.CadFile(
'Assembly_1.x_t'
, unit=
"m"
) point = on.Point(0, 0, 0) point_2 = on.Point(0, 0, 0.0015)
# Define meshing
on.meshes.MeshFile(
'678746fae5ec7d7243fd78fa8d263a8d_mesh_volume.msh'
)
# Define material database and materials
materials = on.CloudMaterials(
'onscale'
) structural_steel = materials[
'Structural steel'
] structural_steel.alias =
'Custom Structural steel 1'
structural_steel >> geometry.parts.search(
'MkkDc5M7JEIhYlBkf'
, field=
'partIDTag'
) structural_steel >> geometry.parts.search(
'MlW33Ax8mTQcx7rNd'
, field=
'partIDTag'
) structural_steel.set(
'density'
, 7750.0) structural_steel.set(
'poissons_ratio'
, 0.29)
# Define and apply loads
restraint = on.loads.Restraint(x=True, y=True, z=True, alias=
'Restraint 1'
) restraint >> geometry.parts.search(
'MkkDc5M7JEIhYlBkf'
, field=
'partIDTag'
).faces.search(
'JHC'
, field=
'faceIDTag'
) pressure = on.loads.Pressure(1000000, alias=
'Pressure 1'
) pressure >> geometry.parts.search(
'MlW33Ax8mTQcx7rNd'
, field=
'partIDTag'
).faces.search(
'JHK'
, field=
'faceIDTag'
)
# Define output variables
field_sensor = on.sensors.FieldSensor(data=[
"Displacement"
,
"VonMises"
,
"Stress"
,
"Strain"
,
"PrincipalStress"
,
"PrincipalStrain"
,
"StrainEnergyDensity"
,
"EigenVector"
,
"PlasticStrain"
,
"EquivalentPlasticStrain"
], alias=
'Global Sensor'
) field_sensor >> geometry probe_sensor = on.sensors.ProbeSensor(data=[
"Displacement"
,
"Stress"
,
"Strain"
,
"VonMises"
,
"Temperature"
,
"Pressure"
,
"Velocity"
,
"AcousticPressure"
], alias=
'Sensor 1'
) probe_sensor >> point probe_sensor_2 = on.sensors.ProbeSensor(data=[
"Displacement"
,
"Stress"
,
"Strain"
,
"VonMises"
,
"Temperature"
,
"Pressure"
,
"Velocity"
,
"AcousticPressure"
], alias=
'Sensor 2'
) probe_sensor_2 >> point_2 reaction_sensor = on.sensors.ReactionSensor(alias=
'Reaction_Restraint 1'
) reaction_sensor >> restraint
# For OnScale System use only
geometry.set(
'onshape_workspace_id'
,
"cc9cbeccfd96fde352ca8f6d"
) geometry.set(
'onshape_doc_id'
,
"56fe84938c96d582a170bb5d"
) geometry.set(
'onshape_doc_microversion'
,
"c957542fe93a5ebde02a1034"
) geometry.set(
'onshape_assembly_id'
,
"b5779ddef95fef72e8b2a14b"
) geometry.set(
'onshape_assembly_microversion'
,
"379b7da1bc556b91d2f0e332"
)
geometry.set('onshape_assembly_microversion', "379b7da1bc556b91d2f0e332")