Quickstart#
This guide walks through a complete nuclear data assimilation workflow from loading Serpent output files to producing a posterior and exporting adjusted nuclear data.
Overview#
A typical ANDALUS workflow consists of four steps:
Load benchmarks — Serpent sensitivity and results files for experiments with known measurements.
Load applications — Serpent sensitivity and results files for the system you want to predict.
Load covariances — Nuclear data covariance matrices from ERRORR (via SANDY).
Run GLLS — Combine everything in an
AssimilationSuiteand call.glls().
Step 1: Load a benchmark#
from andalus import Benchmark
hmi = Benchmark.from_serpent(
title="HMI-001",
m=1.0, # measured k-eff
dm=0.0005, # measurement uncertainty (1-sigma)
sens0_path="data/hmi001_sens0.m",
results_path="data/hmi001_res.m",
kind="keff",
)
print(f"k_eff discrepancy: {hmi.c - hmi.m:.5f}")
To attach a flux spectrum (needed for the ealf metric), pass flux_det:
hmi = Benchmark.from_serpent(
title="HMI-001",
m=1.0,
dm=0.0005,
sens0_path="data/hmi001_sens0.m",
results_path="data/hmi001_res.m",
flux_det=("flux", "data/hmi001_det0.m"),
)
Step 2: Load a benchmark suite#
from andalus import BenchmarkSuite
benchmark_suite = BenchmarkSuite.from_yaml("benchmarks.yaml")
# Or build from a list
benchmark_suite = BenchmarkSuite.from_list([hmi, hmi2, hmi3])
print(suite.m) # measured values as pd.Series
print(suite.c) # calculated values as pd.Series
Step 3: Load covariances#
from andalus import CovarianceSuite
covariances = CovarianceSuite.from_hdf5(
"covariances.h5",
zais=[922350, 922380, 942390], # U-235, U-238, Pu-239
)
Step 4: Load applications#
from andalus import Application, ApplicationSuite
reactor = Application.from_serpent(
title="my-reactor",
sens0_path="data/reactor_sens0.m",
results_path="data/reactor_res.m",
)
application_suite = ApplicationSuite.from_list([reactor])
Step 5: Run GLLS and inspect results#
from andalus import AssimilationSuite
suite = AssimilationSuite(
benchmarks=benchmark_suite,
applications=application_suite,
covariances=covariances,
)
posterior = suite.glls()
posterior.summarize()
print(f"Chi-squared: {posterior.chi_squared():.3f}")
print(posterior.applications.c) # adjusted calculated values
Step 6: Export to ACE (optional)#
If you want to use the adjusted nuclear data in a Monte Carlo transport code:
posterior.to_ace_direct(
out_dir="adjusted_ace",
xsdata_path="path/to/jeff40.xsdata",
temperature=300,
create_xsdata=True,
)
Using a YAML configuration#
For reproducible workflows, describe everything in a single YAML file and load it in one call:
suite = AssimilationSuite.from_yaml("assimilation.yaml")
posterior = suite.glls()
See the YAML Configuration page for the full schema.
Filtering benchmarks#
Remove outliers before running GLLS using composable filter objects:
from andalus import Chi2Filter
# Keep only benchmarks with chi-squared < 3
filtered = suite.filter(Chi2Filter(threshold=3.0))
posterior = filtered.glls()
Filters support &, |, and ~ operators:
from andalus import Chi2Filter, Chi2NuclearDataFilter
f = Chi2Filter(3.0) & Chi2NuclearDataFilter(3.0, covariances.matrix)
posterior = suite.filter(f).glls()