Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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