MEng coursework · UTIAS AER1324 · Fall 2024

A 1024³ turbulence simulation, queried instead of run. Ask it too coarsely and the small scales are not there.

The Johns Hopkins Turbulence Databases hold that simulation and answer questions about it. Nobody re-runs it and nobody downloads it: you send a list of points and it sends back the velocity, or the velocity gradient, at each one. The engineering moves entirely into the query. I asked it twice, once the coarse way and once properly, and used the second answer to look at the local structure of the small scales.

Asked for
velocity at 16³, gradients at 64³ on nine snapshots and on three
Received
36,864 and 786,304 samples grid cubed times the snapshots, less 128 the source marks invalid
Result
only one of them sees small scales

01

A simulation you query instead of running

The database

A direct numerical simulation resolves every scale of the flow down to the one where viscosity finally wins, which for turbulence means the cost climbs roughly as the Reynolds number to the eleventh over fourth. The 1024 cubed run was done once, in 2008, and 5,028 frames of it were stored. Since then it has been a database: nobody re-runs it, and anybody can ask it what the velocity was at a point.

That changes what the work is. There is no mesh to build, no solver to converge and no run to babysit; there is a question, a set of points, and a bill in network round trips. The engineering moves entirely into the query: which points, how many, which quantity, and which interpolation, because the database will interpolate for you and the choice of scheme is yours.

It also means the flow is not yours. Every physical parameter below is quoted from the dataset's own documentation, which ships with the project. What was measured here is what came back from the queries.

Forced isotropic turbulence, extended data set. Data provenance M. Wan, S. Chen, G. Eyink and C. Meneveau; database and web services E. Perlman, R. Burns, Y. Li and A. Szalay, Johns Hopkins University. The averages above are theirs, over the window both queries sit inside.

02

Two queries, and the distance between them

The sampling

