========= Changelog ========= All notable changes to Cocoa will be documented in this file. The format is based on `Keep a Changelog `_, and this project adheres to `Semantic Versioning `_. [0.3.0] - 2026-07-20 -------------------- Added ^^^^^ - GAHM parametric hurricane vortex forcing (``cocoa_vortex``), with ATCF b-deck parsing and missing-central-pressure estimation. - GRIB2 meteorological forcing via ecCodes (``cocoa_ENABLE_GRIB``). - Multi-source meteorological composition: self-contained ``domains:`` entries, per-source wind reduction, and per-source activation ramps. - Full OWI NWS13 support. - Grouped mesh NetCDF format with a content-based fingerprint (``mesh_id``); ``utils/cocoa_mesh_tools.py`` converts and checksums. - Configuration schema validation on valijson (JSON Schema draft-07), with the schema embedded in the binary and reproduced in the user guide. - External YAML inclusion at designated configuration nodes. - Checkpoint/restart rework: timestamped single files, format version 3. - Google Benchmark suite with scaling analysis, compile-gated in CI. - New dependencies: valijson and CLI11 (CPM-fetched); ecCodes (optional, GRIB builds only). Changed ^^^^^^^ - Asynchronous I/O is now always on. Output is delivered on a background writer thread and meteorological input is pre-read ahead of need, overlapping file access with computation in every run. MPI is initialized with ``MPI_THREAD_FUNNELED`` to support this; a run aborts at startup if the MPI build cannot provide it. - Command-line parsing moved to CLI11: ``--option=value`` spellings now work, malformed values fail loudly, and ``--help``/``--version`` follow standard Unix formatting. - Boolean configuration values must be ``true``/``false``; the YAML 1.1 spellings are rejected. - CF NetCDF pressure units are read from the file and required. - "Hot start" is now "checkpoint" throughout the configuration and docs. Performance ^^^^^^^^^^^ - Explicit solver per-step host stalls eliminated, worth roughly 13-15% throughput on a 1.57M-node hurricane case with meteorology; momentum nodal assembly reduced from three sweeps to one; wet/dry list compaction with no per-step device allocation; cached MPI ghost staging and device-direct boundary forcing scatter. Deprecated ^^^^^^^^^^ - N/A Removed ^^^^^^^ - The ``--asyncio`` command-line flag and its modes. Asynchronous output is now unconditional, so there is no mode to select. The dedicated-MPI-I/O-rank mode (``--asyncio=mpi``) has been removed; all ranks now participate in computation. - The A/B checkpoint file pair and the FNV-1a mesh topology checksum, superseded by timestamped checkpoints and ``mesh_id``. Fixed ^^^^^ - MPI runs fail fast on rank-local errors instead of hanging peers until walltime. - Land-boundary normals at multi-string junction nodes average the per-string normals (a documented deviation from ADCIRC's last-wins). - Binary-inexact time steps (e.g. 0.1 s) no longer drop the final step. Security ^^^^^^^^ - N/A Migration Guide --------------- Migrating from ADCIRC ^^^^^^^^^^^^^^^^^^^^^ Converting Mesh Files """"""""""""""""""""" Cocoa uses NetCDF format for mesh files instead of ADCIRC's fort.14/fort.13 format. A conversion script is provided in the ``utils`` directory: .. code-block:: bash python utils/cocoa_mesh_tools.py from_adcirc \ --mesh fort.14 \ --attributes fort.13 \ --output mesh.nc **Arguments:** - ``--mesh``: ADCIRC mesh file (fort.14) - required - ``--attributes``: ADCIRC nodal attributes file (fort.13) - optional - ``--output``: Output NetCDF file path - required Configuration Files """"""""""""""""""" Cocoa uses YAML configuration files instead of ADCIRC's fort.15 format. Key differences: .. list-table:: :header-rows: 1 * - ADCIRC Parameter - Cocoa Equivalent * - DT - ``simulation.time_step`` * - TAU0 - ``physics.tau0`` * - STATIM - ``simulation.start_time`` * - RNDAY - ``simulation.end_time`` .. note:: In ADCIRC, a negative TAU0 value triggers spatially-varying computation. In Cocoa, ``tau0`` must always be a positive constant value. Example conversion: **ADCIRC fort.15**: .. code-block:: text DT = 2.0 TAU0 = 0.005 RNDAY = 1.0 **Cocoa YAML**: .. code-block:: yaml simulation: time_step: 2s start_time: 2025-01-01 end_time: 2025-01-02 physics: tau0: 0.005