Shareable Configuration#
Ever wanted to share your regional MOM6 setup? Get a summary of your unique changes? Let someone else easily run your model? This module is for you!
Importable through CrocoDash.shareable, the module lets you:
Bundle - Inspect an existing CESM case, identify what makes it unique, and package it into a portable folder
Fork - Recreate a case from a bundle, with optional modifications
Duplicate - One-step shortcut to copy a case to a new location, reading machine/project/cesmroot automatically from the original
Workflow#
Step 1 — Bundle#
from CrocoDash.shareable.bundle import BundleCrocoDashCase
case = BundleCrocoDashCase("/path/to/caseroot")
# Write the bundle — automatically diffs against a standard case first
bundle_path = case.bundle("/path/to/output_dir")
If you need to override the machine or project used for the diff (e.g. generating a bundle on a different machine than the original), pass them explicitly:
bundle_path = case.bundle("/path/to/output_dir", machine="derecho", project="PROJ123")
The bundle folder contains:
manifest.json— grid paths, forcing config, all case metadatanon_standard_case_info.json— diff against a standard caseocnice/— ocean/ice input files plus grid filesuser_nl_*files,replay.shxml_files/andSourceMods/— any non-standard modifications
Step 2 — Fork#
from CrocoDash.shareable.fork import ForkCrocoDashBundle
forker = ForkCrocoDashBundle("/path/to/bundle")
case = forker.fork(
cesmroot="/path/to/cesm",
machine="derecho",
project_number="PROJ123",
new_caseroot="/path/to/new_case",
new_inputdir="/path/to/new_inputdir",
)
By default fork() is interactive — it will ask you which non-standard items to copy over (XML files, user_nl params, SourceMods, xmlchanges) and whether you want to change the compset.
Non-interactive fork#
All prompts can be bypassed by passing arguments directly:
case = forker.fork(
cesmroot="/path/to/cesm",
machine="derecho",
project_number="PROJ123",
new_caseroot="/path/to/new_case",
new_inputdir="/path/to/new_inputdir",
plan={"xml_files": True, "user_nl": True, "source_mods": False, "xmlchanges": True},
compset="GOMOM6", # omit to keep the bundle's compset
extra_configs=["tides"], # additional forcing configs to add
remove_configs=["bgc"], # forcing configs to drop
extra_forcing_args_path="/path/to/args.json", # only needed if adding new configs
)
Any argument left as None (the default) will still prompt interactively, so you can pre-supply only some of them.
Duplicate (one-step shortcut)#
If you just want an exact copy of an existing case without any modifications, use duplicate_case. It reads machine, project, and cesmroot directly from the original caseroot — no extra arguments needed.
from CrocoDash.shareable.bundle import duplicate_case
new_case = duplicate_case(
caseroot="/path/to/existing_case",
new_caseroot="/path/to/new_case",
new_inputdir="/path/to/new_inputdir",
)
The bundle is written into new_caseroot and kept there after duplicating. You can also specify a custom location:
new_case = duplicate_case(
caseroot="/path/to/existing_case",
new_caseroot="/path/to/new_case",
new_inputdir="/path/to/new_inputdir",
bundle_dir="/path/to/bundle",
)
Command Line#
After installing CrocoDash (pip install -e .), a crocodash command is available.
Bundle#
crocodash bundle \
--caseroot /path/to/case \
--output-dir /path/to/bundle_dir \
--cesmroot /path/to/cesm \
--machine derecho \
--project PROJ123
Fork#
# Interactive
crocodash fork \
--bundle /path/to/bundle \
--caseroot /path/to/new_case \
--inputdir /path/to/new_inputdir \
--cesmroot /path/to/cesm \
--machine derecho \
--project PROJ123
# Non-interactive
crocodash fork \
--bundle /path/to/bundle \
--caseroot /path/to/new_case \
--inputdir /path/to/new_inputdir \
--cesmroot /path/to/cesm \
--machine derecho \
--project PROJ123 \
--plan '{"xml_files": true, "user_nl": true, "source_mods": false, "xmlchanges": true}' \
--compset GOMOM6 \
--extra-configs tides,bgc \
--remove-configs runoff \
--extra-forcing-args /path/to/args.json
All fork flags beyond the six required ones are optional and only needed to bypass the interactive prompts.
Duplicate#
crocodash duplicate \
--source /path/to/existing_case \
--case /path/to/new_case \
--inputdir /path/to/new_inputdir
Machine, project, and cesmroot are read automatically from the original case. Optionally specify where to keep the bundle:
crocodash duplicate \
--source /path/to/existing_case \
--case /path/to/new_case \
--inputdir /path/to/new_inputdir \
--bundle-dir /path/to/bundle
What gets diffed?#
identify_non_standard_CrocoDash_case_information creates a temporary standard case with the same grid, topo, and forcing configuration, then diffs your case against it. The diff captures:
XML files present in your case but not in the standard one
user_nl_*parameters added on top of defaultsxmlchangecommands inreplay.shnot present by defaultFiles in
SourceMods/
Apply helpers#
CrocoDash.shareable.apply contains the low-level functions used by Fork internally. Savvy users can call these directly to transfer individual pieces of one case to another:
from CrocoDash.shareable.apply import (
copy_xml_files_from_case,
copy_user_nl_params_from_case,
copy_source_mods_from_case,
apply_xmlchanges_to_case,
copy_configurations_to_case,
)