result eqc

31

Upload: iskayuniparmanti

Post on 11-Dec-2015

243 views

Category:

Documents


2 download

DESCRIPTION

new EQC Models

TRANSCRIPT

Display

' EQC' Fugacity-Based Multimedia Environmental Model' Released May 2003' Copyright Trent University - 2003' Version 2.01

' Canadian Environmental Modelling Centre' Trent University

' Peterborough, Ontario, K9J 7B8, Canada' http://www.trentu.ca/cemc/

' Program coded by Eva Webster, Antonio DiGuardo, Penny Massey, Adam Hodge.

' Based on the following publications:

' Mackay, D., Paterson, S., Kicsi, G., Di Guardo, A., Cowan, C.E. 1996. Assessing the Fate' of New and Existing Chemicals: A Five Stage Process. Environ. Toxicol. Chem. 15: 1618-1626.

' Mackay, D., Paterson, S., Di Guardo, A., Cowan, E.C. 1996. Evaluating the Environmental Fate' of a Variety of Types of Chemicals Using the EQC Model. Environ.' Toxicol. Chem. 15: 1627-1637.

' Mackay, D., Paterson, S., Kicsi, G., Cowan, E.C., Di Guardo, A., Kane, D.M. 1996. Assessment' of Chemical Fate in the Environment Using Evaluative, Regional and Local-Scale Models:' Illustrative Application to Chlorobenzene and Linear Alkylbenzene Sulfonates. Environ.' Toxicol. Chem. 15: 1638-1648.

' Mackay, D. 2001. "Multimedia Environmental Models: The Fugacity Approach-Second Edition",' Lewis Publishers, Boca Raton, pp. 1-261.

' ****************************************************************************************** Public Sub EnvPropValues()' This routine assigns values to all the environmental property variables.' ******************************************************************************************

EnvName = "EQC Standard"

' Areas Area(AIR) = 100000000000# Area(WATER) = 10000000000# Area(SOIL) = Area(AIR) - Area(WATER) Area(SED) = Area(WATER) ' Depths DepthL1andL2(AIR) = 1000 DepthL1andL2(WATER) = 20# DepthL1andL2(SOIL) = 0.1 DepthL1andL2(SED) = 0.01 DepthL3(AIR) = DepthL1andL2(AIR) DepthL3(WATER) = DepthL1andL2(WATER) DepthL3(SOIL) = 2 * DepthL1andL2(SOIL) DepthL3(SED) = 5 * DepthL1andL2(SED)

' Volume Fractions VolFract(AIR, VAPOUR) = 1 VolFract(AIR, SOLID) = 0.00000000002 VolFract(WATER, SOLID) = 0.000005 VolFract(WATER, BIOTA) = 0.000001 VolFract(SOIL, VAPOUR) = 0.2 VolFract(SOIL, LIQUID) = 0.3 VolFract(SOIL, SOLID) = 0.5 VolFract(SED, LIQUID) = 0.8 VolFract(SED, SOLID) = 0.2 CalcVolumes ' Density DensitySub_kg(AIR, VAPOUR) = ((0.029 * 101325) / GASCONSTANT) / DataTempK

DensitySub_kg(AIR, SOLID) = 2000 DensitySub_kg(WATER, LIQUID) = 1000 DensitySub_kg(WATER, SOLID) = 1500 DensitySub_kg(WATER, BIOTA) = 1000 DensitySub_kg(SOIL, VAPOUR) = DensitySub_kg(AIR, VAPOUR) DensitySub_kg(SOIL, LIQUID) = DensitySub_kg(WATER, LIQUID) DensitySub_kg(SOIL, SOLID) = 2400 DensitySub_kg(SED, LIQUID) = DensitySub_kg(WATER, LIQUID) DensitySub_kg(SED, SOLID) = 2400 CalcDensityBulk ' OCsolids OCsolids(WATER) = 0.2 OCsolids(SOIL) = 0.02 OCsolids(SED) = 0.04

' Fish Lipid Lipid = 0.05 ' Adv. Residence AdvectResTime_h(AIR) = 100 AdvectResTime_h(WATER) = 1000 AdvectResTime_h(SOIL) = 0 AdvectResTime_h(SED) = 50000 For Medium = 0 To 3 AdvectResTime_d(Medium) = AdvectResTime_h(Medium) / HoursInDay Next Medium 'Transport Velocities TransportVelocity_h(AirWaterMTC_A) = 5# TransportVelocity_h(AirWaterMTC_W) = 0.05 TransportVelocity_h(RainMTC) = 0.0001 TransportVelocity_h(AerosolDepMTC) = 0.0000000006 TransportVelocity_h(SoilDiffusMTC_A) = 0.02 TransportVelocity_h(SoilDiffusMTC_W) = 0.00001 TransportVelocity_h(SoilAirBoundMTC) = 5# TransportVelocity_h(WatSedMTC) = 0.0001 TransportVelocity_h(SedDepMTC) = 0.0000005 TransportVelocity_h(SedResusMTC) = 0.0000002 TransportVelocity_h(Runoff_WaterMTC) = 0.00005 TransportVelocity_h(Runoff_SolidMTC) = 0.00000001 For MTC = 0 To 11 TransportVelocity_y(MTC) = TransportVelocity_h(MTC) * HoursInYears Next MTC End Sub ' EnvPropValues

' ****************************************************************************************** Private Sub CalcVolumes()' This procedure calculates the volumes of all media for all levels.' ******************************************************************************************

' Bulk Compartment Volumes For Medium = 0 To 3 VolumeL1andL2(Medium) = Area(Medium) * DepthL1andL2(Medium) VolumeL3(Medium) = Area(Medium) * DepthL3(Medium) Next Medium

