Benchmark Schema#

The OpenMC Fusion Benchmarks (OFB) project uses a modular, schema-driven format to ensure that all benchmark specifications follow a consistent, machine-validated structure.

Validation#

Validation can be performed anually using the OFB Python API:

import openmc_fusion_benchmarks as ofb

ofb.validate_benchmark('benchmark_name')

Alternatively, you can run the validate_all_benchmarks.py script located in the repository’s scripts/ folder. This script iterates through all benchmark specifications.yaml files and validates them against the repository’s benchmark_schema.

Validation output looks like:

🔍 Validating benchmark file: benchmark_name
✅ benchmark_name is valid!

Or in case of validation errors:

🔍 Validating benchmark file: oktavian_al
❌ 1 errors found in oktavian_al:
   - None is not of type 'object' (at ['materials', 1, 'composition', 'data'])

In the example above, the material with id 1 is missing a defined composition.

Validation is also automatically triggered when instantiating a benchmark object:

import openmc_fusion_benchmarks as ofb

benchmark = ofb.OpenmcBenchmark(name='benchmark_name')
🔍 Validating benchmark file: benchmark_name
✅ benchmark_name is valid!

Purpose of the Schema#

To guarantee interoperability and automation, each specifications.yaml file must conform to a predefined JSON Schema. This enables:

  • Automatic validation of input files

  • Improved error reporting for malformed benchmarks

  • Robust tooling for model generation and testing

  • Future extensibility of the specification format

Schema-to-Specifications Mapping#

The benchmark_schema outlines the main sections expected in a specifications.yaml file:

$ref: "#/components/schemas/Benchmark"
components:
  schemas:
    Benchmark:
      type: object
      required: 
        - metadata
        - materials
        - geometry
        - sources
        - settings
        - tallies
      properties:
        metadata:
          $ref: '#/components/schemas/Metadata'
        materials:
          type: array
          items:
            $ref: '#/components/schemas/Material'
        ...

Some sections are optional and included only when relevant to the benchmark:

        ...
        irradiation_schedule:
          $ref: '#/components/schemas/IrradiationSchedule'
        uncertainty_quantification:
          $ref: '#/components/schemas/UncertaintyQuantification'

Beyond defining the structure at a high level, the schema specifies the internal hierarchy and data types for each object:

Tally:
  type: object
  required: [name, particle, filters, scores]
  properties:
    name: 
      type: string
      ...
    particle:
      type: string
      enum: [neutron, photon, electron, positron]
    filters:
      type: array
      items:
        type: object
        required: [type, values]
    ...

Each section in a benchmark’s specifications.yaml is validated against its corresponding schema definition.

For example, a density object in the specifications might appear as:

density:
    value: 0.997
    units: g/cm3

Its schema counterpart ensures the expected structure and value types:

density:
  type: object
  properties:
    value:
      type: number
    units:
      type: string
      enum: [g/cm3]
  required: [value, units]

Likewise, a complete material entry in the materials list could be:

- id: 1
  name: Water
  composition:
      composition_type: element
      fraction_type: atomic
      data:
      H: 0.67
      O: 0.33
  density:
      value: 0.997
      units: g/cm3

And its definition in the schema would be:

Material:
  type: object
  required: [id, name, composition, density]
  properties:
    id:
      type: integer
    name:
      type: string
    composition:
      type: object
      properties:
        composition_type:
          type: string
        fraction_type:
          type: string
          enum: [atomic, weight]
        data:
          type: object
          additionalProperties:
            type: number
      required: [composition_type, fraction_type, data]
    density:
      ...

Unified Schema Format#

The OFB schema is a single, unified JSON Schema file that defines the complete structure of a valid specifications.yaml file. It includes all top-level sections—such as metadata, geometry, materials, source, tallies, and others—and their corresponding nested fields.

Although the schema is written modularly (with subschemas for each section), it is maintained as one file for simplicity, validation consistency, and ease of distribution.