Annotated command list - fabm-model/fabm GitHub Wiki


Workshop:

Framework for Aquatic Biogeochemical Modeling (FABM) Kloster Heidberg in Eupen, Belgium (6/16/2025 - 6/20/2025)

Organizers:

Karsten Bolding, Jorn Bruggeman, and Nicolas Azaña Schnedler-Meyer

Repository:

https://github.com/BoldingBruggeman/fabmws2025

Curator Contact:

Spencer T. Gardner Cooperative Institute of Great Lakes Research University of Michigan - Ann Arbor, Michigan, USA (Institute) [email protected] (Personal) [email protected]

Purpose:

Simplified and annotated terminal history of the FABM workshop providing a view of 0D, 1D, and 3D 

implementation. Commands were executed on a Windows system using an Anaconda terminal, and as such, some commands may differ from those using other platforms.


Day 1: June 16, 2025

# navigate to workshop root directory
(base) C:\Users\Owner>cd fabmws2025

# activate virtual environment
(base) C:\Users\Owner\fabmws2025>conda activate fabmws2025

# change into code directory
(fabmws2025) C:\Users\Owner\fabmws2025>cd ./code

# view strucuture of code directory
(fabmws2025) C:\Users\Owner\fabmws2025\code>dir
<!--  Directory of C:\Users\Owner\fabmws2025\code

06/10/2025  02:27 PM    <DIR>          .
06/10/2025  02:27 PM    <DIR>          ..
06/10/2025  02:28 PM    <DIR>          eat
06/10/2025  03:14 PM    <DIR>          fabm
06/10/2025  03:23 PM    <DIR>          fabmos
06/10/2025  02:29 PM    <DIR>          gotm
06/10/2025  02:29 PM    <DIR>          pygetm -->

# duplicated model/template directory (should run again and replace with institute name, e.g., fabm-ciglr)
(fabmws2025) C:\Users\Owner\fabmws2025\code>cp -r fabm/src/models/template fabm-gardner        

# move into newly created driectory
(fabmws2025) C:\Users\Owner\fabmws2025\code>cd fabm-gardner

# explore structure
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>dir
<!--  Directory of C:\Users\Owner\fabmws2025\code\fabm-gardner

06/16/2025  10:21 AM    <DIR>          .
06/16/2025  10:21 AM    <DIR>          ..
06/16/2025  10:21 AM               176 CMakeLists.txt
06/16/2025  10:21 AM               796 model_library.F90
06/16/2025  10:21 AM               670 mymodel.F90
               3 File(s)          1,642 bytes
               2 Dir(s)  738,406,612,992 bytes free -->

# rename model.F90 (phyto, mussel, etc.)
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>mv mymodel.F90 phyto.F90

# change naming scheme in CMakeList.txt (vi in linux): 
#       template --> institute name
#       mymodel --> model name (e.g., mussel)
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>nano CMakeLists.txt

# change naming scheme in model_library.F90:
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>nano model_library.F90

# change naming scheme in model_library.F90:
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>nano phyto.F90

# backstep into fabm directory
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>cd ../fabm

# explore directory structure
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm>dir
<!--  Directory of C:\Users\Owner\fabmws2025\code\fabm

06/10/2025  03:14 PM    <DIR>          .
06/10/2025  03:14 PM    <DIR>          ..
06/10/2025  02:28 PM    <DIR>          .binder
06/10/2025  02:28 PM               313 .editorconfig
06/10/2025  02:28 PM    <DIR>          .github
06/10/2025  02:28 PM               233 .gitignore
06/10/2025  02:28 PM               649 .gitmodules
06/10/2025  02:28 PM               873 .zenodo.json
06/10/2025  03:17 PM    <DIR>          build
06/10/2025  02:28 PM             5,185 CMakeLists.txt
06/10/2025  02:28 PM            18,347 COPYING
06/10/2025  02:28 PM    <DIR>          extern
06/10/2025  02:28 PM    <DIR>          include
06/10/2025  02:28 PM               155 MANIFEST.in
06/10/2025  02:28 PM             1,037 pyproject.toml
06/10/2025  02:28 PM               871 README.md
06/10/2025  03:14 PM                46 setup.cfg
06/10/2025  02:28 PM               679 setup.py
06/10/2025  03:14 PM    <DIR>          src
06/10/2025  02:28 PM    <DIR>          testcases
06/10/2025  02:28 PM    <DIR>          util
              11 File(s)         28,388 bytes
              10 Dir(s)  738,410,835,968 bytes free -->

