Skip to content

Commit

Permalink
Add a task that plots WOA23 transects
Browse files Browse the repository at this point in the history
For now, these are at the same locations as SOSE transects
  • Loading branch information
xylar committed Nov 3, 2024
1 parent 396a63a commit 9fb283f
Show file tree
Hide file tree
Showing 12 changed files with 789 additions and 6 deletions.
2 changes: 1 addition & 1 deletion docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@
'numpy': ('http://docs.scipy.org/doc/numpy/', None),
'xarray': ('http://xarray.pydata.org/en/stable/', None),
'geometric_features':
('http://mpas-dev.github.io/geometric_features/stable/', None),
('http://mpas-dev.github.io/geometric_features/main/', None),
'mpas_tools':
('http://mpas-dev.github.io/MPAS-Tools/stable/', None)}

Expand Down
6 changes: 6 additions & 0 deletions docs/developers_guide/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,16 @@ Ocean tasks
ClimatologyMapAntarcticMelt
ClimatologyMapSose
ClimatologyMapVel
ClimatologyMapWoa
ClimatologyMapArgoTemperature
ClimatologyMapArgoSalinity
ClimatologyMapWaves
IndexNino34
MeridionalHeatTransport
OceanHistogram
OceanRegionalProfiles
RegionalTSDiagrams
SoseTransects
StreamfunctionMOC
TimeSeriesOHCAnomaly
TimeSeriesTemperatureAnomaly
Expand All @@ -87,6 +91,8 @@ Ocean tasks
TimeSeriesAntarcticMelt
TimeSeriesOceanRegions
TimeSeriesTransport
WoaTransects
WoceTransects

.. currentmodule:: mpas_analysis.ocean.compute_anomaly_subtask

Expand Down
1 change: 1 addition & 0 deletions docs/users_guide/analysis_tasks.rst
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ Analysis Tasks
tasks/indexNino34
tasks/woceTransects
tasks/soseTransects
tasks/woaTransects
tasks/geojsonTransects
tasks/oceanRegionalProfiles
tasks/regionalTSDiagrams
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
191 changes: 191 additions & 0 deletions docs/users_guide/tasks/woaTransects.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
.. |deg| unicode:: U+00B0 .. degree sign
:trim:

.. _task_woaTransects:

woaTransects
============

An analysis task for computing meridional transects of MPAS fields at evenly
spaced latitudes around Antarctica and comparing them with results from the
`World Ocean Atlas 2023 (WOA23)`_.

Component and Tags::

component: ocean
tags: climatology, transect, woa, publicObs

Configuration Options
---------------------

The following configuration options are available for this task::

[woaTransects]
## options related to plotting model vs. World Ocean Atlas 2023 (WOA23)
## transects.

# Times for comparison times (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct,
# Nov, Dec, JFM, AMJ, JAS, OND, ANN)
seasons = ['ANN', 'JFM', 'JAS']

# The approximate horizontal resolution (in km) of each transect. Latitude/
# longitude between observation points will be subsampled at this interval.
# Use 'obs' to indicate no subsampling. Use 'mpas' to indicate plotting of
# model data on the native grid, in which case comparison with observations
# will take place on the observation grid.
#horizontalResolution = mpas
#horizontalResolution = obs
horizontalResolution = 5

# The name of the vertical comparison grid. Valid values are 'mpas' for the
# MPAS vertical grid, 'obs' to use the locations of observations or
# any other name if the vertical grid is defined by 'verticalComparisonGrid'
#verticalComparisonGridName = mpas
#verticalComparisonGridName = obs
verticalComparisonGridName = uniform_10_to_1500m_at_10m

# The vertical comparison grid if 'verticalComparisonGridName' is not 'mpas' or
# 'obs'. This should be numpy array of (typically negative) elevations (in m).
# The first and last entries are used as axis bounds for 'mpas' and 'obs'
# vertical comparison grids
verticalComparisonGrid = numpy.linspace(-10, -1500, 150)

