Add plate-strike-v1 challenge, registry, and comparison workflow
6 changed files+243−0
.gitignoreadded+4−0View file
@@ -0,0 +1,4 @@
1+clones/
2+site/
3+.challenge-cache/
4+__pycache__/
.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/plate
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
README.mdadded+23−0View file
@@ -0,0 +1,23 @@
1+# Instrument simulation challenges: plate (tier 1)
2+
3+This repository defines simulation challenges for a thin, free, struck aluminum plate, and publishes the comparison of every registered solution at [challenges/plate/site](https://vault1.magland.org/challenges/plate/site/). It follows the same arrangement as the tier 0 repository [challenges/string](https://vault1.magland.org/challenges/string): 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+## Challenges
6+
7+| ID | Title | Deliverable |
8+| --- | --- | --- |
9+| [plate-strike-v1](challenges/plate-strike-v1/README.md) | Struck free aluminum plate, radiated pressure by the Rayleigh integral | 3 s mono wav, 48 kHz, float32 |
10+
11+The model is three-dimensional linear elastodynamics with Kelvin-Voigt and frequency-independent damping, on a 12 in by 12 in by 1.04 mm plate of aluminum 6061-T6, free on all faces, struck by a smooth force pulse. Thin-plate theories (Kirchhoff-Love, Mindlin-Reissner) are approximations to this model, and their error relative to a converged three-dimensional solution includes the modeling error of plate theory. Until such a solution is submitted, the reference is the best thin-plate solution and the reported errors measure only differences within plate theory; the results page says which it is.
12+
13+Each challenge lives in `challenges/<challenge-id>/` and consists of a `README.md`, which is the authoritative specification, and a `challenge.json` with the parameters, output format, error measures, and the recommended grid for optional field exports in machine-readable form. A challenge is never changed once solutions exist for it; a corrected or modified model gets a new ID.
14+
15+## Solution repositories and the registry
16+
17+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 (about 45 MB each for this challenge, so git LFS or an external URL is advisable). [challenges/plate-solutions](https://vault1.magland.org/challenges/plate-solutions) is the first one and serves as an example.
18+
19+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/plate`). Nothing in the vault triggers across repositories, so a push to a solution repository is picked up at the next run here.
20+
21+## Scoring
22+
23+Every solution is compared with the reference under the two error measures defined in the challenge README, the relative waveform and spectrogram errors; the waveform error ranks. 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, with the same limitations. A challenge may override the choice by naming a solution in `reference_solution` in its `challenge.json`; this will be the natural thing to do once a verified three-dimensional solution exists.
challenges/plate-strike-v1/README.mdadded+122−0View file
@@ -0,0 +1,122 @@
1+# plate-strike-v1: struck free aluminum plate, radiated pressure
2+
3+This is the tier 1 challenge: a thin square aluminum plate, free on all faces, struck once by a smooth, short force pulse. The deliverable is a three second mono wav file containing the acoustic pressure at a fixed listener point, computed from the plate's surface acceleration by the Rayleigh integral. The model is three-dimensional linear elastodynamics, so thin-plate theories are approximations to it and their error relative to a converged three-dimensional solution includes the modeling error of plate theory as well as discretization error. Every quantity below is defined in the continuum, so the true solution is a specific function of time that does not depend on any discretization.
4+
5+The machine-readable version of this specification is [challenge.json](challenge.json).
6+
7+## Model
8+
9+The plate occupies the box
10+
11+$$
12+\Omega = (0, L_x) \times (0, L_y) \times (-h/2, h/2),
13+$$
14+
15+with the mid-plane at $z = 0$ and the top face $S^+ = \{ z = h/2 \}$. Let $\mathbf{u}(\mathbf{x}, t) \in \mathbb{R}^3$ be the displacement in meters. The material is a homogeneous isotropic Hookean solid with Kelvin-Voigt viscosity and an additional frequency-independent loss:
16+
17+$$
18+\rho\, \frac{\partial^2 \mathbf{u}}{\partial t^2} = \nabla \cdot \boldsymbol{\sigma} - 2 \sigma_0 \rho\, \frac{\partial \mathbf{u}}{\partial t}, \qquad
19+\boldsymbol{\sigma} = \lambda\, \mathrm{tr}(\boldsymbol{\varepsilon} + \eta\, \dot{\boldsymbol{\varepsilon}})\, \mathbf{I} + 2 \mu\, (\boldsymbol{\varepsilon} + \eta\, \dot{\boldsymbol{\varepsilon}}), \qquad
20+\boldsymbol{\varepsilon} = \tfrac{1}{2} \left( \nabla \mathbf{u} + \nabla \mathbf{u}^{\mathsf{T}} \right),
21+$$
22+
23+where $\dot{\boldsymbol{\varepsilon}} = \partial \boldsymbol{\varepsilon} / \partial t$, and the Lamé constants follow from Young's modulus $E$ and Poisson's ratio $\nu$ in the usual way, $\lambda = E\nu / ((1+\nu)(1-2\nu))$ and $\mu = E / (2(1+\nu))$. The constant $\eta$ has units of time; the Kelvin-Voigt term damps a mode of angular frequency $\omega$ at the rate $\eta \omega^2 / 2$, and $\sigma_0$ adds a rate that is the same for every mode.
24+
25+All faces are traction-free except for the applied strike on the top face:
26+
27+$$
28+\boldsymbol{\sigma}\, \mathbf{n} = \mathbf{0} \text{ on } \partial\Omega \setminus S^+, \qquad
29+\boldsymbol{\sigma}\, \mathbf{n} = -\, p(x, y, t)\, \mathbf{e}_z \text{ on } S^+,
30+$$
31+
32+with $\mathbf{n}$ the outward normal, so that $p$ is a pressure pushing the plate in the $-z$ direction. The plate starts at rest:
33+
34+$$
35+\mathbf{u}(\mathbf{x}, 0) = \mathbf{0}, \qquad \frac{\partial \mathbf{u}}{\partial t}(\mathbf{x}, 0) = \mathbf{0}.
36+$$
37+
38+The plate is free, so rigid-body translation and rotation are possible and the strike imparts net momentum. This is intended; the output depends on acceleration and is unaffected by uniform drift.
39+
40+### The strike
41+
42+The strike is a raised-cosine bump in space, of radius $R$ centered at $(x_s, y_s)$, times a Hann pulse in time, of duration $T_s$:
43+
44+$$
45+p(x, y, t) = \frac{F_{\max}}{c_\phi\, \pi R^2}\; \phi\!\left( \frac{r}{R} \right) \psi\!\left( \frac{t}{T_s} \right), \qquad r = \sqrt{(x - x_s)^2 + (y - y_s)^2},
46+$$
47+
48+$$
49+\phi(s) = \begin{cases} \tfrac{1}{2}(1 + \cos \pi s), & 0 \le s \le 1, \\ 0, & s > 1, \end{cases} \qquad
50+\psi(\tau) = \begin{cases} \tfrac{1}{2}(1 - \cos 2\pi \tau), & 0 \le \tau \le 1, \\ 0, & \text{otherwise,} \end{cases} \qquad
51+c_\phi = \frac{1}{2} - \frac{2}{\pi^2}.
52+$$
53+
54+The constant $c_\phi$ is $\int_0^1 2 s\, \phi(s)\, ds$, so that the total force $\int_{S^+} p\, dS = F_{\max}\, \psi(t / T_s)$ peaks at $F_{\max}$ at $t = T_s / 2$, and the total impulse is $F_{\max} T_s / 2$. Both factors are continuously differentiable and compactly supported, and the strike footprint lies inside the top face.
55+
56+## Parameters
57+
58+| Symbol | Value | Unit | Meaning |
59+| --- | --- | --- | --- |
60+| $L_x, L_y$ | 0.3048 | m | plate side (12 in) |
61+| $h$ | 0.00104 | m | plate thickness |
62+| $E$ | 68.9e9 | Pa | Young's modulus (aluminum 6061-T6) |
63+| $\nu$ | 0.33 | | Poisson's ratio |
64+| $\rho$ | 2700 | kg/m^3 | density |
65+| $\sigma_0$ | 2.3 | 1/s | frequency-independent loss rate |
66+| $\eta$ | 5.0e-8 | s | Kelvin-Voigt viscosity |
67+| $(x_s, y_s)$ | (0.09144, 0.10668) | m | strike center ($0.3 L_x$, $0.35 L_y$) |
68+| $R$ | 0.01 | m | strike radius |
69+| $T_s$ | 0.0005 | s | strike duration |
70+| $F_{\max}$ | 10 | N | peak total force |
71+| $\rho_a$ | 1.204 | kg/m^3 | air density |
72+| $c_a$ | 343 | m/s | speed of sound in air |
73+| $\mathbf{x}_L$ | (0.2524, 0.1524, $h/2$ + 0.5) | m | listener point |
74+
75+All values are exact decimal numbers, not rounded measurements. The listener is 0.5 m above the top face, offset 0.1 m from the plate center in $x$, so that modes antisymmetric in $x$ radiate to it.
76+
77+With these constants the plate's fundamental mode is near 37 Hz, $\sigma_0$ gives the lowest modes a sixty-decibel decay time of about 3 s, and $\eta$ makes a mode at 5 kHz decay in about 0.3 s and one at 20 kHz in about 17 ms.
78+
79+## Output signal
80+
81+The output is the acoustic pressure at the listener point given by the Rayleigh integral over the top face, using the normal acceleration of the top face and the retarded time,
82+
83+$$
84+s(t) = \frac{\rho_a}{2\pi} \int_{S^+} \frac{1}{|\mathbf{x}_L - \mathbf{y}|}\; \frac{\partial^2 u_z}{\partial t^2}\!\left( \mathbf{y},\; t - \frac{|\mathbf{x}_L - \mathbf{y}|}{c_a} \right) dS(\mathbf{y}), \qquad \text{in Pa},
85+$$
86+
87+with $\partial^2 u_z / \partial t^2$ taken as zero for negative arguments. This is the field of a planar radiator in an infinite rigid baffle; it is an idealization of the true radiation from a free plate, adopted here because it is an explicit formula that needs no solution of the acoustic wave equation. A later challenge will replace it with the coupled acoustic problem.
88+
89+The deliverable is a wav file with the following properties.
90+
91+| Property | Value |
92+| --- | --- |
93+| channels | 1 |
94+| sample rate $f_s$ | 48000 Hz |
95+| number of samples $N$ | 144000 (3.0 s) |
96+| sample format | 32-bit IEEE float (WAVE_FORMAT_IEEE_FLOAT) |
97+| sample $k$, for $k = 0, \dots, N-1$ | $s(k / f_s) / s_\text{ref}$ |
98+| $s_\text{ref}$ | see `output.signal_scale` in challenge.json (Pa) |
99+
100+The first sample is at $t = 0$, the onset of the strike. The signal is zero until the first sound arrives at the listener, about 1.46 ms after onset. Samples are pointwise values of the continuum signal, with no anti-aliasing filter; the Kelvin-Voigt term makes the content above the Nyquist frequency small after the first milliseconds. The scale $s_\text{ref}$ is a fixed constant chosen so that the peak sample magnitude is roughly 0.5. Do not normalize the signal; absolute amplitude is compared.
101+
102+## Error measures
103+
104+The error measures are the same two as for the string challenges, applied to the 144000 samples: the relative waveform $\ell^2$ error (primary) and the relative spectrogram $\ell^2$ error with a periodic Hann window of length 2048 and hop 512, no padding, over $\lfloor (N - 2048) / 512 \rfloor + 1$ frames. See [string-pluck-v1](https://vault1.magland.org/challenges/string/blob/main/challenges/string-pluck-v1/README.md#error-measures) for the formulas.
105+
106+## Reference solution
107+
108+There is no externally supplied ground truth. The reference is chosen automatically from the submitted solutions by the procedure described in the [collection README](../../README.md), unless `reference_solution` in challenge.json names one explicitly. Until a converged three-dimensional solution is submitted, the reference will be the best thin-plate solution, and the errors of other thin-plate solutions relative to it measure only discretization differences within plate theory.
109+
110+## Optional field export
111+
112+A submission may provide the normal displacement of the mid-plane for visualization; this is not scored. The file is HDF5 with datasets `x`, float64, shape (61,), $x_i = i L_x / 60$; `y`, float64, shape (61,), $y_j = j L_y / 60$; `t`, float64, shape (3001,), $t_k = k / 1000$; and `u`, float32, shape (3001, 61, 61), with `u[k, j, i]` $= u_z(x_i, y_j, 0, t_k)$ in meters. Root attributes `challenge_id`, `solution_id`, `quantity` and `units` are recommended. The file is about 45 MB and should be stored with git LFS or at an external URL. Thin-plate methods report their transverse displacement $w$ as $u_z$.
113+
114+## Appendix: thin-plate reduction
115+
116+For reference, the Kirchhoff-Love reduction of the model above, which is an approximation valid when the bending wavelength is large compared with $h$, is
117+
118+$$
119+\rho h\, \frac{\partial^2 w}{\partial t^2} + 2 \sigma_0 \rho h\, \frac{\partial w}{\partial t} + D\, \nabla^4 \left( w + \eta\, \frac{\partial w}{\partial t} \right) = p(x, y, t), \qquad D = \frac{E h^3}{12 (1 - \nu^2)},
120+$$
121+
122+for the transverse displacement $w(x, y, t)$ of the mid-plane, with the free-edge conditions of vanishing bending moment and effective shear force on all four edges and vanishing twisting moment at the corners. The same constants $\sigma_0$ and $\eta$ apply. Note that the strike pressure enters with a positive sign here because $w$ is measured in the $-z$ direction in the usual plate convention; a submission must report $u_z = -w$ in that case, or use $w$ measured in $+z$ with $-p$ on the right-hand side. In this challenge $D \approx 7.25$ N m and $\rho h \approx 2.81$ kg/m^2.
challenges/plate-strike-v1/challenge.jsonadded+54−0View file
@@ -0,0 +1,54 @@
1+{
2+ "challenge_id": "plate-strike-v1",
3+ "title": "Struck free aluminum plate: radiated pressure",
4+ "version": 1,
5+ "output": {
6+ "type": "wav",
7+ "sample_rate_hz": 48000,
8+ "num_samples": 144000,
9+ "channels": 1,
10+ "sample_format": "float32",
11+ "signal": "acoustic pressure at the listener point from the Rayleigh integral over the top face",
12+ "signal_unit": "Pa",
13+ "signal_scale": 2.6
14+ },
15+ "parameters": {
16+ "Lx": 0.3048,
17+ "Ly": 0.3048,
18+ "h": 0.00104,
19+ "E": 68.9e9,
20+ "nu": 0.33,
21+ "rho": 2700.0,
22+ "sigma0": 2.3,
23+ "eta": 5.0e-8,
24+ "strike_x": 0.09144,
25+ "strike_y": 0.10668,
26+ "strike_radius": 0.01,
27+ "strike_duration": 0.0005,
28+ "strike_peak_force": 10.0,
29+ "rho_air": 1.204,
30+ "c_air": 343.0,
31+ "listener_x": 0.2524,
32+ "listener_y": 0.1524,
33+ "listener_height": 0.5
34+ },
35+ "metrics": {
36+ "primary": "waveform_l2",
37+ "waveform_l2": {},
38+ "spectrogram_l2": {
39+ "window": "hann_periodic",
40+ "n_fft": 2048,
41+ "hop": 512
42+ }
43+ },
44+ "fields": {
45+ "format": "hdf5",
46+ "quantity": "normal displacement of the mid-plane, u_z(x, y, 0, t)",
47+ "units": "m",
48+ "axes": ["t", "y", "x"],
49+ "shape": [3001, 61, 61],
50+ "frame_rate_hz": 1000,
51+ "dtype": "float32"
52+ },
53+ "reference_solution": null
54+}
registry/solution-repos.jsonadded+10−0View file
@@ -0,0 +1,10 @@
1+{
2+ "repos": [
3+ {
4+ "repo": "challenges/plate-solutions",
5+ "branch": "main",
6+ "path": "solutions",
7+ "description": "Example submissions by the challenge authors: Kirchhoff-Love plate with Bogner-Fox-Schmit finite elements."
8+ }
9+ ]
10+}