Orchestrate a Workplan (multiple blueprints) with C-star CLI#

This example demonstrates how to launch a workplan in C-Star. A workplan can call any number of jobs (e.g. ROMS-MARBL blueprints). These jobs can depend on a previous job to finish before beginning.

The jobs in this workplan run regional ocean model simulations, including biogeochemical processes, defined by ROMS-MARBL blueprints. You may want to refer to the Terminology and Concepts page for a broader overview of what a workplan is and how it fits into the bigger picture.

Prerequisities#

If you already ran the blueprint tutorial, you are set up and ready to go! If not, see the Prerequisites section of that notebook.

From your activated cstar_env conda environment, you can launch this notebook with jupyter lab docs/tutorials/tutorial_wp.ipynb

Note

This short example is runnable on a MacOS laptop with the default C-Star configuration settings. If you run this example or another use case on an HPC, please visit the configuration to learn how to integrate C-Star with SLURM and configure other important behaviors.

Note

C-Star is intended to be run as a command line utility. We have formulated this tutorial as a Jupyter Notebook to easily step through commands and see results as they run, using the ! Jupyter directive to run terminal and CLI commands. All of these commands could be similarly run from a terminal shell without the !.

For this demo, we will utilize two pre-made ROMS-MARBL blueprints and their associated data. These data reside in our examples repository and are also explored in more detail in the blueprint tutorial.

Overview of the workplan#

Define the workplan#

We can print the content of the workplan with cat workplan_laptop_example.yaml, and cross-reference the attributes with those in the workplans page.

Print out the blueprint contents:

[1]:
!cat workplan_laptop_example.yaml
name: example_workplan
description: Runs a Wales model, then a WIO model, all on your laptop!
state: draft

steps:
  - name: wales
    application: roms_marbl
    blueprint: ./wales_toy_blueprint.yaml

  - name: wio
    application: roms_marbl
    blueprint: ./wio_toy_blueprint.yaml
    depends_on:
      - wales


The workplan itself has a name, description, and a state. The state can either be draft or validated; in future versions of C-Star, validated workplans will perform additional integrity checks to ensure reproducibility and auditability. draft workplans are intended for rapid iteration and quick sharing of workflows between researchers.

Below the workplan attributes, you can define any number of steps. Each step has its own name, the application that will be run, and the blueprint containing instructions for that application. Please consult the Terminology and Concepts page and workplans page for more details.

This workplan runs the ROMS-MARBL application for two different blueprints pointing to two different domains: Wales and WIO (Western Indian Ocean).

Job dependence#

Note how the wio job has a dependence on the wales job. The depends_on parameter may be used when the results of one simulation (job 1) are necessary to start the following simulation (job 2) (e.g. job 2 input files point to the output files from job 1). For our case, we are telling C-Star that the wales job must finish before the wio job can start. Our two jobs are two separate domains that depend on separate files, so a dependence is not necessary here; it is just for purpose of demonstration.

Any steps without dependencies, or whose dependencies are completed successfully, may be run concurrently. This is less useful on a laptop, but much more helpful on a HPC.

Note

The laptop-based orchestrator utilizes basic processes and has limited functionality compared to the full orchestration that will occur on HPCs (or in the future, on cloud services). For example, on HPCs with SLURM, we submit all of the simulation work as separate SLURM jobs, utilizing SLURM’s dependency management and queueing as needed.

Validating workplan syntax#

Similar to blueprints, we can validate that there are no errors in the workplan syntax before running it:

[2]:
!cstar workplan check workplan_laptop_example.yaml
The workplan is valid

Running the workplan#

Run IDs#

An important concept to introduce before running our workplan is the run id. A run id is a unique identifier (chosen by you on the command line) for this execution of your workplan. The run id is used to:

  • locate output data generated by a workplan

  • check the status of a previously submitted workplan (e.g. for long-running HPC simulations)

  • re-start a workplan that has failed or been cancelled

Directory structure#

The location of C-Star-orchestrated application outputs can be set with the CSTAR_DATA_HOME environment variable, otherwise it will default to the XDG-compliant location ~/.local/share. On HPCs, C-Star will attempt to locate and set the default to the user’s “scratch” directory based on common HPC environment variables, as scratch directories often have higher I/O speeds that can impact overall model runtime.

