1import type { MethodDefinition } from "./types";
2import { ALL_GROUPS } from "./common";
4export const FEM_METHOD: MethodDefinition = {
5 id: "fem",
6 name: "Finite elements, Mindlin-Reissner",
7 shortName: "Finite elements",
8 summary:
9 "Q4 Mindlin-Reissner elements with transverse shear, a sparse eigensolve by subspace iteration, and the hammer integrated against the moving plate.",
10 modesFunction: "plate_fem_modes",
11 strikeFunction: "plate_fem_strike",
12 planFunction: "plate_fem_plan",
13 readingOrder: [
14 "plate_fem_modes.m",
15 "plate_fem_strike.m",
16 "plate_fem_contact.m",
17 "plate_fem_rhs.m",
18 "plate_fem_force.m",
19 "plate_fem_assemble.m",
20 "plate_fem_element.m",
21 "plate_fem_shape.m",
22 "plate_fem_interp.m",
23 "plate_fem_eigs.m",
24 "plate_fem_nodal.m",
25 "plate_fem_plan.m",
26 "plate_setup.m",
27 "plate_hertz.m",
28 "plate_damping.m",
29 "plate_radiation.m",
30 "plate_modal_free.m",
31 "plate_synthesize.m",
32 "plate_stress.m",
33 "plate_spectrum.m",
34 "plate_gauss_legendre.m",
35 "plate_plan_common.m",
36 "plate_result_schema.m",
37 ],
38 equationGroups: ALL_GROUPS.filter((g) => !g.methods || g.methods.includes("fem")),
39 validity: [
40 "Mindlin-Reissner plate theory with bilinear elements and full integration of the shear term, as in the reference simulator. The element locks in shear on a thin plate: the partials converge from above as the mesh is refined, by several percent between 32 x 32 and 80 x 80, and the default 48 x 48 mesh is about 3 percent high on the main partial.",
41 "The hammer and the plate are integrated together, so the plate moves away under the hammer; the contact is longer and the force and the impulse smaller than the rigid-target pulse. Neither contact model has been checked against a measured hammer.",
42 "The three rigid-body modes (two free rotations and the pendulum) are kept during the collision so momentum can flow into the freely hanging plate; gravity does not otherwise enter, so the rotations drift after the strike at a constant rate rather than swinging. They are left out of the sound.",
43 "The hole is not cut from the mesh; the thread is a point spring interpolated within an element. The curvatures for the stresses are element-centre gradients of the rotations averaged to the nodes, first-order accurate.",
44 "Modal damping is a three-term model (material Q, air loading, the thread's dashpot) with the constants of the reference simulator, chosen, not measured, and capped at a damping ratio of 0.08.",
45 "Radiated sound is a compact-source estimate with a smooth front/back cancellation below coincidence: meaningful in timbre and decay, approximate in level.",
46 "The eigensolver is a subspace iteration in double precision; its convergence tolerance and largest residual are reported under Run details.",
47 "The model is linear: no denting, no chatter of the hammer, no thread buzz, no room.",
48 ],
49 numericsOf: (spec) => ({ ...spec.fem }),
50 cost: { msPerWork: 0.25, msPerSampleMode: 4e-4 },
51};