コード例 #1
0
ファイル: Mathematics.cs プロジェクト: OSU-MARS/SEEM
        public void VolumeTaper()
        {
            List <ExpectedTreeVolume> trees = new List <ExpectedTreeVolume>()
            {
                // trees very near height and diameter class breaks may estimate differently between metric and English due to numerical precision
                new ExpectedTreeVolume()
                {
                    Species         = FiaCode.PseudotsugaMenziesii,
                    Dbh             = 19.4F,
                    Height          = 21.2F,
                    ExpansionFactor = 1.0F,
                    MinimumMerchantableStemVolumeFraction = 0.51F,
                    MinimumRegenVolumeCubic    = 0.172F,
                    MinimumRegenVolumeScribner = 29.999F,
                    MinimumThinVolumeCubic     = 0.154F,
                    MinimumThinVolumeScribner  = 29.999F
                },
                new ExpectedTreeVolume()
                {
                    Species         = FiaCode.PseudotsugaMenziesii,
                    Dbh             = 30.01F,
                    Height          = 30.01F,
                    ExpansionFactor = 0.36F,
                    MinimumMerchantableStemVolumeFraction = 0.91F,
                    MinimumRegenVolumeCubic    = 0.860F,
                    MinimumRegenVolumeScribner = 119.999F,
                    MinimumThinVolumeCubic     = 0.839F,
                    MinimumThinVolumeScribner  = 119.999F
                },
                new ExpectedTreeVolume()
                {
                    Species         = FiaCode.PseudotsugaMenziesii,
                    Dbh             = 46.2F,
                    Height          = 41.8F,
                    ExpansionFactor = 4.34F,
                    MinimumMerchantableStemVolumeFraction = 0.95F,
                    MinimumRegenVolumeCubic    = 2.64F,
                    MinimumRegenVolumeScribner = 419.999F,
                    MinimumThinVolumeCubic     = 2.66F,
                    MinimumThinVolumeScribner  = 469.999F
                }
            };

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            TimberValue timberValue = new TimberValue(false);

            stopwatch.Stop();
            TimeSpan timberValueTabulationTime = stopwatch.Elapsed;

            this.TestContext !.WriteLine("tabulation: {0:s\\.fff}s", timberValueTabulationTime);

            float volumeTolerance = 1.01F;

            foreach (ExpectedTreeVolume tree in trees)
            {
                float dbhInCentimeters = tree.Dbh;
                float heightInMeters   = tree.Height;
                Trees psmeEnglish      = new Trees(FiaCode.PseudotsugaMenziesii, 1, Units.English);
                psmeEnglish.Add(1, Constant.InchesPerCentimeter * dbhInCentimeters, Constant.FeetPerMeter * heightInMeters, 0.5F, tree.ExpansionFactor);
                Trees psmeMetric = new Trees(FiaCode.PseudotsugaMenziesii, 1, Units.Metric);
                psmeMetric.Add(1, dbhInCentimeters, heightInMeters, 0.5F, tree.ExpansionFactor);

                timberValue.ScaledVolumeRegenerationHarvest.GetScribnerVolume(psmeEnglish, out double regenScribner2SawEnglish, out double regenScribner3SawEnglish, out double regenScribner4SawEnglish);
                double regenScribnerEnglish = regenScribner2SawEnglish + regenScribner3SawEnglish + regenScribner4SawEnglish;
                timberValue.ScaledVolumeRegenerationHarvest.GetGradedVolume(psmeEnglish, out double regenCubic2SawEnglish, out double regenCubic3SawEnglish, out double regenCubic4SawEnglish, out regenScribner2SawEnglish, out regenScribner3SawEnglish, out regenScribner4SawEnglish);
                double regenCubicEnglish         = regenCubic2SawEnglish + regenCubic3SawEnglish + regenCubic4SawEnglish;
                double regenScribnerEnglishCheck = regenScribner2SawEnglish + regenScribner3SawEnglish + regenScribner4SawEnglish;

                timberValue.ScaledVolumeRegenerationHarvest.GetScribnerVolume(psmeMetric, out double regenScribner2SawMetric, out double regenScribner3SawMetric, out double regenScribner4SawMetric);
                double regenScribnerMetric = regenScribner2SawMetric + regenScribner3SawMetric + regenScribner4SawMetric;
                timberValue.ScaledVolumeRegenerationHarvest.GetGradedVolume(psmeMetric, out double regenCubic2SawMetric, out double regenCubic3SawMetric, out double regenCubic4SawMetric, out regenScribner2SawMetric, out regenScribner3SawMetric, out regenScribner4SawMetric);
                double regenCubicMetric         = regenCubic2SawMetric + regenCubic3SawMetric + regenCubic4SawMetric;
                double regenScribnerMetricCheck = regenScribner2SawMetric + regenScribner3SawMetric + regenScribner4SawMetric;

                timberValue.ScaledVolumeThinning.GetScribnerVolume(psmeEnglish, out double thinScribner2SawEnglish, out double thinScribner3SawEnglish, out double thinScribner4SawEnglish);
                double thinScribnerEnglish = thinScribner2SawEnglish + thinScribner3SawEnglish + thinScribner4SawEnglish;
                timberValue.ScaledVolumeThinning.GetGradedVolume(psmeEnglish, out double thinCubic2SawEnglish, out double thinCubic3SawEnglish, out double thinCubic4SawEnglish, out thinScribner2SawEnglish, out thinScribner3SawEnglish, out thinScribner4SawEnglish);
                double thinCubicEnglish         = thinCubic2SawEnglish + thinCubic3SawEnglish + thinCubic4SawEnglish;
                double thinScribnerEnglishCheck = thinScribner2SawEnglish + thinScribner3SawEnglish + thinScribner4SawEnglish;

                timberValue.ScaledVolumeThinning.GetScribnerVolume(psmeMetric, out double thinScribner2SawMetric, out double thinScribner3SawMetric, out double thinScribner4SawMetric);
                double thinScribnerMetric = thinScribner2SawMetric + thinScribner3SawMetric + thinScribner4SawMetric;
                timberValue.ScaledVolumeThinning.GetGradedVolume(psmeMetric, out double thinCubic2SawMetric, out double thinCubic3SawMetric, out double thinCubic4SawMetric, out thinScribner2SawMetric, out thinScribner3SawMetric, out thinScribner4SawMetric);
                double thinCubicMetric         = thinCubic2SawMetric + thinCubic3SawMetric + thinCubic4SawMetric;
                double thinScribnerMetricCheck = thinScribner2SawMetric + thinScribner3SawMetric + thinScribner4SawMetric;

                Assert.IsTrue(regenCubicEnglish == regenCubicMetric);
                Assert.IsTrue(regenScribnerEnglish == regenScribnerMetric);
                Assert.IsTrue(Math.Abs(regenScribnerEnglish - regenScribnerEnglishCheck) < 0.0001);
                Assert.IsTrue(Math.Abs(regenScribnerMetric - regenScribnerMetricCheck) < 0.0001);
                Assert.IsTrue(thinCubicEnglish == thinCubicMetric);
                Assert.IsTrue(thinScribnerEnglish == thinScribnerMetric);
                Assert.IsTrue(Math.Abs(thinScribnerEnglish - thinScribnerEnglishCheck) < 0.0001);
                Assert.IsTrue(Math.Abs(thinScribnerMetric - thinScribnerMetricCheck) < 0.0001);

                regenCubicMetric    /= tree.ExpansionFactor;
                regenScribnerMetric /= tree.ExpansionFactor;
                thinCubicMetric     /= tree.ExpansionFactor;
                thinScribnerMetric  /= tree.ExpansionFactor;

                Assert.IsTrue(thinCubicMetric >= tree.MinimumThinVolumeCubic);
                Assert.IsTrue(thinScribnerMetric >= tree.MinimumThinVolumeScribner);
                Assert.IsTrue(thinCubicMetric < volumeTolerance * tree.MinimumThinVolumeCubic);
                Assert.IsTrue(thinScribnerMetric < volumeTolerance * tree.MinimumThinVolumeScribner);

                Assert.IsTrue(regenCubicMetric >= tree.MinimumRegenVolumeCubic);
                Assert.IsTrue(regenScribnerMetric >= tree.MinimumRegenVolumeScribner);
                Assert.IsTrue(regenCubicMetric < volumeTolerance * tree.MinimumRegenVolumeCubic);
                Assert.IsTrue(regenScribnerMetric < volumeTolerance * tree.MinimumRegenVolumeScribner);

                // ratios must be greater than zero in principle but scaling and CVTS regression error allow crossover
                float poudelTotalCubic = OsuVolume.GetCubicVolume(psmeMetric, 0);
                poudelTotalCubic /= tree.ExpansionFactor;
                Assert.IsTrue(regenCubicMetric / poudelTotalCubic > tree.MinimumMerchantableStemVolumeFraction);
                Assert.IsTrue(thinCubicMetric / poudelTotalCubic > tree.MinimumMerchantableStemVolumeFraction);
                Assert.IsTrue(regenCubicMetric / poudelTotalCubic < 1.0F);
                Assert.IsTrue(thinCubicMetric / poudelTotalCubic < 1.0F);
            }
        }
コード例 #2
0
ファイル: WriteVolumeTable.cs プロジェクト: OSU-MARS/SEEM
 public WriteVolumeTable()
 {
     this.TimberValue = TimberValue.Default;
 }