Validation Case: Nonlinear analysis of an internally pressurized spherical shell
Overview
This article is part of the series of validation cases performed using OnScale Solve.
In this case, we have a thick-walled spherical shell subjected to a linearly increasing internal pressure. Since this problem is symmetric about three planes, only an eighth of the total geometry is needed for the analysis.
Geometry
The tank geometry is available as an Onshape document.
- \text{Internal radius} = a = 0.1~\text{m}
- \text{External radius} = b = 0.2~\text{m}

Material
The material properties are presented in Table 1.
Material properties (symbol) | Value (unit) |
---|---|
Young’s modulus (E) | 210~\text{GPa} |
Poisson’s ratio (\nu) | 0.3 |
Yield strength (\sigma_y) | 240~\text{MPa} |
Isotropic hardening modulus (H) | 0~\text{MPa} |
Physics
With reference to Figure 1:
- Symmetry Constraint
- Applied to all planar faces (Face 3, 4 and 5)
- Load
- Pressure applied to internal face, parameterized from 0 \text{MPa} to 320 \text{MPa}
Meshing
A second-order tetrahedral mesh with 1,133 vertices is used for this study.
Reference Solution
The solution is derived using methods in [1]. The relationship between the applied internal pressure and the radius c of the advancing front of plastic yield is given by
P = 2 \sigma_y \text{ln} \left( \frac{c}{a} \right) + \frac{2 \sigma_y}{3} \left( 1 -\frac{c^3}{b^3} \right)
By substituting c = a in the above equation, the initiation of plastic yield on the internal surface, P_0 can be determined. By substituting c = b, the pressure at complete plastic collapse, P_\text{lim} of the spherical shell is determined.
P_0 = \frac{2 \sigma_y}{3} \left( 1 - \frac{a^3}{b^3} \right)
P_\text{lim} = 2 \sigma_y \text{ln} \left( \frac{b}{a} \right)
Thus producing P_0 = 140 MPa and P_\text{lim} \approx 332.7 MPa.
The radial displacement at the outer surface u_b is given by
u_b =
\begin{cases}
\frac{3 P b}{2 E \left( \frac{b^3}{a^3} - 1 \right)} \left( 1 - \nu \right) \quad &\text{if } P < P_0, \\
%
\frac{\sigma_y c^3}{E b^2} \left( 1 - \nu \right) \quad &\text{otherwise}.
\end{cases}
Results Comparison
The plot below compares the values obtained using the analytical equation described above and the analysis performed using OnScale Solve. The Load is plotted against the diplacement at the outer surface in Figure 2.
The distribution of von Mises stress across the thickness for an internal pressure of P = 320 MPa is shown Figure 3. This internal pressure is close to the plastic collapse limit where r=b so much of the section has yielded.

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="2.3.0") as sim:
# Define simulation sweep parameters
param = on.Parameter("Parameter 1", 0, 320000000, 10)
# General simulation settings
on.settings.EnabledPhysics(["mechanical"]) coord = on.GlobalCoordinates() on.settings.Mesher(use_feature_detection=True, mesh_index=2)
# Define geometry
geometry = on.CadFile("eigth_sphere_JHD.x_t", unit="m")
# Define material database and materials
materials = on.CloudMaterials("onscale") material = materials["material"] material.alias = "Custom Material 1" material >> geometry.parts[0] elastic_model = on.material_models.ElasticIsotropicLinear( youngs_modulus=210000000000, poissons_ratio=0.3 ) plastic_model = on.material_models.PlasticVonMisesLinearHardening( yield_strength=240000000, isotropic_hardening_modulus=0 ) material.set("density", "7850") material.set("elastic_model", elastic_model) material.set("plastic", True) material.set("plastic_model", plastic_model)
# Define and apply loads
symmetry = on.loads.Symmetry(alias="Symmetry 1") symmetry >> geometry.parts[0].faces[2] symmetry_2 = on.loads.Symmetry(alias="Symmetry 2") symmetry_2 >> geometry.parts[0].faces[4] symmetry_3 = on.loads.Symmetry(alias="Symmetry 3") symmetry_3 >> geometry.parts[0].faces[1] pressure = on.loads.Pressure(param, alias="Pressure 1") pressure >> geometry.parts[0].faces[0]
# 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 reaction_sensor = on.sensors.ReactionSensor(alias="Reaction_Symmetry 1") reaction_sensor >> symmetry reaction_sensor_2 = on.sensors.ReactionSensor(alias="Reaction_Symmetry 2") reaction_sensor_2 >> symmetry_2 reaction_sensor_3 = on.sensors.ReactionSensor(alias="Reaction_Symmetry 3") reaction_sensor_3 >> symmetry_3