# modify setup configuration:
#       add "cmake_opts=-DFABM_EXTRA_INSTITUTES=gardner -DFABM_GARDNER_BASE=../fabm-gardner" 
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm>nano setup.cfg

# backstep to root directory (Note: shouldn't need to switch directories)
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm>cd ../../

# configure model --> pyfabm: "0-D box model"... note that this command is specific for pyfabm  
(fabmws2025) C:\Users\Owner\fabmws2025>pip install code/fabm
<!--   Processing c:\users\owner\fabmws2025\code\fabm
    Installing build dependencies ... done
... [continued]
  Successfully installed pyfabm-2.1.5 -->

# advance to setups directory
(fabmws2025) C:\Users\Owner\fabmws2025>cd setups

# view directory structure
(fabmws2025) C:\Users\Owner\fabmws2025\setups>dir
<!--  Volume in drive C has no label.
 Volume Serial Number is 624C-3F09

 Directory of C:\Users\Owner\fabmws2025\setups

06/16/2025  05:45 AM    <DIR>          .
06/16/2025  05:45 AM    <DIR>          ..
06/10/2025  02:27 PM    <DIR>          global-fabmos
06/10/2025  02:27 PM    <DIR>          northsea-gotm
06/10/2025  02:27 PM    <DIR>          northsea-pygetm
06/16/2025  05:45 AM    <DIR>          pyfabm
               0 File(s)              0 bytes
               6 Dir(s)  738,413,338,624 bytes free -->

# --------------------------------------------------
# ----- create YAML file and add the following -----
#      instances:
#        phy1:
#          model: gardner/phyto
# --------------------------------------------------
(fabmws2025) C:\Users\Owner\fabmws2025\setups>nano fabm-gardner.yaml

# retrieve list containing all components of the newly created model
#     (1) -h, --help
(fabmws2025) C:\Users\Owner\fabmws2025\setups>fabm_describe_model -h
<!-- usage: fabm_describe_model [-h] [--all] [path]
... [continued]
options:
  -h, --help  show this help message and exit
  --all, -a   Show diagnostics that are by default excluded from output -->

#     (2) path to YAML file
(fabmws2025) C:\Users\Owner\fabmws2025\setups>fabm_describe_model fabm-gardner.yaml
<!-- Initializing phy1...
   model type: gardner/phyto
   initialization succeeded.
... [continued]
Conserved quantities:
Dependencies: -->

