Catalog PyPI
PACKAGE EXPLORERView in registry

aerosim-cfdmod

PyPI

Tools for analysis of CFD cases

Versions collected1
Direct dependencies26From release 3.9.0
Last observed20 Oct, 20:48 UTC

README

Version 3.9.0 documentation

cfdmod

Testing Pipeline Docs Deploy Linting Workflow Release artifacts

Post-processing and geometry-preparation tools for CFD wind-tunnel simulations: pressure (Cp), force (Cf), moment (Cm) and shape (Ce) coefficients; terrain loft and roughness elements; inflow analysis; climate / Weibull / Gumbel statistics; ParaView snapshot automation.

v3 reorganizes post-processing around a single data structure -- the DataSource (elements on one axis, timesteps on the other, named fields plus metadata) -- and composable ops driven by YAML pipeline templates. Every flow (Cp / Cf / Cm / Ce, S1, ...) is now a template run with cfdmod run <template.yaml>; the legacy per-coefficient functions (run_cp / run_cf / ...) and their *CaseConfig models are gone. See docs/source/architecture/v3_migration.md for the mapping and docs/source/architecture/data_sources.md for the paradigm.

Install

Base install (Cp / Cf / Cm / Ce pipeline, IO helpers, CLI):

pip install aerosim-cfdmod

Optional extras:

ExtrasWhen you need it
[vtk]ParaView snapshot automation, VTK polydata writers, S1 probe-on-line
[geometry]Altimetry section + loft helpers (trimesh)
[notebook]jupyter / ipykernel for the worked-example notebook
[docs]sphinx + shibuya theme + nbsphinx for make html
[legacy]pandas-HDFStore compat readers (inflow, HFPI static)

Install several at once with pip install "aerosim-cfdmod[vtk,geometry,notebook]".

pymeshlab is intentionally not an extra (its GPL license would force GPL on downstream code). Code paths that genuinely need it expect the user to install it explicitly at their own license risk.

Quickstart

A pipeline is a YAML template: inputs (data sources on disk), a pipeline of ops, and outputs. Run it with the CLI:

cfdmod run path/to/cp.yaml

A minimal Cp template -- subtract a static-pressure probe, divide by the dynamic pressure, reduce to per-triangle statistics:

name: cp
inputs:
  body:                          # surface pressure per triangle per timestep
    kind: surface
    path: bodies.my_case         # -> bodies.my_case.h5 (+ .xdmf)
  p_ref:                         # static reference probe. Must be named points.*
    kind: points
    path: points.static_pressure
pipeline:
  - id: cp_unscaled              # p - p_ref  (column-wise broadcast)
    kind: sub
    source: body
    rhs: p_ref
    field: pressure
    out: cp
  - id: cp_t                     # / dynamic pressure q  (scale = 1/q)
    kind: scale
    source: cp_unscaled
    field: cp
    factor: 800.0
  - id: cp_stats                 # collapse the time axis
    kind: statistics
    source: cp_t
    field: cp
    kinds: [mean, rms, min, max]
outputs:
  cp_timeseries: {source: cp_t, path: out/cp.time_series}
  cp_stats:      {source: cp_stats, path: out/cp.stats}

Or drive it from Python over any storage backend -- the same recipe code runs against an in-memory store (great for notebooks / tests, no files needed) or the on-disk XDMF+H5 store:

from cfdmod import load_template, run_template, XdmfH5Storage

template = load_template("cp.yaml")
bindings = run_template(template, storage=XdmfH5Storage(root="."))
cp_t = bindings["cp_t"]          # a SurfaceDataSource; cp_t.fields.read("cp")

