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() { 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 Initialize() { Parameter <string> PressureHeadCalculationMethod = null; if (PlugIn.TryGetParameter(Names.PressureHeadCalculationMethod, out PressureHeadCalculationMethod)) { Parameter <string> p = PlugIn.GetParameter(Names.PressureHeadCalculationMethod); pressureheadtable = new PressureHeadSaxton_Rawls(); } 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); } PlugIn.ModelCore.UI.WriteLine("Eco\tSoilt\tWiltPnt\tFieldCap(mm)\tFC-WP\tPorosity"); foreach (IEcoregionPnET eco in EcoregionPnET.Ecoregions) { if (eco.Active) { // Volumetric water content (mm/m) at field capacity // −33 kPa (or −0.33 bar) // Convert kPA to mH2o (/9.804139432) = 3.37 eco.FieldCap = (float)pressureheadtable.CalculateWaterContent(33, eco.SoilType); // Volumetric water content (mm/m) at wilting point // −1500 kPa (or −15 bar) // Convert kPA to mH2o (/9.804139432) = 153.00 eco.WiltPnt = (float)pressureheadtable.CalculateWaterContent(1500, eco.SoilType); // Volumetric water content (mm/m) at porosity eco.Porosity = (float)pressureheadtable.Porosity(eco.SoilType); float f = eco.FieldCap - eco.WiltPnt; PlugIn.ModelCore.UI.WriteLine(eco.Name + "\t" + eco.SoilType + "\t" + eco.WiltPnt + "\t" + eco.FieldCap + "\t" + f + "\t" + eco.Porosity); } } }
//--------------------------------------------------------------------- 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(); } } }