Simulation Model

//Plugin pre-defined SBW disturbance program to modify

//growth and survival as a function of population and protection scenario

//OSM PluginCommand takes three arguments:

// 1) DLL file path to link into OSM,

// 2) Class NamespacePath.Name, and

// 3) Root Command Name user wants to use to access object proerties and methods

//Write("PluginCommand C:\FORUS\2020.2\x32\Forus.IOSM.dll Forus.IOSM.Cmds.DisturbanceSBW SBW")

# Spruce Budworm Disturbance Extension

This sub command object, which resides under SIMULATION.MODEL, provides access to the underlying stand-impact routines of the Spruce Budworm Decision Support System (MacLean et al 2001) with significant method upgrades over the past 20 years, including:

1) Reduced defoliation on spruce, especially red and black, relative to fir according to Hennigar et al. (200X); except for certain years when population levels are extreme.

2) Reduced defoliation with increasing stand (plot) hardwood content (Bo, Su); except for certain years when population levels are extreme.

3) Ability to input annual SBW population levels [larval 2nd instar (L2)/m2], with internal functions to predict defoliation on respective host species as a function of defoliation: population relationships, stand hardwood basal area ratio, and foliage protection assumptions.

4) Ability to alternatively to use annual stand-level defoliation levels (as in the original SBW DSS), but with auto-prorating of mean annual stand-level defoliation on to hosts (fir, white, red, and black spruce) as a function of their basal area and relative susceptibility to SBW defoliation; i.e., if the stand is composed half of fir and half of black spruce, then the fir will sustain more relative defoliation compared to the black spruce, but basal area weighted stand defoliation will still match aerially observed or projected input levels.

5) Preprogrammed ‘Moderate’ and ‘Severe’ SBW outbreak scenarios expressed in annual population levels. These population patterns were estimated from the original SBW DSS defoliation-based outbreak scenarios using the same defoliation: population relationships as discussed above, so outcomes should be similar.

6) Foliage protection efficacy assumptions and treatment options that can be modified easily.

Technical details of these assumptions and calculations are provided in OutbreakAssptions.xlsx. This Excel file demonstrates the effect of modifying some of the foliage protection assumptions on resulting host defoliation with linked equations among cells. These calculations are nearly identical to the calculation performed by the SBW extension. Growth multipliers & additive mortality rates as a function of host, tree size, and periodic average tree defoliation (aka cumulative defoliation in MacLean et al. 2001) are also provided. These tree impact: defoliation relationships have been modified slightly from the original SBW DSS to 1) use tree size (DBH class) as a surrogate for tree age (age is not a readily available attribute on all trees in most inventories), and 2) to predict impact rates with a non-linear equation rather than a lookup table for application coding/performance reasons.

This extension provides means to:

1) Submit and remember spruce budworm annual observations or projection scenarios of either:

a. Aerial current-shoot defoliation, OR

b. L2 populations

2) Automatically calculate host defoliation levels from annual L2 levels, with consideration of:

a. stand hardwood content,

b. natural enemy buildup during the outbreak,

c. foliage protection, and

d. host susceptibility to defoliation

3) Translate each ‘adjusted’ host’s annual current-shoot defoliation to cumulative whole tree defoliation according to the SBW DSS (MacLean et al. 2001, CJFR)

4) Predict, for annual or periodic simulation cycles,

a. tree % radial (DBH) growth loss, or

b. mortality rate (probability of tree death).

5) And finally, modify OSM base growth and mortality rates with these predictions during simulation for each host species

## Properties and Methods

##

