---
title: Capabilities and limits
summary: What Gyre does, how well each part is verified, and what it does not do yet. Read this before planning work on top of it.
section: overview
order: 3
level: 1
keywords: [scope, limitations, roadmap, verified]
---
<!-- gyre docs: expanded Markdown of overview/capabilities-and-limits.md (generated tables, verification numbers and chart data are written out). Base level of this page: L1 Essentials; passages at another level are bracketed by 'begin level N' / 'end level N' comments and start with [LN Name]. Built from revision ceb1f4b0be. -->

A foundation is only useful if its edges are known. This page separates what is implemented
and verified from what is implemented but lightly exercised and what is absent.

## Implemented and verified

| Capability | Evidence |
|---|---|
| Split-form DGSEM, 2-D and 3-D, curved elements | [discrete invariants](../verification/discrete-invariants.md): SBP, free-stream preservation, conservation, entropy conservation to round-off |
| Design-order accuracy (Euler) | [order of accuracy](../verification/order-of-accuracy.md): density wave, isentropic vortex, manufactured solution |
| Transonic flow with differentiable shock capturing | [transonic example](../examples/transonic.md): converged to round-off, adjoint versus finite differences |
| 3-D flow solves on unstructured hexahedral meshes, with all six force and moment coefficients, sideslip and their adjoint derivatives | [three-dimensional flows](../verification/three-dimensional.md): inviscid sphere against exact properties (no drag, no entropy rise, Janzen–Rayleigh surface pressure) through all eight face orientations, laminar sphere at $Re = 100$ against accepted drag and wake length, adjoint versus finite differences on an ellipsoid at incidence and sideslip, an extruded case that reproduces the 2-D solution |
| Force, moment and heat-flux coefficients of selected walls and per named component, each with its adjoint and error estimate | unit tests: the coefficients of components that partition the walls add up to the total; a component's derivative equals that of a case restricted to the same walls, which is compared with finite differences of re-converged flows |
| Laminar Navier–Stokes with BR2 | symmetric, compact operator; manufactured solutions by regime; cylinder at $Re = 40$ |
| RANS with the negative Spalart–Allmaras model, wall distance included in shape derivatives | [turbulence closure](../verification/turbulence.md): manufactured solution of the coupled system, exact linearisation on both branches of the model, flat-plate skin friction against the NASA Turbulence Modeling Resource, adjoint versus finite differences |
| Entropy-stable interface fluxes (`es_roe`, `llf`) | [fluxes](../theory/two-point-fluxes.md): no entropy production for any of the random state pairs tested, where the classical Roe flux produces some; unit tests of the inequality, of the Roe limit and of a stationary contact |
| Newton–Krylov with p-multigrid | [solvers](../verification/solvers.md): residual reduction of ten orders, terminal contraction per step at the forcing rate of the inexact Newton iteration, Krylov iteration count versus block Jacobi; line smoothing against block Jacobi on a wall-resolved turbulent plate and on a sphere in three dimensions (same drag and adjoint derivatives, fewer than half the Krylov iterations in tight linear solves) |
| Exact linearisation (JVP, VJP, blocks) | [derivatives](../verification/derivatives.md) |
| Adjoint and direct total derivatives: flow parameters and shape | adjoint versus finite differences versus direct |
| Coupling products: loads, displacements, forward/reverse totals | coupled aero-structural adjoint test; OpenMDAO adapter test |
| Residual-level discipline contract (apply, linearise and solve about the caller's own point; checkpoints; a stalled linear solve is an error) | [discipline contract](../verification/discipline-contract.md): transposes to round-off, inverses to the tolerance, finite differences, OpenMDAO's own derivative checks of the implicit component |
| Output error estimation | [output error](../verification/output-error.md): effectivity against the converged $p+1$ solution |
| External meshes: curved quadrilaterals and hexahedra from Gmsh or NPZ files | [imported meshes](../verification/imported-meshes.md): node ordering against genuine Gmsh files, free stream, conservation and neighbour coupling on unstructured meshes, a solve and an adjoint derivative on an imported mesh |
| Output-driven order selection | [order selection](../verification/order-selection.md): the lowest degree whose estimated output error meets the tolerance is selected; an unreachable tolerance is reported as not met |
| Service, sessions, MCP, pipelines | end-to-end tests with real worker processes |

**39 of 39 verification studies passed.** This site was built from revision `ceb1f4b0bed41de53e586df10858079f5a2bcdd8`.

| Study | Id | Result | Checks | Wall time (s) | Commit | Date | Device | Suite | Revision vs build |
|---|---|---|---|---|---|---|---|---|---|
| [Summation-by-parts operators](../verification/discrete-invariants.md) | `operators` | PASSED | 1/1 | 0.29 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:22:15-0500 | cpu | quick | Same code as this build |
| [Free-stream preservation on curved meshes](../verification/discrete-invariants.md) | `free_stream` | PASSED | 1/1 | 18.67 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:22:33-0500 | cpu | quick | Same code as this build |
| [Entropy conservation and stability](../verification/discrete-invariants.md) | `entropy_conservation` | PASSED | 41/41 | 15.77 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:22:32-0500 | cpu | quick | Same code as this build |
| [Structure of the BR2 viscous operator](../verification/discrete-invariants.md) | `viscous_operator` | PASSED | 17/17 | 116.91 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:24:33-0500 | cpu | quick | Same code as this build |
| [Independent 1-D model of the BR2 formulation](../verification/order-of-accuracy.md) | `diffusion_1d` | PASSED | 17/17 | 4.93 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:22:38-0500 | cpu | quick | Same code as this build |
| [Exact linearization by automatic differentiation](../verification/derivatives.md) | `linearization` | PASSED | 40/40 | 198.07 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:27:54-0500 | cpu | quick | Same code as this build |
| [Differentiable mesh deformation](../verification/derivatives.md) | `mesh_deformation` | PASSED | 9/9 | 2.45 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:22:42-0500 | cpu | quick | Same code as this build |
| [Advected density wave](../verification/order-of-accuracy.md) | `density_wave` | PASSED | 4/4 | 40.98 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:22:56-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Isentropic vortex convection](../verification/order-of-accuracy.md) | `isentropic_vortex` | PASSED | 10/10 | 65.18 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:24:02-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Manufactured solution: Euler](../verification/order-of-accuracy.md) | `mms_euler` | PASSED | 6/6 | 212.49 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:27:38-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Manufactured solutions: Navier–Stokes](../verification/order-of-accuracy.md) | `mms_navier_stokes` | PASSED | 14/14 | 1225.27 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:48:07-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Nonlinear and linear solver convergence](../verification/solvers.md) | `solver_convergence` | PASSED | 16/16 | 890.13 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:42:49-0500 | cpu | quick | Same code as this build |
| [Line-implicit smoothing on a wall-resolved mesh](../verification/solvers.md) | `line_smoother` | PASSED | 7/7 | 2159.53 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:58:43-0500 | cpu | quick | Same code as this build |
| [Line-implicit smoothing in three dimensions](../verification/solvers.md) | `line_smoother_3d` | PASSED | 6/6 | 620.35 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T10:58:47-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Single-precision blocks in the preconditioner](../verification/solvers.md) | `mixed_precision` | PASSED | 6/6 | 2648.96 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:27:02-0500 | cpu | quick | Same code as this build |
| [Adjoint gradients versus finite differences](../verification/derivatives.md) | `adjoint_gradients` | PASSED | 18/18 | 1176.07 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:18:25-0500 | cpu | quick | Same code as this build |
| [Output error estimation](../verification/output-error.md) | `output_error` | PASSED | 5/5 | 367.66 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:33:17-0500 | cpu | quick | Same code as this build |
| [Laminar cylinder at Re = 40](../verification/validation.md) | `cylinder_re40` | PASSED | 7/7 | 417.19 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:25:40-0500 | cpu | quick | Same code as this build |
| [Three-dimensional consistency](../verification/three-dimensional.md) | `extruded_3d` | PASSED | 8/8 | 300.8 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:03:54-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Inviscid flow past a sphere (3-D)](../verification/three-dimensional.md) | `sphere_inviscid` | PASSED | 9/9 | 424.67 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:11:04-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Laminar flow past a sphere, Re = 100 (3-D)](../verification/three-dimensional.md) | `sphere_re100` | PASSED | 5/5 | 187.76 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:14:26-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Adjoint derivatives of 3-D outputs](../verification/three-dimensional.md) | `adjoint_3d` | PASSED | 6/6 | 297.74 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:38:18-0500 | cpu | quick | Same code as this build |
| [Largest 3-D solve on one device](../verification/three-dimensional.md) | `scale_3d` | PASSED | 7/7 | 452.04 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:22:06-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Manufactured solutions: RANS with the Spalart-Allmaras model](../verification/turbulence.md) | `rans_mms` | PASSED | 9/9 | 455.83 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:33:19-0500 | cpu | quick | Same code as this build |
| [Exact linearization with the Spalart-Allmaras model](../verification/turbulence.md) | `rans_linearization` | PASSED | 20/20 | 158.63 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:40:59-0500 | cpu | quick | Same code as this build |
| [Turbulent flat plate (NASA TMR) with the Spalart-Allmaras model](../verification/turbulence.md) | `rans_flat_plate` | PASSED | 8/8 | 162.14 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:36:05-0500 | cpu | quick | Same code as this build |
| [Three-dimensional consistency with the Spalart-Allmaras model](../verification/turbulence.md) | `rans_extruded_3d` | PASSED | 10/10 | 675.08 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:33:26-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Adjoint gradients with the Spalart-Allmaras model](../verification/turbulence.md) | `rans_adjoint` | PASSED | 6/6 | 119 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:43:02-0500 | cpu | quick | Same code as this build |
| [Discipline contract for MDO integration](../verification/discipline-contract.md) | `discipline_contract` | PASSED | 15/15 | 249.94 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:40:21-0500 | cpu | quick | Same code as this build |
| [Imported meshes](../verification/imported-meshes.md) | `imported_mesh` | PASSED | 29/29 | 184.52 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:46:10-0500 | cpu | quick | Same code as this build |
| [Output-driven order selection](../verification/order-selection.md) | `order_selection` | PASSED | 13/13 | 364.44 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:46:30-0500 | cpu | quick | Same code as this build |
| [Example: inviscid NACA 0012](../examples/naca0012-euler.md) | `example_airfoil` | PASSED | 4/4 | 104.52 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:35:15-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Example: laminar cylinder, Re = 40](../examples/cylinder-re40.md) | `example_cylinder` | PASSED | 4/4 | 51.5 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:47:06-0500 | cpu | quick | Same code as this build |
| [Example: turbulent flat plate (Spalart-Allmaras)](../examples/turbulent-flat-plate.md) | `example_flat_plate` | PASSED | 5/5 | 119.87 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:48:33-0500 | cpu | quick | Same code as this build |
| [Example: lift polar with adjoint slopes](../examples/lift-polar.md) | `example_polar` | PASSED | 5/5 | 686.1 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:58:34-0500 | cpu | quick | Same code as this build |
| [Example: coupled aero-structural adjoint](../examples/aerostructural-coupling.md) | `example_coupling` | PASSED | 2/2 | 822.97 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T12:02:29-0500 | cpu | quick | Same code as this build |
| [Example: transonic aerofoil with shock capturing](../examples/transonic.md) | `example_transonic` | PASSED | 9/9 | 151.78 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T11:37:50-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |
| [Kernel throughput (cpu)](../engineering/performance.md) | `performance_cpu` | PASSED | 2/2 | 123.77 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T12:04:40-0500 | cpu | quick | Same code as this build |
| [Kernel throughput (NVIDIA GeForce RTX 3060 Ti)](../engineering/performance.md) | `performance_gpu` | PASSED | 2/2 | 103.55 | `39979fcf902ad6116eb550b881b4278d4599c8e2` | 2026-11-12T12:06:32-0500 | gpu · NVIDIA GeForce RTX 3060 Ti | quick | Same code as this build |

