def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source: Doc.: Lizarralde I (2008). Dinámica de rodales y competencia en las masas de pino silvestre (Pinus sylvestris L.) y pino negral (Pinus pinaster Ait.) de los Sistemas Central e Ibérico Meridional. Tesis Doctoral. 230 pp Ref.: Lizarralde 2008 """ dbhg5: float = 0 if plot.si == 0: dbhg5 = 0 # math.exp(0.2030 * math.log(old_tree.dbh * 10) + 0.4414 * math.log((old_tree.cr + 0.2) / 1.2) + 0.8379 * math.log(1) - 0.1295 * math.sqrt(plot.basal_area) - 0.0007 * math.pow(old_tree.ba_ha,2) / math.log(old_tree.dbh * 10)) else: dbhg5 = math.exp(0.2030 * math.log(old_tree.dbh * 10) + 0.4414 * math.log((old_tree.cr + 0.2) / 1.2) + 0.8379 * math.log(plot.si) - 0.1295 * math.sqrt(plot.basal_area) - 0.0007 * math.pow(old_tree.bal, 2) / math.log(old_tree.dbh * 10)) new_tree.sum_value("dbh", dbhg5 / 10) if dbhg5 == 0: htg5 = 0 else: htg5: float = math.exp(0.21603 + 0.40329 * math.log(dbhg5 / 2) - 1.12721 * math.log(old_tree.dbh * 10) + 1.18099 * math.log(old_tree.height * 100) + 3.01622 * old_tree.cr) new_tree.sum_value("height", htg5 / 100)
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source for diameter growing: Doc.: Trasobares A, Tomé M, Miina J (2004). Growth and yield model for Pinus halepensis Mill. in Catalonia, north-east Spain. Forest ecology and management, 203(1-3), 49-62 Ref.: Trasobares et al, 2004 Source for height/diameter equation: Equation obtained from PHRAGON_2017_v1.cs, a model of Pinus halepensis useful for the old SiManFor version, developed for Aragón by Föra Forest Techonlogies and Diputación General de Aragón """ BALthin = 0 # is not used on the simulation as the author says GI = 1 # stand growth index; difference between measured and predicted radius under bark values ~ 1 beta1 = 1.8511 beta2 = -3.9402 beta3 = -0.0085 beta4 = -0.1137 beta5 = 0.0410 beta6 = 0.5662 dbhg10 = math.exp(beta1 + beta2 / old_tree.dbh + beta3 * old_tree.dbh / GI + beta4 * old_tree.bal / (math.log(old_tree.dbh + 1)) + beta5 * BALthin + beta6 * math.log(GI)) new_tree.sum_value("dbh", dbhg10) # new_tree.sum_value("dbh", dbhg10 / 2) # that equation calculates diameter grow for 10 years, activate taht line if we want the calculation for 5 years a = 2.5511 b = pow(1.3, a) ht = pow( b + (pow(plot.dominant_h, a) - b) * (1 - math.exp(-0.025687 * new_tree.dbh)) / (1 - math.exp(-0.025687 * plot.dominant_dbh)), 1 / a) new_tree.add_value( "height", ht ) # that equation calculates height using the new diameter; is not a growing equation
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations. Options: a) Doc.: Palahí M, Grau JM (2003). Preliminary site index model and individual-tree growth and mortality models for black pine (Pinus nigra Arn.) in Catalonia (Spain). Forest Systems, 12(1), 137-148 Ref.: Palahí and Grau, 2003 b) Doc.: Trasobares A, Pukkala T, Miina J (2004). Growth and yield model for uneven-aged mixtures of Pinus sylvestris L. and Pinus nigra Arn. in Catalonia, north-east Spain. Annals of forest science, 61(1), 9-24 Ref.: Trasobares et al, 2002 """ # a) R2 muy malo para el dbhg5 --> 0.14; R2 --> 0.92 para htg5 beta0 = 4.8413 beta1 = -8.6610 beta2 = -0.0054 beta3 = -1.0160 beta4 = 0.0545 beta5 = -0.0035 dbhg5: float = beta0 + beta1 / old_tree.dbh + beta2 * old_tree.bal + beta3 * math.log( plot.basal_area) + beta4 * plot.si + beta5 * plot.age new_tree.sum_value("dbh", dbhg5) beta6 = 0.4666 beta7 = -0.4356 beta8 = 0.0092 htg5: float = 1.3 + (plot.dominant_h - 1.3) * ( (dbhg5 / plot.dominant_dbh)** (beta6 + beta7 * (dbhg5 / plot.dominant_dbh) + beta8 * plot.si)) new_tree.sum_value("height", htg5)
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source of diameter growing equation: Doc.: Calama R, Montero G (2005). Multilevel linear mixed model for tree diameter increment in stone pine (Pinus pinea): a calibrating approach. Silva Fenn, 39(1), 37-54 Ref.: Calama and Montero, 2005 Source for height/diameter equation: (process_plot) Doc.: Calama R, Montero G (2004). Interregional nonlinear height diameter model with random coefficients for stone pine in Spain. Canadian Journal of Forest Research, 34(1), 150-163 Ref.: Calama and Montero, 2004 SI equation (Hdom_new): (process_plot) Doc.: Calama R, Cañadas N, Montero G (2003). Inter-regional variability in site index models for even-aged stands of stone pine (Pinus pinea L.) in Spain. Annals of Forest Science, 60(3), 259-269 Ref.: Calama et al, 2003 """ cat = 0 # cat = 1 if the analysis is for Catalonia; 0 for Spain in general if plot.si == 0: dbhg5 = 0 else: dbhg5 = math.exp(2.2451 - 0.2615 * math.log(old_tree.dbh) - 0.0369 * plot.dominant_h - 0.1368 * math.log(plot.density) + 0.0448 * plot.si + 0.1984 * (old_tree.dbh / plot.qm_dbh) - 0.5542 * cat + 0.0277 * cat * plot.si) - 1 new_tree.sum_value("dbh", dbhg5) dbh_list.append([ old_tree.dbh, new_tree.dbh ]) # that variable is needed to used dbh values on process_plot
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source for diameter grow equation: Doc.: Sánchez-González M, del Río M, Cañellas I, Montero G (2006). Distance independent tree diameter growth model for cork oak stands. Forest Ecology and Management, 225(1-3), 262-270 Ref.: Sánchez-González et al, 2006 Doc.: Sánchez-González M, Calama R, Cañellas I, Montero G (2007). Management oriented growth models for multifunctional Mediterranean Forests: the case of Cork Oak (Quercus suber L.). In EFI proceedings (Vol. 56, pp. 71-84) Ref.: Sánchez-González et al, 2007 Source for height/diameter equation: Doc.: Sánchez-González M, Cañellas I, Montero G (2007). Generalized height-diameter and crown diameter prediction models for cork oak forests in Spain. Forest Systems, 16(1), 76-88 Ref.: Sánchez-González et al, 2007 Doc.: Sánchez-González M, Calama R, Cañellas I, Montero G (2007). Management oriented growth models for multifunctional Mediterranean Forests: the case of Cork Oak (Quercus suber L.). In EFI proceedings (Vol. 56, pp. 71-84) Ref.: Sánchez-González et al, 2007 Source for cork grow equation: Doc.: Sánchez-González M, Calama R, Cañellas I, Montero G (2007). Management oriented growth models for multifunctional Mediterranean Forests: the case of Cork Oak (Quercus suber L.). In EFI proceedings (Vol. 56, pp. 71-84) Ref.: Sánchez-González et al, 2007 """ idu = 0.18 + 7.89/plot.density - 1.02/plot.si + 2.45/old_tree.dbh new_tree.sum_value('dbh', idu) # annual diameter increment under cork (cm) h2 = 1.3 + (plot.dominant_h - 1.3)*((new_tree.dbh/plot.dominant_dbh)**0.4898) new_tree.add_value('height', h2) # height/diameter equation result (m) t = old_tree.tree_age + 1 # years Xo1 = 0.5*(math.log(old_tree.bark) - 0.57*math.log(1 - math.exp(-0.04*old_tree.tree_age))) # Xo2 = math.sqrt((math.log(old_tree.bark) - 0.57*math.log(1 - math.exp(-0.04*old_tree.tree_age))**2 - 4*1.86*math.log(1 - math.exp(-0.04*old_tree.tree_age)))) Xo = Xo1 # +- Xo2 cork_2 = old_tree.bark*(((1 - math.exp(-0.04*t)) / (1 - math.exp(-0.04*old_tree.tree_age)))**((0.57+1.86)/Xo)) new_tree.sum_value('bark', cork_2)
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source: Doc.: Lizarralde I (2008). Dinámica de rodales y competencia en las masas de pino silvestre (Pinus sylvestris L.) y pino negral (Pinus pinaster Ait.) de los Sistemas Central e Ibérico Meridional. Tesis Doctoral. 230 pp Ref.: Lizarralde 2008 """ if plot.si == 0: dbhg5: float = 0 else: dbhg5: float = math.exp( -0.37110 + 0.2525 * math.log(old_tree.dbh * 10) + 0.7090 * math.log((old_tree.cr + 0.2) / 1.2) + 0.9087 * math.log(plot.si) - 0.1545 * math.sqrt(plot.basal_area) - 0.0004 * (old_tree.bal * old_tree.bal / math.log(old_tree.dbh * 10))) new_tree.sum_value("dbh", dbhg5 / 10) if dbhg5 == 0: htg5: float = 0 else: htg5: float = math.exp(3.1222 - 0.4939 * math.log(dbhg5 * 10) + 1.3763 * math.log(plot.si) - 0.0061 * old_tree.bal + 0.1876 * math.log(old_tree.cr)) new_tree.sum_value("height", htg5 / 100)
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source for diameter growing: Equation obtained from PHRAGON_2017_v1.cs, a model of Pinus halepensis useful for the old SiManFor version, developed for Aragón by Föra Forest Techonlogies and Diputación General de Aragón Source for height/diameter equation: Equation obtained from PHRAGON_2017_v1.cs, a model of Pinus halepensis useful for the old SiManFor version, developed for Aragón by Föra Forest Techonlogies and Diputación General de Aragón """ if plot.si == 0: dbhg10 = 0 else: dbhg10 = 0.906633 * math.exp(0.09701 * old_tree.dbh - 0.00111 * ( old_tree.dbh ** 2) - 0.05201 * plot.basal_area + 0.050652 * plot.si - 0.09366 * old_tree.bal / plot.basal_area) # dbhg5 = dbhg10*0.5 # that equation calculates diameter grow for 10 years, activate taht line if we want the calculation for 5 years # new_tree.sum_value("dbh", dbhg5) new_tree.sum_value("dbh", dbhg10) if dbhg10 == 0: ht = 0 else: a = 2.5511 b = pow(1.3, a) ht = pow(b + (pow(plot.dominant_h, a) - b) * (1 - math.exp(-0.025687 * new_tree.dbh)) / ( 1 - math.exp(-0.025687 * plot.dominant_dbh)), 1/a) new_tree.add_value("height", ht) # that equation calculates height using the new diameter; is not a growing equation
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source: Doc.: Crecente-Campo F (2008). Modelo de crecimiento de árbol individual para Pinus radiata D. Don en Galicia. Univ Santiago de Compostela Ref.: Crecente-Campo, 2008 """ BALMOD = (1 - (1 - (old_tree.bal / plot.basal_area))) / plot.hart BAR = ( old_tree.basal_area * 0.01 ) / plot.basal_area # is a basal area ratio (g/G, where g is the basal area of the tree (m2)) ig = 0.3674 * (old_tree.dbh**2.651) * (plot.basal_area**( -0.7540)) * math.exp(-0.05207 * old_tree.tree_age - 0.05291 * BALMOD - 102 * BAR) dbhg1 = ((ig / math.pi)**0.5) * 2 new_tree.sum_value("dbh", dbhg1) # annual diameter increment (cm) RBA_D = ((old_tree.basal_area * 0.01) / plot.basal_area)**( old_tree.dbh / plot.qm_dbh ) # a ratio basal area-diameter ([g/G]d/Dg) if plot.si == 0: htg1: float = 0 else: htg1 = 0.05287 * (old_tree.height**(-0.5733)) * ( old_tree.dbh**0.5437) * (plot.si**1.084) * math.exp( -0.03242 * old_tree.tree_age - 50.87 * RBA_D) new_tree.sum_value("height", htg1) # annual height increment (m)
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source for grow equation: Doc.: Adame P, Hynynen J, Canellas I, del Río M. (2008). Individual-tree diameter growth model for rebollo oak (Quercus pyrenaica Willd.) coppices. Forest Ecology and Management, 255(3-4), 1011-1022 Ref.: Adame et al, 2007 Height/Diameter equation: Doc.: Adame P, del Río M, Canellas I (2008). A mixed nonlinear height–diameter model for pyrenean oak (Quercus pyrenaica Willd.). Forest ecology and management, 256(1-2), 88-98 Ref.: Adame et al, 2008 """ if plot.si == 0: dbhg10 = 0 else: STR = 0 # su valor debe ser 1 cuando la masa esta en el estrato 1 dbhg10 = math.exp(0.8351 + 0.1273 * math.log(old_tree.dbh) - 0.00006 * (old_tree.dbh**2) - 0.01216 * old_tree.bal - 0.00016 * plot.density - 0.03386 * plot.dominant_h + 0.04917 * plot.si - 0.1991 * STR) - 1 new_tree.sum_value( "dbh", dbhg10) # growing equation developed to 10 years period if dbhg10 == 0: htg10 = 0 else: htg10: float = 1.3 + ( 3.099 - 0.00203 * plot.basal_area + 1.02491 * plot.dominant_h * math.exp(-8.5052 / new_tree.dbh)) new_tree.add_value( "height", htg10) # ecuación de relación h/d, NO para el crecimiento
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that rdbh the diameter and height growing equations """ new_tree.sum_value("dbh", 0) new_tree.add_value("height", 0)
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that rdbh the diameter and height growing equations Height/Diameter equation: Doc.: Bartelink HH (1997). Allometric relationships for biomass and leaf area of beech (Fagus sylvatica L). In Annales des sciences forestières (Vol. 54, No. 1, pp. 39-50). EDP Sciences Ref.: Bartelink, 1997 """ dbhg5: float = 1 new_tree.sum_value("dbh", dbhg5) if dbhg5 == 0: htg5 = 0 else: htg5: float = 1.732 * (new_tree.dbh**0.769) # h/d equation new_tree.add_value("height", htg5)
def grow(self, time: int, plot: Plot, old_tree: Tree, new_tree: Tree): """ Function that run the diameter and height growing equations Source: Doc.: Diéguez-Aranda U, Rojo A, Castedo-Dorado F, et al (2009). Herramientas selvícolas para la gestión forestal sostenible en Galicia. Forestry, 82, 1-16 Ref.: Diéguez-Aranda et al, 2009 """ ht: float = 129.0321 * ((old_tree.height / 129.0321)**( (plot.age / (plot.age + 5))**0.301881)) new_tree.add_value( "height", ht ) # esta fórmula es para calcular la altura predicha, no para crecimiento # en principio esta era una ecuación h/d, así que es mejor calcular el diámetro con la altura total #dbh: float = - (math.log( # 1 - (1 - math.exp(-0.06160 * plot.dominant_dbh)) * (new_tree.height ** 1.067 - 1.3 ** 1.067) / ( # plot.dominant_h ** 1.067 - 1.3 ** 1.067))) / 0.06160 new_tree.sum_value("dbh", 2.5)