#     (3) can also check this using python (3rd option using Jupyter Notebook shown below)
(fabmws2025) C:\Users\Owner\fabmws2025\setups>python
Python 3.13.3 | packaged by conda-forge | (main, Apr 14 2025, 20:31:24) [MSC v.1943 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyfabm
>>> m=pyfabm.Model("fabm-gardner.yaml")
Initializing phy1...
   model type: gardner/phyto
   initialization succeeded.
>>> m.state_variables
[]
>>> m.parameters
[]
>>> exit

# now return to model directory to add traits
(fabmws2025) C:\Users\Owner\fabmws2025\setups>cd ../code/fabm-gardner

# ------------------------------------------------------
# ----- open model.F90, and register new variables -----
# define type ::
#      type (type_state_variable_id) :: id_c
#      real(rk) :: mumax
#
# define name, units, long_name ::
#      call self%register_state_variable(self%id_c, "c", "mmol m-3", "concentration")
#      call self%get_parameter(self%mumax, "mumax", "d-1", "max growth rate")
# ------------------------------------------------------
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>nano phyto.F90

# backstep to root directory
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>cd ../..

# configure model with new state variables
(fabmws2025) C:\Users\Owner\fabmws2025>pip install code/fabm
<!--   Processing c:\users\owner\fabmws2025\code\fabm
    Installing build dependencies ... done
    Getting requirements to build wheel ... done
    Preparing metadata (pyproject.toml) ... done
... [continued]
        Successfully uninstalled pyfabm-2.1.5
  Successfully installed pyfabm-2.1.5 -->

# advance into setups directory
(fabmws2025) C:\Users\Owner\fabmws2025>cd setups

# ----------------------------
# ----- update YAML file -----
#          model: gardner/phyto   (old)
#          parameters:            (new)
#            mumax: 1
#          initialization:
#            c: 200
# ----------------------------
(fabmws2025) C:\Users\Owner\fabmws2025\setups>nano fabm-gardner.yaml

# check that variables are properly described
(fabmws2025) C:\Users\Owner\fabmws2025\setups>fabm_describe_model fabm-gardner.yaml
<!-- Initializing phy1...
   model type: gardner/phyto
   initialization succeeded.
... [continued]
Conserved quantities:
Dependencies: -->

Day 2: June 17, 2025

# lets get started
(base) C:\Users\Owner>cd fabmws2025
(base) C:\Users\Owner\fabmws2025>conda activate fabmws2025
(fabmws2025) C:\Users\Owner\fabmws2025>cd code/fabm-gardner

# ------------------------------------------------------------------
# ----- add the following rocedure to model (do): in phyto.F90 ----- 
# ! Declare procedure in the type definition section
# procedure :: do

# ! Implement the subroutine
# subroutine do(self, _ARGUMENTS_DO_)
#   class (type_gardner_phyto), intent(in) :: self
#   _DECLARE_ARGUMENTS_DO_

#   real(rk) :: c

#   _LOOP_BEGIN_
#     _GET_(self%id_c, c)
#     _ADD_SOURCE_(self%id_c, self%mumax * c / 86400.0_rk)
#   _LOOP_END_
# end subroutine do
# ------------------------------------------------------------------
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>nano phyto.F90

(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>cd ../..

# compile model --> pyfabm: "0-D box model"
(fabmws2025) C:\Users\Owner\fabmws2025>pip install code/fabm
<!--   Processing c:\users\owner\fabmws2025\code\fabm
    Installing build dependencies ... done
    Getting requirements to build wheel ... done
... [continued]
  Successfully installed pyfabm-2.1.5 -->

# -----------------------------------------------------------------------
# ----- add local variable -- later turned into diagnostic variable -----
#      type (type_state_variable_id) :: id_c     (old)
#      type (type_state_variable_id) :: id_n
#      type (type_diagnostic_variable_id) :: id_u	! DON'T HAVE TO EXPORT, CAN LEAVE AS LOCAL VARIABLE IN SUBROUTINE 
#      real(rk) :: K
# ...  
#      call self%register_state_variable(self%id_c, "c", "mmol m-3", "concentration")      (old)
#      call self%register_state_variable(self%id_n, "n", "mmol m-3", "nutrient concentration")
#      call self%register_diagnostic_variable(self%id_u, "u", "mmol m-3 s-1", "nutrient uptake")  ! DON'T HAVE TO EXPORT, CAN LEAVE AS LOCAL VARIABLE IN SUBROUTINE
#      call self%get_parameter(self%K, "K", "mmol m-3", "half saturation nutrient concentration") 
# ... 
#     real(rk) :: c, n, u
#   
#     _LOOP_BEGIN_
#       _GET_(self%id_c, c)
#       _GET_(self%id_n, n)          (new)
#
#       u = self%mumax * c * n / (n + self%K) / 86400.0_rk         (new local variable created)
#       _SET_DIAGNOSTIC_(self%id_u, u)                             (to export as diagnostic variable, set here and by using the commands above)
#
#       _ADD_SOURCE_(self%id_c, self%mumax * c * n / (n + self%K) / 86400.0_rk)
#       _ADD_SOURCE_(self%id_n, -u)                                (notice how local variable is used to streamline code)
#     _LOOP_END_
#   end subroutine do
# end module
# -----------------------------------------------------------------------
(fabmws2025) C:\Users\Owner\fabmws2025>cd code/fabm-gardner
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>nano phyto.F90

# change to root directory and compile model --> pyfabm: "0-D box model"
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>cd ../../
(fabmws2025) C:\Users\Owner\fabmws2025>pip install code/fabm
<!--   Processing c:\users\owner\fabmws2025\code\fabm
    Installing build dependencies ... done
... [continued]
  Successfully installed pyfabm-2.1.5 -->

# from the root directory, run jupyter lab
(fabmws2025) C:\Users\Owner\fabmws2025>jupyter lab
<!-- To access the server, open this file in a browser:
        file:///C:/Users/Owner/AppData/Roaming/jupyter/runtime/jpserver-8408-open.html
... [continued]
[W 2025-06-17 04:37:30.846 LabApp] Could not determine jupyterlab build status without nodejs -->

# define model variables (3rd option) -----------------
# open... list_variables.ipynb
#      --> change path to fabm-gardner.yaml
#      --> add missing parameter to fabm-gardner.yaml

# run preliminary simulation of model -----------------
# open... simulate.ipynb
#      --> change path to fabm-gardner.yaml
#      --> add missing initialization to fabm-gardner.yaml 

# run with GOTM... before running GOTM we're going to update our model...
(base) C:\Users\Owner>cd fabmws2025
(base) C:\Users\Owner\fabmws2025>conda activate fabmws2025
(fabmws2025) C:\Users\Owner\fabmws2025>git pull
<!-- remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
... [continued]
 create mode 100644 install_gotm.bat -->
(fabmws2025) C:\Users\Owner\fabmws2025>git submodule update --init --recursive

# -------------------------------------------
# ----- add fabm module to install gotm -----
# cmake ... -DFABM_EXTRA_INSTITUTES=gardner -DFABM_GARDNER_BASE=code/fabm-gardner
# -------------------------------------------
(fabmws2025) C:\Users\Owner\fabmws2025>nano install_gotm.bat

# run gotm install --> specific for 1-D model
(fabmws2025) C:\Users\Owner\fabmws2025>install_gotm.bat

# ----------------------------
# ----- modify phyto.F90 -----
#      type (type_dependency_id) :: id_par 
# ...      
#      call self%register_dependency(self%id_par, standard_variables%downwelling_photosynthetic_radiative_flux)
# ...      
#     real(rk) :: c, n, u, par      (!dependencies must still be assigned as a real number!)
# ...   
#     _LOOP_BEGIN_                  (old)
#       _GET_(self%id_c, c)         (old)
#       _GET_(self%id_n, n)         (old)
#       _GET_(self%id_par, par)
# ...
#       u = self%mumax * c * min(n / (n + self%K), par / (par + 10.0_rk)) / 86400.0_rk - 0.1_rk / 86400.0_rk * c
# ----------------------------
(fabmws2025) C:\Users\Owner\fabmws2025>cd code/fabm-gardner
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>nano phyto.F90

# recompile gotm code modules 
(fabmws2025) C:\Users\Owner\fabmws2025>../../install_gotm.bat

# change to gotm source code directory
(fabmws2025) C:\Users\Owner\fabmws2025\code\fabm-gardner>cd ../OneDrive\Desktop\Files\Research\FVCOM_FABM_ERSEM\FABM-ERSEM\gotm\hatteras

# copy fabm-gardner.yaml to gotm directory
(fabmws2025)C:\Users\Owner\OneDrive\Desktop\Files\Research\FVCOM_FABM_ERSEM\FABM-ERSEM\gotm\hatteras>cp C:\Users\Owner\fabmws2025\setups\fabm-gardner.yaml ./fabm.yaml

# remove inputs section from yaml that are not used by the model
(fabmws2025) C:\Users\Owner\OneDrive\Desktop\Files\Research\FVCOM_FABM_ERSEM\FABM-ERSEM\gotm\hatteras>nano gotm.yaml

# run gotm
(fabmws2025) C:\Users\Owner\OneDrive\Desktop\Files\Research\FVCOM_FABM_ERSEM\FABM-ERSEM\gotm\hatteras>gotm

Day 3: June 18, 2025

## pyGETM - General Estuarine Transport Model
# gitHub: https://github.com/BoldingBruggeman/getm-rewrite 

# Let's get started...
(base) C:\Users\Owner>cd fabmws2025
(base) C:\Users\Owner\fabmws2025>conda activate fabmws2025
(fabmws2025) C:\Users\Owner\fabmws2025>git stash
(fabmws2025) C:\Users\Owner\fabmws2025>git pull
(fabmws2025) C:\Users\Owner\fabmws2025>git stash pop
(fabmws2025) C:\Users\Owner\fabmws2025>install_gotm.bat
<!-- [39/735] Retrieving description of last GOTM commit...
-- On branch remotes/origin/v6.0 with commit id v6.0.7-3-g4a4754bd
... [continued]
-- Installing: C:/Users/Owner/anaconda3/envs/fabmws2025/lib/libconfig.a -->

(fabmws2025) C:\Users\Owner\fabmws2025>cat code/fabm/setup.cfg
<!-- [build_ext]
build_temp=../../build/pyfabm
cmake_opts=-DFABM_EXTRA_INSTITUTES=gardner -DFABM_GARDNER_BASE=../fabm-gardner -->

# ---------------------------------------------------
# ----- copy fabm setup.cfg to pygetm setup.cfg -----
# -DFABM_EXTRA_INSTITUTES=gardner -DFABM_GARDNER_BASE=../../fabm-gardner [Note: added ../ to _BASE]
# alt: use full file path... can include "" around filepath
# ---------------------------------------------------
(fabmws2025) C:\Users\Owner\fabmws2025>nano code/pygetm/python/setup.cfg

# compile model --> pygetm "general estuarine transport model" (3-D structured grid model)
(fabmws2025) C:\Users\Owner\fabmws2025>pip install code/pygetm/python
<!-- Successfully built pygetm
Installing collected packages: pygetm
... [continued]
Successfully installed pygetm-0.9.14 -->

# What are the data requirements for compiling getm? (input files, etc.)
#     - much lower threshold than fvcom, but inputs could likely be taken from existing data
# Viable option for parameterizing ersem? (fvcom runs 1-year in about 24-26hrs... we've considered using a coarse grid approach but maybe this would be better).
#     - configuration should be straightforwards... no more effort than compiling a coarse grid version 
#     - might be good option for ecologist at NOAA and academics --> python-based package with somewhat user friendly
#       interface for examining data.
#     - structured grid can be modified to increase resolution around specific depth profile (e.g., thermocline)

(fabmws2025) C:\Users\Owner\fabmws2025>cd setups/northsea-pygetm/
(fabmws2025) C:\Users\Owner\fabmws2025\setups\northsea-pygetm>ls -l
<!-- total 25
drwxr-xr-x 1 Owner 197121     0 Jun 10 14:27 Forcing
drwxr-xr-x 1 Owner 197121     0 Jun 10 14:27 Topo
-rw-r--r-- 1 Owner 197121   204 Jun 10 14:27 bdyinfo.dat
-rw-r--r-- 1 Owner 197121 11789 Jun 10 14:27 gotmturb.nml
-rw-r--r-- 1 Owner 197121  5161 Jun 10 14:27 riverinfo.dat
-rwxr-xr-x 1 Owner 197121  3453 Jun 18 03:17 run.py -->
(fabmws2025) C:\Users\Owner\fabmws2025\setups\northsea-pygetm>nano run.py

# run getm (note: can be run on multiple cores - using mpiexe - which would speed up run time)
(fabmws2025) C:\Users\Owner\fabmws2025\setups\northsea-pygetm>python run.py
<!-- INFO:root:2006-01-05 18:00:00
INFO:root:2006-01-05 19:00:00
... [continued]
INFO:root:Time spent in main loop: 48.549 s -->

# view output using pyncview (note: 0=bottom and 29=surface)
(fabmws2025) C:\Users\Owner\fabmws2025\setups\northsea-pygetm>pyncview north_sea_3d.nc

# add biogeochemical model to getm physics
(fabmws2025) C:\Users\Owner\fabmws2025\setups\northsea-pygetm>cp ../../fabm-configs/fabm-ersem.yaml fabm.yaml

# ---------------------------------------------
# ----- add biogeochemical to getm run.py -----
# Un-comment: 
#             fabm="fabm.yaml", 
#             sim.fabm.get_dependency("mole_fraction_of_carbon_dioxide_in_air").set(280.0)
#             sim.fabm.get_dependency("absorption_of_silt").set(0.02)
#             output.request(*sim.fabm.state_variables)
# ---------------------------------------------
(fabmws2025) C:\Users\Owner\fabmws2025\setups\northsea-pygetm>nano run.py
(fabmws2025) C:\Users\Owner\fabmws2025\setups\northsea-pygetm>python run.py
<!-- INFO:root:2006-01-09 23:00:00
INFO:root:2006-01-10 00:00:00
... [continued]
INFO:root:  heat: 6.179548761933116e+22 J (mean conservative temperature: 10.777019129572848 degrees_Celsius)
INFO:root:Time spent in main loop: 703.507 s -->

## FABMOS - FABM Offline Simulator
# wiki:     https://github.com/BoldingBruggeman/fabmos/wiki/User-guide

# add path to models ( -DFABM_EXTRA_INSTITUTES=gardner -DFABM_GARDNER_BASE=../fabm-gardner)... note that 
# you do NOT have to add this if using precompiled model (e.g., ersem)
(fabmws2025) C:\Users\Owner\fabmws2025>nano code/fabmos/setup.cfg
(fabmws2025) C:\Users\Owner\fabmws2025>pip install code/fabmos
<!-- Building wheels for collected packages: fabmos
  Building wheel for fabmos (pyproject.toml) ... done
... [continued]
Successfully installed fabmos-0.3.4.dev3+gdbc8c06 -->

(fabmws2025) C:\Users\Owner\fabmws2025>cd setups/global-fabmos
(fabmws2025) C:\Users\Owner\fabmws2025\setups\global-fabmos>ls -l
<!-- total 364
drwxr-xr-x 1 Owner 197121      0 Jun 10 14:27 BiogeochemData
drwxr-xr-x 1 Owner 197121      0 Jun 10 14:27 GCM
drwxr-xr-x 1 Owner 197121      0 Jun 10 14:27 Matrix10
drwxr-xr-x 1 Owner 197121      0 Jun 10 14:27 Matrix5
-rw-r--r-- 1 Owner 197121   6528 Jun 10 14:27 config_data.mat
-rw-r--r-- 1 Owner 197121 345369 Jun 10 14:27 grid.mat
-rw-r--r-- 1 Owner 197121   1960 Jun 18 03:17 run.py -->
(fabmws2025) C:\Users\Owner\fabmws2025\setups\global-fabmos>cp ../../fabm-configs/fabm-ersem.yaml fabm.yaml
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Un-comment: 
#             sim.fabm.get_dependency("mole_fraction_of_carbon_dioxide_in_air").set(280.0)
#             sim.fabm.get_dependency("absorption_of_silt").set(0.02)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(fabmws2025) C:\Users\Owner\fabmws2025\setups\global-fabmos>nano run.py
(fabmws2025) C:\Users\Owner\fabmws2025\setups\global-fabmos>mpiexec -n 4 python run.py
<!-- INFO:root:2000-12-29 00:00:00
INFO:root:2000-12-30 00:00:00
... [continued]
INFO:root:Time spent in main loop: 2015.256 s -->
(fabmws2025) C:\Users\Owner\fabmws2025\setups\global-fabmos>pyncview output.nc

## parsac - open-source Python-based package for parallel sensitivity analysis and auto-calibration
# wiki - https://github.com/BoldingBruggeman/parsac/wiki 

#  replace sim and experiment path with location of GOMT: /Users/Owner/OneDrive/Desktop/Files/Research/FVCOM_FABM_ERSEM/FABM-ERSEM/gotm/hatteras
(fabmws2025) C:\Users\Owner\fabmws2025\setups>nano calibrate_gotm.py

# execute calibration script
(fabmws2025) C:\Users\Owner\fabmws2025\setups>python calibrate_gotm.py
<!-- INFO:Optimization.DE:Starting generation 85
100%|██████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:40<00:00,  4.08s/eval]
INFO:Optimization.DE:  Range:     1.31e-04
INFO:Optimization.DE:  Tolerance: 1.14e-04
INFO:Optimization.DE:  Fitness range: 0.0006760615251550917
INFO:Optimization.DE:Starting generation 86
100%|██████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:26<00:00,  2.66s/eval]
INFO:Optimization.DE:  Range:     0.00e+00
INFO:Optimization.DE:  Tolerance: 1.14e-04
INFO:Optimization.DE:  Fitness range: 0.0
INFO:Optimization.DE:Optimization complete as parameter and fitness ranges within specified tolerance -->
(fabmws2025) C:\Users\Owner\fabmws2025\setups>python -m parsac.optimize.plot calibrate_gotm.results.db

⚠️ **GitHub.com Fallback** ⚠️