csemx example bundles

Synthetic, validating example bundles covering a compact set of representative controlled-source EM acquisition styles. Values are order-of-magnitude synthetic responses, not real survey data or benchmark forward responses. Validate the CSV-only examples with:

python3 tools/validate_csemx.py examples/<name>.csemx

The mixed Parquet example requires pyarrow in the Python environment running the validator.

The public example set is:

public bundle configuration exercises
example.csemx mixed land/borehole sampler (matches spec §12) every geometry flavor: wire/loop/point Tx, E-wire/B-point/B-loop Rx; UTC acquisition timestamps
example_mixed_parquet.csemx same geometry as example.csemx, with data.parquet mixed CSV/Parquet delivery; string-typed IDs in Parquet
land_dipole_dipole.csemx land CSEM, inline dipole–dipole grounded HED Tx + inline E-dipole Rx at increasing offset; tx_fundamental; use=0; NaN missing datum; ext_line_id extension
seafloor_vector.csemx seafloor node + deep-towed 300 m HED moving Tx; altitude.reference: seafloor; vertical Ez dipole; negative elev; use flag
airborne_hem.csemx airborne frequency-domain EM (HEM) moving point-dipole bird; coplanar vs coaxial via azimuth_deg/dip_deg; altitude.reference: ground; field.content: secondary (secondary T/A, primary from geometry; ppm is derived)

Each .csemx directory is an unpacked bundle (manifest.yaml + the five tables, plus an optional notes.md); example.csemx.zip is the archived form showing the preferred single-top-level-directory delivery shape.

Most example bundles are kept in CSV form for readability. The v1.0 specification allows any required table to be delivered as Parquet (<table>.parquet) instead of CSV; example_mixed_parquet.csemx exercises that path by using data.parquet.