/*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); }
/*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; }