public PressureHeadVanGenuchten() { Landis.Library.Parameters.Ecoregions.AuxParm<float> RootingDepth = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter(Names.RootingDepth, 0, float.MaxValue); table = new Library.Parameters.Ecoregions.AuxParm<ushort[]>(PlugIn.ModelCore.Ecoregions); Landis.Library.Parameters.Ecoregions.AuxParm<string> SoilType = (Landis.Library.Parameters.Ecoregions.AuxParm<string>)PlugIn.GetParameter(Names.SoilType); thetar = (Parameter<float>)PlugIn.GetParameter("thetar"); thetas = (Parameter<float>)PlugIn.GetParameter("thetas"); alpha = (Parameter<float>)PlugIn.GetParameter("alpha"); n = (Parameter<float>)PlugIn.GetParameter("n"); foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) if (ecoregion.Active) { List<ushort> PressureHead = new List<ushort>(); int watercontent = 0; ushort ph = ushort.MaxValue; while(ph > 0) { ph = CalculateWaterPressure(watercontent / RootingDepth[ecoregion], SoilType[ecoregion]); //System.Console.WriteLine(watercontent + "\t" + ph); PressureHead.Add(ph); watercontent++; } table[ecoregion] = PressureHead.ToArray(); } }
//--------------------------------------------------------------------- public static void Initialize(IInputParameters parameters) { ActiveSiteCount = new Landis.Library.Parameters.Ecoregions.AuxParm <int>(PlugIn.ModelCore.Ecoregions); AnnualWeather = new Landis.Library.Parameters.Ecoregions.AuxParm <AnnualClimate_Monthly>(PlugIn.ModelCore.Ecoregions); MonthlyNDeposition = new Landis.Library.Parameters.Ecoregions.AuxParm <double[]>(PlugIn.ModelCore.Ecoregions); AnnualNDeposition = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(PlugIn.ModelCore.Ecoregions); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { IEcoregion ecoregion = PlugIn.ModelCore.Ecoregion[site]; ActiveSiteCount[ecoregion]++; } foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { MonthlyNDeposition[ecoregion] = new double[12]; if (ecoregion.Active) { Climate.GenerateEcoregionClimateData(ecoregion, 0, PlugIn.Parameters.Latitude); SetSingleAnnualClimate(ecoregion, 0, Climate.Phase.SpinUp_Climate); // Some placeholder data to get things started. } } }
public static void Initialize() { ClimateFileName = (Landis.Library.Parameters.Ecoregions.AuxParm <string>)PlugIn.GetParameter("climateFileName"); Dictionary <IEcoregion, IObservedClimate> dict = new Dictionary <IEcoregion, IObservedClimate>(); foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { if (ecoregion.Active == false) { continue; } else { if (dict.ContainsKey(ecoregion)) { ClimateData[ClimateFileName[ecoregion]] = dict[ecoregion]; } else { ClimateData[ClimateFileName[ecoregion]] = new ObservedClimate(ClimateFileName[ecoregion]); } } } }
public static void EcoregionDynamicChange(IDynamicEcoregionRecord[] TimestepData) { //if (DynamicEcoregions.EcoRegData.ContainsKey(year)) //{ GSO1 = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(ModelCore.Ecoregions); GSO2 = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(ModelCore.Ecoregions); GSO3 = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(ModelCore.Ecoregions); GSO4 = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(ModelCore.Ecoregions); //DynamicEcoregions.TimestepData = DynamicEcoregions.EcoRegData[year]; foreach (IEcoregion ecoregion in ModelCore.Ecoregions) { if (!ecoregion.Active) { continue; } if (TimestepData[ecoregion.Index] == null) { continue; } GSO1[ecoregion] = TimestepData[ecoregion.Index].GSO1; GSO2[ecoregion] = TimestepData[ecoregion.Index].GSO2; GSO3[ecoregion] = TimestepData[ecoregion.Index].GSO3; GSO4[ecoregion] = TimestepData[ecoregion.Index].GSO4; } //} }
public static void Initialize() { soiltype = (Landis.Library.Parameters.Ecoregions.AuxParm <string>)(Parameter <string>) PlugIn.GetParameter("SoilType"); climateFileName = (Landis.Library.Parameters.Ecoregions.AuxParm <string>)(Parameter <string>) PlugIn.GetParameter("ClimateFileName"); rootingdepth = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("RootingDepth", 0, 1000); precintconst = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("PrecIntConst", 0, 1); preclossfrac = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("PrecLossFrac", 0, 1); snowsublimfrac = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("SnowSublimFrac", 0, 1); latitude = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("Latitude", -90, 90); leakageFrostDepth = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("LeakageFrostDepth", 0, 999999); precipEvents = (Landis.Library.Parameters.Ecoregions.AuxParm <int>)(Parameter <int>) PlugIn.GetParameter("PrecipEvents", 1, 100); winterSTD = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("WinterSTD", 0, 100); mossDepth = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("MossDepth", 0, 1000); wythers = ((Parameter <bool>)PlugIn.GetParameter("Wythers")).Value; dtemp = ((Parameter <bool>)PlugIn.GetParameter("DTemp")).Value; leakagefrac = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter("LeakageFrac", 0, 1); runoffcapture = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter(Names.RunoffCapture, 0, 999999); AllEcoregions = new Dictionary <IEcoregion, IEcoregionPnET>(); foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { AllEcoregions.Add(ecoregion, new EcoregionPnET(ecoregion)); } all_values = new Dictionary <IEcoregionPnET, Dictionary <DateTime, IEcoregionPnETVariables> >(); foreach (IEcoregionPnET ecoregion in EcoregionPnET.AllEcoregions.Values) { all_values[ecoregion] = new Dictionary <DateTime, IEcoregionPnETVariables>(); } }
public static void Initialize() { latitude = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) GetParameter("Latitude", -90, 90); AllEcoregions = new Dictionary <IEcoregion, IEcoregionData>(); foreach (IEcoregion ecoregion in ModelCore.Ecoregions) { AllEcoregions.Add(ecoregion, new EcoregionData(ecoregion)); } }
public static void Initialize() { leakageFrac = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("LeakageFrac", 0, float.MaxValue); precLossFrac = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("PrecLossFrac", 0, float.MaxValue); rootingDepth = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("RootingDepth", 0, float.MaxValue); precIntConst = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("PrecIntConst", 0, float.MaxValue); soilType = (Landis.Library.Parameters.Ecoregions.AuxParm<string>)PlugIn.GetParameter("SoilType"); climateFileName = (Landis.Library.Parameters.Ecoregions.AuxParm<string>)PlugIn.GetParameter("ClimateFileName"); }
//--------------------------------------------------------------------- public static void Initialize(IInputParameters parameters) { AET = parameters.AET; //FINISH LATER MinRelativeBiomass = parameters.MinRelativeBiomass; B_MAX = new Landis.Library.Parameters.Ecoregions.AuxParm<int>(PlugIn.ModelCore.Ecoregions); ActiveSiteCount = new Landis.Library.Parameters.Ecoregions.AuxParm<int>(PlugIn.ModelCore.Ecoregions); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { IEcoregion ecoregion = PlugIn.ModelCore.Ecoregion[site]; ActiveSiteCount[ecoregion]++; } }
//--------------------------------------------------------------------- public static void Initialize(IInputParameters parameters, IInputClimateParms paramClimate) { m_iCParams = paramClimate; ShadeBiomass = parameters.MinRelativeBiomass; FieldCapacity = parameters.FieldCapacity; Latitude = parameters.Latitude; ActiveSiteCount = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(PlugIn.ModelCore.Ecoregions); //ClimateUpdates = new Ecoregions.AuxParm<bool[]>(PlugIn.ModelCore.Ecoregions); //LANDIS CLIMATE LIBRARIES AET = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(PlugIn.ModelCore.Ecoregions); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { IEcoregion ecoregion = PlugIn.ModelCore.Ecoregion[site]; ActiveSiteCount[ecoregion]++; } //NEW ForCS specific Climate AnnualTemperature = new Landis.Library.Parameters.Ecoregions.AuxParm <double>(PlugIn.ModelCore.Ecoregions); GetAnnualTemperature(parameters.Timestep, 0); /* CODE RELATED TO THE USE OF ONE OF THE BIGGER LANDIS CLIMATE LIBRARIES * * GenerateNewClimate(0, parameters.Timestep); * * AnnualWeather = new Ecoregions.AuxParm<AnnualClimate_Monthly>(PlugIn.ModelCore.Ecoregions); //Climate Library v2.0 * //AnnualWeather = new Ecoregions.AuxParm<AnnualClimate>(PlugIn.ModelCore.Ecoregions); //Climate Library on GitHub * foreach(IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) * { * if(ActiveSiteCount[ecoregion] > 0) * { * SetAnnualClimate(ecoregion, 0); * ClimateUpdates[ecoregion] = new bool[PlugIn.ModelCore.EndTime + parameters.Timestep + 1]; * ClimateUpdates[ecoregion][0] = true; * } * } * foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) * { * if (ActiveSiteCount[ecoregion] > 0) * { * SetAnnualClimate(ecoregion, 0); * } * } */ }
//--------------------------------------------------------------------- public static void UpdateB_MAX() { B_MAX = new Landis.Library.Parameters.Ecoregions.AuxParm <int>(PlugIn.ModelCore.Ecoregions); // Fill in B_MAX array foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { if (ActiveSiteCount[ecoregion] > 0) { int largest_B_MAX_Spp = 0; foreach (ISpecies species in PlugIn.ModelCore.Species) { largest_B_MAX_Spp = System.Math.Max(largest_B_MAX_Spp, SpeciesData.B_MAX_Spp[species][ecoregion]); } B_MAX[ecoregion] = largest_B_MAX_Spp; } } }
//--------------------------------------------------------------------- public InputParameters() { sufficientLight = new List <ISufficientLight>(); leafLongevity = new Landis.Library.Parameters.Species.AuxParm <double>(PlugIn.ModelCore.Species); woodyDecayRate = new Landis.Library.Parameters.Species.AuxParm <double>(PlugIn.ModelCore.Species); mortCurveShapeParm = new Landis.Library.Parameters.Species.AuxParm <double>(PlugIn.ModelCore.Species); growthCurveShapeParm = new Landis.Library.Parameters.Species.AuxParm <double>(PlugIn.ModelCore.Species); leafLignin = new Landis.Library.Parameters.Species.AuxParm <double>(PlugIn.ModelCore.Species); //maxLAI = new Species.AuxParm<double>(PlugIn.ModelCore.Species); //lightExtinctionCoeff = new Species.AuxParm<double>(PlugIn.ModelCore.Species); //pctBioMaxLAI = new Species.AuxParm<double>(PlugIn.ModelCore.Species); aet = new Landis.Library.Parameters.Ecoregions.AuxParm <int>(PlugIn.ModelCore.Ecoregions); minRelativeBiomass = new Landis.Library.Parameters.Ecoregions.AuxParm <Percentage> [6]; for (byte shadeClass = 1; shadeClass <= 5; shadeClass++) { minRelativeBiomass[shadeClass] = new Landis.Library.Parameters.Ecoregions.AuxParm <Percentage>(PlugIn.ModelCore.Ecoregions); } }
//--------------------------------------------------------------------- public InputParameters() { sufficientLight = new List<ISufficientLight>(); leafLongevity = new Landis.Library.Parameters.Species.AuxParm<double>(PlugIn.ModelCore.Species); woodyDecayRate = new Landis.Library.Parameters.Species.AuxParm<double>(PlugIn.ModelCore.Species); mortCurveShapeParm = new Landis.Library.Parameters.Species.AuxParm<double>(PlugIn.ModelCore.Species); growthCurveShapeParm = new Landis.Library.Parameters.Species.AuxParm<double>(PlugIn.ModelCore.Species); leafLignin = new Landis.Library.Parameters.Species.AuxParm<double>(PlugIn.ModelCore.Species); //maxLAI = new Species.AuxParm<double>(PlugIn.ModelCore.Species); //lightExtinctionCoeff = new Species.AuxParm<double>(PlugIn.ModelCore.Species); //pctBioMaxLAI = new Species.AuxParm<double>(PlugIn.ModelCore.Species); aet = new Landis.Library.Parameters.Ecoregions.AuxParm<int>(PlugIn.ModelCore.Ecoregions); minRelativeBiomass = new Landis.Library.Parameters.Ecoregions.AuxParm<Percentage>[6]; for (byte shadeClass = 1; shadeClass <= 5; shadeClass++) { minRelativeBiomass[shadeClass] = new Landis.Library.Parameters.Ecoregions.AuxParm<Percentage>(PlugIn.ModelCore.Ecoregions); } }
//--------------------------------------------------------------------- public static void Initialize(IInputParameters parameters) { AET = parameters.AET; MinRelativeBiomass = parameters.MinRelativeBiomass; B_MAX = new Landis.Library.Parameters.Ecoregions.AuxParm <int>(PlugIn.ModelCore.Ecoregions); ActiveSiteCount = new Landis.Library.Parameters.Ecoregions.AuxParm <int>(PlugIn.ModelCore.Ecoregions); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { IEcoregion ecoregion = PlugIn.ModelCore.Ecoregion[site]; ActiveSiteCount[ecoregion]++; } foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { if (EcoregionData.AET[ecoregion] <= 0.0 && ecoregion.Active) { PlugIn.ModelCore.UI.WriteLine(" CAUTION: Ecoregion {0} has AET set to zero.", ecoregion.Name); } } }
//--------------------------------------------------------------------- public static void Initialize(IInputParameters parameters) { AET = parameters.AET; MinRelativeBiomass = parameters.MinRelativeBiomass; B_MAX = new Landis.Library.Parameters.Ecoregions.AuxParm<int>(PlugIn.ModelCore.Ecoregions); ActiveSiteCount = new Landis.Library.Parameters.Ecoregions.AuxParm<int>(PlugIn.ModelCore.Ecoregions); foreach (ActiveSite site in PlugIn.ModelCore.Landscape) { IEcoregion ecoregion = PlugIn.ModelCore.Ecoregion[site]; ActiveSiteCount[ecoregion]++; } foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { if (EcoregionData.AET[ecoregion] <= 0.0 && ecoregion.Active) { PlugIn.ModelCore.UI.WriteLine(" CAUTION: Ecoregion {0} has AET set to zero.", ecoregion.Name); } } }
public static void Initialize() { soiltype = (Landis.Library.Parameters.Ecoregions.AuxParm<string>)(Parameter<string>)PlugIn.GetParameter("SoilType"); climateFileName = (Landis.Library.Parameters.Ecoregions.AuxParm<string>)(Parameter<string>)PlugIn.GetParameter("ClimateFileName"); rootingdepth = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("RootingDepth", 0, 1000); precintconst = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("PrecIntConst", 0, 1); preclossfrac = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("PrecLossFrac", 0, 1); snowsublimfrac = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("SnowSublimFrac", 0, 1); wythers = ((Parameter<bool>)PlugIn.GetParameter("Wythers")).Value; dtemp = ((Parameter<bool>)PlugIn.GetParameter("DTemp")).Value; leakagefrac = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter("LeakageFrac", 0, 1); AllEcoregions = new Dictionary<IEcoregion, IEcoregionPnET>(); foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { AllEcoregions.Add(ecoregion, new EcoregionPnET(ecoregion)); } all_values = new Dictionary<IEcoregionPnET, Dictionary<DateTime, IEcoregionPnETVariables>>(); foreach (IEcoregionPnET ecoregion in EcoregionPnET.AllEcoregions.Values) { all_values[ecoregion] = new Dictionary<DateTime, IEcoregionPnETVariables>(); } }
public static void Initialize() { Parameter<string> PressureHeadCalculationMethod = null; if (PlugIn.TryGetParameter(Names.PressureHeadCalculationMethod, out PressureHeadCalculationMethod)) { Parameter<string> p = PlugIn.GetParameter(Names.PressureHeadCalculationMethod); if (p.Value == Names.VanGenuchten) Pressureheadtable = new PressureHeadVanGenuchten(); else if (PlugIn.GetParameter(Names.PressureHeadCalculationMethod).Value == Names.SaxtonAndRawls) Pressureheadtable = new PressureHeadSaxton_Rawls(); else { string msg = "Unknown presciption for calculating pressurehead, value for " + Names.PressureHeadCalculationMethod + " can be "+ Names.VanGenuchten+" or " + Names.SaxtonAndRawls; throw new System.Exception(msg); } } else { string msg = "Missing presciption for calculating pressurehead, expected keyword " + Names.PressureHeadCalculationMethod + " in " + PlugIn.GetParameter(Names.PnETGenericParameters).Value + " or in " + PlugIn.GetParameter(Names.ExtensionName).Value; throw new System.Exception(msg); } WiltPnt = new Library.Parameters.Ecoregions.AuxParm<float>(PlugIn.ModelCore.Ecoregions); FieldCap = new Library.Parameters.Ecoregions.AuxParm<float>(PlugIn.ModelCore.Ecoregions); Porosity = new Library.Parameters.Ecoregions.AuxParm<float>(PlugIn.ModelCore.Ecoregions); SoilType = (Landis.Library.Parameters.Ecoregions.AuxParm<string>)PlugIn.GetParameter(Names.SoilType); PlugIn.ModelCore.UI.WriteLine("Eco\tSoilt\tWiltPnt\tFieldCap(mm)\tFC-WP\tPorosity"); foreach (IEcoregion eco in PlugIn.ModelCore.Ecoregions) if (eco.Active) { // takes PH (MPa) // Calculates water content (m3H2O/m3 SOIL) // Water content at field capacity (calculated as an output variable) // −33 kPa (or −0.33 bar) // mH2O value = kPa value x 0.101972 FieldCap[eco] = (float)Hydrology.Pressureheadtable.CalculateWaterContent((ushort)3.36, SoilType[eco]) * eco.RootingDepth(); WiltPnt[eco] = (float)Hydrology.Pressureheadtable.CalculateWaterContent((ushort)150, SoilType[eco]) * eco.RootingDepth(); Porosity[eco] = (float)Hydrology.Pressureheadtable.Porosity(eco.RootingDepth(), SoilType[eco]); float f = FieldCap[eco] - WiltPnt[eco]; PlugIn.ModelCore.UI.WriteLine(eco.Name + "\t" + SoilType[eco] + "\t" + WiltPnt[eco] + "\t" + FieldCap[eco] + "\t" + f + "\t" + Porosity[eco] ); } }
//--------------------------------------------------------------------- public PressureHeadSaxton_Rawls() { Landis.Library.Parameters.Ecoregions.AuxParm <string> SoilType = (Landis.Library.Parameters.Ecoregions.AuxParm <string>)PlugIn.GetParameter(Names.SoilType); Landis.Library.Parameters.Ecoregions.AuxParm <float> RootingDepth = (Landis.Library.Parameters.Ecoregions.AuxParm <float>)(Parameter <float>) PlugIn.GetParameter(Names.RootingDepth, 0, float.MaxValue); table = new Library.Parameters.Ecoregions.AuxParm <float[]>(PlugIn.ModelCore.Ecoregions); Sand = PlugIn.GetParameter("sand"); Clay = PlugIn.GetParameter("clay"); PctOM = PlugIn.GetParameter("pctOM"); DensFactor = PlugIn.GetParameter("densFactor"); Gravel = PlugIn.GetParameter("gravel"); foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) { if (ecoregion.Active) { List <float> PressureHead = new List <float>(); if (tensionB.ContainsKey(SoilType[ecoregion]) == false) { double sand = double.Parse(Sand[SoilType[ecoregion]]); double clay = double.Parse(Clay[SoilType[ecoregion]]); double pctOM = double.Parse(PctOM[SoilType[ecoregion]]); double densFactor = double.Parse(DensFactor[SoilType[ecoregion]]); double gravel = double.Parse(Gravel[SoilType[ecoregion]]); // Moisture at wilting point double predMoist1500 = -0.024 * sand + 0.487 * clay + 0.006 * pctOM + 0.005 * sand * pctOM - 0.013 * clay * pctOM + 0.068 * sand * clay + 0.031; double predMoist1500adj = predMoist1500 + 0.14 * predMoist1500 - 0.02; // Moisture at field capacity double predMoist33 = -0.251 * sand + 0.195 * clay + 0.011 * pctOM + 0.006 * sand * pctOM - 0.027 * clay * pctOM + 0.452 * sand * clay + 0.299; double predMoist33Adj = predMoist33 + (1.283 * predMoist33 * predMoist33 - 0.374 * predMoist33 - 0.015); double porosMoist33 = 0.278 * sand + 0.034 * clay + 0.022 * pctOM - 0.018 * sand * pctOM - 0.027 * clay * pctOM - 0.584 * sand * clay + 0.078; double porosMoist33Adj = porosMoist33 + (0.636 * porosMoist33 - 0.107); double satPor33 = porosMoist33Adj + predMoist33Adj; double satSandAdj = -0.097 * sand + 0.043; double sandAdjSat = satPor33 + satSandAdj; double density_OM = (1.0 - sandAdjSat) * 2.65; double density_comp = density_OM * (densFactor); porosity_OM_comp.Add(SoilType[ecoregion], (float)(1.0 - (density_comp / 2.65))); double porosity_change_comp = (1.0 - density_comp / 2.65) - (1.0 - density_OM / 2.65); double moist33_comp = predMoist33Adj + 0.2 * porosity_change_comp; double porosity_moist33_comp = porosity_OM_comp[SoilType[ecoregion]] - moist33_comp; double lambda = (Math.Log(moist33_comp) - Math.Log(predMoist1500adj)) / (Math.Log(1500) - Math.Log(33)); double gravel_red_sat_cond = (1.0 - gravel) / (1.0 - gravel * (1.0 - 1.5 * (density_comp / 2.65))); double satcond_mmhr = 1930 * Math.Pow((porosity_moist33_comp), (3.0 - lambda)) * gravel_red_sat_cond; double gravels_vol = ((density_comp / 2.65) * gravel) / (1 - gravel * (1 - density_comp / 2.65)); double bulk_density = gravels_vol * 2.65 + (1 - gravels_vol) * density_comp; // g/cm3 tensionB.Add(SoilType[ecoregion], (float)((Math.Log(1500) - Math.Log(33.0)) / (Math.Log(moist33_comp) - Math.Log(predMoist1500adj)))); tensionA.Add(SoilType[ecoregion], (float)Math.Exp(Math.Log(33.0) + (tensionB[SoilType[ecoregion]] * Math.Log(moist33_comp)))); // For Permafrost clayProp.Add(SoilType[ecoregion], (float)clay); double cTheta_temp = Constants.cs * (1.0 - porosity_OM_comp[SoilType[ecoregion]]) + Constants.cw * porosity_OM_comp[SoilType[ecoregion]]; //specific heat of soil kJ/m3/K cTheta.Add(SoilType[ecoregion], (float)cTheta_temp); double lambda_s_temp = (1.0 - clay) * Constants.lambda_0 + clay * Constants.lambda_clay; //thermal conductivity soil kJ/m/d/K lambda_s.Add(SoilType[ecoregion], (float)lambda_s_temp); double Fs_temp = ((2.0 / 3.0) / (1.0 + Constants.gs * ((lambda_s_temp / Constants.lambda_w) - 1.0))) + ((1.0 / 3.0) / (1.0 + (1.0 - 2.0 * Constants.gs) * ((lambda_s_temp / Constants.lambda_w) - 1.0))); //ratio of solid temp gradient Fs.Add(SoilType[ecoregion], (float)Fs_temp); } double watercontent = 0.0; float pressureHead = float.MaxValue; while (pressureHead > 0.01) { pressureHead = CalculateWaterPressure(watercontent, SoilType[ecoregion]); PressureHead.Add(pressureHead); watercontent += 0.01; } table[ecoregion] = PressureHead.ToArray(); } } }
public PressureHeadSaxton_Rawls() { Landis.Library.Parameters.Ecoregions.AuxParm<string> SoilType = (Landis.Library.Parameters.Ecoregions.AuxParm<string>)PlugIn.GetParameter(Names.SoilType); Landis.Library.Parameters.Ecoregions.AuxParm<float> RootingDepth = (Landis.Library.Parameters.Ecoregions.AuxParm<float>)(Parameter<float>)PlugIn.GetParameter(Names.RootingDepth, 0, float.MaxValue); table = new Library.Parameters.Ecoregions.AuxParm<ushort[]>(PlugIn.ModelCore.Ecoregions); Sand = PlugIn.GetParameter("sand"); Clay = PlugIn.GetParameter("clay"); PctOM = PlugIn.GetParameter("pctOM"); DensFactor = PlugIn.GetParameter("densFactor"); Gravel = PlugIn.GetParameter("gravel"); foreach (IEcoregion ecoregion in PlugIn.ModelCore.Ecoregions) if (ecoregion.Active) { List<ushort> PressureHead = new List<ushort>(); if (tensionB.ContainsKey(SoilType[ecoregion]) == false) { double sand = double.Parse(Sand[SoilType[ecoregion]]); double clay = double.Parse(Clay[SoilType[ecoregion]]); double pctOM = double.Parse(PctOM[SoilType[ecoregion]]); double densFactor = double.Parse(DensFactor[SoilType[ecoregion]]); double gravel = double.Parse(Gravel[SoilType[ecoregion]]); // Moisture at wilting point double predMoist1500 = -0.024 * sand + 0.487 * clay + 0.006 * pctOM + 0.005 * sand * pctOM - 0.013 * clay * pctOM + 0.068 * sand * clay + 0.031; double predMoist1500adj = predMoist1500 + 0.14 * predMoist1500 - 0.02; // Moisture at field capacity double predMoist33 = -0.251 * sand + 0.195 * clay + 0.011 * pctOM + 0.006 * sand * pctOM - 0.027 * clay * pctOM + 0.452 * sand * clay + 0.299; double predMoist33Adj = predMoist33 + (1.283 * predMoist33 * predMoist33 - 0.374 * predMoist33 - 0.015); double porosMoist33 = 0.278 * sand + 0.034 * clay + 0.022 * pctOM - 0.018 * sand * pctOM - 0.027 * clay * pctOM - 0.584 * sand * clay + 0.078; double porosMoist33Adj = porosMoist33 + (0.636 * porosMoist33 - 0.107); double satPor33 = porosMoist33Adj + predMoist33Adj; double satSandAdj = -0.097 * sand + 0.043; double sandAdjSat = satPor33 + satSandAdj; double density_OM = (1 - sandAdjSat) * 2.65; double density_comp = density_OM * (densFactor); porosity_OM_comp.Add(SoilType[ecoregion], (float)(1 - (density_comp / 2.65))); double porosity_change_comp = (1 - density_comp / 2.65) - (1 - density_OM / 2.65); double moist33_comp = predMoist33Adj + 0.2 * porosity_change_comp; double porosity_moist33_comp = porosity_OM_comp[SoilType[ecoregion]] - moist33_comp; double lambda = (Math.Log(moist33_comp) - Math.Log(predMoist1500adj)) / (Math.Log(1500) - Math.Log(33)); double gravel_red_sat_cond = (1 - gravel) / (1 - gravel * (1 - 1.5 * (density_comp / 2.65))); double satcond_mmhr = 1930 * Math.Pow((porosity_moist33_comp), (3 - lambda)) * gravel_red_sat_cond; tensionB.Add(SoilType[ecoregion], (float)((Math.Log(1500) - Math.Log(33)) / (Math.Log(moist33_comp) - Math.Log(predMoist1500adj)))); tensionA.Add(SoilType[ecoregion], (float)Math.Exp(Math.Log(33) + (tensionB[SoilType[ecoregion]] * Math.Log(moist33_comp)))); } double watercontent = 0.0; ushort pressureHead = ushort.MaxValue; while (pressureHead > 0) { pressureHead = CalculateWaterPressure(watercontent / RootingDepth[ecoregion], SoilType[ecoregion]); PressureHead.Add(pressureHead); watercontent +=1.0; } table[ecoregion] = PressureHead.ToArray(); } }