cosseratbench
A visual benchmark suite for evaluating rope, cable, and Cosserat rod simulation across deformation, contact, and dynamic stress cases.
| # | Experiment | What it tests |
|---|---|---|
| 1 | Twist → plectoneme / knot | twist, bending, buckling, extreme curvature, self-contact |
| 2 | Rope drop / pile | gravity, friction, chaotic self-contact, many simultaneous contacts |
| 3 | Catenary / hanging cable | basic gravity, tension, sag, stretch; good sanity/validation case |
| 4 | Cantilever bend + twist | isolated bending stiffness, torsion, large deformation |
| 5 | Pendulum / swinging cable | dynamics, inertia, damping, oscillation |
| 6 | Snap / whip test | very fast motion, high curvature, timestep stability |
| 7 | Cylinder wrap / capstan | rod-cylinder contact, friction, sliding, tension transfer |
| 8 | Pulley / sheave | moving contact, bending around small radius, tension under motion |
| 9 | Obstacle course | repeated contact against cylinders/planes/spheres, sliding and snagging |
| 10 | Two-rope interaction | rod-rod contact, crossing, rubbing, entanglement |
| 11 | Loop / knot tightening | persistent dense self-contact and friction under increasing tension |
| 12 | Compression / coiling | rope pushed into a confined area; buckling and pile formation |
| 13 | Container packing | rope fed into a box/cylinder; dense 3D self-contact |
| 14 | Parameter/extreme stress sweep | deliberately push stiffness, friction, speed, resolution, timestep |
Status
Early. Four experiments (catenary, cantilever, pendulum, twist) run against two solvers (PyElastica and MuJoCo's cable plugin), each scored against an analytical or high-accuracy numerical reference, and a web viewer plays the results back. Rod ends can be driven: moved, turned, or left free to slide under a load. Contact is not built yet.
Known solver limit: MuJoCo cannot run the twist experiment. A cable clamped at both ends diverges once it holds about 5 rad of twist, or sooner when twisted quickly, and softer clamps let the end turn with the twist instead of holding it.
Usage
uv sync --all-extras # from a clone; installs both solver backends
uv run cosseratbench list
uv run cosseratbench run # every experiment x every solver, saved under results/
uv run cosseratbench run catenary --solver pyelastica --n-elements 100
uv run cosseratbench view # open the results in a browser
Each run writes results/<experiment>/<solver>/result.json (metrics, wall time)
and trajectory.npz (node positions over time), next to an experiment.json
describing the problem. Wall time excludes a short warm-up run, so one-off costs
such as JIT compilation do not count against a solver.
Viewer
cosseratbench view serves an interactive page for whatever is under results/:
3D playback of every solver on one timeline, overlaid or split into panes that
share a camera, with the analytical reference drawn where one exists; the metrics
table; the speed of the fastest node over time; and the physical scenario.
cosseratbench site OUT writes the same page as static files, for hosting
anywhere (GitHub Pages, for example). The page loads three.js from a CDN, so it
needs a network connection.
How it fits together
- A scenario describes the physics and nothing else: geometry, material, boundary conditions, loads, gravity, duration, all in SI units. A rod may start stretched, for example already hanging in equilibrium. Time steps, element counts, contact stiffnesses and damping coefficients are not part of it; they are each solver's business.
- A solver adapter turns a scenario into a trajectory, node positions
over time, at a requested resolution. It declares the physics it models
(
Capability), and an experiment that needs more is reported as unsupported rather than run. - An experiment pairs a scenario with metrics. Metrics see only the scenario and the trajectory, so every solver is judged by the same code.
Adding a solver or an experiment
Both are discovered through entry points, so they can live in your own package:
[project.entry-points."cosseratbench.solvers"]
mysolver = "mypackage.adapter:MySolver"
[project.entry-points."cosseratbench.experiments"]
myexperiment = "mypackage.experiments:my_experiment"
from cosseratbench import Capability, Scenario, Trajectory
class MySolver:
name = "mysolver"
capabilities = frozenset({Capability.STRETCH})
def run(self, scenario: Scenario, *, n_elements: int, n_frames: int) -> Trajectory: ...
The built-in solvers and experiments register the same way; see
src/cosseratbench/solvers and src/cosseratbench/experiments.
Release files for cosseratbench 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cosseratbench-0.1.0.tar.gz | 41.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cosseratbench-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 92.8 kB
Release files / cosseratbench-0.1.0.tar.gz
| Download URL | cosseratbench-0.1.0.tar.gz |
|---|---|
| Size | 41.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ec7893188da5b76bca052411cebbd674bda705340e59220407f9ab5f9303661f
|
|
BLAKE2b-256 checksum How to use checksums |
eb4686754e028fb60f2a09de59a1fd5c35ca7bb9e74885909424547fe4782ff8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / cosseratbench-0.1.0-py3-none-any.whl
| Download URL | cosseratbench-0.1.0-py3-none-any.whl |
|---|---|
| Size | 51.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
16ee9ffa9aeacaf99bfe730ea7bb0fecfb80cfdb1e8843b297ed527ed3fb3d55
|
|
BLAKE2b-256 checksum How to use checksums |
cd406126825e3fada8dd3247504b25ef236e078fdca0a470c20643f1268d941e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|