/*public static void Initialize(int timestep)
         * {
         *  Timestep = timestep;
         *
         *
         * }*/

        public Dictionary <ISpeciesPNET, float> Calculate_Establishment_Month(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology, float minHalfSat, float maxHalfSat, bool invertPest)
        {
            Dictionary <ISpeciesPNET, float> estabDict = new Dictionary <ISpeciesPNET, float>();

            float halfSatRange = maxHalfSat - minHalfSat;

            foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies)
            {
                if (pnetvars.Tmin > spc.PsnTMin && pnetvars.Tmax < spc.PsnTMax)
                {
                    // Adjust HalfSat for CO2 effect
                    float halfSatIntercept = spc.HalfSat - 350 * spc.CO2HalfSatEff;
                    float adjHalfSat       = spc.CO2HalfSatEff * pnetvars.CO2 + halfSatIntercept;
                    float frad             = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFrad(PAR, adjHalfSat), 2) * (1 / (Math.Pow(spc.EstRad, 2))))));
                    float adjFrad          = frad;
                    // Optional adjustment to invert Pest based on relative halfSat
                    if (invertPest && halfSatRange > 0)
                    {
                        float frad_adj_int = (spc.HalfSat - minHalfSat) / halfSatRange;
                        float frad_slope   = (frad_adj_int * 2) - 1;
                        adjFrad = 1 - frad_adj_int + frad * frad_slope;
                    }

                    float PressureHead = hydrology.GetPressureHead(ecoregion);

                    float fwater = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFWater(spc.H1, spc.H2, spc.H3, spc.H4, PressureHead), 2) * (1 / (Math.Pow(spc.EstMoist, 2))))));

                    float pest = (float)Math.Min(1.0, adjFrad * fwater);
                    estabDict[spc] = pest;
                    _fwater[spc]   = fwater;
                    _frad[spc]     = adjFrad;
                }
            }
            return(estabDict);
        }
