## Acadian Variant Self-Thinning Model

Methods to calculate the self-thinning line relationship (maximum stand density index; SDI) are based on additive stocking line equations from Long and Daniel (1990). Maximum SDI models were developed by Chris Hennigar in 2015 following from methods outlined by Chris Woodall (2005), where max SDI (defined as the 99th percentile of SDI observations) was predicted as a function of basal area weighted species specific gravity for the stand. As first identified by Woodall, specific gravity is positively correlated with large crown architecture, which often negatively influences the maximum density capacity of different species per unit area. For example, cedar has low specific gravity, slender crowns, and supports very high basal area per hectare (max 70 m2/ha) compared to a tolerant hardwood stand (max 40-45 m2/ha) that has very large full crowns and dense wood to support those crowns. By calculating an average specific-gravity for the stand, weighted by basal area, we can make max SDI a dynamic function of the species composition of the stand, which is critically important to be able to do for the complexity of mixed-species stands in the Acadian Forest over time.

Data used to fit the model include approximately 30,000 stand timber cruises with between 3 and 200 variable radius (2M BAF) plots per stand from throughout New Brunswick’s forests, measured from 1980 to 2012 by the NB Department of Natural Resources and Crown Licensees.

Below is the verbatim C# code used to calculate max SDI, including code to calculate mean basal area weighted specific-gravity of the stand. Hennigar used specific gravity (metric) of tree bole wood at 12% moisture content according to the USDA FIA Database (2011) table 'REF_SPECIES'. The Acadian Variant also uses these specific gravity values. This is probably a close link to those values: https://www.fs.usda.gov/treesearch/pubs/34185

Self-thinning in the Acadian model, by default is set to occur at 85% of maximum SDI (A-line), as shown in the OSM C# code below (copied Nov 20th 2019). The A-line value can be modified with commands during simulation – see OSM.Simulation.Model. The max SDI equation below is used to calculate relative density measures for the stand, which can be reported, or used in operability and retention statements.

/// <summary>

/// Contains methods to build maximum stocking and basal area limits for Acadian stands.

/// </summary>

public static class AcadianStockingLineBuilder {

/// <summary>

/// Constructs a new maximum stocking line as a function of

/// maximum stand density index (SDI @25cm QMD) and

/// stand-level average tree specific gravity weighted by basal area.

/// <para>

/// This constraint was fit with, and is only applicable to, trees >=1cm.

/// Maximum SDI represents the 99th percentile of over observations in New Brunswick.

/// </para>

/// <para>

/// SDI is calculated using the summation method proposed by Long and Daniel (1990).

/// </para>

/// <param name="stand">Stand condition used to equate maximum SDI.</param>

/// </summary>

public static AdditiveStandDensityIndex GetMaxStandDensityRelationship_1cm(IStand stand) {

var mSG = GetMeanSpecificGravity(stand, 1);

double SDImax = 0;

if (mSG > 0)

//99th percentile >=1cm

SDImax = 4388.4 * Math.Pow(mSG, 2) - 6396 * mSG + 3107.6;

else

SDImax = 1000;

var stl = new AdditiveStandDensityIndex(1, SDImax, 25, -1.6);

stl.ALine = 0.85; // very close to 95th percentile density.

return stl;

}

This is the base (abstract) additive self-thinning class:

/// <summary>

/// Stocking line based on max SDI calculated using the summation approach.

/// </summary>

public class AdditiveStandDensityIndex :AdditiveStockingLine, IStandDensityIndex {

/// <summary>

/// Constructs the SDI relationship.

/// </summary>

/// <param name="minDBH">Minimum DBH considered in stocking calculations.</param>

/// <param name="maxSDI">Maximum stand density index.</param>

/// <param name="baseQMD">Base quadratic mean diameter for SDI.</param>

/// <param name="slope">Log slope of self-thinning line relationship.</param>

public AdditiveStandDensityIndex(double minDBH, double maxSDI, double baseQMD, double slope)

: base(minDBH, maxSDI, slope, FindLogIntercept(slope, baseQMD, maxSDI)) {

this.baseQMD = baseQMD;

}

readonly double baseQMD;

/// <summary>

/// Base quadratic mean diameter for SDI.

/// </summary>

public double BaseQMD {

get { return this.baseQMD; }

}

/// <summary>

/// Returns this tree's contribution to total stand stocking as: (DBH/BaseDBH)^LogSlope.

/// </summary>

/// <param name="tree">Tree</param>

/// <returns>Stocking contribution of <paramref name="tree"/> as an individual tree..</returns>

public override double GetStockingFactor(ITree tree) {

return Math.Pow(tree.DBH / this.baseQMD, -this.logSlope);

}

}

Below is the method to calculate stand specific gravity weighted by basal area, which is re-run at the start of each cycle to update max SDI.

static double GetMeanSpecificGravity(IStand stand, double minDBH) {

double SGm = 0; //Mean stand specific gravity

double totBA = 0;

foreach (var t in stand.GetTrees())

if (t.DBH >= minDBH) {

if (t.Species == PlantCodes.PIRE) {

//SG = 0.46 for red pine, but from testing in plantations this causes self-thinning way too early.

//Adjusted to wP SG of 0.36.

SGm += t.BA * t.Stems * 0.30;

} else {

SGm += t.BA * t.Stems * t.Species.Wood_SG_Dry;

}

totBA += t.BA * t.Stems;

} else

//assume ordered tree list.

break;

return totBA > 0 ? SGm / totBA : double.NaN;

}

There is also a basal-area based stocking line and another max SDI equation variant fit with only trees > 8.5 cm DBH that is enforced by the Acadian Model (not shown here). These additional density thresholds are used as double checks to make sure the stand does not get too dense, but are rarely needed during simulation. These additional density measures are not reported to the user and cannot be used to create treatment operability and retention constraints.

For complete OSM source code, download ILSpy, which allows you to decompile the OSM binaries (exe, dll files) to get access to the source code.