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); } }
public WriteVolumeTable() { this.TimberValue = TimberValue.Default; }