' Level I and II VolumeL1andL2(SUS) = VolumeL1andL2(WATER) * VolFract(WATER, SOLID) VolumeL1andL2(FISH) = VolumeL1andL2(WATER) * VolFract(WATER, BIOTA)' Level III ' Calculate volume fraction for gaseous air in bulk air VolFract(AIR, VAPOUR) = 1 - VolFract(AIR, SOLID) ' Calculate volume fraction for pure water in bulk water VolFract(WATER, LIQUID) = 1 - VolFract(WATER, SOLID) - VolFract(WATER, BIOTA) 'Calculate volumes for subcompartments within the 4 bulk compartments 'using bulk volumes and volume fractions 'Level III VolumeL3Sub(AIR, VAPOUR) = VolumeL3(AIR) * (1 - VolFract(AIR, SOLID)) ' gaseous air VolumeL3Sub(AIR, SOLID) = VolFract(AIR, SOLID) * VolumeL3(AIR) ' aerosol VolumeL3Sub(WATER, LIQUID) = VolumeL3(WATER) * (1 - _ VolFract(WATER, SOLID) - VolFract(WATER, BIOTA)) ' pure water VolumeL3Sub(WATER, SOLID) = VolumeL3(WATER) * VolFract(WATER, SOLID) ' sus. sed. VolumeL3Sub(WATER, BIOTA) = VolumeL3(WATER) * VolFract(WATER, BIOTA) ' fish VolumeL3Sub(SOIL, VAPOUR) = VolFract(SOIL, VAPOUR) * VolumeL3(SOIL) ' soil pore air VolumeL3Sub(SOIL, LIQUID) = VolFract(SOIL, LIQUID) * VolumeL3(SOIL) ' soil pore water VolumeL3Sub(SOIL, SOLID) = VolFract(SOIL, SOLID) * VolumeL3(SOIL) ' soil solids VolumeL3Sub(SED, LIQUID) = VolFract(SED, LIQUID) * VolumeL3(SED) ' sed pore water VolumeL3Sub(SED, SOLID) = VolFract(SED, SOLID) * VolumeL3(SED) ' sed solids End Sub ' CalcVolumes

' ****************************************************************************************** Public Sub EQCcalcs()' This is the main procedure for the calculations in EQC.' ******************************************************************************************

Select Case ChemType Case Is = 1 Type1Calcs Case Is = 2 Type2Calcs Case Is = 3 Type3Calcs End Select For Medium = 0 To 3 HL_d(Medium) = HL_h(Medium) / 24 'unit conversion for half-lives ' Calculate Reaction rate constants ReactRateConst(Medium) = LN2 / HL_h(Medium) Next Medium

CalcDensityBulk CalcZBulk Level1Calcs CalcAdvectFlowRates Level2Calcs Level3Calcs CalcDisplayConc

End Sub ' EQCCalcs

' ******************************************************************************************

Private Sub Type1Calcs()' This procedure performs the required calculations specific to Type 1 chemicals' ******************************************************************************************

WatSol_mol = WatSol_g / MolMass HenryConst = VapPress / WatSol_mol Kow = 10 ^ LogKow Koc = 0.41 * Kow K_Fish_Water = Lipid * Kow DataTempK = C2K + DataTempC

' Ref. Mackay, D. 2001. Multimedia Environmental Models, The Fugacity Approach - 2nd Edition p. 77. ' For solids, estimate the subcooled liquid vapour pressure from the ' solid vapour pressure using the fugacity ratio estimated from the ' chemicals melting point and the data temperature

If MeltPtC > DataTempC Then FugRatio = Exp(6.79 * (1 - (MeltPtC + C2K) / DataTempK)) Else ' If not a solid, use liquid vapour pressure directly FugRatio = 1 End If VapPressLiq = VapPress / FugRatio Zsub(AIR, VAPOUR) = 1 / (GASCONSTANT * DataTempK) Zsub(AIR, SOLID) = (Zsub(AIR, VAPOUR) * 6000000) / VapPressLiq ' aerosols Zsub(WATER, LIQUID) = 1 / HenryConst Zsub(WATER, SOLID) = (Zsub(WATER, LIQUID) * DensitySub_kg(WATER, SOLID) * _ OCsolids(WATER) * Koc) / 1000 ' susp. sed in water Zsub(WATER, BIOTA) = Zsub(WATER, LIQUID) * DensitySub_kg(WATER, BIOTA) * _ K_Fish_Water / 1000 'fish Zsub(SOIL, VAPOUR) = Zsub(AIR, VAPOUR) ' air in soil Zsub(SOIL, LIQUID) = Zsub(WATER, LIQUID) ' pore water in soil Zsub(SOIL, SOLID) = (Zsub(WATER, LIQUID) * DensitySub_kg(SOIL, SOLID) * _ OCsolids(SOIL) * Koc) / 1000 ' soil solids Zsub(SED, LIQUID) = Zsub(WATER, LIQUID) ' pore water in sed Zsub(SED, SOLID) = (Zsub(WATER, LIQUID) * DensitySub_kg(SED, SOLID) * _ OCsolids(SED) * Koc) / 1000 ' sediment solids ' Calculate Partition Coefficients (dimensionless) K_Air_Water = Zsub(AIR, VAPOUR) / Zsub(WATER, LIQUID) 'gaseous air to water (KAW) K_Soil_Water = Zsub(SOIL, SOLID) / Zsub(WATER, LIQUID) 'soil solids to water K_Sed_Water = Zsub(SED, SOLID) / Zsub(WATER, LIQUID) 'sediment solids to water K_SusSed_Water = Zsub(WATER, SOLID) / Zsub(WATER, LIQUID) 'suspended sediment to water K_Aerosol_Air = Zsub(AIR, SOLID) / Zsub(AIR, VAPOUR) 'aerosol to air ' Convert Partition Coefficients to dimensional ' soil solids to water K_Soil_Water_L_kg = (K_Soil_Water * 1000) / DensitySub_kg(SOIL, SOLID) ' sediment solids to water K_Sed_Water_L_kg = (K_Sed_Water * 1000) / DensitySub_kg(SED, SOLID) ' suspended sediment to water K_SusSed_Water_L_kg = (K_SusSed_Water * 1000) / DensitySub_kg(WATER, SOLID) ' fish to water K_Fish_Water_L_kg = (K_Fish_Water * 1000) / DensitySub_kg(WATER, BIOTA) End Sub ' Type1Calcs

