This notebook demonstrates how to use CstarSpecEngine to build all domain configurations from domains.yml in a single workflow.
CstarSpecEngine Overview¶
CstarSpecEngine is the high-level interface for managing ROMS model configurations and builds. It provides methods to:
Generate single domains: Build one domain at a time using
generate_domain()Generate multiple domains: Build all domains from
domains.ymlusinggenerate_all()Run simulations: Execute model runs using
run_all()
The engine reads domain configurations from domains.yml and model specifications from models.yml, orchestrating the complete workflow from input generation through model compilation.
Batch Processing¶
The generate_all() method processes all domains defined in domains.yml sequentially. This is useful for:
Batch workflows: Generating multiple domain configurations in one operation
Consistent settings: Applying the same parameters (clobber flags, settings overrides) to all domains
Error handling: The method continues processing remaining domains even if one fails, reporting all errors at the end
Each domain goes through the complete workflow: PRECONFIG → Source Data → POSTCONFIG → BUILD → Pre-run.
Workflow Stages¶
For each domain, generate_all() executes the complete workflow:
PRECONFIG: Initialize blueprint and grid object
Source Data: Download and prepare required datasets (GLORYS, UNIFIED, SRTM15, etc.)
POSTCONFIG: Generate all input files (grid, initial conditions, forcing)
BUILD: Render configuration templates and compile the model executable
Pre-run: Prepare for execution (partitioning, etc.)
The method returns a dictionary mapping domain names to CstarSpecBuilder instances, stored in engine.builder.
Setup¶
Enable autoreload for development and import the package.
%load_ext autoreload
%autoreload 2Generate All Domains¶
Create a CstarSpecEngine instance and generate all domains from domains.yml.
Parameters:
clobber_inputs: IfTrue, overwrite existing input files for all domainsclobber_source_data: IfTrue, re-download source datasetspartition_files: IfTrue, partition input files across tilestest: IfTrue, truncate generation loop after 2 iterations (for testing)compile_time_settings: Optional dict of compile-time settings overridesrun_time_settings: Optional dict of run-time settings overridesoverrides: Optional dict of configuration overrides to apply to all domains
The method returns a dictionary mapping domain names to CstarSpecBuilder instances.
import cson_forgeRun All Simulations¶
Execute model simulations for all generated domains. The run_all() method handles execution for all builders and returns execution handlers for monitoring the runs.
Note: This cell is commented out by default. Uncomment to run all simulations.
engine = cson_forge.CstarSpecEngine(domains_file="domains.yml")
builders = engine.generate_all(clobber_inputs=True)
================================================================================
Starting generation for 4 domain(s)
================================================================================
--------------------------------------------------------------------------------
[1/4] Processing domain: ccs-12km
--------------------------------------------------------------------------------
✔️ Using existing GLORYS_REGIONAL file for 2024-01-01: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_ccs-12km_20240101.nc
✔️ Using existing GLORYS_REGIONAL file for 2024-01-02: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_ccs-12km_20240102.nc
✔️ TPXO dataset verified at: /Users/mclong/cson-forge-data/source-data/TPXO/TPXO10.v2
✔️ Using existing BGC dataset: /Users/mclong/cson-forge-data/source-data/UNIFIED_BGC/BGCdataset.nc
▶️ [1/8] Writing ROMS grid...
▶️ [2/8] Generating initial conditions...
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
[########################################] | 100% Completed | 51.06 s
▶️ [3/8] Generating surface forcing...
Numba: Attempted to fork from a non-main thread, the TBB library may be in an invalid state in the child process.
[########################################] | 100% Completed | 8.85 sms
▶️ [4/8] Generating surface forcing...
[WARNING] Optional variables missing (but not critical): ['pco2_air_alt']
[########################################] | 100% Completed | 211.02 ms
▶️ [5/8] Generating boundary forcing...
[WARNING] The northern boundary is divided by land. It would be safer (but slower and more memory-intensive) to use `apply_2d_horizontal_fill = True`.
[########################################] | 100% Completed | 1.24 sms
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
▶️ [6/8] Generating boundary forcing...
[########################################] | 100% Completed | 12.56 s
▶️ [7/8] Generating tidal forcing...
[########################################] | 100% Completed | 3.28 sms
▶️ [8/8] Generating river forcing...
[WARNING] No records found at or after the end_time: 2024-01-02 00:00:00.
✅ All input files generated.
[INFO] 🛠️ Configuring ROMSSimulation
[INFO] 🔧 Setting up ROMSExternalCodeBase...
[INFO] 🔧 Setting up MARBLExternalCodeBase...
[INFO] 📦 Fetching compile-time code...
[INFO] 📦 Fetching runtime code...
[INFO] 📦 Fetching input datasets...
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_grid.nc into (16,20)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_initial_conditions.nc into (16,20)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_tidal.nc into (16,20)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_river.nc into (16,20)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_boundary-physics_202401.nc into (16,20)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_boundary-bgc_clim.nc into (16,20)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_surface-physics_202401.nc into (16,20)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_ccs-12km_320procs_surface-bgc_clim.nc into (16,20)
✓ Successfully completed domain: ccs-12km
--------------------------------------------------------------------------------
[2/4] Processing domain: gulf-guinea-toy
--------------------------------------------------------------------------------
✔️ Using existing GLORYS_REGIONAL file for 2012-01-01: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_gulf-guinea-toy_20120101.nc
✔️ Using existing GLORYS_REGIONAL file for 2012-01-02: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_gulf-guinea-toy_20120102.nc
✔️ TPXO dataset verified at: /Users/mclong/cson-forge-data/source-data/TPXO/TPXO10.v2
✔️ Using existing BGC dataset: /Users/mclong/cson-forge-data/source-data/UNIFIED_BGC/BGCdataset.nc
▶️ [1/8] Writing ROMS grid...
▶️ [2/8] Generating initial conditions...
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
[########################################] | 100% Completed | 9.14 sms
▶️ [3/8] Generating surface forcing...
[########################################] | 100% Completed | 7.65 ss
▶️ [4/8] Generating surface forcing...
[WARNING] Optional variables missing (but not critical): ['pco2_air_alt']
[########################################] | 100% Completed | 103.71 ms
▶️ [5/8] Generating boundary forcing...
[########################################] | 100% Completed | 430.38 ms
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
▶️ [6/8] Generating boundary forcing...
[########################################] | 100% Completed | 9.69 ss
▶️ [7/8] Generating tidal forcing...
[########################################] | 100% Completed | 2.00 sms
▶️ [8/8] Generating river forcing...
[WARNING] NaNs detected in 'river_volume' and set to zero. This may indicate missing river data and affect model accuracy.
✅ All input files generated.
[INFO] 🛠️ Configuring ROMSSimulation
[INFO] 🔧 Setting up ROMSExternalCodeBase...
[INFO] 🔧 Setting up MARBLExternalCodeBase...
[INFO] 📦 Fetching compile-time code...
[INFO] 📦 Fetching runtime code...
[INFO] 📦 Fetching input datasets...
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_gulf-guinea-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_gulf-guinea-toy_10procs_grid.nc into (2,5)
✗ Error processing domain gulf-guinea-toy: Dimension 'xi_coarse' of size 5 cannot be evenly divided into 2 partitions.
--------------------------------------------------------------------------------
[3/4] Processing domain: hvalfjörður-0
--------------------------------------------------------------------------------
/var/folders/x8/7n8hknbj717fxnf07pnk3pch0000gn/T/ipykernel_35535/3018024646.py:2: UserWarning: Error processing domain gulf-guinea-toy: Dimension 'xi_coarse' of size 5 cannot be evenly divided into 2 partitions.
builders = engine.generate_all(clobber_inputs=True)
✔️ Using existing GLORYS_REGIONAL file for 2024-01-01: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_hvalfjörður-0_20240101.nc
✔️ Using existing GLORYS_REGIONAL file for 2024-01-02: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_hvalfjörður-0_20240102.nc
✔️ TPXO dataset verified at: /Users/mclong/cson-forge-data/source-data/TPXO/TPXO10.v2
✔️ Using existing BGC dataset: /Users/mclong/cson-forge-data/source-data/UNIFIED_BGC/BGCdataset.nc
▶️ [1/8] Writing ROMS grid...
▶️ [2/8] Generating initial conditions...
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
[########################################] | 100% Completed | 131.24 s
▶️ [3/8] Generating surface forcing...
[########################################] | 100% Completed | 10.71 ss
[WARNING] Optional variables missing (but not critical): ['pco2_air_alt']
▶️ [4/8] Generating surface forcing...
[########################################] | 100% Completed | 209.59 ms
▶️ [5/8] Generating boundary forcing...
[########################################] | 100% Completed | 537.84 ms
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
▶️ [6/8] Generating boundary forcing...
[########################################] | 100% Completed | 16.39 s
▶️ [7/8] Generating tidal forcing...
[########################################] | 100% Completed | 1.91 sms
▶️ [8/8] Generating river forcing...
[WARNING] No records found at or after the end_time: 2024-01-02 00:00:00.
✅ All input files generated.
[INFO] 🛠️ Configuring ROMSSimulation
[INFO] 🔧 Setting up ROMSExternalCodeBase...
[INFO] 🔧 Setting up MARBLExternalCodeBase...
[INFO] 📦 Fetching compile-time code...
[INFO] 📦 Fetching runtime code...
[INFO] 📦 Fetching input datasets...
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_grid.nc into (16,16)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_initial_conditions.nc into (16,16)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_tidal.nc into (16,16)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_river.nc into (16,16)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_boundary-physics_202401.nc into (16,16)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_boundary-bgc_clim.nc into (16,16)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_surface-physics_202401.nc into (16,16)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_20240101-20240102/input_datasets/cson_roms-marbl_v0.1_hvalfjörður-0_256procs_surface-bgc_clim.nc into (16,16)
✓ Successfully completed domain: hvalfjörður-0
--------------------------------------------------------------------------------
[4/4] Processing domain: wio-toy
--------------------------------------------------------------------------------
✔️ Using existing GLORYS_REGIONAL file for 2012-01-01: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_wio-toy_20120101.nc
✔️ Using existing GLORYS_REGIONAL file for 2012-01-02: cmems_mod_glo_phy_my_0.083deg_P1D-m_REGIONAL_wio-toy_20120102.nc
✔️ TPXO dataset verified at: /Users/mclong/cson-forge-data/source-data/TPXO/TPXO10.v2
✔️ Using existing BGC dataset: /Users/mclong/cson-forge-data/source-data/UNIFIED_BGC/BGCdataset.nc
▶️ [1/8] Writing ROMS grid...
▶️ [2/8] Generating initial conditions...
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
[########################################] | 100% Completed | 28.45 ss
▶️ [3/8] Generating surface forcing...
[########################################] | 100% Completed | 8.51 sms
[WARNING] Optional variables missing (but not critical): ['pco2_air_alt']
▶️ [4/8] Generating surface forcing...
[########################################] | 100% Completed | 106.69 ms
▶️ [5/8] Generating boundary forcing...
[########################################] | 100% Completed | 2.28 sms
[WARNING] Optional variables missing (but not critical): ['Lig', 'DIC_ALT_CO2', 'Alk_ALT_CO2']
▶️ [6/8] Generating boundary forcing...
[########################################] | 100% Completed | 9.96 ss
▶️ [7/8] Generating tidal forcing...
[########################################] | 100% Completed | 4.49 sms
▶️ [8/8] Generating river forcing...
[WARNING] NaNs detected in 'river_volume' and set to zero. This may indicate missing river data and affect model accuracy.
✅ All input files generated.
[INFO] 🛠️ Configuring ROMSSimulation
[INFO] 🔧 Setting up ROMSExternalCodeBase...
[INFO] 🔧 Setting up MARBLExternalCodeBase...
[INFO] 📦 Fetching compile-time code...
[INFO] 📦 Fetching runtime code...
[INFO] 📦 Fetching input datasets...
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_grid.nc into (2,5)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_initial_conditions.nc into (2,5)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_tidal.nc into (2,5)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_river.nc into (2,5)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_boundary-physics_201201.nc into (2,5)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_boundary-bgc_clim.nc into (2,5)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_surface-physics_201201.nc into (2,5)
[INFO] Partitioning /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_wio-toy_10procs_20120101-20120102/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_surface-bgc_clim.nc into (2,5)
✓ Successfully completed domain: wio-toy
================================================================================
Completed generation for all 4 domain(s)
⚠ 1 domain(s) failed:
- gulf-guinea-toy: Dimension 'xi_coarse' of size 5 cannot be evenly divided into 2 partitions.
================================================================================
/var/folders/x8/7n8hknbj717fxnf07pnk3pch0000gn/T/ipykernel_35535/3018024646.py:2: UserWarning: 1 domain(s) failed during generation: gulf-guinea-toy
builders = engine.generate_all(clobber_inputs=True)
exec_handlers = engine.run_all()
for key, exec_handler in exec_handlers.items():
print("-" * 100)
print(key)
print(exec_handler)
print()
================================================================================
Starting execution for 3 domain(s)
================================================================================
--------------------------------------------------------------------------------
[1/3] Running simulation: ccs-12km
--------------------------------------------------------------------------------
[INFO] Running mpirun -n 320 /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/compile_time_code/roms /Users/mclong/cson-forge-data/cson-forge-run/cson_roms-marbl_v0.1_ccs-12km_320procs_20240101-20240102/runtime_code/cson_roms-marbl_v0.1_ccs-12km_320procs.in
Monitoring execution status for ccs-12km...
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
Status: running
---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
Cell In[4], line 1
----> 1 exec_handlers = engine.run_all()
2 for key, exec_handler in exec_handlers.items():
3 print("-" * 100)
File ~/codes/cson-forge/cson_forge/_core.py:2647, in CstarSpecEngine.run_all(self, poll_interval)
2644 break
2646 # Wait before next status check
-> 2647 time.sleep(poll_interval)
2649 execution_results[grid_name] = execution_handler
2651 except Exception as e:
KeyboardInterrupt: for key, exec_handler in exec_handlers.items():
while not handler.ExecutionStatus.is_terminal(exec_handler.status):
print("...", end="", flush=True)
time.sleep(30)
if exec_handler.status == handler.ExecutionStatus.COMPLETED:
ocn.post_run()
else:
raise Exception("Model run failed")