Gyre/Verification
Verification
In one minuteEvery numerical claim in this documentation is backed by an executable study. The studies run as a pipeline, write machine-readable results with provenance, and the charts and tables on these pages are rendered from those files.
Verification asks whether the equations are solved correctly; validation asks whether they are the right equations. Gyre’s suite is mostly verification — exact properties and convergence rates that leave no room for interpretation — plus a small physical plausibility check.
39 of 39 studies passed
- Passed
operators1/1 checks · 0.29 s
39979fcf90Same code as this build - Passed
Free-stream preservation on curved meshes
free_stream1/1 checks · 18.67 s
39979fcf90Same code as this build - Passed
Entropy conservation and stability
entropy_conservation41/41 checks · 15.77 s
39979fcf90Same code as this build - Passed
Structure of the BR2 viscous operator
viscous_operator17/17 checks · 116.9 s
39979fcf90Same code as this build - Passed
Independent 1-D model of the BR2 formulation
diffusion_1d17/17 checks · 4.93 s
39979fcf90Same code as this build - Passed
Exact linearization by automatic differentiation
linearization40/40 checks · 198.1 s
39979fcf90Same code as this build - Passed
Differentiable mesh deformation
mesh_deformation9/9 checks · 2.45 s
39979fcf90Same code as this build - Passed
density_wave4/4 checks · 40.98 s
39979fcf90Same code as this build - Passed
isentropic_vortex10/10 checks · 65.18 s
39979fcf90Same code as this build - Passed
mms_euler6/6 checks · 212.5 s
39979fcf90Same code as this build - Passed
Manufactured solutions: Navier–Stokes
mms_navier_stokes14/14 checks · 1225 s
39979fcf90Same code as this build - Passed
Nonlinear and linear solver convergence
solver_convergence16/16 checks · 890.1 s
39979fcf90Same code as this build - Passed
Line-implicit smoothing on a wall-resolved mesh
line_smoother7/7 checks · 2160 s
39979fcf90Same code as this build - Passed
Line-implicit smoothing in three dimensions
line_smoother_3d6/6 checks · 620.4 s
39979fcf90Same code as this build - Passed
Single-precision blocks in the preconditioner
mixed_precision6/6 checks · 2649 s
39979fcf90Same code as this build - Passed
Adjoint gradients versus finite differences
adjoint_gradients18/18 checks · 1176 s
39979fcf90Same code as this build - Passed
output_error5/5 checks · 367.7 s
39979fcf90Same code as this build - Passed
cylinder_re407/7 checks · 417.2 s
39979fcf90Same code as this build - Passed
extruded_3d8/8 checks · 300.8 s
39979fcf90Same code as this build - Passed
Inviscid flow past a sphere (3-D)
sphere_inviscid9/9 checks · 424.7 s
39979fcf90Same code as this build - Passed
Laminar flow past a sphere, Re = 100 (3-D)
sphere_re1005/5 checks · 187.8 s
39979fcf90Same code as this build - Passed
Adjoint derivatives of 3-D outputs
adjoint_3d6/6 checks · 297.7 s
39979fcf90Same code as this build - Passed
Largest 3-D solve on one device
scale_3d7/7 checks · 452 s
39979fcf90Same code as this build - Passed
Manufactured solutions: RANS with the Spalart-Allmaras model
rans_mms9/9 checks · 455.8 s
39979fcf90Same code as this build - Passed
Exact linearization with the Spalart-Allmaras model
rans_linearization20/20 checks · 158.6 s
39979fcf90Same code as this build - Passed
Turbulent flat plate (NASA TMR) with the Spalart-Allmaras model
rans_flat_plate8/8 checks · 162.1 s
39979fcf90Same code as this build - Passed
Three-dimensional consistency with the Spalart-Allmaras model
rans_extruded_3d10/10 checks · 675.1 s
39979fcf90Same code as this build - Passed
Adjoint gradients with the Spalart-Allmaras model
rans_adjoint6/6 checks · 119 s
39979fcf90Same code as this build - Passed
Discipline contract for MDO integration
discipline_contract15/15 checks · 249.9 s
39979fcf90Same code as this build - Passed
imported_mesh29/29 checks · 184.5 s
39979fcf90Same code as this build - Passed
order_selection13/13 checks · 364.4 s
39979fcf90Same code as this build - Passed
example_airfoil4/4 checks · 104.5 s
39979fcf90Same code as this build - Passed
Example: laminar cylinder, Re = 40
example_cylinder4/4 checks · 51.5 s
39979fcf90Same code as this build - Passed
Example: turbulent flat plate (Spalart-Allmaras)
example_flat_plate5/5 checks · 119.9 s
39979fcf90Same code as this build - Passed
Example: lift polar with adjoint slopes
example_polar5/5 checks · 686.1 s
39979fcf90Same code as this build - Passed
Example: coupled aero-structural adjoint
example_coupling2/2 checks · 823 s
39979fcf90Same code as this build - Passed
Example: transonic aerofoil with shock capturing
example_transonic9/9 checks · 151.8 s
39979fcf90Same code as this build - Passed
performance_cpu2/2 checks · 123.8 s
39979fcf90Same code as this build - Passed
Kernel throughput (NVIDIA GeForce RTX 3060 Ti)
performance_gpu2/2 checks · 103.5 s
39979fcf90Same code as this build
Each study produces checks (a measured value, the expectation, pass or fail), tables and charts, and a provenance stamp: the source revision, the compute device and the time of the run. A page built from a different revision than the one deployed says so in its stamp. Nothing on these pages is typed in by hand.
| Layer | Question | Studies |
|---|---|---|
| Discrete invariants | Do exact algebraic properties hold to round-off? | operators, free_stream, entropy_conservation, viscous_operator |
| Order of accuracy | Does the error fall at the designed rate? | density_wave, isentropic_vortex, mms_euler, mms_navier_stokes, diffusion_1d |
| Derivatives | Are linearisations and gradients exact? | linearization, adjoint_gradients, mesh_deformation |
| Solvers | Do the iterations converge as theory predicts, and does the answer stay the same when the preconditioner changes? | solver_convergence, line_smoother, line_smoother_3d |
| Output error | Is the error estimate trustworthy? | output_error |
| Order selection | Does the estimate select the lowest sufficient degree, and say so when none suffices? | order_selection |
| Three-dimensional flows | Does a genuinely 3-D flow on an unstructured hexahedral mesh come out right, with its derivatives? | sphere_inviscid, sphere_re100, adjoint_3d, scale_3d, extruded_3d |
| Turbulence closure | Is the RANS model discretized at design order, linearised exactly and implemented as published? | rans_mms, rans_linearization, rans_flat_plate, rans_adjoint |
| Discipline contract | Are the operations an MDO framework calls consistent with each other? | discipline_contract |
| Imported meshes | Does a mesh from a file behave exactly like a generated one? | imported_mesh |
| Physical validation | Does a canonical flow come out right? | cylinder_re40 |
| Testing strategy | What guards every commit? | unit, integration, end-to-end tests |
gyre verify --suite quick -o var/verification # all studies
gyre verify --only isentropic_vortex,mms_euler # a subset
gyre docs build # re-render these pages from the new results
The quick suite is not short: its last complete run on the development host (39 studies in
three parallel lanes, CPU plus an RTX 3060 Ti) took 104 minutes, and the studies’ own wall
times, shown on each study card, add up to 273 minutes. A subset such as
--only free_stream,entropy_conservation takes about a minute. --suite full adds finer meshes and higher degrees. Each study runs in its own process on the
device suited to its size; results land in var/verification/<study>.json. The timing studies
run last, one at a time, and the GPU timing study is skipped on a host without a GPU.
index.json lists every result file in the directory, not only those of the last invocation.
Each entry carries the level, commit, device and timestamp of the run that produced it, and
stale: true if that was an earlier invocation. requested, skipped and summary describe
the last invocation. gyre verify ends with the line P/R studies of this invocation passed
and exits with status 1 only when a study of this invocation failed; failing results that an
earlier invocation left in the directory are named separately
(; stale failing results not re-run: ...) and do not change the exit status.
On these pages a status block or study card of a result that the last invocation did not
re-run carries the marker “Earlier run”; its tooltip names the commit and time of the run that
produced the result. Such a block shows the checks, thresholds, tables and notes of that run.
The text of a page describes the studies as they are in the code now, so the two can differ
until the study is run again with gyre verify --only <id>.
Order checks have one of three kinds of threshold, and each names its basis in its expected
text:
- the design rate, for example “observed order at least ”, where that rate is established;
- the guaranteed rate, “at least ” with a tolerance, where only consistency is guaranteed;
- an empirical regression floor between the two, where a rate above was measured but not derived: for the manufactured Euler solution on coarse curved meshes and for the velocity in the diffusion-dominated Navier–Stokes regimes. A floor of this kind guards against regressions; it is not a property of the scheme.
Bounds on timing ratios and on the ratio of actual to estimated error in the order-selection
study are regression bounds of the same kind and say so. When a study fails, its badge on these pages turns red
and lists the failing checks, the CI pipeline stops before deployment, and the study’s log is
kept under var/verification/logs/. Failures during development were instructive:
- The vortex study at measured order 4.05 against an expectation of at least 4.4. The first explanation — time-integration error — was tested by shrinking the time step five-fold and was refuted: the error did not change. The expectation was wrong, not the measurement; the study now checks the guaranteed rate, reports the observed one, and keeps the time-step test as a permanent check.
- The mesh-deformation derivative check compared against a finite difference of the whole domain area, a badly conditioned reference; it now uses a weighted area concentrated near the surface.
- A finite-difference step sweep started with a step of 0.1 rad, which pushed the flow into a regime with shocks; the failed solve then contaminated every later point. Perturbed solves now restart from the baseline state and must converge.
- The output-error study included a mesh so coarse that the bump was sampled at a single node; its “errors” were those of a different geometry.
In each case the suite did its job: it made a wrong assumption visible.
- Prefer exact properties over convergence rates. Round-off-level identities (conservation, entropy conservation, symmetry, dot-product tests) cannot be passed by accident.
- Test the negative. Fluxes that should not conserve entropy are checked to violate the condition; otherwise a broken test would pass everything.
- Independent references. Derivatives are compared against finite differences and against the other differentiation mode; the error estimator is compared against an actually converged finer solution; block preconditioners against a dense Jacobian.
- Manufactured forcing from the solver’s own physics. Source terms are generated by automatic differentiation of the flux kernels, eliminating transcription errors.
- Separate regimes. Where behaviour differs by regime (diffusion- versus convection-dominated), the study reports them separately instead of averaging them away.
Pages in this section#
- Discrete invariantsL2Summation by parts, free-stream preservation, conservation and entropy conservation are algebraic identities of the scheme. They hold to round-off, in two and three dimensions, on curved meshes.
- Order of accuracyL2Convergence studies with exact solutions. The design rate p + 1 is required where it is established (the advected density wave, steady manufactured solutions on Cartesian meshes, heat conduction, convection-dominated flow); elsewhere the guaranteed rate p is required and the observed rate is reported.
- Linearisation and gradientsL2Jacobian products, preconditioner blocks, adjoint and direct total derivatives are verified against finite differences, against each other and against dense reference Jacobians. Agreement with finite differences is limited by finite-difference accuracy; adjoint and direct mode agree to the tolerance of their linear solves.
- Solver convergenceL2The pseudo-transient Newton–Krylov solver reduces the residual by ten orders from a free stream; its terminal convergence is linear at the forcing rate of the inexact Newton iteration, and p-multigrid preconditioning cuts the Krylov iteration count compared with block Jacobi alone. What those iterations cost is measured and reported without a threshold: operator applications counted from the cycle, and the wall time of each solve repeated with compiled kernels.
- Three-dimensional flowsL2Flow past a sphere on an unstructured cubed-sphere mesh of curved hexahedra tests the 3-D path on a genuinely three-dimensional flow, inviscid against exact properties and laminar against accepted data, with adjoint derivatives of all six force and moment coefficients; a spanwise extrusion of the aerofoil case must reproduce the two-dimensional solution.
- Turbulence closureL2The Spalart–Allmaras RANS closure is verified in four steps: a manufactured solution for the order of accuracy of the coupled system, exactness of its linearisation including the wall distance, the turbulent flat plate of the NASA Turbulence Modeling Resource for the model itself, and adjoint derivatives against finite differences.
- Discipline contractL2The interface a multidisciplinary framework integrates against is itself verified. Forward and reverse products are exact transposes, the linear solves invert them, the products agree with finite differences at the solution and at a point the framework names, a stalled linear solve is never silent, and the OpenMDAO implicit component passes OpenMDAO's own derivative checks.
- Output error estimationL2The adjoint-weighted-residual estimate predicts the change of an output between polynomial degree p and p + 1 from a single linear solve. Its effectivity is measured against the actually converged p + 1 solution.
- Order selectionL2Output-driven order selection raises the polynomial degree until the estimated error of an output meets a tolerance. The study checks the selection rule itself, compares the estimate with solutions two degrees higher, and cross-checks every continued level against an independent solve.
- Imported meshesL2A mesh read from a Gmsh or NPZ file must behave exactly like a generated one. The study reads genuine Gmsh files, tests the node-ordering tables, the operator identities on unstructured curved meshes in 2-D and 3-D, and solves a flow with an adjoint derivative on an imported mesh.
- Physical validationL2A canonical viscous flow — the steady wake of a circular cylinder at Reynolds number 40 — is compared with the literature as a plausibility check on the physics, boundary conditions and force evaluation.