def compute_figure_data(*, nr, GC_max, psi_coord=x_id(), grid_layouts=(x_id(), x_p2(), x_log_of_pn(r0=1, n=1)), opt_set=({ 'n_iters': 1 }, ), mixing_ratios_g_kg=default_mixing_ratios_g_kg): setup = Setup(nr=nr, mixing_ratios_g_kg=mixing_ratios_g_kg) with parallel_backend('threading', n_jobs=-2): results = Parallel(verbose=10)( delayed(analysis)(setup, grid_layout, psi_coord, options, GC_max) for grid_layout in grid_layouts for options in deepcopy(opt_set)) cases = {} for result in results: case = Case(result) if case.grid_layour_str not in cases: cases[case.grid_layour_str] = case
# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring from PyMPDATA_examples.Olesik_et_al_2020.coordinates import x_id, x_log_of_pn, x_p2 import pint import pytest import numpy as np si = pint.UnitRegistry() @pytest.mark.parametrize("k", [0, 1, 2, 3]) @pytest.mark.parametrize( "coord", [x_id(), x_log_of_pn(r0=1 * si.um, n=1), x_p2()]) def test_moment_of_r_integral(k, coord): # Arrange r_0 = 2 * si.um r_1 = 4 * si.um # Act with np.errstate(divide='ignore', invalid='ignore'): integral = (coord.moment_of_r_integral(coord.x(r_1), k) - coord.moment_of_r_integral(coord.x(r_0), k)) # Assert if coord.__class__ == x_id: assert integral.check(f'[length]**{k+1}') elif coord.__class__ == x_p2: assert integral.check(f'[length]**{k+2}') elif coord.__class__ == x_log_of_pn: assert integral.check(f'[length]**{k}')
from PyMPDATA_examples.Olesik_et_al_2020.physics.East_and_Marshall_1954 import SizeDistribution from PyMPDATA.arakawa_c.discretisation import discretised_analytical_solution from PyMPDATA_examples.Olesik_et_al_2020.coordinates import x_id, x_log_of_pn, x_p2 import pint from matplotlib import pyplot import numpy as np import pytest def diff(x): return np.diff(x.magnitude) * x.units @pytest.mark.parametrize("grid", [x_id(), x_log_of_pn(r0=1), x_p2()]) @pytest.mark.parametrize("coord", [x_id(), x_log_of_pn(r0=1), x_p2()]) def test_size_distribution(grid, coord, plot=False): # Arrange si = pint.UnitRegistry() sd = SizeDistribution(si) n_unit = si.centimetres**-3 / si.micrometre r_unit = si.micrometre # Act x = grid.x(np.linspace(1, 18, 100)) * r_unit dx_dr = coord.dx_dr numpdfx = x[1:] - diff(x) / 2 pdf_t = lambda r: sd.pdf(r * r_unit).to(n_unit).magnitude / dx_dr( r * r_unit).magnitude numpdfy = discretised_analytical_solution(rh=x.magnitude, pdf_t=pdf_t) * n_unit
from PyMPDATA_examples.Olesik_et_al_2020.simulation import Simulation from PyMPDATA_examples.Olesik_et_al_2020.setup import Setup, default_nr, default_GC_max from PyMPDATA_examples.Olesik_et_al_2020.coordinates import x_id, x_log_of_pn, x_p2 from PyMPDATA_examples.Olesik_et_al_2020.analysis import compute_figure_data from PyMPDATA.options import Options import pytest import numpy as np setup = Setup() grid_layout_set = (x_id(), x_p2(), x_log_of_pn(r0=1, n=1)) opt_set = ({ 'n_iters': 1 }, { 'n_iters': 2, 'flux_corrected_transport': True }, { 'n_iters': 3, 'third_order_terms': True, 'infinite_gauge': True, 'flux_corrected_transport': True }) @pytest.fixture(scope='module') def data(): result, _ = compute_figure_data(nr=default_nr, GC_max=default_GC_max, psi_coord=x_id(), grid_layouts=grid_layout_set, opt_set=opt_set) return result