Turbulent plane channel
Not yet written up. The set-up and the published reference are recorded; our own results are not. Nothing in this page may be cited until the comparison table is complete.
Case: (to be filled from run) Reference: Moser R.D., Kim J., Mansour N.N., “Direct numerical simulation of turbulent channel flow up to Re_τ = 590”, Physics of Fluids 11(4) (1999) 943–945.
Also: Kim J., Moin P., Moser R., “Turbulence statistics in fully developed channel flow at low Reynolds number”, Journal of Fluid Mechanics 177 (1987) 133–166 — the Re_τ = 180 predecessor, and the source usually cited for that case’s bulk and centreline Reynolds numbers.
Last run: (to be filled from run)
Fully developed turbulent flow between two parallel plates, driven along the channel by a pressure gradient. It is the simplest wall-bounded turbulent flow there is: statistically one-dimensional, with no pressure gradient along the wall, no curvature, no separation and nothing else going on. That is exactly why it is the reference case — every disagreement is attributable to the near-wall treatment, because there is nothing else it could be.
Moser, Kim and Mansour resolved it directly, with no turbulence model at all, and published the profiles. A DNS is not a measurement, but for this flow it is better than one: it gives every statistic at every height, including the quantities that are extremely hard to measure inside the viscous sublayer.
What this tests, and why it matters
Section titled “What this tests, and why it matters”This is the wall-function benchmark, and wall functions are the single largest source of quiet error in commercial CFD.
- Wall functions. Every turbulent case the product runs with the default wall treatment is standing on a modelled velocity profile between the wall and the first cell centre. Nothing validated so far touches it. The cavity has no turbulence model; the step’s laminar cases have none; the cylinder at Re = 100 has none. This page is the only one that puts a number on it.
- Near-wall mesh sensitivity, quantified. The correct answer here is known at every y+, so the effect of putting the first cell in the wrong place can be measured rather than warned about. That turns “keep y+ in range” from advice into a figure.
- The turbulence models themselves. k-ε, k-ω SST and Spalart–Allmaras all claim to reproduce the log layer. Here they can be held to it, one at a time, on the same mesh.
- The y+ result control. The application reports y+ per wall patch. This is the case where what it reports can be checked against what the profile actually is.
- Cyclic boundaries and a driving momentum source, which no other benchmark in this section exercises at all.
The cavity, the step and the cylinder are all laminar where it matters. Between them they say nothing whatsoever about turbulence modelling. This one does nothing else.
In SHD Sim CFD
Section titled “In SHD Sim CFD”Derived from docs/solver-map.md and analysis types and solvers.
| Analysis type | Incompressible |
| Time dependency | Steady-state for the RANS comparison |
| Algorithm | SIMPLE |
| Solver | simpleFoam |
| Turbulence model | One per run: k-epsilon, k-omega SST, Spalart-Allmaras |
| Wall treatment | Wall functions is the point of the exercise. Resolved (low-Re) is the second run, on a different mesh |
| Mesher | blockMesh only (no body) — the channel is the background block |
| Boundary faces | Split block faces on, so each of xMin … zMax takes its own condition |
| Driving force | Advanced → Momentum sources → Mean velocity force, which writes meanVelocityForce with the target Ubar |
| Result controls | y+, and a sampled line across the channel |
| Known blockers | None. simpleFoam carries no blocker in solverPrerequisites |
This is the only benchmark in this section that needs no geometry at all. A plane channel is a box, and the box is the domain.
Two product details worth recording before the run, not after:
- The application writes the mean velocity force with
selectionMode cellZone, so the source needs a cell zone to act on, cut bytopoSet. Record how that zone was created: (to be filled from run). If there turns out to be no route in the application to a zone covering the whole domain, that is a product gap and belongs in docs/known-gaps.md rather than being worked around by hand here. - Streamwise and spanwise faces are Periodic, which the application maps to
cyclic. A cyclic pair needs matching meshes on both faces; a uniform block satisfies that trivially, which is another reason to use the block rather than anything snapped.
Published reference values
Section titled “Published reference values”The three DNS cases
Section titled “The three DNS cases”Moser, Kim & Mansour (1999) computed three, at friction Reynolds numbers
Re_τ = u_τ δ / ν, with δ the channel half-height and u_τ = √(τ_w/ρ):
| Case | Actual Re_τ | Bulk Reynolds number | Notes |
|---|---|---|---|
| 180 | (read from the chan180 data header) |
Re_b ≈ 5600, on the bulk velocity and the full channel height 2δ; Re_c ≈ 3300 on the centreline velocity and δ — Kim, Moin & Moser (1987) | The original case. Too low for a proper log region |
| 395 | 392.24 — from the data file header, see below | (read from Moser, Kim & Mansour 1999, Table I) | The usual choice for a wall-function check |
| 590 | (read from the chan590 data header) |
(read from Moser, Kim & Mansour 1999, Table I) | The highest of the three |
“395” is the case name, not the Reynolds number. The distributed data header for that case states
Re_tau = 392.24, and every y+ and u+ in it is normalised on that. Driving a run to Re_τ = 395 and comparing it against this data is a 0.7% mismatch introduced before the solver has done anything. Small, but it is the kind of error that gets attributed to the turbulence model. The same caution applies to the other two cases — read the actual value out of each header rather than assuming the case name.
Confirm the bulk Reynolds numbers and the box dimensions against the paper when transcribing. The Re_τ values are settled by the data headers; the derived Reynolds numbers are not, and they must come off the page rather than out of anybody’s memory.
The chan395 case is the row to run first, and not only because it is the
usual compromise: it is the only one of the three whose data is already in this
repository (see below). At Re_τ = 180 there is barely a logarithmic region for
a wall function to sit in — Moser et al. say as much — so a wall-function run
there is being asked to model something the reference flow does not really
have. Re_τ = 590 is the cleanest but its data would have to be fetched.
The law of the wall
Section titled “The law of the wall”The two limits the profile has to reproduce, and which need no transcription because they are definitions and textbook constants rather than measurements:
| Region | Relation |
|---|---|
| Viscous sublayer, y+ ≲ 5 | u+ = y+ |
| Logarithmic layer | u+ = (1/κ) ln y+ + B, with κ ≈ 0.41 and B ≈ 5.2 |
κ and B are quoted differently by different authors — κ between about 0.38 and 0.41, B between about 5.0 and 5.5 — and at these Reynolds numbers the log region is short enough that fitting it is genuinely ambiguous. Compare against the DNS profile, not against the log law. The log law is the sanity check; the DNS is the reference.
Where the data are — already in the tree
Section titled “Where the data are — already in the tree”The Re_τ = 392.24 dataset ships with the bundled OpenFOAM. No download and no mirror-hunting is needed. It is in the OpenFOAM v2606 distribution at:
tutorials/verificationAndValidation/turbulentInflow/ oneCellThickPlaneChannel/resources/dataset/ chan395.means y, y+, Umean, dUmean/dy, Wmean, dWmean/dy, Pmean chan395.reystress y, y+, R_uu, R_vv, R_ww, R_uv, R_uw, R_vw chan395.kbal turbulent kinetic energy budgetEach file carries its own provenance header, which is why this page can quote
it. The header states the authors, the reference — DNS of Turbulent Channel
Flow up to Re_tau=590, 1999, Physics of Fluids, vol 11, 943–945 — the
numerical method (Kim, Moin & Moser 1987), Re_tau = 392.24, and
crucially the normalisation: U_tau, h.
That normalisation is what makes the reference column below directly usable:
Umean in the file is u+ already, and the Reynolds stresses are already
divided by u_τ². Nothing needs rescaling. The one thing that does need care is
that y is normalised on the half-height h, so y = 1.0 is the centreline, not
the far wall.
Only the Re_τ ≈ 392 case is bundled. The 180 and 590 datasets would have to be obtained separately, and their headers read the same way before use.
This is why the reference column below is filled and the others are not. An authoritative copy of this data was in the repository; no equivalent in-tree copy exists for Armaly’s reattachment lengths or for cylinder drag coefficients, so those pages still carry
_(read from …)_.
Set-up
Section titled “Set-up”| Domain | Channel of half-height δ, periodic in the streamwise and spanwise directions. Box dimensions: (read from Moser, Kim & Mansour 1999) |
| Walls | yMin and yMax, no-slip |
| Streamwise faces | xMin / xMax, Periodic |
| Spanwise faces | zMin / zMax, Periodic |
| Driving | Mean velocity force, target Ubar chosen to give the required Re_τ |
| Fluid | (to be filled from run) |
| Mesh | (to be filled from run) — record the wall-normal distribution and the grading, not just the cell count |
| First cell centre y+ | (to be filled from run) — the single most important number on this page |
| Turbulence model | (to be filled from run) |
| Wall treatment | (to be filled from run) |
| Run control | (to be filled from run) |
Standard practice for the first cell, stated as practice rather than as a published result: wall functions want the first cell centre in the logarithmic region, conventionally 30 ≲ y+ ≲ 300; a resolved low-Re treatment wants y+ of order 1 with several cells inside y+ < 5. Part of the value of this benchmark is measuring what actually happens when neither holds.
Target Re_τ = 392.24, to match the bundled dataset exactly rather than the case’s name.
Achieved Re_τ: (to be filled from run). Compute it from the wall shear stress the run produces and check it against the target before comparing anything — a channel driven to the wrong Re_τ will disagree with the DNS for a reason that has nothing to do with the wall treatment. Since u_τ sets both axes of the comparison, an error here rotates the entire profile rather than shifting one point of it.
Result — mean velocity profile
Section titled “Result — mean velocity profile”u+ against y+, from the wall to the centreline, at Re_τ = 392.24.
The reference column is transcribed from chan395.means, at that file’s own
grid points. The stations are the DNS’s grid, not round numbers. No
interpolation has been done and none should be: sampling our run at the DNS
stations is exact, whereas interpolating the DNS onto convenient stations
introduces an error into the reference column, which is the one column that
must not have one.
| y+ (DNS grid) | Moser, Kim & Mansour (1999) u+ | SHD Sim CFD u+ | difference |
|---|---|---|---|
| 1.0628 | 1.0605 | (to be filled from run) | (to be filled from run) |
| 4.9810 | 4.8032 | (to be filled from run) | (to be filled from run) |
| 9.5307 | 8.1754 | (to be filled from run) | (to be filled from run) |
| 19.7970 | 11.9660 | (to be filled from run) | (to be filled from run) |
| 29.8580 | 13.4790 | (to be filled from run) | (to be filled from run) |
| 50.9580 | 14.9020 | (to be filled from run) | (to be filled from run) |
| 98.4000 | 16.4930 | (to be filled from run) | (to be filled from run) |
| 198.9100 | 18.5350 | (to be filled from run) | (to be filled from run) |
| 392.2400 (centreline) | 20.1330 | (to be filled from run) | (to be filled from run) |
Nine of the file’s 129 wall-to-centreline points, chosen to span the sublayer, the buffer layer, the log region and the wake. The full profile is in the file if a denser comparison is wanted.
Two free checks on the transcription itself, both of which the numbers above pass: the first point sits in the viscous sublayer where u+ = y+ should hold, and 1.0605 against 1.0628 agrees to 0.2%; and the wall row of the file is exactly (0, 0), as no-slip requires.
RMS difference in u+ (to be filled from run). Worst point (to be filled from run).
The demanding part of this table is the buffer layer, y+ between about 5 and 30, where neither limit applies and the wall function is doing all the work. A model can look right in the sublayer and right in the log layer and still be wrong here, and getting it wrong shifts the whole outer profile.
Centreline u+, which accumulates every error below it and is therefore the single most informative row: (to be filled from run).
Result — turbulence quantities
Section titled “Result — turbulence quantities”From chan395.reystress, at Re_τ = 392.24, already normalised on u_τ².
| Quantity | y+ of peak | Moser, Kim & Mansour (1999) | SHD Sim CFD | difference |
|---|---|---|---|---|
| Peak u′+ (streamwise r.m.s.) | 14.209 | 2.7389 | (to be filled from run) | (to be filled from run) |
| Peak turbulent kinetic energy k+ | 16.890 | 4.5684 | (to be filled from run) | (to be filled from run) |
| Peak −u′v′+ (Reynolds shear stress) | 41.882 | 0.8370 | (to be filled from run) | (to be filled from run) |
How those three were obtained, so they can be checked. The file tabulates the stress tensor components directly, and each row above is the maximum over its 129 wall-to-centreline points:
- u′+ is √R_uu. The peak row has R_uu = 7.5016, so u′+ = √7.5016 = 2.7389.
- k+ is ½(R_uu + R_vv + R_ww), evaluated row by row and maximised.
- −u′v′+ is −R_uv, which is positive in the lower half of the channel.
The square root and the sum are arithmetic on tabulated published values, not estimates. Note that the three peaks are at three different heights, which is itself worth reporting: an eddy-viscosity model has no mechanism to place them independently.
A caution that belongs in the write-up, not in a footnote. A two-equation RANS model does not have separate normal stresses — its eddy-viscosity closure gives an isotropic prediction, and comparing u′, v′ and w′ individually against DNS is comparing against something the model never claimed. Compare k, and compare the shear stress. Reporting a large disagreement in the normal-stress anisotropy as a defect would be misrepresenting the model.
Result — wall-treatment sensitivity
Section titled “Result — wall-treatment sensitivity”The measurement this benchmark exists for: the same physics, the same model, different first-cell placement.
| First cell y+ | Wall treatment | Model | Centreline u+ | Error against DNS |
|---|---|---|---|---|
| (to be filled from run) | Wall functions | (to be filled from run) | (to be filled from run) | (to be filled from run) |
| (to be filled from run) | Wall functions | (to be filled from run) | (to be filled from run) | (to be filled from run) |
| (to be filled from run) | Resolved (low-Re) | (to be filled from run) | (to be filled from run) | (to be filled from run) |
| (to be filled from run) | Automatic blending | (to be filled from run) | (to be filled from run) | (to be filled from run) |
A filled version of this table is worth more to a customer than the profile comparison above it, because it answers the question they will actually ask, which is “what does it cost me if my mesh is not perfect”.
What the remaining difference is
Section titled “What the remaining difference is”(to be filled from run)
Candidates, to be decided between by changing one at a time: the turbulence model; the first-cell y+; the wall-treatment setting; the wall-normal grading; whether the run actually reached the target Re_τ; and the streamwise and spanwise box lengths, which if too short constrain the largest structures. In this flow, an unexplained difference is a near-wall difference, because there is nothing else in the problem.
What this benchmark does not cover
Section titled “What this benchmark does not cover”- Separation. There is none, and there cannot be. A model that reproduces this profile perfectly can still predict separation badly — that is the backward-facing step’s job.
- Pressure gradients. The channel is fully developed with none along the wall. Adverse-pressure-gradient boundary layers, which are where eddy-viscosity models actually differ from each other, are untouched.
- Curvature, rotation, three-dimensional boundary layers.
- Transition. The flow is fully turbulent throughout. The transition models in the product are unexercised.
- LES and scale-resolving models, unless a transient run is added — the steady RANS comparison above says nothing about them.
- Meshing. This is a graded block.
snappyHexMesh, surface refinement and boundary-layer insertion are not involved, so nothing here validates the y+ that snappy’s layers actually achieve on a real body — which is the situation a customer is in. - High Reynolds number. Re_τ = 590 is low. Wall-function behaviour at industrial Reynolds numbers is an extrapolation from this page, not a result on it.
Reproducing this from the application
Section titled “Reproducing this from the application”(to be filled from run) — record the exact steps taken, from the application, with no hand-editing of case files.
Include: the block dimensions and grading; how the cell zone for the momentum
source was cut; the Ubar used and how it was chosen; how the profile was
sampled across the channel; and how u_τ was obtained from the run in order to
normalise. The normalisation is where this comparison is most easily got wrong:
u+ and y+ both depend on u_τ, so a wrong wall shear stress moves every point on
the curve in a way that can look like a modelling error.
Defects this found
Section titled “Defects this found”(to be filled from run)