# -*- coding: utf-8 -*-
import numpy as np
import xarray as xr
from ..libs import singleScattering
from .. import constants
# required because apply_ufunc is picky about args and kwargs...
[docs]def _MieRayleighWrapper(diameter,
wavelength,
relativePermittivity,
model='Rayleigh',
):
if ((model == 'Rayleigh') or (model == 'Ray')):
scatt = singleScattering.rayleigh.RayleighScatt(
diameter,
wavelength=wavelength,
dielectric_permittivity=relativePermittivity,
)
elif (model == 'Mie'):
scatt = singleScattering.mie.MieScatt(
diameter,
wavelength=wavelength,
dielectric_permittivity=relativePermittivity,
)
return np.stack([scatt.Cext, scatt.Csca, scatt.Cabs, scatt.Cbck], axis=-1)
[docs]def _SSRGWrapper(diameter,
ssrg_volume,
aspect_ratio,
wavelength,
relativePermittivity,
ssrg_parameters='HW14'
):
scatt = singleScattering.ssrg.SsrgScatt(
diameter,
wavelength=wavelength,
dielectric_permittivity=relativePermittivity,
volume=ssrg_volume,
aspect_ratio=aspect_ratio,
ssrg_parameters=ssrg_parameters
)
return np.stack([scatt.Cext, scatt.Csca, scatt.Cabs, scatt.Cbck], axis=-1)
[docs]def _TMatrixWrapper(diameter,
aspect_ratio,
wavelength,
relativePermittivity,
):
scatt = singleScattering.tmatrix.TmatrixScatt(
diameter,
wavelength=wavelength,
dielectric_permittivity=relativePermittivity,
aspect_ratio=aspect_ratio,
alpha=0.0, # needs to be exposed to Pamtra2!
beta=0.0, # needs to be exposed to Pamtra2!
)
return np.stack([scatt.Cext, scatt.Csca, scatt.Cabs, scatt.Cbck], axis=-1)
[docs]def Mie(
sizeCenter,
wavelength,
relativePermittivity,
):
"""Simple Wrapper for singleScattering.Mie.MieScatt to
make sure it works with xr.DataArrays.
"""
kwargs = dict(model='Mie')
scatteringProperty = xr.apply_ufunc(
_MieRayleighWrapper,
sizeCenter,
wavelength,
relativePermittivity,
kwargs=kwargs,
output_core_dims=[['scatteringProperty']],
output_dtypes=[sizeCenter.dtype],
output_sizes={'scatteringProperty': 4},
dask='parallelized',
)
return scatteringProperty
[docs]def Rayleigh(
sizeCenter,
wavelength,
relativePermittivity,
):
"""Simple Wrapper for singleScattering.Rayleigh.RayleighScatt to
make sure it works with xr.DataArrays.
"""
kwargs = dict(model='Rayleigh')
scatteringProperty = xr.apply_ufunc(
_MieRayleighWrapper,
sizeCenter,
wavelength,
relativePermittivity,
kwargs=kwargs,
output_core_dims=[['scatteringProperty']],
output_dtypes=[sizeCenter.dtype],
output_sizes={'scatteringProperty': 4},
dask='parallelized',
)
return scatteringProperty
[docs]def SSRG(
sizeCenter,
mass,
aspectRatio,
wavelength,
relativePermittivity,
ssrgParameters='HW14',
):
"""Simple Wrapper for singleScattering.SSRG.SSRGScatt to
make sure it works with xr.DataArrays.
"""
kwargs = dict(ssrg_parameters=ssrgParameters)
volume_ssrg = mass/constants.rhoIce
scatteringProperty = xr.apply_ufunc(
_SSRGWrapper,
sizeCenter,
volume_ssrg,
aspectRatio,
wavelength,
relativePermittivity,
kwargs=kwargs,
output_core_dims=[['scatteringProperty']],
output_dtypes=[sizeCenter.dtype],
output_sizes={'scatteringProperty': 4},
dask='parallelized',
vectorize=True,
)
return scatteringProperty
[docs]def TMatrix(
sizeCenter,
aspectRatio,
wavelength,
relativePermittivity,
):
"""Simple Wrapper for singleScattering.SSRG.SSRGScatt to
make sure it works with xr.DataArrays.
"""
kwargs = dict()
scatteringProperty = xr.apply_ufunc(
_TMatrixWrapper,
sizeCenter,
aspectRatio,
wavelength,
relativePermittivity,
kwargs=kwargs,
output_core_dims=[['scatteringProperty']],
output_dtypes=[sizeCenter.dtype],
output_sizes={'scatteringProperty': 4},
dask='parallelized',
vectorize=True,
)
return scatteringProperty