Hertz Contact Stress Calculator Back
Interactive Calculator

Hertz Contact Stress Calculator

Based on Hertz contact theory, compute contact pressure distribution, contact radius, and subsurface maximum shear stress for sphere and cylinder contacts in real time.

Parameter Settings
Contact Type
R₁ — Radius 1
mm
R₂ — Radius 2
mm
E₁ — Young's Modulus (Body 1)
GPa
E₂ — Young's Modulus (Body 2)
GPa
ν₁ — Poisson's Ratio 1
ν₂ — Poisson's Ratio 2
P — Applied Load
N
Results
μm
Contact Half-Width a
MPa
Max Contact Pressure p₀
MPa
Max Shear Stress τ_max
μm
τ_max Depth z*
Contact Pressure Distribution p(x)
Subsurface Stress Distribution σz, τmax vs Depth z
Contact Patch Shape (Top View)
Hertz Contact Animation — Elastic Deformation & Pressure
// Hertz contact animation (function() { const el = document.getElementById('hertzAnimCanvas'); if (!el) return; const ctx = el.getContext('2d'); let phase = 0; function getParams() { const P = parseFloat(document.getElementById('P').value) || 1000; const R1 = parseFloat(document.getElementById('R1').value) || 20; const R2v = document.getElementById('R2'); const R2 = R2v ? parseFloat(R2v.value) || 20 : Infinity; const ct = document.getElementById('contactType').value; const isCyl = ct === 'cyl-cyl' || ct === 'cyl-flat'; const isFlat = ct === 'sphere-flat' || ct === 'cyl-flat'; // contact radius a (μm → mm) const aEl = document.getElementById('sA'); const a_um = aEl ? parseFloat(aEl.textContent) || 100 : 100; const a_mm = a_um / 1000; // max pressure p0 (MPa) const p0El = document.getElementById('sP0'); const p0 = p0El ? parseFloat(p0El.textContent) || 500 : 500; return { P, R1, R2, isCyl, isFlat, a_mm, p0, ct }; } function resize() { const dpr = window.devicePixelRatio || 1; const w = Math.max(200, el.parentElement.clientWidth - 40); const H = 260; if (Math.abs(el.width - w * dpr) > 2 || el.height !== H * dpr) { el.width = w * dpr; el.height = H * dpr; el.style.width = w + 'px'; el.style.height = H + 'px'; ctx.setTransform(dpr, 0, 0, dpr, 0, 0); } return { W: w, H }; } function drawArrow(x1, y1, x2, y2, color, lw) { const dx = x2 - x1, dy = y2 - y1; const len = Math.sqrt(dx*dx + dy*dy); if (len < 1) return; const ux = dx/len, uy = dy/len; const hw = lw * 3; ctx.strokeStyle = color; ctx.lineWidth = lw; ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); ctx.fillStyle = color; ctx.beginPath(); ctx.moveTo(x2, y2); ctx.lineTo(x2 - ux*hw*2 - uy*hw, y2 - uy*hw*2 + ux*hw); ctx.lineTo(x2 - ux*hw*2 + uy*hw, y2 - uy*hw*2 - ux*hw); ctx.closePath(); ctx.fill(); } function drawBody(cx, cy, r, isFlat, isCyl, color, shine) { if (isFlat) { // Draw flat plate ctx.fillStyle = color; ctx.beginPath(); ctx.roundRect(cx - r * 1.4, cy, r * 2.8, r * 0.55, 4); ctx.fill(); ctx.strokeStyle = shine; ctx.lineWidth = 1; ctx.stroke(); } else if (isCyl) { // Cylinder (ellipse) ctx.fillStyle = color; ctx.beginPath(); ctx.ellipse(cx, cy, r, r * 0.55, 0, 0, Math.PI * 2); ctx.fill(); ctx.strokeStyle = shine; ctx.lineWidth = 1; ctx.stroke(); } else { // Sphere const g = ctx.createRadialGradient(cx - r*0.3, cy - r*0.3, r*0.05, cx, cy, r); g.addColorStop(0, '#6ab4ff'); g.addColorStop(0.6, color); g.addColorStop(1, '#002d5a'); ctx.fillStyle = g; ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI * 2); ctx.fill(); ctx.strokeStyle = shine; ctx.lineWidth = 1; ctx.stroke(); } } function frame() { const { W, H } = resize(); const { P, R1, R2, isCyl, isFlat, a_mm, p0, ct } = getParams(); phase += 0.025; ctx.clearRect(0, 0, W, H); // Background const bg = ctx.createLinearGradient(0, 0, 0, H); bg.addColorStop(0, '#f0f4f8'); bg.addColorStop(1, '#e8edf2'); ctx.fillStyle = bg; ctx.fillRect(0, 0, W, H); const cx = W / 2; // sizing: sphere/cyl occupies ~35% of height const r1Vis = Math.min(W * 0.22, H * 0.32); // Pulsating compression: smooth sine const compress = Math.abs(Math.sin(phase)); // 0→1→0 const squeeze = compress * Math.min(r1Vis * 0.08, 6); // Body 1 (top) center Y const body1CY = H * 0.25 + squeeze; // Body 2 (bottom) center Y const isFlat2 = ct === 'sphere-flat' || ct === 'cyl-flat'; const r2Vis = isFlat2 ? r1Vis * 0.4 : Math.min(W * 0.22, H * 0.32); const body2CY = H * 0.75 - squeeze; // Contact zone Y const contactY = H * 0.5; // --- Pressure distribution bar chart in centre --- const barW = Math.min(W * 0.55, 220); const barX = cx - barW / 2; const barMaxH = Math.min(60, H * 0.2); const N = 40; // Hertz: p(x) = p0 * sqrt(1-(x/a)^2), a_vis = barW/2 for (let i = 0; i < N; i++) { const xFrac = (i + 0.5) / N * 2 - 1; // -1 to 1 const pFrac = Math.sqrt(Math.max(0, 1 - xFrac * xFrac)); const bH = pFrac * barMaxH * compress; const bx = barX + (i / N) * barW; const bw = barW / N + 0.5; // Color: red=high, orange=mid, yellow=low const r = Math.round(200 + pFrac * 55); const g = Math.round(80 - pFrac * 60); ctx.fillStyle = `rgba(${r},${g},0,${0.55 + pFrac * 0.35})`; ctx.fillRect(bx, contactY - bH, bw, bH); ctx.fillRect(bx, contactY, bw, bH); // mirror below } // Contact line ctx.strokeStyle = '#d63031'; ctx.lineWidth = 2; ctx.setLineDash([4, 3]); ctx.beginPath(); ctx.moveTo(barX, contactY); ctx.lineTo(barX + barW, contactY); ctx.stroke(); ctx.setLineDash([]); // --- Body 1 (top) --- drawBody(cx, body1CY - (isFlat ? 0 : r1Vis), r1Vis, false, isCyl, '#007BFF', 'rgba(255,255,255,0.25)'); // --- Body 2 (bottom) --- drawBody(cx, isFlat2 ? contactY : body2CY - r2Vis, r2Vis, isFlat2, isCyl, '#0056b3', 'rgba(255,255,255,0.2)'); // --- Force arrows --- const fLen = 30 + compress * 12; const topBodyTop = body1CY - (isCyl ? r1Vis * 0.55 : r1Vis) - 6; drawArrow(cx, topBodyTop - fLen, cx, topBodyTop, '#e17055', 2.5); const botBodyBot = (isFlat2 ? contactY + r2Vis * 0.55 : body2CY) + 6; drawArrow(cx, botBodyBot + fLen, cx, botBodyBot, '#e17055', 2.5); // --- Labels --- ctx.font = 'bold 12px "Roboto Mono", monospace'; ctx.fillStyle = '#001F3F'; ctx.textAlign = 'left'; ctx.fillText(`P = ${P.toLocaleString()} N`, 10, 20); ctx.fillText(`a = ${(a_mm * 1000).toFixed(0)} μm`, 10, 36); ctx.fillStyle = '#d63031'; ctx.textAlign = 'right'; ctx.fillText(`p₀ = ${p0.toFixed(0)} MPa`, W - 10, 20); ctx.fillStyle = '#6c757d'; ctx.font = '11px "Noto Sans JP", sans-serif'; ctx.textAlign = 'center'; const typeLabel = { 'sphere-sphere':'Sphere-sphere', 'sphere-flat':'Sphere-flat plate', 'cyl-cyl':'Cylinder-cylinder', 'cyl-flat':'Cylinder-flat plate' }; ctx.fillText(typeLabel[ct] || ct, cx, H - 8); ctx.fillText('Hertz contact pressure p(x)', cx, contactY - barMaxH - 6); requestAnimationFrame(frame); } frame(); })();