Here, we’ll set our data directory to be in a non-hidden location for easy cleanup later.

[3]:
!cstar blueprint check wio_toy_blueprint.yaml
The blueprint is valid

[4]:
%env CSTAR_DATA_HOME=~/cstar/orchestrated/
env: CSTAR_DATA_HOME=~/cstar/orchestrated/

C-Star will automatically create subdirectories underneath this location to organize the inputs and outputs based on your run-id and the step names within your workplan.

Run the workplan#

Now we’ll execute our workplan and watch the two simulations run back-to-back.

Note

If you run this cell more than once with the same run ID, you’ll receive an error noting that outputs already exist. This is intended, to protect against accidentally overwriting important data, or accidentally working in a directory with incomplete data. You can either set a new Run ID, or use the CSTAR_CLOBBER_WORKING_DIR=1 environment variable to automatically clear any old data.

[5]:
!cstar workplan run workplan_laptop_example.yaml --run-id my-first-run
2026-02-24 23:16:13,817 [INFO] - dag_runner.py:179 - A time-split workplan will be executed.
Local run of `roms_marbl` created pid: 27197
2026-02-24 23:16:13,835 [INFO] - orchestration.py:600 - Launched step: wales
2026-02-24 23:16:29,887 [INFO] - simulation.py:1220 - 🛠️ Configuring ROMSSimulation
2026-02-24 23:16:29,887 [INFO] - simulation.py:1223 - 🔧 Setting up ROMSExternalCodeBase...
2026-02-24 23:16:38,848 [INFO] - simulation.py:1223 - 🔧 Setting up MARBLExternalCodeBase...
2026-02-24 23:16:52,444 [INFO] - simulation.py:1237 - 📦 Fetching compile-time code...
2026-02-24 23:16:53,098 [INFO] - simulation.py:1242 - 📦 Fetching runtime code...
2026-02-24 23:16:53,393 [INFO] - simulation.py:1247 - 📦 Fetching input datasets...
2026-02-24 23:17:06,837 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_grd.nc into (3,3)
2026-02-24 23:17:07,232 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_ini.nc into (3,3)
2026-02-24 23:17:07,423 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_tides.nc into (3,3)
2026-02-24 23:17:07,455 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_bry.nc into (3,3)
2026-02-24 23:17:07,548 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_bry_bgc.nc into (3,3)
2026-02-24 23:17:07,976 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_frc.nc into (3,3)
2026-02-24 23:17:08,208 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_frc_bgc.nc into (3,3)
2026-02-24 23:17:08,254 [INFO] - simulation.py:1576 - Running mpirun -n 9 /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/compile_time_code/roms /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/input/runtime_code/roms_marbl_example_wales_new_bp.in
2026-02-24 23:17:13,370 [INFO] - handler.py:192 -          set_frc :: pco2_air         input time (days) =   4414.00     rec =   2
2026-02-24 23:17:13,370 [INFO] - handler.py:192 -          set_frc :: pco2_air_alt     input time (days) =   4383.00     rec =   1
2026-02-24 23:17:13,370 [INFO] - handler.py:192 -          set_frc :: pco2_air_alt     input time (days) =   4414.00     rec =   2
2026-02-24 23:17:13,472 [INFO] - handler.py:192 -          set_frc :: nox              input time (days) =   4383.00     rec =   1
2026-02-24 23:17:13,573 [INFO] - handler.py:192 -          set_frc :: nox              input time (days) =   4414.00     rec =   2
2026-02-24 23:17:13,573 [INFO] - handler.py:192 -          set_frc :: nhy              input time (days) =   4383.00     rec =   1
2026-02-24 23:17:13,674 [INFO] - handler.py:192 -          set_frc :: nhy              input time (days) =   4414.00     rec =   2
2026-02-24 23:17:13,877 [INFO] - handler.py:192 -
2026-02-24 23:17:13,877 [INFO] - handler.py:192 -  Sponge layer =  15 interior grid points.
2026-02-24 23:17:13,877 [INFO] - handler.py:192 -  Writing initial history file
2026-02-24 23:17:13,877 [INFO] - handler.py:192 -  Reference time used for simulation is: 2000/01/01
2026-02-24 23:17:13,979 [INFO] - handler.py:192 -        created new netcdf file output_his.20120101120000.0.nc
2026-02-24 23:17:14,080 [INFO] - handler.py:192 -        ocean_vars :: wrote history, tdays =   4383.5000  step =      0 rec =   1
2026-02-24 23:17:14,080 [INFO] - handler.py:192 -        created new netcdf file output_bgc.20120101120000.0.nc
2026-02-24 23:17:14,181 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  PO4
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  NO3
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  SiO3
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  NH4
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  Fe
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  Lig
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  O2
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DIC
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DIC_ALT_CO2
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  ALK
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  ALK_ALT_CO2
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DOC
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DON
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DOP
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DOPr
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DONr
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  DOCr
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  zooC
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  spChl
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  spC
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  spP
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  spFe
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  spCaCO3
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diatChl
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diatC
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diatP
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diatFe
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diatSi
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diazChl
2026-02-24 23:17:14,182 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diazC
2026-02-24 23:17:14,183 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diazP
2026-02-24 23:17:14,183 [INFO] - handler.py:192 -        wrt_bgc_tracers :: history , trc =  diazFe
2026-02-24 23:17:14,183 [INFO] - handler.py:192 -        bgc :: wrote history, tdays =   4383.5000  step =     -1 rec =   1
2026-02-24 23:17:49,351 [WARNING] - handler.py:149 - This job is currently not running (completed). Live updates cannot be provided. See /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/logs/roms_marbl_example_wales_new_bp.out for job output
2026-02-24 23:17:49,352 [INFO] - worker.py:301 - Simulation is not running (completed). Allowing shutdown.
2026-02-24 23:17:49,352 [INFO] - worker.py:301 - Simulation is not running (completed). Allowing shutdown.
2026-02-24 23:17:49,352 [INFO] - service.py:421 - Service is ready for shutdown.
2026-02-24 23:17:49,352 [INFO] - service.py:421 - Service is ready for shutdown.
2026-02-24 23:17:49,355 [INFO] - simulation.py:89 - Joining netCDF files output_bgc.20120101120000.*.nc...
2026-02-24 23:17:49,355 [INFO] - simulation.py:89 - Joining netCDF files output_bgc_dia.20120101120000.*.nc...
2026-02-24 23:17:49,355 [INFO] - simulation.py:89 - Joining netCDF files output_his.20120101120000.*.nc...
2026-02-24 23:17:49,770 [INFO] - simulation.py:100 - done spatially joining /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/output/output_his.20120101120000.nc
2026-02-24 23:17:49,828 [INFO] - simulation.py:100 - done spatially joining /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/output/output_bgc.20120101120000.nc
2026-02-24 23:17:51,986 [INFO] - simulation.py:100 - done spatially joining /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/output/output_bgc_dia.20120101120000.nc
2026-02-24 23:17:51,987 [INFO] - worker.py:155 - Completed simulation logs at: /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/logs/roms_marbl_example_wales_new_bp.out
2026-02-24 23:17:51,987 [INFO] - worker.py:155 - Completed simulation logs at: /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/logs/roms_marbl_example_wales_new_bp.out
2026-02-24 23:17:51,987 [INFO] - worker.py:158 - Simulation completed successfully.
2026-02-24 23:17:51,987 [INFO] - worker.py:158 - Simulation completed successfully.
Return code for pid `27197` is `0` for `wales`
Local run of `roms_marbl` created pid: 32826
2026-02-24 23:17:53,067 [INFO] - orchestration.py:600 - Launched step: wio
2026-02-24 23:17:53,169 [INFO] - dag_runner.py:149 - Workplan schedule is complete.
Return code for pid `27197` is `0` for `wales`
2026-02-24 23:17:53,170 [INFO] - orchestration.py:620 - Closed node: wales
2026-02-24 23:18:11,760 [INFO] - simulation.py:1220 - 🛠️ Configuring ROMSSimulation
2026-02-24 23:18:11,760 [INFO] - simulation.py:1223 - 🔧 Setting up ROMSExternalCodeBase...
2026-02-24 23:18:20,474 [INFO] - simulation.py:1223 - 🔧 Setting up MARBLExternalCodeBase...
2026-02-24 23:18:34,191 [INFO] - simulation.py:1237 - 📦 Fetching compile-time code...
2026-02-24 23:18:35,134 [INFO] - simulation.py:1242 - 📦 Fetching runtime code...
2026-02-24 23:18:35,437 [INFO] - simulation.py:1247 - 📦 Fetching input datasets...
2026-02-24 23:18:49,512 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_grid.nc into (2,5)
2026-02-24 23:18:49,890 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_initial_conditions.nc into (2,5)
2026-02-24 23:18:50,095 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_tidal.nc into (2,5)
2026-02-24 23:18:50,138 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_river.nc into (2,5)
2026-02-24 23:18:50,193 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_boundary-physics_201201.nc into (2,5)
2026-02-24 23:18:50,327 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_boundary-bgc_clim.nc into (2,5)
2026-02-24 23:18:50,969 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_surface-physics_201112.nc into (2,5)
2026-02-24 23:18:51,020 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_surface-physics_201201.nc into (2,5)
2026-02-24 23:18:51,078 [INFO] - input_dataset.py:225 - Partitioning /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/input_datasets/cson_roms-marbl_v0.1_wio-toy_10procs_surface-bgc_clim.nc into (2,5)
2026-02-24 23:18:51,138 [INFO] - simulation.py:1576 - Running mpirun -n 10 /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/compile_time_code/roms /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/wio_toy.in
2026-02-24 23:18:56,253 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in:
2026-02-24 23:18:56,254 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%Ea = 0.65
2026-02-24 23:18:56,254 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%basal_respiration_rate_per_day = 0.0
2026-02-24 23:18:56,355 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%lname = "Zooplankton"
2026-02-24 23:18:56,355 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%loss_thres = 0.075
2026-02-24 23:18:56,457 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%sname = "zoo"
2026-02-24 23:18:56,457 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%temp_func_form_opt = "q_10"
2026-02-24 23:18:56,557 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%z_mort2_0_per_day = 0.4
2026-02-24 23:18:56,557 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: zooplankton_settings(1)%z_mort_0_per_day = 0.1
2026-02-24 23:18:56,557 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in:
2026-02-24 23:18:56,557 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%auto_ind(1) = 1
2026-02-24 23:18:56,558 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%auto_ind_cnt = 1
2026-02-24 23:18:56,658 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%f_zoo_detr = 0.12
2026-02-24 23:18:56,658 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%graze_doc = 0.06
2026-02-24 23:18:56,658 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%graze_poc = 0.0
2026-02-24 23:18:56,658 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%graze_zoo = 0.3
2026-02-24 23:18:56,760 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%grazing_function = 1
2026-02-24 23:18:56,760 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%lname = "Grazing of sp by zoo"
2026-02-24 23:18:56,760 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%sname = "grz_sp_zoo"
2026-02-24 23:18:56,760 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%z_grz = 1.2
2026-02-24 23:18:56,760 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%z_umax_0_per_day = 3.3
2026-02-24 23:18:56,760 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(1,1)%zoo_ind_cnt = 0
2026-02-24 23:18:56,861 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%auto_ind(1) = 2
2026-02-24 23:18:56,861 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%auto_ind_cnt = 1
2026-02-24 23:18:56,963 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%f_zoo_detr = 0.24
2026-02-24 23:18:56,963 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%graze_doc = 0.06
2026-02-24 23:18:56,963 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%graze_poc = 0.38
2026-02-24 23:18:56,963 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%graze_zoo = 0.25
2026-02-24 23:18:57,064 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%grazing_function = 1
2026-02-24 23:18:57,064 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%lname = "Grazing of diat by zoo"
2026-02-24 23:18:57,064 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%sname = "grz_diat_zoo"
2026-02-24 23:18:57,064 [INFO] - handler.py:192 - /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/input/runtime_code/marbl_in: grazing_relationship_settings(2,1)%z_grz = 1.2
2026-02-24 23:19:08,684 [INFO] - handler.py:192 -          set_frc :: swrad            input time (days) =   4383.04     rec =   2
2026-02-24 23:19:08,684 [INFO] - handler.py:192 -          set_frc :: lwrad            input time (days) =   4383.04     rec =   2
2026-02-24 23:19:08,786 [INFO] - handler.py:192 -          set_frc :: uwnd             input time (days) =   4383.04     rec =   2
2026-02-24 23:19:08,786 [INFO] - handler.py:192 -          set_frc :: vwnd             input time (days) =   4383.04     rec =   2
2026-02-24 23:19:08,886 [INFO] - handler.py:192 -          set_frc :: Tair             input time (days) =   4383.04     rec =   2
2026-02-24 23:19:08,886 [INFO] - handler.py:192 -          set_frc :: qair             input time (days) =   4383.04     rec =   2
2026-02-24 23:19:08,887 [INFO] - handler.py:192 -          set_frc :: rain             input time (days) =   4383.04     rec =   2
2026-02-24 23:19:20,205 [WARNING] - handler.py:149 - This job is currently not running (completed). Live updates cannot be provided. See /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/logs/wio_toy.out for job output
2026-02-24 23:19:20,206 [INFO] - worker.py:301 - Simulation is not running (completed). Allowing shutdown.
2026-02-24 23:19:20,206 [INFO] - worker.py:301 - Simulation is not running (completed). Allowing shutdown.
2026-02-24 23:19:20,206 [INFO] - service.py:421 - Service is ready for shutdown.
2026-02-24 23:19:20,206 [INFO] - service.py:421 - Service is ready for shutdown.
2026-02-24 23:19:20,209 [INFO] - simulation.py:89 - Joining netCDF files output_his.20120101000000.*.nc...
2026-02-24 23:19:20,209 [INFO] - simulation.py:89 - Joining netCDF files output_bgc_dia.20120101000000.*.nc...
2026-02-24 23:19:20,209 [INFO] - simulation.py:89 - Joining netCDF files output_bgc.20120101000000.*.nc...
2026-02-24 23:19:20,467 [INFO] - simulation.py:100 - done spatially joining /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/output/output_his.20120101000000.nc
2026-02-24 23:19:20,528 [INFO] - simulation.py:100 - done spatially joining /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/output/output_bgc.20120101000000.nc
2026-02-24 23:19:22,808 [INFO] - simulation.py:100 - done spatially joining /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/output/output_bgc_dia.20120101000000.nc
2026-02-24 23:19:22,809 [INFO] - worker.py:155 - Completed simulation logs at: /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/logs/wio_toy.out
2026-02-24 23:19:22,809 [INFO] - worker.py:155 - Completed simulation logs at: /Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/logs/wio_toy.out
2026-02-24 23:19:22,809 [INFO] - worker.py:158 - Simulation completed successfully.
2026-02-24 23:19:22,809 [INFO] - worker.py:158 - Simulation completed successfully.
Return code for pid `32826` is `0` for `wio`
2026-02-24 23:19:46,277 [INFO] - orchestration.py:620 - Closed node: wio
2026-02-24 23:19:46,379 [INFO] - dag_runner.py:149 - Workplan monitor is complete.
Workplan run has completed.

