1import type { MethodDefinition } from "./types";
2import { GOVERNING_EQUATIONS, RADIATION_EQUATIONS, STRESS_EQUATIONS } from "./common";
4export const MODAL_METHOD: MethodDefinition = {
5 id: "modal",
6 name: "Modal superposition",
7 shortName: "Modal",
8 summary: "Closed-form modes of the simply supported rectangle, each integrated exactly in time.",
9 solverFunction: "plate_modal",
10 supports: {
11 shape: ["rectangle"],
12 bc: ["simply-supported"],
13 excitation: ["impulse", "harmonic"],
14 audio: "full",
15 },
16 readingOrder: [
17 "plate_modal.m",
18 "plate_setup.m",
19 "plate_force_time.m",
20 "plate_force_footprint.m",
21 "plate_sdof.m",
22 "plate_stress.m",
23 "plate_listener.m",
24 "plate_spectrum.m",
25 "plate_result_schema.m",
26 ],
27 equations: [
28 ...GOVERNING_EQUATIONS,
29 {
30 tex: String.raw`\phi_{mn}(x,y) = \sin\frac{m\pi x}{a}\,\sin\frac{n\pi y}{b}, \qquad \omega_{mn} = \kappa\left[\left(\frac{m\pi}{a}\right)^2 + \left(\frac{n\pi}{b}\right)^2\right]`,
31 caption:
32 "Eigenfunctions and natural frequencies of the simply supported rectangle; exact for w = 0 and w_nn = 0 on all four edges.",
33 },
34 {
35 tex: String.raw`w = \sum_{mn} q_{mn}(t)\,\phi_{mn}(x,y), \qquad \ddot q_{mn} + 2\sigma_{mn}\dot q_{mn} + \omega_{mn}^2 q_{mn} = \frac{G_{mn}F(t)}{M_{mn}}`,
36 caption:
37 "Each mode is an independent damped oscillator with modal mass M = mu a b / 4, force factor G = integral of s phi, and damping rate sigma = sigma0 + sigma1 lambda.",
38 },
39 {
40 tex: String.raw`\begin{pmatrix} q_{n+1} \\ \dot q_{n+1} \end{pmatrix} = \mathbf A(\Delta t) \begin{pmatrix} q_n \\ \dot q_n \end{pmatrix} + \mathbf B(\Delta t) \begin{pmatrix} F_n \\ F_{n+1} \end{pmatrix}`,
41 caption:
42 "Exact state transition over one sample for a force that is linear between samples (Nigam and Jennings 1969). No stability limit and no phase error.",
43 },
44 ...STRESS_EQUATIONS,
45 ...RADIATION_EQUATIONS,
46 ],
47 validity: [
48 "Exact only for the simply supported rectangle; other edge conditions and the ellipse have no closed-form modes of this kind (a disk would need Bessel functions).",
49 "The modal sum is truncated at fmax and max_modes. Displacement converges quickly with mode count; stress converges more slowly, most of all near the strike point.",
50 "The footprint projection and the Rayleigh integral are evaluated by quadrature on fixed grids.",
51 "Damping rates are a model with two parameters, chosen, not measured.",
52 ],
53 durationOf: (spec) => spec.output.duration,
54 settingsKey: "modal",
55 usPerCellStep: 0,
56};