What is Hertz Contact Stress?

🙋
What exactly is Hertz contact stress? I see it mentioned for bearings and gears, but what's happening at the microscopic level when two curved surfaces touch?
🎓
Basically, it's the localized stress that develops when two elastic bodies are pressed together. Unlike a uniform load, the pressure isn't spread evenly—it peaks at the center of the contact patch and drops to zero at the edges, forming a semi-ellipsoidal "pressure bulb." In practice, this is why a steel ball bearing can support a huge load on a tiny contact area without immediate failure. Try moving the "Applied Force" slider in the simulator above to see how the contact area grows and the peak pressure increases.
🙋
Wait, really? So the stress is actually under the surface? That seems counterintuitive. How do the material properties, like changing from steel to aluminum, affect this?
🎓
Exactly right! For many materials, the maximum shear stress occurs not at the surface but about half a contact radius below it. This is where subsurface cracks often start. The material's stiffness (Young's Modulus, $E$) and "squishiness" (Poisson's ratio, $\nu$) are critical. A softer material, like aluminum, will deform more, creating a larger contact area and thus lowering the peak pressure for the same force. You can test this by adjusting the $E_1$ and $E_2$ sliders for the two bodies in the simulator and watching the contact circle change size.
🙋
Okay, that makes sense. So what's the big deal with the "equivalent radius" ($R^*$) I see in the formulas? Why combine the curvatures of both bodies?
🎓
Great question! The equivalent radius tells you how "concentrated" the contact is. Think of it like the effective curvature of a single body pressing against a flat plane. If you press two identical spheres together, $R^*$ is just half of one sphere's radius—the contact is quite sharp. But if you press a small sphere against the inside of a huge, gently curved bowl, $R^*$ becomes large, meaning the contact patch is much wider and gentler. This is key for designing joints. Use the "Contact Type" selector to switch between sphere-sphere and sphere-flat contacts and see how $R^*$ changes instantly.

Physical Model & Key Equations

The core of Hertzian contact theory is calculating the size of the contact area and the maximum pressure at its center. For two spheres in contact, the contact patch is a circle. The theory assumes perfectly smooth, elastic materials and small, frictionless contact.

$$a = \sqrt[3]{\frac{3FR^*}{4E^*}}$$

Here, $a$ is the contact radius, $F$ is the applied normal force, $R^*$ is the equivalent radius of curvature, and $E^*$ is the equivalent Young's modulus. A larger $a$ means the load is spread over a bigger area.

The maximum contact pressure, $p_0$, occurs at the center of this circle. It is not simply force divided by area; due to the elliptical pressure distribution, it's 1.5 times the average pressure.

$$p_0 = \frac{3F}{2\pi a^2}= \sqrt[3]{\frac{6F{E^*}^2}{\pi^3 {R^*}^2}}$$

This peak Hertzian pressure is the critical value for predicting surface yielding or fatigue. The material properties are combined into the equivalent modulus $E^*$, and the geometries into the equivalent radius $R^*$, defined as:

$$ E^* = \left(\frac{1-\nu_1^2}{E_1}+ \frac{1-\nu_2^2}{E_2}\right)^{-1}, \quad R^* = \left(\frac{1}{R_1}+ \frac{1}{R_2}\right)^{-1}$$

For a sphere on a flat surface, $R_2 = \infty$, so $R^* = R_1$. A negative $R_2$ denotes a concave surface (like a ball in a socket).

Frequently Asked Questions

Set the sphere's radius of curvature R1 to the sphere's radius (positive value), and set the plane's radius of curvature R2 to infinity (∞). If numerical input is not possible, enter a very large value for R2 (e.g., 1e10 mm) to approximate a plane.
The contact area may be too small relative to the load. Check whether the radius of curvature is extremely small or if a material with a very high Young's modulus has been set. Also, ensure that the unit system (e.g., N and mm, MPa) is consistent.
Yes, it does. For concave surfaces, enter the radius of curvature as a negative value (e.g., -10 mm). This will be automatically reflected in the calculation formula for the equivalent radius of curvature R*, allowing correct simulation of concave-convex contact (e.g., ball and socket).
The position (depth) of the maximum shear stress occurring just below the contact surface serves as an indicator for predicting the location of fatigue failure (such as spalling or pitting). For example, in the design of rolling bearings or gears, if inclusions exist at this depth, the risk of damage increases, making it a useful reference for material selection and heat treatment.

Real-World Applications

Ball & Roller Bearings: This is the classic application. Hertz theory is used to calculate the contact stress between rolling elements and raceways to predict fatigue life (known as the L10 life). Engineers select materials, hardness, and curvature to keep subsurface shear stresses below the material's endurance limit.

Gear Tooth Design: The contact between meshing gear teeth is modeled as contact between two cylinders (for spur gears). Hertz contact stress, often called "contact fatigue" or "pitting resistance," is a primary failure mode. Surface treatments like carburizing are used to create a hard case that resists this pressure.

Railway Wheels & Rails: The contact patch between a steel train wheel and the rail is a small ellipse. Hertz analysis helps understand wear patterns, plastic deformation (leading to "rail head checking"), and the forces that can cause derailment on curves.

Biomechanics & Prosthetics: In artificial hip or knee joints, the metal or ceramic ball contacts a polymer or ceramic socket. Hertz calculations, though simplified, help estimate contact pressures to minimize wear debris generation and prevent premature failure of the implant.

Common Misconceptions and Points to Note

When you start using this simulator, there are several pitfalls that beginners in CAE often fall into. A major misconception is the idea that "if you make the material stronger (using high-strength steel), it can handle any high load". While material strength is indeed important, Hertzian contact stress is a "contact pressure". For example, if you double the load, the contact radius $a \propto P^{1/3}$ increases only by about 1.26 times, but the maximum contact pressure $p_0$ jumps up by about 1.59 times, proportional to $P^{2/3}$. Often, simply improving material strength isn't enough, and a fundamental design review—increasing the shape (radius of curvature) to enlarge the contact area—is necessary.

Next, a point of caution regarding parameter settings. While the simulator treats a "flat surface" as having an infinite radius of curvature, in practice, perfectly flat surfaces hardly ever exist. For instance, in the contact between a ball bearing's ball and its race, the raceway groove's radius $R_2$ is set to a value slightly larger than the ball's radius $R_1$ (e.g., 1.05 times). If you consider this a "flat" surface, the calculated contact pressure will be significantly higher (i.e., overly conservative on the safe side) than in reality, potentially leading to over-design.

Finally, it's important to understand the assumptions of this tool. Hertz theory fundamentally assumes perfectly elastic bodies, smooth surfaces, and behavior within the elastic limit. This means that if the load is high enough to cause plastic deformation, if surfaces are rough, or if fatigue from repeated loading is the primary concern, these results are merely a "first approximation". For example, if a hardened steel surface has a tiny dent, stress concentration can occur there, potentially initiating failure at a location completely different from the calculated maximum shear stress point. You should treat simulation results as idealized "reference values", and it's crucial to maintain an attitude of verifying them with physical tests or more advanced CAE analysis.