コード例 #1
0
        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;
                }
            }
        }
コード例 #2
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;
                }
            }
        }
コード例 #3
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];
            }
        }
コード例 #4
0
        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;
                }
            }
        }
コード例 #5
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]);
                }
            }
        }
コード例 #6
0
ファイル: ImpactForests.cs プロジェクト: hbenveniste/fund
        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];
                    }
                }
            }
        }
コード例 #7
0
        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;
            }
        }
コード例 #8
0
        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];
            }
        }
コード例 #9
0
        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];
                }
            }
        }
コード例 #10
0
ファイル: GeographyComponent.cs プロジェクト: VWille/fund
        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];
                }
            }
        }
コード例 #11
0
        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];
            }
        }
コード例 #12
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);
            }
        }
コード例 #13
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);
            }
        }
コード例 #14
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);
            }
        }
コード例 #15
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];
                }
            }
        }
コード例 #16
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];
                }
            }
        }
コード例 #17
0
        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);
            }
        }
コード例 #18
0
        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;
                }
            }
        }
コード例 #19
0
ファイル: SocioEconomicComponent.cs プロジェクト: VWille/fund
        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();
            }
        }
コード例 #20
0
        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;
                    }
                }
            }
        }
コード例 #21
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);
            }
        }
コード例 #22
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);
            }
        }
コード例 #23
0
ファイル: ImpactForests.cs プロジェクト: fund-model/fund
        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];
                }
            }
        }
コード例 #24
0
ファイル: WelfareComponent.cs プロジェクト: fund-model/fund
        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;
            }
        }
コード例 #25
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];

            }
        }
コード例 #26
0
        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;
                }
            }
        }
コード例 #27
0
        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;
                }
            }
        }
コード例 #28
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;
            }
        }
コード例 #29
0
        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;
                    }
                }
            }
        }
コード例 #30
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();
            }
        }
コード例 #31
0
        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;
                }
            }
        }
コード例 #32
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);
            }
        }
コード例 #33
0
ファイル: EmissionsComponent.cs プロジェクト: VWille/fund
        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];
            }
        }
コード例 #34
0
        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;
                }
            }
        }
コード例 #35
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];
            }
        }
コード例 #36
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]);
                }
            }
        }
コード例 #37
0
        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;

                }
            }
        }
コード例 #38
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];
                }
            }
        }
コード例 #39
0
        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;

            }
        }
コード例 #40
0
        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];
                }
            }
        }
コード例 #41
0
        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);
            }
        }