//---------------------------------------------------------------------
 public ISpecies this[ISpeciesPNET species]
 {
     get
     {
         return(SpeciesCombinations.Where(spc => spc.Item2 == species).First().Item1);
     }
 }
 public void RecordPest(int year, ISpeciesPNET spc, float annualPest, float annualfWater, float annualfRad, bool estab, int monthCount)
 {
     if (estab)
     {
         if (HasEstablished(spc) == false)
         {
             _hasEstablished.Add(spc);
         }
     }
     if (establishment_siteoutput != null)
     {
         if (monthCount == 0)
         {
             establishment_siteoutput.Add(year.ToString() + "," + spc.Name + "," + annualPest + "," + 0 + "," + 0 + "," + 0 + "," + HasEstablished(spc));
         }
         else
         {
             establishment_siteoutput.Add(year.ToString() + "," + spc.Name + "," + annualPest + "," + annualfWater + "," + annualfRad + "," + monthCount + "," + HasEstablished(spc));
         }
         // TODO: win time by reducing calls to write
         establishment_siteoutput.Write();
     }
     // Record annualPest to be accessed as Probability
     _pest[spc] = annualPest;
 }
        public bool Establish(ISpecies species, ActiveSite site)
        {
            ISpeciesPNET spc = PlugIn.SpeciesPnET[species];

            bool Establish = sitecohorts[site].EstablishmentProbability.HasEstablished(spc);

            return(Establish);
        }
        public void AddNewCohort(ISpecies species, ActiveSite site, string reproductionType)
        {
            ISpeciesPNET spc       = PlugIn.SpeciesPnET[species];
            bool         addCohort = true;

            if (sitecohorts[site].cohorts.ContainsKey(species))
            {
                // This should deliver only one KeyValuePair
                KeyValuePair <ISpecies, List <Cohort> > i = new List <KeyValuePair <ISpecies, List <Cohort> > >(sitecohorts[site].cohorts.Where(o => o.Key == species))[0];
                List <Cohort> Cohorts = new List <Cohort>(i.Value.Where(o => o.Age < CohortBinSize));
                if (Cohorts.Count() > 0)
                {
                    addCohort = false;
                }
            }
            bool addSiteOutput = false;

            addSiteOutput = (SiteOutputNames.ContainsKey(site) && addCohort);
            Cohort cohort = new Cohort(spc, (ushort)Date.Year, (addSiteOutput) ? SiteOutputNames[site] : null);

            addCohort = sitecohorts[site].AddNewCohort(cohort);

            if (addCohort)
            {
                if (reproductionType == "plant")
                {
                    if (!sitecohorts[site].SpeciesEstablishedByPlant.Contains(species))
                    {
                        sitecohorts[site].SpeciesEstablishedByPlant.Add(species);
                    }
                }
                else if (reproductionType == "serotiny")
                {
                    if (!sitecohorts[site].SpeciesEstablishedBySerotiny.Contains(species))
                    {
                        sitecohorts[site].SpeciesEstablishedBySerotiny.Add(species);
                    }
                }
                else if (reproductionType == "resprout")
                {
                    if (!sitecohorts[site].SpeciesEstablishedByResprout.Contains(species))
                    {
                        sitecohorts[site].SpeciesEstablishedByResprout.Add(species);
                    }
                }
                else if (reproductionType == "seed")
                {
                    if (!sitecohorts[site].SpeciesEstablishedBySeed.Contains(species))
                    {
                        sitecohorts[site].SpeciesEstablishedBySeed.Add(species);
                    }
                }
            }
        }
        // Constructor
        public Cohort(ISpeciesPNET species, ushort year_of_birth, string SiteName)
        {
            this.species =  species;
            age = 0;

            this.nsc = (ushort)species.InitialNSC;

            // Initialize biomass assuming fixed concentration of NSC
            this.biomass = (uint)(1F / species.DNSC * (ushort)species.InitialNSC);

            biomassmax = biomass;

            // Then overwrite them if you need stuff for outputs
            if (SiteName != null)
            {
                InitializeOutput(SiteName, year_of_birth);
            }
        }
 public Cohort(Cohort cohort)
 {
     this.species = cohort.species;
     this.age = cohort.age;
     this.nsc = cohort.nsc;
     this.biomass = cohort.biomass;
     biomassmax = cohort.biomassmax;
     this.fol = cohort.fol;
 }