' ****************************************************************************************** Private Sub Type2Calcs()' This procedure performs the required calculations specific to Type 2 chemicals' ****************************************************************************************** ' Convert dimensioned partition coefficients ' (units L/kg) to dimensionless K_Soil_Water = K_Soil_Water_L_kg * DensitySub_kg(SOIL, SOLID) / 1000 K_Sed_Water = K_Sed_Water_L_kg * DensitySub_kg(SED, SOLID) / 1000 K_SusSed_Water = K_SusSed_Water_L_kg * DensitySub_kg(WATER, SOLID) / 1000 K_Fish_Water = K_Fish_Water_L_kg * DensitySub_kg(WATER, BIOTA) / 1000

' Calculate Z Values Zsub(WATER, LIQUID) = 1 ' By def'n, Z for water is 1 Zsub(AIR, VAPOUR) = Zsub(WATER, LIQUID) * K_Air_Water ' gaseous air Zsub(AIR, SOLID) = Zsub(WATER, LIQUID) * K_Aerosol_Water ' particles in air Zsub(WATER, SOLID) = Zsub(WATER, LIQUID) * K_SusSed_Water ' sus. solids in water Zsub(WATER, BIOTA) = Zsub(WATER, LIQUID) * K_Fish_Water ' fish in water Zsub(SOIL, VAPOUR) = Zsub(AIR, VAPOUR) ' gaseous air in soil Zsub(SOIL, LIQUID) = Zsub(WATER, LIQUID) ' pore water in soil Zsub(SOIL, SOLID) = Zsub(WATER, LIQUID) * K_Soil_Water ' aerosol in air Zsub(SED, WATER) = Zsub(WATER, LIQUID) ' sediment pore water Zsub(SED, SOLID) = Zsub(WATER, LIQUID) * K_Sed_Water ' soil solids ' If the Z for air is zero then aerosols should also have a zero value If Zsub(AIR, VAPOUR) = 0 Then K_Aerosol_Air = 0 Else K_Aerosol_Air = K_Aerosol_Water / K_Air_Water End If End Sub ' Type2Calcs

' ****************************************************************************************** Private Sub Type3Calcs()' This procedure performs the required calculations specific to Type 3 chemicals' ******************************************************************************************

' Calculate Z Values for subcompartments Zsub(AIR, VAPOUR) = 1 / GASCONSTANT / DataTempK ' Gas Constant = 8.314 Zsub(WATER, LIQUID) = Zsub(AIR, VAPOUR) * K_Water_Air ' pure water Zsub(WATER, SOLID) = Zsub(AIR, VAPOUR) * K_SusSed_Air ' sus.solids in water Zsub(WATER, BIOTA) = Zsub(AIR, VAPOUR) * K_Fish_Air ' fish in water Zsub(AIR, SOLID) = Zsub(AIR, VAPOUR) * K_Aerosol_Air ' aerosols in air Zsub(SOIL, VAPOUR) = Zsub(AIR, VAPOUR) ' gaseous air in soil Zsub(SOIL, LIQUID) = Zsub(WATER, LIQUID) ' pore water in soil Zsub(SOIL, SOLID) = Zsub(AIR, VAPOUR) * K_Soil_Air ' soil solids Zsub(SED, LIQUID) = Zsub(WATER, LIQUID) ' pore water in sed Zsub(SED, SOLID) = Zsub(AIR, VAPOUR) * K_Sed_Air ' sediment solids End Sub ' Type3Calcs

' ****************************************************************************************** Private Sub CalcDensityBulk()' This procedure calculates the bulk densities for the 4 compartments.' ******************************************************************************************

For Medium = 0 To 3 Density_kg(Medium) = 0

For SubMedium = 0 To 3 Density_kg(Medium) = Density_kg(Medium) _ + VolFract(Medium, SubMedium) _ * DensitySub_kg(Medium, SubMedium) Next SubMedium Next Medium

' Level I and II Density_kg(SUS) = DensitySub_kg(WATER, SOLID) Density_kg(FISH) = DensitySub_kg(WATER, BIOTA)

End Sub ' CalcDensityBulk

' ****************************************************************************************** Private Sub CalcZBulk()' This procedure calculates the bulk compartment Z Values. Subcompartment Z Value' calculations are dependant upon the chemical type (1, 2 or 3) have been previously' calculated with the partition coefficients for type 1 chemicals and within type 2 and' type 3 chemical calculations.' ******************************************************************************************

' Level I and II ZbulkL1andL2(AIR) = Zsub(AIR, VAPOUR) ZbulkL1andL2(WATER) = Zsub(WATER, LIQUID) ZbulkL1andL2(SOIL) = Zsub(SOIL, SOLID) ZbulkL1andL2(SED) = Zsub(SED, SOLID) ZbulkL1andL2(SUS) = Zsub(WATER, SOLID) ZbulkL1andL2(FISH) = Zsub(WATER, BIOTA)

' Level III For Medium = 0 To 3 ZbulkL3(Medium) = 0 For SubMedium = 0 To 3 ZbulkL3(Medium) = ZbulkL3(Medium) + VolFract(Medium, SubMedium) * _ Zsub(Medium, SubMedium) Next SubMedium Next Medium

End Sub ' CalcZBulk

' ****************************************************************************************** Private Sub Level1Calcs()' This procedure performs the Level 1 calculations.' ****************************************************************************************** ' Initialize VolZsumL1andL2 = 0 ' Calculate sum of Volume and Zvalues For Medium = AIR To FISH VolZL1andL2(Medium) = VolumeL1andL2(Medium) * ZbulkL1andL2(Medium) VolZsumL1andL2 = VolZL1andL2(Medium) + VolZsumL1andL2 Next Medium EmisL1_mol = EmisL1_kg * 1000 / MolMass FugacityL1 = EmisL1_mol / VolZsumL1andL2

