3bd39d8Dome: hinge elements (sys.hinges, Bridson gradient, rest angle from sys.pos), bp_hinges, full 3D linear modes for curved nets, axial dashpots so bp_decay is exact for all modes, bp_decay takes and returns sys; dome exampleJeremy Magland 1% A domed cymbal: a shallow bow with a raised bell, free at the rim and
2% clamped at the top of the bell, struck sharply near the edge. Units are SI.
3%
4% Its bending stiffness comes from hinges across the interior edges of the
5% triangle mesh (sys.hinges). A hinge resists changes of the angle between
6% its two triangles from their angle at the rest positions, so the curved
7% shape below rests without stress. The springs carry no load at rest and
8% only resist stretching. Curvature couples bending to stretching already at
9% small amplitude, which a flat plate lacks: set Hbow = 0 and Hbell = 0 to
10% compare with the same plate flat.
11%
12% The linear modes of a curved net need all three coordinates of every free
13% bead (here about 1100), which takes some seconds; set sys.modes = false to
14% skip them.
16R = 0.2; % radius (m)
17a = 0.02; % bead spacing (m)
18sigma = 8.9; % mass per area (kg/m^2), about 1 mm of bronze
19Hbow = 0.02; % height of the bow (m)
20Hbell = 0.02; % extra height of the bell (m)
21Rbell = 0.06; % radius of the bell (m)
22kh = 230; % hinge stiffness (N m per rad^2); sets the pitch
23k = 8e6; % spring stiffness (N/m); resists stretching
25[pos, tri] = bp_hexdisk(R, a);
26r = sqrt(sum(pos(:, 1:2).^2, 2));
27pos(:, 3) = Hbow * (1 - (r / R).^2) + Hbell * max(0, 1 - (r / Rbell).^2).^2;
28E = bp_edges(tri);
29hh = bp_hinges(tri);
31sys.pos = pos;
32sys.mass = sigma * (sqrt(3)/2) * a^2;
33sys.pinned = bp_near(pos, [0 0 max(pos(:, 3))], 1.05 * a); % the mount
34sys.springs = bp_springs(pos, E, k, 0); % no tension at rest
35sys.hinges = [hh, kh * ones(size(hh, 1), 1)];
36sys = bp_decay(sys, [100 2.5; 5000 1.2]);
38% A stick on the edge: a sharp 0.3 ms push, straight down, on the beads
39% within 3 cm of a point near the rim.
40hit.t = 0;
41hit.beads = bp_near(pos, [0.17 0 0], 0.03);
42hit.force = [0 0 -150]; % peak force per bead (N)
43hit.duration = 3e-4;
44sys.hits = hit;
46sys.listen = struct('beads', bp_near(pos, [-0.1 0.06 0], 0.01), 'dir', [0 0 1]);
47sys.duration = 2.5;
49fprintf('%d beads, %d springs, %d hinges, %d struck\n', ...
50 size(pos, 1), size(E, 1), size(hh, 1), numel(hit.beads));