load_template validates the whole template up front (unknown op kinds, dangling source/rhs refs, duplicate ids, typo'd fields) before any file is read.

Filename convention: the XDMF+H5 storage infers a source's kind from its filename -- a probe must be named points.* to load as a points source; everything else loads as a surface. The kind: you declare in the template is checked against the loaded kind.

Cf / Cm / Ce build on a Cp time series by attaching the mesh (mesh_attach), grouping triangles (body_grouping / zoning_grouping), and aggregating (force_contribution / moment_contribution + field_series_for_groups). Complete, runnable templates for all four ship under fixtures/tests/pressure/templates/.

Examples

  • Tutorials (notebooks/tutorials/): 01_data_sources -> 02_recipes -> 03_pipelines -> 04_containers, building from the data structure to full pipelines. All run on synthetic data with no fixtures.
  • Per-coefficient walkthroughs (docs/source/use_cases/pressure/coefficients/): calculate_{cp,Cf,Cm,Ce}.ipynb run the shipped templates against the bundled galpao wind-tunnel fixture.
  • End-to-end (examples/container_pack/process_container_pack.ipynb): a Cp/Cf/Cm/Ce pipeline over a multi-container body.
  • High-rise suite (examples/high_rise/): staged wind-load post-processing (inflow -> Cp -> per-floor Cf/Cm -> dynamic -> facade -> structure).
  • Template reference: fixtures/tests/pressure/templates/{cp,cf,cm,ce}.yaml.

Smoothing as a pipeline step

Signal smoothing is just another op -- insert a moving_average step and downstream ops consume the smoothed field. The window is in the source's time units; no implicit unit conversion.

  - id: cp_smoothed
    kind: moving_average
    source: cp_t
    field: cp
    window: 3.0
    out: cp

CLI

cfdmod run <template.yaml>     # run a v3 pipeline template
cfdmod loft ...                # terrain loft surfaces
cfdmod roughness ...           # roughness elements (linear / radial)
cfdmod regroup ...             # split/reorder mesh triangles via a grouping chain
cfdmod altimetry ...           # altimetry section profiles

python -m cfdmod <command> works identically. cfdmod run prints a one-line error (not a traceback) on a bad template and exits non-zero.

Development

Tests

The suite is grouped by pytest markers:

uv run pytest                          # full default suite (excludes -m perf)
uv run pytest -m unit                  # pure-function tests
uv run pytest -m integration           # end-to-end pipeline tests
uv run pytest -m perf                  # opt-in synthetic big-data benchmarks
uv run pytest tests/core tests/adapters  # the v3 data-source / storage layer

The perf run writes a markdown + JSON report (Python heap peak + RSS per scale) to output/perf/perf_report.{md,json} so regressions across releases are tracked over time.

Tox

uv run tox

Memory profiling

pip install -U memory-profiler
mprof run -C -M python path_to_script.py
mprof plot

Schemas

Generate JSON Schema for every config model:

uv run python -m scripts.generate_schemas

In VSCode, point yaml.schemas at the generated file:

"yaml.schemas": {
    "file:///path/to/cfdmod/output/schema-cfdmod.json": "**/cfdmod/**/*.yaml"
}

Downloads & popularity

11downloads
1-day window · source-reported counts20 Oct 2026
3341670
2026-07-23: 106 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-23–2026-07-232026-07-24: 19 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-24–2026-07-242026-07-25: 3 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-25–2026-07-252026-07-26: 6 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-26–2026-07-262026-07-27: 8 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-27–2026-07-272026-07-28: 334 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-28–2026-07-282026-07-29: 25 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-29–2026-07-292026-07-30: 15 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-30–2026-07-302026-07-31: 17 · observed 2026-10-21T15:21:37.0862370Z · period 2026-07-31–2026-07-312026-08-01: 12 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-01–2026-08-012026-08-02: 13 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-02–2026-08-022026-08-03: 29 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-03–2026-08-032026-08-04: 24 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-04–2026-08-042026-08-05: 12 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-05–2026-08-052026-08-06: 25 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-06–2026-08-062026-08-07: 7 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-07–2026-08-072026-08-08: 8 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-08–2026-08-082026-08-09: 10 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-09–2026-08-092026-08-10: 12 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-10–2026-08-102026-08-11: 9 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-11–2026-08-112026-08-12: 1 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-12–2026-08-122026-08-13: 3 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-13–2026-08-132026-08-14: 5 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-14–2026-08-142026-08-15: 5 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-15–2026-08-152026-08-16: 1 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-16–2026-08-162026-08-17: 5 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-17–2026-08-172026-08-18: 3 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-18–2026-08-182026-08-19: 1 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-19–2026-08-192026-08-20: 4 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-20–2026-08-202026-08-21: 2 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-21–2026-08-212026-08-22: 2 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-22–2026-08-222026-08-23: 13 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-23–2026-08-232026-08-24: 12 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-24–2026-08-242026-08-25: 2 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-25–2026-08-252026-08-26: 5 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-26–2026-08-262026-08-27: 3 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-27–2026-08-272026-08-28: 4 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-28–2026-08-282026-08-29: 5 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-29–2026-08-292026-08-30: 1 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-30–2026-08-302026-08-31: 7 · observed 2026-10-21T15:21:37.0862370Z · period 2026-08-31–2026-08-312026-09-01: 14 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-01–2026-09-012026-09-02: 1 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-02–2026-09-022026-09-03: 4 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-03–2026-09-032026-09-04: 116 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-04–2026-09-042026-09-05: 26 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-05–2026-09-052026-09-06: 9 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-06–2026-09-062026-09-07: 24 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-07–2026-09-072026-09-08: 13 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-08–2026-09-082026-09-09: 10 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-09–2026-09-092026-09-10: 11 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-10–2026-09-102026-09-11: 9 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-11–2026-09-112026-09-12: 82 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-12–2026-09-122026-09-13: 31 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-13–2026-09-132026-09-14: 27 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-14–2026-09-142026-09-15: 12 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-15–2026-09-152026-09-16: 42 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-16–2026-09-162026-09-17: 18 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-17–2026-09-172026-09-18: 8 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-18–2026-09-182026-09-19: 31 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-19–2026-09-192026-09-20: 4 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-20–2026-09-202026-09-21: 9 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-21–2026-09-212026-09-22: 25 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-22–2026-09-222026-09-23: 16 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-23–2026-09-232026-09-24: 41 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-24–2026-09-242026-09-25: 35 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-25–2026-09-252026-09-26: 7 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-26–2026-09-262026-09-27: 14 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-27–2026-09-272026-09-28: 24 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-28–2026-09-282026-09-29: 17 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-29–2026-09-292026-09-30: 26 · observed 2026-10-21T15:21:37.0862370Z · period 2026-09-30–2026-09-302026-10-01: 25 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-01–2026-10-012026-10-02: 18 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-02–2026-10-022026-10-03: 1 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-03–2026-10-032026-10-04: 8 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-04–2026-10-042026-10-05: 17 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-05–2026-10-052026-10-06: 9 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-06–2026-10-062026-10-07: 8 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-07–2026-10-072026-10-08: 28 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-08–2026-10-082026-10-09: 8 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-09–2026-10-092026-10-10: 3 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-10–2026-10-102026-10-11: 13 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-11–2026-10-112026-10-12: 36 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-12–2026-10-122026-10-13: 16 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-13–2026-10-132026-10-14: 14 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-14–2026-10-142026-10-15: 15 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-15–2026-10-152026-10-16: 28 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-16–2026-10-162026-10-17: 8 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-17–2026-10-172026-10-18: 12 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-18–2026-10-182026-10-19: 10 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-19–2026-10-192026-10-20: 11 · observed 2026-10-21T15:21:37.0862370Z · period 2026-10-20–2026-10-20
23 Jul20 Oct

pypistats · 90 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-20 – 2026-10-20112026-10-21T15:21:37.0862370Z
2026-10-19 – 2026-10-19102026-10-21T15:21:37.0862370Z
2026-10-18 – 2026-10-18122026-10-21T15:21:37.0862370Z
2026-10-17 – 2026-10-1782026-10-21T15:21:37.0862370Z
2026-10-16 – 2026-10-16282026-10-21T15:21:37.0862370Z
2026-10-15 – 2026-10-15152026-10-21T15:21:37.0862370Z
2026-10-14 – 2026-10-14142026-10-21T15:21:37.0862370Z
2026-10-13 – 2026-10-13162026-10-21T15:21:37.0862370Z
2026-10-12 – 2026-10-12362026-10-21T15:21:37.0862370Z
2026-10-11 – 2026-10-11132026-10-21T15:21:37.0862370Z
2026-10-10 – 2026-10-1032026-10-21T15:21:37.0862370Z
2026-10-09 – 2026-10-0982026-10-21T15:21:37.0862370Z
2026-10-08 – 2026-10-08282026-10-21T15:21:37.0862370Z
2026-10-07 – 2026-10-0782026-10-21T15:21:37.0862370Z
2026-10-06 – 2026-10-0692026-10-21T15:21:37.0862370Z
2026-10-05 – 2026-10-05172026-10-21T15:21:37.0862370Z
2026-10-04 – 2026-10-0482026-10-21T15:21:37.0862370Z
2026-10-03 – 2026-10-0312026-10-21T15:21:37.0862370Z
2026-10-02 – 2026-10-02182026-10-21T15:21:37.0862370Z
2026-10-01 – 2026-10-01252026-10-21T15:21:37.0862370Z
2026-09-30 – 2026-09-30262026-10-21T15:21:37.0862370Z
2026-09-29 – 2026-09-29172026-10-21T15:21:37.0862370Z
2026-09-28 – 2026-09-28242026-10-21T15:21:37.0862370Z
2026-09-27 – 2026-09-27142026-10-21T15:21:37.0862370Z
2026-09-26 – 2026-09-2672026-10-21T15:21:37.0862370Z
2026-09-25 – 2026-09-25352026-10-21T15:21:37.0862370Z
2026-09-24 – 2026-09-24412026-10-21T15:21:37.0862370Z
2026-09-23 – 2026-09-23162026-10-21T15:21:37.0862370Z
2026-09-22 – 2026-09-22252026-10-21T15:21:37.0862370Z
2026-09-21 – 2026-09-2192026-10-21T15:21:37.0862370Z
2026-09-20 – 2026-09-2042026-10-21T15:21:37.0862370Z
2026-09-19 – 2026-09-19312026-10-21T15:21:37.0862370Z
2026-09-18 – 2026-09-1882026-10-21T15:21:37.0862370Z
2026-09-17 – 2026-09-17182026-10-21T15:21:37.0862370Z
2026-09-16 – 2026-09-16422026-10-21T15:21:37.0862370Z
2026-09-15 – 2026-09-15122026-10-21T15:21:37.0862370Z
2026-09-14 – 2026-09-14272026-10-21T15:21:37.0862370Z
2026-09-13 – 2026-09-13312026-10-21T15:21:37.0862370Z
2026-09-12 – 2026-09-12822026-10-21T15:21:37.0862370Z
2026-09-11 – 2026-09-1192026-10-21T15:21:37.0862370Z
2026-09-10 – 2026-09-10112026-10-21T15:21:37.0862370Z
2026-09-09 – 2026-09-09102026-10-21T15:21:37.0862370Z
2026-09-08 – 2026-09-08132026-10-21T15:21:37.0862370Z
2026-09-07 – 2026-09-07242026-10-21T15:21:37.0862370Z
2026-09-06 – 2026-09-0692026-10-21T15:21:37.0862370Z
2026-09-05 – 2026-09-05262026-10-21T15:21:37.0862370Z
2026-09-04 – 2026-09-041162026-10-21T15:21:37.0862370Z
2026-09-03 – 2026-09-0342026-10-21T15:21:37.0862370Z
2026-09-02 – 2026-09-0212026-10-21T15:21:37.0862370Z
2026-09-01 – 2026-09-01142026-10-21T15:21:37.0862370Z
2026-08-31 – 2026-08-3172026-10-21T15:21:37.0862370Z
2026-08-30 – 2026-08-3012026-10-21T15:21:37.0862370Z
2026-08-29 – 2026-08-2952026-10-21T15:21:37.0862370Z
2026-08-28 – 2026-08-2842026-10-21T15:21:37.0862370Z
2026-08-27 – 2026-08-2732026-10-21T15:21:37.0862370Z
2026-08-26 – 2026-08-2652026-10-21T15:21:37.0862370Z
2026-08-25 – 2026-08-2522026-10-21T15:21:37.0862370Z
2026-08-24 – 2026-08-24122026-10-21T15:21:37.0862370Z
2026-08-23 – 2026-08-23132026-10-21T15:21:37.0862370Z
2026-08-22 – 2026-08-2222026-10-21T15:21:37.0862370Z
2026-08-21 – 2026-08-2122026-10-21T15:21:37.0862370Z
2026-08-20 – 2026-08-2042026-10-21T15:21:37.0862370Z
2026-08-19 – 2026-08-1912026-10-21T15:21:37.0862370Z
2026-08-18 – 2026-08-1832026-10-21T15:21:37.0862370Z
2026-08-17 – 2026-08-1752026-10-21T15:21:37.0862370Z
2026-08-16 – 2026-08-1612026-10-21T15:21:37.0862370Z
2026-08-15 – 2026-08-1552026-10-21T15:21:37.0862370Z
2026-08-14 – 2026-08-1452026-10-21T15:21:37.0862370Z
2026-08-13 – 2026-08-1332026-10-21T15:21:37.0862370Z
2026-08-12 – 2026-08-1212026-10-21T15:21:37.0862370Z
2026-08-11 – 2026-08-1192026-10-21T15:21:37.0862370Z
2026-08-10 – 2026-08-10122026-10-21T15:21:37.0862370Z
2026-08-09 – 2026-08-09102026-10-21T15:21:37.0862370Z
2026-08-08 – 2026-08-0882026-10-21T15:21:37.0862370Z
2026-08-07 – 2026-08-0772026-10-21T15:21:37.0862370Z
2026-08-06 – 2026-08-06252026-10-21T15:21:37.0862370Z
2026-08-05 – 2026-08-05122026-10-21T15:21:37.0862370Z
2026-08-04 – 2026-08-04242026-10-21T15:21:37.0862370Z
2026-08-03 – 2026-08-03292026-10-21T15:21:37.0862370Z
2026-08-02 – 2026-08-02132026-10-21T15:21:37.0862370Z
2026-08-01 – 2026-08-01122026-10-21T15:21:37.0862370Z
2026-07-31 – 2026-07-31172026-10-21T15:21:37.0862370Z
2026-07-30 – 2026-07-30152026-10-21T15:21:37.0862370Z
2026-07-29 – 2026-07-29252026-10-21T15:21:37.0862370Z
2026-07-28 – 2026-07-283342026-10-21T15:21:37.0862370Z
2026-07-27 – 2026-07-2782026-10-21T15:21:37.0862370Z
2026-07-26 – 2026-07-2662026-10-21T15:21:37.0862370Z
2026-07-25 – 2026-07-2532026-10-21T15:21:37.0862370Z
2026-07-24 – 2026-07-24192026-10-21T15:21:37.0862370Z
2026-07-23 – 2026-07-231062026-10-21T15:21:37.0862370Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
3.9.012 Sept 202626

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
aerosim-cfd/cfdmod

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 20:48 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:2aa89c22d1b275ce32520f54c9bb0251d4b9fcb39998d54ddb405658d7b70f87