cymbal2: four challenges on one thin-shell cymbal model with a stick strike
12 changed files+597−0
.mochi/workflows/results.ymladded+30−0View file
@@ -0,0 +1,30 @@
1+name: Results
2+on:
3+ push:
4+ workflow_dispatch:
5+concurrency:
6+ group: results
7+ cancel-in-progress: true
8+jobs:
9+ results:
10+ runs-on: ubuntu-latest
11+ steps:
12+ - uses: actions/checkout@v4
13+ - uses: actions/setup-python@v5
14+ with:
15+ python-version: '3.12'
16+ - run: pip install git+https://vault1.magland.org/challenges/challenge-tools
17+ - name: Fetch the registered solution repositories
18+ run: challenge-tools fetch --registry registry/solution-repos.json --clones clones --vault-url https://vault1.magland.org
19+ - name: Build the comparison site
20+ run: >
21+ challenge-tools build --challenges challenges --registry registry/solution-repos.json --clones clones
22+ --out site --vault-url https://vault1.magland.org --challenge-repo-url https://vault1.magland.org/challenges/cymbal2
23+ - if: github.ref == 'refs/heads/main'
24+ uses: actions/configure-pages@v4
25+ - if: github.ref == 'refs/heads/main'
26+ uses: actions/upload-pages-artifact@v3
27+ with:
28+ path: site
29+ - if: github.ref == 'refs/heads/main'
30+ uses: actions/deploy-pages@v4
MODEL.mdadded+150−0View file
@@ -0,0 +1,150 @@
1+# The cymbal2 model
2+
3+Every challenge in this repository is an instance of the model defined here. A challenge fixes the mid-surface profile $Z(r)$, the thickness $h(r)$, the strike point $(x_s, y_s)$ and the output scale $s_\text{ref}$; its README gives those and nothing else changes. The problem is to compute the pressure signal $p(t)$ of the output section for six seconds and write it as a wav file.
4+
5+## Geometry
6+
7+The cymbal is a thin shell. Its mid-surface is the graph of a function $Z$ over the annulus
8+
9+$$
10+A = \{ (x, y) : r_h \le r \le R \}, \qquad r = \sqrt{x^2 + y^2},
11+$$
12+
13+and its thickness is $h$. Both are functions of $r$ alone and are given per challenge. The rim $r = R$ and the edge of the hole $r = r_h$ are free. Below, subscripts $x$, $y$ and $t$ denote partial derivatives, Greek indices run over $x, y$, repeated Greek indices are summed, and $\delta_{\alpha\beta}$ is the Kronecker delta.
14+
15+## Unknowns and strains
16+
17+The unknowns are the displacements $u(x, y, t)$, $v(x, y, t)$, $w(x, y, t)$ of the mid-surface point $(x, y, Z(x, y))$ along the $x$, $y$ and $z$ axes. The membrane strains are those of shallow-shell theory,
18+
19+$$
20+\varepsilon_{xx} = u_x + Z_x w_x + \tfrac{1}{2} w_x^2, \qquad
21+\varepsilon_{yy} = v_y + Z_y w_y + \tfrac{1}{2} w_y^2, \qquad
22+\varepsilon_{xy} = \tfrac{1}{2} \left( u_y + v_x + Z_x w_y + Z_y w_x + w_x w_y \right),
23+$$
24+
25+and the bending strains are $\kappa_{\alpha\beta} = w_{\alpha\beta}$.
26+
27+## Stress resultants
28+
29+The material is linearly elastic and isotropic, with Young's modulus $E$, Poisson's ratio $\nu$ and density $\rho$, and has a Kelvin-Voigt viscosity of time constant $\eta$. The membrane forces and bending moments per unit length are
30+
31+$$
32+N_{\alpha\beta} = \frac{E h}{1 - \nu^2} \left[ (1 - \nu)\, \tilde\varepsilon_{\alpha\beta} + \nu\, \tilde\varepsilon_{\gamma\gamma}\, \delta_{\alpha\beta} \right], \qquad
33+M_{\alpha\beta} = D \left[ (1 - \nu)\, \tilde\kappa_{\alpha\beta} + \nu\, \tilde\kappa_{\gamma\gamma}\, \delta_{\alpha\beta} \right],
34+$$
35+
36+with $\tilde\varepsilon = \varepsilon + \eta\, \varepsilon_t$, $\tilde\kappa = \kappa + \eta\, \kappa_t$ and $D = E h^3 / (12 (1 - \nu^2))$.
37+
38+## Equations of motion
39+
40+The motion is defined by its weak form. For all test functions $\delta u, \delta v \in H^1(A)$ and $\delta w \in H^2(A)$, without constraint on either edge,
41+
42+$$
43+\int_A \rho h \left[ (u_{tt} + 2 \sigma_0 u_t)\, \delta u + (v_{tt} + 2 \sigma_0 v_t)\, \delta v + (w_{tt} + 2 \sigma_0 w_t)\, \delta w \right] dA
44++ \int_A \left( N_{\alpha\beta}\, \delta\varepsilon_{\alpha\beta} + M_{\alpha\beta}\, \delta\kappa_{\alpha\beta} \right) dA
45+= - F(t) \int_A \phi\, \delta w\, dA,
46+$$
47+
48+where $\sigma_0$ is a loss rate, $F$ and $\phi$ are the strike force and footprint of the next section, and $\delta\varepsilon$, $\delta\kappa$ are the variations of the strains at the current state,
49+
50+$$
51+\delta\varepsilon_{xx} = \delta u_x + (Z_x + w_x)\, \delta w_x, \qquad
52+\delta\varepsilon_{yy} = \delta v_y + (Z_y + w_y)\, \delta w_y, \qquad
53+\delta\varepsilon_{xy} = \tfrac{1}{2} \left( \delta u_y + \delta v_x + (Z_x + w_x)\, \delta w_y + (Z_y + w_y)\, \delta w_x \right), \qquad
54+\delta\kappa_{\alpha\beta} = \delta w_{\alpha\beta}.
55+$$
56+
57+Where the solution is smooth this is the strong form
58+
59+$$
60+\rho h\, (u_{tt} + 2 \sigma_0 u_t) = \partial_x N_{xx} + \partial_y N_{xy}, \qquad
61+\rho h\, (v_{tt} + 2 \sigma_0 v_t) = \partial_x N_{xy} + \partial_y N_{yy},
62+$$
63+
64+$$
65+\rho h\, (w_{tt} + 2 \sigma_0 w_t) = \partial_\alpha \left[ N_{\alpha\beta} (Z_\beta + w_\beta) \right] - \partial_{\alpha\beta} M_{\alpha\beta} - F(t)\, \phi,
66+$$
67+
68+together with the free-edge conditions that the weak form implies at $r = R$ and $r = r_h$. The shell is at rest at $t = 0$: $u = v = w = 0$ and $u_t = v_t = w_t = 0$.
69+
70+## The strike
71+
72+The cymbal is struck once by a drum stick, modeled as a point mass $m_s$ that moves along $z$ and interacts with the shell through a Hertz contact force. Let $z_s(t)$ be the height of the stick tip above the undeformed surface point $(x_s, y_s, Z(r_s))$, with $z_s(0) = 0$ and $\dot z_s(0) = -v_0$. The force is spread over the footprint
73+
74+$$
75+\phi(x, y) = \frac{1}{c_\phi\, \pi R_s^2}\; \phi_0\!\left( \frac{\varrho}{R_s} \right), \qquad
76+\varrho = \sqrt{(x - x_s)^2 + (y - y_s)^2}, \qquad
77+\phi_0(s) = \begin{cases} \tfrac{1}{2} (1 + \cos \pi s), & 0 \le s \le 1, \\ 0, & s > 1, \end{cases} \qquad
78+c_\phi = \tfrac{1}{2} - \tfrac{2}{\pi^2},
79+$$
80+
81+which lies inside $A$ and integrates to one over $A$. The surface height under the stick is the footprint average $\bar w(t) = \int_A \phi\, w\, dA$, the penetration is $\delta(t) = \bar w(t) - z_s(t)$, and the contact force is
82+
83+$$
84+F(t) = k_c\, \max(\delta(t), 0)^{3/2}.
85+$$
86+
87+It acts on the stick upward, $m_s \ddot z_s = F$, and on the shell downward, as the traction $-F \phi$ along $z$ in the equations of motion. The stick is otherwise free: there is no gravity and no hand, and contact occurs whenever $\delta > 0$, including any later contact after the first rebound.
88+
89+## Output
90+
91+The output is the acoustic pressure at the listener point $\mathbf{x}_L$ given by the Rayleigh integral of the transverse acceleration over the shell,
92+
93+$$
94+p(t) = \frac{\rho_a}{2\pi} \int_A \frac{1}{d(x, y)}\; w_{tt}\!\left( x, y,\; t - \frac{d(x, y)}{c_a} \right) dA, \qquad
95+d(x, y) = \left| \mathbf{x}_L - (x, y, Z(x, y)) \right|,
96+$$
97+
98+with $w_{tt}$ taken as zero at negative times. This is the field of a planar source in a rigid baffle; the acoustic problem is not solved, and the air exerts no load on the shell.
99+
100+## Remarks
101+
102+The shell is free. The strains are invariant under the small rigid motions $w \to w + a + \theta_\alpha x_\alpha$, $u_\alpha \to u_\alpha - \theta_\alpha (Z + w) - \tfrac{1}{2} \theta_\alpha \theta_\beta x_\beta$ (with $u_x = u$, $u_y = v$), so the momentum and angular momentum that the strike imparts appear as a drift of $w$ that is linear in $t$ once the contact has ended, has no transverse acceleration, and does not enter $p$; the in-plane inertia of that drift is of relative order $\rho \Omega^2 R^2 / E$, about $10^{-8}$. The transverse displacement itself does contain the drift.
103+
104+In the linear regime about the flat state, $\sigma_0$ damps every mode at the rate $\sigma_0$ and $\eta$ damps a mode of angular frequency $\omega$ at the rate $\eta \omega^2 / 2$.
105+
106+## Parameters common to all challenges
107+
108+| Symbol | Value | Unit | Meaning |
109+| --- | --- | --- | --- |
110+| $R$ | 0.2032 | m | outer radius (16 in diameter) |
111+| $r_h$ | 0.006 | m | hole radius |
112+| $E$ | 110e9 | Pa | Young's modulus (B20 bell bronze) |
113+| $\nu$ | 0.34 | | Poisson's ratio |
114+| $\rho$ | 8800 | kg/m^3 | density |
115+| $\sigma_0$ | 1.1 | 1/s | loss rate |
116+| $\eta$ | 1.2e-8 | s | Kelvin-Voigt time constant |
117+| $m_s$ | 0.02 | kg | stick tip mass |
118+| $v_0$ | 10 | m/s | stick speed at contact |
119+| $k_c$ | 1e9 | N/m^(3/2) | Hertz contact stiffness |
120+| $R_s$ | 0.005 | m | footprint radius |
121+| $\rho_a$ | 1.204 | kg/m^3 | air density |
122+| $c_a$ | 343 | m/s | speed of sound in air |
123+| $\mathbf{x}_L$ | (0.65, 1.125, 0.75) | m | listener point |
124+
125+All values are exact decimal numbers. The listener is 1.5 m from the origin, 30 degrees above the plane $z = 0$, at an azimuth of 60 degrees from the $x$ axis, on which every strike point lies. The stick values are provisional until the first solutions have been heard; they will be fixed before any solution is published, and a challenge is never changed after that.
126+
127+## Deliverable
128+
129+| Property | Value |
130+| --- | --- |
131+| channels | 1 |
132+| sample rate $f_s$ | 48000 Hz |
133+| number of samples $N$ | 288000 (6.0 s) |
134+| sample format | 32-bit IEEE float (WAVE_FORMAT_IEEE_FLOAT) |
135+| sample $k$, for $k = 0, \dots, N-1$ | $p(k / f_s) / s_\text{ref}$ |
136+| $s_\text{ref}$ | `output.signal_scale` in the challenge's challenge.json, in Pa |
137+
138+The first sample is at $t = 0$, the instant the stick touches the shell. Samples are pointwise values of $p$ with no anti-aliasing filter. Do not normalize the signal; absolute amplitude is compared.
139+
140+## Error measures
141+
142+Two relative errors against the reference solution are computed over the $N$ samples: the spectrogram $\ell^2$ error (primary; periodic Hann window of length 2048, hop 512, no padding) and the waveform $\ell^2$ error. The formulas are those of the [string challenge](https://vault1.magland.org/challenges/string/blob/main/challenges/string-pluck-v1/README.md#error-measures). The spectrogram error ranks because the response to this strike is chaotic: solutions that agree in every band still differ in waveform after the first tenth of a second, and the waveform error is then near $\sqrt{2}$ for any two of them.
143+
144+## Reference solution
145+
146+The reference is chosen automatically among the submitted solutions by the rule described in the [repository README](README.md), unless `reference_solution` in challenge.json names one.
147+
148+## Optional field export
149+
150+A submission may provide the transverse displacement for visualization; it is not scored. The file is HDF5 with datasets `x` and `y`, float64, shape (61,), $x_i = -R + 2R\, i / 60$ and the same for $y$; `t`, float64, shape (3001,), $t_k = k / 1000$; and `u`, float32, shape (3001, 61, 61), with `u[k, j, i]` $= w(x_i, y_j, t_k)$ in meters for grid points in $A$ and NaN elsewhere. The drift of the free shell is part of $w$. Root attributes `challenge_id`, `solution_id`, `quantity` and `units` are recommended. The file is about 40 MB and belongs in git LFS or at an external URL.
README.mdadded+22−0View file
@@ -0,0 +1,22 @@
1+# Instrument simulation challenges: cymbal2
2+
3+This repository defines four simulation challenges on one geometrically nonlinear thin-shell model of a 16 inch crash cymbal struck by a drum stick, and publishes the comparison of every registered solution at [challenges/cymbal2/site](https://vault1.magland.org/challenges/cymbal2/site/). It follows the arrangement of the [string](https://vault1.magland.org/challenges/string), [plate](https://vault1.magland.org/challenges/plate) and [cymbal](https://vault1.magland.org/challenges/cymbal) repositories: the model is defined in the continuum, solutions live in separate registered repositories, and the shared [challenge-tools](https://vault1.magland.org/challenges/challenge-tools) package scores them against a reference chosen from among the submissions.
4+
5+The model is defined once, in [MODEL.md](MODEL.md): a shallow shell with in-plane inertia, Saint Venant-Kirchhoff through the thickness, Kelvin-Voigt and mass-proportional damping, free at both edges, struck by a point mass through a Hertz contact, radiating to a listener 1.5 m away through the Rayleigh integral. Each challenge fixes the profile, the thickness and the strike point. Three of the four share the cymbal's geometry (a paraboloidal bow, a cosine-dome bell around the mounting hole, and a thickness that tapers from the bell to the rim) and differ only in where the stick lands, so that the difference in sound between a crash near the rim and a ping on the bell comes out of the same equations; the fourth is a flat annulus of uniform thickness, as a baseline.
6+
7+| ID | Geometry | Strike point | Deliverable |
8+| --- | --- | --- | --- |
9+| [cymbal2-flat-v1](challenges/cymbal2-flat-v1/README.md) | flat annulus, 1.0 mm | 0.85 R | 6 s mono wav, 48 kHz, float32 |
10+| [cymbal2-rim-v1](challenges/cymbal2-rim-v1/README.md) | bow, bell, taper 1.2 to 0.7 mm | 0.85 R | 6 s mono wav, 48 kHz, float32 |
11+| [cymbal2-mid-v1](challenges/cymbal2-mid-v1/README.md) | bow, bell, taper 1.2 to 0.7 mm | 0.5 R | 6 s mono wav, 48 kHz, float32 |
12+| [cymbal2-bell-v1](challenges/cymbal2-bell-v1/README.md) | bow, bell, taper 1.2 to 0.7 mm | on the bell, 35 mm | 6 s mono wav, 48 kHz, float32 |
13+
14+Each challenge lives in `challenges/<challenge-id>/` as a `README.md`, which together with MODEL.md is the specification, and a `challenge.json` with the parameters, output format, error measures and field-export grid in machine-readable form. The stick parameters and the output scales are provisional until the first solutions have been heard; once a solution is published, a challenge is never changed, and a corrected model gets a new ID.
15+
16+## Solution repositories and the registry
17+
18+The repositories that take part in the comparison are listed in [registry/solution-repos.json](registry/solution-repos.json). To register one, open a pull request adding an entry (repository, branch, path of its `solutions` directory). A solution repository contains `solutions/<challenge-id>/<submission-id>.json` files following the [submission schema](https://vault1.magland.org/challenges/challenge-tools/blob/main/schema.json), with wav files beside them or at URLs, and optionally field exports. The comparison workflow clones every registered repository at the head of its branch and runs on any push to this repository or when dispatched by hand (`mochi workflow run .mochi/workflows/results.yml --repo challenges/cymbal2`).
19+
20+## Scoring
21+
22+Every solution is compared with the reference under the two error measures of MODEL.md; the spectrogram error ranks, because the response is chaotic and waveforms of equally good solutions diverge within the first tenth of a second. The reference is chosen automatically from the accuracy orderings that submissions assert about their own solutions, by the rule described in the [string repository README](https://vault1.magland.org/challenges/string/blob/main/README.md#how-solutions-are-scored) and implemented in challenge-tools. A challenge may override the choice by naming a solution in `reference_solution` in its `challenge.json`.
challenges/cymbal2-bell-v1/README.mdadded+25−0View file
@@ -0,0 +1,25 @@
1+# cymbal2-bell-v1: the cymbal struck on the bell
2+
3+The cymbal of this tier, a paraboloidal bow with a cosine-dome bell around the mounting hole and a thickness that tapers from 1.2 mm at the bell to 0.7 mm at the rim, struck by the stick on the flank of the bell, 35 mm from the axis on the $x$ axis, the ping stroke. The model, the strike, the listener, the output, the error measures and the common parameters are defined in [MODEL.md](../../MODEL.md); this page fixes what is specific to this challenge. The machine-readable version is [challenge.json](challenge.json). The challenges cymbal2-rim-v1 and cymbal2-mid-v1 are the same cymbal struck elsewhere.
4+
5+## Geometry and strike
6+
7+$$
8+Z(r) = H \left( 1 - \frac{r^2}{R^2} \right) + \begin{cases} \dfrac{h_b}{2} \left( 1 + \cos \dfrac{\pi r}{r_b} \right), & r < r_b, \\[2ex] 0, & r \ge r_b, \end{cases}
9+\qquad
10+h(r) = \begin{cases} h_c, & r \le r_b, \\[1ex] h_c + (h_e - h_c)\, \dfrac{r - r_b}{R - r_b}, & r_b < r \le R, \end{cases}
11+$$
12+
13+for $r_h \le r \le R$. The bell joins the bow with continuous slope and a jump in curvature at $r = r_b$; the thickness is continuous there.
14+
15+| Symbol | Value | Unit | Meaning |
16+| --- | --- | --- | --- |
17+| $H$ | 0.025 | m | bow height |
18+| $r_b$ | 0.055 | m | bell radius |
19+| $h_b$ | 0.015 | m | bell height above the bow |
20+| $h_c$ | 0.0012 | m | thickness over the bell |
21+| $h_e$ | 0.0007 | m | thickness at the rim |
22+| $(x_s, y_s)$ | (0.035, 0) | m | strike point, on the bell |
23+| $s_\text{ref}$ | 16 (provisional) | Pa | output scale |
24+
25+At the strike point the surface is 29 mm above the rim plane, its slope is 0.43, and the thickness is 1.2 mm; the footprint spans 30 to 40 mm from the axis, clear of the hole. The largest slope of the profile is about 0.46, on the flank of the bell, where shallow-shell theory is a coarse approximation of a real cymbal; the model is nevertheless defined as written.
challenges/cymbal2-bell-v1/challenge.jsonadded+76−0View file
@@ -0,0 +1,76 @@
1+{
2+ "challenge_id": "cymbal2-bell-v1",
3+ "title": "Bowed, belled and tapered cymbal struck on the bell by a drum stick: radiated pressure",
4+ "version": 1,
5+ "model": "cymbal2 shallow shell (MODEL.md)",
6+ "output": {
7+ "type": "wav",
8+ "sample_rate_hz": 48000,
9+ "num_samples": 288000,
10+ "channels": 1,
11+ "sample_format": "float32",
12+ "signal": "acoustic pressure at the listener point from the Rayleigh integral of the transverse acceleration over the shell",
13+ "signal_unit": "Pa",
14+ "signal_scale": 16.0,
15+ "signal_scale_note": "provisional until the first solutions are published"
16+ },
17+ "geometry": {
18+ "type": "shell-of-revolution",
19+ "mid_surface": "Z(r) = bow_height (1 - r^2/disk_radius^2) + bell_height/2 (1 + cos(pi r / bell_radius)) [r < bell_radius]",
20+ "thickness": "h(r) = thickness_center for r <= bell_radius, linear from thickness_center at bell_radius to thickness_rim at disk_radius",
21+ "domain": "annulus hole_radius <= r <= disk_radius, both edges free"
22+ },
23+ "parameters": {
24+ "disk_radius": 0.2032,
25+ "hole_radius": 0.006,
26+ "E": 110000000000.0,
27+ "nu": 0.34,
28+ "rho": 8800.0,
29+ "sigma0": 1.1,
30+ "eta": 1.2e-08,
31+ "stick_mass": 0.02,
32+ "stick_speed": 10.0,
33+ "contact_stiffness": 1000000000.0,
34+ "contact_exponent": 1.5,
35+ "strike_radius": 0.005,
36+ "rho_air": 1.204,
37+ "c_air": 343.0,
38+ "listener_x": 0.65,
39+ "listener_y": 1.125,
40+ "listener_z": 0.75,
41+ "bow_height": 0.025,
42+ "bell_radius": 0.055,
43+ "bell_height": 0.015,
44+ "thickness_center": 0.0012,
45+ "thickness_rim": 0.0007,
46+ "strike_x": 0.035,
47+ "strike_y": 0.0
48+ },
49+ "metrics": {
50+ "primary": "spectrogram_l2",
51+ "spectrogram_l2": {
52+ "window": "hann_periodic",
53+ "n_fft": 2048,
54+ "hop": 512
55+ },
56+ "waveform_l2": {}
57+ },
58+ "fields": {
59+ "format": "hdf5",
60+ "quantity": "transverse displacement w(x, y, t) of the mid-surface, including the rigid drift; NaN outside the annulus",
61+ "units": "m",
62+ "axes": [
63+ "t",
64+ "y",
65+ "x"
66+ ],
67+ "shape": [
68+ 3001,
69+ 61,
70+ 61
71+ ],
72+ "frame_rate_hz": 1000,
73+ "dtype": "float32"
74+ },
75+ "reference_solution": null
76+}
challenges/cymbal2-flat-v1/README.mdadded+17−0View file
@@ -0,0 +1,17 @@
1+# cymbal2-flat-v1: flat annulus struck near the rim
2+
3+The baseline of the cymbal2 tier: a flat annulus of bell bronze with the diameter, the mounting hole and a uniform thickness of 1 mm, struck by the stick at 0.85 R on the $x$ axis. It has no bow, bell or taper, so every position on it has the same local stiffness; the three cymbal challenges add the geometry that makes the strike position matter. The model, the strike, the listener, the output, the error measures and the common parameters are defined in [MODEL.md](../../MODEL.md); this page fixes what is specific to this challenge. The machine-readable version is [challenge.json](challenge.json).
4+
5+## Geometry and strike
6+
7+$$
8+Z(r) = 0, \qquad h(r) = h_0, \qquad r_h \le r \le R.
9+$$
10+
11+| Symbol | Value | Unit | Meaning |
12+| --- | --- | --- | --- |
13+| $h_0$ | 0.001 | m | thickness |
14+| $(x_s, y_s)$ | (0.17272, 0) | m | strike point, $0.85 R$ |
15+| $s_\text{ref}$ | 16 (provisional) | Pa | output scale |
16+
17+The lowest elastic frequencies of the annulus in the linear regime are near 22 Hz (two nodal diameters), 38 Hz (axisymmetric) and 51 Hz (three nodal diameters); the hole changes them by less than a percent from those of the full disk. The stick brings about 1 J and a peak force of a few hundred newtons over about half a millisecond, which bends the annulus by many thicknesses and puts it well into the regime of membrane stiffening.
challenges/cymbal2-flat-v1/challenge.jsonadded+72−0View file
@@ -0,0 +1,72 @@
1+{
2+ "challenge_id": "cymbal2-flat-v1",
3+ "title": "Flat bronze annulus of uniform thickness struck near the rim by a drum stick: radiated pressure",
4+ "version": 1,
5+ "model": "cymbal2 shallow shell (MODEL.md)",
6+ "output": {
7+ "type": "wav",
8+ "sample_rate_hz": 48000,
9+ "num_samples": 288000,
10+ "channels": 1,
11+ "sample_format": "float32",
12+ "signal": "acoustic pressure at the listener point from the Rayleigh integral of the transverse acceleration over the shell",
13+ "signal_unit": "Pa",
14+ "signal_scale": 16.0,
15+ "signal_scale_note": "provisional until the first solutions are published"
16+ },
17+ "geometry": {
18+ "type": "flat",
19+ "mid_surface": "Z(r) = 0",
20+ "thickness": "h(r) = thickness",
21+ "domain": "annulus hole_radius <= r <= disk_radius, both edges free"
22+ },
23+ "parameters": {
24+ "disk_radius": 0.2032,
25+ "hole_radius": 0.006,
26+ "E": 110000000000.0,
27+ "nu": 0.34,
28+ "rho": 8800.0,
29+ "sigma0": 1.1,
30+ "eta": 1.2e-08,
31+ "stick_mass": 0.02,
32+ "stick_speed": 10.0,
33+ "contact_stiffness": 1000000000.0,
34+ "contact_exponent": 1.5,
35+ "strike_radius": 0.005,
36+ "rho_air": 1.204,
37+ "c_air": 343.0,
38+ "listener_x": 0.65,
39+ "listener_y": 1.125,
40+ "listener_z": 0.75,
41+ "thickness": 0.001,
42+ "strike_x": 0.17272,
43+ "strike_y": 0.0
44+ },
45+ "metrics": {
46+ "primary": "spectrogram_l2",
47+ "spectrogram_l2": {
48+ "window": "hann_periodic",
49+ "n_fft": 2048,
50+ "hop": 512
51+ },
52+ "waveform_l2": {}
53+ },
54+ "fields": {
55+ "format": "hdf5",
56+ "quantity": "transverse displacement w(x, y, t) of the mid-surface, including the rigid drift; NaN outside the annulus",
57+ "units": "m",
58+ "axes": [
59+ "t",
60+ "y",
61+ "x"
62+ ],
63+ "shape": [
64+ 3001,
65+ 61,
66+ 61
67+ ],
68+ "frame_rate_hz": 1000,
69+ "dtype": "float32"
70+ },
71+ "reference_solution": null
72+}
challenges/cymbal2-mid-v1/README.mdadded+25−0View file
@@ -0,0 +1,25 @@
1+# cymbal2-mid-v1: the cymbal struck at half the radius
2+
3+The cymbal of this tier, a paraboloidal bow with a cosine-dome bell around the mounting hole and a thickness that tapers from 1.2 mm at the bell to 0.7 mm at the rim, struck by the stick at 0.5 R on the $x$ axis, between the bell and the rim. The model, the strike, the listener, the output, the error measures and the common parameters are defined in [MODEL.md](../../MODEL.md); this page fixes what is specific to this challenge. The machine-readable version is [challenge.json](challenge.json). The challenges cymbal2-rim-v1 and cymbal2-bell-v1 are the same cymbal struck elsewhere.
4+
5+## Geometry and strike
6+
7+$$
8+Z(r) = H \left( 1 - \frac{r^2}{R^2} \right) + \begin{cases} \dfrac{h_b}{2} \left( 1 + \cos \dfrac{\pi r}{r_b} \right), & r < r_b, \\[2ex] 0, & r \ge r_b, \end{cases}
9+\qquad
10+h(r) = \begin{cases} h_c, & r \le r_b, \\[1ex] h_c + (h_e - h_c)\, \dfrac{r - r_b}{R - r_b}, & r_b < r \le R, \end{cases}
11+$$
12+
13+for $r_h \le r \le R$. The bell joins the bow with continuous slope and a jump in curvature at $r = r_b$; the thickness is continuous there.
14+
15+| Symbol | Value | Unit | Meaning |
16+| --- | --- | --- | --- |
17+| $H$ | 0.025 | m | bow height |
18+| $r_b$ | 0.055 | m | bell radius |
19+| $h_b$ | 0.015 | m | bell height above the bow |
20+| $h_c$ | 0.0012 | m | thickness over the bell |
21+| $h_e$ | 0.0007 | m | thickness at the rim |
22+| $(x_s, y_s)$ | (0.1016, 0) | m | strike point, $0.5 R$ |
23+| $s_\text{ref}$ | 16 (provisional) | Pa | output scale |
24+
25+At the strike point the surface is 19 mm above the rim plane, its slope is 0.12, and the thickness is 1.04 mm. The largest slope of the profile is about 0.46, on the flank of the bell, where shallow-shell theory is a coarse approximation of a real cymbal; the model is nevertheless defined as written.
challenges/cymbal2-mid-v1/challenge.jsonadded+76−0View file
@@ -0,0 +1,76 @@
1+{
2+ "challenge_id": "cymbal2-mid-v1",
3+ "title": "Bowed, belled and tapered cymbal struck at half the radius by a drum stick: radiated pressure",
4+ "version": 1,
5+ "model": "cymbal2 shallow shell (MODEL.md)",
6+ "output": {
7+ "type": "wav",
8+ "sample_rate_hz": 48000,
9+ "num_samples": 288000,
10+ "channels": 1,
11+ "sample_format": "float32",
12+ "signal": "acoustic pressure at the listener point from the Rayleigh integral of the transverse acceleration over the shell",
13+ "signal_unit": "Pa",
14+ "signal_scale": 16.0,
15+ "signal_scale_note": "provisional until the first solutions are published"
16+ },
17+ "geometry": {
18+ "type": "shell-of-revolution",
19+ "mid_surface": "Z(r) = bow_height (1 - r^2/disk_radius^2) + bell_height/2 (1 + cos(pi r / bell_radius)) [r < bell_radius]",
20+ "thickness": "h(r) = thickness_center for r <= bell_radius, linear from thickness_center at bell_radius to thickness_rim at disk_radius",
21+ "domain": "annulus hole_radius <= r <= disk_radius, both edges free"
22+ },
23+ "parameters": {
24+ "disk_radius": 0.2032,
25+ "hole_radius": 0.006,
26+ "E": 110000000000.0,
27+ "nu": 0.34,
28+ "rho": 8800.0,
29+ "sigma0": 1.1,
30+ "eta": 1.2e-08,
31+ "stick_mass": 0.02,
32+ "stick_speed": 10.0,
33+ "contact_stiffness": 1000000000.0,
34+ "contact_exponent": 1.5,
35+ "strike_radius": 0.005,
36+ "rho_air": 1.204,
37+ "c_air": 343.0,
38+ "listener_x": 0.65,
39+ "listener_y": 1.125,
40+ "listener_z": 0.75,
41+ "bow_height": 0.025,
42+ "bell_radius": 0.055,
43+ "bell_height": 0.015,
44+ "thickness_center": 0.0012,
45+ "thickness_rim": 0.0007,
46+ "strike_x": 0.1016,
47+ "strike_y": 0.0
48+ },
49+ "metrics": {
50+ "primary": "spectrogram_l2",
51+ "spectrogram_l2": {
52+ "window": "hann_periodic",
53+ "n_fft": 2048,
54+ "hop": 512
55+ },
56+ "waveform_l2": {}
57+ },
58+ "fields": {
59+ "format": "hdf5",
60+ "quantity": "transverse displacement w(x, y, t) of the mid-surface, including the rigid drift; NaN outside the annulus",
61+ "units": "m",
62+ "axes": [
63+ "t",
64+ "y",
65+ "x"
66+ ],
67+ "shape": [
68+ 3001,
69+ 61,
70+ 61
71+ ],
72+ "frame_rate_hz": 1000,
73+ "dtype": "float32"
74+ },
75+ "reference_solution": null
76+}
challenges/cymbal2-rim-v1/README.mdadded+25−0View file
@@ -0,0 +1,25 @@
1+# cymbal2-rim-v1: the cymbal struck near the rim
2+
3+The cymbal of this tier, a paraboloidal bow with a cosine-dome bell around the mounting hole and a thickness that tapers from 1.2 mm at the bell to 0.7 mm at the rim, struck by the stick at 0.85 R on the $x$ axis, the crash stroke. The model, the strike, the listener, the output, the error measures and the common parameters are defined in [MODEL.md](../../MODEL.md); this page fixes what is specific to this challenge. The machine-readable version is [challenge.json](challenge.json). The challenges cymbal2-mid-v1 and cymbal2-bell-v1 are the same cymbal struck elsewhere.
4+
5+## Geometry and strike
6+
7+$$
8+Z(r) = H \left( 1 - \frac{r^2}{R^2} \right) + \begin{cases} \dfrac{h_b}{2} \left( 1 + \cos \dfrac{\pi r}{r_b} \right), & r < r_b, \\[2ex] 0, & r \ge r_b, \end{cases}
9+\qquad
10+h(r) = \begin{cases} h_c, & r \le r_b, \\[1ex] h_c + (h_e - h_c)\, \dfrac{r - r_b}{R - r_b}, & r_b < r \le R, \end{cases}
11+$$
12+
13+for $r_h \le r \le R$. The bell joins the bow with continuous slope and a jump in curvature at $r = r_b$; the thickness is continuous there.
14+
15+| Symbol | Value | Unit | Meaning |
16+| --- | --- | --- | --- |
17+| $H$ | 0.025 | m | bow height |
18+| $r_b$ | 0.055 | m | bell radius |
19+| $h_b$ | 0.015 | m | bell height above the bow |
20+| $h_c$ | 0.0012 | m | thickness over the bell |
21+| $h_e$ | 0.0007 | m | thickness at the rim |
22+| $(x_s, y_s)$ | (0.17272, 0) | m | strike point, $0.85 R$ |
23+| $s_\text{ref}$ | 16 (provisional) | Pa | output scale |
24+
25+At the strike point the surface is 7 mm above the rim plane, its slope is 0.21, and the thickness is 0.80 mm. The largest slope of the profile is about 0.46, on the flank of the bell, where shallow-shell theory is a coarse approximation of a real cymbal; the model is nevertheless defined as written.
challenges/cymbal2-rim-v1/challenge.jsonadded+76−0View file
@@ -0,0 +1,76 @@
1+{
2+ "challenge_id": "cymbal2-rim-v1",
3+ "title": "Bowed, belled and tapered cymbal struck near the rim by a drum stick: radiated pressure",
4+ "version": 1,
5+ "model": "cymbal2 shallow shell (MODEL.md)",
6+ "output": {
7+ "type": "wav",
8+ "sample_rate_hz": 48000,
9+ "num_samples": 288000,
10+ "channels": 1,
11+ "sample_format": "float32",
12+ "signal": "acoustic pressure at the listener point from the Rayleigh integral of the transverse acceleration over the shell",
13+ "signal_unit": "Pa",
14+ "signal_scale": 16.0,
15+ "signal_scale_note": "provisional until the first solutions are published"
16+ },
17+ "geometry": {
18+ "type": "shell-of-revolution",
19+ "mid_surface": "Z(r) = bow_height (1 - r^2/disk_radius^2) + bell_height/2 (1 + cos(pi r / bell_radius)) [r < bell_radius]",
20+ "thickness": "h(r) = thickness_center for r <= bell_radius, linear from thickness_center at bell_radius to thickness_rim at disk_radius",
21+ "domain": "annulus hole_radius <= r <= disk_radius, both edges free"
22+ },
23+ "parameters": {
24+ "disk_radius": 0.2032,
25+ "hole_radius": 0.006,
26+ "E": 110000000000.0,
27+ "nu": 0.34,
28+ "rho": 8800.0,
29+ "sigma0": 1.1,
30+ "eta": 1.2e-08,
31+ "stick_mass": 0.02,
32+ "stick_speed": 10.0,
33+ "contact_stiffness": 1000000000.0,
34+ "contact_exponent": 1.5,
35+ "strike_radius": 0.005,
36+ "rho_air": 1.204,
37+ "c_air": 343.0,
38+ "listener_x": 0.65,
39+ "listener_y": 1.125,
40+ "listener_z": 0.75,
41+ "bow_height": 0.025,
42+ "bell_radius": 0.055,
43+ "bell_height": 0.015,
44+ "thickness_center": 0.0012,
45+ "thickness_rim": 0.0007,
46+ "strike_x": 0.17272,
47+ "strike_y": 0.0
48+ },
49+ "metrics": {
50+ "primary": "spectrogram_l2",
51+ "spectrogram_l2": {
52+ "window": "hann_periodic",
53+ "n_fft": 2048,
54+ "hop": 512
55+ },
56+ "waveform_l2": {}
57+ },
58+ "fields": {
59+ "format": "hdf5",
60+ "quantity": "transverse displacement w(x, y, t) of the mid-surface, including the rigid drift; NaN outside the annulus",
61+ "units": "m",
62+ "axes": [
63+ "t",
64+ "y",
65+ "x"
66+ ],
67+ "shape": [
68+ 3001,
69+ 61,
70+ 61
71+ ],
72+ "frame_rate_hz": 1000,
73+ "dtype": "float32"
74+ },
75+ "reference_solution": null
76+}
registry/solution-repos.jsonadded+3−0View file
@@ -0,0 +1,3 @@
1+{
2+ "repos": []
3+}