Properties/Methods | Data Type | Constraint | Default | Description
Outbreak Definition
SetPopulationPattern | Text | ≥ 0 | None | Pre-coded outbreak patterns (MacLean et al. 2001): · Moderate (based on 1980s NB ‘Normal’ Outbreak) · Severe (based on 1970s Cape Breton, NS) · None (no outbreak) Defoliation is calculated as a function of L2 values, host susceptibility, foliage protection properties. · See OutbreakAssptions.xlsx
SetPopulation | Float Array | ≥ 0 | 0 | Sets a user-defined annual population (L2/m2) sequence for an outbreak. Defoliation is calculated as a function of L2 values, host susceptibility, foliage protection properties. · See OutbreakAssptions.xlsx
SetDefoliation | Float Array | 0 – 100 | 0 | Sets a user-defined annual current-shoot defoliation (%) sequence for an outbreak. Annual defoliation levels are influenced by foliage protection. Defoliation is assumed to be actual observed levels or already modified by the user to account for protection, if any. If set, then any previously set population pattern is set to 0.
OutbreakOffset | Int32 | -5 – 100 | 0 | Number of years to offset the start of the outbreak pattern; e.g., A value of -5 causes the outbreak pattern to shift backward five years from the start year of the simulation, and likewise end five years sooner.
Foliage protection
ProtectFoliage | Boolean | TRUE|FALSE | FALSE | Turn all foliage protection methods on (TRUE) or off (FALSE).
ProtectEfficacy | Float | 0 – 1 | 0.5 (50%) | Ratio of L2 that will die as a result of foliage protection. 1 = 100% effective and 100% L2 mortality. Single applications of Btk and Mimic efficacies vary in the range of 40-60%. Double or triple applications may assume higher protection levels.
ProtectionThreshold | Float | ≥ 0 | 40 (40%) | Percent annual current-year shoot defoliation on balsam fir that would trigger a foliage protection treatment.
ProtectionDelay | Float | ≥ 0 | 0 (none) | Number of years to delay protection once eligible; default = 1 (skip first eligible year); if = 0, protection will occur in first eligible year.
ProtectionLock | Float | ≥ 0 | 0 (none) | If set >= 0, this value may override record weights used in some model calibration routines; e.g., local height calibration. See local height calibration for guidance on setting weights.
EndophyteEfficacy_WS (beta) | Float | 0 – 1 | 0 (none) | Height to tree top kill in meters or feet. Must be <= HT. If < HT, then a new leader is assumed to have established between HTK and HT.

* Required

‡ DBH and HT cannot both be null or zero.

If HT < breast height (must be seedling), then DBH must = zero or blank (NaN);

else if HT is >= breast height (must be tree), then DBH must be > zero.

If DBH is > zero, then HT must be >= breast height or missing (blank or zero); if HT is missing, HT will be predicted from DBH.

##

//You can now implement the methods and properties of this class to control the SBW disturbance

Write(" SetPopulationPattern Moderate") //NB during last outbreak (Maclean et al. 2001)

//Write("SBW.SetPopulationPattern Severe") //Cape Breton during last outbreak (Maclean et al. 2001)

//-------- Other SBW COMMANDS ------

//Manually set annual population sequence of L2/m2

//This one is for the moderate outbreak scenario

Write(" SetPopulation 20.00 20.51 21.05 21.62 22.22 80.00 105.88 225.00 112.50 103.23 106.67 96.55 57.14 14.81 15.38 16.00")

//Number of years to offset the start of the outbreak; must be between -5 and 100; default = 0,

//where outbreak starts in year one of the simualtion

Write(" OutbreakOffset 0")

//Protection rules do not consider L2 adjustments for HW, natural enemey build up over time, or host susceptibility.

//Protect foliage; default = false.

Write(" ProtectFoliage FALSE")

/// Protection efficacy; default = 0.5 (50%); must be between 0 and 1.

Write(" ProtectionEfficacy 0.5")

//Protection application threshold; default = all years when forecast L2 or fir defoliation > 40%

//State threshold as L2/m2 when using population L2 levels.

//State a percentage threshold for balsam fir between 0-100 when using stand defolaition levels

Write(" ProtectionThreshold 40")

/// Number of years to delay protection once eligible; default = 1 (skip first eligible year);

/// if = 0, protection will occur in first eligible year.

/// Must be >= 0.

Write(" ProtectionDelay 1")

/// Number of years to skip between treatments; default = 0 (all years);