For Medium = AIR To FISH ConcL1_g(Medium) = FugacityL1 * ZbulkL1andL2(Medium) * MolMass ConcL1_mol(Medium) = FugacityL1 * ZbulkL1andL2(Medium)

AmountL1_mol(Medium) = ConcL1_mol(Medium) * VolumeL1andL2(Medium) AmountL1_kg(Medium) = AmountL1_mol(Medium) * MolMass / 1000 AmountL1_percent(Medium) = (AmountL1_kg(Medium) * 100) / EmisL1_kg Next Medium ConcL1ug_g(SOIL) = (ConcL1_g(SOIL) * 1000) / (DensitySub_kg(SOIL, SOLID)) ConcL1ug_g(SED) = (ConcL1_g(SED) * 1000) / (DensitySub_kg(SED, SOLID)) ConcL1ug_g(SUS) = (ConcL1_g(SUS) * 1000) / (Density_kg(SUS)) ConcL1ug_g(FISH) = (ConcL1_g(FISH) * 1000) / (Density_kg(FISH)) End Sub ' Level1Calcs

' ****************************************************************************************** Private Sub CalcAdvectFlowRates()' This procedure calculates advective flow rates, advective flow rates apply to bulk' and subcompartments for Level 2 and Level 3.' ******************************************************************************************

' Initialize all advect flow rates to zero For Medium = AIR To SED AdvectFlowRateL2(Medium) = 0 AdvectFlowRateL3(Medium) = 0' For SubMedium = 0 To 3' AdvectFlowRateSubL3(Medium, SubMedium) = 0' Next SubMedium Next Medium ' Calculate advective flow rates from residence times -note soil does not advect AdvectFlowRateL2(AIR) = VolumeL1andL2(AIR) / AdvectResTime_h(AIR) AdvectFlowRateL2(WATER) = VolumeL1andL2(WATER) / AdvectResTime_h(WATER) AdvectFlowRateL2(SED) = VolumeL1andL2(SED) / AdvectResTime_h(SED) AdvectFlowRateL3(AIR) = VolumeL3(AIR) / AdvectResTime_h(AIR) AdvectFlowRateL3(WATER) = VolumeL3(WATER) / AdvectResTime_h(WATER) AdvectFlowRateL3(SED) = VolumeL3(SED) / AdvectResTime_h(SED)

' Calculate advective flow rates for secondary media' For Medium = 0 To 3' For SubMedium = 0 To 4' AdvectFlowRateSubL3(Medium, SubMedium) = AdvectFlowRateL3(Medium)' Next SubMedium' Next Medium End Sub ' CalcAdvectFlowRates ' ****************************************************************************************** Private Sub Level2Calcs()' This procedure performs the Level 2 calculations.' ******************************************************************************************

' Convert emission from kg/h to mol/h EmisL2_mol = EmisL2_kg * 1000 / MolMass

' Calculate sum of Volume and Zvalues VolZsumL1andL2 = 0 For Medium = AIR To SED VolZL1andL2(Medium) = VolumeL1andL2(Medium) * ZbulkL1andL2(Medium) VolZsumL1andL2 = VolZL1andL2(Medium) + VolZsumL1andL2 Next Medium

' Calculate D values

' Initialize DReactTotalL2 = 0: DAdvectTotalL2 = 0 For Medium = 0 To 3 DReactL2(Medium) = VolZL1andL2(Medium) * ReactRateConst(Medium) DAdvectL2(Medium) = AdvectFlowRateL2(Medium) * ZbulkL1andL2(Medium) DReactTotalL2 = DReactTotalL2 + DReactL2(Medium) DAdvectTotalL2 = DAdvectTotalL2 + DAdvectL2(Medium) Next Medium DTotalL2 = DReactTotalL2 + DAdvectTotalL2 ' Fugacity FugacityL2 = EmisL2_mol / DTotalL2 ' Calculate concentrations and amounts ' Initialize AmountTotalL2_mol = 0: AmountTotalL2_kg = 0 For Medium = AIR To FISH ConcL2_mol(Medium) = FugacityL2 * ZbulkL1andL2(Medium) ConcL2_g(Medium) = ConcL2_mol(Medium) * MolMass AmountL2_mol(Medium) = ConcL2_mol(Medium) * VolumeL1andL2(Medium) AmountL2_kg(Medium) = (AmountL2_mol(Medium) * MolMass) / 1000 AmountTotalL2_mol = AmountTotalL2_mol + AmountL2_mol(Medium) AmountTotalL2_kg = (AmountTotalL2_mol * MolMass) / 1000 Next Medium ' Calculate amounts in percent ' Initialize AmountTotalL2_percent = 0 For Medium = AIR To FISH AmountL2_percent(Medium) = AmountL2_mol(Medium) / AmountTotalL2_mol * 100 AmountTotalL2_percent = AmountTotalL2_percent + AmountL2_percent(Medium) * 100 Next Medium ' Calculate mass of chemical per unit mass of solid ConcL2ug_g(SOIL) = (ConcL2_g(SOIL) * 1000) / (DensitySub_kg(SOIL, SOLID)) ConcL2ug_g(SED) = (ConcL2_g(SED) * 1000) / (DensitySub_kg(SED, SOLID)) ConcL2ug_g(SUS) = (ConcL2_g(SUS) * 1000) / (Density_kg(SUS)) ConcL2ug_g(FISH) = (ConcL2_g(FISH) * 1000) / (Density_kg(FISH))