Turbulence is a range of scales, and a query resolves only the part of that range its own sampling can reach.

    Query one: the velocity field

    getVelocity · isotropic1024coarse · Lag6 · 16 × 16 × 16 · t = 0.364 to 0.372

    Sixteen points across each side of the box, so the spacing is 2π/16. Nine snapshots came back, 4,096 points each. Everything in chapter 03 is built from these.

    Query two: the velocity gradient

    getVelocityGradient · FD4Lag4 · 64 × 64 × 64 · three snapshots

    Sixty-four points a side, and crucially it asks for the derivative rather than the field. The database differentiates at its own resolution with a fourth-order scheme and hands back nine numbers per point. Chapter 04 is built from these.

    Why that is not the same thing

    Differencing the first query would give a gradient at a separation of 137 Kolmogorov scales, which is not a gradient, it is a large-scale difference. Asking the database to differentiate moves the differencing to where the flow is resolved. Same server, same field, and only one of the two can see a velocity gradient at all.

    03

    What the velocity query can see

    One point, and two

    Start with one point at a time. Collect every velocity component from every snapshot, subtract the mean, divide by the standard deviation, and count how often each value occurs. For a quantity built out of an enormous number of independent influences the central limit theorem says the answer should be a Gaussian, and for the velocity itself that is very nearly what it is.

    That is a useful negative result. The velocity is the large-scale quantity: it is set by the biggest eddies, there are many of them, they are roughly independent, and the sum of many independent things is Gaussian. Nothing about turbulence's famous strangeness lives here.

    It lives in differences. Take the velocity at two points a distance r apart along the line joining them, subtract, and you have an increment. At large r the two points know nothing about each other, so the increment is the difference of two independent Gaussians and is itself Gaussian. As r shrinks the two points start to share structure, and the distribution grows tails: rare, violent differences far more often than a Gaussian would allow. That is intermittency, and it is the single most important way turbulence is not what a first course suggests.

    04

    What the gradient query can see

    The invariants

    The second query asks for the whole velocity gradient tensor: nine numbers at each of 262,144 points, three times over. A three by three matrix has three invariants, quantities that do not change when you rotate the coordinate system, and for incompressible flow the first is exactly zero. The other two are the ones with names.

    Narration

    01 Two numbers out of nine

    The gradient at a point is nine numbers, and nine numbers are not a picture. Two of the three invariants survive incompressible flow, and every sample the query returned becomes one point in the plane they span. Q is the second invariant: the balance between rotation and stretching. Above the horizontal axis the fluid is spinning faster than it is being pulled apart, which is as near a definition of a vortex as the subject has, and is exactly what a Q-criterion iso-surface draws. R is the third, the determinant with a sign, and the sign is the content: to the right a fluid element is being squashed into a sheet, to the left drawn out into a tube.

    Q = ½ ( ΩijΩij − SijSij )

    02 The shape it makes

    Now every sample, binned ninety by ninety. If the small scales had no preferred way of deforming this would be a blob centred on the origin. It is not round and it is not symmetric: it is a teardrop, pointing down and to the right, and it is one of the most reproduced results in the subject. The dashed curve is where the discriminant of the tensor's characteristic equation vanishes, 27R² + 4Q³ = 0. Above it one eigenvalue is real and two are complex, so the local motion is a rotation; below it all three are real and the motion is pure strain. The density does not merely cross that curve, it lies along its lower-right branch, and that alignment is the fingerprint.

    03 What the two lobes are

    The heavy lobe is strain with R positive: a fluid element being stretched into a sheet by axisymmetric strain. It is the most common thing happening at the small scales, and it happens often enough to bend the whole distribution around a line that has nothing to do with this flow and everything to do with the algebra of three by three matrices. The other diagonal is rotation with the strain acting along the vortex's own axis. That is vortex stretching, the mechanism the energy cascade is usually explained by, and here it is a counted fraction of the samples rather than a story.

    05

    How many samples before a number means anything

    Convergence

    The coursework asked this directly, and its own record is on disk: the same statistics computed over ten sampling regions and then over fifty. The interesting part is which quantities settle and which do not.

    Narration

    01 The mean

    The first moment, region by region. If the regions were independent samples of the same thing, five times as many would shrink the spread by about the square root of five, which is 2.24. It goes to of what it was instead, which is the wrong direction: the fifty-region pass reaches into parts of the field the ten did not, so it is not a finer sample of the same population, it is a wider one. The mean itself barely moves, because a first moment is cheap.

    02 The skewness

    The third moment spreads furthest, to of what it was. Skewness here is a quantity near zero, so a small absolute change in it is a large relative one.

    03 The kurtosis

    The fourth moment spreads least, , and that is not convergence. Higher moments are dominated by rare values, and a small sample has almost none of them, so neither pass has enough of the tail for the spread between them to mean much.

    2024 From turbulence_statistics_fully_corrected.mat, as the coursework computed them. Five times the regions does not make the spread five times smaller, and for the higher moments it barely moves it, which is the whole lesson: a mean converges quickly, a skewness slowly, and a kurtosis is asking about the rare events that a small sample has almost none of.

    06

    What the project drew

    The originals

    Forty-three numbered figures came out of the analysis, and everything here that could be redrawn from the query results has been. These three could not. Two are three-dimensional iso-surfaces through a block of the field, which no plot built from a flattened sample can reproduce, and the third is a spectrum computed over wavenumbers the two queries above never asked the database for.

    07

    What was opened, and what was not

    Provenance

    Most of the project directory is rendered video, not data. What was read:

    There is no raw DNS field in this project and there never was. The database is not something you download: it is queried, and what comes back is what you asked for. The two query results total under two megabytes for the velocity and about twenty-four for the gradients, and everything computed here comes out of those.

    The eight gigabytes are rendered animations, produced by the project itself from the query results. None of them was decoded. The stills in chapter 06 are the project's own PNG exports, which sit beside them.

    • JHUDataset documentation, which ships with the project.
    • 2024What the coursework's own scripts computed and recorded.
    • newComputed here from the retrieved samples: the scale ladder, both densities and the invariant plane.

    What it shows

    Coursework on a public database, and the methods are all standard. What it carries is the thing that is specific to working this way: the answer you get is bounded by the query you wrote, and the boundary is not obvious from the data that comes back. Both queries here returned clean, plausible, well-formed numbers. Only one of them could see a velocity gradient, and the difference is not in the flow or the database, it is in which quantity was asked for.

    The check that both landed correctly is worth as much as either result. The velocity samples reproduce the dataset's own documented root mean square to within half a percent, and the mean of Q over 786,304 gradient samples comes out at a thousandth of its own standard deviation, which is the zero that incompressibility requires and which nothing in the pipeline imposes.

    What I would do differently

    Write the scale ladder before writing the query. Everything here that did not work was decided at the moment the velocity grid was set to sixteen points a side, and nothing about the returned data announces it: the samples are clean and the statistics converge to sensible values. It took working out where 2π/16 sits against the Taylor microscale to see that a whole class of question had been closed off before the first request was sent.

    A public DNS database, queried. No simulation was run and no raw field was ingested. Sixteen cubed is a small sample.