Source code for pamtra2.hydrometeors.relativePermittivity

# -*- coding: utf-8 -*-
import warnings

import numpy as np
import xarray as xr

from ..libs import refractiveIndex
from .. import constants

'''Wrapper module to handle the refractiveIndex library from within Pamtra2.
'''

# Some work out of the box with Pamtra2:
[docs]water_turner_kneifel_cadeddu = refractiveIndex.water.turner_kneifel_cadeddu
[docs]water_ellison = refractiveIndex.water.ellison
[docs]ice_warren_brandt_2008 = refractiveIndex.ice.warren_brandt_2008
# These routines need to be wrapped to handle xarray objects.
[docs]def ice_matzler_2006( temperature, frequency, checkTemperatureForRelativePermittivity=False ): if (temperature < 240).any(): warnings.warn('ice_matzler_2006 defined only above > 240K') return refractiveIndex.ice.matzler_2006( temperature, frequency, checkTemperature=checkTemperatureForRelativePermittivity
)
[docs]def ice_iwabuchi_yang_2011(temperature, frequency): args = xr.broadcast(temperature, frequency) relativePermittivity = xr.apply_ufunc( refractiveIndex.ice.iwabuchi_yang_2011, *args, kwargs={}, output_dtypes=[np.complex], dask='parallelized', vectorize=True, ) return relativePermittivity
# Copy doc strings ice_matzler_2006.__doc__ = refractiveIndex.ice.matzler_2006.__doc__ ice_iwabuchi_yang_2011.__doc__ = refractiveIndex.ice.iwabuchi_yang_2011.__doc__ # mixing wrapper
[docs]def _mixing_wrapper(eps1, density1, func=None): mix1 = density1/constants.rhoIce mix2 = 1.0-mix1 assert (np.asarray(mix1) <= 1).all() assert (np.asarray(mix1) > 0).all() eps2 = complex(1.0, 0.0)+(0.0*eps1) mix = (mix1, mix2) eps = (eps1, eps2) return func(eps, mix)
[docs]def mixing_sihvola(relativePermittivityIce, density): args = xr.broadcast(relativePermittivityIce, density) relativePermittivity = xr.apply_ufunc( _mixing_wrapper, *args, kwargs={'func': refractiveIndex.mixing.sihvola}, output_dtypes=[np.complex], dask='parallelized', vectorize=True, ) return relativePermittivity
[docs]def mixing_bruggeman(relativePermittivityIce, density): args = xr.broadcast(relativePermittivityIce, density) relativePermittivity = xr.apply_ufunc( _mixing_wrapper, *args, kwargs={'func': refractiveIndex.mixing.bruggeman}, output_dtypes=[np.complex], dask='parallelized', vectorize=True, ) return relativePermittivity
[docs]def mixing_maxwell_garnett(relativePermittivityIce, density): args = xr.broadcast(relativePermittivityIce, density) relativePermittivity = xr.apply_ufunc( _mixing_wrapper, *args, kwargs={'func': refractiveIndex.mixing.maxwell_garnett}, output_dtypes=[np.complex], dask='parallelized', vectorize=True, ) return relativePermittivity
# Copy doc strings mixing_maxwell_garnett.__doc__ = refractiveIndex.mixing.maxwell_garnett.\ __doc__.replace('eps', 'relativePermittivityIce').replace('mix', 'density') mixing_bruggeman.__doc__ = refractiveIndex.mixing.bruggeman.__doc__.replace( 'eps', 'relativePermittivityIce').replace('mix', 'density')
[docs]mixing_sihvola.__doc__ = refractiveIndex.mixing.sihvola.__doc__.replace( 'eps', 'relativePermittivityIce').replace('mix', 'density')