/// if = 1, protection will occur every second year.

/// Must be >= 0.

Write(" ProtectionLock 0")

//To deactivate SBW disturbance

//Write(" SetPopulationPattern None")

##

##

##

## Examples

### Moderate outbreak

SIMULATION.MODEL.SBW.SetPopulationPattern Moderate

### Severe outbreak

SIMULATION.MODEL.SBW.SetPopulationPattern Severe

### Severe outbreak beginning 5 years before start of simulation

SIMULATION.MODEL.SBW.SetPopulationPattern Severe

SIMULATION.MODEL.SBW.OutbreakOffset -5

### Deactivate outbreak

SIMULATION.MODEL.SBW.SetPopulationPattern None

### User-defined outbreak with annual population (L2/m2) series (16 years, starting in year 1 of simulation)

SIMULATION.MODEL.SBW.SetPopulation 20.00 20.51 21.05 21.62 22.22 80.00 105.88 225.00 112.50 103.23 106.67 96.55 57.14 14.81 15.38 16.00

### Severe outbreak with foliage protection

SIMULATION

MODEL

SBW

SetPopulationPattern Severe

ProtectFoliage TRUE

### Severe outbreak with foliage protection assumption adjustments

SIMULATION

MODEL

SBW

SetPopulationPattern Severe

ProtectFoliage TRUE

ProtectionEfficacy 0.6

ProtectionThreshold 50

ProtectionDelay 2

ProtectionLock 0

}

}

##

##

## Local height calibration

The abstract HeightModel available to developers through the OSM API provides methods to locally calibrate height predictions. If Variant developers choose to inherit methods from this pre-defined abstract height model, the following height calibration interface will be exposed through the HeightModel property Calibration.

The calibration method compares any available height observations imported from tree records against predicted heights by species. Ordinary least squares are used to solve for a modifier that would best align predictions to observations by species.

Any trees with missing heights on import will have heights predicted. If during prediction a species modifier is available, it will be multiplied against the predicted value before assigning the height to the tree. Use of the modifier is constrained by the species DBH range (+/- 5 cm) of height observations used to develop the modifier; e.g., if all white spruce height observations come from DBH between 15 and 20 cm, then OSM will only allow the height modifier to be applied to 10 – 25 cm DBH white spruce trees. This DBH constraint is especially important when all height trees are small, but one or more large trees with missing heights also exist in the plot. We would not want to apply the modifier developed from very small trees to very large trees.

The calibration only remains in effect while estimating tree heights before the simulation begins. Ingrowth will not be affected by this calibration.

### Properties

1) Enabled True | False

By default, local height calibration is on if available. Set to FALSE if you want to turn off automatic local calibration.

2) MaxAbsoluteModifier Double [Default = 0.5]

Maximum absolute multiplier permitted. In other words, modifiers that alter predictions by more than +/-50% should be ignored.

3) MinObservations Int32 [Default = 5; Must be ≥1]

Minimum observations per species required before a species modifier will be calculated. Reducing below 5 is not recommended unless you are averaging results for 10 or more stands. Note that with few observations, individual stand projections may become worse. It is important that heights come from a random tree sub-sample to avoid correction bias.

4) WeightMode Text Code [Default = BA]

Controls tree record weighting approach used when calculating height equation modifier value.

Modes:

· BA Tree record weight = basal area per hectare of tree record.

· Stems Tree record weight = density per hectare of tree record.

### Manually Setting Weights on Individual Tree Height Samples

Height observation sample ‘weights’ can be specified for each tree record manually in the OSM_TreeList table using the optional column ‘Weight’. User-defined w eights can be assigned to individual trees in OSM_TreeList in order to 1) properly calculate stand-level Lorey’s height and 2) properly weight self-calibration of the height model for a range of plot designs (fixed area vs. angle gauge). If any trees in the stand have a weight assigned > 0, then the user specified weights in the TreeList.Weight column will override the OSM generated weights set from WeightMode. When the Weight column is used, any trees with a weight set to null or zero will be ignored when counting height samples and will also be ignored when setting the min-max DBH range over which the height modifier can operate. Setting weight to null or zero is recommended in cases when the tree top is broken or dead, unless the majority of tops are known to be broken or dead.

