from hestia_earth.calculation.abstract_model import Model
from hestia_earth.calculation.utils import most_relevant_measurement, summation
from hestia_earth.utils.api import download_hestia
MODEL_KEY = 'pToSurfacewaterSalcaPrasuhn2006'
[docs]class PToSurfacewaterSalcaPrasuhn2006(Model):
def __init__(self):
# Define model tier
self.tier = 1
self.term = download_hestia(MODEL_KEY)
# Define model requirements
self.inorgP = None
self.orgP = None
self.excrP = None
self.slope = None
# Instantiate variables
self.pToDrainageWaterAllInputs = None
def get_lqd_slurry_sluge(self, cycle):
slurryAndSludgeAsN = summation(cycle['inputs']['slurryAndSludgeAsN']['value'])
cattleLiquidManureAsN = summation(cycle['inputs']['cattleLiquidManureAsN']['value'])
pigsLiquidManureAsN = summation(cycle['inputs']['pigsLiquidManureAsN']['value'])
return summation([slurryAndSludgeAsN, cattleLiquidManureAsN, pigsLiquidManureAsN])
def get_solid(self, cycle):
non_solid = ['cattleUrineAsN', 'compostAsN', 'greenManureAsN', 'oliveMillWastewaterAsN',
'palmOilMillEffluentAsN', 'pigsLiquidManureAsN', 'sewageSludgeAsN', 'slurryAndSludgeAsN']
inputs = list(cycle['inputs'].evalues())
orgN_filter = [sum(input['value']) if 'units' in input['term'] and input['term']['@id'] not in non_solid and
input['term']['units'] == 'kg N' and
input['term']['termType'] == 'organicFertilizer'
else {} for input in inputs]
return summation(orgN_filter)
def get_compost(self, cycle):
compostAsN = summation(cycle['inputs']['compostAsN']['value'])
mushroomCompostAsN = summation(cycle['inputs']['mushroomCompostAsN']['value'])
compost = [compostAsN, mushroomCompostAsN]
return summation(compost)
def get_greenManure(self, cycle):
greenManure_array = summation(cycle['inputs']['greenManureAsN']['value'])
return greenManure_array
def calculate_pToSurfacewaterAllOrigins(self):
self.pToSurfacewaterAllOrigins = \
(0 if self.slope < 0.03 else 1) * (1 + self.inorgP * 0.2/80 + self.orgP * 0.7/80 *
(0 if self.lqd_slurry_sluge == {} else self.lqd_slurry_sluge) +
(self.orgP * self.livestockfert + self.excrP) * 0.4/80)
return self.pToSurfacewaterAllOrigins
def complete(self, completeness):
self.inorgP = 0 if self.inorgP == {} and completeness['fertilizer'] else self.inorgP
self.orgP = 0 if self.orgP == {} and completeness['fertilizer'] else self.orgP
self.livestockfert = 0 if self.livestockfert == {} and completeness['fertilizer'] else self.livestockfert
self.excrP = 0 if self.excrP == {} and completeness['products'] else self.excrP
def check_pToSurfacewaterAllOrigins(self, cycle):
inputs = cycle['inputs'].evalues()
self.inorgP = summation([sum(input['value']) if 'units' in input['term'] and
input['term']['units'] == 'kg P2O5' and
input['term']['termType'] == 'inorganicFertilizer'
else {} for input in inputs])
self.orgP = summation([sum(input['value']) if 'units' in input['term'] and
input['term']['units'] == 'kg P2O5' and
input['term']['termType'] == 'organicFertilizer'
else {} for input in inputs])
products = cycle['products'].evalues()
self.excrP = summation([sum(product['value']) if 'units' in product['term'] and
product['term']['units'] == 'kg P2O5' and
product['term']['termType'] == 'animalProduct'
else {} for product in products])
self.slope = most_relevant_measurement(cycle['site']['measurements']['slope'], cycle['endDate'])
self.lqd_slurry_sluge = self.get_lqd_slurry_sluge(cycle)
self.solid = self.get_solid(cycle)
self.compost = self.get_compost(cycle)
self.greenManure = self.get_greenManure(cycle)
self.livestockfert = summation([self.lqd_slurry_sluge, self.solid, self.compost, self.greenManure])
self.complete(cycle['dataCompleteness'])
return self.inorgP != {} and self.orgP != {} and self.excrP != {} and self.slope != {}