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()
../_images/85750df398fd346454c8a6684babc67ba48fd1b63f804ee3cdb8b5f4fbc14168.png

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.