#### Guidance on setting Weights for different plot designs

When localizing height predictions through OSM’s automatic self-calibration routine, reducing height bias in large trees is usually more important than small trees, given preference toward accurate volume estimates. Therefore, most users weight an individual height observation by the basal-area per hectare that each tree height observation represents (i.e., BAF = basal area factor). In the case of a simple variable-radius plot, weight = 1 for all trees, as trees are already selected with probability proportional to basal area. In the case of fixed-radius plots, weight = 0.00007854*DBH2. If the sample is a tally, then the number of trees tallied per DBH class should be multiplied by the weight.

In the case of complex plot designs, such as the New Brunswick Continuous Forest Inventory (NB-CLI), where tree heights are collected from multiple sampling strategies nested together, calculation of tree weights becomes slightly more involved. For example, the NB-CLI plot design contains the following samples:

1) A fixed-area large tree plot (400 m2) used to record Species and DBH ≥ 7cm.

2) A variable-radius (BAF = 2M) plot used to subsample heights ≥ 7 cm, including heights falling outside the boundary of the fixed 400 m2 large tree plot.

3) A fixed-radius small tree plot (50 m2) used to record Species and DBH between 1 and < 7 cm, with height sampled on every tenth tree.

In the case of NB-CLI plots, weight for individual height observations ≥ 7 cm DBH would always be 2 (2M BAF), while weight (W) for individual height observations < 7 cm DBH would vary by DBH:

, where BAFi is the basal area per hectare expansion factor for height tree i in the small tree fixed-area plot with consideration that only 1 in every 10 trees is measured for height.

For example, weights are calculated for the following DBH values for the NB-CLI plots as follows:

DBH | Weight (BAF)
1.00 | 0.16
3.00 | 1.41
6.00 | 5.65
6.99 | 7.67
7.00 | 2.00
10.00 | 2.00
25.00 | 2.00
100.00 | 2.00

In the OSM Acadian model (version 1.19.6.2) a Lorey’s height (LHT) estimate for the entire plot is calculated in OSM to boost accuracy of the Variant’s height predictions using only the observed height (H) trees as:

If weight is not explicitly assigned in the OSM_TreeList, then OSM will assume the plot is a fixed-radius plot and weight height samples using Stems (tree factor) * DBH2 * 0.00007854. This default weighting will yield incorrect LHT estimates for the CLI plots, and hence incorrect height estimates for the Acadian Variant model. Knowing how your OSM variant predicts tree size, growth, and survival is obviously important here. Consult variant documentation for calibration details and calibration updates.

#### What if I have heights collected outside the plot that could be useful for height calibration?

If you have a few height samples representative of the stand or plot that fall outside the sample frame, they can be included with the plot’s tree records in OSM_TreeList by setting the records ‘Stems’ column to a very small number (e.g., 0.000001; must be > 0) and manually specifying weights for both plot records and external height sample records. In this way, the tree is considered in the plot by OSM, but has such a small tree factor that it will not make a difference in volume summaries or simulation results.

If you have a very large number of height tree samples from a local area that you want to use to calibrate the height model, then a better approach would be to calibrate local species-height modifiers using the OSM.Simulation.Model.Calibrator.

#### A Note about Tree Agitation

OSM takes into consideration the possibility that tree records may have been agitated when calculating number of user height observations in the tree list. If five height observations are required for local calibration, and partitioning increases observed height observations from say 3 to 9, local calibration will still not occur as the actual number of tree height observations is less than five. Also, since tree Weight property values are divided by partitions, weight integrity is preserved across all tree records. Therefore there should be no adverse effects of tree agitation on local height calibration.

## Example

SIMULATION

MODEL

HEIGHTMODEL

CALIBRATION

Enabled TRUE

MaxAbsoluteModifier 0.5

MinObservations 5