Simulation results#

Here we can see the final joined output files for each of our two simulations, located under the home directory we specified:

[6]:
!find ~/cstar/orchestrated/ | grep joined_output
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/joined_output
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/joined_output/output_bgc.20120101120000.nc
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/joined_output/output_bgc_dia.20120101120000.nc
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wales/joined_output/output_his.20120101120000.nc
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/joined_output
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/joined_output/output_bgc.20120101000000.nc
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/joined_output/output_bgc_dia.20120101000000.nc
/Users/eilerman/cstar/orchestrated/my-first-run/tasks/wio/joined_output/output_his.20120101000000.nc

The inputs and code used for each simulation are also stored alongside the outputs, in the same structure as an individual blueprint run.

Example visualization#

As before, we can use ROMS-Tools to examine our model output. This time, let’s look at some BGC data from the Wales domain.

[7]:
from roms_tools import Grid, ROMSOutput
grid = Grid.from_file("~/cstar/orchestrated/my-first-run/tasks/wales/input/input_datasets/roms_grd.nc")
roms_output = ROMSOutput(
    grid=grid,
    path=[
        "~/cstar/orchestrated/my-first-run/tasks/wales/joined_output/output_bgc.20120101120000.nc",
    ])
roms_output.plot("ALK", time=0, s=-1)

/Users/eilerman/miniconda3/envs/cstar_env/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.
../_images/tutorials_tutorial_wp_30_1.png