Notebook 03: retained Miehe SENT results¶
This notebook inspects the lightweight artifacts retained for the curated Miehe single-edge-notched tension case. It does not rerun the 350-step calculation. The checked-in manifest and case README define the evidence boundary.
from pathlib import Path
import json
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import Image, display
candidates = [Path.cwd(), *Path.cwd().parents]
root = next(path for path in candidates if (path / 'examples/quasistatic/miehe_tension').is_dir())
case = root / 'examples/quasistatic/miehe_tension'
print(case)
/home/runner/work/PhAST/PhAST/examples/quasistatic/miehe_tension
Load-displacement and damage history¶
results = np.genfromtxt(case / 'results.csv', delimiter=',', names=True)
fig, axes = plt.subplots(1, 2, figsize=(10, 3.6))
axes[0].plot(results['displacement'], results['reaction_kN'], color='#1f6f78')
axes[0].set(xlabel='applied displacement (mm)', ylabel='reaction (kN)', title='Load-displacement response')
axes[1].plot(results['displacement'], results['max_d'], color='#b35c44')
axes[1].set(xlabel='applied displacement (mm)', ylabel='maximum damage', title='Damage evolution')
for axis in axes:
axis.grid(alpha=0.25)
fig.tight_layout()
Retained field visualization and evidence metadata¶
manifest = json.loads((case / 'run_manifest.json').read_text(encoding='utf-8'))
run_metadata = json.loads((case / 'run_metadata.json').read_text(encoding='utf-8'))
manifest_evidence = {key: manifest[key] for key in ('status', 'validation', 'notes', 'omitted_artifact_categories') if key in manifest}
print('Manifest evidence boundary:')
print(json.dumps(manifest_evidence, indent=2))
print('Run metadata:')
print(json.dumps(run_metadata, indent=2))
Manifest evidence boundary:
{
"status": "promoted_public_validation",
"validation": "PASS against PhaseFieldX 1711 reference response",
"notes": "Flat public quasi-static fracture bundle; raw trajectories and run logs are generated locally, not distributed.",
"omitted_artifact_categories": [
"raw trajectory stores",
"run and comparison logs",
"scratch run directories"
]
}
Run metadata:
{
"timestamp": "2026-05-23T19:39:54.227845",
"platform": {
"system": "Linux",
"release": "5.14.0-611.11.1.el9_7.x86_64",
"machine": "x86_64",
"python": "3.11.15",
"pytorch": "2.8.0+cu128"
},
"problem": "Miehe SENT (Single-Edge-Notch Tension)",
"device": {
"device": "cpu",
"dtype_default": "float64"
},
"material": {
"E": 210000.0,
"nu": 0.3,
"Gc": 2.7,
"l0": 0.015,
"energy_split": "isotropic",
"pf_model": "AT2",
"eta_residual": 1e-07,
"plane_stress": false,
"rho": 7.8e-09
},
"mesh": {
"n_nodes": 2423,
"n_elements": 4308,
"h_min": 0.0006412057226662074
},
"solver": {
"solver_type": "quasi_static",
"num_steps": 350,
"stagger_tol": 1e-08,
"stagger_criterion": "relative",
"anderson_depth": 0
},
"git_hash": "0ecb5bb",
"total_time_s": 905.46,
"peak_reaction_kN": 0.6936,
"memory": {
"cpu_rss_peak_MiB": 1111.0
}
}
Reproduction and post-processing boundary¶
The public CLI does not expose a one-command VTU/PVD export, and Result.export() does not create new files. Reproduce the curated calculation from the repository root with:
python -m phast run examples/quasistatic/miehe_tension/config.yaml --output_dir runs/miehe_reproduction
This is the full 350-step calculation, not a two-second notebook cell. Standard retained outputs include configuration, telemetry, CSV histories, plots, and trajectory data. Lower-level VTU writing APIs are available for custom advanced workflows, but a newcomer ParaView time-series contract is not currently provided.