skills/simulation-workflow/post-processing/SKILL.md
Extract, analyze, and summarize simulation output data — pull spatial fields at specific timesteps, compute time-series trends and detect steady state, extract line profiles through the domain, generate statistical summaries and distributions, calculate derived quantities (gradients, fluxes, volume fractions, interface area), compare results against analytical solutions or experimental data, and produce automated analysis reports. Use when interpreting finished simulation results, checking mass or energy conservation, comparing two runs or meshes, extracting interface profiles from phase-field output, or preparing publication-quality analysis, even if the user only says "what do my results look like" or "did my simulation reach steady state."
npx skillsauth add HeshamFS/materials-simulation-skills post-processingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Analyze and extract meaningful information from simulation output data.
Transform raw simulation output into actionable insights through field extraction, statistical analysis, derived quantities, visualizations, and comparison with reference data.
Before running post-processing scripts, collect:
Output Data Location
Analysis Type
Output Requirements
| Script | Purpose | Key Inputs |
|--------|---------|------------|
| field_extractor.py | Extract field data from output files | --input, --field, --timestep |
| time_series_analyzer.py | Analyze temporal evolution | --input, --quantity, --window |
| profile_extractor.py | Extract line profiles | --input, --field, --start, --end |
| statistical_analyzer.py | Compute field statistics | --input, --field, --region |
| derived_quantities.py | Calculate derived quantities | --input, --quantity, --params |
| comparison_tool.py | Compare to reference data | --simulation, --reference, --metric |
| report_generator.py | Generate summary reports | --input, --template, --output |
First, understand what data is available:
# List available fields and timesteps
python scripts/field_extractor.py --input results/ --list --json
Extract spatial field data at specific timesteps:
# Extract concentration field at timestep 100
python scripts/field_extractor.py \
--input results/field_0100.json \
--field concentration \
--json
# Extract multiple fields
python scripts/field_extractor.py \
--input results/field_0100.json \
--field "phi,concentration,temperature" \
--json
Analyze temporal evolution of quantities:
# Extract total energy vs time
python scripts/time_series_analyzer.py \
--input results/history.json \
--quantity total_energy \
--json
# Compute moving average with window
python scripts/time_series_analyzer.py \
--input results/history.json \
--quantity mass \
--window 10 \
--json
# Detect steady state
python scripts/time_series_analyzer.py \
--input results/history.json \
--quantity residual \
--detect-steady-state \
--tolerance 1e-6 \
--json
Extract 1D profiles through the domain:
# Extract profile along x-axis at y=0.5
python scripts/profile_extractor.py \
--input results/field_0100.json \
--field concentration \
--start "0,0.5,0" \
--end "1,0.5,0" \
--points 100 \
--json
# Interface profile (through center)
python scripts/profile_extractor.py \
--input results/field_0100.json \
--field phi \
--axis x \
--slice-position 0.5 \
--json
Compute statistics over field data:
# Global statistics
python scripts/statistical_analyzer.py \
--input results/field_0100.json \
--field concentration \
--json
# Statistics in specific region
python scripts/statistical_analyzer.py \
--input results/field_0100.json \
--field phi \
--region "x>0.3 and x<0.7" \
--json
# Distribution analysis
python scripts/statistical_analyzer.py \
--input results/field_0100.json \
--field phi \
--histogram \
--bins 50 \
--json
Calculate physical quantities from raw data:
# Compute interface area
python scripts/derived_quantities.py \
--input results/field_0100.json \
--quantity interface_area \
--threshold 0.5 \
--json
# Compute gradient magnitude
python scripts/derived_quantities.py \
--input results/field_0100.json \
--quantity gradient_magnitude \
--field phi \
--json
# Compute volume fractions
python scripts/derived_quantities.py \
--input results/field_0100.json \
--quantity volume_fraction \
--field phi \
--threshold 0.5 \
--json
# Compute flux through boundary
python scripts/derived_quantities.py \
--input results/field_0100.json \
--quantity boundary_flux \
--field concentration \
--boundary "x=0" \
--json
Compare simulation results to reference data:
# Compare to analytical solution
python scripts/comparison_tool.py \
--simulation results/profile.json \
--reference reference/analytical.json \
--metric l2_error \
--json
# Compare to experimental data
python scripts/comparison_tool.py \
--simulation results/history.json \
--reference experimental_data.csv \
--metric rmse \
--interpolate \
--json
# Compare two simulations
python scripts/comparison_tool.py \
--simulation results_fine/field.json \
--reference results_coarse/field.json \
--metric max_difference \
--json
Generate automated reports:
# Generate summary report
python scripts/report_generator.py \
--input results/ \
--output report.json \
--json
# Generate with specific sections
python scripts/report_generator.py \
--input results/ \
--sections "summary,statistics,convergence" \
--output report.json \
--json
For a complete simulation analysis:
# Step 1: Inventory available data
python scripts/field_extractor.py --input results/ --list --json
# Step 2: Extract final state statistics
python scripts/statistical_analyzer.py \
--input results/field_final.json \
--field phi \
--json
# Step 3: Analyze convergence history
python scripts/time_series_analyzer.py \
--input results/history.json \
--quantity residual \
--detect-steady-state \
--json
# Step 4: Compute derived quantities
python scripts/derived_quantities.py \
--input results/field_final.json \
--quantity volume_fraction \
--field phi \
--json
# Step 5: Compare to reference (if available)
python scripts/comparison_tool.py \
--simulation results/profile.json \
--reference benchmark/expected.json \
--metric l2_error \
--json
# Step 6: Generate summary report
python scripts/report_generator.py \
--input results/ \
--output analysis_report.json \
--json
| Metric | Interpretation | |--------|----------------| | L2 error < 1% | Excellent agreement | | L2 error 1-5% | Good agreement | | L2 error 5-10% | Moderate agreement | | L2 error > 10% | Poor agreement, investigate |
All scripts support --json flag for machine-readable output:
{
"script": "field_extractor",
"version": "1.0.0",
"input_file": "results/field_0100.json",
"field": "concentration",
"data": {
"shape": [100, 100],
"min": 0.1,
"max": 0.9,
"mean": 0.5
},
"values": [[...], [...]]
}
[a-zA-Z_][a-zA-Z0-9_.-]* to prevent injection via crafted field namesstatistical_analyzer.py validates --region conditions against a strict regex allowlist (variable comparisons with numbers only)profile_extractor.py validates point coordinates as finite numbers with max 3 dimensions--metric values in comparison_tool.py are validated against a fixed allowlist (l2_error, rmse, max_difference)--sections in report_generator.py are validated against known section names--bins, --points, and --window are validated as positive integers with upper boundsreport_generator.py caps directory listing at 10,000 entries to prevent resource exhaustionallowed-tools excludes Bash to prevent the agent from executing arbitrary commands when processing untrusted simulation output fileseval(), exec(), or dynamic code generation — region parsing uses regex matching, never code evaluationshell=True)For detailed information, see:
references/data_formats.md - Supported input/output formatsreferences/statistical_methods.md - Statistical analysis methodsreferences/derived_quantities_guide.md - Physical quantity calculationsreferences/comparison_metrics.md - Error metrics and interpretationdevelopment
Plan verification and validation campaigns for simulation codes using manufactured solutions, canonical benchmark problems, grid/time refinement, uncertainty propagation, and pass/fail acceptance criteria. Use when an agent needs to prove a solver, model, or result is trustworthy rather than only plausible.
testing
Map computational materials tasks onto workflow engines such as atomate2, jobflow, AiiDA, pyiron, or a simple one-off script. Use when deciding how to structure a reproducible campaign, DAG, restart strategy, provenance record, storage layout, or migration path from ad hoc scripts to managed workflows.
development
Plan molecular dynamics post-processing for materials simulations, including RDF, MSD and diffusion, VACF/VDOS, coordination numbers, bond-angle distributions, stress-strain curves, equilibration detection, PBC unwrapping, and trajectory format choices. Use before writing MD analysis scripts or trusting trajectory-derived results.
development
Triage cross-code simulation failures and propose safe retry ladders for nonconvergence, NaN/Inf, exploding energies, unstable timesteps, pressure blow-up, missing potentials, bad pseudopotentials, corrupted output, and incomplete runs. Use when an agent sees a failed or suspicious materials simulation and needs a defensible first response.