Пример #2
0
        /*public void Calculate_Establishment(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology)
         * {
         *  foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies)
         *  {
         *
         *
         *      if (pnetvars.Tmin > spc.PsnTMin)
         *      {
         *          // Adjust HalfSat for CO2 effect
         *          float halfSatIntercept = spc.HalfSat - 350 * spc.CO2HalfSatEff;
         *          float adjHalfSat = spc.CO2HalfSatEff * pnetvars.CO2 + halfSatIntercept;
         *          float frad = (float)Math.Pow(Cohort.ComputeFrad(PAR, adjHalfSat), spc.EstRad);
         *
         *
         *          float PressureHead = hydrology.GetPressureHead(ecoregion);
         *
         *          float fwater = (float)Math.Pow(Cohort.ComputeFWater(spc.H1,spc.H2, spc.H3, spc.H4, PressureHead), spc.EstMoist);
         *
         *          float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater), Timestep);
         *          if (!spc.PreventEstablishment)
         *          {
         *              if (pest > _pest[spc])
         *              {
         *                  _pest[spc] = pest;
         *                  _fwater[spc] = fwater;
         *                  _frad[spc] = frad;
         *
         *                  if (pest > (float)PlugIn.ContinuousUniformRandom())
         *                  {
         *                      if (HasEstablished(spc) == false)
         *                      {
         *                          _hasEstablished.Add(spc);
         *                      }
         *
         *                  }
         *
         *              }
         *          }
         *          if (establishment_siteoutput != null)
         *          {
         *
         *              establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc));
         *
         *              // TODO: win time by reducing calls to write
         *              establishment_siteoutput.Write();
         *          }
         *      }
         *  }
         * }
         */

        public Dictionary <ISpeciesPNET, float> Calculate_Establishment_Month(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology, float minHalfSat, float maxHalfSat, bool invertPest)
        {
            Dictionary <ISpeciesPNET, float> estabDict = new Dictionary <ISpeciesPNET, float>();
            //_fwater = new Dictionary<ISpeciesPNET, float>();
            //_pest = new Dictionary<ISpeciesPNET, float>();
            //_frad = new Dictionary<ISpeciesPNET, float>();
            float halfSatRange = maxHalfSat - minHalfSat;

            foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies)
            {
                if (pnetvars.Tmin > spc.PsnTMin && pnetvars.Tmax < spc.PsnTMax)
                {
                    // Adjust HalfSat for CO2 effect
                    float halfSatIntercept = spc.HalfSat - 350 * spc.CO2HalfSatEff;
                    float adjHalfSat       = spc.CO2HalfSatEff * pnetvars.CO2 + halfSatIntercept;
                    float frad             = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFrad(PAR, adjHalfSat), 2) * (1 / (Math.Pow(spc.EstRad, 2))))));
                    float adjFrad          = frad;
                    // Optional adjustment to invert Pest based on relative halfSat
                    if (invertPest && halfSatRange > 0)
                    {
                        float frad_adj_int = (spc.HalfSat - minHalfSat) / halfSatRange;
                        float frad_slope   = (frad_adj_int * 2) - 1;
                        adjFrad = 1 - frad_adj_int + frad * frad_slope;
                    }


                    float PressureHead = hydrology.GetPressureHead(ecoregion);

                    float fwater = (float)(Math.Min(1.0, (Math.Pow(Cohort.ComputeFWater(spc.H1, spc.H2, spc.H3, spc.H4, PressureHead), 2) * (1 / (Math.Pow(spc.EstMoist, 2))))));

                    //float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater * spc.MaxPest), Timestep);
                    float pest = (float)Math.Min(1.0, adjFrad * fwater);
                    estabDict[spc] = pest;
                    _pest[spc]     = pest;
                    _fwater[spc]   = fwater;
                    _frad[spc]     = adjFrad;

                    /*if (fwater < _fwater[spc])
                     * {
                     *  _fwater[spc] = fwater;
                     * }
                     * if (frad < _frad[spc])
                     * {
                     *  _frad[spc] = frad;
                     * }
                     */
                    /*if (establishment_siteoutput != null)
                     * {
                     *
                     *  establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc));
                     *
                     *  // TODO: win time by reducing calls to write
                     *  establishment_siteoutput.Write();
                     * }
                     * */
                }
            }
            return(estabDict);
        }
        public void Calculate_Establishment(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology)
        {
            foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies)
            {

                if (pnetvars.Tmin > spc.PsnTMin)
                {
                    float frad = (float)Math.Pow(Cohort.ComputeFrad(PAR, spc.HalfSat), spc.EstRad);

                    float PressureHead = hydrology.GetPressureHead(ecoregion);

                    float fwater = (float)Math.Pow(Cohort.ComputeFWater(spc.H2, spc.H3, spc.H4, PressureHead), spc.EstMoist);

                    float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater), Timestep);
                    if (!spc.PreventEstablishment)
                    {
                        if (pest > _pest[spc])
                        {
                            _pest[spc] = pest;
                            _fwater[spc] = fwater;
                            _frad[spc] = frad;

                            if (pest > (float)PlugIn.ContinuousUniformRandom())
                            {
                                if (HasEstablished(spc) == false)
                                {
                                    _hasEstablished.Add(spc);
                                }

                            }

                        }
                    }
                    if (establishment_siteoutput != null)
                    {

                        establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc));

                        // TODO: win time by reducing calls to write
                        establishment_siteoutput.Write();
                    }
                }
            }
        }
        public void UpdateCohortData(IEcoregionPnETVariables monthdata )
        {
            // Cohort output file
            string s = Math.Round(monthdata.Year, 2) + "," +
                        Age + "," +
                        Layer + "," +
                       //canopy.ConductanceCO2 + "," +
                       SumLAI + "," +
                       GrossPsn.Sum() + "," +
                       FolResp.Sum() + "," +
                       MaintenanceRespiration.Sum() + "," +
                       NetPsn.Sum() + "," +                  // Sum over canopy layers
                       Transpiration.Sum() + "," +
                       ((Transpiration.Sum() > 0) ? NetPsn.Sum() / Transpiration.Sum() : 0).ToString() + "," +
                       fol + "," +
                       Root + "," +
                       Wood + "," +
                       NSC + "," +
                       NSCfrac + "," +
                       FWater.Average() + "," +
                       FRad.Average() + "," +
                       monthdata[Species.Name].FTempPSN + "," +
                       monthdata[Species.Name].FTempRespWeightedDayAndNight + "," +
                       Fage + "," +
                       leaf_on + "," +
                       FActiveBiom;

            cohortoutput.Add(s);
        }
        public Dictionary<ISpeciesPNET, float> Calculate_Establishment_Month(IEcoregionPnETVariables pnetvars, IEcoregionPnET ecoregion, float PAR, IHydrology hydrology)
        {
            Dictionary<ISpeciesPNET, float> estabDict = new Dictionary<ISpeciesPNET, float>();

            foreach (ISpeciesPNET spc in PlugIn.SpeciesPnET.AllSpecies)
            {
                if (pnetvars.Tmin > spc.PsnTMin)
                {
                    float frad = (float)Math.Pow(Cohort.ComputeFrad(PAR, spc.HalfSat), spc.EstRad);

                    float PressureHead = hydrology.GetPressureHead(ecoregion);

                    float fwater = (float)Math.Pow(Cohort.ComputeFWater(spc.H2, spc.H3, spc.H4, PressureHead), spc.EstMoist);

                    float pest = 1 - (float)Math.Pow(1.0 - (frad * fwater), Timestep);
                    estabDict[spc] = pest;
                    if (fwater < _fwater[spc])
                    {
                        _fwater[spc] = fwater;
                    }
                    if (frad < _frad[spc])
                    {
                        _frad[spc] = frad;
                    }

                    /*if (establishment_siteoutput != null)
                    {

                        establishment_siteoutput.Add(((int)pnetvars.Year).ToString() + "," + spc.Name + "," + pest + "," + fwater + "," + frad + "," + HasEstablished(spc));

                        // TODO: win time by reducing calls to write
                        establishment_siteoutput.Write();
                    }
                     * */
                }

            }
            return estabDict;
        }