Building a case from scratch is a different journey from adapting an example, and "read all four YAML references" is not an answer to it. This page walks the decisions in the order they constrain each other, and links out for the exact syntax at each step.
Decisions constrain each other in one direction, so taking them out of order means redoing work:
Geometry constrains which boundaries are possible; boundaries constrain which scalings make sense; scaling constrains which timestep is stable. Choosing a solver before you know your grid is choosing in the dark.
At each step: build the smallest valid configuration first, validate it, and only then add complexity.
Minimum viable choice. A programmatically generated box (grid.mode: programmatic_c). It needs no external files and validates fastest.
Alternatives. A file-based curvilinear grid when the geometry is not a box, or grid_gen when you want the shipped generator to build it. See Grid Generator Guide: generators/grid.gen.
Constraints to check now, not later.
Syntax. 3. grid.
Decide the shape of the problem before the numbers: which faces are walls, which admit flow, which are homogeneous.
Choose the type first, then the handler — not every handler is legal for every type. The compatibility matrix and the entries for both are at 2. Boundary Types and 4. Handler Entries.
Common topologies.
| Problem | Topology |
|---|---|
| Through-flow channel or duct | inlet + outlet + wall |
| Statistically homogeneous, decaying | periodic on the homogeneous axes with geometric |
| Sustained wall-bounded turbulence | periodic streamwise with a driven handler, wall on the others |
The trap. A periodic wall-bounded flow decays under wall friction unless it is driven. If you want sustained turbulence, you need constant_flux or initial_flux, on both faces of the pair.
Values in YAML are physical; picurv non-dimensionalizes them before the runtime sees them. Getting this wrong produces plausible-looking wrong answers rather than errors, which makes it the highest-risk step on this page.
target_flux is a volumetric flux, not a velocity.Minimum viable choice. Dual Time Picard Jameson RK, the default production solver. It tolerates far larger timesteps than the explicit path.
Alternatives and why they exist. Compare against siblings at 3. Momentum Solver Entries before switching. Newton Krylov is the right escalation when pseudo-time stalls; Explicit RK4 currently has no positive-path verification (see Capability Evidence Matrix) and should not be a first choice.
Turbulence model. Use none unless the grid genuinely cannot resolve the flow.
averaging.mode: homogeneous wherever the flow has a homogeneous direction, since the local coefficient is noisy and the least-squares closure it comes from assumes an averaging set. Enable diagnostics and read Cs(t) before trusting the result.Configure this before the first expensive run, not after it fails:
Syntax. 2. io.
Decide what you will actually compute from the run, because it determines what must be written. Configuration Reference: Postprocessor YAML covers the pipelines; Tutorial: A Guide to Visualizing Your Results covers getting pictures out.
picurv validate passes on all four roles.--dry-run output shows the artifacts and commands you expect.You finish this page with decisions, not with a case. To turn them into one:
./bin/picurv init <closest example> --dest my_case — start from the nearest shipped case rather than an empty file.picurv validate between each.