# This software is open source software available under the BSD-3 license.
#
# Copyright (c) 2020 Triad National Security, LLC. All rights reserved.
# Copyright (c) 2020 Lawrence Livermore National Security, LLC. All rights
# reserved.
# Copyright (c) 2020 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/master/LICENSE
"""
Functions for creating climatologies from monthly time series data
"""
# Authors
# -------
# Xylar Asay-Davis
from __future__ import absolute_import, division, print_function, \
    unicode_literals
import numpy
import pyproj
from mpas_analysis.shared.constants import constants
from pyremap import LatLonGridDescriptor, ProjectionGridDescriptor
[docs]def get_comparison_descriptor(config, comparisonGridName):  # {{{
    """
    Get the comparison grid descriptor from the comparisonGridName.
    Parameters
    ----------
    config :  MpasAnalysisConfigParser object
        Contains configuration options
    comparisonGridName : {'latlon', 'antarctic', 'arctic'}
        The name of the comparison grid to use for remapping.
    Raises
    ------
    ValueError
        If comparisonGridName does not describe a known comparions grid
    """
    # Authors
    # -------
    # Xylar Asay-Davis, Milena Veneziani
    if comparisonGridName == 'latlon':
        comparisonDescriptor = \
            
_get_lat_lon_comparison_descriptor(config)
    elif comparisonGridName == 'antarctic':
        comparisonDescriptor = \
            
_get_antarctic_stereographic_comparison_descriptor(config)
    elif comparisonGridName == 'arctic':
        comparisonDescriptor = \
            
_get_arctic_stereographic_comparison_descriptor(config)
    else:
        raise ValueError('Unknown comaprison grid type {}'.format(
            comparisonGridName))
    return comparisonDescriptor  # }}} 
[docs]def get_antarctic_stereographic_projection():  # {{{
    """
    Get a projection for an Antarctic steregraphic comparison grid
    Returns
    -------
    projection : ``pyproj.Proj`` object
        The projection
    """
    # Authors
    # -------
    # Xylar Asay-Davis
    projection = pyproj.Proj('+proj=stere +lat_ts=-71.0 +lat_0=-90 +lon_0=0.0 '
                             '+k_0=1.0 +x_0=0.0 +y_0=0.0 +ellps=WGS84')
    return projection  # }}} 
def get_arctic_stereographic_projection():  # {{{
    """
    Get a projection for an Arctic stereographic comparison grid
    Returns
    -------
    projection : ``pyproj.Proj`` object
        The projection
    """
    # Authors
    # -------
    # Milena Veneziani
    projection = pyproj.Proj('+proj=stere +lat_ts=75.0 +lat_0=90 +lon_0=0.0 '
                             '+k_0=1.0 +x_0=0.0 +y_0=0.0 +ellps=WGS84')
    return projection  # }}}
def _get_lat_lon_comparison_descriptor(config):  # {{{
    """
    Get a descriptor of the lat/lon comparison grid, used for remapping and
    determining the grid name
    Parameters
    ----------
    config :  instance of ``MpasAnalysisConfigParser``
        Contains configuration options
    Returns
    -------
    descriptor : ``LatLonGridDescriptor`` object
        A descriptor of the lat/lon grid
    """
    # Authors
    # -------
    # Xylar Asay-Davis
    climSection = 'climatology'
    comparisonLatRes = config.getWithDefault(climSection,
                                             'comparisonLatResolution',
                                             constants.dLatitude)
    comparisonLonRes = config.getWithDefault(climSection,
                                             'comparisonLatResolution',
                                             constants.dLongitude)
    nLat = int((constants.latmax - constants.latmin) / comparisonLatRes) + 1
    nLon = int((constants.lonmax - constants.lonmin) / comparisonLonRes) + 1
    lat = numpy.linspace(constants.latmin, constants.latmax, nLat)
    lon = numpy.linspace(constants.lonmin, constants.lonmax, nLon)
    descriptor = LatLonGridDescriptor.create(lat, lon, units='degrees')
    return descriptor  # }}}
def _get_antarctic_stereographic_comparison_descriptor(config):  # {{{
    """
    Get a descriptor of an Antarctic stereographic comparison grid, used for
    remapping and determining the grid name
    Parameters
    ----------
    config :  instance of ``MpasAnalysisConfigParser``
        Contains configuration options
    Returns
    -------
    descriptor : ``ProjectionGridDescriptor`` object
        A descriptor of the Antarctic comparison grid
    """
    # Authors
    # -------
    # Xylar Asay-Davis
    climSection = 'climatology'
    comparisonStereoWidth = config.getfloat(climSection,
                                            'comparisonAntarcticStereoWidth')
    comparisonStereoResolution = config.getfloat(
        climSection, 'comparisonAntarcticStereoResolution')
    projection = get_antarctic_stereographic_projection()
    xMax = 0.5 * comparisonStereoWidth * 1e3
    nx = int(comparisonStereoWidth / comparisonStereoResolution) + 1
    x = numpy.linspace(-xMax, xMax, nx)
    meshName = '{}x{}km_{}km_Antarctic_stereo'.format(
        comparisonStereoWidth, comparisonStereoWidth,
        comparisonStereoResolution)
    descriptor = ProjectionGridDescriptor.create(projection, x, x, meshName)
    return descriptor  # }}}
def _get_arctic_stereographic_comparison_descriptor(config):  # {{{
    """
    Get a descriptor of an Arctic stereographic comparison grid, used for
    remapping and determining the grid name
    Parameters
    ----------
    config :  instance of ``MpasAnalysisConfigParser``
        Contains configuration options
    Returns
    -------
    descriptor : ``ProjectionGridDescriptor`` object
        A descriptor of the Arctic comparison grid
    """
    # Authors
    # -------
    # Milena Veneziani
    climSection = 'climatology'
    comparisonStereoWidth = config.getfloat(climSection,
                                            'comparisonArcticStereoWidth')
    comparisonStereoResolution = config.getfloat(
        climSection, 'comparisonArcticStereoResolution')
    projection = get_arctic_stereographic_projection()
    xMax = 0.5 * comparisonStereoWidth * 1e3
    nx = int(comparisonStereoWidth / comparisonStereoResolution) + 1
    x = numpy.linspace(-xMax, xMax, nx)
    meshName = '{}x{}km_{}km_Arctic_stereo'.format(
        comparisonStereoWidth, comparisonStereoWidth,
        comparisonStereoResolution)
    descriptor = ProjectionGridDescriptor.create(projection, x, x, meshName)
    return descriptor  # }}}