4. CAE data storage architectures

CAE simulation data is not a single, uniform workload. A single vehicle crash model may contain hundreds of thousands of solver files, a CFD transient run may emit terabytes of time-step results, and a metadata record for one analysis may be only a few kilobytes. Treating all of this as "files on a share" is the most common architectural mistake in simulation data management. This chapter examines the four storage families that matter in practice — POSIX file systems, object stores, databases, and hybrid combinations — and shows how to match each data class to the storage tier that serves it best.

Why One Storage Tier Cannot Serve All CAE Data

Simulation data falls into four classes with sharply different access patterns. Input decks and solver models (e.g., .key, .inp, .cas, .dat) are small, frequently read, and rarely modified after release. Result files (.odb, .rst, .h3d, .ensight) are large, written once, and read sequentially during post-processing. Metadata — model version, solver version, boundary conditions, run status, owner, and lineage — is tiny but demands transactional consistency and fast queries. Derived artifacts such as images, animations, and reduced-order models are medium-sized and read-heavy.

A POSIX file system excels at the first and fourth classes: it offers byte-range locking, memory-mapped I/O, and the familiar directory semantics that solvers expect. It degrades badly when a directory accumulates 200,000 result files, because metadata operations become the bottleneck. An object store handles the second class elegantly — immutable, versioned, replicated blobs addressed by key — but cannot be mounted as a scratch directory for a solver that expects fseek() semantics. A relational database is the right home for the third class, but storing a 40 GB .odb as a BLOB is an anti-pattern that bloats backups and defeats streaming.

A useful rule of thumb: if a solver writes it during a run, it belongs on a POSIX file system or a parallel scratch tier. If a human or a report queries it, it belongs in a database. If it must be retained for years and read occasionally, it belongs in an object store.

POSIX File Systems: The Working Tier

The working tier must deliver high sequential throughput and low metadata latency. For a crash solver writing 500 MB per time step across 64 MPI ranks, aggregate write bandwidth of 5–10 GB/s is typical on a parallel file system such as Lustre or GPFS. The critical configuration detail is striping: a single large result file should be spread across many OSTs (object storage targets) so that all ranks write in parallel. A common starting point is a stripe count of 4–8 and a stripe size of 1–4 MB, tuned by observing per-OST utilization during a representative run.

Directory layout matters as much as hardware. A flat directory with 100,000 files forces the file system to scan large directories on every ls or backup. A date- and job-partitioned hierarchy keeps directory sizes bounded:

/scratch/cae/2024/11/18/job_48213/
    model/          # input decks, includes
    run/            # solver scratch, restart files
    results/        # .odb, .rst, .h3d
    logs/           # solver stdout, .sta, .msg

Retention on the working tier should be short — typically 7 to 30 days after run completion. The working tier is not an archive; it is a staging area whose contents are promoted to durable storage once validated.

Object Stores: The Durable Tier

Object stores (S3-compatible services, Ceph RGW, Azure Blob) provide virtually unlimited capacity, eleven-nines durability through erasure coding or replication, and immutable versioning. They are ideal for result archives, released model baselines, and derived artifacts. The key design decision is the key naming scheme, because object stores have flat namespaces and list operations are expensive at scale.

A workable convention encodes project, model, analysis, and revision in the key prefix so that lifecycle policies and access controls can be applied by prefix:

s3://cae-archive/proj_veh7/crash/frontal_40mph/rev03/
    results/odb/frontal_40mph.odb
    results/odb/frontal_40mph.odb.sha256
    inputs/model.key
    manifest.json

Two operational details are frequently overlooked. First, integrity verification: store a SHA-256 checksum alongside every uploaded object and verify it on download, because silent corruption during long-term retention is rare but catastrophic when it occurs. Second, lifecycle tiering: transition objects older than 90 days to infrequent-access or cold storage classes, and expire incomplete multipart uploads after 7 days to prevent orphaned parts from consuming capacity.

Databases: The Metadata and Query Tier

The metadata database is the system of record for what exists and what it means. A minimal but sufficient schema for CAE traceability includes an analysis table (project, model, analysis type, solver, solver version, status), a run table (analysis ID, start/end time, compute resource, exit code), and an artifact table (run ID, storage URI, checksum, size, format). The artifact table stores only the URI and checksum — never the payload.

Indexes should target the queries that actually occur: "all runs of model X in the last 30 days," "all failed runs on solver version 2023.2," "which analyses used boundary condition set BC-17." A composite index on (model_id, created_at) and a separate index on (solver_version, status) cover most of these. For lineage queries that traverse model-to-analysis-to-result chains, a graph database or a recursive CTE in PostgreSQL is preferable to ad-hoc joins.

Do not store result files as database BLOBs. A 40 GB .odb in a BLOB column inflates backup windows, breaks streaming post-processing, and forces the database to become a file server. Store the URI and checksum; keep the bytes in the object store.

Hybrid Architecture: The Practical Default

In practice, mature CAE data management deployments combine all three tiers behind a single logical namespace. The working tier (parallel file system) hosts active runs; on completion, a promotion service computes checksums, uploads results to the object store, and writes the artifact record to the metadata database. Users and post-processing tools resolve a logical path through the database to the correct physical URI, so the migration from scratch to archive is invisible to them.

The diagram below shows this three-tier flow, including the promotion gate where validation decides whether data moves to durable storage or is quarantined.

Working Tier (POSIX) Parallel FS: Lustre / GPFS Solver scratch & restart Active .odb / .rst / .h3d Retention: 7–30 days Promotion Gate Checksum verify Exit code check Manifest generation pass → promote Durable Tier (Object Store) S3 / Ceph RGW / Azure Blob Immutable versioned blobs Lifecycle: hot → cold Metadata Tier (Database) PostgreSQL / graph DB Analysis / run / artifact URI + SHA-256 + lineage Quarantine Checksum mismatch or non-zero exit Logical Namespace (resolved via metadata DB) cae://proj_veh7/crash/frontal_40mph/rev03 → physical URI per tier Users and post-processing tools never address physical paths directly write-heavy, low latency read-once, durable, versioned transactional, queryable

Choosing and Tuning the Hybrid

The promotion gate is where data quality is enforced. A minimal promotion script should verify the solver exit code, compute a SHA-256 of each result file, compare it against the solver-reported checksum if available, upload to the object store with the checksum as object metadata, and only then insert the artifact record. If any step fails, the run is marked QUARANTINED in the database and the bytes remain on the working tier for inspection rather than being silently archived.

Two tuning parameters dominate hybrid performance. The promotion batch size controls how many files move per transaction; batching 50–200 files per upload reduces per-object overhead while keeping failure blast radius small. The cache retention window on the working tier determines how often post-processing must fetch from the object store; keeping results on scratch for 14 days after promotion covers the typical review cycle without exhausting capacity.

Data classTypical sizeAccess patternRecommended tier
Input decks, solver modelsKB–MBRead-heavy, versionedObject store + DB record
Active solver scratchGB–TBWrite-heavy, sequentialParallel POSIX FS
Result files (.odb, .rst)GB–TBWrite-once, sequential readPOSIX → object store
Metadata, lineageKBTransactional, query-heavyRelational / graph DB
Derived artifactsMB–GBRead-heavyObject store

The practical takeaway is that storage architecture is a mapping problem, not a product choice. Identify each data class, assign it to the tier whose access semantics match, and make the transitions between tiers automatic and verified. When the promotion gate is rigorous and the logical namespace is stable, users experience a single coherent store while the underlying tiers do what each does best.