Source code for parts.scattering.psd.arts.arts_psd

"""
The ArtsPSD class
=================

"""

import numpy as np
import scipy as sp
from abc import abstractproperty
from parts.scattering.psd.data.psd_data import SizeParameter, Area, D_eq,\
                                               D_max, Mass
from typhon.arts.workspace import arts_agenda

[docs]class ArtsPSD: r""" The interface for ARTS PSDs. In ARTS, A PSD for a given scattering property is defined by the corresponding agenda in the :code:`pnd_agenda_array`. The task of the :class:`ArtsPSD` class is to provide this agenda together with the names of the moments of the distribution. Attributes: size_parameter_names(dict): Dictionary that translates the :class:`SizeParameterEnum` into the corresponding name of the size parameter in ARTS. """ properties = [("size_parameter", (), SizeParameter), ("t_min", (), np.float), ("t_max", (), np.float), ("x_fit_start", (), np.float)] size_parameter_names = {D_eq : "dveq", D_max : "dmax", Mass : "mass", Area : "area"} def __init__(self, size_parameter, t_min = 0.0, t_max = 999.0): """ Parameters: size_parameter(SizeParameter) :class:`SizeParameter` enum specifying the size parameter that is used by the PSD. t_min(numpy.float): ARTS parameter, minimum temperature for which PSD values will be produced. m_max(numpy.float): ARTS parameter, maximum temperature for which PSD values will be produced. """ self.size_parameter = size_parameter self.t_min = t_min self.t_max = t_max self.x_fit_start = 100e-6 # # Abstract properties # @abstractproperty def pnd_call_agenda(self): """ The WSM call that is used to compute the PSD in ARTS. """ pass @abstractproperty def moment_names(self): """ List of strings that contains the names of the moments of the PSD. This is used in the ARTS :code:`particle_bulkrprop_names` and as name for the data requested from the data provider. """ pass # # Generic PND agenda # @property def agenda(self): """ The ARTS agenda representing the PSD. Should be used as :code:`pnd_agenda` in the ARTS :code:`pnd_agenda_array`. """ size_parameter = ArtsPSD.size_parameter_names[type(self.size_parameter)] @arts_agenda def pnd_agenda(ws): ws.ScatSpeciesSizeMassInfo(species_index = ws.agenda_array_index, x_unit = size_parameter, x_fit_start = self.x_fit_start) ws.Copy(ws.psd_size_grid, ws.scat_species_x) ws.Copy(ws.pnd_size_grid, ws.scat_species_x) INCLUDE(self.pnd_call_agenda) ws.pndFromPsdBasic() return pnd_agenda