Records (JSON): `../data/verification/<id>.json`, index [index.json](../data/verification/index.json).

## Implemented, less exercised

<!-- begin level 2 (Practice) -->
**[L2 Practice] Use with awareness**

* **Flows with shocks.** A sensor-based artificial viscosity
  ([shock capturing](../theory/shock-capturing.md)) is part of the differentiated residual and
  is verified on a transonic aerofoil, including adjoint derivatives through the shock
  ([example](../examples/transonic.md)). It has been exercised at $p = 2$ on that one
  configuration with the default `roe` interface flux; strong shocks, supersonic free streams,
  higher degrees and the entropy-stable interface fluxes in combination with it are untested
  or unconverged, and positivity is not enforced.
* **3-D flows.** Verified on a sphere and an ellipsoid (inviscid and laminar, degrees 1 to 4)
  and on a spanwise extrusion; the only 3-D turbulent case is an extruded flat plate, and there is no wing and no lifting 3-D
  configuration in the suite. Built-in 3-D geometry is the cubed-sphere shell
  (`sphere_shell`: spheres and ellipsoids), boxes and spanwise extrusions; anything else is
  read from a mesh file of hexahedra. Problem size is limited by the memory of one device:
  the block inverses hold $n_\text{var}^2 (p+1)^{2d}$ numbers per element, in single
  precision if `solver.precond_precision: single` is set. (The
  mesh-deformation operator behind shape derivatives is applied matrix-free at 3-D sizes
  and is not what limits them.) The
  [largest solve](../verification/three-dimensional.md#largest-solve-on-one-device)
  recorded on the development machine, with the derivative of the drag with respect to
  every surface node, is stated with its memory and times.
* **Turbulent flows.** One model (negative Spalart–Allmaras), integrated to the wall, verified
  on a manufactured solution and on the zero-pressure-gradient flat plate, in two
  dimensions and on a spanwise extrusion that must reproduce them
  ([three dimensions](../verification/turbulence.md#three-dimensions)). Separated flow,
  aerofoils at flight Reynolds number, turbulent flows that are three-dimensional in
  themselves, transition, rotation and
  compressibility corrections, wall functions and other models are untested or absent
  ([what is included](../theory/turbulence-model.md)). The line smoother for wall-resolved
  meshes (`solver.smoother: line`) is measured on that flat plate and on a laminar sphere
  with thin wall layers in three dimensions, both small: it cuts the Krylov iterations of
  tight linear solves to less than half and does not make the flow solve itself faster
  ([record](../verification/solvers.md#line-smoothing-on-a-wall-resolved-mesh)).
* **External meshes.** A case can take its mesh from a file (`mesh.generator: file`): Gmsh MSH
  2.2 or 4.1 in ASCII, with complete Lagrange quadrilaterals of degree 1 to 5 or hexahedra of
  degree 1 to 4, or Gyre's own NPZ arrays at any geometry degree. Boundary groups are the
  physical groups of the file, a boundary face without one is refused, and the case must give
  a boundary condition for every group. Periodic node pairs of the file become periodic
  topology. Left-handed elements are re-oriented; a mesh with an element whose Jacobian
  determinant is not positive at every geometry node is refused, not repaired. Flow solves on imported meshes are verified in 2-D.
* **Order selection.** Uniform p-enrichment on a fixed mesh, driven by the error estimate of
  one built-in scalar output, from the case's degree (at least 1) up to at most degree 8
  (default limit 5). It inherits the limits of the estimate: the error is measured against
  the next degree, not against the exact solution.
* **Internal-flow boundary conditions** (`total_inlet`, `pressure_outlet`): used by the bump
  channel; simple pressure-extrapolation formulation.
* **Sutherland viscosity**: implemented, not part of the verification suite.
* **GPU execution**: used for the larger verification studies; small problems are faster on CPU
  because compilation dominates.

<!-- end level 2 -->

## Not included

> **Warning: Out of scope in this release**
>
> * **Scale-resolving turbulence simulation.** No LES or hybrid model, no wall functions, no
>   transition model; the only closure is the Spalart–Allmaras RANS model.
> * **Unsteady analysis through the service.** An explicit Runge–Kutta integrator exists for
>   verification; time-accurate jobs, unsteady adjoints and implicit time stepping are not exposed.
> * **Element shapes other than quadrilaterals and hexahedra.** Mesh files with triangles,
>   tetrahedra, prisms, pyramids or serendipity elements are refused. So are binary MSH files and
>   MSH versions other than 2.2 and 4.1, and meshes with hanging nodes (every interior face must
>   be shared by exactly two elements).
> * **Mesh adaptation.** The mesh of a case is fixed. The per-element error indicators are
>   computed but not acted upon; [order selection](../guide/gradients.md#letting-the-error-estimate-choose-the-order)
>   raises the polynomial degree uniformly on that mesh.
> * **Optimization.** Gyre is the analysis discipline. Order selection controls the
>   discretization error of one analysis; it does not change inputs or search a design space.
> * **Distributed-memory parallelism.** One process, one device (multi-threaded CPU or one GPU).
> * **Geometry engine and parameterisation.** Shape enters as surface-node displacements; mapping
>   design variables to those displacements is the framework's job.

<!-- begin level 3 (Mechanics) -->
**[L3 Mechanics] Numerical characteristics to plan around**

* Gauss–Lobatto collocation trades some accuracy per degree of freedom for diagonal mass
  matrices and entropy-conservative volume terms: the design rate $p+1$ is checked for the advected density
  wave and for steady manufactured solutions on Cartesian meshes, while for the nonlinear
  unsteady vortex only the guaranteed rate $p$ is required and the observed rate is reported.
* In diffusion-dominated regimes only the rate $p$ is required of the state; the observed
  orders per variable are reported ([details](../verification/order-of-accuracy.md)).
* Elements are isoparametric, so at $p = 1$ curved walls are polygons and generate spurious
  entropy at their kinks; use $p \ge 2$ on curved geometry
  ([evidence](../verification/output-error.md)).
* Sharp trailing edges are geometric singularities: output convergence rates there are limited
  by the singularity, not by $p$.
* First use of each mesh-size/degree combination costs tens of seconds of JIT compilation;
  sessions and the persistent compilation cache amortise it.

<!-- end level 3 -->
