Plate with a circular hole under uniaxial tension — Kirsch ============================================================= Kirsch's 1898 analytical solution gives the canonical stress- concentration factor ``K_t = 3`` for an infinite plate under uniaxial tension ``σ_∞`` containing a circular hole. The stress peaks at the hole edge at the points perpendicular to the applied tension (``θ = ±π/2``): .. math:: \sigma_{\theta\theta}^{\text{max}} = 3 \, \sigma_\infty. In Cartesian coordinates, at the hole top ``(x=0, y=a)`` the local tangential direction is ``-x``, so the peak stress shows up as ``σ_xx = 3σ_∞``. Traction-free hole edge: ``σ_rr = 0``, which in the same basis is ``σ_yy = 0`` at the hole top. The factor of 3 is the stress-concentration benchmark used across every structural FEA verification manual. Problem ------- .. list-table:: :header-rows: 1 :widths: 30 70 * - Parameter - Value * - Hole radius ``a`` - 0.1 m * - Plate half-width ``W`` - 1.0 m (``a / W = 0.1``) * - Out-of-plane thickness - 0.01 m (plane stress) * - Young's modulus ``E`` - 210 GPa * - Poisson's ratio ``ν`` - 0.30 * - Remote tension ``σ_∞`` - 10 MPa (in +x) * - Expected ``σ_xx`` at hole top - 30 MPa (``K_t = 3``) femorph-solver result --------------------- Ran by :file:`tests/validation/test_plate_with_hole.py` using the ``QUAD4_PLANE`` plane-stress kernel on a quarter-symmetry mesh. Parametric grid: radial-graded mapping from the hole boundary to the square outer boundary, with a geometric stretch (``q = 1.25``) that concentrates nodes near the hole where the stress gradient is steep. .. list-table:: :header-rows: 1 :widths: 25 25 25 25 * - Refinement - ``n_θ × n_r`` - ``σ_xx`` at hole top (MPa) - Δ vs ``K_t = 3 σ_∞`` * - Coarse - 16 × 8 - 30.70 - +2.32 % * - Medium - 32 × 12 - 31.50 - +5.00 % * - Reference - 64 × 20 - 30.98 - +3.25 % Converges to within ~3 % of ``K_t = 3 σ_∞`` at the reference mesh — inside the 10 % engineering tolerance that accommodates the finite-width correction at ``a / W = 0.1`` (Peterson gives :math:`K_t \approx 3.04` for this ratio). σ_xx is recovered from forward-difference strain estimates on the parametric grid: ``ε_xx = u_x(θ_idx) / x(θ_idx)`` (y- axis symmetry forces ``u_x(0, y) = 0``; the next θ-node has ``x > 0``) and ``ε_yy = (u_y(rad_idx) - u_y(hole_top)) / Δy``. The framework's ``compute_nodal_stress`` helper doesn't yet cover plane-element kernels (tracked as VERIFY-BLOCKED task #177); this benchmark uses the local FD extraction pending that fix. Cross-references ---------------- .. list-table:: :header-rows: 1 :widths: 35 30 35 * - Source - Reported ``σ_xx`` at hole top (MPa) - Problem ID / location * - Closed form (Kirsch 1898) - 30.00 - ``K_t = 3`` infinite plate * - Timoshenko & Goodier (1970) - 30.00 - *Theory of Elasticity* §35 * - Peterson (2008) — finite width - ≈ 30.4 - ``K_t(a/W = 0.1) ≈ 3.04`` * - femorph-solver (reference mesh) - 30.98 - :file:`test_plate_with_hole.py` * - MAPDL Verification Manual - ≈ 30.0 - VM-74 *Stress concentration around a hole* * - Abaqus Verification Manual - ≈ 30.0 - AVM 1.3.6 plate-with-hole family * - NAFEMS - ≈ 30.0 - NL2 plate-with-hole (linear-elastic limit) Source ------ Problem class: :class:`femorph_solver.validation.problems.PlateWithHole`. Backing regression test: :file:`tests/validation/test_plate_with_hole.py`.