2. CAE data models and metadata schemas
An enterprise CAE data science platform lives or dies by the quality of its data model. Simulation data is heterogeneous by nature: a single load case may reference a mesh with millions of nodes, a set of boundary conditions tied to named selections, a material card with temperature-dependent curves, solver control parameters, and a result field defined on a different discretization than the input mesh. Without an explicit schema, every downstream analytics task — surrogate training, sensitivity studies, anomaly detection — becomes a bespoke parsing exercise. This chapter defines the core entities, their relationships, and the metadata conventions that make CAE data queryable, joinable, and reproducible.
Core Entity Model
A practical CAE data model separates five entity families: geometry/mesh, boundary conditions, material properties, solver settings, and results. Each family is versioned and linked through a common case_id and model_revision. The mesh is the spatial backbone; boundary conditions and results reference mesh entities by stable identifiers rather than by array index, because re-meshing invalidates positional indices.
The following schema fragment shows a minimal but production-viable representation using a document-oriented store (JSON-like), with explicit units and provenance fields:
{
"case_id": "crash_frontal_0042",
"model_revision": "r3",
"mesh": {
"mesh_id": "m_r3_hex",
"node_count": 1842300,
"element_types": ["C3D8R", "C3D6"],
"coordinate_system": "global_cartesian_mm",
"checksum": "sha256:9f2c..."
},
"boundary_conditions": [
{
"bc_id": "bc_fix_rear",
"type": "displacement",
"target": {"set_name": "NSET_REAR", "entity": "node"},
"dof": [1, 2, 3],
"value": 0.0,
"unit": "mm"
},
{
"bc_id": "bc_vel_front",
"type": "velocity",
"target": {"set_name": "NSET_FRONT", "entity": "node"},
"dof": [1],
"value": -15000.0,
"unit": "mm/s"
}
],
"materials": [
{
"material_id": "steel_dp780",
"model": "Johnson-Cook",
"parameters": {"A": 450.0, "B": 780.0, "n": 0.35, "C": 0.014, "m": 1.0},
"unit_system": "MPa_mm_s",
"source": "material_db_v2.1"
}
],
"solver": {
"solver": "Abaqus/Explicit",
"version": "2023",
"time_step": 1.2e-6,
"mass_scaling": 0.0,
"output_interval": 5.0e-5
},
"results": [
{
"result_id": "res_vm_stress",
"field": "S_Mises",
"location": "element_centroid",
"mesh_id": "m_r3_hex",
"frames": 240,
"unit": "MPa"
}
]
}
Two design decisions deserve emphasis. First, every physical quantity carries an explicit unit or unit_system; implicit unit assumptions are the most common source of silent errors when merging datasets from different teams. Second, boundary conditions and results reference set_name and mesh_id rather than raw indices, so that a re-meshed revision can be re-linked through named selections.
Mesh and Topology Metadata
The mesh entity stores topology and geometry metadata separately. Topology covers element type, connectivity, and node count; geometry metadata covers bounding box, characteristic element length, and quality metrics such as Jacobian ratio and aspect ratio. For data science workflows, the most valuable derived fields are element_centroid coordinates and element_volume, because they allow result fields to be resampled onto a common grid for cross-case comparison.
A common pitfall is treating the mesh as immutable. In practice, mesh convergence studies produce multiple revisions of the same model. The schema must therefore treat mesh_id as a first-class key and record the parent-child relationship between revisions, so that a query like "all results computed on meshes with element size below 2 mm" is expressible.
Boundary Conditions and Solver Settings
Boundary conditions are best modeled as typed records with a target, a dof list, a value, and a unit. The target resolves to a named set on the mesh. This indirection is what makes BCs portable across mesh revisions. Solver settings are stored as a flat parameter map keyed by solver name and version, because solver option names differ across codes and versions; storing them as free-form key-value pairs preserves fidelity without forcing a lossy normalization.
Results Representation
Results are the largest and most frequently queried entity. A result field is defined by four attributes: the physical quantity (field), the location (nodal, element centroid, integration point), the mesh it is defined on (mesh_id), and the time or frequency frames. Storing results as columnar arrays (Parquet or HDF5) keyed by result_id and frame keeps storage compact and enables predicate pushdown. For time-series analytics, a long-format table with columns case_id, frame, entity_id, value is often more convenient than wide per-frame arrays, at the cost of larger storage.
The diagram below summarizes how the five entity families connect through shared keys and how a query traverses from a case to a specific result field.
Schema Validation and Ingestion
Before any analytics run, the ingestion pipeline should validate each case against the schema. A minimal validation checklist includes: every bc_id resolves to an existing named set; every result_id references a mesh_id present in the case; all physical quantities carry units; and solver version is recorded. Failures should be logged with the offending field path, not silently dropped.
For a reproducible example, consider ingesting a batch of 50 crash cases. The pipeline reads each solver deck, extracts the five entity families, resolves named sets to node/element ID lists, and writes one Parquet file per result field partitioned by case_id. A validation query then checks that the number of frames in each result matches the solver's declared output interval. If a case fails — for example, a result field references a mesh revision that was overwritten — the pipeline quarantines that case and emits a structured error record. The observable success criterion is a validation report showing 50/50 cases passing all checks and a query returning consistent element counts across all cases.
Practical Takeaways
- Model the five entity families as separate, versioned records linked by
case_idandmesh_id. - Reference mesh entities through named sets, never through positional indices.
- Attach explicit units to every physical quantity and record provenance for materials and solver settings.
- Store results in columnar format partitioned by case and field to keep queries fast and storage compact.
- Validate at ingestion and quarantine failures with structured error records rather than dropping them silently.
With this schema in place, the platform can answer cross-case questions — comparing peak stress across materials, correlating mesh density with result variance, or training a surrogate on aligned feature vectors — without re-parsing solver decks. The next step is to build the ingestion and validation pipeline that enforces these contracts automatically.