# A range for the y axis (if any)
verticalBounds = []

# The minimum weight of a destination cell after remapping. Any cell with
# weights lower than this threshold will therefore be masked out.
renormalizationThreshold = 0.01

# min and max latitude of transects
minLat = -80
maxLat = -60

# longitudes of transects
# Default transects are at Filchner, Bellingshausen Sea, Thwaites, Ross, Totten,
# Amery, Fimbul
longitudes = [318., 280., 253., 187., 117., 75., 0.]

# a list of fields top plot for each transect. All supported fields are listed
# below.
fieldList = ['temperature', 'salinity']


[woaTemperatureTransects]
## options related to plotting WOA23 transects of potential temperature

# colormap for model/observations
colormapNameResult = RdYlBu_r
# whether the colormap is indexed or continuous
colormapTypeResult = continuous
# the type of norm used in the colormap
normTypeResult = linear
# A dictionary with keywords for the norm
normArgsResult = {'vmin': -2.0, 'vmax': 2.0}
# color indices into colormapName for filled contours
#colormapIndicesResult = [0, 40, 80, 110, 140, 170, 200, 230, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsResult = [0, 0.25, 0.5, 0.75, 1, 2, 3, 4, 5, 6]
# place the ticks automatically by default
# colorbarTicksResult = numpy.linspace(0.0, 6.0, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsResult = np.arange(0.5, 6.0, 1.0)
contourLevelsResult = 'none'

# colormap for differences
colormapNameDifference = balance
# whether the colormap is indexed or continuous
colormapTypeDifference = continuous
# the type of norm used in the colormap
normTypeDifference = linear
# A dictionary with keywords for the norm
normArgsDifference = {'vmin': -2.0, 'vmax': 2.0}
# color indices into colormapName for filled contours
#colormapIndicesDifference = [0, 28, 57, 85, 113, 128, 128, 142, 170, 198, 227, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsDifference = [-2, -1.5, -1.25, -1, -0.2, 0, 0.2, 1, 1.25, 1.5, 2]
# place the ticks automatically by default
# colorbarTicksDifference = numpy.linspace(-2.0, 2.0, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsDifference = np.arange(-1.8, 2.0, 0.4)
contourLevelsDifference = 'none'


[woaSalinityTransects]
## options related to plotting WOA23 transects of salinity

# colormap for model/observations
colormapNameResult = haline
# whether the colormap is indexed or continuous
colormapTypeResult = continuous
# the type of norm used in the colormap
normTypeResult = linear
# A dictionary with keywords for the norm
normArgsResult = {'vmin': 33.8, 'vmax': 35.0}
# color indices into colormapName for filled contours
#colormapIndicesResult = [0, 40, 80, 110, 140, 170, 200, 230, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsResult = [34, 34.3, 34.5, 34.65, 34.675, 34.7, 34.725, 34.75, 34.8, 35]
# place the ticks automatically by default
# colorbarTicksResult = numpy.linspace(34.0, 35.0, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsResult = np.arange(34.1, 35.0, 0.1)
contourLevelsResult = 'none'

# colormap for differences
colormapNameDifference = balance
# whether the colormap is indexed or continuous
colormapTypeDifference = continuous
# the type of norm used in the colormap
normTypeDifference = linear
# A dictionary with keywords for the norm
normArgsDifference = {'vmin': -0.5, 'vmax': 0.5}
# color indices into colormapName for filled contours
#colormapIndicesDifference = [0, 28, 57, 85, 113, 128, 128, 142, 170, 198, 227, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsDifference = [-0.5, -0.2, -0.1, -0.05, -0.02, 0, 0.02, 0.05, 0.1, 0.2, 0.5]
# place the ticks automatically by default
# colorbarTicksDifference = numpy.linspace(-0.5, 0.5, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsDifference = numpy.linspace(-0.6, 0.6, 9)
contourLevelsDifference = 'none'


