---
title: "A mesh that slides, checked against an answer that cannot be argued with"
url: "https://tryreynolds.com/studies/couette-sliding-interface"
description: "Before a rotor blade goes inside a spinning zone, the spinning zone itself has to be trusted."
---

**[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/couette-sliding-interface. It lives at https://tryreynolds.com/studies/couette-sliding-interface.md, and
[tryreynolds.com/llms.txt](https://tryreynolds.com/llms.txt) indexes every one of them.

# A mesh that slides, checked against an answer that cannot be argued with

Before a rotor blade goes inside a spinning zone, the spinning zone itself has to be trusted. This case has an exact algebraic solution, so there is no tolerance band to hide in, and it was run twice, once across a sliding interface and once without one, so the interface has to answer for the difference.

RUN 11VALIDATIONMOVING MESHSEPTEMBER 202620260912-190302-ae39

- **Asked**: “I want a 2D concentric-cylinder case built across a sliding interface, because before I put a blade inside a rotating zone I need to know whether the interface itself is trustworthy.” Then: the velocity across the gap, the torque on the inner cylinder, whether the profile kinks at the seam, and the interface weight sums.
- **Run**: pimpleFoam, transient, laminar · 12,000 cells, run twice · 16 cpu / 64 GB · 27 minutes
- **Result**: Velocity within 0.16% of the exact answer; torque within 0.43%
- **Velocity field**: within 0.16% of the exact solution (rms), worst cell 0.40%
- **Torque on the inner cylinder**: 1.21154 mN·m/m against an exact 1.20637, 0.43% high
- **Step in velocity at the seam**: 0.005% of the wall speed, i.e. none that can be plotted
- **Interface area held**: within 43 parts per million of perfect, over 4,076 rebuilds
- **The control, same mesh without the interface**: 0.035% rms and 0.04% on torque
- **Grid convergence, the sliding interface**: first order, p = 0.79: torque error 0.78%, 0.43%, 0.22% on 2,880, 11,520 and 46,080 cells
- **Grid convergence, the control**: second order, p = 1.93, and extrapolating to zero cell size lands 0.0004% from the exact torque
- **What the interface error follows**: the time step, not the cell size: at a fixed step, four times the cells moved it from 0.2174% to 0.2205%
- **Taylor number**: 64 against a critical 1,708, checked before anything else was trusted

![Tangential velocity across the annulus lying on the exact Ar + B/r curve, and the error against it staying inside a quarter of one percent](https://tryreynolds.com/assets/ami-profile-D7JlMGd_.png)

Figure 1 Left: every one of the 12,000 cells plotted against the exact Ar + B/r. The computed points sit on the line: at this scale the two are one curve. Right: the same data as an error, magnified 400×, never leaving ±0.4% of the wall speed. Grey is cell-to-cell scatter at a fixed radius; green is the shell mean. Note where it turns: exactly at r = 30 mm, the interface, and nowhere else.

## What “within 0.16%” means, because the number is easy to misread

It is the error, not the score. The simulation and the exact answer agree to better than two parts in a thousand: put them on the same axes and you cannot see two curves, which is what Figure 1 shows. The right-hand panel of that figure is the difference between them magnified four hundred times, and only then does it become visible at all.

For a sense of how small that is: engineering CFD is normally considered validated when it lands within a few percent of an experiment, and a great deal of published work on flows this simple settles for five. A well-run wind tunnel struggles to measure a velocity to better than one percent. This is an order of magnitude tighter than the measurement you would usually be checking against, and it is not checked against a measurement at all, but against algebra, which has no error bars.

The torque reads the same way. 0.43% high means that if the true twisting force on the inner cylinder is 1,000 units, the simulation said 1,004. On a pump impeller, a fan or a turbine stage, torque is the number the whole calculation exists to produce, and half a percent on it is comfortably inside what anyone designing hardware would act on.

## Why this case, and not a prettier one

Almost every rotating machine, a pump, a fan, a turbine stage, a mixer, is simulated by putting the moving part inside a zone of mesh that turns, and coupling that zone to the stationary mesh around it across a sliding interface. The interface is the part nobody checks, because on a real rotor there is no right answer to check it against.

Concentric cylinders are the exception. Spin the inner one slowly in a viscous fluid and the steady flow has a closed-form solution, u_theta(r) = Ar + B/r, with A and B fixed by the two wall speeds and nothing else; the torque per unit length on the inner cylinder is likewise exact. So the interface can be dropped into the middle of a flow whose answer is known to as many digits as anyone cares to write down.

The first thing the agent did was not to solve anything. It computed the Taylor number: 64, against the 1,708 at which this flow stops being simple and breaks into Taylor vortices. It said so before trusting anything downstream of it. That ordering was asked for, and it matters: the closed form above is only the answer while the flow stays in that regime, and a run that skips the check can be very precisely matched to a formula that no longer applies.

## The control is the part that makes it a result

Unprompted, the agent built the same annulus a second time, same 50 radial by 240 azimuthal cells, same solver, same everything, as a single continuous ring with no interface anywhere in it, and ran that too. That control is what turns a number into a finding, because it separates “how good is this mesh” from “what did the sliding interface cost”.

The answer: the interface costs about a factor of five on the velocity field (0.16% rms against the control’s 0.035%) and about a factor of ten on the torque (0.43% against 0.04%). Both are still small. Neither is zero, and without the control neither could have been attributed to anything.

It is worth being plain about the direction of that. These numbers say the sliding interface is accurate, and they also say it is not free. Quoting the 0.16% without the 0.035% beside it would overstate the mesh and understate the interface in the same breath.

## The seam leaves no step, and a fingerprint anyway

The question behind the whole case was whether the velocity profile kinks where the two rings meet. It does not. Across r = 30 mm the tangential velocity is continuous to 2.0 × 10⁻⁶ m/s, five thousandths of one percent of the wall speed, which is invisible at any scale anyone would plot.

But the error curve, drawn against the closed form, changes slope at exactly 30 mm and nowhere else, and the cell-to-cell scatter at a fixed radius is five orders of magnitude larger than on the control. The interface does not put a step in the answer; it puts a signature in the error. That is the more useful thing to know, because it says where to look on a case that has no exact solution to difference against.

The bookkeeping check the prompt actually asked for, the interface weight sums the solver prints, which say whether the coupling has quietly lost area, came back clean and stayed clean: never below 1.0, never above 1.0000428, identically on both sides, across 4,076 rebuilds as the rotor slid. A worst case of 43 parts per million, and in the direction of slight over-coverage rather than loss.

## The grid study, and what the interface error is actually made of

The first session left this case on one mesh. Its four refinement runs had been launched with the time step untouched, and they blew up, so the question of whether the 0.43% shrinks with smaller cells went unanswered. The study was reopened three days later to answer it, and the answer is more interesting than a smaller number would have been.

First, the blow-ups. They were not the interface and not the mesh: the conformal control diverged the same way, and checkMesh passes on every one of these meshes. Halving the cell size at a fixed time step doubles the cell diffusion number, the viscous equivalent of the Courant number, and the pressure-velocity split used here is stable to about 3 of it and unstable at 6 and above. Four pressure correctors per step instead of two carries it to 11.5, which covers the finest mesh here, and costs about a fifth more per step.

With that fixed, three meshes at 2,880, 11,520 and 46,080 cells were run for each case, with the time step scaled down with the cell size so the Courant number is 0.255 on every level. The control behaves the way a textbook says it should: the torque error falls 0.158%, 0.041%, 0.011%, an observed order of 1.93, and extrapolating to zero cell size lands within 0.0004% of the exact answer. The sliding interface falls 0.782%, 0.427%, 0.221%, an order of 0.79. Twenty-one times the control's error on the finest mesh, and shrinking half as fast.

Then the part worth carrying to other cases. Refining those meshes moved two things at once, the cells and the time step, so a second experiment separated them. Holding the time step at 0.0025 s and multiplying the cells by four moved the torque error from 0.2174% to 0.2205%, which is to say it did not move it at all. Holding the mesh and halving the step moved it about in proportion. The sliding-interface error is first order in how far the rotor slides past the stator in one step, not in the size of the cells. For anyone converging a rotating-machinery case, that is the number to refine, and a mesh-convergence study that never says what the angular slide per step was has not converged anything.

## What it does not say

This is one rotation rate in one regime, and it is a verification case rather than a validation one: it establishes that the machinery does the arithmetic right, not that a turbulence model is appropriate for your rotor.

One check it does worse on is worth naming. The torque on the inner and outer cylinders must be equal and opposite exactly in this flow, and across the sliding interface the two disagree by 0.92%, against 0.011% on the control. That is a free consistency test, the interface is measurably worse at it, and it is a reason to read a single-wall torque taken across an interface with more care than a well-converged residual would suggest.

The session did not end cleanly: the model API returned a 400 and the run stopped while the agent was redrawing one of its figures. The case, the fields and the logs were already on the volume, and every number on this page was recomputed from them rather than read off the agent’s summary. Where that recomputation and the agent’s own analysis differ, they differ in the fifth significant figure.

![The same plot for the conformal control mesh: a smooth monotone error six times smaller with no scatter](https://tryreynolds.com/assets/ami-control-C4uHd_uY.png)

Figure 2 The control: the same annulus, same 12,000 cells, same solver, built as one continuous ring with no interface in it. The error is six times smaller and the scatter is gone. This is the plot that turns Figure 1 from a measurement into a result, because everything it does not share with this one is the interface's doing. (The dashed line and ring labels are inherited from the other case's plotting code; there is no interface here.)

![Close-up of the mesh at the sliding seam, cells on the two sides no longer aligned](https://tryreynolds.com/assets/ami-interface-COvBHd7w.png)

Figure 3 The seam at r = 30 mm, part-way through the run. The rotor has turned 2.2 revolutions, so no cell on the inner side shares an edge with the cell it faces. This is the non-conformal state every number on this page was measured in.

![The full annulus mesh, 50 cells radially by 240 azimuthally, split into two rings](https://tryreynolds.com/assets/ami-mesh-DUd_Y3LE.png)

Figure 4 The whole annulus: 50 radial × 240 azimuthal cells, cut into an inner ring that turns and an outer ring that does not.

![Three log-log panels of error against cell size: torque error, wall-torque imbalance, and velocity error, with the conformal control near the second-order guide and the sliding interface near the first-order one](https://tryreynolds.com/assets/ami-convergence-CuBFg1bS.png)

Figure 5 The grid study, run three days after the rest of this page. Error against cell size, both axes logarithmic, with the time step scaled down alongside the cells so the Courant number is 0.255 everywhere; the dotted and dashed guides are first and second order. Blue is the conformal control, which tracks the second-order guide on all three measures. Red is the same annulus with the sliding interface, which tracks the first-order one. Green is the sliding interface again with a second-order time scheme, which lowers the error without changing the picture, and is the clue that led to the finding: what this interface's error scales with is the time step, not the cell size.

## Reference

Taylor, G. I. (1923). Stability of a viscous liquid contained between two rotating cylinders. Philosophical Transactions of the Royal Society A, 223, 289–343. The steady circular-Couette profile and the torque on the inner cylinder are standard results; see e.g. Batchelor, An Introduction to Fluid Dynamics, §4.5.

## 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.
