added verification for diameter independent parameters
This commit is contained in:
parent
2433f024a5
commit
f7bce0ef24
1 changed files with 35 additions and 4 deletions
|
|
@ -1310,10 +1310,6 @@ class ShortRangeModel:
|
|||
class ExposureModel:
|
||||
"""
|
||||
Represents the exposure to a concentration of virions in the air.
|
||||
NOTE: the infection probability formula assumes that if the diameter
|
||||
is an array, then none of the ventilation parameters, room volume or virus
|
||||
decay constant, are arrays as well.
|
||||
TODO: implement a check this is the case, in __post_init__
|
||||
"""
|
||||
#: The virus concentration model which this exposure model should consider.
|
||||
concentration_model: ConcentrationModel
|
||||
|
|
@ -1330,6 +1326,41 @@ class ExposureModel:
|
|||
#: The number of times the exposure event is repeated (default 1).
|
||||
repeats: int = 1
|
||||
|
||||
def __post_init__(self):
|
||||
"""
|
||||
The infection probability formula assumes that if the diameter
|
||||
is an array, then none of the ventilation parameters, room volume or virus
|
||||
decay constant, are arrays as well.
|
||||
"""
|
||||
infected_population = self.concentration_model.infected
|
||||
if (isinstance(infected_population, InfectedPopulation)
|
||||
and not np.isscalar(infected_population.expiration.particle.diameter)):
|
||||
# Due to the infiltration ventilation (0.25ACH), the ventilation is initialized as MultipleVentilation.
|
||||
if isinstance(self.concentration_model.ventilation, MultipleVentilation):
|
||||
for vent in self.concentration_model.ventilation.ventilations:
|
||||
# Check if any of the ventilation parameters is an array instance.
|
||||
# Note that most of the ventilation parameters are part of the WindowOpening class (inheritance).
|
||||
if (isinstance(vent, WindowOpening) and (
|
||||
not all(np.isscalar(value) for value in vent.outside_temp.values) or
|
||||
not np.isscalar(vent.window_height) or
|
||||
(isinstance(vent, HingedWindow) and not np.isscalar(vent.window_width)))):
|
||||
raise ValueError("Ventilation parameter(s) and diameter cannot be arrays at the same time.")
|
||||
# The window_width parameter is only part of the HingedWindow class.
|
||||
if ((isinstance(vent, HingedWindow)) and not np.isscalar(vent.window_width)):
|
||||
raise ValueError("Ventilation parameter(s) and diameter cannot be arrays at the same time.")
|
||||
# The q_air_mech parameter is only part of the HEPAFilter class, and
|
||||
# the air_exch parameter is only part of the AirChange class.
|
||||
if (isinstance(vent, HEPAFilter) and not np.isscalar(vent.q_air_mech) or
|
||||
isinstance(vent, AirChange) and not np.isscalar(vent.air_exch)):
|
||||
raise ValueError("Ventilation rate and diameter cannot be arrays at the same time.")
|
||||
# Check if the room volume is an array instance.
|
||||
if not np.isscalar(self.concentration_model.room.volume):
|
||||
raise ValueError("Room volume and diameter cannot be arrays at the same time.")
|
||||
# Virus decay constant depends on the room humidity and inside_temp parameters.
|
||||
if (not all(np.isscalar(value) for value in self.concentration_model.room.inside_temp.values) or
|
||||
not np.isscalar(self.concentration_model.room.humidity)):
|
||||
raise ValueError("Virus decay constant and diameter cannot be arrays at the same time.")
|
||||
|
||||
def long_range_fraction_deposited(self) -> _VectorisedFloat:
|
||||
"""
|
||||
The fraction of particles actually deposited in the respiratory
|
||||
|
|
|
|||
Loading…
Reference in a new issue