Skip to main content

A Python package to read, analyse and visualise cGENIE Earth System Model output

Project description

cgeniepy is an Python interface to the output of cGENIE Earth System Model. It is an alternative to the existing MATLAB libraries. It aims to facilitate the post-simulation analysis, including reading and analysing the model output, and observational data.

cgeniepy is still in alpha phase and under active changes.

Installation

  1. Install from testpypi.
python3 -m pip install -i https://test.pypi.org/simple/ cgeniepy==0.10.1
  1. Install from GitHub:
python3 -m pip install git+https://github.com/ruiying-ocean/cgeniepy.git@master

Quickstart

0. initialise a model instance

from cgeniepy.model import GenieModel

## single model
model = GenieModel('path_a')

## model ensemble
multi_dirs = ['/path_a/', '/path_b/']
model = GenieModel(path_to_model_output)

1. Read data

  • netCDF (*.nc)
  • time series (*.res)
## time slice data
model.get_var("XXXXX").array

## timeseries data
model.get_ts("biogem_series_ocn_temp.res")

2. Data analysis

  • Data subsetting and statistics
  • Model performance
  • Unit-changing operation (e.g., rate to magnitude)
## get zonal average SST of the last model year
zonal_sst = model.get_var("ocn_sur_temp").isel(time=-1).mean(dim='lat')

## North Pacific SST
npac_sst = model.get_var("ocn_sur_temp").select_basin(47).isel(time=-1)

3. Visualisation

  • 1D line (time series, zonal average)
  • 2D map (including various projections like polar map)
  • 2D cross section
  • 3D (facet)
  • Add a layer of observational data
## simply call `plot` after accessing the data

## map
model.get_var("ocn_sur_temp").isel(time=-1).plot()

4. Others

  • ECOGEM shortcuts
from cgeniepy.ecology import EcoModel
model = EcoModel(path_to_model_path)
## get all phytoplankton carbon biomass and plot as map
model.get_pft("Phyto", "Biomass", "C").isel(time=-1).plot()

Gallery

A global biomass map of modelled picophytoplankton (0.6 μm)

## initialise a EcoModel instance before running this

model.get_pft(1, "Biomass", "C").isel(time=-1).plot(contour=True)

map

A global distribution of basin-level nutrient (PO4)

## initialise a GenieModel instance before running this

import matplotlib.pyplot as plt

fig, axs=plt.subplots(nrows=1, ncols=3, figsize=(15, 3), tight_layout=True)        

basins = ['Atlantic', 'Pacific', 'Indian']

for i in range(3):
	basin_data = model.get_var('ocn_PO4').isel(time=-1).mask_basin(base='worjh2',basin=basins[i], subbasin='')
	basin_data.array.values = basin_data.array.values * 1E6
	basin_data.mean(dim='lon').plot(ax=axs[i], contour=True)
	axs[i].title.set_text(basins[i])

modern_po4

Additional Colour Palettes

import numpy as np
import matplotlib.pyplot as plt
from cgeniepy.plot import community_palette, avail_palette

def plot_colormaps(cmaps):
    ncols = 4
    nrows = int(np.ceil(len(cmaps) / ncols))
    fig, axes = plt.subplots(nrows, ncols, figsize=(15, nrows))

    for i, cmap_name in enumerate(cmaps):
        row = i // ncols
        col = i % ncols
        ax = axes[row, col] if nrows > 1 else axes[col]

        # Create a gradient image using the colormap
        gradient = np.linspace(0, 1, 256).reshape(1, -1)
        ax.imshow(gradient, aspect='auto', cmap=community_palette(cmap_name))
        ax.set_title(cmap_name, fontsize=14, fontweight='bold')
        ax.axis('off')

    ## remove the unused axes
    for i in range(len(cmaps), ncols * nrows):
        row = i // ncols
        col = i % ncols
        fig.delaxes(axes[row, col])
        
    plt.tight_layout()

# List of colormaps from cgeniepy
cmaps_list = avail_palette()
plot_colormaps(cmaps_list)

color_map

Project Roadmap 🚩

  • Publish the first stable version
  • plot.py 3D facet subplots
  • Show one colorbar in transect plot
  • ignore NAs when searching grid
  • use lat/lon/zt from GENIE output
  • Documentation Webiste
  • figsize influences colorbar length
  • create a simple logo
  • allow reading an ensemble of models (netcdf & timeseries)
  • formatting the ugly unit string
  • observation.py including plot scatter
  • Add global inventory function

Killer Features

[X] Model-data comparison [X] Model ensemble support [X] Search the nearest valid grid point

Citation

@software{cgeniepy,
  author = {Rui Ying},
  title = {A Python interface to analyse and visualise cGENIE model output},
  url = {https://github.com/ruiying-ocean/cgeniepy/},
  version = {0.10.1},
  date = {2024-02-17},
}

Logo

Logo is designed by me using free righteous font.

Alternative

Alex Phol's genie_basicdiags

Raise a bug

Please use GitHub's Issues to raise a bug. This makes the issues traceable so that future users having the same problem can find the answer in the public domain.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cgeniepy-0.11.0.tar.gz (821.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cgeniepy-0.11.0-py3-none-any.whl (867.2 kB view details)

Uploaded Python 3

File details

Details for the file cgeniepy-0.11.0.tar.gz.

File metadata

  • Download URL: cgeniepy-0.11.0.tar.gz
  • Upload date:
  • Size: 821.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for cgeniepy-0.11.0.tar.gz
Algorithm Hash digest
SHA256 563fcb399cb924c2a031663cf2b9273349afa6fde3ae1a6e985157af63b415dc
MD5 ee4911f9724bc77855ebd20b5b79c35d
BLAKE2b-256 97da72dcb1254bc9fe29c9ba93252b5e552e7c5377544a8e1b4a9c1c3a2a9166

See more details on using hashes here.

File details

Details for the file cgeniepy-0.11.0-py3-none-any.whl.

File metadata

  • Download URL: cgeniepy-0.11.0-py3-none-any.whl
  • Upload date:
  • Size: 867.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.18

File hashes

Hashes for cgeniepy-0.11.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6a4e40699c7ee1fd6b7c97dbba652c49b1c5d83c0894df8a2b605b5f95b8b4ff
MD5 47408c94351bbbe84384f77581ca5e85
BLAKE2b-256 a76ca100968160d4d2e3f92cf1da6b136b91b3da392047da34bf27d6073c4b9a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page