' Calculate advection and reaction losses in mol/h and kg/h ' Initialize LossReactTotalL2_mol = 0: LossReactTotalL2_kg = 0 LossAdvectTotalL2_mol = 0: LossAdvectTotalL2_kg = 0 For Medium = 0 To 3 LossReactL2_mol(Medium) = VolumeL1andL2(Medium) * ConcL2_mol(Medium) * _ ReactRateConst(Medium) LossReactL2_kg(Medium) = LossReactL2_mol(Medium) * MolMass / 1000 LossReactTotalL2_mol = LossReactTotalL2_mol + LossReactL2_mol(Medium) LossReactTotalL2_kg = LossReactTotalL2_mol * MolMass / 1000 LossAdvectL2_mol(Medium) = AdvectFlowRateL2(Medium) * ConcL2_mol(Medium) LossAdvectL2_kg(Medium) = LossAdvectL2_mol(Medium) * MolMass / 1000 LossAdvectTotalL2_mol = LossAdvectTotalL2_mol + LossAdvectL2_mol(Medium) LossAdvectTotalL2_kg = LossAdvectTotalL2_mol * MolMass / 1000 Next Medium ' Calculate system loss totals LossTotalL2_mol = LossAdvectTotalL2_mol + LossReactTotalL2_mol LossTotalL2_kg = LossAdvectTotalL2_kg + LossReactTotalL2_kg

' Calculate losses in percent ' Initialize LossReactTotalL2_percent = 0: LossAdvectTotalL2_percent = 0 For Medium = 0 To 3 LossReactL2_percent(Medium) = 100 * LossReactL2_mol(Medium) / LossTotalL2_mol LossAdvectL2_percent(Medium) = 100 * LossAdvectL2_mol(Medium) / LossTotalL2_mol LossReactTotalL2_percent = LossReactTotalL2_percent + LossReactL2_percent(Medium) LossAdvectTotalL2_percent = LossAdvectTotalL2_percent + LossAdvectL2_percent(Medium) Next Medium ' Calculate chemical residence time in the environment If LossReactTotalL2_mol < SMALL Then ResTimeReactL2_d = LARGE ResTimeReactL2_h = ResTimeReactL2_d * 24 Else ResTimeReactL2_h = AmountTotalL2_mol / LossReactTotalL2_mol ResTimeReactL2_d = ResTimeReactL2_h / 24 End If If LossAdvectTotalL2_mol < SMALL Then ResTimeAdvectL2_d = LARGE ResTimeAdvectL2_h = ResTimeAdvectL2_d * 24 Else ResTimeAdvectL2_h = AmountTotalL2_mol / LossAdvectTotalL2_mol ResTimeAdvectL2_d = ResTimeAdvectL2_h / 24 End If ResTimeOverallL2_h = 1 / ((1 / ResTimeReactL2_h) + (1 / ResTimeAdvectL2_h)) ResTimeOverallL2_d = ResTimeOverallL2_h / 24 End Sub ' Level2Calcs

' ****************************************************************************************** Private Sub Level3Calcs()' This procedure performs the Level 2 calculations.' ******************************************************************************************

CalcEmissions ' Calculate sum of Volume and Zvalues VolZsumL3 = 0 For Medium = AIR To SED VolZL3(Medium) = VolumeL3(Medium) * ZbulkL3(Medium) VolZsumL3 = VolZL3(Medium) + VolZsumL3 Next Medium CalcDValueTransfers CalcDandF CalcConcAmts CalcLosses CalcResTimes

End Sub ' Level3Calcs

' ****************************************************************************************** Private Sub CalcEmissions()' This procedure calculates total Level 3 emissions.' ******************************************************************************************

' Initialize sums EmisL3Total_mol = 0 EmisL3Total_kg = 0

' Convert emissions rate from kg to moles For Medium = 0 To 3 EmisL3_mol(Medium) = EmisL3_kg(Medium) * 1000 / MolMass EmisL3Total_mol = EmisL3Total_mol + EmisL3_mol(Medium) Next Medium EmisL3Total_kg = EmisL3Total_mol * MolMass / 1000 ' Calculate Total system Chemical input (Emission and Inflow) ChemInTotal_kg = EmisL3Total_kg ChemInTotal_mol = EmisL3Total_mol For Medium = 0 To 3 AdvectResTime_d(Medium) = AdvectResTime_h(Medium) / HoursInDay Next Medium

End Sub ' CalcEmissions

' ****************************************************************************************** Private Sub CalcDValueTransfers()' This procedure calculates the detailed intermedia D values.' ******************************************************************************************

' Calculate individual D values for air-water exchange ProcessDvalue(RainD_W) = Area(WATER) * TransportVelocity_h(RainMTC) * _ Zsub(WATER, LIQUID) ' Transfer by rain to water (drw) ProcessDvalue(AerosolD_W) = Area(WATER) * TransportVelocity_h(AerosolDepMTC) * _ Zsub(AIR, SOLID) ' Aerosol deposition to water (dqs) ProcessDvalue(AirWaterD_A) = Area(WATER) * TransportVelocity_h(AirWaterMTC_A) * _ Zsub(AIR, VAPOUR) ' Air-water diffusion (air-side) (dvwa) ProcessDvalue(AirWaterD_W) = Area(WATER) * TransportVelocity_h(AirWaterMTC_W) * _ Zsub(WATER, LIQUID) ' Air-water diffusion (water side) (dvww) If (Zsub(AIR, VAPOUR) = 0) Or (ProcessDvalue(AirWaterD_A) = 0) Or (ProcessDvalue(AirWaterD_W) = 0) Then DiffusSumD_AW = 0 ' Air-water diffusion (overall) (dvw) Else DiffusSumD_AW = 1 / (1 / ProcessDvalue(AirWaterD_A) + 1 / ProcessDvalue(AirWaterD_W)) End If

