The SOMISANA toolkit CLI (Command Line Interface) is packaged as a Docker image, and can be used without configuring a local dev environment.
Ensure that docker is installed on your system, and install the CLI:
# Download and execute the install script
wget -qO- https://raw.githubusercontent.com/SAEON/somisana/stable/toolkit/install.sh | bash
# Reload your terminal configuration
source ~/.bashrc
# Start Docker if it's not running
sudo service docker start
# Run the CLI
somisana -h
# Update the CLI
somisana update --version latestUse the CLI to update itself, referencing a newer version. choose the version of the CLI to use from the listed versions https://github.com/SAEON/somisana/pkgs/container/somisana_toolkit_stable (for example, sha-89a5f54), and then run the update command:
somisana update --version sha-89a5f54
# Or to reset to the original installed version
somisana update --reset(1) Create a directory workspace
export SOMISANA_DIR="/home/$USER/temp/somisana"
export WORKDIR=$SOMISANA_DIR/local-run
mkdir -p $WORKDIR/{croco/{forcing,forecast,scratch},forcing-inputs}
touch $SOMISANA_DIR/.env
echo COPERNICUS_USERNAME=username >> $SOMISANA_DIR/.env
echo COPERNICUS_PASSWORD=password >> $SOMISANA_DIR/.env
touch $WORKDIR/.env
chmod -R 777 $SOMISANA_DIR
cd $SOMISANA_DIR(2) Download GFS boundary data
somisana \
download \
--workdir $WORKDIR/forcing-inputs \
--matlab-env $WORKDIR/.env \
--provider gfs \
--domain 22,31,-37,-31(3) Download Mercator boundary data
somisana \
download \
--workdir $WORKDIR/forcing-inputs \
--matlab-env $WORKDIR/.env \
--provider mercator \
--domain 22,31,-37,-31(4) Create forcing files
For this step you do need the source code currently. From the root of the repository (and on the SAEON VPN):
docker run \
--rm \
-v $(pwd)/models/algoa-bay-forecast/crocotools:/crocotools/ \
-v $(pwd)/models/algoa-bay-forecast/lib/grd.nc:/crocotools/croco/forcing/grd.nc \
-v $WORKDIR:/tmp/somisana/current \
-e MLM_LICENSE_FILE=27000@matlab-license-manager.saeon.int \
ghcr.io/saeon/somisana_matlab:r2022a \
-batch "run('/crocotools/run.m')"(5) Compile and run the CROCO model
For this step you do need the source code currently. From the root of the repository:
export NP_ETA=4
export NP_XI=3
export TODAY=$(date +"%Y%m%d")
export YESTERDAY=$(date -d "yesterday" +"%Y%m%d")
# Build the docker image
docker build \
-t abf_local \
--build-arg NP_ETA=$NP_ETA \
--build-arg NP_XI=$NP_XI \
.
# Run the docker image
docker run \
--rm \
-v $WORKDIR:/algoa-bay-forecast/current \
-v $(pwd)/models/algoa-bay-forecast/lib/grd.nc:/algoa-bay-forecast/current/croco/forcing/grd.nc \
--cpus $(expr $NP_ETA \* $NP_XI) \
abf_local \
./run_croco.bash \
/algoa-bay-forecast/current \
$TODAY \
$YESTERDAYTODO
You need to be able to specify specific Python versions for the toolkit. Here are instructions for achieving this with pyenv or conda
Nothing to do here
The pyenv tool adds entries to the beginning of your $PATH variable. So that when you type in the "python" or "pip" commands, you actually run the "pyenv" tool instead of python or pip (since the first entries on $PATH are from pyenv). Pyenv then manages python versions, and you can easily switch between python versions in your terminal. The pyenv tool just redirects the python/pip commands to specific Python versions.
- First Install Python build dependencies. These are required in order for Pyenv to install and build Python (I'm not sure why it's necessary for Pyenv to build Python as opposed to downloading an executable)
- Then Install Pyenv
After installing Pyenv, follow the instructions for configuring your shell environment. Then install the correct Python version (for example 3.10.6 at the time of writing)
PYTHON_VERSION=3.10.6
pyenv install $PYTHON_VERSION
pyenv global $PYTHON_VERSIONPython dependencies are managed as part of the source code. Some of the libraries reuire 3rd party binaries to be installed separately
These are dependencies that should be installed using the OS package manager and don't get bundled with Python libraries
# for both Pyenv and Conda
sudo apt update
sudo apt install -y \
asyncpg \
postgis
# libpq is a binary file required by the PostgreSQL driver (asyncpg)
# postgis is required for the `raster2pgsql` applicationCreate a new conda environment called 'somisana' with all the dependencies via the Condafile.yml file
cd toolkit
conda env create -f Condafile.ymlThen activate the environment
conda activate somisanaIf Condafile.yml is updated with new packages you can update your environment like this
conda env update -f Condafile.yml --prunePipenv is a wrapper over the regular pip package manager, but with a slightly better mechanism for locking dependencies of referenced libraries (I believe). Dependencies are managed via the Pipfile and the Pipfile.lock
pip install --user pipenv
# And to update pipenv in the future
pip install --upgrade pipenvNow install the application Python dependencies as defined in Pipfile.lock
cd toolkit
mkdir .venv # This is optional, and will force pipenv to create a venv directory locally
pipenv installIf you need to include in the environment used in the toolkit docker image (which has the pipenv environment baked in), then you'll need to update the Pipfile and the Pipfile.lock. To do this you can do
rm -rf .venv
python -m venv .venv
source .venv/bin/activate
pipenv install
pipenv install <some-new-package>You should see added to the Pipfile and the Pipfile.lock should have been updated too. Just push these changes to the repo and will be available in the toolkit image.
If you just need to update a package (e.g. if the copernicusmarine toolbox gets updated)
pipenv update copernicusmarine # or whatever package you want to updateThen you'll see the version updated in Pipfile.lock, which you can then push to the remote repo, and it'll get used in the next building of the toolkit docker image
With the somisana environment activated
cd toolkit
python __main__.py <options>
# for example
python __main__.py --version # Should print out 'development'
python __main__.py -h # This should list all the available commandsIn the case of a Pyenv environment, the pipenv run script command ensures the correct virtual environment is used (see the script called script in the Pipfile).
cd toolkit
pipenv run script <options>
# for example
pipenv run script --version # Should print out 'development'
pipenv run script -h # This should list all the available commandsAs a shortcut to these cumbersome commands, you can register the toolkit command on your $PATH environment variable that will handle the CLI entry point for you. This checks if you're in a Conda or Pyenv environment so that the same toolkit command can be used in either case. The toolkit command should then work the same as the somisana command used to run the CLI via the docker image.
cd toolkit
source env.sh
toolkit --version # Should print out 'development'
toolkit -h # This should list all the available commandsThe CLI is configured via flags and environment variables (in the case of passwords/etc.). Copy the example config into you directory as .env and adjust accordingly. The .env file is kept out of source control.
cp .env.example .envNOTE: There is also a env.sh script in the root of the repo that can be sourced so that you don't have to be in the toolkit directory to run the CLI. All path-argument inputs that are relative paths are treated as relative to <repo root>/toolkit