From 7345c7825f3c3cd22ac6e9b113ab33fecd66ed17 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Tue, 23 Nov 2021 23:38:49 -0600 Subject: [PATCH 01/12] no more cyclic imports (moving Formulae out of physics) --- .github/workflows/pylint.yml | 2 +- PySDM/__init__.py | 1 + PySDM/backends/numba.py | 2 +- PySDM/backends/thrust_rtc.py | 2 +- PySDM/dynamics/freezing.py | 1 + PySDM/{physics => }/formulae.py | 0 PySDM/physics/__init__.py | 1 - PySDM/physics/dimensional_analysis.py | 3 ++- .../smoke_tests/arabas_and_shima_2017/test_initialisation.py | 3 ++- .../smoke_tests/kreidenweis_et_al_2003/test_ionic_strength.py | 2 +- tests/smoke_tests/lowe_et_al_2019/test_fig_1.py | 3 ++- tests/smoke_tests/niedermeier_et_al_2013/__init__.py | 0 tests/smoke_tests/shima_et_al_2009/test_coalescence.py | 2 +- tests/unit_tests/attributes/test_acidity.py | 2 +- tests/unit_tests/backends/test_freezing_methods.py | 4 ++-- tests/unit_tests/backends/test_moments_methods.py | 2 +- tests/unit_tests/backends/test_oxidation.py | 3 ++- tests/unit_tests/backends/test_toms748.py | 2 +- tests/unit_tests/dynamics/coalescence/test_kernels.py | 2 +- .../unit_tests/dynamics/displacement/displacement_settings.py | 2 +- tests/unit_tests/initialisation/test_r_wet_init.py | 3 ++- .../unit_tests/initialisation/test_spectral_discretisation.py | 3 ++- tests/unit_tests/physics/test_dimensional_analysis.py | 2 +- tests/unit_tests/physics/test_formulae.py | 2 +- tests/unit_tests/physics/test_freezing_temperature_spectra.py | 3 ++- tests/unit_tests/physics/test_saturation_vapour_pressure.py | 3 ++- 26 files changed, 32 insertions(+), 23 deletions(-) rename PySDM/{physics => }/formulae.py (100%) create mode 100644 tests/smoke_tests/niedermeier_et_al_2013/__init__.py diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index d9b1e2e3d..f9f0fbe59 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -27,4 +27,4 @@ jobs: - name: Analysing the code with pylint run: | # TODO #682 - pylint --disable=fixme,invalid-name,missing-function-docstring,missing-class-docstring,missing-module-docstring,too-many-arguments,too-many-locals,too-many-instance-attributes,too-few-public-methods,protected-access,too-many-statements,duplicate-code,too-many-branches,cyclic-import $(git ls-files '*.py') + pylint --disable=fixme,invalid-name,missing-function-docstring,missing-class-docstring,missing-module-docstring,too-many-arguments,too-many-locals,too-many-instance-attributes,too-few-public-methods,protected-access,too-many-statements,duplicate-code,too-many-branches $(git ls-files '*.py') diff --git a/PySDM/__init__.py b/PySDM/__init__.py index 94e00e763..aa0b7b377 100644 --- a/PySDM/__init__.py +++ b/PySDM/__init__.py @@ -25,6 +25,7 @@ from pkg_resources import get_distribution, DistributionNotFound, VersionConflict from .builder import Builder from .particulator import Particulator +from .formulae import Formulae try: __version__ = get_distribution(__name__).version diff --git a/PySDM/backends/numba.py b/PySDM/backends/numba.py index 540bc568b..8015e4d37 100644 --- a/PySDM/backends/numba.py +++ b/PySDM/backends/numba.py @@ -13,7 +13,7 @@ from PySDM.backends.impl_numba.methods.displacement_methods import DisplacementMethods from PySDM.backends.impl_numba.random import Random as ImportedRandom from PySDM.backends.impl_numba.storage import Storage as ImportedStorage -from PySDM.physics import Formulae +from PySDM.formulae import Formulae class Numba( # pylint: disable=too-many-ancestors,duplicate-code diff --git a/PySDM/backends/thrust_rtc.py b/PySDM/backends/thrust_rtc.py index 25d4991cd..c392e67fa 100644 --- a/PySDM/backends/thrust_rtc.py +++ b/PySDM/backends/thrust_rtc.py @@ -14,7 +14,7 @@ from PySDM.backends.impl_thrust_rtc.methods.displacement_methods import DisplacementMethods from PySDM.backends.impl_thrust_rtc.storage import make_storage_class from PySDM.backends.impl_thrust_rtc.random import Random as ImportedRandom -from PySDM.physics import Formulae +from PySDM.formulae import Formulae from PySDM.backends.impl_thrust_rtc.conf import trtc diff --git a/PySDM/dynamics/freezing.py b/PySDM/dynamics/freezing.py index 3c156fb3d..a74eed7c7 100644 --- a/PySDM/dynamics/freezing.py +++ b/PySDM/dynamics/freezing.py @@ -3,6 +3,7 @@ SingularAttributes, TimeDependentAttributes ) + class Freezing: def __init__(self, *, singular=True): self.singular = singular diff --git a/PySDM/physics/formulae.py b/PySDM/formulae.py similarity index 100% rename from PySDM/physics/formulae.py rename to PySDM/formulae.py diff --git a/PySDM/physics/__init__.py b/PySDM/physics/__init__.py index 73ea93f7c..d104b6f40 100644 --- a/PySDM/physics/__init__.py +++ b/PySDM/physics/__init__.py @@ -6,4 +6,3 @@ ventilation, state_variable_triplet, trivia, particle_advection, hydrostatics, freezing_temperature_spectrum, heterogeneous_ice_nucleation_rate) from .constants import si -from .formulae import Formulae diff --git a/PySDM/physics/dimensional_analysis.py b/PySDM/physics/dimensional_analysis.py index aa64deb72..b28894da0 100644 --- a/PySDM/physics/dimensional_analysis.py +++ b/PySDM/physics/dimensional_analysis.py @@ -3,7 +3,8 @@ for use in unit tests which disables Numba and enables Pint """ from importlib import reload -from . import constants, formulae +from PySDM import formulae +from . import constants from .impl import flag diff --git a/tests/smoke_tests/arabas_and_shima_2017/test_initialisation.py b/tests/smoke_tests/arabas_and_shima_2017/test_initialisation.py index 9a77e64aa..c4e38f177 100644 --- a/tests/smoke_tests/arabas_and_shima_2017/test_initialisation.py +++ b/tests/smoke_tests/arabas_and_shima_2017/test_initialisation.py @@ -3,7 +3,8 @@ import pytest from PySDM_examples.Arabas_and_Shima_2017.settings import setups from PySDM_examples.Arabas_and_Shima_2017.simulation import Simulation -from PySDM.physics import Formulae, constants as const +from PySDM import Formulae +from PySDM.physics import constants as const class TestInitialisation: diff --git a/tests/smoke_tests/kreidenweis_et_al_2003/test_ionic_strength.py b/tests/smoke_tests/kreidenweis_et_al_2003/test_ionic_strength.py index c62135465..44001ffe9 100644 --- a/tests/smoke_tests/kreidenweis_et_al_2003/test_ionic_strength.py +++ b/tests/smoke_tests/kreidenweis_et_al_2003/test_ionic_strength.py @@ -5,7 +5,7 @@ from PySDM_examples.Kreidenweis_et_al_2003 import Settings, Simulation from PySDM.backends.impl_numba.methods.chemistry_methods import calc_ionic_strength, _K, _conc from PySDM.physics.constants import rho_w, ROOM_TEMP, K_H2O -from PySDM.physics import Formulae +from PySDM import Formulae from PySDM.physics.aqueous_chemistry.support import EquilibriumConsts diff --git a/tests/smoke_tests/lowe_et_al_2019/test_fig_1.py b/tests/smoke_tests/lowe_et_al_2019/test_fig_1.py index 7479dd698..ca7e83b5a 100644 --- a/tests/smoke_tests/lowe_et_al_2019/test_fig_1.py +++ b/tests/smoke_tests/lowe_et_al_2019/test_fig_1.py @@ -3,7 +3,8 @@ import numpy as np import pytest from PySDM_examples.Lowe_et_al_2019 import aerosol -from PySDM.physics import si, Formulae, constants as const +from PySDM import Formulae +from PySDM.physics import si, constants as const from PySDM.physics.surface_tension import compressed_film_ovadnevaite from .constants import constants diff --git a/tests/smoke_tests/niedermeier_et_al_2013/__init__.py b/tests/smoke_tests/niedermeier_et_al_2013/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/smoke_tests/shima_et_al_2009/test_coalescence.py b/tests/smoke_tests/shima_et_al_2009/test_coalescence.py index cace43d39..9ced8b16c 100644 --- a/tests/smoke_tests/shima_et_al_2009/test_coalescence.py +++ b/tests/smoke_tests/shima_et_al_2009/test_coalescence.py @@ -10,7 +10,7 @@ from PySDM.physics.spectra import Exponential from PySDM.initialisation.spectral_sampling import ConstantMultiplicity from PySDM.physics.constants import si -from PySDM.physics.formulae import Formulae +from PySDM.formulae import Formulae from ...backends_fixture import backend_class assert hasattr(backend_class, '_pytestfixturefunction') diff --git a/tests/unit_tests/attributes/test_acidity.py b/tests/unit_tests/attributes/test_acidity.py index ecdda42c0..cf82e3671 100644 --- a/tests/unit_tests/attributes/test_acidity.py +++ b/tests/unit_tests/attributes/test_acidity.py @@ -7,7 +7,7 @@ from chempy.chemistry import Species from PySDM.physics.aqueous_chemistry.support import M, EquilibriumConsts from PySDM.physics.constants import ROOM_TEMP, K_H2O -from PySDM.physics.formulae import Formulae +from PySDM.formulae import Formulae from PySDM.backends.impl_numba.methods.chemistry_methods import ChemistryMethods, _K, _conc from PySDM.dynamics import aqueous_chemistry diff --git a/tests/unit_tests/backends/test_freezing_methods.py b/tests/unit_tests/backends/test_freezing_methods.py index 2528c7e3a..ddab1cc3f 100644 --- a/tests/unit_tests/backends/test_freezing_methods.py +++ b/tests/unit_tests/backends/test_freezing_methods.py @@ -1,9 +1,9 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring from matplotlib import pylab import numpy as np -from PySDM.physics import constants as const, Formulae +from PySDM.physics import constants as const from PySDM.physics.heterogeneous_ice_nucleation_rate import constant -from PySDM import Builder +from PySDM import Builder, Formulae from PySDM.backends import CPU from PySDM.environments import Box from PySDM.dynamics import Freezing diff --git a/tests/unit_tests/backends/test_moments_methods.py b/tests/unit_tests/backends/test_moments_methods.py index 65407ca5e..f87de30fe 100644 --- a/tests/unit_tests/backends/test_moments_methods.py +++ b/tests/unit_tests/backends/test_moments_methods.py @@ -1,7 +1,7 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring import numpy as np import pytest -from PySDM.physics import Formulae +from PySDM import Formulae from ...backends_fixture import backend_class assert hasattr(backend_class, '_pytestfixturefunction') diff --git a/tests/unit_tests/backends/test_oxidation.py b/tests/unit_tests/backends/test_oxidation.py index f2556e3e0..76a64e7b8 100644 --- a/tests/unit_tests/backends/test_oxidation.py +++ b/tests/unit_tests/backends/test_oxidation.py @@ -1,9 +1,10 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring import numpy as np import pytest +from PySDM import Formulae from PySDM.backends.impl_numba.methods.chemistry_methods import ChemistryMethods from PySDM.backends.impl_numba.storage import Storage -from PySDM.physics import si, Formulae +from PySDM.physics import si from PySDM.physics.aqueous_chemistry.support import KineticConsts, EquilibriumConsts, \ DISSOCIATION_FACTORS, k4 from PySDM.physics.constants import T_STP, PI_4_3 diff --git a/tests/unit_tests/backends/test_toms748.py b/tests/unit_tests/backends/test_toms748.py index 52c3c85bf..4030725f0 100644 --- a/tests/unit_tests/backends/test_toms748.py +++ b/tests/unit_tests/backends/test_toms748.py @@ -5,7 +5,7 @@ import pytest from scipy.optimize.zeros import toms748 from PySDM.backends.impl_numba.toms748 import toms748_solve -from PySDM.physics.formulae import Formulae +from PySDM.formulae import Formulae # relevant # https://github.com/scipy/scipy/blob/master/scipy/optimize/tests/test_zeros.py diff --git a/tests/unit_tests/dynamics/coalescence/test_kernels.py b/tests/unit_tests/dynamics/coalescence/test_kernels.py index ec9af0e7c..99d456b3b 100644 --- a/tests/unit_tests/dynamics/coalescence/test_kernels.py +++ b/tests/unit_tests/dynamics/coalescence/test_kernels.py @@ -1,7 +1,7 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring import numpy as np import pytest -from PySDM.physics.formulae import Formulae +from PySDM.formulae import Formulae from PySDM.physics.coalescence_kernels import Golovin diff --git a/tests/unit_tests/dynamics/displacement/displacement_settings.py b/tests/unit_tests/dynamics/displacement/displacement_settings.py index 2423bd376..4d543b27c 100644 --- a/tests/unit_tests/dynamics/displacement/displacement_settings.py +++ b/tests/unit_tests/dynamics/displacement/displacement_settings.py @@ -1,7 +1,7 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring import numpy as np from PySDM.dynamics import Displacement -from PySDM.physics import Formulae +from PySDM import Formulae from ...dummy_particulator import DummyParticulator from ...dummy_environment import DummyEnvironment diff --git a/tests/unit_tests/initialisation/test_r_wet_init.py b/tests/unit_tests/initialisation/test_r_wet_init.py index 798d6c83b..4a860b9c4 100644 --- a/tests/unit_tests/initialisation/test_r_wet_init.py +++ b/tests/unit_tests/initialisation/test_r_wet_init.py @@ -3,7 +3,8 @@ import pytest from matplotlib import pyplot from PySDM.initialisation import r_wet_init -from PySDM.physics import Formulae, si, constants as const +from PySDM import Formulae +from PySDM.physics import si, constants as const from PySDM.physics.surface_tension import compressed_film_ovadnevaite from PySDM.backends import CPU diff --git a/tests/unit_tests/initialisation/test_spectral_discretisation.py b/tests/unit_tests/initialisation/test_spectral_discretisation.py index 2f632dd9b..e799dca3e 100644 --- a/tests/unit_tests/initialisation/test_spectral_discretisation.py +++ b/tests/unit_tests/initialisation/test_spectral_discretisation.py @@ -3,7 +3,8 @@ import pytest from PySDM.initialisation import spectral_sampling, spectro_glacial from PySDM.physics.spectra import Lognormal -from PySDM.physics import Formulae, constants as const +from PySDM import Formulae +from PySDM.physics import constants as const from PySDM.physics.freezing_temperature_spectrum import niemand_et_al_2012 niemand_et_al_2012.a = -0.517 diff --git a/tests/unit_tests/physics/test_dimensional_analysis.py b/tests/unit_tests/physics/test_dimensional_analysis.py index e288c3477..f3da783e5 100644 --- a/tests/unit_tests/physics/test_dimensional_analysis.py +++ b/tests/unit_tests/physics/test_dimensional_analysis.py @@ -2,7 +2,7 @@ import pytest import numba from PySDM.physics.dimensional_analysis import DimensionalAnalysis -from PySDM.physics.formulae import Formulae +from PySDM.formulae import Formulae from PySDM.physics import constants diff --git a/tests/unit_tests/physics/test_formulae.py b/tests/unit_tests/physics/test_formulae.py index b366afb89..abcc6397e 100644 --- a/tests/unit_tests/physics/test_formulae.py +++ b/tests/unit_tests/physics/test_formulae.py @@ -1,6 +1,6 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring from PySDM.physics import constants -from PySDM.physics.formulae import Formulae +from PySDM.formulae import Formulae from PySDM.physics.dimensional_analysis import DimensionalAnalysis diff --git a/tests/unit_tests/physics/test_freezing_temperature_spectra.py b/tests/unit_tests/physics/test_freezing_temperature_spectra.py index 55cd4d8d1..b616d39a2 100644 --- a/tests/unit_tests/physics/test_freezing_temperature_spectra.py +++ b/tests/unit_tests/physics/test_freezing_temperature_spectra.py @@ -2,7 +2,8 @@ import numpy as np import pytest from matplotlib import pylab -from PySDM.physics import Formulae, si, constants as const +from PySDM import Formulae +from PySDM.physics import si, constants as const from PySDM.physics.freezing_temperature_spectrum import niemand_et_al_2012, bigg_1953 diff --git a/tests/unit_tests/physics/test_saturation_vapour_pressure.py b/tests/unit_tests/physics/test_saturation_vapour_pressure.py index 0d68dbbf7..3911a9697 100644 --- a/tests/unit_tests/physics/test_saturation_vapour_pressure.py +++ b/tests/unit_tests/physics/test_saturation_vapour_pressure.py @@ -2,7 +2,8 @@ import inspect import numpy as np from matplotlib import pyplot -from PySDM.physics import Formulae, constants as const +from PySDM import Formulae +from PySDM.physics import constants as const def test_saturation_vapour_pressures(plot=False): From 19d2a9f947a107f59600745eb9d9a8843e171d7c Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Tue, 23 Nov 2021 23:41:46 -0600 Subject: [PATCH 02/12] bump examples req --- test-time-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-time-requirements.txt b/test-time-requirements.txt index 755e71cf8..a7fb7aa02 100644 --- a/test-time-requirements.txt +++ b/test-time-requirements.txt @@ -4,4 +4,4 @@ ghapi pytest # note: if cloning both PySDM and PySDM examples, consider "pip install -e" -PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@cb30220#egg=PySDM-examples +PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@ffee797#egg=PySDM-examples From 3ec3be667bf5a139028febdc478662345ee9f279 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Tue, 23 Nov 2021 23:46:50 -0600 Subject: [PATCH 03/12] bump examples req --- test-time-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-time-requirements.txt b/test-time-requirements.txt index a7fb7aa02..ad61d163b 100644 --- a/test-time-requirements.txt +++ b/test-time-requirements.txt @@ -4,4 +4,4 @@ ghapi pytest # note: if cloning both PySDM and PySDM examples, consider "pip install -e" -PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@ffee797#egg=PySDM-examples +PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@06c427a#egg=PySDM-examples From 9d407d1b7434ac5e870083f6c827f430e5c2793f Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 00:18:43 -0600 Subject: [PATCH 04/12] bump examples req --- test-time-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-time-requirements.txt b/test-time-requirements.txt index ad61d163b..699fed0ac 100644 --- a/test-time-requirements.txt +++ b/test-time-requirements.txt @@ -4,4 +4,4 @@ ghapi pytest # note: if cloning both PySDM and PySDM examples, consider "pip install -e" -PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@06c427a#egg=PySDM-examples +PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@5588464#egg=PySDM-examples From 06ce56dfdd98b874f14a7c84debf7955cd0e99df Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 10:15:51 -0600 Subject: [PATCH 05/12] Formulae cleanup in README --- README.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index cd9c6da43..4761590af 100644 --- a/README.md +++ b/README.md @@ -348,6 +348,7 @@ AmbientThermodynamics = pyimport("PySDM.dynamics").AmbientThermodynamics Condensation = pyimport("PySDM.dynamics").Condensation Parcel = pyimport("PySDM.environments").Parcel Builder = pyimport("PySDM").Builder +Formulae = pyimport("PySDM").Formulae products = pyimport("PySDM.products") env = Parcel( @@ -365,13 +366,14 @@ output_interval = 4 output_points = 40 n_sd = 256 -builder = Builder(backend=CPU(), n_sd=n_sd) +formulae = Formulae() +builder = Builder(backend=CPU(formulae), n_sd=n_sd) builder.set_environment(env) builder.add_dynamic(AmbientThermodynamics()) builder.add_dynamic(Condensation()) r_dry, specific_concentration = spectral_sampling.Logarithmic(spectrum).sample(n_sd) -v_dry = builder.formulae.trivia.volume(radius=r_dry) +v_dry = formulae.trivia.volume(radius=r_dry) r_wet = r_wet_init(r_dry, env, kappa * v_dry) @@ -379,7 +381,7 @@ attributes = Dict() attributes["n"] = multiplicities.discretise_n(specific_concentration * env.mass_of_dry_air) attributes["dry volume"] = v_dry attributes["kappa times dry volume"] = kappa * v_dry -attributes["volume"] = builder.formulae.trivia.volume(radius=r_wet) +attributes["volume"] = formulae.trivia.volume(radius=r_wet) particulator = builder.build(attributes, products=[ products.PeakSupersaturation(name="S_max", unit="%"), @@ -429,6 +431,7 @@ AmbientThermodynamics = py.importlib.import_module('PySDM.dynamics').AmbientTher Condensation = py.importlib.import_module('PySDM.dynamics').Condensation; Parcel = py.importlib.import_module('PySDM.environments').Parcel; Builder = py.importlib.import_module('PySDM').Builder; +Formulae = py.importlib.import_module('PySDM').Formulae; products = py.importlib.import_module('PySDM.products'); env = Parcel(pyargs( ... @@ -453,7 +456,7 @@ builder.add_dynamic(Condensation()) tmp = spectral_sampling.Logarithmic(spectrum).sample(int32(n_sd)); r_dry = tmp{1}; -v_dry = builder.formulae.trivia.volume(r_dry); +v_dry = formulae.trivia.volume(r_dry); specific_concentration = tmp{2}; r_wet = r_wet_init(r_dry, env, kappa * v_dry); @@ -461,7 +464,7 @@ attributes = py.dict(pyargs( ... 'n', multiplicities.discretise_n(specific_concentration * env.mass_of_dry_air), ... 'dry volume', v_dry, ... 'kappa times dry volume', kappa * v_dry, ... - 'volume', builder.formulae.trivia.volume(r_wet) ... + 'volume', formulae.trivia.volume(r_wet) ... )); particulator = builder.build(attributes, py.list({ ... @@ -523,7 +526,7 @@ from PySDM.initialisation import spectral_sampling, multiplicities, r_wet_init from PySDM.backends import CPU from PySDM.dynamics import AmbientThermodynamics, Condensation from PySDM.environments import Parcel -from PySDM import Builder, products +from PySDM import Builder, Formulae, products env = Parcel( dt=.25 * si.s, @@ -540,20 +543,21 @@ output_interval = 4 output_points = 40 n_sd = 256 -builder = Builder(backend=CPU(), n_sd=n_sd) +formulae = Formulae() +builder = Builder(backend=CPU(formulae), n_sd=n_sd) builder.set_environment(env) builder.add_dynamic(AmbientThermodynamics()) builder.add_dynamic(Condensation()) r_dry, specific_concentration = spectral_sampling.Logarithmic(spectrum).sample(n_sd) -v_dry = builder.formulae.trivia.volume(radius=r_dry) +v_dry = formulae.trivia.volume(radius=r_dry) r_wet = r_wet_init(r_dry, env, kappa * v_dry) attributes = { 'n': multiplicities.discretise_n(specific_concentration * env.mass_of_dry_air), 'dry volume': v_dry, 'kappa times dry volume': kappa * v_dry, - 'volume': builder.formulae.trivia.volume(radius=r_wet) + 'volume': formulae.trivia.volume(radius=r_wet) } particulator = builder.build(attributes, products=[ From a73129095e63bc0de63c250787c0e58bdb154b4a Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 19:50:22 -0600 Subject: [PATCH 06/12] spectra moved out of physics, new directory structure under initialisation --- PySDM/builder.py | 4 +- PySDM/environments/kinematic_1d.py | 10 +- PySDM/environments/kinematic_2d.py | 8 +- PySDM/initialisation/__init__.py | 12 +- ...cities.py => discretise_multiplicities.py} | 2 +- ...r_wet_init.py => equilibrate_wet_radii.py} | 10 +- PySDM/initialisation/impl/spectrum.py | 34 +++++ PySDM/initialisation/sampling/__init__.py | 0 .../{ => sampling}/spatial_sampling.py | 0 .../{ => sampling}/spectral_sampling.py | 26 ++-- .../spectro_glacial_sampling.py} | 2 +- PySDM/initialisation/spectra/__init__.py | 8 ++ PySDM/initialisation/spectra/exponential.py | 10 ++ PySDM/initialisation/spectra/lognormal.py | 31 +++++ PySDM/initialisation/spectra/sum.py | 30 +++++ PySDM/initialisation/spectra/top_hat.py | 16 +++ PySDM/physics/spectra.py | 120 ------------------ README.md | 45 ++++--- test-time-requirements.txt | 2 +- .../berry_1967/test_coalescence.py | 2 +- .../test_spectrum_at_t_0.py | 2 +- .../smoke_tests/lowe_et_al_2019/test_fig_2.py | 2 +- .../shima_et_al_2009/test_coalescence.py | 4 +- .../dynamics/coalescence/test_croupiers.py | 4 +- .../coalescence/test_sdm_multi_cell.py | 2 +- tests/unit_tests/impl/test_moments.py | 10 +- .../initialisation/test_r_wet_init.py | 4 +- .../test_spectral_discretisation.py | 6 +- tests/unit_tests/physics/test_spectra.py | 3 +- .../physics/test_spectra_top_hat.py | 2 +- 30 files changed, 214 insertions(+), 197 deletions(-) rename PySDM/initialisation/{multiplicities.py => discretise_multiplicities.py} (93%) rename PySDM/initialisation/{r_wet_init.py => equilibrate_wet_radii.py} (91%) create mode 100644 PySDM/initialisation/impl/spectrum.py create mode 100644 PySDM/initialisation/sampling/__init__.py rename PySDM/initialisation/{ => sampling}/spatial_sampling.py (100%) rename PySDM/initialisation/{ => sampling}/spectral_sampling.py (77%) rename PySDM/initialisation/{spectro_glacial.py => sampling/spectro_glacial_sampling.py} (95%) create mode 100644 PySDM/initialisation/spectra/__init__.py create mode 100644 PySDM/initialisation/spectra/exponential.py create mode 100644 PySDM/initialisation/spectra/lognormal.py create mode 100644 PySDM/initialisation/spectra/sum.py create mode 100644 PySDM/initialisation/spectra/top_hat.py delete mode 100644 PySDM/physics/spectra.py diff --git a/PySDM/builder.py b/PySDM/builder.py index 81484e718..6d71e9c19 100644 --- a/PySDM/builder.py +++ b/PySDM/builder.py @@ -4,7 +4,7 @@ import inspect import numpy as np from PySDM.particulator import Particulator -from PySDM.initialisation.multiplicities import discretise_n # TODO #324 +from PySDM.initialisation.discretise_multiplicities import discretise_multiplicities # TODO #324 from PySDM.impl.particle_attributes_factory import ParticlesFactory from PySDM.impl.wall_timer import WallTimer from PySDM.attributes.impl.mapper import get_class as attr_class @@ -55,7 +55,7 @@ def request_attribute(self, attribute, variant=None): if variant is not None: assert variant == self.req_attr[attribute] - def build(self, attributes: dict, products: tuple = (), int_caster=discretise_n): + def build(self, attributes: dict, products: tuple = (), int_caster=discretise_multiplicities): assert self.particulator.environment is not None for dynamic in self.particulator.dynamics.values(): diff --git a/PySDM/environments/kinematic_1d.py b/PySDM/environments/kinematic_1d.py index bd774acdd..968f3df33 100644 --- a/PySDM/environments/kinematic_1d.py +++ b/PySDM/environments/kinematic_1d.py @@ -5,8 +5,8 @@ import numpy as np from ._moist import _Moist -from ..initialisation.r_wet_init import r_wet_init -from ..initialisation.multiplicities import discretise_n +from ..initialisation.equilibrate_wet_radii import equilibrate_wet_radii +from ..initialisation.discretise_multiplicities import discretise_multiplicities from ..impl import arakawa_c @@ -47,14 +47,14 @@ def init_attributes(self, *, r_dry, n_per_kg = spectral_discretisation.sample(self.particulator.n_sd) attributes['dry volume'] = self.formulae.trivia.volume(radius=r_dry) attributes['kappa times dry volume'] = attributes['dry volume'] * kappa - r_wet = r_wet_init(r_dry, self, cell_id=attributes['cell id'], - kappa_times_dry_volume=attributes['kappa times dry volume']) + r_wet = equilibrate_wet_radii(r_dry, self, cell_id=attributes['cell id'], + kappa_times_dry_volume=attributes['kappa times dry volume']) rhod = self['rhod'].to_ndarray() cell_id = attributes['cell id'] domain_volume = np.prod(np.array(self.mesh.size)) - attributes['n'] = discretise_n(n_per_kg * rhod[cell_id] * domain_volume) + attributes['n'] = discretise_multiplicities(n_per_kg * rhod[cell_id] * domain_volume) attributes['volume'] = self.formulae.trivia.volume(radius=r_wet) return attributes diff --git a/PySDM/environments/kinematic_2d.py b/PySDM/environments/kinematic_2d.py index 1aca1f20d..815b27712 100644 --- a/PySDM/environments/kinematic_2d.py +++ b/PySDM/environments/kinematic_2d.py @@ -5,8 +5,8 @@ import numpy as np from PySDM.impl.mesh import Mesh -from PySDM.initialisation.r_wet_init import r_wet_init, default_rtol -from PySDM.initialisation.multiplicities import discretise_n +from PySDM.initialisation.equilibrate_wet_radii import equilibrate_wet_radii, default_rtol +from PySDM.initialisation.discretise_multiplicities import discretise_multiplicities from ._moist import _Moist from ..impl import arakawa_c @@ -60,7 +60,7 @@ def init_attributes(self, *, if kappa == 0: r_wet = r_dry else: - r_wet = r_wet_init( + r_wet = equilibrate_wet_radii( r_dry=r_dry, environment=self, kappa_times_dry_volume=attributes['kappa times dry volume'], @@ -71,7 +71,7 @@ def init_attributes(self, *, cell_id = attributes['cell id'] domain_volume = np.prod(np.array(self.mesh.size)) - attributes['n'] = discretise_n(n_per_kg * rhod[cell_id] * domain_volume) + attributes['n'] = discretise_multiplicities(n_per_kg * rhod[cell_id] * domain_volume) attributes['volume'] = self.formulae.trivia.volume(radius=r_wet) return attributes diff --git a/PySDM/initialisation/__init__.py b/PySDM/initialisation/__init__.py index 03cc0a080..ec15d47e5 100644 --- a/PySDM/initialisation/__init__.py +++ b/PySDM/initialisation/__init__.py @@ -1,10 +1,6 @@ """ -Initialisation logic incl. -`PySDM.initialisation.spectral_sampling`, -`PySDM.initialisation.spatial_sampling`, -`PySDM.initialisation.spectra` +Initialisation logic particle size spectra, sampling methods and +wet radii equilibration """ -from .r_wet_init import r_wet_init -from . import spectral_sampling -from . import spatial_sampling -from . import multiplicities +from .discretise_multiplicities import discretise_multiplicities +from .equilibrate_wet_radii import equilibrate_wet_radii diff --git a/PySDM/initialisation/multiplicities.py b/PySDM/initialisation/discretise_multiplicities.py similarity index 93% rename from PySDM/initialisation/multiplicities.py rename to PySDM/initialisation/discretise_multiplicities.py index 8e3eea1f3..cfd5a3aea 100644 --- a/PySDM/initialisation/multiplicities.py +++ b/PySDM/initialisation/discretise_multiplicities.py @@ -4,7 +4,7 @@ import numpy as np -def discretise_n(y_float): +def discretise_multiplicities(y_float): y_int = y_float.round().astype(np.int64) percent_diff = 100 * abs(1 - np.sum(y_float) / np.sum(y_int.astype(float))) diff --git a/PySDM/initialisation/r_wet_init.py b/PySDM/initialisation/equilibrate_wet_radii.py similarity index 91% rename from PySDM/initialisation/r_wet_init.py rename to PySDM/initialisation/equilibrate_wet_radii.py index a497653b0..05bb3621c 100644 --- a/PySDM/initialisation/r_wet_init.py +++ b/PySDM/initialisation/equilibrate_wet_radii.py @@ -12,11 +12,11 @@ default_max_iters = 64 -def r_wet_init(r_dry: np.ndarray, environment, - kappa_times_dry_volume: np.ndarray, - f_org: np.ndarray = None, - cell_id: np.ndarray = None, - rtol=default_rtol, max_iters=default_max_iters): +def equilibrate_wet_radii(r_dry: np.ndarray, environment, + kappa_times_dry_volume: np.ndarray, + f_org: np.ndarray = None, + cell_id: np.ndarray = None, + rtol=default_rtol, max_iters=default_max_iters): if cell_id is None: cell_id = np.zeros_like(r_dry, dtype=int) if f_org is None: diff --git a/PySDM/initialisation/impl/spectrum.py b/PySDM/initialisation/impl/spectrum.py new file mode 100644 index 000000000..01ca3af74 --- /dev/null +++ b/PySDM/initialisation/impl/spectrum.py @@ -0,0 +1,34 @@ +import numpy as np +from PySDM.initialisation.sampling.spectral_sampling import default_cdf_range + +default_interpolation_grid = tuple(np.linspace(*default_cdf_range, 999)) + + +class Spectrum: + + def __init__(self, distribution, distribution_params, norm_factor): + self.distribution_params = distribution_params # (loc, scale) + self.norm_factor = norm_factor + self.distribution = distribution + + def size_distribution(self, arg): + result = self.norm_factor * self.distribution.pdf(arg, *self.distribution_params) + return result + + def pdf(self, arg): + return self.size_distribution(arg) / self.norm_factor + + def cdf(self, arg): + return self.distribution.cdf(arg, *self.distribution_params) + + def stats(self, moments): + result = self.distribution.stats(*self.distribution_params, moments) + return result + + def cumulative(self, arg): + result = self.norm_factor * self.distribution.cdf(arg, *self.distribution_params) + return result + + def percentiles(self, cdf_values): + result = self.distribution.ppf(cdf_values, *self.distribution_params) + return result \ No newline at end of file diff --git a/PySDM/initialisation/sampling/__init__.py b/PySDM/initialisation/sampling/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/PySDM/initialisation/spatial_sampling.py b/PySDM/initialisation/sampling/spatial_sampling.py similarity index 100% rename from PySDM/initialisation/spatial_sampling.py rename to PySDM/initialisation/sampling/spatial_sampling.py diff --git a/PySDM/initialisation/spectral_sampling.py b/PySDM/initialisation/sampling/spectral_sampling.py similarity index 77% rename from PySDM/initialisation/spectral_sampling.py rename to PySDM/initialisation/sampling/spectral_sampling.py index 951fc8526..4816f385c 100644 --- a/PySDM/initialisation/spectral_sampling.py +++ b/PySDM/initialisation/sampling/spectral_sampling.py @@ -1,4 +1,4 @@ -from typing import Tuple +from typing import Tuple, Optional import numpy as np from scipy import optimize from PySDM.physics import constants as const @@ -7,8 +7,13 @@ class SpectralSampling: - def __init__(self, spectrum, size_range: [None, Tuple[float, float]] = None): + def __init__(self, + spectrum, + size_range: [None, Tuple[float, float]] = None, + error_threshold: Optional[float] = None + ): self.spectrum = spectrum + self.error_threshold = error_threshold or .01 if size_range is None: if hasattr(spectrum, 'percentiles'): @@ -28,15 +33,14 @@ def __init__(self, spectrum, size_range: [None, Tuple[float, float]] = None): assert size_range[1] > size_range[0] self.size_range = size_range - @staticmethod - def _sample(grid, spectrum): + def _sample(self, grid, spectrum): x = grid[1: -1: 2] cdf = spectrum.cumulative(grid[0::2]) y_float = cdf[1:] - cdf[0:-1] - percent_diff = 100 * abs(1 - np.sum(y_float) / spectrum.norm_factor) - if percent_diff > 1: - raise Exception(f"{percent_diff}% error in total real-droplet number due to sampling") + diff = abs(1 - np.sum(y_float) / spectrum.norm_factor) + if diff > self.error_threshold: + raise Exception(f"{100*diff}% error in total real-droplet number due to sampling") return x, y_float @@ -48,8 +52,12 @@ def sample(self, n_sd): class Logarithmic(SpectralSampling): - def __init__(self, spectrum, size_range: [None, Tuple[float, float]] = None): - super().__init__(spectrum, size_range) + def __init__(self, + spectrum, + size_range: [None, Tuple[float, float]] = None, + error_threshold: Optional[float] = None + ): + super().__init__(spectrum, size_range, error_threshold) self.start = np.log10(self.size_range[0]) self.stop = np.log10(self.size_range[1]) diff --git a/PySDM/initialisation/spectro_glacial.py b/PySDM/initialisation/sampling/spectro_glacial_sampling.py similarity index 95% rename from PySDM/initialisation/spectro_glacial.py rename to PySDM/initialisation/sampling/spectro_glacial_sampling.py index f84ca12f1..d20422fc4 100644 --- a/PySDM/initialisation/spectro_glacial.py +++ b/PySDM/initialisation/sampling/spectro_glacial_sampling.py @@ -1,5 +1,5 @@ import numpy as np -from PySDM.initialisation.spectral_sampling import default_cdf_range +from PySDM.initialisation.sampling.spectral_sampling import default_cdf_range from PySDM.physics import constants as const # DIM_SIZE = 0 diff --git a/PySDM/initialisation/spectra/__init__.py b/PySDM/initialisation/spectra/__init__.py new file mode 100644 index 000000000..b04c53568 --- /dev/null +++ b/PySDM/initialisation/spectra/__init__.py @@ -0,0 +1,8 @@ +""" +Classes representing logic around size spectra and more generally +probability density functions (based on SciPy.stats logic) +""" +from .exponential import Exponential +from .lognormal import Lognormal +from .top_hat import TopHat +from .sum import Sum diff --git a/PySDM/initialisation/spectra/exponential.py b/PySDM/initialisation/spectra/exponential.py new file mode 100644 index 000000000..28d92899b --- /dev/null +++ b/PySDM/initialisation/spectra/exponential.py @@ -0,0 +1,10 @@ +from scipy.stats import expon +from ..impl.spectrum import Spectrum + +class Exponential(Spectrum): + + def __init__(self, norm_factor, scale): + super().__init__(expon, ( + 0, # loc + scale # scale = 1/lambda + ), norm_factor) \ No newline at end of file diff --git a/PySDM/initialisation/spectra/lognormal.py b/PySDM/initialisation/spectra/lognormal.py new file mode 100644 index 000000000..21bf117da --- /dev/null +++ b/PySDM/initialisation/spectra/lognormal.py @@ -0,0 +1,31 @@ +import math +from scipy.stats import lognorm +from PySDM.initialisation.impl.spectrum import Spectrum + + +class Lognormal(Spectrum): + + def __init__(self, norm_factor: float, m_mode: float, s_geom: float): + super().__init__(lognorm, (math.log(s_geom), 0, m_mode), norm_factor) + + @property + def s_geom(self): + return math.exp(self.distribution_params[0]) + + @property + def m_mode(self): + return self.distribution_params[2] + + @property + def median(self): + return self.m_mode + + @property + def geometric_mean(self): + return self.s_geom + + def __str__(self): + return f"{self.__class__.__name__}:"\ + f" (N={self.norm_factor:.3g},"\ + f" m_mode={self.m_mode:.3g},"\ + f" s_geom={self.s_geom:.3g})" \ No newline at end of file diff --git a/PySDM/initialisation/spectra/sum.py b/PySDM/initialisation/spectra/sum.py new file mode 100644 index 000000000..b6373d6eb --- /dev/null +++ b/PySDM/initialisation/spectra/sum.py @@ -0,0 +1,30 @@ +import numpy as np +from scipy.interpolate import interp1d +from PySDM.initialisation.impl.spectrum import default_interpolation_grid + + +class Sum: + + def __init__(self, spectra: tuple, interpolation_grid=default_interpolation_grid): + self.spectra = spectra + self.norm_factor = sum((s.norm_factor for s in self.spectra)) + percentiles = [s.percentiles(interpolation_grid) for s in self.spectra] + cdf_arg = np.zeros(len(interpolation_grid) * len(self.spectra) + 1) + cdf_arg[1:] = np.concatenate(percentiles) + cdf = self.cumulative(cdf_arg) / self.norm_factor + self.inverse_cdf = interp1d(cdf, cdf_arg) + + def size_distribution(self, arg): + result = 0. + for spectrum in self.spectra: + result += spectrum.size_distribution(arg) + return result + + def cumulative(self, arg): + result = 0. + for spectrum in self.spectra: + result += spectrum.cumulative(arg) + return result + + def percentiles(self, cdf_values): + return self.inverse_cdf(cdf_values) \ No newline at end of file diff --git a/PySDM/initialisation/spectra/top_hat.py b/PySDM/initialisation/spectra/top_hat.py new file mode 100644 index 000000000..aa78c3e14 --- /dev/null +++ b/PySDM/initialisation/spectra/top_hat.py @@ -0,0 +1,16 @@ +import numpy as np + + +class TopHat: + def __init__(self, norm_factor, endpoints): + self.norm_factor = norm_factor + self.endpoints = endpoints + self._mn = endpoints[0] + self._mx = endpoints[1] + + def cumulative(self, arg): + cdf = np.minimum(1, np.maximum(0, (arg - self._mn) / (self._mx - self._mn))) + return self.norm_factor * cdf + + def percentiles(self, cdf_values): + return (self._mx - self._mn) * (np.asarray(cdf_values) + self._mn / (self._mx - self._mn)) \ No newline at end of file diff --git a/PySDM/physics/spectra.py b/PySDM/physics/spectra.py deleted file mode 100644 index a89811ae5..000000000 --- a/PySDM/physics/spectra.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -Classes representing particle size spectra (based on SciPy.stats logic) -""" -import math -import numpy as np -from scipy.stats import lognorm -from scipy.stats import expon -from scipy.interpolate import interp1d -from ..initialisation.spectral_sampling import default_cdf_range - -default_interpolation_grid = tuple(np.linspace(*default_cdf_range, 999)) - - -class Spectrum: - - def __init__(self, distribution, distribution_params, norm_factor): - self.distribution_params = distribution_params # (loc, scale) - self.norm_factor = norm_factor - self.distribution = distribution - - def size_distribution(self, arg): - result = self.norm_factor * self.distribution.pdf(arg, *self.distribution_params) - return result - - def pdf(self, arg): - return self.size_distribution(arg) / self.norm_factor - - def cdf(self, arg): - return self.distribution.cdf(arg, *self.distribution_params) - - def stats(self, moments): - result = self.distribution.stats(*self.distribution_params, moments) - return result - - def cumulative(self, arg): - result = self.norm_factor * self.distribution.cdf(arg, *self.distribution_params) - return result - - def percentiles(self, cdf_values): - result = self.distribution.ppf(cdf_values, *self.distribution_params) - return result - - -class Exponential(Spectrum): - - def __init__(self, norm_factor, scale): - super().__init__(expon, ( - 0, # loc - scale # scale = 1/lambda - ), norm_factor) - - -class Lognormal(Spectrum): - - def __init__(self, norm_factor: float, m_mode: float, s_geom: float): - super().__init__(lognorm, (math.log(s_geom), 0, m_mode), norm_factor) - - @property - def s_geom(self): - return math.exp(self.distribution_params[0]) - - @property - def m_mode(self): - return self.distribution_params[2] - - @property - def median(self): - return self.m_mode - - @property - def geometric_mean(self): - return self.s_geom - - def __str__(self): - return f"{self.__class__.__name__}:"\ - f" (N={self.norm_factor:.3g},"\ - f" m_mode={self.m_mode:.3g},"\ - f" s_geom={self.s_geom:.3g})" - - -class TopHat: - def __init__(self, norm_factor, endpoints): - self.norm_factor = norm_factor - self.endpoints = endpoints - self._mn = endpoints[0] - self._mx = endpoints[1] - - def cumulative(self, arg): - cdf = np.minimum(1, np.maximum(0, (arg - self._mn) / (self._mx - self._mn))) - return self.norm_factor * cdf - - def percentiles(self, cdf_values): - return (self._mx - self._mn) * (np.asarray(cdf_values) + self._mn / (self._mx - self._mn)) - - -class Sum: - - def __init__(self, spectra: tuple, interpolation_grid=default_interpolation_grid): - self.spectra = spectra - self.norm_factor = sum((s.norm_factor for s in self.spectra)) - percentiles = [s.percentiles(interpolation_grid) for s in self.spectra] - cdf_arg = np.zeros(len(interpolation_grid) * len(self.spectra) + 1) - cdf_arg[1:] = np.concatenate(percentiles) - cdf = self.cumulative(cdf_arg) / self.norm_factor - self.inverse_cdf = interp1d(cdf, cdf_arg) - - def size_distribution(self, arg): - result = 0. - for spectrum in self.spectra: - result += spectrum.size_distribution(arg) - return result - - def cumulative(self, arg): - result = 0. - for spectrum in self.spectra: - result += spectrum.cumulative(arg) - return result - - def percentiles(self, cdf_values): - return self.inverse_cdf(cdf_values) diff --git a/README.md b/README.md index 4761590af..36a5061b4 100644 --- a/README.md +++ b/README.md @@ -146,8 +146,8 @@ attributes = py.dict(pyargs('volume', tmp{1}, 'n', tmp{2})); ```Python from PySDM.physics import si -from PySDM.initialisation.spectral_sampling import ConstantMultiplicity -from PySDM.physics.spectra import Exponential +from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity +from PySDM.initialisation.spectra.exponential import Exponential n_sd = 2 ** 15 initial_spectrum = Exponential(norm_factor=8.39e12, scale=1.19e5 * si.um ** 3) @@ -340,9 +340,9 @@ using PyCall using Plots; plotlyjs() si = pyimport("PySDM.physics").si spectral_sampling = pyimport("PySDM.initialisation").spectral_sampling -multiplicities = pyimport("PySDM.initialisation").multiplicities -spectra = pyimport("PySDM.physics").spectra -r_wet_init = pyimport("PySDM.initialisation").r_wet_init +discretise_multiplicities = pyimport("PySDM.initialisation").discretise_multiplicities +Lognormal = pyimport("PySDM.initialisation.spectra").Lognormal +equilibrate_wet_radii = pyimport("PySDM.initialisation").equilibrate_wet_radii CPU = pyimport("PySDM.backends").CPU AmbientThermodynamics = pyimport("PySDM.dynamics").AmbientThermodynamics Condensation = pyimport("PySDM.dynamics").Condensation @@ -359,7 +359,7 @@ env = Parcel( T0=300 * si.K, w= 2.5 * si.m / si.s ) -spectrum=spectra.Lognormal(norm_factor=1e4/si.mg, m_mode=50*si.nm, s_geom=1.4) +spectrum = Lognormal(norm_factor=1e4/si.mg, m_mode=50*si.nm, s_geom=1.4) kappa = .5 * si.dimensionless cloud_range = (.5 * si.um, 25 * si.um) output_interval = 4 @@ -374,11 +374,10 @@ builder.add_dynamic(Condensation()) r_dry, specific_concentration = spectral_sampling.Logarithmic(spectrum).sample(n_sd) v_dry = formulae.trivia.volume(radius=r_dry) -r_wet = r_wet_init(r_dry, env, kappa * v_dry) - +r_wet = equilibrate_wet_radii(r_dry, env, kappa * v_dry) attributes = Dict() -attributes["n"] = multiplicities.discretise_n(specific_concentration * env.mass_of_dry_air) +attributes["n"] = discretise_multiplicities(specific_concentration * env.mass_of_dry_air) attributes["dry volume"] = v_dry attributes["kappa times dry volume"] = kappa * v_dry attributes["volume"] = formulae.trivia.volume(radius=r_wet) @@ -423,9 +422,9 @@ savefig("parcel.svg") ```Matlab si = py.importlib.import_module('PySDM.physics').si; spectral_sampling = py.importlib.import_module('PySDM.initialisation').spectral_sampling; -multiplicities = py.importlib.import_module('PySDM.initialisation').multiplicities; -spectra = py.importlib.import_module('PySDM.physics').spectra; -r_wet_init = py.importlib.import_module('PySDM.initialisation').r_wet_init; +discretise_multiplicities = py.importlib.import_module('PySDM.initialisation').discretise_multiplicities; +Lognormal = py.importlib.import_module('PySDM.initialisation.spectra').Lognormal; +equilibrate_wet_radii = py.importlib.import_module('PySDM.initialisation').equilibrate_wet_radii; CPU = py.importlib.import_module('PySDM.backends').CPU; AmbientThermodynamics = py.importlib.import_module('PySDM.dynamics').AmbientThermodynamics; Condensation = py.importlib.import_module('PySDM.dynamics').Condensation; @@ -442,14 +441,15 @@ env = Parcel(pyargs( ... 'T0', 300 * si.K, ... 'w', 2.5 * si.m / si.s ... )); -spectrum = spectra.Lognormal(pyargs('norm_factor', 1e4/si.mg, 'm_mode', 50 * si.nm, 's_geom', 1.4)); +spectrum = Lognormal(pyargs('norm_factor', 1e4/si.mg, 'm_mode', 50 * si.nm, 's_geom', 1.4)); kappa = .5; cloud_range = py.tuple({.5 * si.um, 25 * si.um}); output_interval = 4; output_points = 40; n_sd = 256; -builder = Builder(pyargs('backend', CPU(), 'n_sd', int32(n_sd))); +formulae = Formulae() +builder = Builder(pyargs('backend', CPU(formulae), 'n_sd', int32(n_sd))); builder.set_environment(env); builder.add_dynamic(AmbientThermodynamics()) builder.add_dynamic(Condensation()) @@ -458,10 +458,10 @@ tmp = spectral_sampling.Logarithmic(spectrum).sample(int32(n_sd)); r_dry = tmp{1}; v_dry = formulae.trivia.volume(r_dry); specific_concentration = tmp{2}; -r_wet = r_wet_init(r_dry, env, kappa * v_dry); +r_wet = equilibrate_wet_radii(r_dry, env, kappa * v_dry); attributes = py.dict(pyargs( ... - 'n', multiplicities.discretise_n(specific_concentration * env.mass_of_dry_air), ... + 'n', discretise_multiplicities(specific_concentration * env.mass_of_dry_air), ... 'dry volume', v_dry, ... 'kappa times dry volume', kappa * v_dry, ... 'volume', formulae.trivia.volume(r_wet) ... @@ -520,9 +520,12 @@ saveas(gcf, "parcel.png") Python (click to expand) ```Python +import PySDM.initialisation.spectra.lognormal from matplotlib import pyplot -from PySDM.physics import si, spectra -from PySDM.initialisation import spectral_sampling, multiplicities, r_wet_init +from PySDM.physics import si +from PySDM.initialisation import discretise_multiplicities, equilibrate_wet_radii +from PySDM.initialisation.spectra import Lognormal +from PySDM.initialisation.sampling import spectral_sampling from PySDM.backends import CPU from PySDM.dynamics import AmbientThermodynamics, Condensation from PySDM.environments import Parcel @@ -536,7 +539,7 @@ env = Parcel( T0=300 * si.K, w=2.5 * si.m / si.s ) -spectrum = spectra.Lognormal(norm_factor=1e4 / si.mg, m_mode=50 * si.nm, s_geom=1.5) +spectrum = Lognormal(norm_factor=1e4 / si.mg, m_mode=50 * si.nm, s_geom=1.5) kappa = .5 * si.dimensionless cloud_range = (.5 * si.um, 25 * si.um) output_interval = 4 @@ -551,10 +554,10 @@ builder.add_dynamic(Condensation()) r_dry, specific_concentration = spectral_sampling.Logarithmic(spectrum).sample(n_sd) v_dry = formulae.trivia.volume(radius=r_dry) -r_wet = r_wet_init(r_dry, env, kappa * v_dry) +r_wet = equilibrate_wet_radii(r_dry, env, kappa * v_dry) attributes = { - 'n': multiplicities.discretise_n(specific_concentration * env.mass_of_dry_air), + 'n': discretise_multiplicities.discretise_multiplicities(specific_concentration * env.mass_of_dry_air), 'dry volume': v_dry, 'kappa times dry volume': kappa * v_dry, 'volume': formulae.trivia.volume(radius=r_wet) diff --git a/test-time-requirements.txt b/test-time-requirements.txt index 699fed0ac..8af10bf0b 100644 --- a/test-time-requirements.txt +++ b/test-time-requirements.txt @@ -4,4 +4,4 @@ ghapi pytest # note: if cloning both PySDM and PySDM examples, consider "pip install -e" -PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@5588464#egg=PySDM-examples +PySDM-examples @ git+git://github.com/slayoo/PySDM-examples@8267691#egg=PySDM-examples diff --git a/tests/smoke_tests/berry_1967/test_coalescence.py b/tests/smoke_tests/berry_1967/test_coalescence.py index ed995c896..63864f14a 100644 --- a/tests/smoke_tests/berry_1967/test_coalescence.py +++ b/tests/smoke_tests/berry_1967/test_coalescence.py @@ -7,7 +7,7 @@ from PySDM.builder import Builder from PySDM.dynamics import Coalescence from PySDM.environments import Box -from PySDM.initialisation.spectral_sampling import ConstantMultiplicity +from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity from PySDM.physics.coalescence_kernels import Golovin, Geometric, Electric, Hydrodynamic from ...backends_fixture import backend_class diff --git a/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py b/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py index 5168f9fbb..5c6f283d4 100644 --- a/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py +++ b/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py @@ -5,7 +5,7 @@ from matplotlib import pyplot from PySDM_examples.Kreidenweis_et_al_2003 import Settings, Simulation from PySDM.physics import si -from PySDM.initialisation.spectral_sampling import ConstantMultiplicity, Logarithmic, UniformRandom +from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity, Logarithmic, UniformRandom @pytest.mark.parametrize("spectral_sampling", [ diff --git a/tests/smoke_tests/lowe_et_al_2019/test_fig_2.py b/tests/smoke_tests/lowe_et_al_2019/test_fig_2.py index c7fd6166e..9d19727de 100644 --- a/tests/smoke_tests/lowe_et_al_2019/test_fig_2.py +++ b/tests/smoke_tests/lowe_et_al_2019/test_fig_2.py @@ -2,7 +2,7 @@ import pytest import numpy as np from PySDM_examples.Lowe_et_al_2019 import Settings, Simulation, aerosol -from PySDM.initialisation import spectral_sampling +from PySDM.initialisation.sampling import spectral_sampling from PySDM.physics import si from .constants import constants diff --git a/tests/smoke_tests/shima_et_al_2009/test_coalescence.py b/tests/smoke_tests/shima_et_al_2009/test_coalescence.py index 9ced8b16c..0b3f2f4bb 100644 --- a/tests/smoke_tests/shima_et_al_2009/test_coalescence.py +++ b/tests/smoke_tests/shima_et_al_2009/test_coalescence.py @@ -7,8 +7,8 @@ from PySDM.dynamics import Coalescence from PySDM.physics.coalescence_kernels import Golovin from PySDM.environments import Box -from PySDM.physics.spectra import Exponential -from PySDM.initialisation.spectral_sampling import ConstantMultiplicity +from PySDM.initialisation.spectra import Exponential +from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity from PySDM.physics.constants import si from PySDM.formulae import Formulae diff --git a/tests/unit_tests/dynamics/coalescence/test_croupiers.py b/tests/unit_tests/dynamics/coalescence/test_croupiers.py index 575302f82..122a77347 100644 --- a/tests/unit_tests/dynamics/coalescence/test_croupiers.py +++ b/tests/unit_tests/dynamics/coalescence/test_croupiers.py @@ -2,8 +2,8 @@ import numpy as np import pytest from PySDM.backends import ThrustRTC -from PySDM.physics.spectra import Lognormal -from PySDM.initialisation.spectral_sampling import Linear +from PySDM.initialisation.spectra.lognormal import Lognormal +from PySDM.initialisation.sampling.spectral_sampling import Linear from ...dummy_particulator import DummyParticulator from ....backends_fixture import backend_class diff --git a/tests/unit_tests/dynamics/coalescence/test_sdm_multi_cell.py b/tests/unit_tests/dynamics/coalescence/test_sdm_multi_cell.py index 9b619bb07..b3f9e3e04 100644 --- a/tests/unit_tests/dynamics/coalescence/test_sdm_multi_cell.py +++ b/tests/unit_tests/dynamics/coalescence/test_sdm_multi_cell.py @@ -3,7 +3,7 @@ import pytest from PySDM.backends import ThrustRTC from PySDM.environments import Box -from PySDM.initialisation.spatial_sampling import Pseudorandom +from PySDM.initialisation.sampling.spatial_sampling import Pseudorandom from PySDM.impl.mesh import Mesh from PySDM.dynamics.coalescence import DEFAULTS from ....backends_fixture import backend_class diff --git a/tests/unit_tests/impl/test_moments.py b/tests/unit_tests/impl/test_moments.py index 6678d775a..53acaaefb 100644 --- a/tests/unit_tests/impl/test_moments.py +++ b/tests/unit_tests/impl/test_moments.py @@ -1,8 +1,8 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring import numpy as np -from PySDM.initialisation.multiplicities import discretise_n -from PySDM.initialisation.spectral_sampling import Linear -from PySDM.physics.spectra import Lognormal +from PySDM.initialisation.discretise_multiplicities import discretise_multiplicities +from PySDM.initialisation.sampling.spectral_sampling import Linear +from PySDM.initialisation.spectra.lognormal import Lognormal from ...backends_fixture import backend_class from ..dummy_particulator import DummyParticulator @@ -23,7 +23,7 @@ def test_moment_0d(backend_class): spectrum = Lognormal(n_part, v_mean, d) v, n = Linear(spectrum).sample(n_sd) T = np.full_like(v, 300.) - n = discretise_n(n) + n = discretise_multiplicities(n) particulator = DummyParticulator(backend_class, n_sd) attribute = {'n': n, 'volume': v, 'temperature': T, 'heat': T*v} particulator.build(attribute) @@ -77,7 +77,7 @@ def test_spectrum_moment_0d(backend_class): spectrum = Lognormal(n_part, v_mean, d) v, n = Linear(spectrum).sample(n_sd) T = np.full_like(v, 300.) - n = discretise_n(n) + n = discretise_multiplicities(n) particulator = DummyParticulator(backend_class, n_sd) attribute = {'n': n, 'volume': v, 'temperature': T, 'heat': T*v} particulator.build(attribute) diff --git a/tests/unit_tests/initialisation/test_r_wet_init.py b/tests/unit_tests/initialisation/test_r_wet_init.py index 4a860b9c4..d5f2aef9c 100644 --- a/tests/unit_tests/initialisation/test_r_wet_init.py +++ b/tests/unit_tests/initialisation/test_r_wet_init.py @@ -2,7 +2,7 @@ import numpy as np import pytest from matplotlib import pyplot -from PySDM.initialisation import r_wet_init +from PySDM.initialisation import equilibrate_wet_radii from PySDM import Formulae from PySDM.physics import si, constants as const from PySDM.physics.surface_tension import compressed_film_ovadnevaite @@ -74,7 +74,7 @@ def __getitem__(self, item): pyplot.show() # Act & Assert - r_wet_init( + equilibrate_wet_radii( r_dry=r_dry_arr, environment=Env(), kappa_times_dry_volume=Env.particulator.formulae.trivia.volume(r_dry_arr) * kappa, diff --git a/tests/unit_tests/initialisation/test_spectral_discretisation.py b/tests/unit_tests/initialisation/test_spectral_discretisation.py index e799dca3e..45e9afba2 100644 --- a/tests/unit_tests/initialisation/test_spectral_discretisation.py +++ b/tests/unit_tests/initialisation/test_spectral_discretisation.py @@ -1,8 +1,8 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring import numpy as np import pytest -from PySDM.initialisation import spectral_sampling, spectro_glacial -from PySDM.physics.spectra import Lognormal +from PySDM.initialisation.sampling import spectral_sampling, spectro_glacial_sampling +from PySDM.initialisation.spectra.lognormal import Lognormal from PySDM import Formulae from PySDM.physics import constants as const from PySDM.physics.freezing_temperature_spectrum import niemand_et_al_2012 @@ -33,7 +33,7 @@ def test_spectral_discretisation(discretisation): n_sd = 100000 # Act - if isinstance(discretisation, spectro_glacial.SpectroGlacialSampling): + if isinstance(discretisation, spectro_glacial_sampling.SpectroGlacialSampling): m, _, __, n = discretisation.sample(n_sd) else: m, n = discretisation.sample(n_sd) diff --git a/tests/unit_tests/physics/test_spectra.py b/tests/unit_tests/physics/test_spectra.py index e39a4abae..5313f5b23 100644 --- a/tests/unit_tests/physics/test_spectra.py +++ b/tests/unit_tests/physics/test_spectra.py @@ -2,7 +2,8 @@ import numpy as np from numpy.testing import assert_approx_equal import pytest -from PySDM.physics.spectra import Lognormal, Exponential, Sum, default_interpolation_grid +from PySDM.initialisation.spectra import Exponential, Lognormal, Sum +from PySDM.initialisation.impl.spectrum import default_interpolation_grid class TestLognormal: diff --git a/tests/unit_tests/physics/test_spectra_top_hat.py b/tests/unit_tests/physics/test_spectra_top_hat.py index eeb41e15e..de1b0f74d 100644 --- a/tests/unit_tests/physics/test_spectra_top_hat.py +++ b/tests/unit_tests/physics/test_spectra_top_hat.py @@ -1,7 +1,7 @@ # pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring from matplotlib import pylab import numpy as np -from PySDM.physics import spectra +from PySDM.initialisation import spectra class TestSpectraTopHat: From e5eb5520b485b386a75faf74001b0cbb4484ff56 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 20:08:01 -0600 Subject: [PATCH 07/12] pylint fixes + parcel env update for refactored initialisation --- PySDM/environments/kinematic_1d.py | 6 ++++-- PySDM/environments/parcel.py | 8 ++++---- PySDM/initialisation/impl/spectrum.py | 2 +- PySDM/initialisation/spectra/exponential.py | 2 +- PySDM/initialisation/spectra/lognormal.py | 2 +- PySDM/initialisation/spectra/sum.py | 2 +- PySDM/initialisation/spectra/top_hat.py | 2 +- .../kreidenweis_et_al_2003/test_spectrum_at_t_0.py | 3 ++- 8 files changed, 15 insertions(+), 12 deletions(-) diff --git a/PySDM/environments/kinematic_1d.py b/PySDM/environments/kinematic_1d.py index 968f3df33..b0cb57fcf 100644 --- a/PySDM/environments/kinematic_1d.py +++ b/PySDM/environments/kinematic_1d.py @@ -47,8 +47,10 @@ def init_attributes(self, *, r_dry, n_per_kg = spectral_discretisation.sample(self.particulator.n_sd) attributes['dry volume'] = self.formulae.trivia.volume(radius=r_dry) attributes['kappa times dry volume'] = attributes['dry volume'] * kappa - r_wet = equilibrate_wet_radii(r_dry, self, cell_id=attributes['cell id'], - kappa_times_dry_volume=attributes['kappa times dry volume']) + r_wet = equilibrate_wet_radii( + r_dry, self, cell_id=attributes['cell id'], + kappa_times_dry_volume=attributes['kappa times dry volume'] + ) rhod = self['rhod'].to_ndarray() cell_id = attributes['cell id'] diff --git a/PySDM/environments/parcel.py b/PySDM/environments/parcel.py index 7336f6e03..434295566 100644 --- a/PySDM/environments/parcel.py +++ b/PySDM/environments/parcel.py @@ -4,8 +4,8 @@ import numpy as np from PySDM.impl.mesh import Mesh -from PySDM.initialisation.r_wet_init import r_wet_init, default_rtol -from PySDM.initialisation.multiplicities import discretise_n +from PySDM.initialisation.equilibrate_wet_radii import equilibrate_wet_radii, default_rtol +from PySDM.initialisation.discretise_multiplicities import discretise_multiplicities from ..physics import constants as const from ._moist import _Moist @@ -73,8 +73,8 @@ def init_attributes( attributes = {} attributes['dry volume'] = self.formulae.trivia.volume(radius=r_dry) attributes['kappa times dry volume'] = attributes['dry volume'] * kappa - attributes['n'] = discretise_n(n_in_dv) - r_wet = r_wet_init( + attributes['n'] = discretise_multiplicities(n_in_dv) + r_wet = equilibrate_wet_radii( r_dry=r_dry, environment=self, kappa_times_dry_volume=attributes['kappa times dry volume'], diff --git a/PySDM/initialisation/impl/spectrum.py b/PySDM/initialisation/impl/spectrum.py index 01ca3af74..d8dba7b83 100644 --- a/PySDM/initialisation/impl/spectrum.py +++ b/PySDM/initialisation/impl/spectrum.py @@ -31,4 +31,4 @@ def cumulative(self, arg): def percentiles(self, cdf_values): result = self.distribution.ppf(cdf_values, *self.distribution_params) - return result \ No newline at end of file + return result diff --git a/PySDM/initialisation/spectra/exponential.py b/PySDM/initialisation/spectra/exponential.py index 28d92899b..d102d36be 100644 --- a/PySDM/initialisation/spectra/exponential.py +++ b/PySDM/initialisation/spectra/exponential.py @@ -7,4 +7,4 @@ def __init__(self, norm_factor, scale): super().__init__(expon, ( 0, # loc scale # scale = 1/lambda - ), norm_factor) \ No newline at end of file + ), norm_factor) diff --git a/PySDM/initialisation/spectra/lognormal.py b/PySDM/initialisation/spectra/lognormal.py index 21bf117da..9e411251b 100644 --- a/PySDM/initialisation/spectra/lognormal.py +++ b/PySDM/initialisation/spectra/lognormal.py @@ -28,4 +28,4 @@ def __str__(self): return f"{self.__class__.__name__}:"\ f" (N={self.norm_factor:.3g},"\ f" m_mode={self.m_mode:.3g},"\ - f" s_geom={self.s_geom:.3g})" \ No newline at end of file + f" s_geom={self.s_geom:.3g})" diff --git a/PySDM/initialisation/spectra/sum.py b/PySDM/initialisation/spectra/sum.py index b6373d6eb..61a1b6aa6 100644 --- a/PySDM/initialisation/spectra/sum.py +++ b/PySDM/initialisation/spectra/sum.py @@ -27,4 +27,4 @@ def cumulative(self, arg): return result def percentiles(self, cdf_values): - return self.inverse_cdf(cdf_values) \ No newline at end of file + return self.inverse_cdf(cdf_values) diff --git a/PySDM/initialisation/spectra/top_hat.py b/PySDM/initialisation/spectra/top_hat.py index aa78c3e14..e6219a1aa 100644 --- a/PySDM/initialisation/spectra/top_hat.py +++ b/PySDM/initialisation/spectra/top_hat.py @@ -13,4 +13,4 @@ def cumulative(self, arg): return self.norm_factor * cdf def percentiles(self, cdf_values): - return (self._mx - self._mn) * (np.asarray(cdf_values) + self._mn / (self._mx - self._mn)) \ No newline at end of file + return (self._mx - self._mn) * (np.asarray(cdf_values) + self._mn / (self._mx - self._mn)) diff --git a/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py b/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py index 5c6f283d4..5de0cd9a6 100644 --- a/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py +++ b/tests/smoke_tests/kreidenweis_et_al_2003/test_spectrum_at_t_0.py @@ -5,7 +5,8 @@ from matplotlib import pyplot from PySDM_examples.Kreidenweis_et_al_2003 import Settings, Simulation from PySDM.physics import si -from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity, Logarithmic, UniformRandom +from PySDM.initialisation.sampling.spectral_sampling import ConstantMultiplicity,\ + Logarithmic, UniformRandom @pytest.mark.parametrize("spectral_sampling", [ From d1eaf1c2203123ba7c543911775f8c400ab75687 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 20:33:56 -0600 Subject: [PATCH 08/12] sampling import fixes in README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 36a5061b4..7793d3da2 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ Pkg.add("PlotlyJS") using PyCall si = pyimport("PySDM.physics").si -ConstantMultiplicity = pyimport("PySDM.initialisation.spectral_sampling").ConstantMultiplicity +ConstantMultiplicity = pyimport("PySDM.initialisation.sampling.spectral_sampling").ConstantMultiplicity Exponential = pyimport("PySDM.physics.spectra").Exponential n_sd = 2^15 @@ -129,7 +129,7 @@ attributes["volume"], attributes["n"] = ConstantMultiplicity(spectrum=initial_sp ```Matlab si = py.importlib.import_module('PySDM.physics').si; -ConstantMultiplicity = py.importlib.import_module('PySDM.initialisation.spectral_sampling').ConstantMultiplicity; +ConstantMultiplicity = py.importlib.import_module('PySDM.initialisation.sampling.spectral_sampling').ConstantMultiplicity; Exponential = py.importlib.import_module('PySDM.physics.spectra').Exponential; n_sd = 2^15; @@ -339,7 +339,7 @@ and the using PyCall using Plots; plotlyjs() si = pyimport("PySDM.physics").si -spectral_sampling = pyimport("PySDM.initialisation").spectral_sampling +spectral_sampling = pyimport("PySDM.initialisation.sampling").spectral_sampling discretise_multiplicities = pyimport("PySDM.initialisation").discretise_multiplicities Lognormal = pyimport("PySDM.initialisation.spectra").Lognormal equilibrate_wet_radii = pyimport("PySDM.initialisation").equilibrate_wet_radii @@ -421,7 +421,7 @@ savefig("parcel.svg") ```Matlab si = py.importlib.import_module('PySDM.physics').si; -spectral_sampling = py.importlib.import_module('PySDM.initialisation').spectral_sampling; +spectral_sampling = py.importlib.import_module('PySDM.initialisation.sampling').spectral_sampling; discretise_multiplicities = py.importlib.import_module('PySDM.initialisation').discretise_multiplicities; Lognormal = py.importlib.import_module('PySDM.initialisation.spectra').Lognormal; equilibrate_wet_radii = py.importlib.import_module('PySDM.initialisation').equilibrate_wet_radii; From af87671066d1937d5234b74bd835e1803cf6fb92 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 20:57:00 -0600 Subject: [PATCH 09/12] one more sampling import fix in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7793d3da2..6facf04b0 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Pkg.add("PlotlyJS") using PyCall si = pyimport("PySDM.physics").si ConstantMultiplicity = pyimport("PySDM.initialisation.sampling.spectral_sampling").ConstantMultiplicity -Exponential = pyimport("PySDM.physics.spectra").Exponential +Exponential = pyimport("PySDM.initialisation.spectra").Exponential n_sd = 2^15 initial_spectrum = Exponential(norm_factor=8.39e12, scale=1.19e5 * si.um^3) From d1225c5dcb2ad85351e3e8b9e21248c596788b07 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 21:01:32 -0600 Subject: [PATCH 10/12] README code fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6facf04b0..b6a8424b3 100644 --- a/README.md +++ b/README.md @@ -557,7 +557,7 @@ v_dry = formulae.trivia.volume(radius=r_dry) r_wet = equilibrate_wet_radii(r_dry, env, kappa * v_dry) attributes = { - 'n': discretise_multiplicities.discretise_multiplicities(specific_concentration * env.mass_of_dry_air), + 'n': discretise_multiplicities(specific_concentration * env.mass_of_dry_air), 'dry volume': v_dry, 'kappa times dry volume': kappa * v_dry, 'volume': formulae.trivia.volume(radius=r_wet) From d5860608c516a26ca1c5699c2442a4cfce17fe56 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 21:02:46 -0600 Subject: [PATCH 11/12] missing __init__ file in initialisation/impl --- PySDM/initialisation/impl/__init__.py | 0 PySDM/initialisation/spectra/exponential.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 PySDM/initialisation/impl/__init__.py diff --git a/PySDM/initialisation/impl/__init__.py b/PySDM/initialisation/impl/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/PySDM/initialisation/spectra/exponential.py b/PySDM/initialisation/spectra/exponential.py index d102d36be..4b14596e6 100644 --- a/PySDM/initialisation/spectra/exponential.py +++ b/PySDM/initialisation/spectra/exponential.py @@ -1,5 +1,5 @@ from scipy.stats import expon -from ..impl.spectrum import Spectrum +from PySDM.initialisation.impl.spectrum import Spectrum class Exponential(Spectrum): From 5aa9857e86fb62c562b3c9c677a4c58036a1e6c6 Mon Sep 17 00:00:00 2001 From: Sylwester Arabas Date: Wed, 24 Nov 2021 21:23:29 -0600 Subject: [PATCH 12/12] README fixes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b6a8424b3..3f2d930bb 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ attributes["volume"], attributes["n"] = ConstantMultiplicity(spectrum=initial_sp ```Matlab si = py.importlib.import_module('PySDM.physics').si; ConstantMultiplicity = py.importlib.import_module('PySDM.initialisation.sampling.spectral_sampling').ConstantMultiplicity; -Exponential = py.importlib.import_module('PySDM.physics.spectra').Exponential; +Exponential = py.importlib.import_module('PySDM.initialisation.spectra').Exponential; n_sd = 2^15; initial_spectrum = Exponential(pyargs(... @@ -318,7 +318,7 @@ The resultant plot (generated with the Python code) looks as follows: In the following example, a condensation-only setup is used with the adiabatic [`Parcel`](https://atmos-cloud-sim-uj.github.io/PySDM/environments/parcel.html) environment. -An initial [`Lognormal`](https://atmos-cloud-sim-uj.github.io/PySDM/physics/spectra.html#PySDM.physics.spectra.Lognormal) +An initial [`Lognormal`](https://atmos-cloud-sim-uj.github.io/PySDM/initialisation/spectra.html#PySDM.initialisation.spectra.Lognormal) spectrum of dry aerosol particles is first initialised to equilibrium wet size for the given initial humidity. Subsequent particle growth due to [`Condensation`](https://atmos-cloud-sim-uj.github.io/PySDM/dynamics/condensation.html) of water vapour (coupled with the release of latent heat)