The options ``minLat`` and ``maxLat`` determine the start and end of each
meridional transect (in degrees). The option ``longitudes`` is a list or
numpy array of longitudes for each transect, e.g.::

longitudes = numpy.linspace(0, 330, 12)

produces 12 transects spaced every 30 |deg|.

The user can select only to plot a subset of the supported fields by adding
only the desired field names to ``fieldList``. Only potential temperature
and salinity are currently available.

Ater the ``woaTransects`` section, there is a section for each supported field
specifying the information related to the colormap.

For details on remaining configuration options, see:
* :ref:`config_transects`
* :ref:`config_remapping`
* :ref:`config_colormaps`
* :ref:`config_seasons`

Observations
------------

:ref:`woa23_t_s`

Example Result
--------------

.. image:: examples/woa23_transect.png
:width: 500 px
:align: center

.. _`World Ocean Atlas 2023 (WOA23)`: https://www.ncei.noaa.gov/products/world-ocean-atlas
3 changes: 3 additions & 0 deletions mpas_analysis/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,9 @@ def build_analysis_list(config, controlConfig):
analyses.append(ocean.SoseTransects(config, oceanClimatologyTasks['avg'],
controlConfig))

analyses.append(ocean.WoaTransects(config, oceanClimatologyTasks['avg'],
controlConfig))

analyses.append(ocean.GeojsonTransects(config,
oceanClimatologyTasks['avg'],
controlConfig))
Expand Down
137 changes: 136 additions & 1 deletion mpas_analysis/default.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ tablesSubdirectory = tables
generate = ['all_publicObs', 'no_icebergs', 'no_climatologyMapAntarcticMelt',
'no_timeSeriesAntarcticMelt', 'no_timeSeriesOceanRegions',
'no_climatologyMapSose', 'no_climatologyMapSchmidtko',
'no_soseTransects', 'no_oceanRegionalProfiles']
'no_soseTransects', 'no_woaTransects', 'no_oceanRegionalProfiles']


[climatology]
Expand Down Expand Up @@ -3514,6 +3514,141 @@ compareAsContoursOnSinglePlot = True
contourLevelsResult = [1027.2, 1027.4, 1027.6, 1027.7, 1027.8, 1027.85, 1027.9, 1027.95, 1028.0]


[woaTransects]
## options related to plotting model vs. World Ocean Atlas 2023 (WOA23)
## transects.

# Times for comparison times (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct,
# Nov, Dec, JFM, AMJ, JAS, OND, ANN)
seasons = ['ANN', 'JFM', 'JAS']

# The approximate horizontal resolution (in km) of each transect. Latitude/
# longitude between observation points will be subsampled at this interval.
# Use 'obs' to indicate no subsampling. Use 'mpas' to indicate plotting of
# model data on the native grid, in which case comparison with observations
# will take place on the observation grid.
#horizontalResolution = mpas
#horizontalResolution = obs
horizontalResolution = 5

# The name of the vertical comparison grid. Valid values are 'mpas' for the
# MPAS vertical grid, 'obs' to use the locations of observations or
# any other name if the vertical grid is defined by 'verticalComparisonGrid'
#verticalComparisonGridName = mpas
#verticalComparisonGridName = obs
verticalComparisonGridName = uniform_10_to_1500m_at_10m

# The vertical comparison grid if 'verticalComparisonGridName' is not 'mpas' or
# 'obs'. This should be numpy array of (typically negative) elevations (in m).
# The first and last entries are used as axis bounds for 'mpas' and 'obs'
# vertical comparison grids
verticalComparisonGrid = numpy.linspace(-10, -1500, 150)

# A range for the y axis (if any)
verticalBounds = []

# The minimum weight of a destination cell after remapping. Any cell with
# weights lower than this threshold will therefore be masked out.
renormalizationThreshold = 0.01

# min and max latitude of transects
minLat = -80
maxLat = -60

