Source code for mpas_analysis.ocean.utility

# This software is open source software available under the BSD-3 license.
#
# Copyright (c) 2022 Triad National Security, LLC. All rights reserved.
# Copyright (c) 2022 Lawrence Livermore National Security, LLC. All rights
# reserved.
# Copyright (c) 2022 UT-Battelle, LLC. All rights reserved.
#
# Additional copyright and license information can be found in the LICENSE file
# distributed with this code, or at
# https://raw.githubusercontent.com/MPAS-Dev/MPAS-Analysis/main/LICENSE
"""
A utility for computing common ocean fields (e.g. zMid) from datasets
"""
# Authors
# -------
# Xylar Asay-Davis

import numpy
import xarray


[docs] def add_standard_regions_and_subset(ds, config, regionShortNames=None): """ Add standard region names (``regionNames`` coordinate) to a dataset and rename ``nOceanRegionsTmp`` dimension to ``nOceanRegions`` (if present). Shorter standard region names are in ``regionNamesShort``. Parameters ---------- ds : xarray.Dataset the dataset to which region names should be added config : mpas_tools.config.MpasConfigParser Configuration options regionShortNames : list of str, optional A list of a subset of the short region names to use to subset the dataset Returns ------- ds : xarray.Dataset the dataset with region names added and possibly subsetted """ ds = ds.copy() if 'nOceanRegionsTmp' in ds.dims: ds = ds.rename({'nOceanRegionsTmp': 'nOceanRegions'}) allShortNames = config.getexpression('regions', 'regionShortNames') regionNames = config.getexpression('regions', 'regionNames') ds.coords['regionShortNames'] = ('nOceanRegions', allShortNames) ds.coords['regionNames'] = ('nOceanRegions', regionNames) if regionShortNames is not None: regionIndices = \ [allShortNames.index(name) for name in regionShortNames] ds = ds.isel(nOceanRegions=regionIndices) return ds
[docs] def get_standard_region_names(config, regionShortNames): """ Add standard region names from the short names Parameters ---------- config : mpas_tools.config.MpasConfigParser Configuration options regionShortNames : list of str A list of short region names Returns ------- regionNames : list of str A list of full standard region names """ allShortNames = config.getexpression('regions', 'regionShortNames') regionNames = config.getexpression('regions', 'regionNames') regionNameMap = {shortName: regionName for shortName, regionName in zip(allShortNames, regionNames)} regionNames = [regionNameMap[shortName] for shortName in regionShortNames] return regionNames
[docs] def compute_zmid(bottomDepth, maxLevelCell, layerThickness): """ Computes zMid given data arrays for bottomDepth, maxLevelCell and layerThickness Parameters ---------- bottomDepth : ``xarray.DataArray`` the depth of the ocean bottom (positive) maxLevelCell : ``xarray.DataArray`` the 0-based vertical index of the bottom of the ocean layerThickness : ``xarray.DataArray`` the thickness of MPAS-Ocean layers (possibly as a function of time) Returns ------- zMid : ``xarray.DataArray`` the vertical coordinate defining the middle of each layer, masked below the bathymetry """ # Authors # ------- # Xylar Asay-Davis nVertLevels = layerThickness.sizes['nVertLevels'] vertIndex = \ xarray.DataArray.from_dict({'dims': ('nVertLevels',), 'data': numpy.arange(nVertLevels)}) layerThickness = layerThickness.where(vertIndex <= maxLevelCell) thicknessSum = layerThickness.sum(dim='nVertLevels') thicknessCumSum = layerThickness.cumsum(dim='nVertLevels') zSurface = -bottomDepth + thicknessSum zLayerBot = zSurface - thicknessCumSum zMid = zLayerBot + 0.5 * layerThickness return zMid