#include <StormDamageApplier.h>
Public Member Functions | |
clStormDamageApplier (clSimManager *p_oSimManager) | |
Constructor. | |
~clStormDamageApplier () | |
Destructor. | |
void | RegisterTreeDataMembers () |
Registers the "stm_dmg" tree data member. | |
void | GetData (xercesc::DOMDocument *p_oDoc) |
Does behavior setup. | |
void | Action () |
Applies storm damage to trees. | |
Protected Member Functions | |
void | GetParameterFileData (xercesc::DOMDocument *p_oDoc) |
Reads parameter file data. | |
void | FormatQueryString () |
Formats the string in m_cQuery. | |
Protected Attributes | |
clGridBase * | mp_oStormDamageGrid |
Pointer to the "Storm Damage" grid. | |
char * | m_cQuery |
String to pass to clTreePopulation::Find() in order to get the trees to apply damage to. | |
float * | mp_fMinStormDBH |
The minimum DBH, in cm, for trees that can be damaged by storms. | |
float * | mp_fStmDmgInterceptMed |
Storm damage intercept for medium damage (a). | |
float * | mp_fStmDmgInterceptFull |
Storm damage intercept for complete damage (a). | |
float * | mp_fStmIntensityCoeff |
Storm intensity coefficient (b). | |
float * | mp_fStmDBHCoeff |
Storm DBH coefficient (d). | |
int ** | mp_iStmDmgCodes |
Return codes for the "stm_dmg" int tree data member. | |
int | m_iNumYearsToHeal |
Number of years damaged trees stay damaged. | |
int | m_iNumTypes |
Number of total types (despite the fact that this behavior won't deal with all of them). | |
int | m_iDmgIndexCode |
Return code for the "1dmg_index" float data member of the "Storm Damage" grid. |
The damage applier manages the population of trees that are storm-damaged. It adds new trees to the damaged population after storms have occurred, and removes trees from the damaged population (back to the healthy population) by keeping track of the time they have been damaged until a maximum has been reached. This behavior also keeps track of the damage category into which each tree falls (no damage, medium damage, and heavy damage).
Whether storms have occurred is assessed by clStorm. This behavior uses the values in the "Storm Damage" grid for storm severity, with 0 meaning that no storm has occurred.
A given tree's probability of damage in a given damage category is
There is a minimum DBH for which to apply storms for each species. Set this to zero if storms apply to all trees.
This behavior will use a random number to determine what damage category a tree falls in. If rand <= P(d0), it's undamaged. If P(d0) < rand <= P(d1), it has medium damage. If P(d1) < rand <= 1, it has heavy damage.
If a tree is damaged, a flag is set with the damage category. Then a counter is set to count the time since damage. When the counter reaches the number of years that it takes a damaged tree to heal, the tree is undamaged once again.
If a live tree is already damaged and is damaged again (and survives again), it gets the most severe damage category that can apply to it and the damage counter is reset to the max time for tree healing again.
This behavior adds one tree data member: an int, "stm_dmg", which holds both the damage category and the amount of time left to heal. The possible damage category values are 0, 1, and 2 (no damage, medium damage, full damage). The value in stm_dmg will be x*1000 + count, where x is the damage category and count is the number of years since damage. So a full-damaged tree with 5 years on its counter has a stm_dmg value of 2005, and a medium-damaged tree with 8 years on its counter has a stm_dmg value of 1008. If a tree is undamaged, the value will be 0.
This behavior cannot be applied to seedlings. It can be applied to snags but they will be ignored. This is potentially a good tactic though, to allow clStormKiller to deal with snags.
The call string for this is "storm damage applier".
Edit history:
-----------------
September 29, 2004 - Created (LEM)
April 1, 2005 - Added the ability to kill trees and upgraded to version 1.1 (LEM)
Added all this snag stuff and upgrated to version 2.0
December 21, 2005 - Removed all the tree killing stuff to the clStormKiller class, and reduced the version number back to 1.0, since nobody has actually used it in production yet. (LEM)
May 30, 2007 - Updated to support multiple storm packages and set version to 1.1 (LEM)
clStormDamageApplier::clStormDamageApplier | ( | clSimManager * | p_oSimManager | ) |
clStormDamageApplier::~clStormDamageApplier | ( | ) |
Destructor.
void clStormDamageApplier::RegisterTreeDataMembers | ( | ) | [virtual] |
Registers the "stm_dmg" tree data member.
modelErr | if this behavior has been applied to seedlings. |
Reimplemented from clBehaviorBase.
void clStormDamageApplier::GetData | ( | xercesc::DOMDocument * | p_oDoc | ) | [virtual] |
Does behavior setup.
It calls GetParameterFileData() to read in values from the parameter file. Then it calls FormatQueryString(). Then it gets a pointer to the "Storm Damage" grid.
p_oDoc | Parsed parameter file. |
modelErr | if the "Storm Damage" grid has not been created. |
Implements clWorkerBase.
void clStormDamageApplier::Action | ( | ) | [virtual] |
Applies storm damage to trees.
It uses the value in m_cQuery to get the trees to which this behavior applies. Then, for each tree, it will assess its damage based on the damage equation.
If a tree got no new damage but had existing damage, the healing time counter is reset to 0.
Reimplemented from clBehaviorBase.
void clStormDamageApplier::GetParameterFileData | ( | xercesc::DOMDocument * | p_oDoc | ) | [protected] |
Reads parameter file data.
p_oDoc | Parsed parameter file. |
modelErr | if the value for m_iNumYearsToHeal is not greater than 0. |
void clStormDamageApplier::FormatQueryString | ( | ) | [protected] |
Formats the string in m_cQuery.
This value will be used in Action() to pass to clTreePopulation::Find() in order to get the trees to act on.
clGridBase* clStormDamageApplier::mp_oStormDamageGrid [protected] |
Pointer to the "Storm Damage" grid.
This grid is created by clStorm.
char* clStormDamageApplier::m_cQuery [protected] |
String to pass to clTreePopulation::Find() in order to get the trees to apply damage to.
This will instigate a species/type search for all the species and types to which this behavior applies.
float* clStormDamageApplier::mp_fMinStormDBH [protected] |
The minimum DBH, in cm, for trees that can be damaged by storms.
Array size is total number of species. From the parameter file.
float* clStormDamageApplier::mp_fStmDmgInterceptMed [protected] |
Storm damage intercept for medium damage (a).
Array size is total number of species. From the parameter file.
float* clStormDamageApplier::mp_fStmDmgInterceptFull [protected] |
Storm damage intercept for complete damage (a).
Array size is total number of species. From the parameter file.
float* clStormDamageApplier::mp_fStmIntensityCoeff [protected] |
Storm intensity coefficient (b).
Array size is total number of species. From the parameter file.
float* clStormDamageApplier::mp_fStmDBHCoeff [protected] |
Storm DBH coefficient (d).
Array size is total number of species. From the parameter file.
int** clStormDamageApplier::mp_iStmDmgCodes [protected] |
Return codes for the "stm_dmg" int tree data member.
This is the data member that this behavior is adding. Array index one is sized m_iNumTypes; array index two is sized total number of species.
int clStormDamageApplier::m_iNumYearsToHeal [protected] |
Number of years damaged trees stay damaged.
From the parameter file.
int clStormDamageApplier::m_iNumTypes [protected] |
Number of total types (despite the fact that this behavior won't deal with all of them).
int clStormDamageApplier::m_iDmgIndexCode [protected] |
Return code for the "1dmg_index" float data member of the "Storm Damage" grid.