function result = plate_fd(params) % PLATE_FD Explicit finite differences for a Kirchhoff-Love plate in its mount, under gravity. % % result = plate_fd(params) advances the damped plate equation % % mu w_tt + 2 mu sigma0 w_t - 2 mu sigma1 lap(w_t) + D lap(lap(w)) % - div(N grad w) = F(t) s(x,y) + mu g_n + support forces % % on a uniform nx x ny grid with a second-order explicit scheme, the spatial % operators being the sparse energy-method matrices of plate_bending (the % 13-point biharmonic stencil inside, the free-edge conditions as natural % conditions on the edges) and plate_prestress (the in-plane stress of the % plate's own weight). The mount (plate_mount) supplies the support forces: % a thread is a transverse spring at its hole, a pad or a felt a one-sided % spring and dashpot, a vise holds a band of nodes still, fingers are a % two-sided spring over a patch. The plate starts from its static % equilibrium (plate_static) and the departure from it is carried as % rigid-body coordinates plus a flexural field (plate_rigid_basis), so that % the pendulum swing of a hanging plate and its flexural vibration come out % of one time loop. % % The step is dt = cfl * dt_max with dt_max from plate_model; the scheme is % unstable for cfl > 1 and the run stops as soon as the field diverges, % reporting the step at which it did (info.diverged_step). % % The work is in three stages, each its own file, so that a host can run the % time loop elsewhere (the lab has a WebGPU port of plate_fd_loop) while the % setup and the output stay this code: % S = plate_fd_setup(params) grid, step, statics, load, probe, listener, operators % Rec = plate_fd_loop(S) the time stepping; records probe, rigid coordinates, % support forces, frames, audio bins % result = plate_fd_output(S, Rec) stresses, audio, spectra, the result struct % % Approximations. Second-order truncation error in dx, dy, dt; free edges % and curved edges first order at the boundary; small-angle theory for the % threads and the pendulum motion; the probe is snapped to the nearest grid % node; stress fields are evaluated only at the saved frames; the audio is % an estimate of the waveform, not a calibrated level. % % See plate_result_schema for the fields of result. S = plate_fd_setup(params); Rec = plate_fd_loop(S); result = plate_fd_output(S, Rec); end