public void Run(Clock clock, IImpactDiarrhoeaState state, IDimensions dimensions) { var s = state; var t = clock.Current; foreach (var r in dimensions.GetValues <Region>()) { var ypc = 1000.0 * s.income[t, r] / s.population[t, r]; var ypc90 = 1000.0 * s.gdp90[r] / s.pop90[r]; // 0.49 is the increase in global temperature from pre-industrial to 1990 var absoluteRegionalTempPreIndustrial = s.temp90[r] - 0.49 * s.bregtmp[r]; if (absoluteRegionalTempPreIndustrial > 0.0) { s.diadead[t, r] = s.diamort[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.diamortel) * (Math.Pow((absoluteRegionalTempPreIndustrial + s.regtmp[t, r]) / absoluteRegionalTempPreIndustrial, s.diamortnl) - 1.0); s.diasick[t, r] = s.diayld[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.diayldel) * (Math.Pow((absoluteRegionalTempPreIndustrial + s.regtmp[t, r]) / absoluteRegionalTempPreIndustrial, s.diayldnl) - 1.0); } else { s.diadead[t, r] = 0.0; s.diasick[t, r] = 0.0; } } }
public void Run(Clock clock, IImpactWaterResourcesState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (t > Timestep.FromYear(2000)) { s.watech[t] = Math.Pow(1.0 - s.watechrate, t.Value - Timestep.FromYear(2000).Value); } else { s.watech[t] = 1.0; } foreach (var r in dimensions.GetValues <Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; var water = s.wrbm[r] * s.gdp90[r] * s.watech[t] * Math.Pow(ypc / ypc90, s.wrel) * Math.Pow(s.population[t, r] / s.pop90[r], s.wrpl) * Math.Pow(s.temp[t, r], s.wrnl); if (water > 0.1 * s.income[t, r]) { s.water[t, r] = 0.1 * s.income[t, r]; } else { s.water[t, r] = water; } } }
public void Run(Clock clock, IRegionalHotellingTaxationState state, IDimensions dimensions) { var t = clock.Current; var s = state; foreach (var r in dimensions.GetValues <Region>()) { var perCapitaConsumptionNow = s.consumption[t, r] / s.population[t, r]; var perCapitaConsumptionPrevious = s.consumption[t - 1, r] / s.population[t - 1, r]; var perCapitaGrowthRate = perCapitaConsumptionNow / perCapitaConsumptionPrevious - 1.0; var discountrate = perCapitaGrowthRate * s.elasticityofmarginalutility + s.prtp; if (t < s.baseyear) { s.currtax[t, r] = 0.0; } else if (t == s.baseyear) { s.currtax[t, r] = s.basetax[r]; } else { s.currtax[t, r] = s.currtax[t - 1, r] * (1.0 + discountrate); } s.currtaxn2o[t, r] = s.currtax[t, r]; s.currtaxch4[t, r] = s.currtax[t, r]; } }
public void Run(Clock clock, IImpactDeathMorbidityState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues <Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; s.dead[t, r] = s.dengue[t, r] + s.schisto[t, r] + s.malaria[t, r] + s.cardheat[t, r] + s.cardcold[t, r] + s.resp[t, r] + s.diadead[t, r] + s.hurrdead[t, r] + s.extratropicalstormsdead[t, r]; if (s.dead[t, r] > s.population[t, r] * 1000000.0) { s.dead[t, r] = s.population[t, r] / 1000000.0; } s.yll[t, r] = s.d2ld[r] * s.dengue[t, r] + s.d2ls[r] * s.schisto[t, r] + s.d2lm[r] * s.malaria[t, r] + s.d2lc[r] * s.cardheat[t, r] + s.d2lc[r] * s.cardcold[t, r] + s.d2lr[r] * s.resp[t, r]; s.yld[t, r] = s.d2dd[r] * s.dengue[t, r] + s.d2ds[r] * s.schisto[t, r] + s.d2dm[r] * s.malaria[t, r] + s.d2dc[r] * s.cardheat[t, r] + s.d2dc[r] * s.cardcold[t, r] + s.d2dr[r] * s.resp[t, r] + s.diasick[t, r]; s.vsl[t, r] = s.vslbm * Math.Pow(ypc / s.vslypc0, s.vslel); s.deadcost[t, r] = s.vsl[t, r] * s.dead[t, r] / 1000000000.0; // deadcost:= vyll*ypc*yll/1000000000; s.vmorb[t, r] = s.vmorbbm * Math.Pow(ypc / s.vmorbypc0, s.vmorbel); s.morbcost[t, r] = s.vmorb[t, r] * s.yld[t, r] / 1000000000.0; } } }
public void Run(Clock clock, IImpactBioDiversityState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { s.biodiv[t] = s.nospecbase / s.nospecies[t]; foreach (var r in dimensions.GetValues <Region>()) { double ypc = 1000.0 * s.income[t, r] / s.population[t, r]; var dt = Math.Abs(s.temp[t, r] - s.temp[t - 1, r]); var valadj = s.valbase / s.valinc[r] / (1 + s.valbase / s.valinc[r]); s.species[t, r] = s.spbm / s.valbase * ypc / s.valinc[r] / (1.0 + ypc / s.valinc[r]) / valadj * ypc * s.population[t, r] / 1000.0 * dt / s.dbsta / (1.0 + dt / s.dbsta) * (1.0 - s.bioshare + s.bioshare * s.biodiv[t]); } } }
public void Run(Clock clock, IImpactForestsState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues <Region>()) { double ypc = 1000.0 * s.income[t, r] / s.population[t, r]; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; // TODO -oDavid Anthoff: RT uses -lP.forel for ppp case s.forests[t, r] = s.forbm[r] * s.income[t, r] * Math.Pow(ypc / ypc90, s.forel) * (0.5 * Math.Pow(s.temp[t, r], s.fornl) + 0.5 * Math.Log(s.acco2[t - 1] / s.co2pre) * s.forco2); if (s.forests[t, r] > 0.1 * s.income[t, r]) { s.forests[t, r] = 0.1 * s.income[t, r]; } } } }
public void Run(Clock clock, IPopulationState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { double globalpopulation = 0.0; foreach (var r in dimensions.GetValues <Region>()) { s.population[t, r] = s.pop0[r]; s.populationin1[t, r] = s.population[t, r] * 1000000.0; globalpopulation = globalpopulation + s.populationin1[t, r]; } s.globalpopulation[t] = globalpopulation; } else { var globalPopulation = 0.0; // Calculate population foreach (var r in dimensions.GetValues <Region>()) { s.population[t, r] = (1.0 + 0.01 * s.pgrowth[t - 1, r]) * (s.population[t - 1, r] + ( (t >= Timestep.FromSimulationYear(40)) && !s.runwithoutpopulationperturbation ? (s.enter[t - 1, r] / 1000000.0) - (s.leave[t - 1, r] / 1000000.0) - (s.dead[t - 1, r] >= 0 ? s.dead[t - 1, r] / 1000000.0 : 0) : 0 ) ); if (s.population[t, r] < 0) { s.population[t, r] = 0.000001; } //raise new Exception; s.populationin1[t, r] = s.population[t, r] * 1000000.0; globalPopulation = globalPopulation + s.populationin1[t, r]; } s.globalpopulation[t] = globalPopulation; } }
public void Run(Clock clock, IClimateRegionalState state, IDimensions dimensions) { var s = state; var t = clock.Current; foreach (var r in dimensions.GetValues <Region>()) { s.regtmp[t, r] = s.inputtemp[t] * s.bregtmp[r] + s.scentemp[t, r]; } foreach (var r in dimensions.GetValues <Region>()) { s.temp[t, r] = s.regtmp[t, r] / s.bregtmp[r]; } foreach (var r in dimensions.GetValues <Region>()) { s.regstmp[t, r] = s.inputtemp[t] * s.bregstmp[r] + s.scentemp[t, r]; } }
public void Run(Clock clock, IGeographyState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues <Region>()) { s.area[t, r] = s.area0[r]; } } else { foreach (var r in dimensions.GetValues <Region>()) { s.area[t, r] = s.area[t - 1, r] - s.landloss[t - 1, r]; } } }
public void Run(Clock clock, IGeographyState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues<Region>()) { s.area[t, r] = s.area0[r]; } } else { foreach (var r in dimensions.GetValues<Region>()) { s.area[t, r] = s.area[t - 1, r] - s.landloss[t - 1, r]; } } }
public void Run(Clock clock, IClimateRegionalState state, IDimensions dimensions) { var s = state; var t = clock.Current; foreach (var r in dimensions.GetValues<Region>()) { s.regtmp[t, r] = s.inputtemp[t] * s.bregtmp[r] + s.scentemp[t, r]; } foreach (var r in dimensions.GetValues<Region>()) { s.temp[t, r] = s.regtmp[t, r] / s.bregtmp[r]; } foreach (var r in dimensions.GetValues<Region>()) { s.regstmp[t, r] = s.inputtemp[t] * s.bregstmp[r] + s.scentemp[t, r]; } }
public void Run(Clock clock, IImpactExtratropicalStormsState state, IDimensions dimensions) { var t = clock.Current; var s = state; foreach (var r in dimensions.GetValues <Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.extratropicalstormsdam[t, r] = s.extratropicalstormsbasedam[r] * s.income[t, r] * Math.Pow(ypc / ypc90, s.extratropicalstormsdamel) * (Math.Pow(1.0 + (s.extratropicalstormspar[r] * (s.acco2[t] / s.co2pre)), s.extratropicalstormsnl) - 1.0); s.extratropicalstormsdead[t, r] = 1000.0 * s.extratropicalstormsbasedead[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.extratropicalstormsdeadel) * (Math.Pow(1.0 + (s.extratropicalstormspar[r] * (s.acco2[t] / s.co2pre)), s.extratropicalstormsnl) - 1.0); } }
public void Run(Clock clock, IImpactTropicalStormsState state, IDimensions dimensions) { var t = clock.Current; var s = state; foreach (var r in dimensions.GetValues <Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; // This is hurrican damage s.hurrdam[t, r] = 0.001 * s.hurrbasedam[r] * s.income[t, r] * Math.Pow(ypc / ypc90, s.hurrdamel) * (Math.Pow(1.0 + s.hurrpar * s.regstmp[t, r], s.hurrnl) - 1.0); s.hurrdead[t, r] = 1000.0 * s.hurrbasedead[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.hurrdeadel) * (Math.Pow(1.0 + s.hurrpar * s.regstmp[t, r], s.hurrnl) - 1.0); } }
public void Run(Clock clock, IScenarioUncertaintyState state, IDimensions dimensions) { var s = state; var t = clock.Current; Double yearsFromUncertaintyStart = t.Value - s.timeofuncertaintystart.Value; var sdTimeFactor = (yearsFromUncertaintyStart / 50.0) / (1.0 + (yearsFromUncertaintyStart / 50.0)); foreach (var r in dimensions.GetValues <Region>()) { s.ypcgrowth[t, r] = s.scenypcgrowth[t, r] + (t >= s.timeofuncertaintystart ? s.ecgradd[r] * sdTimeFactor : 0.0); s.pgrowth[t, r] = s.scenpgrowth[t, r] + (t >= s.timeofuncertaintystart ? s.pgadd[r] * sdTimeFactor : 0.0); s.aeei[t, r] = s.scenaeei[t, r] + (t >= s.timeofuncertaintystart ? s.aeeiadd[r] * sdTimeFactor : 0.0); s.acei[t, r] = s.scenacei[t, r] + (t >= s.timeofuncertaintystart ? s.aceiadd[r] * sdTimeFactor : 0.0); s.forestemm[t, r] = s.scenforestemm[t, r] + (t >= s.timeofuncertaintystart ? s.foremadd[r] * sdTimeFactor : 0.0); } }
public const double DBsT = 0.04; // base case yearly warming public void Run(Clock clock, IImpactAgricultureState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues <Region>()) { s.agrate[t, r] = s.agrbm[r] * Math.Pow(0.005 / DBsT, s.agnl) * s.agtime[r]; } } else { foreach (var r in dimensions.GetValues <Region>()) { Double ypc = s.income[t, r] / s.population[t, r] * 1000.0; Double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.agrish[t, r] = s.agrish0[r] * Math.Pow(ypc / ypc90, -s.agel); } foreach (var r in dimensions.GetValues <Region>()) { var dtemp = Math.Abs(s.temp[t, r] - s.temp[t - 1, r]); if (double.IsNaN(Math.Pow(dtemp / 0.04, s.agnl))) { s.agrate[t, r] = 0.0; } else { s.agrate[t, r] = s.agrbm[r] * Math.Pow(dtemp / 0.04, s.agnl) + (1.0 - 1.0 / s.agtime[r]) * s.agrate[t - 1, r]; } } foreach (var r in dimensions.GetValues <Region>()) { s.aglevel[t, r] = s.aglparl[r] * s.temp[t, r] + s.aglparq[r] * Math.Pow(s.temp[t, r], 2.0); } foreach (var r in dimensions.GetValues <Region>()) { s.agco2[t, r] = s.agcbm[r] / Math.Log(2.0) * Math.Log(s.acco2[t - 1] / s.co2pre); } foreach (var r in dimensions.GetValues <Region>()) { s.agcost[t, r] = Math.Min(1.0, s.agrate[t, r] + s.aglevel[t, r] + s.agco2[t, r]) * s.agrish[t, r] * s.income[t, r]; } } }
public void Run(Clock clock, IImpactCoolingState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues <Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.cooling[t, r] = s.cebm[r] * s.cumaeei[t, r] * s.gdp90[r] * Math.Pow(s.temp[t, r] / 1.0, s.cenl) * Math.Pow(ypc / ypc90, s.ceel) * s.population[t, r] / s.pop90[r]; } } }
public void Run(Clock clock, IImpactVectorBorneDiseasesState state, IDimensions dimensions) { var s = state; var t = clock.Current; foreach (var r in dimensions.GetValues <Region>()) { double ypc = 1000.0 * s.income[t, r] / s.population[t, r]; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.dengue[t, r] = s.dfbs[r] * s.population[t, r] * s.dfch[r] * Math.Pow(s.temp[t, r], s.dfnl) * Math.Pow(ypc / ypc90, s.vbel); s.schisto[t, r] = s.smbs[r] * s.population[t, r] * s.smch[r] * Math.Pow(s.temp[t, r], s.smnl) * Math.Pow(ypc / ypc90, s.vbel); if (s.schisto[t, r] < -s.smbs[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.vbel)) { s.schisto[t, r] = -s.smbs[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.vbel); } s.malaria[t, r] = s.malbs[r] * s.population[t, r] * s.malch[r] * Math.Pow(s.temp[t, r], s.malnl) * Math.Pow(ypc / ypc90, s.vbel); } }
public void Run(Clock clock, IImpactDiarrhoeaState state, IDimensions dimensions) { var s = state; var t = clock.Current; foreach (var r in dimensions.GetValues<Region>()) { var ypc = 1000.0 * s.income[t, r] / s.population[t, r]; var ypc90 = 1000.0 * s.gdp90[r] / s.pop90[r]; // 0.49 is the increase in global temperature from pre-industrial to 1990 var absoluteRegionalTempPreIndustrial = s.temp90[r] - 0.49 * s.bregtmp[r]; if (absoluteRegionalTempPreIndustrial > 0.0) { s.diadead[t, r] = s.diamort[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.diamortel) * (Math.Pow((absoluteRegionalTempPreIndustrial + s.regtmp[t, r]) / absoluteRegionalTempPreIndustrial, s.diamortnl) - 1.0); s.diasick[t, r] = s.diayld[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.diayldel) * (Math.Pow((absoluteRegionalTempPreIndustrial + s.regtmp[t, r]) / absoluteRegionalTempPreIndustrial, s.diayldnl) - 1.0); } else { s.diadead[t, r] = 0.0; s.diasick[t, r] = 0.0; } } }
public void Run(Clock clock, ISocioEconomicState state, IDimensions dimensions) { var s = state; var t = clock.Current; double savingsrate = 0.2; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues<Region>()) { s.income[t, r] = s.gdp0[r]; s.population[t, r] = s.pop0[r]; s.populationin1[t, r] = s.population[t, r] * 1000000.0; s.ypc[t, r] = s.income[t, r] / s.population[t, r] * 1000.0; s.consumption[t, r] = s.income[t, r] * 1000000000.0 * (1.0 - savingsrate); } s.globalpopulation[t] = dimensions.GetValues<Region>().Select(r => s.populationin1[t, r]).Sum(); s.globalconsumption[t] = dimensions.GetValues<Region>().Select(r => s.consumption[t, r]).Sum(); foreach (var r in dimensions.GetValues<Region>()) { s.ypc90[r] = s.gdp90[r] / s.pop90[r] * 1000; } } else { var totalPopulation = 0.0; // Calculate population foreach (var r in dimensions.GetValues<Region>()) { s.population[t, r] = (1 + 0.01 * s.pgrowth[t - 1, r]) * (s.population[t - 1, r] + ( (t >= Timestep.FromSimulationYear(40)) && !s.runwithoutpopulationperturbation ? (s.enter[t - 1, r] / 1000000.0) - (s.leave[t - 1, r] / 1000000.0) - (s.dead[t - 1, r] >= 0 ? s.dead[t - 1, r] / 1000000.0 : 0) : 0 ) ); if (s.population[t, r] < 0) s.population[t, r] = 0.000001; //raise new Exception; s.populationin1[t, r] = s.population[t, r] * 1000000.0; totalPopulation = totalPopulation + s.populationin1[t, r]; } s.globalpopulation[t] = totalPopulation; // Calculate income growth rate foreach (var r in dimensions.GetValues<Region>()) { s.ygrowth[t, r] = (1 + 0.01 * s.pgrowth[t - 1, r]) * (1 + 0.01 * s.ypcgrowth[t - 1, r]) - 1; } // Calculate income foreach (var r in dimensions.GetValues<Region>()) { double oldincome = s.income[t - 1, r] - ((t >= Timestep.FromSimulationYear(40)) && !s.runwithoutdamage ? s.consleak * s.eloss[t - 1, r] / 10.0 : 0); s.income[t, r] = (1 + s.ygrowth[t, r]) * oldincome - s.mitigationcost[t - 1, r]; } // Check for unrealistic values foreach (var r in dimensions.GetValues<Region>()) { if (s.income[t, r] < 0.01 * s.population[t, r]) s.income[t, r] = 0.1 * s.population[t, r]; } foreach (var r in dimensions.GetValues<Region>()) { s.ypc[t, r] = s.income[t, r] / s.population[t, r] * 1000.0; } var totalConsumption = 0.0; foreach (var r in dimensions.GetValues<Region>()) { s.consumption[t, r] = Math.Max( s.income[t, r] * 1000000000.0 * (1.0 - savingsrate) - (s.runwithoutdamage ? 0.0 : (s.eloss[t - 1, r] + s.sloss[t - 1, r]) * 1000000000.0), 0.0); totalConsumption = totalConsumption + s.consumption[t, r]; } s.globalconsumption[t] = totalConsumption; foreach (var r in dimensions.GetValues<Region>()) { s.plus[t, r] = s.plus90[r] * Math.Pow(s.ypc[t, r] / s.ypc90[r], s.plusel); if (s.plus[t, r] > 1) s.plus[t, r] = 1.0; } foreach (var r in dimensions.GetValues<Region>()) { s.popdens[t, r] = s.population[t, r] / s.area[t, r] * 1000000.0; } foreach (var r in dimensions.GetValues<Region>()) { s.urbpop[t, r] = (0.031 * Math.Sqrt(s.ypc[t, r]) - 0.011 * Math.Sqrt(s.popdens[t, r])) / (1.0 + 0.031 * Math.Sqrt(s.ypc[t, r]) - 0.011 * Math.Sqrt(s.popdens[t, r])) / (1 + s.urbcorr[r] / (1 + 0.001 * Math.Pow(Convert.ToDouble(t.Value) - 40.0, 2))); // (* DA: urbcorr needs to be changed to a function if this is to be made uncertain *) } s.globalincome[t] = dimensions.GetValues<Region>().Select(r => s.income[t, r]).Sum(); s.globalypc[t] = dimensions.GetValues<Region>().Select(r => s.income[t, r] * 1000000000.0).Sum() / dimensions.GetValues<Region>().Select(r => s.populationin1[t, r]).Sum(); } }
public void Run(Clock clock, IImpactCardiovascularRespiratoryState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues <Region>()) { s.basecardvasc[t, r] = s.cardvasc90[r] + s.cvlin * (s.plus[t, r] - s.plus90[r]); if (s.basecardvasc[t, r] > 1.0) { s.basecardvasc[t, r] = 1.0; } s.baseresp[t, r] = s.resp90[r] + s.rlin * (s.plus[t, r] - s.plus90[r]); if (s.baseresp[t, r] > 1.0) { s.baseresp[t, r] = 1.0; } s.cardheat[t, r] = (s.chplbm[r] * s.plus[t, r] + s.chmlbm[r] * (1.0 - s.plus[t, r])) * s.temp[t, r] + (s.chpqbm[r] * s.plus[t, r] + s.chmqbm[r] * (1.0 - s.plus[t, r])) * Math.Pow(s.temp[t, r], 2); s.cardheat[t, r] = s.cardheat[t, r] * s.urbpop[t, r] * s.population[t, r] * 10; if (s.cardheat[t, r] > 1000.0 * s.maxcardvasc * s.basecardvasc[t, r] * s.urbpop[t, r] * s.population[t, r]) { s.cardheat[t, r] = 1000 * s.maxcardvasc * s.basecardvasc[t, r] * s.urbpop[t, r] * s.population[t, r]; } if (s.cardheat[t, r] < 0.0) { s.cardheat[t, r] = 0; } s.resp[t, r] = s.rlbm[r] * s.temp[t, r] + s.rqbm[r] * Math.Pow(s.temp[t, r], 2); s.resp[t, r] = s.resp[t, r] * s.urbpop[t, r] * s.population[t, r] * 10; if (s.resp[t, r] > 1000 * s.maxcardvasc * s.baseresp[t, r] * s.urbpop[t, r] * s.population[t, r]) { s.resp[t, r] = 1000 * s.maxcardvasc * s.baseresp[t, r] * s.urbpop[t, r] * s.population[t, r]; } if (s.resp[t, r] < 0) { s.resp[t, r] = 0; } s.cardcold[t, r] = (s.ccplbm[r] * s.plus[t, r] + s.ccmlbm[r] * (1.0 - s.plus[t, r])) * s.temp[t, r] + (s.ccpqbm[r] * s.plus[t, r] + s.ccmqbm[r] * (1.0 - s.plus[t, r])) * Math.Pow(s.temp[t, r], 2); s.cardcold[t, r] = s.cardcold[t, r] * s.population[t, r] * 10; if (s.cardcold[t, r] < -1000 * s.maxcardvasc * s.basecardvasc[t, r] * s.population[t, r]) { s.cardcold[t, r] = -1000 * s.maxcardvasc * s.basecardvasc[t, r] * s.population[t, r]; } if (s.cardcold[t, r] > 0) { s.cardcold[t, r] = 0; } } } }
public void Run(Clock clock, IImpactExtratropicalStormsState state, IDimensions dimensions) { var t = clock.Current; var s = state; foreach (var r in dimensions.GetValues<Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.extratropicalstormsdam[t, r] = s.extratropicalstormsbasedam[r] * s.income[t, r] * Math.Pow(ypc / ypc90, s.extratropicalstormsdamel) * (Math.Pow(1.0 + (s.extratropicalstormspar[r] * (s.acco2[t] / s.co2pre)), s.extratropicalstormsnl) - 1.0); s.extratropicalstormsdead[t, r] = 1000.0 * s.extratropicalstormsbasedead[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.extratropicalstormsdeadel) * (Math.Pow(1.0 + (s.extratropicalstormspar[r] * (s.acco2[t] / s.co2pre)), s.extratropicalstormsnl) - 1.0); } }
public void Run(Clock clock, IScenarioUncertaintyState state, IDimensions dimensions) { var s = state; var t = clock.Current; Double yearsFromUncertaintyStart = t.Value - s.timeofuncertaintystart.Value; var sdTimeFactor = (yearsFromUncertaintyStart / 50.0) / (1.0 + (yearsFromUncertaintyStart / 50.0)); foreach (var r in dimensions.GetValues<Region>()) { s.ypcgrowth[t, r] = s.scenypcgrowth[t, r] + (t >= s.timeofuncertaintystart ? s.ecgradd[r] * sdTimeFactor : 0.0); s.pgrowth[t, r] = s.scenpgrowth[t, r] + (t >= s.timeofuncertaintystart ? s.pgadd[r] * sdTimeFactor : 0.0); s.aeei[t, r] = s.scenaeei[t, r] + (t >= s.timeofuncertaintystart ? s.aeeiadd[r] * sdTimeFactor : 0.0); s.acei[t, r] = s.scenacei[t, r] + (t >= s.timeofuncertaintystart ? s.aceiadd[r] * sdTimeFactor : 0.0); s.forestemm[t, r] = s.scenforestemm[t, r] + (t >= s.timeofuncertaintystart ? s.foremadd[r] * sdTimeFactor : 0.0); } }
public void Run(Clock clock, IImpactForestsState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues<Region>()) { double ypc = 1000.0 * s.income[t, r] / s.population[t, r]; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; // TODO -oDavid Anthoff: RT uses -lP.forel for ppp case s.forests[t, r] = s.forbm[r] * s.income[t, r] * Math.Pow(ypc / ypc90, s.forel) * (0.5 * Math.Pow(s.temp[t, r], s.fornl) + 0.5 * Math.Log(s.acco2[t - 1] / s.co2pre) * s.forco2); if (s.forests[t, r] > 0.1 * s.income[t, r]) s.forests[t, r] = 0.1 * s.income[t, r]; } } }
public void Run(Clock clock, IUtilitarianWelfareState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { s.cummulativewelfare[t] = 0; } else { if (t >= s.starttimestep) { var w = s.cummulativewelfare[t - 1]; var U = Funcifier.Funcify( (double consumption) => { if (s.elasticityofmarginalutility == 1.0) return s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Log(consumption); else return s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Pow(consumption, 1.0 - s.elasticityofmarginalutility) / (1.0 - s.elasticityofmarginalutility); } ); var DF = Funcifier.Funcify( (Timestep year) => { return Math.Pow(1.0 + s.prtp, -(year.Value - s.starttimestep.Value)); } ); foreach (var r in dimensions.GetValues<Region>()) { var perCapitaConsumption = s.consumption[t, r] / s.population[t, r]; // This is a lower bound if (perCapitaConsumption <= 0.0) perCapitaConsumption = 1.0; w = w + (s.welfareweight[t, r] * U(perCapitaConsumption) * s.population[t, r] * DF(t)); s.marginalwelfare[t, r] = DF(t) * s.welfareweight[t, r] * s.utilitycalibrationmultiplicative / Math.Pow(perCapitaConsumption, s.elasticityofmarginalutility); } s.cummulativewelfare[t] = w; if (t == s.stoptimestep) s.totalwelfare = s.cummulativewelfare[t]; } else s.cummulativewelfare[t] = 0; } }
public void Run(Clock clock, IRegionalHotellingTaxationState state, IDimensions dimensions) { var t = clock.Current; var s = state; foreach (var r in dimensions.GetValues<Region>()) { var perCapitaConsumptionNow = s.consumption[t, r] / s.population[t, r]; var perCapitaConsumptionPrevious = s.consumption[t - 1, r] / s.population[t - 1, r]; var perCapitaGrowthRate = perCapitaConsumptionNow / perCapitaConsumptionPrevious - 1.0; var discountrate = perCapitaGrowthRate * s.elasticityofmarginalutility + s.prtp; if (t < s.baseyear) s.currtax[t, r] = 0.0; else if (t == s.baseyear) s.currtax[t, r] = s.basetax[r]; else s.currtax[t, r] = s.currtax[t - 1, r] * (1.0 + discountrate); s.currtaxn2o[t, r] = s.currtax[t, r]; s.currtaxch4[t, r] = s.currtax[t, r]; } }
public void Run(Clock clock, IImpactSeaLevelRiseState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r1 in dimensions.GetValues<Region>()) { foreach (var r2 in dimensions.GetValues<Region>()) { double immsumm = 0; foreach (var i in dimensions.GetValues<Region>()) { immsumm += s.migrate[i, r1]; } s.imigrate[r1, r2] = s.migrate[r2, r1] / immsumm; } var t0 = clock.StartTime; s.landloss[t0, r1] = 0.0; s.cumlandloss[t0, r1] = 0.0; s.cumwetlandloss[t0, r1] = 0.0; s.wetlandgrowth[t0, r1] = 0.0; } } else { // slr in m/year double ds = s.sea[t] - s.sea[t - 1]; foreach (var r in dimensions.GetValues<Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypcprev = s.income[t - 1, r] / s.population[t - 1, r] * 1000.0; double ypcgrowth = ypc / ypcprev - 1.0; if (t == Timestep.FromYear(1951)) ypcgrowth = 0; // Needs to be in $bn per km^2 // Income is in billion, area is in km^2 double incomedens = s.income[t, r] / s.area[t, r]; double incomedensprev = s.income[t - 1, r] / s.area[t - 1, r]; double incomedensgrowth = incomedens / incomedensprev - 1.0; // In population/km^2 // population is in million, area is in km^2 double popdens = s.population[t, r] / s.area[t, r] * 1000000.0; double popdensprev = s.population[t - 1, r] / s.area[t - 1, r] * 1000000.0; double popdensgrowth = popdens / popdensprev - 1.0; // Unit of dryval is $bn/km^2 s.dryval[t, r] = s.dvbm * Math.Pow(incomedens / s.incdens, s.dvydl); // Unit of wetval is $bn/km^2 s.wetval[t, r] = s.wvbm * Math.Pow(ypc / s.slrwvypc0, s.wvel) * Math.Pow(popdens / s.slrwvpopdens0, s.wvpdl) * Math.Pow((s.wetland90[r] - s.cumwetlandloss[t - 1, r]) / s.wetland90[r], s.wvsl); double potCumLandloss = Math.Min(s.maxlandloss[r], s.cumlandloss[t - 1, r] + s.dlbm[r] * Math.Pow(s.sea[t], s.drylandlossparam[r])); double potLandloss = potCumLandloss - s.cumlandloss[t - 1, r]; // If sea levels fall, no protection is build if (ds < 0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // If the discount rate < -100% people will not build protection else if ((1.0 + s.slrprtp[r] + ypcgrowth) < 0.0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // Dryland value is worthless else if (((1.0 + s.dvydl * incomedensgrowth) < 0.0)) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // Is protecting the coast infinitly expensive? else if ((1.0 / (1.0 + s.slrprtp[r] + ypcgrowth)) >= 1) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // Is dryland infinitly valuable? else if (((1.0 + s.dvydl * incomedensgrowth) / (1.0 + s.slrprtp[r] + ypcgrowth)) >= 1.0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 1; } // Is wetland infinitly valuable? else if (((1.0 + s.wvel * ypcgrowth + s.wvpdl * popdensgrowth + s.wvsl * s.wetlandgrowth[t - 1, r]) / (1.0 + s.slrprtp[r] + ypcgrowth)) >= 1.0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } else { // NPV of protecting the whole coast // pc is in $bn/m s.npprotcost[t, r] = s.pc[r] * ds * (1.0 + s.slrprtp[r] + ypcgrowth) / (s.slrprtp[r] + ypcgrowth); // NPV of wetland if ((1.0 + s.wvel * ypcgrowth + s.wvpdl * popdensgrowth + s.wvsl * s.wetlandgrowth[t - 1, r]) < 0.0) s.npwetcost[t, r] = 0; else s.npwetcost[t, r] = s.wmbm[r] * ds * s.wetval[t, r] * (1.0 + s.slrprtp[r] + ypcgrowth) / (s.slrprtp[r] + ypcgrowth - s.wvel * ypcgrowth - s.wvpdl * popdensgrowth - s.wvsl * s.wetlandgrowth[t - 1, r]); // NPV of dryland if ((1.0 + s.dvydl * incomedensgrowth) < 0.0) s.npdrycost[t, r] = 0; else s.npdrycost[t, r] = potLandloss * s.dryval[t, r] * (1 + s.slrprtp[r] + ypcgrowth) / (s.slrprtp[r] + ypcgrowth - s.dvydl * incomedensgrowth); // Calculate protection level s.protlev[t, r] = Math.Max(0.0, 1.0 - 0.5 * (s.npprotcost[t, r] + s.npwetcost[t, r]) / s.npdrycost[t, r]); if (s.protlev[t, r] > 1) throw new Exception("protlevel >1 should not happen"); } // Calculate actual wetland loss and cost s.wetlandloss[t, r] = Math.Min( s.wlbm[r] * ds + s.protlev[t, r] * s.wmbm[r] * ds, s.wetmax[r] - s.cumwetlandloss[t - 1, r]); s.cumwetlandloss[t, r] = s.cumwetlandloss[t - 1, r] + s.wetlandloss[t, r]; // Calculate wetland growth s.wetlandgrowth[t, r] = (s.wetland90[r] - s.cumwetlandloss[t, r]) / (s.wetland90[r] - s.cumwetlandloss[t - 1, r]) - 1.0; s.wetcost[t, r] = s.wetval[t, r] * s.wetlandloss[t, r]; s.landloss[t, r] = (1.0 - s.protlev[t, r]) * potLandloss; s.cumlandloss[t, r] = s.cumlandloss[t - 1, r] + s.landloss[t, r]; s.drycost[t, r] = s.dryval[t, r] * s.landloss[t, r]; s.protcost[t, r] = s.protlev[t, r] * s.pc[r] * ds; if (s.landloss[t, r] < 0) s.leave[t, r] = 0; else s.leave[t, r] = s.coastpd[r] * popdens * s.landloss[t, r]; s.leavecost[t, r] = s.emcst * ypc * s.leave[t, r] / 1000000000; } foreach (var destination in dimensions.GetValues<Region>()) { double enter = 0.0; foreach (var source in dimensions.GetValues<Region>()) { enter += s.leave[t, source] * s.imigrate[source, destination]; } s.enter[t, destination] = enter; } foreach (var r in dimensions.GetValues<Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; s.entercost[t, r] = s.immcst * ypc * s.enter[t, r] / 1000000000; } } }
public void Run(Clock clock, IImpactSeaLevelRiseState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r1 in dimensions.GetValues <Region>()) { foreach (var r2 in dimensions.GetValues <Region>()) { double immsumm = 0; foreach (var i in dimensions.GetValues <Region>()) { immsumm += s.migrate[i, r1]; } s.imigrate[r1, r2] = s.migrate[r2, r1] / immsumm; } var t0 = clock.StartTime; s.landloss[t0, r1] = 0.0; s.cumlandloss[t0, r1] = 0.0; s.cumwetlandloss[t0, r1] = 0.0; s.wetlandgrowth[t0, r1] = 0.0; } } else { // slr in m/year double ds = s.sea[t] - s.sea[t - 1]; foreach (var r in dimensions.GetValues <Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypcprev = s.income[t - 1, r] / s.population[t - 1, r] * 1000.0; double ypcgrowth = ypc / ypcprev - 1.0; if (t == Timestep.FromYear(1951)) { ypcgrowth = 0; } // Needs to be in $bn per km^2 // Income is in billion, area is in km^2 double incomedens = s.income[t, r] / s.area[t, r]; double incomedensprev = s.income[t - 1, r] / s.area[t - 1, r]; double incomedensgrowth = incomedens / incomedensprev - 1.0; // In population/km^2 // population is in million, area is in km^2 double popdens = s.population[t, r] / s.area[t, r] * 1000000.0; double popdensprev = s.population[t - 1, r] / s.area[t - 1, r] * 1000000.0; double popdensgrowth = popdens / popdensprev - 1.0; // Unit of dryval is $bn/km^2 s.dryval[t, r] = s.dvbm * Math.Pow(incomedens / s.incdens, s.dvydl); // Unit of wetval is $bn/km^2 s.wetval[t, r] = s.wvbm * Math.Pow(ypc / s.slrwvypc0, s.wvel) * Math.Pow(popdens / s.slrwvpopdens0, s.wvpdl) * Math.Pow((s.wetland90[r] - s.cumwetlandloss[t - 1, r]) / s.wetland90[r], s.wvsl); double potCumLandloss = Math.Min(s.maxlandloss[r], s.dlbm[r] * Math.Pow(s.sea[t], s.drylandlossparam[r])); double potLandloss = potCumLandloss - s.cumlandloss[t - 1, r]; // If sea levels fall, no protection is build if (ds < 0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // If the discount rate < -100% people will not build protection else if ((1.0 + s.slrprtp[r] + ypcgrowth) < 0.0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // Dryland value is worthless else if (((1.0 + s.dvydl * incomedensgrowth) < 0.0)) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // Is protecting the coast infinitly expensive? else if ((1.0 / (1.0 + s.slrprtp[r] + ypcgrowth)) >= 1) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } // Is dryland infinitly valuable? else if (((1.0 + s.dvydl * incomedensgrowth) / (1.0 + s.slrprtp[r] + ypcgrowth)) >= 1.0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 1; } // Is wetland infinitly valuable? else if (((1.0 + s.wvel * ypcgrowth + s.wvpdl * popdensgrowth + s.wvsl * s.wetlandgrowth[t - 1, r]) / (1.0 + s.slrprtp[r] + ypcgrowth)) >= 1.0) { s.npprotcost[t, r] = 0; s.npwetcost[t, r] = 0; s.npdrycost[t, r] = 0; s.protlev[t, r] = 0; } else { // NPV of protecting the whole coast // pc is in $bn/m s.npprotcost[t, r] = s.pc[r] * ds * (1.0 + s.slrprtp[r] + ypcgrowth) / (s.slrprtp[r] + ypcgrowth); // NPV of wetland if ((1.0 + s.wvel * ypcgrowth + s.wvpdl * popdensgrowth + s.wvsl * s.wetlandgrowth[t - 1, r]) < 0.0) { s.npwetcost[t, r] = 0; } else { s.npwetcost[t, r] = s.wmbm[r] * ds * s.wetval[t, r] * (1.0 + s.slrprtp[r] + ypcgrowth) / (s.slrprtp[r] + ypcgrowth - s.wvel * ypcgrowth - s.wvpdl * popdensgrowth - s.wvsl * s.wetlandgrowth[t - 1, r]); } // NPV of dryland if ((1.0 + s.dvydl * incomedensgrowth) < 0.0) { s.npdrycost[t, r] = 0; } else { s.npdrycost[t, r] = potLandloss * s.dryval[t, r] * (1 + s.slrprtp[r] + ypcgrowth) / (s.slrprtp[r] + ypcgrowth - s.dvydl * incomedensgrowth); } // Calculate protection level s.protlev[t, r] = Math.Max(0.0, 1.0 - 0.5 * (s.npprotcost[t, r] + s.npwetcost[t, r]) / s.npdrycost[t, r]); if (s.protlev[t, r] > 1) { throw new Exception("protlevel >1 should not happen"); } } // Calculate actual wetland loss and cost s.wetlandloss[t, r] = Math.Min( s.wlbm[r] * ds + s.protlev[t, r] * s.wmbm[r] * ds, s.wetmax[r] - s.cumwetlandloss[t - 1, r]); s.cumwetlandloss[t, r] = s.cumwetlandloss[t - 1, r] + s.wetlandloss[t, r]; // Calculate wetland growth s.wetlandgrowth[t, r] = (s.wetland90[r] - s.cumwetlandloss[t, r]) / (s.wetland90[r] - s.cumwetlandloss[t - 1, r]) - 1.0; s.wetcost[t, r] = s.wetval[t, r] * s.wetlandloss[t, r]; s.landloss[t, r] = (1.0 - s.protlev[t, r]) * potLandloss; s.cumlandloss[t, r] = s.cumlandloss[t - 1, r] + s.landloss[t, r]; s.drycost[t, r] = s.dryval[t, r] * s.landloss[t, r]; s.protcost[t, r] = s.protlev[t, r] * s.pc[r] * ds; if (s.landloss[t, r] < 0) { s.leave[t, r] = 0; } else { s.leave[t, r] = s.coastpd[r] * popdens * s.landloss[t, r]; } s.leavecost[t, r] = s.emcst * ypc * s.leave[t, r] / 1000000000; } foreach (var destination in dimensions.GetValues <Region>()) { double enter = 0.0; foreach (var source in dimensions.GetValues <Region>()) { enter += s.leave[t, source] * s.imigrate[source, destination]; } s.enter[t, destination] = enter; } foreach (var r in dimensions.GetValues <Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; s.entercost[t, r] = s.immcst * ypc * s.enter[t, r] / 1000000000; } } }
public void Run(Clock clock, IImpactWaterResourcesState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (t > Timestep.FromYear(2000)) s.watech[t] = Math.Pow(1.0 - s.watechrate, t.Value - Timestep.FromYear(2000).Value); else s.watech[t] = 1.0; foreach (var r in dimensions.GetValues<Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; var water = s.wrbm[r] * s.gdp90[r] * s.watech[t] * Math.Pow(ypc / ypc90, s.wrel) * Math.Pow(s.population[t, r] / s.pop90[r], s.wrpl) * Math.Pow(s.temp[t, r], s.wrnl); if (water > 0.1 * s.income[t, r]) s.water[t, r] = 0.1 * s.income[t, r]; else s.water[t, r] = water; } }
public void Run(Clock clock, IRegionalWelfareState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues <Region>()) { s.cummulativewelfare[t, r] = 0; } } else { if (t >= s.starttimestep) { var U = Funcifier.Funcify( (double consumption) => { if (s.elasticityofmarginalutility == 1.0) { return(s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Log(consumption)); } else { return(s.utilitycalibrationadditive + s.utilitycalibrationmultiplicative * Math.Pow(consumption, 1.0 - s.elasticityofmarginalutility) / (1.0 - s.elasticityofmarginalutility)); } } ); var DF = Funcifier.Funcify( (Timestep year) => { return(Math.Pow(1.0 + s.prtp, -(year.Value - s.starttimestep.Value))); } ); foreach (var r in dimensions.GetValues <Region>()) { var w = s.cummulativewelfare[t - 1, r]; var perCapitaConsumption = s.consumption[t, r] / s.population[t, r]; // This is a lower bound if (perCapitaConsumption <= 0.0) { perCapitaConsumption = 1.0; } w = w + (U(perCapitaConsumption) * s.population[t, r] * DF(t)); s.marginalwelfare[t, r] = DF(t) * s.utilitycalibrationmultiplicative / Math.Pow(perCapitaConsumption, s.elasticityofmarginalutility); s.cummulativewelfare[t, r] = w; if (t == s.stoptimestep) { s.totalwelfare[r] = s.cummulativewelfare[t, r]; } } } else { foreach (var r in dimensions.GetValues <Region>()) { s.cummulativewelfare[t, r] = 0; } } } }
public void Run(Clock clock, ISocioEconomicState state, IDimensions dimensions) { var s = state; var t = clock.Current; double savingsrate = 0.2; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues <Region>()) { s.income[t, r] = s.gdp0[r]; s.ypc[t, r] = s.income[t, r] / s.population[t, r] * 1000.0; s.consumption[t, r] = s.income[t, r] * 1000000000.0 * (1.0 - savingsrate); } s.globalconsumption[t] = dimensions.GetValues <Region>().Select(r => s.consumption[t, r]).Sum(); foreach (var r in dimensions.GetValues <Region>()) { s.ypc90[r] = s.gdp90[r] / s.pop90[r] * 1000; } } else { // Calculate income growth rate foreach (var r in dimensions.GetValues <Region>()) { s.ygrowth[t, r] = (1 + 0.01 * s.pgrowth[t - 1, r]) * (1 + 0.01 * s.ypcgrowth[t - 1, r]) - 1; } // Calculate income foreach (var r in dimensions.GetValues <Region>()) { double oldincome = s.income[t - 1, r] - ((t >= Timestep.FromSimulationYear(40)) && !s.runwithoutdamage ? s.consleak * s.eloss[t - 1, r] / 10.0 : 0); s.income[t, r] = (1 + s.ygrowth[t, r]) * oldincome - s.mitigationcost[t - 1, r]; } // Check for unrealistic values foreach (var r in dimensions.GetValues <Region>()) { if (s.income[t, r] < 0.01 * s.population[t, r]) { s.income[t, r] = 0.1 * s.population[t, r]; } } foreach (var r in dimensions.GetValues <Region>()) { s.ypc[t, r] = s.income[t, r] / s.population[t, r] * 1000.0; } var totalConsumption = 0.0; foreach (var r in dimensions.GetValues <Region>()) { s.consumption[t, r] = Math.Max( s.income[t, r] * 1000000000.0 * (1.0 - savingsrate) - (s.runwithoutdamage ? 0.0 : (s.eloss[t - 1, r] + s.sloss[t - 1, r]) * 1000000000.0), 0.0); totalConsumption = totalConsumption + s.consumption[t, r]; } s.globalconsumption[t] = totalConsumption; foreach (var r in dimensions.GetValues <Region>()) { s.plus[t, r] = s.plus90[r] * Math.Pow(s.ypc[t, r] / s.ypc90[r], s.plusel); if (s.plus[t, r] > 1) { s.plus[t, r] = 1.0; } } foreach (var r in dimensions.GetValues <Region>()) { s.popdens[t, r] = s.population[t, r] / s.area[t, r] * 1000000.0; } foreach (var r in dimensions.GetValues <Region>()) { s.urbpop[t, r] = (0.031 * Math.Sqrt(s.ypc[t, r]) - 0.011 * Math.Sqrt(s.popdens[t, r])) / (1.0 + 0.031 * Math.Sqrt(s.ypc[t, r]) - 0.011 * Math.Sqrt(s.popdens[t, r])) / (1 + s.urbcorr[r] / (1 + 0.001 * Math.Pow(Convert.ToDouble(t.Value) - 40.0, 2))); // (* DA: urbcorr needs to be changed to a function if this is to be made uncertain *) } s.globalincome[t] = dimensions.GetValues <Region>().Select(r => s.income[t, r]).Sum(); s.globalypc[t] = dimensions.GetValues <Region>().Select(r => s.income[t, r] * 1000000000.0).Sum() / dimensions.GetValues <Region>().Select(r => s.populationin1[t, r]).Sum(); } }
public void Run(Clock clock, IImpactAggregationState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues<Region>()) { s.eloss[t, r] = 0.0; s.sloss[t, r] = 0.0; } } else { foreach (var r in dimensions.GetValues<Region>()) { s.eloss[t, r] = Math.Min( 0.0 - (s.switchoffwater ? 0.0 : s.water[t, r]) - (s.switchoffforests ? 0.0 : s.forests[t, r]) - (s.switchoffheating ? 0.0 : s.heating[t, r]) - (s.switchoffcooling ? 0.0 : s.cooling[t, r]) - (s.switchoffagcost ? 0.0 : s.agcost[t, r]) + (s.switchoffdrycost ? 0.0 : s.drycost[t, r]) + (s.switchoffprotcost ? 0.0 : s.protcost[t, r]) + (s.switchoffentercost ? 0.0 : s.entercost[t, r]) + (s.switchoffhurrdam ? 0.0 : s.hurrdam[t, r]) + (s.switchoffextratropicalstormsdam ? 0.0 : s.extratropicalstormsdam[t, r]), s.income[t, r]); } foreach (var r in dimensions.GetValues<Region>()) { s.sloss[t, r] = 0.0 + (s.switchoffspecies ? 0.0 : s.species[t, r]) + (s.switchoffdeadcost ? 0.0 : s.deadcost[t, r]) + (s.switchoffmorbcost ? 0.0 : s.morbcost[t, r]) + (s.switchoffwetcost ? 0.0 : s.wetcost[t, r]) + (s.switchoffleavecost ? 0.0 : s.leavecost[t, r]); } foreach (var r in dimensions.GetValues<Region>()) { s.loss[t, r] = (s.eloss[t, r] + s.sloss[t, r]) * 1000000000.0; } } }
public void Run(Clock clock, IImpactTropicalStormsState state, IDimensions dimensions) { var t = clock.Current; var s = state; foreach (var r in dimensions.GetValues<Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; // This is hurrican damage s.hurrdam[t, r] = 0.001 * s.hurrbasedam[r] * s.income[t, r] * Math.Pow(ypc / ypc90, s.hurrdamel) * (Math.Pow(1.0 + s.hurrpar * s.regstmp[t, r], s.hurrnl) - 1.0); s.hurrdead[t, r] = 1000.0 * s.hurrbasedead[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.hurrdeadel) * (Math.Pow(1.0 + s.hurrpar * s.regstmp[t, r], s.hurrnl) - 1.0); } }
public void Run(Clock clock, IEmissionsState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { // Initial values, should eventually also come from parameter file var t0 = Timestep.FromSimulationYear(0); foreach (var r in dimensions.GetValues<Region>()) { s.energint[t0, r] = 1; s.energuse[t0, r] = s.gdp0[r]; s.emissint[t0, r] = s.emissint0[r]; s.so2[t0, r] = s.so20[r]; s.emission[t0, r] = s.emissint[t0, r] / s.energuse[t0, r]; s.ch4cost[t0, r] = 0; s.n2ocost[t0, r] = 0; s.ryg[t0, r] = 0; s.reei[t0, r] = 0; s.rcei[t0, r] = 0; s.seei[t0, r] = 0; s.scei[t0, r] = 0; s.co2red[t0, r] = 0; s.know[t0, r] = 1; s.ch4red[t0, r] = 0; s.n2ored[t0, r] = 0; s.mitigationcost[t0, r] = 0; } s.globknow[t0] = 1; s.cumglobco2[t0] = 0.0; s.cumglobch4[t0] = 0.0; s.cumglobn2o[t0] = 0.0; s.cumglobsf6[t0] = 0.0; s.cumglobso2[t0] = 0.0; //SocioEconomicState.minint[t0]=Double.PositiveInfinity; var minint = double.PositiveInfinity; foreach (var r in dimensions.GetValues<Region>()) { if (s.emission[t0, r] / s.income[t0, r] < minint) minint = s.emission[t0, r] / s.income[t0, r]; } //s.minint[t0] = minint; s.minint[t0] = 0; } else { // Calculate emission and carbon intensity foreach (var r in dimensions.GetValues<Region>()) { s.energint[t, r] = (1.0 - 0.01 * s.aeei[t, r] - s.reei[t - 1, r]) * s.energint[t - 1, r]; s.emissint[t, r] = (1.0 - 0.01 * s.acei[t, r] - s.rcei[t - 1, r]) * s.emissint[t - 1, r]; } // Calculate so2 emissions foreach (var r in dimensions.GetValues<Region>()) { s.so2[t, r] = s.so2[t - 1, r] * Math.Pow(1 + 0.01 * s.pgrowth[t - 1, r], s.so2pop) * Math.Pow(1 + 0.01 * s.ypcgrowth[t - 1, r], s.so2inc) * Math.Pow(1 - 0.01 * s.aeei[t, r] - s.reei[t - 1, r] - 0.01 * s.acei[t, r] - s.rcei[t - 1, r], s.so2carb); s.so2WithSeeiAndScei[t, r] = s.so2[t, r] * (1 - s.seei[t - 1, r] - s.scei[t - 1, r]); } // Calculate sf6 emissions foreach (var r in dimensions.GetValues<Region>()) { s.sf6[t, r] = (s.sf60[r] + s.sf6gdp * (s.income[t, r] - s.GDP90[r]) + s.sf6ypc * (s.income[t - 1, r] / s.population[t - 1, r] - s.GDP90[r] / s.pop90[r])) * (t <= Timestep.FromSimulationYear(60) ? 1 + (t.Value - 40.0) / 40.0 : 1.0 + (60.0 - 40.0) / 40.0) * (t > Timestep.FromSimulationYear(60) ? Math.Pow(0.99, t.Value - 60.0) : 1.0); } // Check for unrealistic values foreach (var r in dimensions.GetValues<Region>()) { if (s.sf6[t, r] < 0.0) s.sf6[t, r] = 0; } // Calculate energy use foreach (var r in dimensions.GetValues<Region>()) { s.energuse[t, r] = (1 - s.seei[t - 1, r]) * s.energint[t, r] * s.income[t, r]; } // Calculate co2 emissions foreach (var r in dimensions.GetValues<Region>()) { s.emission[t, r] = (1 - s.scei[t - 1, r]) * s.emissint[t, r] * s.energuse[t, r]; s.emissionwithforestry[t, r] = s.emission[t, r] + s.forestemm[t, r]; } // Calculate ch4 emissions foreach (var r in dimensions.GetValues<Region>()) { s.ch4[t, r] = s.ch4em[t, r] * (1 - s.ch4red[t - 1, r]); } // Calculate n2o emissions foreach (var r in dimensions.GetValues<Region>()) { s.n2o[t, r] = s.n2oem[t, r] * (1 - s.n2ored[t - 1, r]); } // TODO RT check foreach (var r in dimensions.GetValues<Region>()) { if (s.emission[t, r] / s.income[t, r] - s.minint[t - 1] <= 0) s.taxpar[t, r] = s.TaxConstant; else s.taxpar[t, r] = s.TaxConstant - s.TaxEmInt * Math.Sqrt(s.emission[t, r] / s.income[t, r] - s.minint[t - 1]); } foreach (var r in dimensions.GetValues<Region>()) { s.co2red[t, r] = s.currtax[t, r] * s.emission[t, r] * s.know[t - 1, r] * s.globknow[t - 1] / 2 / s.taxpar[t, r] / s.income[t, r] / 1000; if (s.co2red[t, r] < 0) s.co2red[t, r] = 0; else if (s.co2red[t, r] > 0.99) s.co2red[t, r] = 0.99; } foreach (var r in dimensions.GetValues<Region>()) { s.ryg[t, r] = s.taxpar[t, r] * Math.Pow(s.co2red[t, r], 2) / s.know[t - 1, r] / s.globknow[t - 1]; } // TODO RT check foreach (var r in dimensions.GetValues<Region>()) { s.perm[t, r] = 1.0 - 1.0 / s.TaxThreshold * s.currtax[t, r] / (1 + 1.0 / s.TaxThreshold * s.currtax[t, r]); } foreach (var r in dimensions.GetValues<Region>()) { s.reei[t, r] = s.perm[t, r] * 0.5 * s.co2red[t, r]; } // TODO RT check foreach (var r in dimensions.GetValues<Region>()) { if (s.currtax[t, r] < s.TaxThreshold) s.rcei[t, r] = s.perm[t, r] * 0.5 * Math.Pow(s.co2red[t, r], 2); else s.rcei[t, r] = s.perm[t, r] * 0.5 * s.co2red[t, r]; } // TODO RT check // TODO RT what is the 1.7? foreach (var r in dimensions.GetValues<Region>()) { s.seei[t, r] = (1.0 - s.TaxDepreciation) * s.seei[t - 1, r] + (1.0 - s.perm[t, r]) * 0.5 * s.co2red[t, r] * 1.7; } foreach (var r in dimensions.GetValues<Region>()) { if (s.currtax[t, r] < 100) s.scei[t, r] = 0.9 * s.scei[t - 1, r] + (1 - s.perm[t, r]) * 0.5 * Math.Pow(s.co2red[t, r], 2); else s.scei[t, r] = 0.9 * s.scei[t - 1, r] + (1 - s.perm[t, r]) * 0.5 * s.co2red[t, r] * 1.7; } // TODO RT check foreach (var r in dimensions.GetValues<Region>()) { s.know[t, r] = s.know[t - 1, r] * Math.Sqrt(1 + s.knowpar * s.co2red[t, r]); if (s.know[t, r] > Math.Sqrt(s.MaxCostFall)) s.know[t, r] = Math.Sqrt(s.MaxCostFall); } s.globknow[t] = s.globknow[t - 1]; foreach (var r in dimensions.GetValues<Region>()) { s.globknow[t] = s.globknow[t] * Math.Sqrt(1 + s.knowgpar * s.co2red[t, r]); } if (s.globknow[t] > 3.16) s.globknow[t] = 3.16; foreach (var r in dimensions.GetValues<Region>()) { s.ch4red[t, r] = s.currtaxch4[t, r] * s.ch4em[t, r] / 2 / s.ch4par1[r] / s.ch4par2[r] / s.ch4par2[r] / s.income[t, r] / 1000; if (s.ch4red[t, r] < 0) s.ch4red[t, r] = 0; else if (s.ch4red[t, r] > 0.99) s.ch4red[t, r] = 0.99; } foreach (var r in dimensions.GetValues<Region>()) { s.n2ored[t, r] = s.gwpn2o * s.currtaxn2o[t, r] * s.n2oem[t, r] / 2 / s.n2opar1[r] / s.n2opar2[r] / s.n2opar2[r] / s.income[t, r] / 1000; if (s.n2ored[t, r] < 0) s.n2ored[t, r] = 0; else if (s.n2ored[t, r] > 0.99) s.n2ored[t, r] = 0.99; } foreach (var r in dimensions.GetValues<Region>()) { s.ch4cost[t, r] = s.ch4par1[r] * Math.Pow(s.ch4par2[r], 2) * Math.Pow(s.ch4red[t, r], 2); s.ch4costindollar[t, r] = s.ch4cost[t, r] * s.income[t, r]; } foreach (var r in dimensions.GetValues<Region>()) { s.n2ocost[t, r] = s.n2opar1[r] * Math.Pow(s.n2opar2[r], 2) * Math.Pow(s.n2ored[t, r], 2); } var minint = Double.PositiveInfinity; foreach (var r in dimensions.GetValues<Region>()) { if (s.emission[t, r] / s.income[t, r] < minint) minint = s.emission[t, r] / s.income[t, r]; } s.minint[t] = minint; foreach (var r in dimensions.GetValues<Region>()) { if (t > Timestep.FromYear(2000)) s.cumaeei[t, r] = s.cumaeei[t - 1, r] * (1.0 - 0.01 * s.aeei[t, r] - s.reei[t, r] + s.seei[t - 1, r] - s.seei[t, r]); else s.cumaeei[t, r] = 1.0; } foreach (var r in dimensions.GetValues<Region>()) { s.mitigationcost[t, r] = (s.taxmp[r] * s.ryg[t, r] /*+ s.ch4cost[t, r]*/ + s.n2ocost[t, r]) * s.income[t, r]; } double globco2 = 0; double globch4 = 0; double globn2o = 0; double globsf6 = 0; double globso2 = 34.4; foreach (var r in dimensions.GetValues<Region>()) { globco2 = globco2 + s.emissionwithforestry[t, r]; globch4 = globch4 + s.ch4[t, r]; globn2o = globn2o + s.n2o[t, r]; globsf6 = globsf6 + s.sf6[t, r]; globso2 = globso2 + s.so2WithSeeiAndScei[t, r]; } s.mco2[t] = globco2; s.globch4[t] = Math.Max(0.0, globch4 + (t.Value > 50 ? s.ch4add * (t.Value - 50) : 0.0)); s.globn2o[t] = Math.Max(0.0, globn2o + (t.Value > 50 ? s.n2oadd * (t.Value - 50) : 0)); s.globsf6[t] = Math.Max(0.0, globsf6 + (t.Value > 50 ? s.sf6add * (t.Value - 50) : 0.0)); s.globso2[t] = globso2; s.cumglobco2[t] = s.cumglobco2[t - 1] + s.mco2[t]; s.cumglobch4[t] = s.cumglobch4[t - 1] + s.globch4[t]; s.cumglobn2o[t] = s.cumglobn2o[t - 1] + s.globn2o[t]; s.cumglobsf6[t] = s.cumglobsf6[t - 1] + s.globsf6[t]; s.cumglobso2[t] = s.cumglobso2[t - 1] + s.globso2[t]; } }
public void Run(Clock clock, IImpactCardiovascularRespiratoryState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues<Region>()) { s.basecardvasc[t, r] = s.cardvasc90[r] + s.cvlin * (s.plus[t, r] - s.plus90[r]); if (s.basecardvasc[t, r] > 1.0) s.basecardvasc[t, r] = 1.0; s.baseresp[t, r] = s.resp90[r] + s.rlin * (s.plus[t, r] - s.plus90[r]); if (s.baseresp[t, r] > 1.0) s.baseresp[t, r] = 1.0; s.cardheat[t, r] = (s.chplbm[r] * s.plus[t, r] + s.chmlbm[r] * (1.0 - s.plus[t, r])) * s.temp[t, r] + (s.chpqbm[r] * s.plus[t, r] + s.chmqbm[r] * (1.0 - s.plus[t, r])) * Math.Pow(s.temp[t, r], 2); s.cardheat[t, r] = s.cardheat[t, r] * s.urbpop[t, r] * s.population[t, r] * 10; if (s.cardheat[t, r] > 1000.0 * s.maxcardvasc * s.basecardvasc[t, r] * s.urbpop[t, r] * s.population[t, r]) s.cardheat[t, r] = 1000 * s.maxcardvasc * s.basecardvasc[t, r] * s.urbpop[t, r] * s.population[t, r]; if (s.cardheat[t, r] < 0.0) s.cardheat[t, r] = 0; s.resp[t, r] = s.rlbm[r] * s.temp[t, r] + s.rqbm[r] * Math.Pow(s.temp[t, r], 2); s.resp[t, r] = s.resp[t, r] * s.urbpop[t, r] * s.population[t, r] * 10; if (s.resp[t, r] > 1000 * s.maxcardvasc * s.baseresp[t, r] * s.urbpop[t, r] * s.population[t, r]) s.resp[t, r] = 1000 * s.maxcardvasc * s.baseresp[t, r] * s.urbpop[t, r] * s.population[t, r]; if (s.resp[t, r] < 0) s.resp[t, r] = 0; s.cardcold[t, r] = (s.ccplbm[r] * s.plus[t, r] + s.ccmlbm[r] * (1.0 - s.plus[t, r])) * s.temp[t, r] + (s.ccpqbm[r] * s.plus[t, r] + s.ccmqbm[r] * (1.0 - s.plus[t, r])) * Math.Pow(s.temp[t, r], 2); s.cardcold[t, r] = s.cardcold[t, r] * s.population[t, r] * 10; if (s.cardcold[t, r] < -1000 * s.maxcardvasc * s.basecardvasc[t, r] * s.population[t, r]) s.cardcold[t, r] = -1000 * s.maxcardvasc * s.basecardvasc[t, r] * s.population[t, r]; if (s.cardcold[t, r] > 0) s.cardcold[t, r] = 0; } } }
public void Run(Clock clock, IEmissionsState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { // Initial values, should eventually also come from parameter file var t0 = Timestep.FromSimulationYear(0); foreach (var r in dimensions.GetValues <Region>()) { s.energint[t0, r] = 1; s.energuse[t0, r] = s.gdp0[r]; s.emissint[t0, r] = s.emissint0[r]; s.so2[t0, r] = s.so20[r]; s.emission[t0, r] = s.emissint[t0, r] / s.energuse[t0, r]; s.ch4cost[t0, r] = 0; s.n2ocost[t0, r] = 0; s.ryg[t0, r] = 0; s.reei[t0, r] = 0; s.rcei[t0, r] = 0; s.seei[t0, r] = 0; s.scei[t0, r] = 0; s.co2red[t0, r] = 0; s.know[t0, r] = 1; s.ch4red[t0, r] = 0; s.n2ored[t0, r] = 0; s.mitigationcost[t0, r] = 0; } s.globknow[t0] = 1; s.cumglobco2[t0] = 0.0; s.cumglobch4[t0] = 0.0; s.cumglobn2o[t0] = 0.0; s.cumglobsf6[t0] = 0.0; s.cumglobso2[t0] = 0.0; //SocioEconomicState.minint[t0]=Double.PositiveInfinity; var minint = double.PositiveInfinity; foreach (var r in dimensions.GetValues <Region>()) { if (s.emission[t0, r] / s.income[t0, r] < minint) { minint = s.emission[t0, r] / s.income[t0, r]; } } //s.minint[t0] = minint; s.minint[t0] = 0; } else { // Calculate emission and carbon intensity foreach (var r in dimensions.GetValues <Region>()) { s.energint[t, r] = (1.0 - 0.01 * s.aeei[t, r] - s.reei[t - 1, r]) * s.energint[t - 1, r]; s.emissint[t, r] = (1.0 - 0.01 * s.acei[t, r] - s.rcei[t - 1, r]) * s.emissint[t - 1, r]; } // Calculate so2 emissions foreach (var r in dimensions.GetValues <Region>()) { s.so2[t, r] = s.so2[t - 1, r] * Math.Pow(1 + 0.01 * s.pgrowth[t - 1, r], s.so2pop) * Math.Pow(1 + 0.01 * s.ypcgrowth[t - 1, r], s.so2inc) * Math.Pow(1 - 0.01 * s.aeei[t, r] - s.reei[t - 1, r] - 0.01 * s.acei[t, r] - s.rcei[t - 1, r], s.so2carb); s.so2WithSeeiAndScei[t, r] = s.so2[t, r] * (1 - s.seei[t - 1, r] - s.scei[t - 1, r]); } // Calculate sf6 emissions foreach (var r in dimensions.GetValues <Region>()) { s.sf6[t, r] = (s.sf60[r] + s.sf6gdp * (s.income[t, r] - s.GDP90[r]) + s.sf6ypc * (s.income[t - 1, r] / s.population[t - 1, r] - s.GDP90[r] / s.pop90[r])) * (t <= Timestep.FromSimulationYear(60) ? 1 + (t.Value - 40.0) / 40.0 : 1.0 + (60.0 - 40.0) / 40.0) * (t > Timestep.FromSimulationYear(60) ? Math.Pow(0.99, t.Value - 60.0) : 1.0); } // Check for unrealistic values foreach (var r in dimensions.GetValues <Region>()) { if (s.sf6[t, r] < 0.0) { s.sf6[t, r] = 0; } } // Calculate energy use foreach (var r in dimensions.GetValues <Region>()) { s.energuse[t, r] = (1 - s.seei[t - 1, r]) * s.energint[t, r] * s.income[t, r]; } // Calculate co2 emissions foreach (var r in dimensions.GetValues <Region>()) { s.emission[t, r] = (1 - s.scei[t - 1, r]) * s.emissint[t, r] * s.energuse[t, r]; s.emissionwithforestry[t, r] = s.emission[t, r] + s.forestemm[t, r]; } // Calculate ch4 emissions foreach (var r in dimensions.GetValues <Region>()) { s.ch4[t, r] = s.ch4em[t, r] * (1 - s.ch4red[t - 1, r]); } // Calculate n2o emissions foreach (var r in dimensions.GetValues <Region>()) { s.n2o[t, r] = s.n2oem[t, r] * (1 - s.n2ored[t - 1, r]); } // TODO RT check foreach (var r in dimensions.GetValues <Region>()) { if (s.emission[t, r] / s.income[t, r] - s.minint[t - 1] <= 0) { s.taxpar[t, r] = s.TaxConstant; } else { s.taxpar[t, r] = s.TaxConstant - s.TaxEmInt * Math.Sqrt(s.emission[t, r] / s.income[t, r] - s.minint[t - 1]); } } foreach (var r in dimensions.GetValues <Region>()) { s.co2red[t, r] = s.currtax[t, r] * s.emission[t, r] * s.know[t - 1, r] * s.globknow[t - 1] / 2 / s.taxpar[t, r] / s.income[t, r] / 1000; if (s.co2red[t, r] < 0) { s.co2red[t, r] = 0; } else if (s.co2red[t, r] > 0.99) { s.co2red[t, r] = 0.99; } } foreach (var r in dimensions.GetValues <Region>()) { s.ryg[t, r] = s.taxpar[t, r] * Math.Pow(s.co2red[t, r], 2) / s.know[t - 1, r] / s.globknow[t - 1]; } // TODO RT check foreach (var r in dimensions.GetValues <Region>()) { s.perm[t, r] = 1.0 - 1.0 / s.TaxThreshold * s.currtax[t, r] / (1 + 1.0 / s.TaxThreshold * s.currtax[t, r]); } foreach (var r in dimensions.GetValues <Region>()) { s.reei[t, r] = s.perm[t, r] * 0.5 * s.co2red[t, r]; } // TODO RT check foreach (var r in dimensions.GetValues <Region>()) { if (s.currtax[t, r] < s.TaxThreshold) { s.rcei[t, r] = s.perm[t, r] * 0.5 * Math.Pow(s.co2red[t, r], 2); } else { s.rcei[t, r] = s.perm[t, r] * 0.5 * s.co2red[t, r]; } } // TODO RT check // TODO RT what is the 1.7? foreach (var r in dimensions.GetValues <Region>()) { s.seei[t, r] = (1.0 - s.TaxDepreciation) * s.seei[t - 1, r] + (1.0 - s.perm[t, r]) * 0.5 * s.co2red[t, r] * 1.7; } foreach (var r in dimensions.GetValues <Region>()) { if (s.currtax[t, r] < 100) { s.scei[t, r] = 0.9 * s.scei[t - 1, r] + (1 - s.perm[t, r]) * 0.5 * Math.Pow(s.co2red[t, r], 2); } else { s.scei[t, r] = 0.9 * s.scei[t - 1, r] + (1 - s.perm[t, r]) * 0.5 * s.co2red[t, r] * 1.7; } } // TODO RT check foreach (var r in dimensions.GetValues <Region>()) { s.know[t, r] = s.know[t - 1, r] * Math.Sqrt(1 + s.knowpar * s.co2red[t, r]); if (s.know[t, r] > Math.Sqrt(s.MaxCostFall)) { s.know[t, r] = Math.Sqrt(s.MaxCostFall); } } s.globknow[t] = s.globknow[t - 1]; foreach (var r in dimensions.GetValues <Region>()) { s.globknow[t] = s.globknow[t] * Math.Sqrt(1 + s.knowgpar * s.co2red[t, r]); } if (s.globknow[t] > 3.16) { s.globknow[t] = 3.16; } foreach (var r in dimensions.GetValues <Region>()) { s.ch4red[t, r] = s.currtaxch4[t, r] * s.ch4em[t, r] / 2 / s.ch4par1[r] / s.ch4par2[r] / s.ch4par2[r] / s.income[t, r] / 1000; if (s.ch4red[t, r] < 0) { s.ch4red[t, r] = 0; } else if (s.ch4red[t, r] > 0.99) { s.ch4red[t, r] = 0.99; } } foreach (var r in dimensions.GetValues <Region>()) { s.n2ored[t, r] = s.gwpn2o * s.currtaxn2o[t, r] * s.n2oem[t, r] / 2 / s.n2opar1[r] / s.n2opar2[r] / s.n2opar2[r] / s.income[t, r] / 1000; if (s.n2ored[t, r] < 0) { s.n2ored[t, r] = 0; } else if (s.n2ored[t, r] > 0.99) { s.n2ored[t, r] = 0.99; } } foreach (var r in dimensions.GetValues <Region>()) { s.ch4cost[t, r] = s.ch4par1[r] * Math.Pow(s.ch4par2[r], 2) * Math.Pow(s.ch4red[t, r], 2); s.ch4costindollar[t, r] = s.ch4cost[t, r] * s.income[t, r]; } foreach (var r in dimensions.GetValues <Region>()) { s.n2ocost[t, r] = s.n2opar1[r] * Math.Pow(s.n2opar2[r], 2) * Math.Pow(s.n2ored[t, r], 2); } var minint = Double.PositiveInfinity; foreach (var r in dimensions.GetValues <Region>()) { if (s.emission[t, r] / s.income[t, r] < minint) { minint = s.emission[t, r] / s.income[t, r]; } } s.minint[t] = minint; foreach (var r in dimensions.GetValues <Region>()) { if (t > Timestep.FromYear(2000)) { s.cumaeei[t, r] = s.cumaeei[t - 1, r] * (1.0 - 0.01 * s.aeei[t, r] - s.reei[t, r] + s.seei[t - 1, r] - s.seei[t, r]); } else { s.cumaeei[t, r] = 1.0; } } foreach (var r in dimensions.GetValues <Region>()) { s.mitigationcost[t, r] = (s.taxmp[r] * s.ryg[t, r] /*+ s.ch4cost[t, r]*/ + s.n2ocost[t, r]) * s.income[t, r]; } double globco2 = 0; double globch4 = 0; double globn2o = 0; double globsf6 = 0; double globso2 = 34.4; foreach (var r in dimensions.GetValues <Region>()) { globco2 = globco2 + s.emissionwithforestry[t, r]; globch4 = globch4 + s.ch4[t, r]; globn2o = globn2o + s.n2o[t, r]; globsf6 = globsf6 + s.sf6[t, r]; globso2 = globso2 + s.so2WithSeeiAndScei[t, r]; } s.mco2[t] = globco2; s.globch4[t] = Math.Max(0.0, globch4 + (t.Value > 50 ? s.ch4add * (t.Value - 50) : 0.0)); s.globn2o[t] = Math.Max(0.0, globn2o + (t.Value > 50 ? s.n2oadd * (t.Value - 50) : 0)); s.globsf6[t] = Math.Max(0.0, globsf6 + (t.Value > 50 ? s.sf6add * (t.Value - 50) : 0.0)); s.globso2[t] = globso2; s.cumglobco2[t] = s.cumglobco2[t - 1] + s.mco2[t]; s.cumglobch4[t] = s.cumglobch4[t - 1] + s.globch4[t]; s.cumglobn2o[t] = s.cumglobn2o[t - 1] + s.globn2o[t]; s.cumglobsf6[t] = s.cumglobsf6[t - 1] + s.globsf6[t]; s.cumglobso2[t] = s.cumglobso2[t - 1] + s.globso2[t]; } }
public void Run(Clock clock, IImpactBioDiversityState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { s.biodiv[t] = s.nospecbase / s.nospecies[t]; foreach (var r in dimensions.GetValues<Region>()) { double ypc = 1000.0 * s.income[t, r] / s.population[t, r]; var dt = Math.Abs(s.temp[t, r] - s.temp[t - 1, r]); var valadj = s.valbase / s.valinc[r] / (1 + s.valbase / s.valinc[r]); s.species[t, r] = s.spbm / s.valbase * ypc / s.valinc[r] / (1.0 + ypc / s.valinc[r]) / valadj * ypc * s.population[t, r] / 1000.0 * dt / s.dbsta / (1.0 + dt / s.dbsta) * (1.0 - s.bioshare + s.bioshare * s.biodiv[t]); } } }
public void Run(Clock clock, IImpactDeathMorbidityState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues<Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; s.dead[t, r] = s.dengue[t, r] + s.schisto[t, r] + s.malaria[t, r] + s.cardheat[t, r] + s.cardcold[t, r] + s.resp[t, r] + s.diadead[t, r] + s.hurrdead[t, r] + s.extratropicalstormsdead[t, r]; if (s.dead[t, r] > s.population[t, r] * 1000000.0) s.dead[t, r] = s.population[t, r] / 1000000.0; s.yll[t, r] = s.d2ld[r] * s.dengue[t, r] + s.d2ls[r] * s.schisto[t, r] + s.d2lm[r] * s.malaria[t, r] + s.d2lc[r] * s.cardheat[t, r] + s.d2lc[r] * s.cardcold[t, r] + s.d2lr[r] * s.resp[t, r]; s.yld[t, r] = s.d2dd[r] * s.dengue[t, r] + s.d2ds[r] * s.schisto[t, r] + s.d2dm[r] * s.malaria[t, r] + s.d2dc[r] * s.cardheat[t, r] + s.d2dc[r] * s.cardcold[t, r] + s.d2dr[r] * s.resp[t, r] + s.diasick[t, r]; s.vsl[t, r] = s.vslbm * Math.Pow(ypc / s.vslypc0, s.vslel); s.deadcost[t, r] = s.vsl[t, r] * s.dead[t, r] / 1000000000.0; // deadcost:= vyll*ypc*yll/1000000000; s.vmorb[t, r] = s.vmorbbm * Math.Pow(ypc / s.vmorbypc0, s.vmorbel); s.morbcost[t, r] = s.vmorb[t, r] * s.yld[t, r] / 1000000000.0; } } }
public void Run(Clock clock, IImpactCoolingState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { } else { foreach (var r in dimensions.GetValues<Region>()) { double ypc = s.income[t, r] / s.population[t, r] * 1000.0; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.cooling[t, r] = s.cebm[r] * s.cumaeei[t, r] * s.gdp90[r] * Math.Pow(s.temp[t, r] / 1.0, s.cenl) * Math.Pow(ypc / ypc90, s.ceel) * s.population[t, r] / s.pop90[r]; } } }
public void Run(Clock clock, IPopulationState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { double globalpopulation = 0.0; foreach (var r in dimensions.GetValues<Region>()) { s.population[t, r] = s.pop0[r]; s.populationin1[t, r] = s.population[t, r] * 1000000.0; globalpopulation = globalpopulation + s.populationin1[t, r]; } s.globalpopulation[t] = globalpopulation; } else { var globalPopulation = 0.0; // Calculate population foreach (var r in dimensions.GetValues<Region>()) { s.population[t, r] = (1.0 + 0.01 * s.pgrowth[t - 1, r]) * (s.population[t - 1, r] + ( (t >= Timestep.FromSimulationYear(40)) && !s.runwithoutpopulationperturbation ? (s.enter[t - 1, r] / 1000000.0) - (s.leave[t - 1, r] / 1000000.0) - (s.dead[t - 1, r] >= 0 ? s.dead[t - 1, r] / 1000000.0 : 0) : 0 ) ); if (s.population[t, r] < 0) s.population[t, r] = 0.000001; //raise new Exception; s.populationin1[t, r] = s.population[t, r] * 1000000.0; globalPopulation = globalPopulation + s.populationin1[t, r]; } s.globalpopulation[t] = globalPopulation; } }
public const double DBsT = 0.04; // base case yearly warming #endregion Fields #region Methods public void Run(Clock clock, IImpactAgricultureState state, IDimensions dimensions) { var s = state; var t = clock.Current; if (clock.IsFirstTimestep) { foreach (var r in dimensions.GetValues<Region>()) { s.agrate[t, r] = s.agrbm[r] * Math.Pow(0.005 / DBsT, s.agnl) * s.agtime[r]; } } else { foreach (var r in dimensions.GetValues<Region>()) { Double ypc = s.income[t, r] / s.population[t, r] * 1000.0; Double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.agrish[t, r] = s.agrish0[r] * Math.Pow(ypc / ypc90, -s.agel); } foreach (var r in dimensions.GetValues<Region>()) { var dtemp = Math.Abs(s.temp[t, r] - s.temp[t - 1, r]); if (double.IsNaN(Math.Pow(dtemp / 0.04, s.agnl))) s.agrate[t, r] = 0.0; else s.agrate[t, r] = s.agrbm[r] * Math.Pow(dtemp / 0.04, s.agnl) + (1.0 - 1.0 / s.agtime[r]) * s.agrate[t - 1, r]; } foreach (var r in dimensions.GetValues<Region>()) { s.aglevel[t, r] = s.aglparl[r] * s.temp[t, r] + s.aglparq[r] * Math.Pow(s.temp[t, r], 2.0); } foreach (var r in dimensions.GetValues<Region>()) { s.agco2[t, r] = s.agcbm[r] / Math.Log(2.0) * Math.Log(s.acco2[t - 1] / s.co2pre); } foreach (var r in dimensions.GetValues<Region>()) { s.agcost[t, r] = Math.Min(1.0, s.agrate[t, r] + s.aglevel[t, r] + s.agco2[t, r]) * s.agrish[t, r] * s.income[t, r]; } } }
public void Run(Clock clock, IImpactVectorBorneDiseasesState state, IDimensions dimensions) { var s = state; var t = clock.Current; foreach (var r in dimensions.GetValues<Region>()) { double ypc = 1000.0 * s.income[t, r] / s.population[t, r]; double ypc90 = s.gdp90[r] / s.pop90[r] * 1000.0; s.dengue[t, r] = s.dfbs[r] * s.population[t, r] * s.dfch[r] * Math.Pow(s.temp[t, r], s.dfnl) * Math.Pow(ypc / ypc90, s.vbel); s.schisto[t, r] = s.smbs[r] * s.population[t, r] * s.smch[r] * Math.Pow(s.temp[t, r], s.smnl) * Math.Pow(ypc / ypc90, s.vbel); if (s.schisto[t, r] < -s.smbs[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.vbel)) s.schisto[t, r] = -s.smbs[r] * s.population[t, r] * Math.Pow(ypc / ypc90, s.vbel); s.malaria[t, r] = s.malbs[r] * s.population[t, r] * s.malch[r] * Math.Pow(s.temp[t, r], s.malnl) * Math.Pow(ypc / ypc90, s.vbel); } }