' Calculate total D values for air to water exchange FromToD(WATER, AIR) = DiffusSumD_AW FromToD(AIR, WATER) = DiffusSumD_AW + ProcessDvalue(AerosolD_W) + ProcessDvalue(RainD_W) ' Calculate individual D values for air-soil exchange ProcessDvalue(SoilAirBoundD) = Area(SOIL) * TransportVelocity_h(SoilAirBoundMTC) * _ Zsub(AIR, VAPOUR) ' Soil-air diffusion (boundary layer) (dvsb) ProcessDvalue(SoilDiffusD_A) = Area(SOIL) * TransportVelocity_h(SoilDiffusMTC_A) * _ Zsub(AIR, VAPOUR) ' Soil-air diffusion (air-phase) (dvsa) ProcessDvalue(SoilDiffusD_W) = Area(SOIL) * TransportVelocity_h(SoilDiffusMTC_W) * _ Zsub(WATER, LIQUID) ' Soil-air diffusion (water-phase) (dvsw) ProcessDvalue(RainD_S) = Area(SOIL) * TransportVelocity_h(RainMTC) * _ Zsub(WATER, LIQUID) ' Rain dissolution to soil (drs) ProcessDvalue(AerosolD_S) = Area(SOIL) * TransportVelocity_h(AerosolDepMTC) * _ Zsub(AIR, SOLID) ' Aerosol deposition to soil (dqs) If (Zsub(AIR, VAPOUR) = 0) Or (SoilAirBoundD = 0) Or (SoilDiffusD_W + SoilDiffusD_A = 0) Then

DiffusSumD_AS = 0 ' Soil-air diffusion (overall) (dvs) Else DiffusSumD_AS = 1 / (1 / ProcessDvalue(SoilAirBoundD) + 1 / _ (ProcessDvalue(SoilDiffusD_W) + ProcessDvalue(SoilDiffusD_A))) End If ' Calculate total D values for air-soil exchange FromToD(SOIL, AIR) = DiffusSumD_AS FromToD(AIR, SOIL) = DiffusSumD_AS + ProcessDvalue(RainD_S) + ProcessDvalue(AerosolD_S) ' Calculate individual D values for water-sediment transfer ProcessDvalue(WatSedDiffusD) = Area(WATER) * TransportVelocity_h(WatSedMTC) * _ Zsub(WATER, LIQUID) ' Water-sediment diffusion (dswd) ProcessDvalue(SedDepD) = Area(WATER) * TransportVelocity_h(SedDepMTC) * _ Zsub(WATER, SOLID) ' Water-sediment deposition (dsd) ProcessDvalue(SedResusD) = Area(SED) * TransportVelocity_h(SedResusMTC) * _ Zsub(SED, SOLID) ' Sediment-water resuspension (dsr) ' Calculate total D values for water-sediment exchange FromToD(WATER, SED) = ProcessDvalue(WatSedDiffusD) + ProcessDvalue(SedDepD) FromToD(SED, WATER) = ProcessDvalue(WatSedDiffusD) + ProcessDvalue(SedResusD) ' Calculate individual D values for transfer from soil to water, including water runoff and soil loss ProcessDvalue(RunoffD_W) = Area(SOIL) * TransportVelocity_h(Runoff_WaterMTC) * _ Zsub(WATER, LIQUID) ' Soil-water runoff (water) (dsww) ProcessDvalue(RunoffD_S) = Area(SOIL) * TransportVelocity_h(Runoff_SolidMTC) * _ Zsub(SOIL, SOLID) ' Soil-water runoff (solids) (dsws) ' Calculate total D values for water-soil exchange FromToD(SOIL, WATER) = ProcessDvalue(RunoffD_W) + ProcessDvalue(RunoffD_S) FromToD(WATER, SOIL) = 0 End Sub ' CalcDValueTransfers

' ****************************************************************************************** Private Sub CalcDandF()' This procedure calculates D values for advection and reactions. The values' are then used to calculated Intermedia Transport values: half-times,' equivalent flows, D values and rates (kg/hr and mol/hr). Fugacities for' both bulk and subcompartments are also calculated.' ******************************************************************************************

' Declare counters for within this procedure only Dim MediumTo, MediumFrom As Integer

' Initialize sums DAdvectTotalL3 = 0 DReactTotalL3 = 0

' Calculate Advection and Reaction D Values for subcompartments ' Air DReactL3(AIR) = VolZL3(AIR) * ReactRateConst(AIR) DAdvectL3(AIR) = AdvectFlowRateL3(AIR) * ZbulkL3(AIR) ' Water DReactL3(WATER) = VolZL3(WATER) * ReactRateConst(WATER) DAdvectL3(WATER) = AdvectFlowRateL3(WATER) * ZbulkL3(WATER) ' Bulk Soil DReactL3(SOIL) = VolZL3(SOIL) * ReactRateConst(SOIL) DAdvectL3(SOIL) = 0

' Bulk Sediment DReactL3(SED) = VolZL3(SED) * ReactRateConst(SED) DAdvectL3(SED) = AdvectFlowRateL3(SED) * ZbulkL3(SED) ' Calculate totals For Medium = 0 To 3 DAdvectTotalL3 = DAdvectTotalL3 + DAdvectL3(Medium) DReactTotalL3 = DReactTotalL3 + DReactL3(Medium) Next Medium DTotalLossL3 = DAdvectTotalL3 + DReactTotalL3

' Calculate the Equivalent Flow (i.e. - the flow of chemical from one medium to another (m^3/h).) For MediumFrom = AIR To SED For MediumTo = AIR To SED Flow(MediumFrom, MediumTo) = FromToD(MediumFrom, MediumTo) / ZbulkL3(MediumFrom) If Flow(MediumFrom, MediumTo) <> 0 Then HalfTime_h(MediumFrom, MediumTo) = LN2 * VolumeL3(MediumFrom) / Flow(MediumFrom, MediumTo) Else HalfTime_h(MediumFrom, MediumTo) = 0 End If HalfTime_d(MediumFrom, MediumTo) = HalfTime_h(MediumFrom, MediumTo) / 24 Next MediumTo Next MediumFrom

