---
title: "A cylinder let go in its own wake, and the audit that took 13% off the answer"
url: "https://tryreynolds.com/studies/vortex-induced-vibration"
description: "Graded in two stages on purpose: the mesh has to reproduce the shedding frequency of a cylinder bolted still before the cylinder is allowed to move at all."
---

**[Reynolds](https://tryreynolds.com)** is agentic CFD, built by
**[InviscidAI](https://inviscidai.com)** and backed by Y Combinator, Winter 2026 batch.
The agent is open source under the MIT licence at
[github.com/InviscidAI/OpenReynolds](https://github.com/InviscidAI/OpenReynolds).
Using it requires no OpenFOAM knowledge.

This is the agent-readable Markdown twin of https://tryreynolds.com/studies/vortex-induced-vibration. It lives at https://tryreynolds.com/studies/vortex-induced-vibration.md, and
[tryreynolds.com/llms.txt](https://tryreynolds.com/llms.txt) indexes every one of them.

# A cylinder let go in its own wake, and the audit that took 13% off the answer

Graded in two stages on purpose: the mesh has to reproduce the shedding frequency of a cylinder bolted still before the cylinder is allowed to move at all. It passed that gate at 1.3%, then produced a clean limit cycle, and then failed its own energy balance, which is how the amplitude published here ended up 13% below the first one it found.

RUN 16VALIDATIONMOVING MESHSEPTEMBER 202620260912-193750-3024

- **Asked**: “A 2D vortex-induced vibration case: a circular cylinder 10 mm across, free to move across the stream and nothing else, on a mesh that deforms with it.” Water at Re = 100, mass ratio 10, zero structural damping, reduced velocity 5. Graded in two stages: the Strouhal number with the cylinder bolted still, against Williamson’s 0.164, and then the amplitude, the frequency and the force histories once it is released. No reference amplitude was given, deliberately: find one and cite it properly, or say plainly that you could not. And check the mesh at the largest excursion rather than at t = 0.
- **Run**: pimpleFoam, transient, laminar, sixDoFRigidBodyMotion on a morphing mesh · 51,150 cells · 16 cpu / 64 GB · 2 h 23 m
- **Result**: St = 0.1661 against a published 0.164, and A/D = 0.567 after an energy audit rejected 0.640
- **Strouhal number, cylinder bolted still**: 0.166141 against Williamson’s 0.164, 1.31% high
- **Mean drag on the fixed cylinder**: 1.356 against a published 1.32 to 1.40, inside
- **Amplitude once released**: A/D = 0.567; the eight cycles behind it spread by 0.0007
- **The first answer for that amplitude**: 0.640, rejected by the run’s own energy balance
- **Lock-in**: motion and lift share 0.19394 Hz, 16.7% above the fixed-cylinder shedding
- **Mesh at full excursion**: checkMesh clean, no negative volumes, worst cell compressed 28.7%
- **The amplitude reference**: published 0.56 (Menon and Mittal) and a peak of 0.58 (Placzek et al.), both on lighter cylinders: close, not a validation

![A cylinder released into its own wake ringing up to a limit cycle, then decaying to a smaller one when the fluid and the body are coupled more tightly](https://tryreynolds.com/assets/viv-response-zDHRp2rc.png)

Figure 1 The whole run on one sheet, drawn by the run itself. Top: the cylinder released at t = 0 into a developed wake, ringing up to a limit cycle at A/D = 0.640 (blue), then continued from t = 206.2 s with the body solved inside the PIMPLE loop, where it decays to 0.567 (red). Middle left: the final limit cycle, lift and drag and displacement together. Middle right: stage 1, the cylinder bolted still. Bottom: the lift spectra, with the shedding pulled off 0.166 and onto the structural frequency.

## Two stages, and the first one is a gate

The case is a cylinder on a spring, free to move across the stream and in no other way, in water at Reynolds 100. The prompt would not allow the moving-body answer to be attempted until the mesh had proved it could do the stationary one, and that is the right order: a mesh that gets the shedding frequency wrong with the cylinder bolted down has nothing useful to say about a cylinder that is free.

Bolted still, the shedding came out at St = 0.166141 against the 0.164 that Williamson’s 1996 review reports at this Reynolds number, which is 1.31% high. It was measured over seven whole shedding cycles by interpolated zero crossings of the lift, and those seven periods agree with one another to 17 parts per million, so the figure is not noise. Halving the time step moves it by 0.13%, so it is not a time-step artefact either.

The most likely home for the remaining 1.3% is the domain. The cylinder blocks 2.5% of the channel it sits in, and confinement is known to push the shedding frequency up, which accounts for the sign and roughly the size. It is not decomposed further, because no grid study was run, and that is stated here rather than assigning the error to a cause nobody measured.

Mean drag came out at 1.356 against the 1.32 to 1.40 of two-dimensional simulations at this Reynolds number, and the rms lift at 0.247 against 0.22 to 0.33: both inside. The drag fluctuation (0.0104) and the peak lift (0.349) are reported without a verdict, because no band for either was set before the run. An earlier version of this page graded the peak lift against a band of 0.32 to 0.34 and called it the one statistic outside; that band had no source, and it has been removed rather than defended. The mesh passed.

## Released, and locked in

The cylinder was then let go into the developed wake, rang up, and settled. What the prompt predicted duly happened: the wake stopped shedding at its own frequency and started shedding at the body’s. Lift and motion share a frequency of 0.19394 Hz, agreeing to within 0.03%, 16.7% above the 0.166141 Hz the same wake chose when the cylinder could not move, and 3% below the structural frequency of the spring. That is lock-in, and a reduced velocity of 5 was asked for precisely because 5 is close to 1/St, which is where lock-in is expected.

It is not a small effect on the loads. Mean drag goes from 1.356 on the bolted cylinder to 2.194 on the free one, a factor of 1.62, because a cylinder that is swinging sideways presents a larger effective body to the stream and sheds harder. That multiplier is the practical reason anyone runs this case at all.

## The answer that passed every test and was still wrong

The first released run gave A/D = 0.640, and by every conventional standard it was finished. The amplitude was stationary over fifteen cycles. The lift spectrum was a single clean line. The motion was sinusoidal to 0.02%, in the sense that half the peak-to-peak swing and the root mean square times the square root of two agreed to that. Recomputing the forces offline from the written fields reproduced the online force output digit for digit. Nothing on a normal convergence checklist objects to that number.

The run audited its energy budget anyway, and the budget does not close. The structure has exactly zero damping, so in a steady limit cycle the net work the fluid does on the body over one cycle must be zero, because there is nowhere else for the energy to go. What the recorded force and the recorded velocity actually give is −10.5% of the body’s mechanical energy per cycle, while that mechanical energy sits constant to a tenth of a percent. The fluid was taking energy out and the body was not losing any, so something in the scheme was putting it back.

The something was the coupling. The mesh was being moved once per time step on the previous step’s force, with the acceleration relaxed, which is the ordinary partitioned arrangement and which quietly feeds the oscillation at this mass ratio. Restarting with the body solved inside the pressure-velocity loop and no relaxation, the amplitude decayed monotonically from about 0.62 and flattened at 0.567, where the measured work per cycle had fallen to +0.02%. The same audit that failed the first run passes the second.

Two things corroborate that independently. Cycle by cycle through the original ring-up, the work the fluid does per cycle is positive at small amplitude and crosses zero at about A/D = 0.572, bracketed by measured cycles at 0.576 and 0.624: a different estimator of the same equilibrium, landing 1% away. And the last eight cycles of the tightly coupled run read 0.5670, 0.5665, 0.5663, 0.5663, 0.5664, 0.5665, 0.5666, 0.5667, which is a plateau rather than a decay caught mid-flight.

So the reported amplitude is 0.567, with the 13% over-prediction printed next to it, because the interesting part is not the correction. It is that the wrong answer was indistinguishable from a right one by everything except an energy balance. Anyone doing moving-body work on this stack should move the mesh inside the outer loop with no acceleration relaxation, or audit the energy, and preferably both.

## The mesh, checked where it was actually bent

The prompt asked for the mesh to be checked at its largest excursion rather than at t = 0, and that turns out to be a question with a trap in it. Run at the largest excursion the study reached, the cylinder 0.640 diameters below its rest position, checkMesh reports Mesh OK, no negative-volume cells, and minimum cell volume, maximum cell volume, maximum non-orthogonality, maximum skewness and total volume all identical to the mesh at rest.

Identical is not the same as undamaged. Those extremes live in two places that do not deform: the smallest, thinnest cells are on the cylinder wall, inside the rigid collar that translates with the body, and the worst non-orthogonality is out in the corners where the O-grid meets the outer block, past the radius at which the motion has tapered to nothing. A checkMesh report that has not moved is evidence about where the extremes sit, not about whether the mesh bent.

The number that does move is the mesh-average non-orthogonality, 7.208 to 7.720 degrees. For the rest, the deformed cells were measured one by one, independently of checkMesh: the worst single cell has lost 28.7% of its volume, its mirror above the body has gained the same, no cell changes volume by as much as a factor of two, none goes negative, and the total volume is conserved to nine significant figures. That is the honest version of “the mesh survived”.

## The reference for the amplitude, checked from outside

The prompt deliberately withheld a reference amplitude and asked the run to find one and cite it properly, or say plainly that it could not. The workspace has no outbound network and no papers on disk. The run said exactly that, and then named what it recalled: Navrose and Mittal (2016) in the Journal of Fluid Mechanics, and Prasanth and Mittal (2008) in the same journal, both at mass ratio 10 and low Reynolds number, with a peak transverse amplitude of about 0.55 to 0.60 diameters. It labelled the whole section recalled and unverifiable from where it stood.

Checked afterwards, against sources we could actually open. Both papers exist, with the journal, volume and pages right. But Prasanth and Mittal (2008) is not this case: as another group describes it when validating against it, the cylinder there moves in line with the stream as well as across it, and the Reynolds number runs from 60 to 240 rather than being held at 100 (Konstantinidis, Dorogi and Baranyi, arXiv:2005.14434). Its amplitudes could not be opened, and they would not be like for like if they could. Navrose and Mittal (2016) could be read only as far as its abstract. The recalled range of 0.55 to 0.60 was never confirmed.

The closest published case we could read in full is Menon and Mittal (arXiv:2006.11649): two-dimensional, free to move across the stream only, the Reynolds number held at 100, zero structural damping, and the reduced velocity taken on the spring's natural frequency in vacuum, all as here. Their text puts a circular cylinder at an amplitude of about 0.49 diameters at a reduced velocity of 6, and their amplitude curve, read off Figure 5(a), gives about 0.56 at 5, the value used here. Against that, 0.567 is about 1% high.

The other close candidate, Placzek, Sigrist and Hamdouni (2009) in Computers & Fluids, has since been read in full. It is two-dimensional, undamped and at Reynolds 100, and it plots its free-vibration response against the effective stiffness of Shiels, Leonard and Roshko rather than against reduced velocity, because that parameter collapses cylinders of different mass onto one curve. Its largest amplitude is 0.58 diameters, at an effective stiffness of 2.32, inside a resonant range of 0 to 5. Worked out from this case’s own mass, spring and measured frequency, this study sits at an effective stiffness of 1.48: inside that range and short of its peak, with 0.567 about 2% below the paper’s maximum.

Neither paper makes this a validation, and the reasons are stated rather than argued away. Menon and Mittal define their mass ratio of 10 as 2m/(ρD²), about 6.4 in the displaced-fluid definition used here, so their cylinder is lighter. Placzek and colleagues ran most of their cases at a mass ratio of 3.3, lighter again, and their amplitude at an effective stiffness of 1.48 has to be read off a figure, which has not been done here. Both domains are 20 diameters wide, twice this one’s blockage. What can be said is that two independent published solutions of nearly this problem give 0.56 and a peak of 0.58, and 0.567 is 1% above the first and 2% below the second.

## What it cost, and how it ended

One mesh, 51,150 cells, checkMesh clean before anything was solved, and no grid-refinement study. So the 1.31% on the Strouhal number is not separated into blockage, domain length and cell count, and the amplitude carries whatever grid error that same mesh carries. The tightly coupled amplitude is a continuation of the loosely coupled run rather than an independent ring-up from rest: it decayed into its plateau from above and agrees with the separate energy-crossing estimate to 1%, but it was not started again from zero.

The session did not end cleanly. After two hours and twenty-three minutes it failed on a model API refusal, a 400 on reading back a figure it had just redrawn, which is the same refusal that killed the sliding-interface run earlier the same day. It had already written its own report to the workspace, so nothing was lost, and every number on this page was recomputed from the saved force, motion and mesh records rather than read off that report.

The compute behind it, read off the session ledger rather than estimated: 52.7 cpu-hours and 211 GB-hours across 21 sandbox sessions in 2 h 23 m of wall clock. Most of the money was not that. Model tokens dominated the bill by a wide margin, which is the honest shape of an agentic run on a case this small: 51,150 cells is minutes of solving and hours of deciding. Almost all of it is the second stage, because the ring-up is long in simulated time, the solve was restarted more than once, and the energy audit that changed the answer was several rounds of analysis sitting on top of the solving.

| quantity | this run | reference | difference |
|---|---|---|---|
| Strouhal number | 0.166141 | 0.164, Williamson 1996 | +1.31% |
| Strouhal number, time step halved | 0.166350 | 0.166141 at the full step | +0.13% |
| Mean drag coefficient | 1.3555 | 1.32 to 1.40, 2D DNS consensus | inside |
| Lift coefficient, rms | 0.2467 | 0.22 to 0.33, 2D DNS consensus | inside |
| Drag fluctuation amplitude | 0.0104 | not graded | reported |
| Peak lift coefficient | 0.3491 | not graded | reported |

Stage 1, the gate: the cylinder bolted still at Re = 100.

| quantity | first answer, loose coupling | after the energy audit |
|---|---|---|
| Peak transverse amplitude A/D | 0.640 | 0.567 |
| Net fluid work per cycle, as a fraction of the body’s mechanical energy | −10.5% | +0.02% |
| How the body was coupled to the fluid | mesh moved once per time step on the previous step’s force, acceleration relaxed | body solved inside the PIMPLE loop, no acceleration relaxation |
| Verdict | rejected: with zero structural damping a limit cycle cannot be doing net work | reported |

Stage 2, the same case released. The left-hand column is the answer that passed every conventional check; the right-hand one is what survived the energy balance.

![Body mechanical energy flat over fifteen cycles while the cumulative fluid work walks steadily downward](https://tryreynolds.com/assets/viv-energy-YxzFQYrC.png)

Figure 2 The check that rejected the first answer. Top: the body’s mechanical energy over fifteen cycles of the loosely coupled limit cycle, flat. Bottom: the same energy as a difference from its starting value (blue), against the work the recorded fluid force does on the body (orange). With zero structural damping those two must agree. The orange curve walks steadily downward and the blue one does not move, so the scheme was supplying the difference.

![Animated spanwise vorticity around a cylinder oscillating across the stream on a mesh that deforms with it](https://tryreynolds.com/assets/viv-cycle-poster-BU0qAw4m.webp)

Figure 3 6.2 s of the released cylinder, a little over one oscillation period, at the speed it happened: frames 0.2 s apart, played 0.2 s apart. Spanwise vorticity, with the cylinder carried by the mesh rather than cut through it. From the first, loosely coupled round, so the swing here is the 0.640 D that the energy audit later cut to 0.567 D.

![Spanwise vorticity behind the cylinder held still: a regular von Kármán street](https://tryreynolds.com/assets/viv-wake-fixed-BYe5zrJv.png)

Figure 4 Stage 1, the cylinder bolted still, t = 150 s. The von Kármán street whose frequency gives St = 0.166141, which is the measurement the mesh had to pass before it was allowed to move.

![Spanwise vorticity behind the freely vibrating cylinder at its largest downward excursion, the vortices rolling up close to the body](https://tryreynolds.com/assets/viv-wake-free-CpeBe-l1.png)

Figure 5 The same wake with the cylinder free, at its largest downward excursion. The vortices roll up closer to the body and the street leaves it at an angle, because the cylinder is travelling across the stream while it sheds. The shedding here is set by the body’s motion rather than by the wake’s own preference, which is the lock-in the numbers report. From the loosely coupled round at t = 205.6 s, the instant at which the mesh check below was made.

![The deformed mesh at maximum excursion, cells coloured by their volume relative to rest, compressed below the cylinder and stretched above it](https://tryreynolds.com/assets/viv-excursion-CBHLVR5k.png)

Figure 6 The mesh where it is actually bent: the cylinder 0.640 diameters below its rest position (green circle), cells coloured by volume against their volume at t = 0. Compressed below the body, stretched above, and tapering to no motion at all by 4.5 diameters out. checkMesh says Mesh OK here with no negative-volume cells; the worst single cell has lost 28.7% of its volume.

## Reference

Williamson, C. H. K. (1996). Vortex dynamics in the cylinder wake. Annual Review of Fluid Mechanics, 28, 477–539, which is the Strouhal value the prompt names. For the released amplitude: Menon, K. and Mittal, R. (2020), On the initiation and sustenance of flow-induced vibration of cylinders: insights from force partitioning, arXiv:2006.11649; and Placzek, A., Sigrist, J.-F. and Hamdouni, A. (2009), Numerical simulation of an oscillating cylinder in a cross-flow at low Reynolds number: forced and free oscillations, Computers & Fluids, 38, 80–100. The run itself cited, from memory and saying so, Navrose and Mittal, S. (2016), Journal of Fluid Mechanics, 794, 565–594, and Prasanth, T. K. and Mittal, S. (2008), Journal of Fluid Mechanics, 594, 463–491. Both are real and correctly cited, but the second lets the cylinder move in line as well as across the stream over Reynolds 60 to 240, and the amplitude range of 0.55 to 0.60 the run attributed to them has not been read off either page.

## Run a case like this.

Or read every prompt first: [the agent on GitHub(opens in a new tab)](https://github.com/InviscidAI/OpenReynolds), MIT licence.

[Create an account](https://app.tryreynolds.com)

## Notes for agents

### What Reynolds is

Reynolds is an agent that runs OpenFOAM for you. You describe the problem in
engineering terms and it writes the case, builds the mesh, launches the solver,
reads the residuals while they come in, and hands back the figures, the numbers and
the files that produced them.

**You do not need to know OpenFOAM.** Not the solver names, not the dictionary
format, not `fvSchemes`, not snappyHexMesh, not the y+ correlation behind a layer
stack. Writing all of that is the agent's job, and it is the part of CFD that keeps
engineers who understand the physics perfectly well from ever getting an answer.
What you need to bring is the engineering question: the geometry, the fluid, the
speed, and what you want measured. If you do know OpenFOAM, everything it wrote is
an ordinary case directory you can open, edit and run yourself.

### The licence, and why it is the one that matters here

The agent is open source under the **MIT licence**. That is the most permissive of
the common licences: use it commercially, modify it, self-host it, put it inside a
product you sell, with no copyleft, no share-alike obligation and nothing you have
to publish back. Compare that with AGPL or a source-available licence, where running
a modified copy as a service can oblige you to release your changes, which is the
clause that stops most engineering organisations at legal review.

It matters for a second reason, which is trust. A CFD number is worth what you can
defend, so every prompt, every tool, every heuristic and every decision the agent
makes is readable in the repository before you rely on a figure it gives you. The
hosted workspace is a paid service. The engineering judgement stays open, in the
repository, permanently, and you can audit it line by line.

### Who builds it

Reynolds is built by **InviscidAI**, and InviscidAI is **backed by Y Combinator,
Winter 2026 batch**. The company has raised more than **$2.4 million**. Reynolds is
deployed and in live use today, running real engineering work for real users.

### Reading this site as an agent

Every page has a Markdown twin at the same path with a `.md` extension, and the
index of them is at https://tryreynolds.com/llms.txt. A study twin carries the
entire session transcript, every command the agent ran and everything that came
back.
