import type { MethodDefinition } from "./types"; import { ALL_GROUPS } from "./common"; export const FEM_METHOD: MethodDefinition = { id: "fem", name: "Finite elements, Mindlin-Reissner", shortName: "Finite elements", summary: "Q4 Mindlin-Reissner elements with transverse shear, a sparse eigensolve by subspace iteration, and the hammer integrated against the moving plate.", modesFunction: "plate_fem_modes", strikeFunction: "plate_fem_strike", planFunction: "plate_fem_plan", readingOrder: [ "plate_fem_modes.m", "plate_fem_strike.m", "plate_fem_contact.m", "plate_fem_rhs.m", "plate_fem_force.m", "plate_fem_assemble.m", "plate_fem_element.m", "plate_fem_shape.m", "plate_fem_interp.m", "plate_fem_eigs.m", "plate_fem_nodal.m", "plate_fem_plan.m", "plate_setup.m", "plate_hertz.m", "plate_damping.m", "plate_radiation.m", "plate_modal_free.m", "plate_synthesize.m", "plate_stress.m", "plate_spectrum.m", "plate_gauss_legendre.m", "plate_plan_common.m", "plate_result_schema.m", ], equationGroups: ALL_GROUPS.filter((g) => !g.methods || g.methods.includes("fem")), validity: [ "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.", "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.", "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.", "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.", "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.", "Radiated sound is a compact-source estimate with a smooth front/back cancellation below coincidence: meaningful in timbre and decay, approximate in level.", "The eigensolver is a subspace iteration in double precision; its convergence tolerance and largest residual are reported under Run details.", "The model is linear: no denting, no chatter of the hammer, no thread buzz, no room.", ], numericsOf: (spec) => ({ ...spec.fem }), cost: { msPerWork: 0.25, msPerSampleMode: 4e-4 }, };