PySDM.products.size_spectral.water_mixing_ratio

liquid water mixing ratio (per mass of dry air) computed from particle sizes (optionally restricted to a given size range)

 1"""
 2liquid water mixing ratio (per mass of dry air) computed from particle sizes
 3 (optionally restricted to a given size range)
 4"""
 5
 6import numpy as np
 7
 8from PySDM.products.impl import MomentProduct, register_product
 9
10
11@register_product()
12class WaterMixingRatio(MomentProduct):
13    def __init__(self, radius_range=None, name=None, unit="dimensionless"):
14        self.radius_range = radius_range or (0, np.inf)
15        self.signed_mass_range = None
16        super().__init__(unit=unit, name=name)
17
18    def register(self, builder):
19        super().register(builder)
20        self.signed_mass_range = (
21            self.formulae.particle_shape_and_density.radius_to_mass(
22                np.asarray(self.radius_range)
23            )
24        )
25        self.radius_range = None
26
27    def _impl(self, **kwargs):  # TODO #217
28        self._download_moment_to_buffer(
29            attr="water mass",
30            rank=0,
31            filter_range=self.signed_mass_range,
32            filter_attr="signed water mass",
33        )
34        conc = self.buffer.copy()
35
36        self._download_moment_to_buffer(
37            attr="water mass",
38            rank=1,
39            filter_range=self.signed_mass_range,
40            filter_attr="signed water mass",
41        )
42        result = self.buffer.copy()
43        result[:] *= conc
44        result[:] /= self.particulator.mesh.dv
45
46        self._download_to_buffer(self.particulator.environment["rhod"])
47        result[:] /= self.buffer
48        return result
@register_product()
class WaterMixingRatio(PySDM.products.impl.moment_product.MomentProduct):
12@register_product()
13class WaterMixingRatio(MomentProduct):
14    def __init__(self, radius_range=None, name=None, unit="dimensionless"):
15        self.radius_range = radius_range or (0, np.inf)
16        self.signed_mass_range = None
17        super().__init__(unit=unit, name=name)
18
19    def register(self, builder):
20        super().register(builder)
21        self.signed_mass_range = (
22            self.formulae.particle_shape_and_density.radius_to_mass(
23                np.asarray(self.radius_range)
24            )
25        )
26        self.radius_range = None
27
28    def _impl(self, **kwargs):  # TODO #217
29        self._download_moment_to_buffer(
30            attr="water mass",
31            rank=0,
32            filter_range=self.signed_mass_range,
33            filter_attr="signed water mass",
34        )
35        conc = self.buffer.copy()
36
37        self._download_moment_to_buffer(
38            attr="water mass",
39            rank=1,
40            filter_range=self.signed_mass_range,
41            filter_attr="signed water mass",
42        )
43        result = self.buffer.copy()
44        result[:] *= conc
45        result[:] /= self.particulator.mesh.dv
46
47        self._download_to_buffer(self.particulator.environment["rhod"])
48        result[:] /= self.buffer
49        return result

Helper class that provides a standard way to create an ABC using inheritance.

WaterMixingRatio(radius_range=None, name=None, unit='dimensionless')
14    def __init__(self, radius_range=None, name=None, unit="dimensionless"):
15        self.radius_range = radius_range or (0, np.inf)
16        self.signed_mass_range = None
17        super().__init__(unit=unit, name=name)
radius_range
signed_mass_range
def register(self, builder):
19    def register(self, builder):
20        super().register(builder)
21        self.signed_mass_range = (
22            self.formulae.particle_shape_and_density.radius_to_mass(
23                np.asarray(self.radius_range)
24            )
25        )
26        self.radius_range = None

Register a virtual subclass of an ABC.

Returns the subclass, to allow usage as a class decorator.

def instantiate(self, *, builder, buffer):
 8def _instantiate(self, *, builder, buffer):
 9    copy = deepcopy(self)
10    copy.set_buffer(buffer)
11    copy.register(builder)
12    return copy