On the Ecology of Mountainous Forests in a Changing Climate: A ...
On the Ecology of Mountainous Forests in a Changing Climate: A ...
On the Ecology of Mountainous Forests in a Changing Climate: A ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Appendix 231<br />
(*********************************)<br />
(* Procedure TreeEstablishment *)<br />
(*********************************)<br />
PROCEDURE TreeEstablishment( VAR firstSp: SpeciesPtr;<br />
uWiT: REAL; uDD, gLAI, totalTrees, kPatchSize: REAL );<br />
VAR sp: SpeciesPtr;<br />
nrNewTrees: INTEGER;<br />
gAL, kThres, totTrees, browsU, gBirthNr, time: REAL;<br />
gWFlag, gLFlag, gBFlag, gDFlag, gIFlag, birthOK: BOOLEAN;<br />
BEGIN<br />
gBirthNr := FLOAT( TRUNC(kEstNr*kPatchSize + 0.5) );<br />
gAL := Exp( -kLAtt*gLAI ); (* available light on forest floor *)<br />
totTrees := totalTrees;<br />
time := CurrentTime();<br />
browsU := U(); (* random number for brows<strong>in</strong>g *)<br />
sp := firstSp;<br />
WHILE sp NIL DO<br />
WITH sp^ DO<br />
(* criterion 1: w<strong>in</strong>ter temperature (Woodward 1987, 1988, Prentice &<br />
Helmisaari 1991) *)<br />
gWFlag := uWiT < p.kWiT;<br />
IF gWFlag THEN INC( limCounter[1] ) END;<br />
(* criterion 2: available light on forest floor (Ellenberg 1986) *)<br />
IF p.kLy < 5 THEN kThres := 0.025*FLOAT(p.kLy - 1);<br />
ELSE kThres := 0.1*FLOAT(p.kLy) - 0.4;<br />
END;<br />
gLFlag := gAL < kThres;<br />
IF gLFlag THEN INC( limCounter[2] ) END;<br />
(* criterion 3: brows<strong>in</strong>g (Kienast 1987, Dengler 1992) *)<br />
gBFlag := browsU < FLOAT(p.kBrow-1)*uBrPr/30.0;<br />
IF gBFlag THEN INC( limCounter[3] ) END;<br />
(* criterion 4: degree-days (Shugart 1984) *)<br />
gDFlag := (uDD < p.kDDM<strong>in</strong>) OR (uDD > p.kDDMax);<br />
IF gDFlag THEN INC( limCounter[4] ) END;<br />
(* criterion 5: immigration <strong>of</strong> species *)<br />
gIFlag := time < p.kImmYr;<br />
(* check if birth is <strong>in</strong>hibited *)<br />
birthOK := NOT gWFlag AND NOT gLFlag AND NOT gBFlag AND<br />
NOT gDFlag AND NOT gIFlag;<br />
(* establish sapl<strong>in</strong>gs if establishment is possible *)<br />
IF birthOK AND (U() < kEstP ) THEN<br />
nrNewTrees := TRUNC( U()*gBirthNr ) + 1; (* determ<strong>in</strong>e number <strong>of</strong> trees *)<br />
IF (gLAI < 1.0) AND (firstNewCohort NIL) THEN<br />
firstNewCohort^.nrTrees := firstNewCohort^.nrTrees + nrNewTrees;<br />
ELSE<br />
CreateCohort( firstNewCohort, kInitDBH, nrNewTrees );<br />
END; (* IF *)<br />
totTrees := totTrees + FLOAT( nrNewTrees );<br />
ELSE<br />
INC( limCounter[5] ); (* count number <strong>of</strong> birth <strong>in</strong>hibitions *)<br />
END; (* IF *)<br />
INC( limCounter[6] ); (* count number <strong>of</strong> loops *)<br />
END; (* WITH *)<br />
sp := sp^.next;<br />
END; (* WHILE *)<br />
END TreeEstablishment;<br />
(*************************)<br />
(* Procedure UpdateGap *)<br />
(*************************)<br />
PROCEDURE UpdateGap( VAR firstSp: SpeciesPtr; uDD, uDrStr: REAL );<br />
VAR sp: SpeciesPtr;<br />
cohort: CohortPtr;<br />
t, DInc: REAL;<br />
BEGIN<br />
t := CurrentTime();<br />
sp := firstSp;<br />
WHILE sp NIL DO<br />
WITH sp^ DO<br />
cohort := firstCohort;<br />
WHILE cohort NIL DO<br />
cohort^.D := cohort^.D + cohort^.DInc;<br />
IF mon.monTreeR<strong>in</strong>gs THEN<br />
DInc := cohort^.DInc * 5.0;<br />
(* corresponds to /2 *10; r<strong>in</strong>g width is half <strong>of</strong> diameter <strong>in</strong>crement and is<br />
converted from cm to mm *)<br />
WriteTreeR<strong>in</strong>gs( sp, t, cohort^.nrOfCohort, DInc, uDD, uDrStr );<br />
END; (* IF *)<br />
INC(cohort^.age);<br />
cohort := cohort^.next;<br />
END;<br />
END; (* WITH *)<br />
MergeCohorts( sp );<br />
sp := sp^.next;<br />
END; (* WHILE *)<br />
END UpdateGap;<br />
BEGIN<br />
kFRT[deciduous] := 1.0;<br />
kFRT[coniferous] := 5.0; (* Bossel et al. 1985 *)<br />
END FCPDynamic.