{
  "schema": "courant.site/1",
  "name": "Courant",
  "url": "https://www.courant.dev",
  "category": "Simulation credibility assessment",
  "availability": {
    "label": "Available 30 September 2026",
    "released": false,
    "date": "2026-09-30"
  },
  "contact": "hello@courant.dev",
  "products": [
    {
      "name": "Courant Stop",
      "url": "https://www.courant.dev/stop",
      "produces": "Know the moment a run converges. Stop paying for the rest.",
      "for": "HPC and aerodynamics teams"
    },
    {
      "name": "Courant Attest",
      "url": "https://www.courant.dev/attest",
      "produces": "The credibility report for ASME V&V 40 and NRC review. Reproducible to the byte.",
      "for": "Regulated engineering"
    }
  ],
  "stopReports": [
    "The answer at the stopping point, and at the end",
    "How much the answer changed after the stopping point",
    "Iterations past convergence",
    "Wall-clock past convergence",
    "Allocation unit hours past convergence"
  ],
  "checks": [
    {
      "key": "convergence",
      "name": "Convergence",
      "question": "Did it settle, and where?",
      "method": "Steady: fixed-point detection. Transient: MSER-5 truncation, batch means and a stationarity test.",
      "cites": [
        "White, 1997",
        "Geweke, 1992"
      ],
      "whenItCannotRun": "A steady solver on unsteady flow is a verdict, not a warning."
    },
    {
      "key": "discretization",
      "name": "Discretization",
      "question": "How much of the answer is the mesh?",
      "method": "Grid convergence index from two or three refined meshes.",
      "cites": [
        "ASME V&V 20"
      ],
      "whenItCannotRun": "Discretization error was not quantified: a single mesh was supplied."
    },
    {
      "key": "setup",
      "name": "Setup",
      "question": "Is the model right for the physics?",
      "method": "Twelve rules. Each cites the file it read and the threshold it applied.",
      "cites": [],
      "whenItCannotRun": "Every rule is listed, including the ones that passed."
    },
    {
      "key": "validation",
      "name": "Validation",
      "question": "How far from the reference?",
      "method": "Comparison error against the combined validation uncertainty.",
      "cites": [
        "ASME V&V 20"
      ],
      "whenItCannotRun": "Accuracy against a reference was not assessed: no reference was supplied."
    }
  ],
  "setupRules": [
    {
      "code": "REG.UNSTEADY_STEADY",
      "name": "Steady solver, unsteady flow",
      "reads": "Convergence result",
      "rule": "Monitors in a limit cycle under a steady solver",
      "severity": "FAIL"
    },
    {
      "code": "REG.YPLUS_WALLFN",
      "name": "y+ against wall functions",
      "reads": "yPlus output, wall treatment",
      "rule": "Fraction of faces below 11 or above 300: over 0.10 warns, over 0.30 fails",
      "severity": "WARN / FAIL"
    },
    {
      "code": "REG.YPLUS_RESOLVED",
      "name": "y+ on a resolved wall",
      "reads": "yPlus output, wall treatment",
      "rule": "Maximum y+ above 5 on any wall patch",
      "severity": "FAIL"
    },
    {
      "code": "REG.LAMINAR_TURBULENT",
      "name": "Laminar model, turbulent flow",
      "reads": "Turbulence model, Reynolds number",
      "rule": "Re above 4,000 internal or 500,000 external",
      "severity": "FAIL"
    },
    {
      "code": "REG.TURB_SEPARATION",
      "name": "k-epsilon on separating flow",
      "reads": "Turbulence model, force monitors",
      "rule": "k-epsilon family with oscillating force monitors",
      "severity": "WARN"
    },
    {
      "code": "REG.BOUNDING",
      "name": "Bounded fields clipped",
      "reads": "Solver log",
      "rule": "Bounding in more than 1 of every 100 steps warns; more than 1 of every 10 fails",
      "severity": "WARN / FAIL"
    },
    {
      "code": "REG.COURANT_SCHEME",
      "name": "Courant number against scheme",
      "reads": "Courant history, schemes",
      "rule": "Max Co above 1 with an unbounded scheme, steady; above 5 with one outer corrector, PIMPLE",
      "severity": "WARN"
    },
    {
      "code": "REG.CLOSED_NO_PREF",
      "name": "Closed domain, no pressure reference",
      "reads": "fvSolution, boundary types",
      "rule": "Incompressible, no fixed-value pressure patch, no pRef",
      "severity": "FAIL"
    },
    {
      "code": "REG.MESH_QUALITY",
      "name": "Mesh quality",
      "reads": "checkMesh log",
      "rule": "Non-orthogonality above 70° or skewness above 4",
      "severity": "WARN"
    },
    {
      "code": "REG.PARALLEL_STALE",
      "name": "Stale decomposition",
      "reads": "Collect manifest",
      "rule": "Processor meshes older than constant/polyMesh",
      "severity": "FAIL"
    },
    {
      "code": "REG.CONVERGENCE_CRIT",
      "name": "Loose convergence criterion",
      "reads": "fvSolution",
      "rule": "Pressure criterion looser than 1e-3 on a case that claims convergence",
      "severity": "WARN"
    },
    {
      "code": "REG.DECOMP_IMBALANCE",
      "name": "Unbalanced decomposition",
      "reads": "decomposePar log",
      "rule": "Largest to smallest processor above 1.15",
      "severity": "INFO"
    }
  ],
  "grade": {
    "schema": "courant.grade/2",
    "evaluationOrder": [
      "D",
      "A",
      "C",
      "B"
    ],
    "letters": [
      {
        "letter": "A",
        "line": "Converged. Small mesh error. Agrees with the reference.",
        "formal": "M1 PASS ∧ M2 PASS, GCI < 0.02 ∧ M3 PASS or one WARN ∧ M4 PASS"
      },
      {
        "letter": "B",
        "line": "Converged. Nothing failed. Every gap stated.",
        "formal": "M1 PASS ∧ M2 ∈ {PASS, NOT_ASSESSABLE} ∧ M3 no FAIL ∧ M4 ∈ {PASS, NOT_ASSESSABLE}"
      },
      {
        "letter": "C",
        "line": "Converged, with warnings.",
        "formal": "M1 PASS ∧ (M3 more than one WARN ∨ M2 ∈ {WARN, FAIL} ∨ M4 WARN)"
      },
      {
        "letter": "D",
        "line": "Did not converge, or a rule failed.",
        "formal": "M1 FAIL ∨ M3 FAIL ∨ M4 FAIL"
      }
    ],
    "rules": [
      "Missing evidence never raises a grade.",
      "The letters are ours, not any standard's."
    ]
  },
  "evidencePack": {
    "files": [
      {
        "name": "attest_report.json",
        "line": "The assessment as data. The only place a number lives."
      },
      {
        "name": "attest_report.pdf",
        "line": "The same assessment, as the document a reviewer reads."
      },
      {
        "name": "inputs.manifest",
        "line": "Every file read, its SHA-256, and the exact command."
      }
    ],
    "sections": [
      {
        "n": "1",
        "name": "Summary",
        "line": "The grade, the rule that produced it, the reported value."
      },
      {
        "n": "2",
        "name": "Context of use",
        "line": "What the result decides, in your words."
      },
      {
        "n": "3",
        "name": "Model",
        "line": "Solver, turbulence, schemes, mesh, boundaries."
      },
      {
        "n": "4",
        "name": "Verification",
        "line": "Convergence and discretization error."
      },
      {
        "n": "5",
        "name": "Validation",
        "line": "Comparison with the reference."
      },
      {
        "n": "6",
        "name": "Setup and applicability",
        "line": "All twelve rules, with status."
      },
      {
        "n": "7",
        "name": "Not assessed",
        "line": "Every check that could not run, and why."
      },
      {
        "n": "8",
        "name": "Appendix",
        "line": "Every threshold, every value, the manifest."
      }
    ],
    "findingFields": [
      "inputs",
      "method",
      "threshold",
      "value"
    ]
  },
  "checks_what": [
    "Where the run converged",
    "A steady solver on unsteady flow",
    "Error from the mesh",
    "Twelve setup and applicability rules",
    "Agreement with reference data"
  ],
  "doesNot": [
    "Fix simulations",
    "Run your solver",
    "Touch your mesh",
    "Replace a validation experiment",
    "Guess without the input"
  ],
  "security": [
    "Your case never leaves your machine.",
    "It reads files. It never runs your solver or edits your case. You decide who sees the report.",
    "We don't touch the solver. We grade its output."
  ],
  "measured": {
    "scenarios": {
      "n": 36,
      "of": 36,
      "label": "certification scenarios pass on a real solver",
      "source": "certification/RESULTS.json · 1 Sep 2026"
    },
    "topTwo": {
      "n": 28,
      "of": 28,
      "label": "faulted scenarios, the injected fault named in the top two",
      "source": "certification/RESULTS.json · 1 Sep 2026"
    },
    "failureModes": {
      "n": 13,
      "of": 25,
      "label": "failure modes named on real solver output",
      "source": "docs/COVERAGE.md"
    },
    "replayCorpus": {
      "logs": 31,
      "faulted": 24,
      "healthy": 7,
      "topTwo": [
        24,
        24
      ],
      "silent": [
        7,
        7
      ]
    },
    "parallel": {
      "n": 2,
      "of": 36
    },
    "openfoam": "v2406",
    "rule": "Never quote a percentage without its denominator."
  },
  "notYetProven": [
    {
      "code": "BC.REVERSED_OUTFLOW",
      "name": "Reversed outlet flow",
      "why": "wired"
    },
    {
      "code": "BC.TURB_INLET",
      "name": "Inconsistent turbulence inlet values",
      "why": "wired"
    },
    {
      "code": "BC.WALL_FUNCTION",
      "name": "Wrong wall functions for the model",
      "why": "wired"
    },
    {
      "code": "CONV.OSCILLATION",
      "name": "Oscillating quantities of interest",
      "why": "wired"
    },
    {
      "code": "ENV.DECOMP_MISMATCH",
      "name": "Decomposition mismatch",
      "why": "wired"
    },
    {
      "code": "MESH.LEAKY_SNAPPY",
      "name": "Leaky snappyHexMesh",
      "why": "wired"
    },
    {
      "code": "MESH.NEGATIVE_VOLUME",
      "name": "Negative cell volumes",
      "why": "wired"
    },
    {
      "code": "MESH.YPLUS_RESOLUTION",
      "name": "Poor boundary-layer resolution",
      "why": "wired"
    },
    {
      "code": "PHYS.CHT_THERMO",
      "name": "Conjugate heat transfer property inconsistency",
      "why": "wired"
    },
    {
      "code": "PHYS.TURB_REGIME",
      "name": "Turbulence model unsuited to regime",
      "why": "no-route"
    },
    {
      "code": "CONV.MASS_IMBALANCE",
      "name": "Mass or energy imbalance",
      "why": "no-route"
    },
    {
      "code": "CONV.MESH_DEPENDENCE",
      "name": "Not mesh-independent",
      "why": "no-route"
    }
  ],
  "industries": [
    {
      "name": "Nuclear",
      "url": "https://www.courant.dev/industries/nuclear",
      "job": "Thermal-hydraulics evidence for licensing.",
      "documents": [
        "NRC RG 1.203"
      ]
    },
    {
      "name": "Medical devices",
      "url": "https://www.courant.dev/industries/medical-devices",
      "job": "The modeling section of a submission.",
      "documents": [
        "FDA guidance, 2023",
        "ASME V&V 40-2018"
      ]
    },
    {
      "name": "Motorsport",
      "url": "https://www.courant.dev/industries/motorsport",
      "job": "Allocation spent past convergence.",
      "documents": [
        "FIA 2026 Section F"
      ]
    },
    {
      "name": "Aerospace",
      "url": "https://www.courant.dev/industries/aerospace",
      "job": "Credibility of models and simulations.",
      "documents": [
        "NASA-STD-7009B",
        "ASME V&V 20"
      ]
    }
  ],
  "pricing": {
    "tiers": [
      {
        "name": "Individual",
        "who": "Every engineer",
        "price": "Free",
        "unit": "local, no time limit",
        "includes": [
          "The grade",
          "Live watch and the Stop advisory",
          "The setup audit"
        ],
        "cta": "Request a report"
      },
      {
        "name": "Team",
        "who": "Simulation teams",
        "price": "$499",
        "unit": "per engineer, per month",
        "includes": [
          "Evidence packs",
          "Console, history and grade trend",
          "Regression against a baseline pack"
        ],
        "cta": "Request a report",
        "featured": true
      },
      {
        "name": "Regulated",
        "who": "Reactor and device programs",
        "price": "Quoted",
        "unit": "annual",
        "includes": [
          "V&V 40 and NRC pack structure",
          "Redaction and manifest attestation",
          "Audit trail and priority support"
        ],
        "cta": "Request a report"
      }
    ],
    "also": [
      {
        "name": "Per submission",
        "line": "One case, one pack, one signed manifest.",
        "price": "Quoted"
      },
      {
        "name": "Courant Stop",
        "line": "Per team, annual, priced against allocation returned.",
        "price": "Quoted"
      }
    ]
  },
  "planned": [
    {
      "name": "Ansys Fluent",
      "what": "adapter"
    },
    {
      "name": "Simcenter STAR-CCM+",
      "what": "adapter"
    },
    {
      "name": "Surrogate predictions",
      "what": "check"
    }
  ],
  "questions": [
    {
      "q": "Is Courant a solver?",
      "a": "No. It reads what your solver wrote. It never runs the solver, edits the case or builds a mesh."
    },
    {
      "q": "Does it fix simulations?",
      "a": "No. It grades the result and states the evidence. The engineer decides what to change."
    },
    {
      "q": "What does it read?",
      "a": "The solver log, function-object output, the mesh-quality report, and the model, scheme and boundary settings. Never the mesh itself."
    },
    {
      "q": "What leaves my machine?",
      "a": "Nothing from the case. The report is written locally, and you decide who sees it."
    },
    {
      "q": "Which solvers?",
      "a": "OpenFOAM, including decomposed parallel runs. Ansys Fluent and Simcenter STAR-CCM+ adapters are planned."
    },
    {
      "q": "What does the grade mean?",
      "a": "A fixed rule over the four checks, printed beside the letter. The letters are ours, not any standard's."
    },
    {
      "q": "Does a language model decide anything?",
      "a": "No. Code decides every verdict, grade and number. A model may draft prose; a draft that states a number the data does not is rejected."
    }
  ],
  "documents": [
    {
      "key": "fda",
      "short": "FDA guidance, 2023",
      "body": "U.S. Food and Drug Administration",
      "year": "2023",
      "title": "Assessing the Credibility of Computational Modeling and Simulation in Medical Device Submissions",
      "url": "https://www.fda.gov/regulatory-information/search-fda-guidance-documents/assessing-credibility-computational-modeling-and-simulation-medical-device-submissions"
    },
    {
      "key": "vv40",
      "short": "ASME V&V 40-2018",
      "body": "ASME",
      "year": "2018",
      "title": "Assessing Credibility of Computational Modeling through Verification and Validation: Application to Medical Devices"
    },
    {
      "key": "vv20",
      "short": "ASME V&V 20",
      "body": "ASME",
      "year": "",
      "title": "Standard for Verification and Validation in Computational Fluid Dynamics and Heat Transfer"
    },
    {
      "key": "nasa",
      "short": "NASA-STD-7009B",
      "body": "NASA",
      "year": "2024",
      "title": "Standard for Models and Simulations",
      "url": "https://standards.nasa.gov/standard/NASA/NASA-STD-7009"
    },
    {
      "key": "nrc",
      "short": "NRC RG 1.203",
      "body": "U.S. Nuclear Regulatory Commission",
      "year": "2005",
      "title": "Regulatory Guide 1.203, Transient and Accident Analysis Methods",
      "url": "https://www.nrc.gov/docs/ML0535/ML053500170.pdf"
    },
    {
      "key": "fia",
      "short": "FIA 2026 Section F",
      "body": "FIA",
      "year": "2026",
      "title": "2026 Formula 1 Regulations, Section F: Operational, Aerodynamic Testing Restrictions",
      "url": "https://www.fia.com/system/files/documents/fia_2026_f1_regulations_-_section_f_operational_-_iss_06_-_2026-02-27.pdf"
    },
    {
      "key": "white",
      "short": "White, 1997",
      "body": "",
      "year": "1997",
      "title": "MSER initial-transient truncation"
    },
    {
      "key": "geweke",
      "short": "Geweke, 1992",
      "body": "",
      "year": "1992",
      "title": "Stationarity diagnostic"
    }
  ],
  "glossary": [
    {
      "term": "Credibility",
      "definition": "The trust, established through evidence, in a model's predictions for a specific context of use."
    },
    {
      "term": "Credibility evidence",
      "definition": "The collected results of verification, validation and applicability activities."
    },
    {
      "term": "Context of use",
      "definition": "The specific role of the model in the decision it informs."
    },
    {
      "term": "Verification",
      "definition": "Was the model solved correctly? Iterative convergence and discretization error."
    },
    {
      "term": "Validation",
      "definition": "Was the correct model solved? Comparison with reference data."
    },
    {
      "term": "Applicability",
      "definition": "Whether the evidence covers the context of use."
    },
    {
      "term": "Comparator",
      "definition": "The reference data the result is compared against."
    },
    {
      "term": "Adequacy",
      "definition": "Whether the evidence is enough for the context of use."
    },
    {
      "term": "Grid convergence index",
      "definition": "An error band on a result from a sequence of refined meshes, per ASME V&V 20."
    },
    {
      "term": "Answer-unchanged delta",
      "definition": "How much the reported quantity changed between the stopping point and the end of the run."
    },
    {
      "term": "Evidence pack",
      "definition": "The report as data, the report as a document, and the manifest of every input read."
    }
  ],
  "disclaimer": "Courant is not affiliated with, endorsed by or approved by any regulator or standards body."
}