' Calculate Fugacities DTotal(AIR) = DReactL3(AIR) + DAdvectL3(AIR) + FromToD(AIR, WATER) + FromToD(AIR, SOIL) DTotal(WATER) = DReactL3(WATER) + DAdvectL3(WATER) + FromToD(WATER, AIR) + _ FromToD(WATER, SOIL) + FromToD(WATER, SED) DTotal(SOIL) = DReactL3(SOIL) + DAdvectL3(SOIL) + FromToD(SOIL, AIR) + FromToD(SOIL, WATER) DTotal(SED) = DReactL3(SED) + DAdvectL3(SED) + FromToD(SED, WATER) ' jTempX variables are used to simplify Fugacity equations jTemp1 = (EmisL3_mol(AIR) / DTotal(AIR) + EmisL3_mol(SOIL) _ * FromToD(SOIL, AIR) / (DTotal(SOIL) * DTotal(AIR))) jTemp2 = FromToD(WATER, AIR) / DTotal(AIR) jTemp3 = 1 - FromToD(SOIL, AIR) * FromToD(AIR, SOIL) / (DTotal(AIR) * DTotal(SOIL)) jTemp4 = FromToD(AIR, WATER) + FromToD(SOIL, WATER) * FromToD(AIR, SOIL) / DTotal(SOIL)

FugacityL3(WATER) = ((EmisL3_mol(WATER) + jTemp1 * jTemp4 / jTemp3 _ + EmisL3_mol(SOIL) * FromToD(SOIL, WATER) / DTotal(SOIL) _ + EmisL3_mol(SED) * FromToD(SED, WATER) / DTotal(SED)) _ / (DTotal(WATER) - jTemp2 * jTemp4 / jTemp3 - FromToD(WATER, SED) _ * FromToD(SED, WATER) / DTotal(SED))) FugacityL3(AIR) = (jTemp1 + FugacityL3(WATER) * jTemp2) / jTemp3 FugacityL3(SOIL) = (EmisL3_mol(SOIL) + FugacityL3(AIR) * FromToD(AIR, SOIL)) / DTotal(SOIL) FugacityL3(SED) = (EmisL3_mol(SED) + FugacityL3(WATER) * FromToD(WATER, SED)) / DTotal(SED)

' Calculate intermedia transport rates (mol/h) as the product of intermedia D values' (mol/Pa.h) and fugacity (Pa), and convert to kg/h TransRate_mol(AIR, WATER) = FromToD(AIR, WATER) * FugacityL3(AIR) ' air to water TransRate_kg(AIR, WATER) = TransRate_mol(AIR, WATER) * MolMass / 1000 TransRate_mol(AIR, SOIL) = FromToD(AIR, SOIL) * FugacityL3(AIR) ' air to soil TransRate_kg(AIR, SOIL) = TransRate_mol(AIR, SOIL) * MolMass / 1000 TransRate_mol(WATER, AIR) = FromToD(WATER, AIR) * FugacityL3(WATER) ' water to air TransRate_kg(WATER, AIR) = TransRate_mol(WATER, AIR) * MolMass / 1000

TransRate_mol(WATER, SED) = FromToD(WATER, SED) * FugacityL3(WATER) ' water to sediment TransRate_kg(WATER, SED) = TransRate_mol(WATER, SED) * MolMass / 1000 TransRate_mol(SOIL, AIR) = FromToD(SOIL, AIR) * FugacityL3(SOIL) ' soil to air TransRate_kg(SOIL, AIR) = TransRate_mol(SOIL, AIR) * MolMass / 1000 TransRate_mol(SOIL, WATER) = FromToD(SOIL, WATER) * FugacityL3(SOIL) ' soil to water TransRate_kg(SOIL, WATER) = TransRate_mol(SOIL, WATER) * MolMass / 1000 TransRate_mol(SED, WATER) = FromToD(SED, WATER) * FugacityL3(SED) ' sediment to water TransRate_kg(SED, WATER) = TransRate_mol(SED, WATER) * MolMass / 1000

End Sub ' CalcDandF

' ****************************************************************************************** Private Sub CalcConcAmts()' Calculates the concentrations and amounts in Level 3.' ****************************************************************************************** ' Initialize AmountTotalL3_mol = 0 AmountTotalL3_kg = 0 For Medium = 0 To 3 AmountL3_mol(Medium) = 0 Next Medium For Medium = 0 To 3 For SubMedium = 0 To 3 ConcL3Sub_mol(Medium, SubMedium) = FugacityL3(Medium) * Zsub(Medium, SubMedium) ConcL3_mol(Medium) = FugacityL3(Medium) * ZbulkL3(Medium) ConcL3Sub_g(Medium, SubMedium) = ConcL3Sub_mol(Medium, SubMedium) * MolMass ConcL3Sub_kg(Medium, SubMedium) = ConcL3Sub_g(Medium, SubMedium) / 1000 AmountL3Sub_mol(Medium, SubMedium) = ConcL3Sub_mol(Medium, SubMedium) * VolumeL3Sub(Medium, SubMedium) AmountL3_mol(Medium) = AmountL3_mol(Medium) + AmountL3Sub_mol(Medium, SubMedium) AmountL3Sub_g(Medium, SubMedium) = AmountL3Sub_mol(Medium, SubMedium) * MolMass AmountL3Sub_kg(Medium, SubMedium) = AmountL3Sub_g(Medium, SubMedium) / 1000 Next SubMedium

' Conversions to g and kg ConcL3_g(Medium) = ConcL3_mol(Medium) * MolMass ConcL3_kg(Medium) = ConcL3_g(Medium) / 1000 AmountL3_kg(Medium) = AmountL3_mol(Medium) * MolMass / 1000

' Total chemical in the system AmountTotalL3_mol = AmountTotalL3_mol + AmountL3_mol(Medium) AmountTotalL3_kg = AmountTotalL3_kg + AmountL3_kg(Medium) Next Medium

