#!/usr/bin/env python
# -*- coding: cp1250 -*-
# ------------------------------------------------------------------------------
# Urban Green SARCA Library
# ------------------------------------------------------------------------------
# Author: Jakub Brom
# Date: 2020 - 10 - 07
#
# Copyright (c) Jakub Brom, 2020 - 2020.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# ------------------------------------------------------------------------------
import numpy as np
[docs]def interceptFactor(LAI, precip, fresh_biomass, k=1.0, S=0.2):
"""
Interception factor for both dry and wet deposition of
radionuclides.
:param LAI: Leaf Area Index (unitless)
:param k: Constant of radionuclide: I = 0.5, Sr and Ba = 2.0, Cs and \
another radionuclides = 1.0
:param precip: Precipitation amount (mm) for period of deposition \
(ca 24 hours after radiation accident).
:param fresh_biomass: Amount of fresh biomass :math:`(t.ha^{-1})`
:param S: Mean thickness of water film at plant leaves (mm). \
Default S = 0.2 mm
:return: Interception Factor (rel.)
"""
try:
IF = LAI * k * S * (1.0 - np.exp((-np.log(2.0))/(3.0 * S) * (
precip + 0.0001))) / (precip + 0.0001)
IF[IF > 1.0] = 1.0
IF[fresh_biomass < 0.5] = 0.0
except ArithmeticError:
raise ArithmeticError("Interception factor has not been "
"calculated")
return IF
[docs]def contBiomass(depo, IF):
"""
Radiaoctive contamination of biomass :math:`(Bq.m^{-2})`
:param depo: Total radioactive deposition :math:`(Bq.m^{-2})`
:param IF: Interception Factor (rel.)
:return: Radioactive contamination of biomass :math:`(Bq.m^{-2})`
"""
try:
cont_biomass = depo * IF
cont_biomass[cont_biomass < 0.0] = 0.0
except ArithmeticError:
raise ArithmeticError("Vegetation biomass radioactive "
"contamination has not been calculated")
return cont_biomass
[docs]def contSoil(depo, IF):
"""
Radiaoctive contamination of soil :math:`(Bq.m^{-2})`
:param depo: Total radioactive deposition :math:`(Bq.m^{-2})`
:param IF: Interception Factor (rel.)
:return: Radioactive contamination of soil :math:`(Bq.m^{-2})`
"""
try:
cont_soil = depo * (1 - IF)
cont_soil[cont_soil < 0.0] = 0.0
except ArithmeticError:
raise ArithmeticError("Soil radioactive "
"contamination has not been calculated")
return cont_soil
[docs]def contMass(cont_biomass, fresh_biomass):
"""
Calculation radioactive contamination of fresh vegetation mass \
:math:`(Bq.kg^{-1})`
:param cont_biomass: Radioactive deposition on biomass \
:math:`(Bq.m^{-2})`
:param fresh_biomass: Amount of fresh biomass of vegetation \
:math:`(t.ha^{-1})`
:return: Fresh vegetation mass radioactive contamination \
:math:`(Bq.kg^{-1})`
"""
ignore_zero = np.seterr(all="ignore")
try:
cont_mass = cont_biomass/(fresh_biomass * 0.1)
cont_mass[cont_mass < 0.0] = 0.0
except ArithmeticError:
raise ArithmeticError("Mass Radioactive "
"contamination of fresh biomass has not "
"been calculated")
return cont_mass
[docs]def referLevel(depo, ref_level1=5000, ref_level2=3000000):
"""
Mask of radioactive deposition for three reference levels (categories):
\n
*0: Low* \n
*1: Middle* \n
*2: High*
\n
:param depo: Total radioactive deposition :math:`(Bq.m^{-2})`
:param ref_level1: Lower reference level treshold \
:math:`(Bq.m^{-2})`. Default value = 5000 :math:`Bq.m^{-2}`
:param ref_level2: Upper reference level treshold \
:math:`(Bq.m^{-2})`. Default value = 3000000 :math:`Bq.m^{-2}`
:return: Mask of radioactive deposition for three reference levels
"""
try:
reference_groups = np.where(depo >= ref_level2, 2.0, 1.0)
reference_groups = np.where(depo < ref_level1, 0.0, reference_groups)
except ArithmeticError:
raise ArithmeticError("Mask for reference levels has not been"
" calculated")
return reference_groups
[docs]def hygLimit(cont_mass, hyg_lim=1000):
"""
Mask for hygienic limit of biomass radioactive contamination
exceeding.
:param cont_mass: Fresh vegetation mass radioactive contamination \
:math:`(Bq.kg^{-1})`
:param hyg_lim: Hygienic limit of mass radioactive contamination \
:math:`(Bq.kg^{-1})`. Default value is 1000 :math:`(Bq.kg^{-1})` \
according to Czech law.
:return: Mask for hygienic limit of biomass radioactive \
contamination exceeding.
"""
try:
hyg_lim_mask = np.where(cont_mass >= hyg_lim, 1.0, 0.0)
except ArithmeticError:
raise ArithmeticError("Mask for hygienic limit of mass "
"radioactive contamination has not been "
"calculated")
return hyg_lim_mask