/ proof-of-concept / plate-mechanics-sim
Sign in
proof-of-concept / plate-mechanics-sim
plate-mechanics-sim / packages / core / src / methods / common.ts
55 lines · 3.5 KBBlameHistoryRaw
1import type { Equation } from "./types";
3/** Equations shared by every method: the model itself and how stress follows from displacement. */
4export const GOVERNING_EQUATIONS: Equation[] = [
5 {
6 tex: String.raw`\mu\,\frac{\partial^2 w}{\partial t^2} + 2\mu\sigma_0\,\frac{\partial w}{\partial t} - 2\mu\sigma_1\,\nabla^2\frac{\partial w}{\partial t} + D\,\nabla^4 w = f(x,y,t)`,
7 caption:
8 "Damped Kirchhoff-Love plate: transverse displacement w, mass per area mu = rho h, applied pressure f. The two loss terms are a model choice.",
9 },
10 {
11 tex: String.raw`D = \frac{E h^3}{12(1-\nu^2)}, \qquad \kappa = \sqrt{D/\mu}`,
12 caption:
13 "Bending stiffness and the stiffness parameter kappa that sets the dispersion of bending waves.",
14 },
15 {
16 tex: String.raw`f(x,y,t) = F(t)\,s(x,y), \qquad \iint s\,dA = 1`,
17 caption:
18 "The load is a force history F(t) spread over a raised-cosine footprint s, so F is the total force.",
19 },
20];
22/** How the two finite-difference methods handle free edges, which have no ghost-layer form. */
23export const FREE_EDGE_EQUATIONS: Equation[] = [
24 {
25 tex: String.raw`M_n = -D\left(w_{nn} + \nu\, w_{tt}\right) = 0, \qquad V_n = -D\left(w_{nnn} + (2-\nu)\, w_{ntt}\right) = 0, \qquad w_{nt} = 0 \text{ at a corner}`,
26 caption:
27 "Free edge: no bending moment and no Kirchhoff shear, n normal and t tangent to the edge; at a free corner the twisting moment vanishes as well. The shear condition holds a third derivative, so no single ghost layer can encode it.",
28 },
29 {
30 tex: String.raw`U = \frac{D}{2}\iint \left[ w_{xx}^2 + w_{yy}^2 + 2\nu\, w_{xx} w_{yy} + 2(1-\nu)\, w_{xy}^2 \right] dA, \qquad \mathbf K = \sum_{q} \omega_q\, \mathsf D_q^{\!\top} \mathsf C\, \mathsf D_q`,
31 caption:
32 "For free edges the stiffness matrix K is assembled from the bending energy instead: finite differences of the curvatures at the nodes and cell centres with trapezoidal weights (the finite-difference energy method). K reproduces the 13-point stencil inside, satisfies the free-edge conditions as natural boundary conditions, and has exactly the three rigid-body motions in its null space; those are projected out after every step, as the soft supports of a real free-free rig would absorb them.",
33 },
34];
36export const STRESS_EQUATIONS: Equation[] = [
37 {
38 tex: String.raw`\sigma_{xx} = -\frac{E z}{1-\nu^2}\left(w_{xx} + \nu w_{yy}\right),\quad \sigma_{yy} = -\frac{E z}{1-\nu^2}\left(w_{yy} + \nu w_{xx}\right),\quad \tau_{xy} = -\frac{E z}{1+\nu}\,w_{xy}`,
39 caption:
40 "Surface stresses at z = h/2 from the curvatures. Stress is a second derivative of the primary unknown, so it inherits and amplifies the solution error.",
41 },
42 {
43 tex: String.raw`\sigma_{vM} = \sqrt{\sigma_{xx}^2 - \sigma_{xx}\sigma_{yy} + \sigma_{yy}^2 + 3\tau_{xy}^2}, \qquad \sigma_{1,2} = \frac{\sigma_{xx}+\sigma_{yy}}{2} \pm \sqrt{\left(\frac{\sigma_{xx}-\sigma_{yy}}{2}\right)^2 + \tau_{xy}^2}`,
44 caption:
45 "Von Mises equivalent stress and principal stresses; the app reports the principal stress of largest magnitude with its sign.",
46 },
47];
49export const RADIATION_EQUATIONS: Equation[] = [
50 {
51 tex: String.raw`p(\mathbf r, t) = \frac{\rho_{\mathrm{air}}}{2\pi} \iint \frac{\ddot w\!\left(\mathbf r_s,\, t - |\mathbf r - \mathbf r_s|/c\right)}{|\mathbf r - \mathbf r_s|}\, dA`,
52 caption:
53 "Rayleigh's first integral for a flat radiator in an infinite rigid baffle. It ignores diffraction around the edges, so the waveform is an estimate, not a calibrated level.",
54 },
55];
↑↓ move↵openescclose