' Calculate percent of chemical in each SubMedium and Medium For Medium = 0 To 3 For SubMedium = 0 To 3 AmountL3Sub_percent(Medium, SubMedium) = 100 * _ AmountL3Sub_mol(Medium, SubMedium) / AmountTotalL3_mol Next SubMedium AmountL3_percent(Medium) = 100 * AmountL3_mol(Medium) / AmountTotalL3_mol Next Medium

' Calculate mass of chemical per unit mass of solid ' ug of chemical/g of aerosol ConcL3Aerosol = (AmountL3Sub_g(AIR, SOLID) * 1000000#) / (VolumeL3Sub(AIR, SOLID) * _ DensitySub_kg(AIR, SOLID) * 1000) ' ug of chemical/g of suspended sediment ConcL3SusSed = (AmountL3Sub_g(WATER, SOLID) * 1000000#) / (VolumeL3Sub(AIR, SOLID) * _ DensitySub_kg(WATER, SOLID) * 1000) ' ug of chemical/g of soil solids ConcL3SoilSolids = (AmountL3Sub_g(SOIL, SOLID) * 1000000#) / (VolumeL3Sub(SOIL, SOLID) * _ DensitySub_kg(SOIL, SOLID) * 1000) ' ug of chemical/g of sediment solids ConcL3SedSolids = (AmountL3Sub_g(SED, SOLID) * 1000000#) / (VolumeL3Sub(SED, SOLID) * _ DensitySub_kg(SED, SOLID) * 1000) End Sub ' CalcConcAmts

' ****************************************************************************************** Private Sub CalcLosses()' This procedure calculates advect and reaction losses for bulk and subcompartments.' ****************************************************************************************** ' Initialize Loss totals LossReactTotalL3_mol = 0: LossAdvectTotalL3_mol = 0 ' Calculate losses for compartments For Medium = 0 To 3 LossReactL3_mol(Medium) = FugacityL3(Medium) * DReactL3(Medium) LossReactL3_kg(Medium) = LossReactL3_mol(Medium) * MolMass / 1000 LossAdvectL3_mol(Medium) = FugacityL3(Medium) * DAdvectL3(Medium) LossAdvectL3_kg(Medium) = LossAdvectL3_mol(Medium) * MolMass / 1000 ' Summations LossReactTotalL3_mol = LossReactTotalL3_mol + LossReactL3_mol(Medium) LossAdvectTotalL3_mol = LossAdvectTotalL3_mol + LossAdvectL3_mol(Medium) Next Medium ' Calculate total loss from environment LossReactTotalL3_kg = LossReactTotalL3_mol * MolMass / 1000 LossAdvectTotalL3_kg = LossReactTotalL3_kg * MolMass / 1000 LossTotalL3_mol = LossReactTotalL3_mol + LossAdvectTotalL3_mol LossTotalL3_kg = LossTotalL3_mol * MolMass / 1000 ' Calculate advection and reaction loss percentages for bulk and subcompartments If LossTotalL3_mol = 0 Then For Medium = 0 To 3 LossReactL3_percent(Medium) = 0 LossAdvectL3_percent(Medium) = 0 Next Medium Else LossReactTotalL3_percent = 0: LossAdvectTotalL3_percent = 0 For Medium = 0 To 3 LossReactL3_percent(Medium) = 100 * LossReactL3_mol(Medium) / LossTotalL3_mol LossAdvectL3_percent(Medium) = 100 * LossAdvectL3_mol(Medium) / LossTotalL3_mol LossReactTotalL3_percent = LossReactTotalL3_percent + LossReactL3_percent(Medium) LossAdvectTotalL3_percent = LossAdvectTotalL3_percent + LossAdvectL3_percent(Medium) Next Medium End If

End Sub ' CalcLosses

' ****************************************************************************************** Private Sub CalcResTimes()' This procedure calculates chemical residence times in the enivironment due to reactions' and advection as well as the overall residence time.' ****************************************************************************************** If LossReactTotalL3_mol < SMALL Then ResTimeReactL3_h = LARGE Else ResTimeReactL3_h = AmountTotalL3_mol / LossReactTotalL3_mol End If If LossAdvectTotalL3_mol < SMALL Then ResTimeAdvectL3_h = LARGE Else ResTimeAdvectL3_h = AmountTotalL3_mol / LossAdvectTotalL3_mol End If ResTimeOverallL3_h = 1 / ((1 / ResTimeReactL3_h) + (1 / ResTimeAdvectL3_h)) ResTimeAdvectL3_d = ResTimeAdvectL3_h / HoursInDay ResTimeReactL3_d = ResTimeReactL3_h / HoursInDay ResTimeOverallL3_d = ResTimeOverallL3_h / HoursInDay End Sub ' CalcResTimes

' ******************************************************************************************Private Sub CalcDisplayConc()' This procedure calculates the concentrations displayed in the diagrams.' ******************************************************************************************

ConcL1Display(AIR) = ConcL1_g(AIR) * 1000000000# ' ng/m3ConcL1Display(WATER) = ConcL1_g(WATER) * 1000000000 / 1000 ' ng/LConcL1Display(SOIL) = ConcL1ug_g(SOIL) * 1000 ' ng/g solidsConcL1Display(SED) = ConcL1ug_g(SED) * 1000 ' ng/g solids"

ConcL2Display(AIR) = ConcL2_g(AIR) * 1000000000# ' ng/m3ConcL2Display(WATER) = ConcL2_g(WATER) * 1000000000 / 1000 ' ng/LConcL2Display(SOIL) = ConcL2ug_g(SOIL) * 1000 ' ng/g solidsConcL2Display(SED) = ConcL2ug_g(SED) * 1000 ' ng/g solids

ConcL3Display(AIR) = ConcL3_g(AIR) * 1000000000# ' ng/m3ConcL3Display(WATER) = ConcL3_g(WATER) * 1000000# ' ng/LConcL3Display(SOIL) = ConcL3SoilSolids * 1000 ' ng/g solidsConcL3Display(SED) = ConcL3SedSolids * 1000 ' ng/g solids

End Sub