Skip to content

The open data effort

Fatigue model papers routinely state the same problem: there is no independent, well-documented, redistributable strain-life data to validate against. Published S-N collections exist, but curated strain-controlled records with metadata, runouts, and per-cycle evolution do not.

lcf-strain-life is building that dataset in the open, in three layers.

1. The formats

Versioned, machine-readable JSON formats for material constants, single test records with ASTM E606-style metadata, and dataset collections, specified in INTERCHANGE.md with JSON Schemas for materials, test records, and collections. The library is the reference reader, writer, and validator, and lcf-validate checks any document from the command line.

2. The seed collection

A small, citable, schema-reference collection ships with the repository at docs/data/seed_collection.json and builds programmatically from lcf.datasets.seed_collection():

  • Six SAE 1137 strain-controlled tests, re-tabulated from Williams, Lee, Rilly, International Journal of Fatigue 25 (2003) 427-436.
  • Three verified published constant sets as material documents, SAE 1005 from Lee, Pan, Hathaway, Barkey 2005, and Man-Ten and RQC-100 from the SAE committee benchmark constants with cyclic curve constants from Wu, Zhang, Paraschivoiu, Materials 17 (2024) 4521.

Every value is factual data re-tabulated with attribution, every entry carries provenance, and a test suite validates the collection and guards the artifact against drift.

Stated plainly: the seed demonstrates the formats and the pipeline. It is not yet a database at publishable scale. Growing it is the point of the contribution process.

3. Contributions

CONTRIBUTING-DATA.md defines what a contribution needs: provenance for every record, explicit license basis, E606-style metadata, runouts flagged rather than dropped, and per-cycle tables where they exist, because cyclic evolution is the data no open collection provides.

Using a collection

from lcf import datasets, interchange

col = datasets.seed_collection()
interchange.validate_document(col)          # {"valid": True, ...}
records = interchange.import_collection(col).records

import pandas as pd
df = pd.DataFrame({
    "strain_amplitude": [r.test.strain_amplitude for r in records],
    "reversals": [r.failure.reversals_to_failure for r in records],
    "runout": [r.failure.runout for r in records],
})

From an MCP client, validate_interchange checks any document and summarize_collection reports counts, ranges, and licensing at a glance.