コード例 #1
0
        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>();
            }
        }
コード例 #2
0
        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]);
                    }
                }
            }
        }
コード例 #3
0
        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();
                }
            }
        }