From 46465c499d586fe8f0dc907ed141164d506cfc4f Mon Sep 17 00:00:00 2001 From: Nicolas Mounet Date: Sun, 12 Sep 2021 11:07:35 +0200 Subject: [PATCH] Vectorising the Mask exhale_efficiency method --- cara/models.py | 21 +++++++++++-------- cara/tests/models/test_concentration_model.py | 2 +- cara/tests/test_infected_population.py | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/cara/models.py b/cara/models.py index ddc9f238..498308d3 100644 --- a/cara/models.py +++ b/cara/models.py @@ -493,7 +493,7 @@ class Mask: #: Pre-populated examples of Masks. types: typing.ClassVar[typing.Dict[str, "Mask"]] - def exhale_efficiency(self, diameter: float) -> _VectorisedFloat: + def exhale_efficiency(self, diameter: _VectorisedFloat) -> _VectorisedFloat: """ Overall exhale efficiency, including the effect of the leaks. See CERN-OPEN-2021-004 (doi: 10.17181/CERN.1GDQ.5Y75), and Ref. @@ -502,14 +502,17 @@ class Mask: the leakage through the sides. Diameter is in microns. """ - if diameter < 0.5: - eta_out = 0. - elif diameter < 0.94614: - eta_out = 0.5893 * diameter + 0.1546 - elif diameter < 3.: - eta_out = 0.0509 * diameter + 0.664 - else: - eta_out = 0.8167 + d = np.array(diameter) + intermediate_range1 = np.bitwise_and(0.5 <= d, d < 0.94614) + intermediate_range2 = np.bitwise_and(0.94614 <= d, d < 3.) + + eta_out = np.empty(d.shape, dtype=np.float64) + + eta_out[d < 0.5] = 0. + eta_out[intermediate_range1] = 0.5893 * d[intermediate_range1] + 0.1546 + eta_out[intermediate_range2] = 0.0509 * d[intermediate_range2] + 0.664 + eta_out[d >= 3.] = 0.8167 + return eta_out*self.factor_exhale def inhale_efficiency(self) -> _VectorisedFloat: diff --git a/cara/tests/models/test_concentration_model.py b/cara/tests/models/test_concentration_model.py index 9373d4a9..7437f41d 100644 --- a/cara/tests/models/test_concentration_model.py +++ b/cara/tests/models/test_concentration_model.py @@ -43,7 +43,7 @@ def test_concentration_model_vectorisation(override_params): viral_load_in_sputum=defaults['viral_load_in_sputum'], infectious_dose=50., ), - expiration=models.Expiration((1., 0., 0.)), + expiration=models._ExpirationBase.types['Breathing'], ) ) concentrations = c_model.concentration(10) diff --git a/cara/tests/test_infected_population.py b/cara/tests/test_infected_population.py index 638acfa3..13467f9f 100644 --- a/cara/tests/test_infected_population.py +++ b/cara/tests/test_infected_population.py @@ -33,7 +33,7 @@ def test_infected_population_vectorisation(override_params): viral_load_in_sputum=defaults['viral_load_in_sputum'], infectious_dose=50., ), - expiration=cara.models.Expiration((1., 0., 0.)), + expiration=cara.models._ExpirationBase.types['Breathing'], ) emission_rate = infected.emission_rate(10) assert isinstance(emission_rate, np.ndarray)