# longitudes of transects
# Default transects are at Filchner, Bellingshausen Sea, Thwaites, Ross, Totten,
# Amery, Fimbul
longitudes = [318., 280., 253., 187., 117., 75., 0.]

# a list of fields top plot for each transect. All supported fields are listed
# below.
fieldList = ['temperature', 'salinity']


[woaTemperatureTransects]
## options related to plotting WOA23 transects of potential temperature

# colormap for model/observations
colormapNameResult = RdYlBu_r
# whether the colormap is indexed or continuous
colormapTypeResult = continuous
# the type of norm used in the colormap
normTypeResult = linear
# A dictionary with keywords for the norm
normArgsResult = {'vmin': -2.0, 'vmax': 2.0}
# color indices into colormapName for filled contours
#colormapIndicesResult = [0, 40, 80, 110, 140, 170, 200, 230, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsResult = [0, 0.25, 0.5, 0.75, 1, 2, 3, 4, 5, 6]
# place the ticks automatically by default
# colorbarTicksResult = numpy.linspace(0.0, 6.0, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsResult = np.arange(0.5, 6.0, 1.0)
contourLevelsResult = 'none'

# colormap for differences
colormapNameDifference = balance
# whether the colormap is indexed or continuous
colormapTypeDifference = continuous
# the type of norm used in the colormap
normTypeDifference = linear
# A dictionary with keywords for the norm
normArgsDifference = {'vmin': -2.0, 'vmax': 2.0}
# color indices into colormapName for filled contours
#colormapIndicesDifference = [0, 28, 57, 85, 113, 128, 128, 142, 170, 198, 227, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsDifference = [-2, -1.5, -1.25, -1, -0.2, 0, 0.2, 1, 1.25, 1.5, 2]
# place the ticks automatically by default
# colorbarTicksDifference = numpy.linspace(-2.0, 2.0, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsDifference = np.arange(-1.8, 2.0, 0.4)
contourLevelsDifference = 'none'


[woaSalinityTransects]
## options related to plotting WOA23 transects of salinity

# colormap for model/observations
colormapNameResult = haline
# whether the colormap is indexed or continuous
colormapTypeResult = continuous
# the type of norm used in the colormap
normTypeResult = linear
# A dictionary with keywords for the norm
normArgsResult = {'vmin': 33.8, 'vmax': 35.0}
# color indices into colormapName for filled contours
#colormapIndicesResult = [0, 40, 80, 110, 140, 170, 200, 230, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsResult = [34, 34.3, 34.5, 34.65, 34.675, 34.7, 34.725, 34.75, 34.8, 35]
# place the ticks automatically by default
# colorbarTicksResult = numpy.linspace(34.0, 35.0, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsResult = np.arange(34.1, 35.0, 0.1)
contourLevelsResult = 'none'

# colormap for differences
colormapNameDifference = balance
# whether the colormap is indexed or continuous
colormapTypeDifference = continuous
# the type of norm used in the colormap
normTypeDifference = linear
# A dictionary with keywords for the norm
normArgsDifference = {'vmin': -0.5, 'vmax': 0.5}
# color indices into colormapName for filled contours
#colormapIndicesDifference = [0, 28, 57, 85, 113, 128, 128, 142, 170, 198, 227, 255]
# colormap levels/values for contour boundaries
#colorbarLevelsDifference = [-0.5, -0.2, -0.1, -0.05, -0.02, 0, 0.02, 0.05, 0.1, 0.2, 0.5]
# place the ticks automatically by default
# colorbarTicksDifference = numpy.linspace(-0.5, 0.5, 9)
# contour line levels (use [] for automatic contour selection, 'none' for no
# contour lines)
#contourLevelsDifference = numpy.linspace(-0.6, 0.6, 9)
contourLevelsDifference = 'none'


[climatologyMapBGC]
## options related to plotting climatology mpas of BGC

Expand Down
Loading

0 comments on commit 9fb283f

Please sign in to comment.