Beispiel #7
0
        //---------------------------------------------------------------------
        private SpeciesPnETVariables GetSpeciesVariables(ref IObservedClimate climate_dataset, bool Wythers, bool DTemp, float daylength, float nightlength, ISpeciesPNET spc)
        {
            // Class that contains species specific PnET variables for a certain month
            SpeciesPnETVariables speciespnetvars = new SpeciesPnETVariables();

            // Gradient of effect of vapour pressure deficit on growth.
            speciespnetvars.DVPD = Math.Max(0, 1.0f - spc.DVPD1 * (float)Math.Pow(VPD, spc.DVPD2));

            // ** CO2 effect on growth **
            // M. Kubiske method for wue calculation:  Improved methods for calculating WUE and Transpiration in PnET.
            float JH2O = (float)(0.239 * ((VPD / (8314.47 * (climate_dataset.Tmin + 273f)))));

            speciespnetvars.JH2O = JH2O;

            // GROSSPSN gross photosynthesis
            // Modify AmaxB based on CO2 level
            // Equations solved from 2 known points: (350, AmaxB) and (550, AmaxB * CO2AmaxBEff)
            float AmaxB_slope = (float)(((spc.CO2AMaxBEff - 1.0) * spc.AmaxB) / 200.0);               // Derived from m = [(AmaxB*CO2AMaxBEff) - AmaxB]/[550 - 350]
            float AmaxB_int   = (float)(-1.0 * (((spc.CO2AMaxBEff - 1.0) * 1.75) - 1.0) * spc.AmaxB); // Derived from b = AmaxB - (AmaxB_slope * 350)
            float AmaxB_CO2   = AmaxB_slope * climate_dataset.CO2 + AmaxB_int;

            speciespnetvars.AmaxB_CO2 = AmaxB_CO2;

            //-------------------FTempPSN (public for output file)
            if (DTemp)
            {
                speciespnetvars.FTempPSN = EcoregionPnETVariables.DTempResponse(Tday, spc.PsnTOpt, spc.PsnTMin, spc.PsnTMax);
            }
            else
            {
                //speciespnetvars.FTempPSN = EcoregionPnETVariables.LinearPsnTempResponse(Tday, spc.PsnTOpt, spc.PsnTMin); // Original PnET-Succession
                speciespnetvars.FTempPSN = EcoregionPnETVariables.CurvelinearPsnTempResponse(Tday, spc.PsnTOpt, spc.PsnTMin, spc.PsnTMax); // Modified 051216(BRM)
            }

            // Dday  maintenance respiration factor (scaling factor of actual vs potential respiration applied to daily temperature)
            float fTempRespDay = CalcQ10Factor(spc.Q10, Tday, spc.PsnTOpt);

            // Night maintenance respiration factor (scaling factor of actual vs potential respiration applied to night temperature)
            float fTempRespNight = CalcQ10Factor(spc.Q10, Tmin, spc.PsnTOpt);

            // Unitless respiration adjustment: public for output file only
            float FTempRespWeightedDayAndNight = (float)Math.Min(1.0, (fTempRespDay * daylength + fTempRespNight * nightlength) / ((float)daylength + (float)nightlength));

            speciespnetvars.FTempRespWeightedDayAndNight = FTempRespWeightedDayAndNight;
            // Scaling factor of respiration given day and night temperature and day and night length
            speciespnetvars.MaintRespFTempResp = spc.MaintResp * FTempRespWeightedDayAndNight;

            // Respiration gC/timestep (RespTempResponses[0] = day respiration factor)
            // Respiration acclimation subroutine From: Tjoelker, M.G., Oleksyn, J., Reich, P.B. 1999.
            // Acclimation of respiration to temperature and C02 in seedlings of boreal tree species
            // in relation to plant size and relative growth rate. Global Change Biology. 49:679-691,
            // and Tjoelker, M.G., Oleksyn, J., Reich, P.B. 2001. Modeling respiration of vegetation:
            // evidence for a general temperature-dependent Q10. Global Change Biology. 7:223-230.
            // This set of algorithms resets the veg parameter "BaseFolRespFrac" from
            // the static vegetation parameter, then recalculates BaseFolResp based on the adjusted
            // BaseFolRespFrac

            // Base foliage respiration
            float BaseFolRespFrac;

            // Base parameter in Q10 temperature dependency calculation
            float Q10base;

            if (Wythers == true)
            {
                //Computed Base foliar respiration based on temp; this is species-level
                BaseFolRespFrac = (0.138071F - 0.0024519F * Tave);

                //Midpoint between Tave and Optimal Temp; this is also species-level
                float Tmidpoint = (Tave + spc.PsnTOpt) / 2F;

                // Base parameter in Q10 temperature dependency calculation in current temperature
                Q10base = (3.22F - 0.046F * Tmidpoint);
            }
            else
            {
                // The default PnET setting
                BaseFolRespFrac = spc.BFolResp;
                Q10base         = spc.Q10;
            }
            speciespnetvars.BaseFolRespFrac = BaseFolRespFrac;

            // Respiration Q10 factor
            speciespnetvars.Q10Factor = CalcQ10Factor(Q10base, Tave, spc.PsnTOpt);

            return(speciespnetvars);
        }
        public void RecordPest(int year, ISpeciesPNET spc, float annualPest, bool estab)
        {
            if (estab)
            {
                if (HasEstablished(spc) == false)
                {
                    _hasEstablished.Add(spc);
                }
            }
            if (establishment_siteoutput != null)
            {

                establishment_siteoutput.Add(year.ToString() + "," + spc.Name + "," + annualPest + "," + _fwater[spc] + "," + _frad[spc] + "," + HasEstablished(spc));

                // TODO: win time by reducing calls to write
                establishment_siteoutput.Write();
            }
        }
 public bool HasEstablished(ISpeciesPNET species)
 {
     return _hasEstablished.Contains(species);
 }
 public void EstablishmentTrue(ISpeciesPNET spc)
 {
     _hasEstablished.Add(spc);
 }
        private SpeciesPnETVariables GetSpeciesVariables(ref IObservedClimate climate_dataset, bool Wythers, bool DTemp, float daylength, float nightlength, ISpeciesPNET spc)
        {
            // Class that contains species specific PnET variables for a certain month
            SpeciesPnETVariables speciespnetvars = new SpeciesPnETVariables();

            // Gradient of effect of vapour pressure deficit on growth.
            float DVPD = Math.Max(0, 1 - spc.DVPD1 * (float)Math.Pow(VPD, spc.DVPD2));

            // Co2 ratio internal to the leave versus external
            float cicaRatio = (-0.075f * spc.FolN) + 0.875f;

            // Reference co2 ratio
            float ci350 = 350 * cicaRatio;

            // Elevated co2 effect
            float Arel350 = 1.22f * ((ci350 - 68) / (ci350 + 136));

            // Elevated leaf internal co2 concentration
            float ciElev = climate_dataset.CO2 * cicaRatio;

            float ArelElev = 1.22f * ((ciElev - 68) / (ciElev + 136));

            // CO2 effect on growth
            float delamax = 1 + ((ArelElev - Arel350) / Arel350);
            speciespnetvars.DelAmax = delamax;

            // CO2 effect on photosynthesis
            // Calculate CO2 effect on conductance and set slope and intercept for A-gs relationship
            //float Ci = climate_dataset.CO2 * (1 - cicaRatio);
            //float Delgs = delamax / ((Ci / (350.0f - ci350))); // denominator -> CO2 conductance effect
            float Delgs = delamax / ((climate_dataset.CO2 - climate_dataset.CO2 * cicaRatio) / (350.0f - ci350));

            //_gsSlope = (float)((-1.1309 * delamax) + 1.9762);   // used to determine ozone uptake
            //_gsInt = (float)((0.4656 * delamax) - 0.9701);

            //DWUE determined from CO2 effects on conductance
            float wue = (spc.WUEcnst / VPD) * (1 + 1 - Delgs);
            speciespnetvars.WUE = wue;

            // water use efficiency in a co2 enriched atmosphere
            //speciespnetvars.WUE_CO2_corr = wue / delamax;

            //speciespnetvars.WUE_CO2_corr = (climate_dataset.CO2 - Ci) / 1.6f;

            // NETPSN net photosynthesis
            speciespnetvars.Amax = speciespnetvars.DelAmax * (spc.AmaxA + spc.AmaxB * spc.FolN);

            //Reference net Psn (lab conditions) in gC/m2 leaf area/timestep
            float RefNetPsn = _dayspan * (speciespnetvars.Amax * DVPD * daylength * Constants.MC) / Constants.billion;

            //-------------------FTempPSN (public for output file)
            if (DTemp)
            {
                speciespnetvars.FTempPSN = EcoregionPnETVariables.DTempResponse(Tday, spc.PsnTOpt, spc.PsnTMin);
            }
            else
            {
                //speciespnetvars.FTempPSN = EcoregionPnETVariables.LinearPsnTempResponse(Tday, spc.PsnTOpt, spc.PsnTMin); // Original PnET-Succession
                speciespnetvars.FTempPSN = EcoregionPnETVariables.CurvelinearPsnTempResponse(Tday, spc.PsnTOpt, spc.PsnTMin); // Modified 051216(BRM)
            }

            // PSN (gC/m2 leaf area/tstep) reference net psn in a given temperature
            speciespnetvars.FTempPSNRefNetPsn =  speciespnetvars.FTempPSN * RefNetPsn;

            //EcoregionPnETVariables.RespTempResponse(spc, Tday, climate_dataset.Tmin, daylength, nightlength);

            // Dday  maintenance respiration factor (scaling factor of actual vs potential respiration applied to daily temperature)
            float fTempRespDay = CalcQ10Factor(spc.Q10, Tday, spc.PsnTOpt);

            // Night maintenance respiration factor (scaling factor of actual vs potential respiration applied to night temperature)
            float fTempRespNight = CalcQ10Factor(spc.Q10, Tmin , spc.PsnTOpt);

            // Unitless respiration adjustment: public for output file only
            speciespnetvars.FTempRespWeightedDayAndNight = (float)Math.Min(1.0, (fTempRespDay * daylength + fTempRespNight * nightlength) / ((float)daylength + (float)nightlength)); ;

            // Scaling factor of respiration given day and night temperature and day and night length
            speciespnetvars.MaintRespFTempResp = spc.MaintResp * speciespnetvars.FTempRespWeightedDayAndNight;

            // Respiration gC/timestep (RespTempResponses[0] = day respiration factor)
            // Respiration acclimation subroutine From: Tjoelker, M.G., Oleksyn, J., Reich, P.B. 1999.
            // Acclimation of respiration to temperature and C02 in seedlings of boreal tree species
            // in relation to plant size and relative growth rate. Global Change Biology. 49:679-691,
            // and Tjoelker, M.G., Oleksyn, J., Reich, P.B. 2001. Modeling respiration of vegetation:
            // evidence for a general temperature-dependent Q10. Global Change Biology. 7:223-230.
            // This set of algorithms resets the veg parameter "BaseFolRespFrac" from
            // the static vegetation parameter, then recalculates BaseFolResp based on the adjusted
            // BaseFolRespFrac

            // Base foliage respiration
            float BaseFolResp;

            // Base parameter in Q10 temperature dependency calculation
            float Q10base;
            if (Wythers == true)
            {
                //Computed Base foliar respiration based on temp; this is species-level, so you can compute outside this IF block and use for all cohorts of a species
                BaseFolResp = (0.138071F - 0.0024519F * Tave);

                //Midpoint between Tave and Optimal Temp; this is also species-level
                float Tmidpoint=(Tave+ spc.PsnTOpt)/2F;

                // Base parameter in Q10 temperature dependency calculation in current temperature
                Q10base = (3.22F - 0.046F * Tmidpoint);
            }
            else
            {
                // The default PnET setting is that these
                BaseFolResp = spc.BFolResp;
                Q10base = spc.Q10;
            }

            // Growth respiration factor
            speciespnetvars.FTempRespDay = BaseFolResp * CalcQ10Factor(Q10base, Tave, spc.PsnTOpt);

            return speciespnetvars;
        }
 public float Get_FRad(ISpeciesPNET species)
 {
     {
         return(_frad[species]);
     }
 }
 public float Get_FWater(ISpeciesPNET species)
 {
     {
         return(_fwater[species]);
     }
 }
        //private static int Timestep;


        public bool HasEstablished(ISpeciesPNET species)
        {
            return(_hasEstablished.Contains(species));
        }
 public void EstablishmentTrue(ISpeciesPNET spc)
 {
     _hasEstablished.Add(spc);
 }
 public ISpecies this[ISpeciesPNET species]
 {
     get
     {
         return SpeciesCombinations.Where(spc => spc.Item2 == species).First().Item1;
     }
 }