Source code for processes

################################################################################
'''Module "processes", July 2010, is part of
BETR-Research by Harald von Waldow <hvwaldow@chem.ethz.ch>.

This module contains the process definitions and calculates D-values for
intra-region processes of a particular model parametrization'''
################################################################################

from numpy import *
import inspect
import copy
from globalz import *
import sys

[docs]class process(): ''' The class contains the intra-region process descriptions of BETR-Global as methods. Each method returns a dictionary containing D-values associated with the process identified by the dictionary keys: {(*from_compartmentID*, *to_compartmentID*, *processname*) : *D*}, where *processname* is identical to the name of the method and *D* is the associated D-value [Pa/m^3/h]. Upon initialization, the class checks whether all processes in *model.proclist* are implemented. The class provides the method :py:meth:`~processes.process.getD` that calls all process description methods and returns a dictionary containing *all* process D-values''' def __init__(self, model): self.m=model self.D={} ## calculation of D-values## ## check whether all processes are implemented self.plist=[x[0] for x in self.m.proclist] for p in self.plist: try: getattr(self,p) except AttributeError: print("processes.py: " +"Method %s not implemented !\n Aborting!") % (p) sys.exit(1)
[docs] def getD(self): ''' construct dictionary with D-values for all intra-cell processes ''' for p in self.plist: self.D.update(getattr(self,p)()) return(self.D)
[docs] def betr_degradation(self): ''' degradation ''' # don't change this D={} procname=inspect.getframeinfo(inspect.currentframe())[2] for c in self.m.compdict.keys(): D[(c,c,procname)]=self.m.chempardict[c]['k_reac']\ *self.m.vdict[c]['bulk']\ *self.m.zdict[c]['bulk'] # degradation in air only in gas phase ? if self.m.controldict['aerosoldeg'] in ['0','False','false','f','FALSE' 'F','No','no','n','NO']: D[(1,1,procname)]=self.m.chempardict[1]['k_reac']\ *self.m.vdict[1]['bulk']\ *self.m.zdict[1]['air'] D[(2,2,procname)]=self.m.chempardict[2]['k_reac']\ *self.m.vdict[2]['bulk']\ *self.m.zdict[2]['air'] return(D)
[docs] def betr_advectiveloss(self): ''' advective loss from the system ''' # don't change this D={} ## soil convection ## ATT: what is factor 0.05 ? Correction for vert. conc. profile ? D[(6,6,'burial')]=0.05*self.m.par['convec6solids']\ *self.m.par['A']*self.m.par['perc6']\ *self.m.zdict[6]['solids'] ## leaching from soil (loss from system) D[(6,6,'leach')]=self.m.par['leach6']\ *self.m.par['A']*self.m.par['perc6']\ *self.m.zdict[6]['water'] ## sediment burial D[(7,7,'burial')]=self.m.par['sedburial']\ *self.m.par['A']*self.m.par['perc4']\ *self.m.zdict[7]['solids'] ## diffusion to stratosphere D[(1,1,'stratosphere')]=self.m.par['diffstrato']*self.m.par['A']\ *self.m.zdict[1]['air'] ## sedimentation in ocean D[(5,5,'sedimentation')]=self.m.par['partsink5']\ *self.m.par['A']*self.m.par['perc5']\ *self.m.zdict[5]['sussed'] return(D)
[docs] def betr_air1_air2_mix(self): ''' mixing between upper and lower atmosphere ''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} D[(1,2,procname)]=self.m.par['A']*self.m.par['mixing12']\ *self.m.zdict[1]['bulk'] D[(2,1,procname)]=self.m.par['A']*self.m.par['mixing12']\ *self.m.zdict[2]['bulk'] return(D)
[docs] def betr_air2_veg_diff(self): ''' diffusive air-vegetation exchange according to Cousins and Mackay, 2001 [1]_.''' #don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here logpc=(-3.47-2.79*log10(self.m.chemdict['molmass'])\ +0.97*log10(self.m.chempardict[2]['Kow'])\ -11.2+0.704*log10(self.m.chempardict[2]['Kow']) ) / 2 pc=10**logpc mtcavv=3600*pc/self.m.chempardict[2]['Kaw'] A=self.m.par['A']*self.m.par['perc6']*self.m.par['perc3']\ *self.m.par['LAI'] Apos=where(A>0) # prevent division by zero errors d=zeros(A.shape) dc=A*mtcavv*self.m.zdict[3]['bulk'] da=A*self.m.par['mtcairvegair']*self.m.zdict[2]['air'] d[Apos]=(1/dc[Apos]+1/da[Apos])**-1 # ATT : speed-limit to diffusion to a char. time > 8h # ATT : not clear to me, why veg->air, not air->veg # ATT : or both ? d=minimum(d,self.m.zdict[3]['bulk']*self.m.vdict[3]['bulk']/8.0) D[(2,3,procname)]=d D[(3,2,procname)]=d return(D)
[docs] def betr_air2_veg_drydep(self): '''dry deposition to vegetation''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here A=self.m.par['A']*self.m.par['perc6']*self.m.par['perc3'] D[(2,3,procname)]=A*self.m.par['fp2']*self.m.par['mtcaerosol']\ *self.m.zdict[2]['aerosol'] return(D)
[docs] def betr_air2_veg_dissolution(self): ''' air-vegetation rain dissolution (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here A=self.m.par['A']*self.m.par['perc6']*self.m.par['perc3'] # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,3,procname)]=A*mtc_event*self.m.zdict[2]['rain']\ *self.m.par['intercept'] return(D)
[docs] def betr_air2_veg_wetparticle(self): ''' wet particle deposition to vegetation (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here A=self.m.par['A']*self.m.par['perc6']*self.m.par['perc3'] # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,3,procname)]=A*mtc_event*self.m.zdict[2]['aerosol']\ *self.m.par['scavrat']*self.m.par['fp2']\ *self.m.par['intercept'] return(D)
[docs] def betr_air2_freshwater_diff(self): '''diffusive exchange air-freshwater''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(2,4,procname)]=self.m.par['A']*self.m.par['perc4']\ *((self.m.par['mtc4air']*self.m.zdict[2]['air'])**-1\ +(self.m.par['mtc4water']\ *self.m.zdict[4]['water'])**-1)**-1 D[(4,2,procname)]=D[(2,4,procname)] return(D)
[docs] def betr_air2_freshwater_drydep(self): ''' dry particle deposition to fresh water''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(2,4,procname)]=self.m.par['A']*self.m.par['perc4']\ *self.m.par['fp2']*self.m.par['mtcaerosol']\ *self.m.zdict[2]['aerosol'] return(D)
[docs] def betr_air2_freshwater_dissolution(self): '''air-freshwater rain dissolution (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,4,procname)]=self.m.par['A']*self.m.par['perc4']\ *mtc_event*self.m.zdict[2]['rain'] return(D)
[docs] def betr_air2_freshwater_wetparticle(self): '''air-freshwater wet particle deposition (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,4,procname)]=self.m.par['A']*self.m.par['perc4']*mtc_event\ *self.m.zdict[2]['aerosol']*self.m.par['fp2']\ *self.m.par['scavrat'] return(D)
[docs] def betr_air2_ocean_diff(self): '''diffusive exchange air-ocean water''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(2,5,procname)]=self.m.par['A']*self.m.par['perc5']\ *((self.m.par['mtc25air']*self.m.zdict[2]['air'])**-1\ +(self.m.par['mtc25water']\ *self.m.zdict[5]['water'])**-1)**-1 D[(5,2,procname)]=D[(2,5,procname)] return(D)
[docs] def betr_air2_ocean_drydep(self): ''' dry particle deposition to ocean water''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(2,5,procname)]=self.m.par['A']*self.m.par['perc5']\ *self.m.par['fp2']*self.m.par['mtcaerosol']\ *self.m.zdict[2]['aerosol'] return(D)
[docs] def betr_air2_ocean_dissolution(self): '''air-ocean water rain dissolution (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,5,procname)]=self.m.par['A']*self.m.par['perc5']\ *mtc_event*self.m.zdict[2]['rain'] return(D)
[docs] def betr_air2_ocean_wetparticle(self): '''air-ocean water wet particle deposition (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,5,procname)]=self.m.par['A']*self.m.par['perc5']*mtc_event\ *self.m.zdict[2]['aerosol']*self.m.par['fp2']\ *self.m.par['scavrat'] return(D)
[docs] def betr_air2_soil_diff(self): '''diffusive exchange air-soil''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here dsa=self.m.par['A']*self.m.par['perc6']\ *(self.m.par['diff6air']*self.m.zdict[6]['air']\ +self.m.par['diff6water']*self.m.zdict[6]['water']\ +self.m.par['convec6solids']*self.m.zdict[6]['solids']) das=self.m.par['A']*self.m.par['perc6']\ *self.m.par['mtc6air']*self.m.zdict[2]['air'] D[(2,6,procname)]=(1/dsa + 1/das)**-1 D[(6,2,procname)]=D[(2,6,procname)] return(D)
[docs] def betr_air2_soil_drydep(self): ''' dry particle deposition to soil''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(2,6,procname)]=self.m.par['A']*self.m.par['perc6']\ *self.m.par['fp2']*self.m.par['mtcaerosol']\ *self.m.zdict[2]['aerosol']*(1-self.m.par['perc3']) return(D)
[docs] def betr_air2_soil_dissolution(self): '''air-soil rain dissolution (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,6,procname)]=self.m.par['A']*self.m.par['perc6']\ *mtc_event*self.m.zdict[2]['rain'] return(D)
[docs] def betr_air2_soil_wetparticle(self): '''air-soil wet particle deposition (*the returned D-value refers to rain intensity during event (stwet)*)''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here # rain rate during precipitation events # deal here with stwet == 0, and inconsistencies in the # BETR Global paramterisation, where stwet=0 but precip > 0 norainmask = self.m.par['stwet'] == 0 stwet_tmp=copy.copy(self.m.par['stwet']) stwet_tmp[norainmask]=1 mtc_event=self.m.par['precip']\ *(self.m.par['stdry']+self.m.par['stwet'])/stwet_tmp mtc_event[norainmask]=0 D[(2,6,procname)]=self.m.par['A']*self.m.par['perc6']*mtc_event\ *self.m.zdict[2]['aerosol']*self.m.par['fp2']\ *self.m.par['scavrat'] return(D)
[docs] def betr_vegetation_soil_litter(self): '''vegetation-soil tranfer through litterfall''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(3,6,procname)]=self.m.vdict[3]['bulk']*self.m.zdict[3]['bulk']\ /self.m.par['tauveg'] return(D)
[docs] def betr_freshwater_ocean_runoff(self): ''' fresh water to ocean runoff''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here # calculate river flow from freshwater to ocean in the same cell mflow=zeros(self.m.par.shape) sameregid=where(self.m.flowdict[(4,5)][:,0] ==self.m.flowdict[(4,5)][:,1])[0] samereg=self.m.flowdict[(4,5)][sameregid,0].astype('int') mflow[samereg-1,:]=self.m.flowdict[(4,5)][sameregid,2:] ### ATT: BETR-Global: # calculate runoff from soil to ocean; # use max(soil_runoff, riverflow) for D-value soilrunoff=self.m.par['A']*self.m.par['perc6']\ *self.m.par['runoff6water'] oceanmask=array(self.m.vdict[5]['bulk'] > 0).astype(int) freshwatermask=array(self.m.vdict[4]['bulk'] > 0).astype(int) soilrunoff=soilrunoff*oceanmask*freshwatermask flow=maximum(mflow, soilrunoff) D[(4,5,procname)]=self.m.zdict[4]['bulk']*flow return(D)
[docs] def betr_ocean_sinkflux(self): ''' fresh water to ocean runoff''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here # calculate river flow from freshwater to ocean in the same cell mflow=zeros(self.m.par.shape) sameregid=where(self.m.flowdict[(5,5)][:,0] ==self.m.flowdict[(5,5)][:,1])[0] samereg=self.m.flowdict[(5,5)][sameregid,0].astype('int') mflow[samereg-1,:]=self.m.flowdict[(5,5)][sameregid,2:] D[(5,5,procname)]=self.m.zdict[5]['bulk']*mflow return(D)
[docs] def betr_freshwater_sediment_diff(self): ''' freshwater-sediment diffusion ''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(4,7,procname)]=self.m.par['A']*self.m.par['perc4']\ *self.m.par['diff7water']*self.m.zdict[4]['water'] D[(7,4,procname)]=D[(4,7,procname)] return(D)
[docs] def betr_freshwater_sediment_deposit(self): ''' freshwater-sediment particle sedimentation ''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(4,7,procname)]=self.m.par['A']*self.m.par['perc4']\ *self.m.par['seddep']*self.m.zdict[4]['sussed'] return(D)
[docs] def betr_ocean_air_resusp(self): ''' marine aerosol production''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(5,2,procname)]=self.m.par['A']*self.m.par['perc5']\ *self.m.par['prodaerosol5']*self.m.zdict[5]['water'] return(D)
[docs] def betr_soil_air_resusp(self): ''' terrestrial aerosol production''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(6,2,procname)]=self.m.par['A']*self.m.par['perc6']\ *self.m.par['resusp6']*self.m.zdict[6]['solids'] return(D)
[docs] def betr_soil_veg_rootuptake(self): ''' soil-vegetation root uptake. The transpiration stream concentration factor (TSCF) is calculated according to Cousins and Mackay, 2001 [1]_.''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here TSCF = 0.784*exp(-((log10(self.m.chempardict[6]['Kow'])-1.78)**2)/2.44) D[(6,3,procname)]=self.m.par['A']*self.m.par['perc6']\ *self.m.par['perc3']*self.m.par['LAI']\ *TSCF*self.m.par['vegwateruptake']\ *self.m.zdict[6]['water'] return(D)
[docs] def betr_soil_freshwater_runoff(self): ''' water-runoff from soil to freshwater-bodies ''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here freshwatermask=array(self.m.vdict[4]['bulk'] > 0).astype(int) D[(6,4,procname)]=freshwatermask*self.m.par['A']*self.m.par['perc6']\ *self.m.par['runoff6water']*self.m.zdict[6]['water'] return(D)
[docs] def betr_soil_freshwater_erosion(self): ''' solids-runoff from soil to freshwater-bodies''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} freshwatermask=array(self.m.vdict[4]['bulk'] > 0).astype(int) # process description starts here D[(6,4,procname)]=freshwatermask*self.m.par['A']*self.m.par['perc6']\ *self.m.par['runoff6solids']\ *self.m.zdict[6]['solids'] return(D)
[docs] def betr_sediment_freshwater_resusp(self): ''' sediment resuspension in freshwater bodies''' # don't change this procname=inspect.getframeinfo(inspect.currentframe())[2] D={} # process description starts here D[(7,4,procname)]=self.m.par['A']*self.m.par['perc4']\ *self.m.par['sedresup']*self.m.zdict[7]['solids'] return(D)
[docs] def betr_intermittent_rain(self): ''' Jolliet-Hauschild [2]_ calculation of intermittent rainfall. Uses the simplification implemented in BETR-Global.''' def _do_jolliet(wa,dwet,ddiss,twet,tdry,tsum): dj1=wa*tsum/tdry dj2=(dwet+ddiss)*twet/tsum dj1mask=(dj1 > dj2).astype(int) dj2mask=logical_not(dj1mask).astype(int) ddissnew=dj1mask*ddiss*twet/tsum\ +dj2mask*dj1*ddiss/dj2*twet/tsum dwetnew=dj1mask*dwet*twet/tsum\ +dj2mask*dj1*dwet/dj2*twet/tsum return([dwetnew,ddissnew]) ## air-veg dwetairveg=copy.copy(self.D[(2,3,'betr_air2_veg_wetparticle')]) ddissairveg=copy.copy(self.D[(2,3,'betr_air2_veg_dissolution')]) ## Inconsistencies in the BETR-Input between precip, twet and tdry ## are a major PITA mask=where((self.m.par['stdry'] != 0) & (self.m.par['stwet'] != 0) & (dwetairveg != 0) & (ddissairveg != 0)) tdry=self.m.par['stdry'][mask] twet=self.m.par['stwet'][mask] tsum=tdry+twet wa=self.m.vdict[2]['bulk'][mask]*self.m.zdict[2]['bulk'][mask]\ *2/tdry*self.m.par['perc6'][mask]*self.m.par['perc3'][mask]\ *self.m.par['intercept'][mask] [dwetnew, ddissnew] = _do_jolliet(wa,dwetairveg[mask], ddissairveg[mask],twet,tdry,tsum) dwetairveg[mask]=dwetnew ddissairveg[mask]=ddissnew ##air-freshwater dwetairfw=copy.copy(self.D[(2,4,'betr_air2_freshwater_wetparticle')]) ddissairfw=copy.copy(self.D[(2,4,'betr_air2_freshwater_dissolution')]) ## Inconsistencies in the BETR-Input between precip, twet and tdry ## are a major PITA mask=where((self.m.par['stdry'] != 0) & (self.m.par['stwet'] != 0) & (dwetairfw != 0) & (ddissairfw != 0)) tdry=self.m.par['stdry'][mask] twet=self.m.par['stwet'][mask] tsum=tdry+twet wa=self.m.vdict[2]['bulk'][mask]*self.m.zdict[2]['bulk'][mask]\ *2/tdry*self.m.par['perc4'][mask] [dwetnew, ddissnew] = _do_jolliet(wa,dwetairfw[mask], ddissairfw[mask],twet,tdry,tsum) dwetairfw[mask]=dwetnew ddissairfw[mask]=ddissnew ##air-ocean dwetairocean=copy.copy(self.D[(2,5,'betr_air2_ocean_wetparticle')]) ddissairocean=copy.copy(self.D[(2,5,'betr_air2_ocean_dissolution')]) ## Inconsistencies in the BETR-Input between precip, twet and tdry ## are a major PITA mask=where((self.m.par['stdry'] != 0) & (self.m.par['stwet'] != 0) & (dwetairocean != 0) & (ddissairocean != 0)) tdry=self.m.par['stdry'][mask] twet=self.m.par['stwet'][mask] tsum=tdry+twet wa=self.m.vdict[2]['bulk'][mask]*self.m.zdict[2]['bulk'][mask]\ *2/tdry*self.m.par['perc5'][mask] [dwetnew, ddissnew] = _do_jolliet(wa,dwetairocean[mask], ddissairocean[mask],twet,tdry,tsum) dwetairocean[mask]=dwetnew ddissairocean[mask]=ddissnew ##air-soil dwetairsoil=copy.copy(self.D[(2,6,'betr_air2_soil_wetparticle')]) ddissairsoil=copy.copy(self.D[(2,6,'betr_air2_soil_dissolution')]) ## Inconsistencies in the BETR-Input between precip, twet and tdry ## are a major PITA mask=where((self.m.par['stdry'] != 0) & (self.m.par['stwet'] != 0) & (dwetairsoil != 0) & (ddissairsoil != 0)) tdry=self.m.par['stdry'][mask] twet=self.m.par['stwet'][mask] tsum=tdry+twet wa=self.m.vdict[2]['bulk'][mask]*self.m.zdict[2]['bulk'][mask]\ *2/tdry*self.m.par['perc6'][mask] [dwetnew, ddissnew] = _do_jolliet(wa,dwetairsoil[mask], ddissairsoil[mask],twet,tdry,tsum) dwetairsoil[mask]=dwetnew ddissairsoil[mask]=ddissnew ## Correction for Vegetation Interception (BETR-VBA) dwetairsoil=dwetairsoil*(1-self.m.par['perc3']*self.m.par['intercept']) ddissairsoil=ddissairsoil*(1-self.m.par['perc3'] *self.m.par['intercept']) return({(2,3,'betr_air2_veg_wetparticle'):dwetairveg, (2,3,'betr_air2_veg_dissolution'):ddissairveg, (2,4,'betr_air2_freshwater_wetparticle'):dwetairfw, (2,4,'betr_air2_freshwater_dissolution'):ddissairfw, (2,5,'betr_air2_ocean_wetparticle'):dwetairocean, (2,5,'betr_air2_ocean_dissolution'):ddissairocean, (2,6,'betr_air2_soil_wetparticle'):dwetairsoil, (2,6,'betr_air2_soil_dissolution'):ddissairsoil} ) ################################################################################