)V1531.) RETURNING MATERIALS: Place in book drop to LIBRARIES remove this checkout from w your record. FINES wiII be charged if book is returned after the date stamped below. 1‘ i ‘I . 0“ .4“ II . If g I.“ i “,5, ‘ 951 “Vt-N ‘ (I) m; #21 2g.“ c w I - A SIMULATION OF THE EFFECTS OF FOUR INSECT PESTS ON RED PINE GROWTH AND YIELD IN MICHIGAN By Stephen Carl Westin A THESIS Submitted to Michigan State University in partial fulfillment of the requirements for the degree of MASTER OF SCIENCE Department of Forestry 1987 ABSTRACT A SIMULATION OF THE EFFECTS OF FOUR INSECT PESTS ON RED PINE GROWTH AND YIELD IN MICHIGAN By Stephen Carl Westin A model was developed to simulate the effects of white grubs (Ehzllgphggg spp., Coleoptera, Scarabaeidae), Saratoga spittlebug (Aphxgphgzg ggxatgggnsig [Fitch]), pine root collar weevil (Hzlghigg radigig Buch.), and red-headed pine sawfly (Ngggipxign leggntgi [Fitch]) on growth and yield of red pine (Einus Iggingsa Ait.). The model allows the user to set initial stand conditions, and choose one of the insects to simulate. Insect levels are randomly set. Effects of insect damage may be offset by implementing control measures. The stand may be thinned to varying levels at any time. An economic analysis is performed to compare costs and returns with and without insect management. ACKNOWLEDGEMENTS I would like to express my deepest gratitude to Dr. Carl W. Ramm, graduate committee chairman, for his guidance, patience, and friendship during the course of my graduate program. Thanks are due also to Dr. Gary Simmons, Dr. Douglas Lantagne, and Dr. Donald Dickmann for their ideas, support, and timely action when called upon. The completion of this thesis would not have been possible without their help. Also, I would like to thank my family for their support and patience throughout this rather interesting experience. Finally, I would like to thank Karen Stange for being there when I needed her. Her love has made my life much more meaningful. iii List of Tables ........................................... vi List of Figures ......................................... vii Introduction .............................................. 1 Background Information .................................... 3 Overview of the Model ..................................... 7 Plantation Establishment ................................. 10 Red Pine Growth and Yield ................................ 13 Red Pine Growth ..................................... 13 Diameter Distribution ............................... 18 Estimating Red Pine Volume .......................... 19 Estimating Red Pine Mortality ....................... 21 Region of Applicability for Insect Models ................ 22 White Grubs .............................................. 23 White Grub Caused Mortality ......................... 23 Growth Loss Due to White Grubs ...................... 26 Control Measures and Efficacy ....................... 26 Pine Root Collar Weevil .................................. 27 Simulating Pine Root Collar Weevil Impact on Red Pine ......................................... 29 Saratoga Spittlebug ...................................... 31 iv v Simulating Saratoga Spittlebug Impact on Red Pine ............................................ 33 Red-Headed Pine Sawfly................... ................ 36 Simulating Red-Headed Pine Sawfly Impact on Red Pine Volume .................................. 38 Economic Evaluation ...................................... 40 Summary .................................................. 41 List of References ....................................... 43 Appendix A: A User’s Guide For RPPEST .................... 48 Appendix B: A Program Listing of RPPEST .................. 79 LIST OF TABLES Lower and upper limits of red pine seedling mortality through year 2, for a given mean number of Ehzllgphagg per cubic foot of soil ............................................. 24 Probability of heavy damage to red pine from root collar weevil, by hazard zone and distance to a weevil infestation ................. 28 Default costs for forest management activities and stumpage ..................................... 54 Range of random values used in RPPEST simulations ...................................... 56 Default costs for insect management activities in RPPEST ........................................ 57 vi CDCDN‘IO’JOIoh» 11. 12. 13. 14. 15. 16. LIST OF FIGURES A Flowchart of RPPEST ............................. 8 Initial Stand Information ........................ 63 Initial Site Preparation and Economic Information ...................................... 64 First Year Seedling Survival ..................... 65 Insect Caused Seedling Mortality ................. 66 Insect Monitor and Control Costs ................. 67 Stand Description Display At Age 20 .............. 68 Stand Description Display At Age 30 .............. 69 Stand Description after Thinning At Age 35 ....... 70 Thinning Parameter Change Menu ................... 71 Stand Description Display At Age 40 .............. 72 Stand Description After Thinning At Age 45 ....... 73 Stand Description Display At Age 50 .............. 74 Stand 1 Volume Summary ........................... 75 Stand 2 Volume Summary ........................... 76 Final Economic Analysis .......................... 77 vii INTRODUCTION Due to the length of most forest stand rotations, land managers spend a great deal of their careers gaining the experience and knowledge necessary to be successful in their management activities. For example, although heavy attacks by insects are often infrequent, the resultant damage may be serious. Because of lack of experience , a land manager may not know the most effective or economical way to deal with a serious insect outbreak when it occurs. Computerized growth and yield models which simulate insect impact allow managers to experiment with various management strategies for trees and insects, helping them gain necessary experience. The purpose of the model described in this thesis and the associated computer program, RPPEST, is to serve as a training tool for land managers. The model simulates the impact of four insects on the growth and volume yield of red pine (Rings resingsg Ait.). The insects are: white grubs (Phyllgphaga spp., Coleoptera, Scarabaeidae), pine root collar weevil (Hxlghigs radigis Buch.), Saratoga Spittlebug (Anhmhm mm: [Fitch]). and red-headed pine sawfly (Nggfiipzign leggntgi [Fitch]). This 2 model allows flexible stand definition as well as relative ease of use on a microcomputer. Economic analysis of various combinations of timber and insect management strategies should make the model a useful tool to help land managers gain experience within a shorter time frame and at a lower cost than that allowed by the real world. Won Red pine (Rings resingsa Ait.) is a widely planted forest species in the Lake States region and many forest products are derived from it, including pulpwood, posts, utility poles, cabin logs, piling and sawtimber (Benzie, 1977). Because rotation lengths needed to produce these products often range from 60 to 120 years (Benzie and McCumber, 1983), land managers responsible for obtaining maximum benefit from red pine stands often do not know the results of their management prescriptions until late in their careers, if ever. As in most other professions, foresters gradually gain experience and knowledge as their careers progress. However, the long interval between the beginning and end of most forestry projects slows the accumulation of knowledge. Accelerating this learning process should favor more effective forest management. Computer based growth and yield models allow forest managers to simulate various stand management scenarios and evaluate their results in a short of time, and with no risk. Prior to this time, at least four computerized growth and yield models were available for red pine in the Lake States: REDPINE (Lundgren, 1981), STEMS (Belcher et al., 1982), RPAL (Ramm and Miner, 1986), and TWIGS (Belcher, 1982). 4 REDPINE, briefly described by Lundgren (1981), is a stand level growth and yield model for red pine plantations or natural stands in the Lake States. The program forecasts growth beginning at any stand age for thinned or unthinned stands. If a stand is grown from the time of planting REDPINE makes no attempt to account for seedling mortality in the first years after planting. REDPINE allows wide latitude in the description of the stand in terms of number of trees per acre, initial basal area, site index, and thinning specifications. REDPINE was designed and written for mainframe computers, which somewhat limits access to it. RPAL (Ramm and Miner, 1986) is a BASIC language translation of REDPINE written for the IBM PC and compatible microcomputers. STEMS is an individual tree growth and yield projection system for over thirty species in the Lake States (Belcher et al., 1982). As an individual tree model, STEMS requires that a list of trees and their characteristics be entered before projection begins, or the program will generate such a list if requested. STEMS allows implementation of various management systems, such as removal of cull trees and thinning from above or below (Brand, 1979). Simulation of mortality is accomplished using a mortality function based on individual tree diameter growth rate (Buchman, 1979). A microcomputer version of STEMS called TWIGS has been developed, which will increase public access to this growth projection system. Attacks on forest stands by some insects may be infrequent but serious when they do occur. Other insects frequently cause low to moderate levels of tree damage or mortality and often go unnoticed. Forest managers need to understand the nature of these insect attacks, their impact on growth and yield, and the effect of possible control actions on stand growth and yield. A logical extension of computerized growth and yield models for forest stands would be the addition of simulated insect attack on the stands. Two computerized models are available for the Lake States region. BANKSIANA is a computerized stand level growth and yield model for the Lake States which simulates the impact of white pine weevil and jack pine budworm on jack pine (Drapek, 1985). BANKSIANA allows several methods of jack pine reproduction with variable results. Insect attack is randomly determined and several control measures are available. Economic effectiveness of control measures selected is analyzed after the stand is harvested. NPVUNPL is a stand level computer model which simulates growth loss in red pine plantations due to Saratoga spittlebug injury (Heyd, 1985). The program requires initial input of number of trees per acre and site index. Three rotation options are available in the model. First, harvest at age 45 with no thinning. Second, harvest at age 80 with thinning to a residual basal area level of 6 90 square feet per acre every 10 years after age 33. Third, harvest at age 80 with thinning to a residual basal area level of 120 square feet per acre every 10 years after age 33. Stumpage prices may be set for the products of each thinning as well as for the final harvest. Insect control in NPVUNPL may be accomplished by chemically controlling alternate host vegetation, spraying chemical insecticides, or taking no action. Costs of stand establishment and insect control may be entered, or estimated by the program. Economic analysis of the management strategy employed is carried out using Net Present Value at interest rates between 7% and 10%. Analysis is performed for the same stand with three different Saratoga spittlebug hazard ratings of increasing severity (Heyd, 1985). The objective of the current project was to develop a computerized growth and yield model (RPPEST), which allows simulation of the effects on red pine growth and yield of the major insect pests of red pine. This model is seen as a training tool for land managers, enabling them to experience the effects of insect attack and judge the soundness of alternative control practices. WW1 RPPEST is a stand level model for plantations and natural stands which simulates the impact on red pine growth and yield of four insects: white grubs, pine root collar weevil, Saratoga spittlebug, and red-headed pine sawfly. Figure 1 is a flowchart of RPPEST. The model allows simulation of the impact of one of the insects, or a stand may be grown without insects. If the insect attack alternative is selected two stands are grown simultaneously, one with insect controls available in the model, and the other with no insect control measures. This allows an economic evaluation of the insect control strategy selected. Initial stand information needed to run the model includes site index, minimum pole and sawtimber diameters, seedling age at planting, stand age at the beginning of simulation (0 if insect attack is selected), initial basal area per acre, trees per acre, and harvest age. Maximum stand age allowable at harvest is 135 years. If the insect attack option is selected, alternative planting and site preparation methods are available. RPPEST includes the ability to establish a thinning regime for a stand. Thinning selects trees equally across the stand’s diameter distribution. Thinning may be to a Initialize Stand I Indlude Y Choose Insects? ---> Insect Z Grow the I V I Normal Mortality E Y Modify Thin? ------ > Stand N I End of Projection -> Stand Period? Stats N I Increment _- A86 Figure 1. Stand < -------------- I Y Display ---> ---> --—> Define Establishment Costs & Procedures I Determine < ------------------- < ------------------- Impact I ': Control Y Choose & Insects? ---> Implement ' I ' I N : : = : Modify : Stand < ---------- Display Change Stand ----- > Thinning Stats Options I ': Age = Y Harvest ----- > Harvest A397 Stand ' I ' I N : g I Summarize : Rotation Values I :' Economic Analysis I :' END A Flowchart of RPPEST. 9 residual basal area, or may remove a specific number of trees per acre, or may remove a certain proportion of the stand’s basal area or trees per acre. If insect attack is simulated both stands follow the same thinning regime. The stand is grown until the end of the specified projection period or when a thinning year is reached. A stand summary is then displayed and the pattern is repeated until harvest age is reached. A final volume summary for each stand is displayed. Then an economic analysis of overall management and of wood saved by the insect control measures is displayed. KW There are many ways to prepare a potential red pine site for planting. These methods may be grouped into two broad categories: mechanical and chemical (Sajdak, 1982). These two categories, along with no site preparation, are available as options in setting up stand regeneration in the model. Winebar and Gunter (1984) conducted a survey of forest management costs in 1982 among government agencies, forest industry and private contractors in Michigan, Wisconsin, and Minnesota. Costs for site preparation were taken from the results of that survey. Costs used in this model have been adjusted for inflation from 1983 to 1985, the last date for which figures are available, using the producer price index. The adjustment factor is 4.6%. Winebar and Gunter arrived at adjusted average figures of 8 64.57 per acre for mechanical preparation and $ 52.30 per acre for chemical preparation. Red pine seedlings are planted either by hand or by machine. Both options are available. Planting stock is assumed to be bareroot. Costs for planting are categorized by the type of site preparation preceding the planting and by the number of seedlings per acre being planted (Winebar and Gunter,1984). Early survival of planted red pine can 10 11 vary significantly depending upon several factors, such as quality of planting stock, degree of site preparation, date of planting (Emch and Carvell, 1985), use of correct planting techniques, and weather. Attempting to combine all of these elements into a model would be a major task in itself, so a simplifying assumption was made. It was assumed that things went reasonably well during the planting operation, except for some small degree of uncertainty. That is, seedlings were handled with reasonable care, seedlings were not J-rooted during planting, or a two month drought did not set in right after planting. Published average first year red pine seedling survival data for the period 1934-1974 on the Huron-Manistee National Forest in the northern Lower Peninsula of Michigan was 83%, while 1982, 1983, and 1984 plantings showed first year survival rates of 85%, 94% and 84% respectively (Labumbard, 1984). These figures were used as the basis for assuming a first year survival rate of 84%. To account for year to year variation, the model randomly varies first year survival between 74% and 93% in any given year (84% + or - 9%). Published seedling survival data is uncommon, and the Huron-Manistee information covers a longer time span than other Lake States data found in the literature. The applicability of this data to areas outside northern Lower Michigan is unknown. 12 Type of planting (hand or machine) is assumed to have no effect on first year survival (Knighton, 1972). No data was available to show a difference between chemical and mechanical site preparation in the first year, so none was assumed. Carmean (1971) found first year survival of 2-0, 3-0, and 4-0 seedlings planted in Minnesota on sandy soil with grass competition to average 53.9% when no site preparation was used. If no site preparation is indicated in the model, first year survival is reduced by a randomly determined additional 0% to 30% (the difference between the mean value of 84% and the 53.9% observed by Carmean) to reflect the added uncertainty of possibly heavy vegetative competition on the seedlings. W Accurate prediction of red pine growth and yield throughout the life of a stand is fundamental to this model. The equations used to accomplish this forecasting were drawn from the forestry literature. The general form of the growth and yield section of the model and many of the equations used, including those for basal area growth and tree volume, were drawn from a red pine growth and yield computer model called REDPINE, written and briefly described by Lundgren (1981). B§d_£in§_fixgflih Red pine growth equations considered for use in the model have been published by Buckman (1962), Chen and Rose (1977), USDA Forest Service (1979), Lundgren (1981), and Reed et a1. (1986). Chen and Rose (1977) developed an individual tree basal area growth model for red pine using data from a plantation in Wisconsin. Their model estimates a tree’s basal area growth as a function of the tree’s basal area and competition with its neighbors. This model does not seem to adequately explain basal area growth in thinned stands, and the calculations are difficult. Therefore, 13 14 this model was not used in RPPEST. Staff members of the USDA Forest Service’s North Central Experiment Station have developed an individual tree growth and yield projection system for the Lake States called STEMS (USDA Forest Service, 1979). Red pine is among the species included in this diameter growth model. The data used to deveolp this model were collected in Michigan, Wisconsin, and Minnesota. The STEMS model requires information about each tree in the stand to be modeled, including crown ratio and diameter. It was felt that these extensive information requirements would be a burden to people using RPPEST, so the STEMS diameter growth model was not used in RPPEST. Reed et a1. (1986) developed a stand level metric cubic volume and basal area estimation system from data collected in red pine plantations in both the Upper and Lower Peninsulas of Michigan. The basal area equation requires only stand age, basal area, and site index at a beginning age to estimate basal area at a future age. Reed et al. suggest that this stand model not be used in thinned stands. The ability to simulate thinning was a fundamental goal in the development of RPPEST, and so precluded this model’s use. Equations from Buckman (1962) and Lundgren (1981) were selected to predict red pine basal area growth in RPPEST. From the time when breast-height age is greater than zero until total tree age equals 24, stand basal area per acre 15 is estimated by an equation developed by Lundgren from data originally collected by Wambach (1967): Basal area = 6.565 * site index * ((1 - e(-0.04018 * total age))“1.1677) * (1 - e(-0.01885 * trees/ac.)) Wambach’s data were collected in unthinned Lake States plantations up to 35 years old that were established at various initial spacings. Lundgren’s model is used rather than Wambach’s model because it explains 10% more of the natural variation present in the data, and has 5 square feet of basal area per acre less error associated with it’s predictions. The first derivative of Lundgren’s equation is used to compute annual basal area growth per acre as follows: Basal area growth = 6.5653 * site index * (A1 * A2 - A3 * A4) A1 = e(1.1677 * LN(1 - e(-0.040172 * (total age + 1)))) A2 = 1 - e(-0.0018854 * trees/ac.) A3 = e(1.1677 * LN(1 - e(-0.040172 * total age))) A4 = 1 - e(-0.0018854 * trees/ac.) Buckman (1962) developed a stand level red pine basal area growth equation from data collected in Minnesota. 16 Most of the plots measured were located in thinning studies in what appear to be both natural stands and plantations. Site index of the experimental stands varied from 46 to 63 feet, while stand age ranged between 21 and and 144 years. Annual basal area growth per acre for stands where tree age is greater than 24 years old is computed using Buckman’s equation: Basal area growth = 1.689 + 0.04107 * basal area/ac. - 0.000163 * (basal area/ac.)‘2 - 0.07696 * total age + 0.0002274 * total age‘2 + 0.06441 * site index The two basal area growth equations used in RPPEST were also used in Lundgren’s REDPINE model (1981). Lundgren (1983) compared total peeled cubic foot volume per acre mean annual increment (MAI) predicted by REDPINE with red pine MAIs from Michigan, Minnesota, Wisconsin and Ontario reported in the literature. A simple regression equation relating REDPINE predicted MAI to observed MAI had a coefficient of determination of .73, and an F test showed that the equation was not significantly different (at the 0.05 level) from the assumption that predicted MAI equaled observed MAI. The accuracy of prediction and the apparently wide area of geographic applicability were determining factors in the selection of Buckman’s and Lundgren’s basal area growth models for use in RPPEST. 17 Breast-height age is computed using an equation from Benzie (1977) developed by A. L. Lundgren from data collected by Wambach (1967): Breast height age = total age - 10.5 + 0.05 * site index Lundgren (1981) developed a maximum annual diameter increment function to limit the growth of stands with low numbers of trees per acre, or young thinned stands. Occasionally the diameter growth predicted for these types of stands appears to be too high. To remedy this situation, the following constraint is used in RPPEST: Maximum dbh increment = .007 * site index * e(-0.01 * breast-height age) Using the maximum diameter increment calculated as above, maximum annual basal area growth increment is: Maximum BA growth = 0.00545415 * trees/ac. * (2 * mean dbh * maximum dbh increment + maximum diameter increment“2) Mean dbh, or quadratic mean diameter, is the diameter of the tree of average basal area. 18 Milan Hafley and Schreuder (1970) discuss several statistical distributions used for fitting diameter class data for even-aged stands, including the beta, Johnson’s SB, lognormal, gamma, Weibull, and normal. The only published information for red pine concerning any of these distributions is found in Zarnoch et a1. (1982), who fit diameter class data for various thinning regimes in red pine to the Weibull distribution. Weibull parameters are given for stands of age 25, 32, and 39 years. Because Zarnoch et al. have no data for stands older than 39 years it was decided not to use this information in a model where maximum stand age can be 135 years. Lacking other information, and after examining graphs of red pine diameter distributions, it was decided that red pine diameter distributions would be approximated by the normal distribution. Before a given number of trees per acre can be partitioned into one inch diameter classes using the normal distribution, an estimate of the standard deviation of the diameters must be calculated. A function of this type was developed by Lundgren (1981) using data published by Stiell and Berry (1973): Standard deviation of dbh = 0.37628 * mean diameter * e(-0.093346 * mean diameter) 19 There were two reasons for assigning stand level data to one inch diameter classes. First, the mortality function selected requires dbh to calculate survival rates. Second was the need to partition basal area into merchantability classes for product specification. No other use was made of the diameter class information. Winnie Tree height is one component of the volume equations used in the model. An equation to estimate total height of dominant and codominant trees was developed by Lundgren and Dolid (1970) to describe published site index curves for red pine in the Lake States: Total height = 1.89 * site index * (1 - e(-0.01979 * age)‘1.3892) Several equations are used in the model to calculate red pine volume per acre. Total cubic foot volume per acre, utilizing the entire stem minus bark, is calculated using an equation from Buckman (1962): Cubic feet/ac. 0.4085 * basal area/ac. * average total stand height Cordwood volume per acre, including bark, to a three 20 inch minimum top diameter inside bark is calculated using an equation developed by Buckman (1962): Cords/ac. = 0.003958 * basal area/ac. * average total stand height Merchantable cubic foot volume per acre to a three inch minimum top diameter inside bark is computed using a formula derived by multiplying the above cordwood volume equation from Buckman (1962) by 79 cubic feet per cord (Lundgren, 1981): Cubic feet/ac. = 0.3127 * basal area/ac. * average total stand height International 1/4 inch board foot volume per acre to a six inch top is calculated using a ratio of board feet per total cubic foot (Lundgren, 1981) in sawtimber size trees: Board feet/cubic foot = -8.76 + 1.985 * dbh - 0.07253 * dbh‘2 + 0.0008421 * dbh“3 + 0.04951 * average total stand height - 0.00892 * dbh * average total stand height + 0.0003169 * dbh“2 * average total stand height - 0.000002786 * dbh“3 * average total stand height 21 E l° !' B 1 Bi H l 1.! Buchman (1983) has developed a model that predicts survival for several Lake States tree species, including red pine. The data used to develop the model has strength in both number of samples and geographic extent. Equation coefficients for red pine were developed from nearly 40,000 one year tree records gathered from throughout the Lake States. Performance of this tree survival model was tested against USDA Forest Service permanent plot data. For red pine between 1 inch and 16 inches dbh the aggregate predicted survival rate was only 0.3% higher than the measured survival rate (Buchman, 1985). This model was therefore selected to estimate annual red pine survival in trees 1 inch dbh and larger: Survival rate = 0.9997 - (1 / (1 + e‘n)) n = 1.9953 + 57.97 * dbh growth rate“1.012 + 0.2648 * (dbh - 1)“1.626 * e(-0.1273 * (dbh - 1)). WWW Much of the entomological information used in RPPEST was collected by Louis F. Wilson of the USDA Forest Service North Central Experiment Station in East Lansing, Michigan, and his students R.D. Averill and R.L. Heyd. Most of their information was collected in the northern Lower and Upper Peninsulas of Michigan. Dr. Wilson’s job is to perform entomological research applicable to the north central United States. Thus, the data used in RPPEST is pertinent throughout the Lake States (G.A. Simmons, 1987, Michigan State University, personal communication). Wide applicability of information about a pest does not mean that the insect is a significant problem everywhere it is found. Impact may vary as climate and vegetation change across a region. For example, potential impact of pine root collar weevil in northern Lower Michigan declines as the climate becomes harsher moving from west to east across the state (Wilson and Millers, 1983). Therefore, utility of particular sections of this model may vary throughout the region where it is potentially applicable. 22 1111119411311: White grubs (Coleoptera, Scarabaeidae) are the larvae of May beetles and other related beetles. The genus Phyllgphaga contains some of the largest and most destructive larvae. They occur in the soil and feed on the roots of trees, grasses, and other vegetation. The larvae consume the smaller roots and girdle the larger roots of young red pine seedlings. The damage caused by this feeding manifests itself on the trees in two ways: reduced growth, and mortality (Fowler and Wilson, 1971). Wits: Fowler and Wilson (1971, 1974) studied red pine seedling mortality caused by white grubs in the Upper Peninsula of Michigan from the time of planting through the fifth growing season. Most white grub caused mortality took place in the first three years after planting (Fowler and Wilson, 1974). The data in Table 1 were interpolated from Figure 6 in Fowler and Wilson (1971). The graph shows a triangular region of seedling mortality described by lower and upper limits of red pine seedling mortality through the second growing season for a given mean number of Ehzllgphaga larvae per cubic foot of soil. Because non- 23 24 insect-caused mortality is accounted for in RPPEST, a base rate of 4% non-grub mortality was subtracted from each value interpolated from the graph. Table 1. Lower and upper limits of red pine seedling mortality through year 2, for a given mean number of Phyllgphaga per cubic foot of soil. Mean # grubs % Mortality % Mortality per cubic ft. lower limit upper limit 0.00 0 0 0.25 6 14 0.50 12 30 0.75 18 44 In order to duplicate the lines representing the lower and upper limits of seedling mortality in the graph, linear regression was used to fit simple equations to both sets of interpolated data using number of grubs per cubic foot of soil as the independent variable. Thus, the R“2 values shown below should only be used to judge the precision of the reproduction of the graph lines. The resulting equations are shown below: 24 * N of grubs % Seedling mortality lower limit R‘2 = 1 % Seedling mortality upper limit 58.85714 * N of grubs R‘2 = .9997 25 Simulation of first and second year mortality of red pine seedlings begins with generation of a uniformly distributed random number between 0 and 0.75. This represents the mean number of grubs per cubic foot of soil. This number is then used in the regression equations to determine the lower and upper levels of mortality possible for this particular grub population. First and second year percent mortality is then determined by generating a random number between the calculated lower and upper bounds. Third and fourth year seedling mortality were interpolated from Figure 2 in Fowler and Wilson (1974). Third year mortalities for four plantations were 1%, 3%, 4%, and 12%. Third year mortality is assumed to vary between 1% and 4% with a probability of .75, and between 4% and 12% with a probability of .25. Fourth year mortality from Fowler and Wilson (1974) is essentially 0% for three plantations and 3% for the fourth. Fourth year mortality is assumed to be 0% with a probability of .75, and to vary between 1% and 3% with a probability of .25. Mortality percentages from the first four years are summed and number of trees per acre is reduced by this amount. 26 WW Fowler et al. (1982), in an extension of the work by Fowler and Wilson (1971, 1974), reported that differences in red pine site index values between plots treated with an insecticide effective on white grubs and plots that received no treatment were 5, 7, 8, and 9 units among four plantations. This study was conducted in the Upper Peninsula of Michigan on plantations which had completed ten growing seasons. To simulate the effect of grubs on height growth a uniformly distributed random number between 5 and 9 is generated, and site index is reduced by this amount. WW Control of white grubs is accomplished by applying a pesticide such as aldrin at the time of planting an old field site (Fowler and Wilson, 1971). Fowler and Wilson (1974) report that application of aldrin reduced white grub caused red pine seedling mortality by 83% in the first five years. If white grub control is chosen in the model, the combined four year mortality figure is reduced by 83%. Also, site index is assumed to return to normal. W11 The pine root collar weevil (Hzlghigs,radigi§ Buch.) causes mortality and growth loss in red pine. This weevil is found throughout northeastern North America. Trees between the ages of 8 and 15 years are most vulnerable to attack (Wilson and Kennedy, 1970). The injury is caused by larval feeding in the inner bark of the root collar. A mean number of 2.2 immature insects per tree is considered the threshold of tree mortality (Wilson and Millers, 1983). As a red pine plantation approaches crown closure the environment around the base of the tree becomes less favorable for weevils and populations begin to decline naturally (Wilson and Millers, 1983). Wilson and Kennedy (1970) described three pine root collar weevil hazard zones in Northern Lower Michigan. The zones are categorized by their degree of potential weevil damage. Wilson also quantified the probability of heavy damage (death) to red pine in a hazard zone relative to the distance to the nearest weevil infested stand. Table 2 is reproduced from Wilson and Kennedy (1970). 27 28 Table 2. Probability of heavy damage to red pine from root collar weevil, by hazard zone and distance to a weevil infestation (Wilson and Kennedy, 1970). Distance to weevil Hazard Zones infestation Low Medium High Miles 4% 3 X 0 - 1/8 5 15 >50 1/8 - 1/2 5 10 40 1/2 - 1 5 5 25 1+ <5 5 10 Stand damage is divided into three categories: light, moderate, and heavy. Red pine mortality in lightly damaged stands will be less than 5%. Damage is usually light in the low hazard zone. Red pine mortality in moderately damaged stands will range from 5% to 10%. In the medium hazard zone, damage can be light or moderate. Heavily damaged stands will have red pine mortality of 10% to 15%. In the high hazard zone, damage is usually moderate or heavy (Wilson and Millers, 1983). Pine root collar weevil reduces red pine height growth beginning two growing seasons before the tree dies. Two years before death height growth is reduced about 7%. The year before death height growth is reduced about 24% (Schmiege, 1958). The model assumes that trees which experience significant growth loss are very close to death and will probably die within a short time. Rather than accounting for a 24% loss of height growth the year before an attacked tree dies, growth loss is ignored and the tree 29 is assumed to die. There are two methods of controlling poulations of pine root collar weevil. The first is spraying insecticide such as lindane around the base of each tree (Finnegan and Stewart, 1962). One application between ages 6 years and 10 years will usually keep the trees growing well until the crowns begin to close and weevil populations begin to decline naturally (Wilson and Millers, 1983). The second method involves pruning the branches of the lower 2 feet of the tree trunk and scraping the litter and topsoil from around the base of the tree for a distance of 1 foot. This treatment usually suppresses the weevil population for 4 or 5 years and allows the tree to reach crown closure safely (Wilson, 1967). .11- v. 11.1; \°° °_. 3_ 3; ”'3 , '9 1;! I; Simulation begins by randomly assigning the stand to a weevil hazard zone, and setting a random distance to the nearest weevil infested stand. The probability of heavy damage is determined using the hazard zone and distance to infestation (see Table 2). A random number between 0 and 1 is now generated. If this number is less than the probablility of heavy damage then percent red pine mortality is determined based on the hazard zone. If the random number is greater than the probablility of heavy damage no red pine mortality occurs. 30 If the hazard zone is low then mortality percentages between 0% and 5% are possible. In the medium hazard zone mortality can range from 0% to 10%. Red pine mortality in the high hazard zone can take on values from 5% to 15%. The number of trees per acre is then reduced equally across all diameter classes to account for the simulated mortality. The assumption is made that the trees which experience growth loss will die, and they are included in the mortality percentage generated above. Both control options outlined above are possible in the model. Control takes place in year 8 after planting. Adult weevil surveys are automatically scheduled for year 4 and year 7 after planting if this option is chosen, and their cost is included in the economic analyses. Saratgss_fieitilahns The Saratoga spittlebug (Arhrgehgra saratgsensis [Fitch]), found throughout the geographic range of red pine, is responsible for mortality, deformity, and loss of growth in red pine plantations where trees are between 3 and 15 feet tall. Adult spittlebugs feed by inserting their beak into red pine twigs of the previous year’s growth and sucking plant juices out. The puncture wound and the bug’s saliva create necrotic tissue and stimulate resin accumulation. This blocks fluid transport in the xylem and phloem and can eventually kill the branch. If feeding is heavy enough, the branch will flag. The bugs prefer to feed in the upper whorl of branches. If the top branches are killed, lower whorls compete for terminal dominance, resulting in a height growth loss. Crooked or forked trees usually are the result (Heyd, 1978). If enough feeding occurs the tree will die. In order to complete its life cycle the immature spittlebugs require that one of several alternate host plants be available for feeding. The primary alternate host is sweet-fern, Cgmptgnia ,pgzggrina Coult. However there are approximately 200 other secondary hosts including blackberry, raspberry, bracken fern, blueberry, goldenrod, and Sumac (Wilson, 1971). Without any of these alternate 31 32 hosts, the Saratoga spittlebug cannnot complete its development. Wilson (1971) developed a method to rate the risk of Saratoga spittlebug injury to a potential planting site, or an existing stand. The technique involves estimating the percent ground cover of sweet-fern and other alternate host plants. Wilson published a risk rating graph which uses the two cover values to place a stand into one of three risk categories: low, moderate, or heavy. Heyd (1978) studied the impact of Saratoga spittlebug on red pine in northen Lower Michigan and described the growth loss as uniformly affecting the diameter and height growth of the tree. A method was developed by Heyd which ties growth loss to Wilson’s plantation risk categories. Red pine on low risk sites can lose a maximum of 4 years growth. Trees on moderate risk sites can lose between 4 and 10 years of growth, depending upon spittlebug population levels. Trees on heavy risk sites can lose their entire volume to mortality and loss of merchantability due to crooked and misshapen stems. There are two ways to control the impact of the Saratoga spittlebug on red pine growth and yield. The first is by using an insecticide (such as malathion) to directly reduce the spittlebug population. Wilson and Millers (1966) found that malathion reduced Saratoga spittlebug populations by 99% in northern Lower Michigan. Many insecticides, including malathion, are not selective 33 for spittlebug and may kill beneficial predatory insects. The second control method involves reducing the population of alternate host plants, especially sweet-fern. Depending upon the size of the plantation this control may be either mechanical or chemical. If the area is small, mowing could be sufficient. However, mowing encourages resprouting of sweet-fern and actually leads to increased density (Heyd et al., 1987). Chemical control seems to be much more promising, if more expensive. Heyd et al. (1987), working in northern Lower Michigan, found that 2 or 3 quarts of Roundup per acre will effectively control sweetsfern, and other alternate hosts such as blueberry, at least into the fourth year after treatment. Three years after treatment sweet-fern ground cover was only 4%, down from a pre-treatment level of 31%. An added benefit of chemically controlling alternate hosts is the reduction in vegetative competition with the young red pine. This may increase red pine site index by 5 units on moderate risk areas if site index is between 50 and 70, and by 10 units on high risk sites for the same range of site indexes (Heyd, 1982). Simulation of Saratoga spittlebug impact begins with the random generation of sweet-fern percent ground cover. The ground area not covered by sweet-fern is randomly 34 assigned a percent cover for all other alternate host plants. These two numbers are used to determine the spittlebug risk rating of the plantation. The next step is determination of the extent of damage to the stand. If the risk rating is low, then a random number between 0 and 4 is generated to represent the number of years of growth that will be lost. If the risk category is moderate, then a random number between 4 and 10 is generated to represent years of lost growth. If the risk category is high then the stand is assumed to have a 50% chance of losing between 10 years and 20 years of growth, and a 50% chance of losing all merchantable volume. So a random number is generated to represent the probability and growth loss is assigned according to its value. Alternative control strategies are available in the model to offset red pine growth loss. Selection of chemical control of alternate hosts at the time of planting is assumed to keep the stand in the low risk category until it reaches crown closure. At crown closure the alternate host plants are shaded out by the trees and the risk from Saratoga spittlebug is removed. Site index is also increased if herbicide is applied (Heyd, 1982). Selection of insect control using insecticide, following Heyd (1985), is assumed to require one application for low and moderate risk sites, and two sprays for a high risk site. If site index is less than 50 then a second spray is needed on moderate risk sites and a third 35 spray is needed on high risk sites to compensate for the extended period of time the trees are vulnerable due to slow height growth (Heyd, 1981). The assumption is made that the insecticide will adequately protect the I plantation. W The red-headed pine sawfly (Nggdiprign leggntgi [Fitch]) causes mortality, deformity, and growth loss in red pine 3 feet to 15 feet tall. The tree is injured as the sawfly larvae consume its needles. Over the past 50 years the red-headed pine sawfly has been the third most important target for insect suppression programs on National Forests in the eastern portion of the U.S (Averill et al., 1982). Susceptibility of red pine to sawfly defoliation is directly related to tree vigor. Water stress is a very important factor in the tree’s ability to resist sawfly attack. Extended periods of drought or poor quality sites can predispose a stand to attack (Averill et al., 1982). Averill (1977) and Averill et al. (1982), in studies conducted in northern Lower and Upper Michigan, Wisconsin, New York, and Ontraio, Canada, proposed a method of classifying plantation sites into Site Resistance Classes (SRC) based on ground cover, distance to hardwood edges, and soil characteristics. Trees on SRC I sites are very resistant to sawfly attack, and sawfly populations are widely scattered. Trees on SRC II sites are fairly resistant, and sawfly populations are scattered with some trees moderately infested. SRC III sites are very dry, 36 37 sawfly populations are high, and trees are generally heavily infested. Site index on SRC III sites is usually near or below 50 (Averill et al., 1982). In Northern Lower Michigan alone there are over 92,000 acres of red pine on sites where the site index is less than 50 (Jakes, 1982). Sawfly damage on SRC I sites is slight, and tree mortality is rare. Two SRC I sites had mortality of 1.3% and 0% after a three year red-headed pine sawfly outbreak. Pulpwood yield was reduced very slightly, and sawlog yield was not affected (Averill et al., 1982). Red pine on SRC II sites also experience very little problem. A few trees are killed (1.8% in the outbreak mentioned above) and others are top killed, resulting in forked or crooked trees. Again, pulpwood yield was slightly affected, and sawlog yield was not affected (Averill et al., 1982). Red-headed pine sawfly causes serious problems for red pine on SRC III sites. Tree mortality is rapid and wide spread (52.4% in the outbreak mentioned above), and trees that remain alive are stunted and severly deformed. Merchantable volume is usually less than 1% of the volume remaining (Averill et al., 1982). There are two ways of controlling the red-headed pine sawfly: chemical and cultural. The chemical control consists of applying insecticide to heavily infested SRC III areas in the early stages of the population build-up. Cultural control involves suppressing vegetation which 38 competes with young red pine for moisture and other resources needed for growth. ,!!_,5_ !: :3'.-!,35.°_3'. I; .5..l‘ ' 'F'v’. '9 :6. . 9; ° .U; Simulation of red-headed pine sawfly impact begins with the generation of a random number between 6 and 13, which represents the simulated stand’s age when the sawfly population reaches outbreak levels. Most tree mortality occurs in one year (Averill et al., 1982). Red pine stands are not often composed entirely of one site resistance class, so the next step is to determine the proportion of the stand in each SRC. These proportions are randomly set. If site index is above 50, there will be no SRC III areas in the plantation. Percent mortality for the trees in the SRC I portion of the plantation is randomly set between 0 and 1.3%. Mortality percent for SRC II trees is randomly set between 0 and 1.8%. All trees in the SRC III areas of the plantation are assumed to be dead or unmerchantable, and are removed from the trees per acre count. Both control options mentioned above, application of insecticide and application of herbicide at time of planting, are available in the model. Sawfly populations remain at relatively constant levels until the year of a population outbreak, when they rise dramatically (G.A. Simmons, 1987, Michigan State University, personal 39 communication). For this reason, insecticide application is assumed to occur in the randomly generated outbreak year (G.A. Simmons, 1987, Michigan State University, personal communication), and be effective enough to reduce tree mortality to SRC II levels. Herbicide application is also assumed to be effective in maintaining tree vigor to the point where SRC II mortality levels are achieved. W To compare costs and revenues which occur throughout a lengthy rotation on an even basis, the values must be discounted to a common year. In this model that is the year of planting, year 0. Gunter and Haney (1984) suggest that for ease of calculation all costs and revenues should be considered to occur at the end of the year. This convention is followed in RPPEST. Two analyses are performed after Drapek (1985). The first compares all costs with all revenues to evaluate the overall management strategy using Net Present Value (NPV). Net Present Value is calculated by subtracting the sum of the discounted costs from the sum of the discounted revenues. If the result is positive then the red pine stand in question compares favorably with alternative investments with real rates of return of 4% or less. The second analysis also uses NPV to evaluate insect management efforts. The discounted value of the wood saved by monitor and control techniques is compared with the discounted costs of those techniques. Again, a positive NPV indicates a worthwhile investment. 40 W RPPEST is a stand level model designed as a training tool for land managers which simulates the impact of four major insect pests on red pine. The model allows a wide range of initial site conditions and the establishment of thining regimes. Insect control measures are available in the model, and an economic analysis using Net Present Value is performed after the stand is harvested. The growth and yield portion of the model has been shown to be applicable throughout the Lake States and southern Ontario (Lundgren, 1983). The insect impact models used in RPPEST should also apply throughout the same region. However, these models should be tested for accuracy on a local basis. Additional information is needed regarding early survival of planted red pine, especially beyond the first year and in relation to site and climatological factors. Once the tree has reached about five feet in height, mortality seems to be fairly well quantified. More information is also needed concerning red pine diameter distributions. The Weibull distribution has the flexibility to accurately describe diameter distributions, and an extension of the work of Zarnoch et al. (1982) would be a valuable addition to the literature. 41 42 Much remains to be learned about the insects included in this model. Factors involved in population dynamics of pine root collar weevil, Saratoga spittlebug, and red- headed pine sawfly are not well documented. The length of population cycles and the factors which combine to promote insect outbreaks need further study. Information about mortality rates and their causes at each stage of the insects’ life cycles'are not known. Additional investigation is also required into the effects of Saratoga spittlebug and white grub damage as previously injured trees age. Quantification of the relationship between site quality and insect damage would be directly beneficial to land managers trying to assess the impact of an insect outbreak just getting under way. Information about interaction between these insects does not exist. For example, does white grub injury predispose a stand to attack, or increased levels of damage, by pine root collar weevil? The information needs outlined above present a formidable challenge to entomologists and forest land managers. However, the addition of this information to what is already known about the interactions between the forest and these insects would greatly assist forest and forest insect management in the Lake States. LIST OF REFERENCES LIST OF REFERENCES Averill, R.D. 1977. Impact of red-headed pine sawfly, Negdiprign leggntgi, on young red pine plantations. Ph.D. Dissertation, 127 p. Michigan State University, E. Lansing. Averill, R.D., L.F. Wilson, and R.F. Fowler. 1982. Impact of the redheaded pine sawfly (Hymenoptera: Diprionidae) on young red pine plantations. Great Lakes Entomol. 15(2): 65-91. Belcher, D.M. 1982. TWIGS: The woodsman’s ideal growth projection system. P. 70-95 in Microcomputers, a new tool for foresters. Purdue Univ. Dept. For. & Nat. Res. West LaFayette, IN. Belcher, D.M., M.R. Holdaway, and G.J. Brand. 1982. A description of STEMS, the Stand and Tree Evaluation and Modeling System. USDA Forest Service Gen. Tech. Rep. NC-79, 18 p. Benzie, J.W. 1977. Manager’s handbook for red pine in the North Central states. USDA Forest Service Gen. Tech. Rep. NC-33, 22 p. Benzie, J.W. and J.E. McCumber. 1983. Red pine. P. 89-91 in R.M. Burns (tech. compiler). Silvicultural Systems for the Major Forest Types of the United States. USDA Forest Service Ag. Hndbk. 445, 191 p. Brand, G.J. 1979. Timber management guides and marking rules. P. 56-60 in A Generalized Forest Growth Projection System Applied to the Lake States Region. USDA Forest Service Gen. Tech. Rep. NC-49, 96 p. Buchman, R.G. 1979. Mortality functions. P. 47-55 in A Generalized Forest Growth Projection System Applied to the Lake States Region. USDA Forest Service Gen. Tech. Rep. NC-49, 96 p. Buchman, R.G. 1983. Survival predictions for major Lake States tree species. USDA Forest Service Res. Paper NC-233, 7 p. 43 44 Buchman, R.G. 1985. Performance of a tree survival model on national forests. N. J. Appl. For. 2(4): 114-116. Buckman, R.E. 1962. Growth and yield of red pine in Minnesota. USDA Forest Service Tech. Bull. 1272, 50 p. Carmean, W.H. 1971. Large, well balanced stock and control of grass competition needed for red pine plantings on sandy soils. Tree Planters’ Notes. 22(1): 8-10. Chen, C.M. and D.W. Rose. 1978. Nonlinear basal area growth models for red pine. P. 17-20 in Proceedings 1977 Midwest Forest Mensurationists Meeting. USDA Forest Service Gen. Tech. Rep. NC-46. Drapek, R.J. 1985. A simulation of jack pine budworm and white pine weevil monitor and control techniques and their effects on jack pine economics. M.S. Thesis, 118 p. Michigan State University, E. Lansing. Emch, D.J. and K.L. Carvell. 1985.. Effects of cold storage and planting date on red pine survival and growth. N. J. Appl. For. 2(2): 51-53. Finnegan, R.J. and K.E. Stewart. 1962. Control of the pine root collar weevil, Hxlghius radigis. J. Econ. Entomol. 55: 482-486. Fowler, R.F., and L.F. Wilson. 1971. White grub populations, thllgphaga spp., in relation to damaged red pine seedlings in Michigan and Wisconsin plantations (Coleoptera: Scarabaeidae). Michigan Entomol. 4(1): 23-28. Fowler, R.F.and L.F. Wilson. 1974. Injury to Aldrin- treated and untreated red pine by white grubs (Coleoptera: Scarabaeidae) and other agents during first five years after planting. Michigan Entomol. 7(3): 81-88. Fowler, R.F., L.F. Wilson, and A.L. Lundgren. 1982. Projected red pine yields from Aldrin-treated and untreated stands damaged aby white grub (Coleoptera: Scarabaeidae) and other agents at stand age ten years. Great Lakes Entomol. 15(3): 165-170. Gunter, J.E. and H.L. Haney. 1984. Essentials of Forestry Investment Analysis. 337 p. OSU Bookstores, Corvallis, OR. 45 Hafley, W.L. and H.T. Schreuder. 1977. Statistical distributions for fitting diameter and height data in even-aged stands. Can. J. For. Res. 7: 481-487. Heyd, R.L. 1978. An evaluation of the impact of the Saratoga Spittlebug. Annmhsua W (Fitch). on the growth of red pine, Rings resingsa Ait. Ph.D. Dissertation, 80 p. Michigan State University, E. Lansing. Heyd, R.L. 1982. Insects versus artificial regeneration of conifers. P. 358-374 in G.D. Mroz and J.F. Berner(compilers). Proc. Artif. Regen. of Conifers in the Upper Great Lakes Region, 26-28 Oct. 1982, Green Bay, WI, 435 p. Mich. Tech. Univ., Houghton. Heyd, R.L. 1985. NPVUNPL. A Saratoga spittlebug simulation program. Available from the Michigan Cooperative Forest Pest Management Program. East Lansing, Michigan. Heyd, R.L. and L.F. Wilson. 1981. Risk-rating red pine plantations to predict losses from Saratoga spittlebug for management decisions. P. 93-98 in R.L. Hedden, S.J. Barras, and J.E. Coster (tech. coords.). Hazard- Rating Systems in For. Insect Pest Mgt.: Symp. Proc., 31 July-1 Aug. 1980, Athens, GA. USDA Forest Service Gen. TEch. Rep. WO-27, 169 p. Heyd, R.L., R.L. Murray, and L.F. Wilson. 1987. Managing Saratoga spittlebug in pine plantations by suppressing sweetfern. N. J. Appl. For. 4(1): 16-17. Jakes, P.J. 1982. Timber resources of Michigan’s Northern Lower Peninsula, 1980. USDA Forest Service Res. Bull. NC-62, 120 p. Knighton, M.D. 1972. Effect of ground preparation on planted red pine in Southwestern Wisconsin. USDA Forest Service Res. Note NC-134, 2 p. Labumbard, H. 1984. Considerations in maintaining a quality planting program. P. 136-145 in R. Marty(editor). Managing Red Pine: Proceedings of the SAF Region V Technical Conference, 1-3 Oct. 1984, Marquette, MI, 273 p. Michigan State Univ., E. Lansing. Lundgren, A.L. 1981. The effect of initial number of trees per acre and thinning densities on timber yields from red pine plantations in the Lake States. USDA Forest Service Res. Paper NC-193, 25 p. 46 Lundgren, A.L. 1983. New site productivity estimates for red pine in the Lake States. J. Forestry 81(11): 714-717. Lundgren, A.L. and W.A. Dolid. 1970. Biological growth functions describe published site index curves for Lake States timber species. USDA Forest Service Res. Paper NC-36, 9 p. Norris, F.W. 1987. Timber Mart North, lst quarter 1987. Highlands, NC. Ramm, C.W. and C.L. Miner. 1986. Growth and yield programs used on microcomputers in the north central region. N. J. Appl. For. 3(2): 44-46. Reed, D.D., E.A. Jones, T.R. Bottenfield, and C.C. Trettin. 1986. Compatible cubic volume and basal area equations for red pine plantations. Can. J. For. Res. 16: 416- 419. Sajdak, R.L. 1982. Site preparation in the Upper Great Lakes Region. P. 209-214 in G.D. Mroz and J.F. Berner(compilers). Proc. Artif. Regen. of Conifers in the Upper Great Lakes Region, 26-28 Oct. 1982, Green Bay WI, 435 p. Mich. Tech. Univ., Houghton. Schmiege, D.C. 1958. A study of the pine root collar weevil with particular reference to survey methods. M.S. Thesis, 85 p. Univ. Minnesota, Minneapolis. Stage, A.R. 1973. Prognosis model for stand development. USDA Forest Service Res. Pap. INT-137, 32 p. Stiell, W.M. and A.B. Berry. 1973. Yield of unthinned red pine plantations at the Petawawa Experiment Station. Canadian Forestry Service, Dept. of Envir., Publication 1320, 16 p. USDA Forest Service. 1979. A generalized forest growth projection system applied to the Lake States region. USDA Forest Service Gen. Tech. Rep. NC-49, 96 p. Wambach, R.F. 1967. A Silvicultural and economic appraisal of initial spacing in red pine. Ph.D. Dissertation, 282 p. University of Minnesota, Minneapolis. Wilson, L.F. 1971. Risk-rating Saratoga spittlebug damage by abundance of alternate-host plants. USDA Forest Service Res. Note NC-110, 4 p. Wilson, L.F. and P.C. Kennedy. 1970. Pine root collar weevil hazard zones for red pine in Lower Michigan. USDA Forest Service Res. Note NC-104, 2 p. 47 Wilson, L.F. and I. Millers. 1966. Suppression of Saratoga spittlebug with helicopter application of low- and high-volume malathion. J. Econ. Entom. 59(6): 1456- 1458. Wilson, L.F. and I. Millers. 1983. Pine root collar weevil - its ecology and management. USDA Forest Service Tech. Bull. 1675, 33 p. Winebar, B.L. and J.E. Gunter. 1984. Costs of forest management practices in the Lake States - including a comparison of costs between the major types of forestry organizations. P. 43-70 in R. Marty(editor). Managing Red Pine: Proceedings of the SAF Region V Technical Conference, 1-3 Oct. 1984, Marquette, MI, 273 p. Michigan State Univ., E. Lansing. Zarnoch, S.J., C.W. Ramm, V.J. Rudolph, and M.W. Day. 1982. The effects of red pine thinning regimes on diameter distribution fitted to the Weibull function. Mich. State Univ. Ag. Exp. Sta. Res. Rep. 423, 11 p. APPENDIX A APPENDIX A A User’s Guide For RPPEST Imam RPPEST is a computer program written in Turbo Pascal for IBM PC compatible microcomputers. The purpose of the program is to simulate the effects of insect damage on red pine growth and volume yield and to economically evaluate various control methods. Four insects are included in the program: white grubs, pine root collar weevil, Saratoga spittlebug, red-headed pine sawfly. The effect of one insect may be simulated, or a stand may be grown with no insects present. When used only for red pine growth and yield, a stand may be joined at any point in it’s life up to the maximum rotation age of 135 years. Initial number of trees per acre, initial basal area per acre, merchantability limits, and thinning regimes are all flexible within certain broad limits. To simulate insect impact the stand must be grown from the time of planting. Initial basal area per acre is estimated within the program. Once a stand is established and an insect is chosen, the impact of that insect is determined. Control measures are available to counter the insect’s impact. 48 49 Two stands are then grown simultaneously: one with insect control measures implemented (Stand 1), the other with no insect controls (Stand 2). Costs associated with insect monitoring and control and with stand establishment and management are discounted and compared with discounted revenues from thinnings and the final stand harvest. Wm RPPEEST is designed to run on the IBM PC and compatible microcomputers. The program was developed on a Leading Edge Model D microcomputer.' 64 kilobytes of RAM memory is sufficient to run the program. A monochrome monitor is required. Graphics capabilities are not required. Currently, no provision is made for printing RPPEST output. Bunnins_BEEE§I RPPEST appears on the disk as a .COM file which has two overlay files associated with it. Overlay files are labeled RPPEST with a numeric file extension (eg., RPPEST.001). The overlay files must be present on the same disk drive as the RPPEST.COM file for the program to function correctly. To start the program make sure the RPPEST disk is in the default disk drive, and type RPPEST followed by a 50 carriage return. W The main menu of the program provides an opportunity to specify simulation of red pine growth and yield with or without the influence of insects. If insects are desired item 2 must be chosen at this point. Insects may not be introduced into the stand later in the program. Winn Both choices from the main menu require that several pieces of information be entered initially. Some of this information is common to both choices, such as site index, merchantability limits, stand age, initial basal area, trees per acre, harvest age and display interval. These common items are described below. Site index is the height of dominant and codominant trees, in feet, at the base age of 50 years. In RPPEST, site index must be between 30 and 90 feet. Minimum poletimber dbh is used to specify the smallest diameter of merchantable trees. This value must be larger than 3.5 inches in order to fall within the data range of the volume equations used. Minimum sawtimber dbh defines the smallest trees for which International 1/4 inch board foot volume will be calculated. The only restriction placed on this 51 value is that it be larger than the minimum poletimber dbh. Stand age at the beginning of projections may be any age less than the maximum age of 135 years if there are no insects in the stand. Insect infested stands must begin in the year of planting, year 0. Initial basal area, in square feet per acre, must be set by the user if the trees are 25 years or older from seed. If the trees are younger than 25 and taller than 4.5 feet, initial basal area may be specified or estimated by the program using an equation developed by Lundgren (1981) from data originally collected by Wambach (1967). Initial basal area must be lower than 180 square feet per acre. Trees per acre at the beginning of projections must be between 200 and 1600. Harvest age must be no greater than the maximum age of 135 years. The display interval is the number of years of stand projections between stand description displays. WWW Additional initial information is needed for simulation of stands under insect attack. One of the four insects must be selected, and the user must enter information on type of control, desired site preparation, type of planting, product prices, and inventory and sale layout costs. Default costs are available in the program, 52 or the user may enter a different value. Site preparation may be selected as mechanical, chemical, or no site preparation. Mechanical and chemical methods have default costs of $64.57 and $52.30, respectively, adjusted for inflation (Winebar and Gunter, 1984). They are assumed to be equally effective. Planting may be done by machine or by hand. Default adjusted costs from Winebar and Gunter (1984) for machine planting without site preparation are $134.41 per acre for less than 800 trees and $146.65 per acre for more than 800 trees. Hand planting without site preparation costs $124.25 per acre for less than 800 trees and $116.02 per acre for more than 800 trees. Machine planting with site preparation costs $88.09 per acre for less than 800 trees, and $136.24 per acre for more than 800 trees. Hand planting with site preparation costs $109.50 per acre for less than 800 trees, and $148.97 per acre for more than 800 trees. The default price for red pine cordwood is $12.00 per standard cord, while sawlogs are $70.00 per MBF (International 1/4" rule) (Norris, 1987). The default cost for timber inventory is $6.73 per acre (Winebar and Gunter, 1984). An inventory is conducted before every thinning and before the final harvest. The default cost for timber sale layout is $9.38 per acre (Winebar and Gunter, 1984). Sale layout occurs with every thinning and the final harvest. 53 Default forest management costs are summarized in Table 3. The default annual interest rate used for discounting costs and revenues to the year of planting is set at 5% (R.J. Marty, 1987, Michigan State University, personal communication). This is a real rate, beyond inflation. 54 Table 3. Default costs for forest management activities and stumpage. Willa Wat Mechanical Site Preparation $ 64.57 /ac. Chemical Site Preparation $ 52.30 /ac. Machine Planting without Site Prep, (800 trees / ac. $134.41 /ac. Machine Planting without Site Prep, >800 trees / ac. $146.65 /ac. Hand Planting without Site Prep, (800 trees / ac. $124.25 /ac. Hand Planting without Site Prep, >800 trees / ac. $116.02 /ac. Machine Planting with Site Prep, <800 trees / ac. $ 88.09 lac. Machine Planting with Site Prep, >800 trees / ac. $136.24 /ac. Hand Planting with Site Prep, (800 trees / ac. $109.50 lac. Hand Planting with Site Prep, >800 trees / ac. $148.97 /ac. Timber Inventory $ 6.73 /ac. Timber Sale Layout $ 9.38 /ac. Cordwood Price $ 12.00 /cord Sawtimber Price $ 70.00 /MBF 55 WW RPPEST simulates the individual influence of four insects on the growth and yield of red pine: white grubs, pine root collar weevil, Saratoga spittlebug, red-headed pine sawfly. Ranges of random values used in RPPEST insect models are summarized in Table 4. Default insect management costs are summarized in Table 5. W White grub impact on red pine shows up as seedling mortality and site index reduction. Control is achieved by applying a pesticide at the time of planting. The default cost for control is $30.00 per acre; control occurs in year 0. The plantation must be monitored for grub populations before control is attempted. The default cost for monitoring is $8.00 per acre, and it occurs in year 0. If control is selected it is assumed to be 83% effective, and mortality is reduced by this factor. Site index is also returned to the original value. If no control is chosen mortality remains unaffected, there are no monitor or control costs recorded and site index remains reduced. 56 Table 4. Range of random values used in RPPEST simulations. Insect Ashen W White Grubs lst & 2nd year mortality 0% - 40% 3rd year mortality 1% - 12% 4th year mortality 0% - 3% Site index reduction 5 - 9 units Pine root collar weevil Saratoga spittlebug moderate Red-headed pine sawfly Hazard zone Low hazard zone mortality Medium hazard zone mortality High hazard zone mortality Risk rating Low risk growth loss Moderate risk growth loss High risk growth loss Outbreak year SRC I mortality SRC II mortality SRC III mortality low, medium, high 0% - 5% 0% - 10% 5% - 15% low, high 0 - 4 years 4 - 10 years 10 years to total stand 6 - 13 0% - 1.3% 0% - 1.8% 100% 57 Table 5. Default costs for insect management activities in RPPEST. __lns_e_eiz_ M W White grubs Monitoring $ 8.00 /ac. Chemical Control $30.00 lac. Pine root Monitoring $10.00 /ac. collar weevil Pruning & Scraping $ 6.00 lac. Basal Spraying variable Saratoga Risk Rating 8 1.00 /ac. spittlebug Monitoring $ 1.50 /ac. Aerial Insecticide $12.00 /ac. Herbicide-Hand Planting $70.00 /ac. Herbicide-Machine Planting $60.00 /ac. Red-headed Monitoring 8 1.50 /ac. pine sawfly Aerial Insecticide $12.00 /ac. Herbicide-Hand Planting $70.00 /ac. Herbicide-Machine Planting $60.00 /ac. 58 W1. Pine root collar weevil causes mortality in red pine plantations which have not reached crown closure. The default cost of monitoring weevil populations is $10.00 per acre and occurs in years 3 and 6 if control is chosen. Weevils may be controlled by basal pruning and by scraping away duff and topsoil from each tree. The default cost for pruning and scraping assumes a labor rate of $6.00 per hour and a work rate of 60 trees per hour. This action occurs in year 7. Weevils may also be controlled by basal insecticide spraying of each tree. The default cost assumes a labor rate of $6.00 per hour, a work rate of 120 trees per hour and a chemical cost of $5.00 per acre. This cost occurs in year 7. WW Saratoga spittlebug impact on red pine manifests itself in years of lost growth and tree mortality in stands which have not reached crown closure. One method of controlling spittlebug is to reduce alternate host plants by applying herbicide at planting. The default cost for this control method is $70.00 per acre if the stand is planted by hand, and $60.00 per acre if the stand is machine planted. This cost occurs in year 0. 59 Risk rating the plantation costs $1.00 per acre and also occurs in year 0. A second control method is to reduce the spittlebug population using insecticide. The default cost is $12.00 per acre for aerial spraying (Heyd, 1982). Monitoring populations costs $1.50 per acre. The number of sprays and monitorings depends upon the hazard rating of the stand and site index (Heyd, 1985). Low risk and site index greater than 50 requires monitoring in years 4 and 6, and spraying in year 6. If site index is less than 50, an additional monitoring is scheduled for year 10. Moderate risk rating and site index greater than 50 requires monitoring in years 4, 6, and 10, and spraying in year 6. Moderate risk and site index less than 50 requires monitoring in years 4, 6, 10, and 12, and sprays in years 6 and 12. High risk and site index higher than 50 requires monitoring in years 4, 8, and 9, and sprays in years 4 and 9. High risk and site index less than 50 requires monitoring in years 4, 8, 9, and 14, and sprays in years 4, 9, and 14. All controls are assumed to put the stand in the low risk category. WW! Red-headed pine sawfly causes tree mortality and deformation in red pine stands on poor sites (site index < 50) which have not reached crown closure. Sawfly impact can be greatly reduced by controlling 60 competing vegetation or by spraying insecticide to reduce sawfly populations. Controlling competing vegetation occurs in year 0 and has a default cost of $70.00 per acre if the stand was planted by hand, or a cost of $60.00 per acre if machine planted. Controlling sawfly populations occurs during the randomly determined outbreak year and costs $12.00 per acre. Monitoring sawfly populations occurs 3 years before the outbreak year and in the outbreak year, and costs $2.00 per acre. Both control methods are assumed to reduce impact to a negligible level. Thinning Thinning in RPPEST assumes every tree has an equal chance of being selected, as in mechanical thinning. Trees are removed equally across the entire diameter distribution. Basal area per acre and trees per acre are reduced by the same fraction, leaving quadratic mean diameter unchanged. To implement thinning requires initial values for age at first thinning, minimum basal area at the first thinning, thinning interval, stand age at final thinning. Also, one of three types of thinnings must be chosen: remove a specific number of trees per acre, remove a constant proportion of the basal area or trees per acre, or thin to a specified residual basal area per acre. 61 WW To compare costs and revenues which occur throughout a lengthy rotation on an even basis these values must be discounted to a common year. In this program that is the year of planting, year 0. Gunter and Haney (1984) suggest that for ease of calculation all costs and revenues should be considered to occur at the end of the year. This convention is followed in RPPEST. Two analyses are performed after Drapek (1985). The first compares all costs with all revenues to evaluate the overall management strategy using Net Present Value (NPV). Net Present Value is calculated by subtracting the sum of the discounted costs from the sum of the discounted revenues. If the result of this subraction is positive then the red pine stand in question compares favorably with alternative investments. The second analysis also uses NPV to evaluate insect management efforts. The discounted value of the wood saved by monitor and control techniques is compared with the discounted costs of those techniques. Again, a positive NPV indicates a worthwhile investment. Sam PP S Figures 2 through 16 show a typical RPPEST run involving white grubs. Figures 2 through 6 show 62 preliminary information. The remainder of the figures show periodic output and final summary screens. 63 .eoflsmssoecH eeapm HmfipscH .m assess «A2 no wv mosaw> omogp no use omssao 09 was: so» on Ca u Raunchy Hs>uovaa Seamufin .m on u 0mm vuo>hmm omm u once won moose . (ONO 0.0 u mono Human HoapacH o u ncofipoonowm mo unequamon we owe tsopm N u mcapcmam 9m 0mm mafiatoom o.oH u gnu Honsfipssm Eseficwz Nmfl'ln o.m M £96 HoDEHQOHom ESEach om u xoees opsm .H 64 .moapesmomcH oasocoom use soapmnmmmnm spam HmefiGH .m oHstm z wfiz .HO VV mmfidwxr OmOfimP 90 %G6 Omnnflfio OP fiflflbp 50s» 09 oo.o> a mm mm: \ oven“ was oo.mH a ma choc \ OOaHm me.m a ma Duos Hon pmoo Anopao>sH mm.m a ma once so“ vmoo pSOAsH oamm .psoouom o.m ma open Puouovaa Hoscc< mo.mm a ma owes hon #moo mnfiwnmam ocunosz up flowcmam 03 Had: mocha one >m.¢m a ma owes mom Pmoo :ofipswomoum swam Hecasogooz on on mcwom ma seapohwmoum Opfim unsuw ovwzz ma pnoHOpcfi Mo poems“ 0:9 NCOfi‘l-OCDI‘IDO) H 65 .H8>H>Hsm medaemmm meow pmHHh .3 mhswfih .ossapsoo on mom oosmm 0:9 umoum .ouom \ mooup mam ucfiopqoo 30c :o«powsoam wso> .R m.m> on Add: Open Hw>fi>w5m woos pmH H50» pmsw poouoou o>m£ snow «0 mpg“: 0:9 66 .hpdampno: wsaauomm vomsmo poomzH .m onsmah a.0owoso Howvsoo asum H50» mo Hones: 0:9 wowsm .vnoo opmatossa o: sauce was .nnswm 0:9 ouosmH was owan 0:0 ocean .m .mcapnwam mo asap 05p #6 ovfioanuom s hamm< .H .onso nfigv ca amoqund mo mo>fipmswowas psosomosoe poems“ 039 one chose .psoouom H on HA“: v Hook a“ SHHHwPHoE mcaapoom .pgoouom N on Hafiz m new» ad mafiasvwos mafiatoom .Ho>oa codvmasmom man» on psommownoo ov pom soon we; pcoouom OH HO Apfiaspuoa mcaatoou use» paw use Qua confinsoo < .m>.o was 0 :003909 hwm> has wonsss mane .posmaanmpmo soon as: Haom «0 900m canso hon madam mm.o mo :OAvasmom Umpmuosom SHEOUaoH < .mpH0ah 085ao> scam pow pOpOOnowm so unsum ones: «0 upcommo 0:9 OpwHSEflm op nomono o>M£ 50> 6? .mpmoo Honpnoo use Hepdco: poemsH .0 onsmfim o .05Hd> Passwon 059 was on 0 Hence Ho Pmoo 039 wovcm .owos mom oo.m9 ma meanopasoe mo puoo vasomoc 0:9 .camon goo usofipoo aouwcoo OHOMOD vOHOpHcos on puss owdu msapgmam venomowm 0:9 0 .wasmMOp 0:9 on: on O house no Axx.xxv vmoo 05p umpcm .ouom Mom oo.om$ mo 03Ho> vasomot aflw pmooos no UGHE :H o>m£ so» Houvcoo nswm mo anoo a House has so» 68 .om om< we heamman soapmdhommm veepm .5 enemas .ossavcoo on Mom 008mm 05p muchm .EHH asap now on .Ho> Scan 909 < .xumn otdmafi .maswp mop .cfiE .cd m** d m* o u moose U0aaa¥upoou=Hlnoz Hopes .m mma emu mm H< moons 800 Ram + Odom wonadpzmm HOQEHwOHom ensue 09fi33 o.oH u are nonsspzmm gasses: o.m u are osom essscsz as u Hm m eeapm om u can pmo>ues N ecmpm see u ow\meoup m eewpm om u Hm s eaapm on H mm» pmo>uwr H ecmpm «as u ouxnooup H ecmpw 69 .EfiH asap mow 0: .0m mm< we heammfim soapmanommq esmwm mossapsoo on Ham oosmm onp mnonm (mama *mNma .Ho> Eovu #09 < **m.o *NmN .xuan means“ 0 H .~m 0m H50» -s.mm *o.mm m.ms neuoo H.HN *Haha mm: .pm mpuoo .vm .so .so HOQEAPSMm HODEfiQOHOW Hm N vcwpm Hm H madam mo mcfiscfimom on» we newpmwnomon ouo< Hem sop wonsdpzen essfisfiz 0mm pmo>wm£ N vcopm 0mm pmo>ws£ « psopm o.m ems «mm mm -smm -«m flaws- dis .0>< M00“? ECG nests opsrz s ecmpm ant oHom Ezefisfiz ow\mooup N tcopm oa\noouv a macaw 70 .3 «.3 pm NSEEB n33. cospmflommm 23m .m 3&3 .ossavsoo 09 Mom oosmm 0:9 unoum >.¢H Neda om.H Nmm H.0H mm» m.m 00H CNN en m.HHI pom: NH.HI HbNI a.m| mam: m.m mun ¢ONI EDD bu.o *H.mN 5.0m *mNON **m.N *mmw *a.mfi *vaa m.m mbn emv hm v.NH mess so.N owe N.HN HNN m.m oofi meN «e e.NH- NNNH- NN.N- Non- N.NH- chm- m.N Has- mNN- you No.” *N.NN m.mm *NomN **N.e *Neos *N.NN *HNNN m.N NHN «Na as H< ”GONE ECG ......... mmm-m-mmmm------- ---mmmmmmmmm ---mmmmmmmmmm ensue opus: o.oN u are nonsspzmm sessqsz o.m u are osom asasasz as u Hm N eewpm on u one pmo>umg N eampm «me u oa\mooup N ecopm om u Hm N eaapm as u owe pmo>uas H ecwpm «Ne u om\mooup s ecmpm 71 .scoz mmseso umpmsenmm wsficsanh .oH magmas «AZ no we mosHo> onosv mo has omssso on was: so» on me "mndssazp puma as om< 0H "Hs>uovaw mswcna£e . 0.0 "msamon mewszfigp ouomoa owos \ sopu pop ( .xumn oesnes .nease so» .ass .cH NNN s «N 0 n noowa UOHHHMIpoousHucoz H5909 (H.0m («meN (vaN (HNN 0v.0 *0.0N 0.00 *0>0H *x0.0H *poH *H.N *mmH 0.HH HNH pr H0 0 u moons UOHHHMIpoouGHnaoz Hopoe < moons £00 350 + oHom wonEHvssm HODEHHOHom unsu0 opH£3 on use» «0 msHschom 0:0 95 coHpmHuomOQ ouo< Mom "H carom 0.0H u :90 wonsszsm E58H5H2 0.0 u £90 sHonH E5EH5HZ Hm u Hm N tcwpm on n 005 pno>u5£ N 05590 ¢0v u oo\moouv N 05590 00 u Hm H 0:590 on u 005 Pmo>us£ H @5590 0N0 n os\noowfi H @5590 75 .5503\0H05\99 50 «.00 .onoo\pm :0 Nva .ouoo\pm so NHNN .ouoaxpm so mmNN .0u05\u0H00 m.mH .0905\m0900 N.¢H .0505\m0u00 H.H .H503\0H05\hm2 Hv.0 .ouos\mmz v.0N .0505\hmz 0.0 .0505\hmz m.mH .Hfl0\n\0HOfi\mUHOO 0H . H .0H05\u0h00 H.00 .0h05\m0500 0.00 .0u05\n0500 0.0N .mHmSBm 5§Ho> H 0:590 :3 8300.0 .055H9500 09 55m @0500 099 uuoum u 085H0> 9009 0H950 0H959s59owoa Mom H 9009 0H950 0H9595590H05 H5909 nmcHagH99 5H 00>oeou 085Ho> 900m 0H950 0H9595590502 u 085H0> 9009 0H950 0H959559090E 009uo>w5m 509EH9355 09 50H9H005 5H 000500Hm 085H0> oHom H5909 n umchsH99 HH5 5H 00>0£0H moHom 00030H00 5098H935m 09 50H9H005 5H 009no>u59 mOHOQ 00030h00 u 0&5H0> .99 .09 :v\H H550H955H095H How H .99 .09 :v\H H550H955u095H H5909 umcHsaH99 HH5 5H 00>080H 0&5H0> .99 .09 :¢\H .90H n 035H0> .99 .09 :v\H H550H9555095H 009mo>w5m u 085H0> 00030000 0H959s590505 H09 H 00030500 0H9595590508 H5909 mmsH55H99 5H 00>050H 085H0> 00030H00 0H9595590902 u 085H0> 00030900 0H9595590008 00950>u5m 99008005558 90005H 99H3v 3H5EE5m 0&5H0> H 0:590 77 .0H09955< 0H5ocoom H55H9 .0H 05:0Hh .05599500 09 550 00550 099 00050 00.NH 0 u >02 5098H9350 Nv.NH| 0 u >mz 00030500 " 0950000 9508005558 900055 00 05H5> 00955000HQ 00.00 a n 09000 9508005558 90005H mo 05H5> 00955000H0 v0.00 0 u 00>50 085Ho> 5098H9350 mo 05H5> 00955000HQ 00.0N a n 00>50 085Ho> 00030500 90 05H5> 00955000HQ 0950000 950800555: 90005H mo 50H955H5>m NN.NN- s u >52 nonEszmm NN.NOH- 0 u >52 eooxeuoo "0H A0 55050 05H955Hm mo 5505 5H 05590 099 00 05H5> 9500055 902 90.00H 0 u 09000 HH5 mo 05H5> 00955000HQ 00.09H 0 u 085H0> 00030500 0Hom 05Hm 509859350 90 05H5> 00955000HQ 00.00 0 u 085H0> 00030500 H5909 mo 05H5> 00955000HQ 0H05H55< 0H80500m H55Hh 78 0mm Drapek, R.J. 1985. A simulation of jack pine budworm and white pine weevil monitor and control techniques and their effects on jack pine economics. M.S. Thesis, 118 p. Michigan State University, E. Lansing. Gunter, J.E. and H.L. Haney. 1984. Essentials of Forestry Investment Analysis. 337 p. OSU Bookstores, Corvallis, OR. Heyd, R.L. 1982. Insects versus artificial regeneration of conifers. P. 358-374 in G.D. Mroz and J.F. Berner(compilers). Proc. Artif. Regen. of Conifers in the Upper Great Lakes Region, 26-28 Oct. 1982, Green Bay, WI, 435 p. Mich. Tech. Univ., Houghton. Heyd, R.L. 1985. NPVUNPL. A Saratoga spittlebug simulation program. Available from the Michigan Cooperative Forest Pest Management Program. East Lansing, Michigan. Lundgren, A.L. 1981. The effect of initial number of trees per acre and thinning densities on timber yields from red pine plantations in the Lake States. USDA Forest Service Res. Paper NC-193, 25 p. Norris, F.W. 1987. Timber Mart North, lst quarter 1987. Highlands, NC. Wambach, R.F. 1967. A Silvicultural and economic appraisal of initial spacing in red pine. Ph.D. Dissertation, 282 p. University of Minnesota, Minneapolis. APPENDIX B APPENDIX B A Program Listing of RPPEST TYPE regpack = RECORD CASE Boolean 0F True : (AX BX, CX, DX, BP, 81, DS, 01, ES, Flags : Integer); Eaése : (AL, AH, BL, CL, CH, DL, DH : Byte); n ; charset = set of char; p2 = array [1..40] of integer; strin918 = stringl22 ; CONST AutoUpCase: boolean = false; (F. ConIn } range: charset = [30..82551; {Allowable input range F. ConIn } special: charset = [#13,NBJ: (F. Conln } 2p = 0.2316419; HechPrep = 64.57; zbl = 0.31938153- ChemPrep = 52.30; zb2 = -0.356563782; 263 = 1.781477937: 254 = -I.821255978; zbS = 1.330274429; StandArea = I; VAR A: r2; AAve A: real; ADomHt: integer; AgeAtEst: integer; AllCostsDiscounted: real; AMBFVollnt: real; AMBFVoIScrib: real; AMerchCFV: real; AMerchCords: real; AMerchPoleCFV: real; AMerchSawCFV: real; AMortaIityBA: real- AMortaIityClass: £5; AhortalityTPA: in eger; ANHCFV: real; ANMSawBF: real' ANMSawCFV: reai; APoIeCFV: real: APoIeCIass: integer; APoleCords: real; ASawCFV: real: ASawClass: integer; ASawCords: real; ASmaIICFV: real; ATotaICFV: real; ATPA: integer; AveBA:rea1; AveCIass: integer; BA: real; BAC: array [1..403 of real; BAGrowthl: real; BABrowth2: real; BAFroToRemove: real; BAToLeave: real; 79 80 BAUnderZS: real: 88: array II..40] of real; BFperCF: real; BHA: real- BHAI: reai; Bi estCIass: integer; BT : integer: BugAveBA: rea ; BugBA: real; BugBAC: array [1..40] of real; BugBABrowthI: real; BugBABrowch: real; BugBAUnderZS: real; BugBF erCF: real; BugBH : real- BugBHAi: real; BugBiggestClass: integer; BugChOice: integer; BugClass: p2; BugDBR: real; BugDiamSD: real; BugDiscountedCordsRevenue: real; BugDiscountedSawRevenue: real; BugDomHt: real; BugHarvestAge: integer; BugMaxBAIncr: real; BugMaxDiamIncr: real; BugMBFVoIInt: real; BugHBFVoIScrib: real; BugHerchCFV: real; BugMerchCords:rea1; BugflerchPoleCFV: real; BugHerchSawCFV: real; BugMortaIityBA: real- BugMortalityClass: p2; BugMortalityTPA: integer; BugHortalityTreeCount: integer; BugMortVolSum: real; BugNHcfv: real; BugNMSawBF: real- BugNHSawcfv: real; BugPoleBA: real; BugPoleCFV: real; BugPoleCords: real; BugDMDbh: real; BugSawBA: real- BugSawCFV: reai; BugSawCords: real; BugSI: integer; BugSmallBA: real: BugSmallCFV: real; BugSmalIestClass: integer; BugThinnedBA: real; BugThinnedBAC: array [1..401 of real; BugThinnedClass: p2; BugThinnedPoIeBA: real; BugThinnedSawBA: real; BugThinnedSmallBA: real; BugThinnedTPA: integer; BugTMBFVolInt: real; BugTHBFVoIScrib: real; BugTMerchciv: real; BugTMerchCords: real; BugTMerchPolecfv: real; BugTHerchSawcfv: real; BugTotalCFV: real; BugTPA: integer- BugTPolecfv:rea ; BugTPoIeCords: real; BugTSawcfv: real; BugTSawCords: real; BugTSmallcfv: real; 81 BugTThinnedTPA: integer; BugTTHBFVolInt: real; BugTTNerchCords: real; BugTTotalcfv: real; BugTTPoleCords: real; Bu TTTotalCFV: real; CB Under25: real; Choicel: integer; Class: p2; CHortalityBA: real; CHortalityTPA: integer; CPoleBA: real; CSawBA: real; CSmallBA: real; CTPA: integer; DBR: real; DianSD: real; DiscountedBugCosts: real; DiscountedCordsRevenue: real; DiscountedSawRevenue: real; DiscountedTotalCosts: real; DiscountedValue: real; Dis laylnterval: integer; Don t: real; BAClass: p2- GCCost: real; GMCost: real; GrubControlChoice: integer; GrubControlCost: real; GrubMonitorCost: real; GrubMortPercent: real; GrubNumbers: real; HarvestAge: integer; Hi hBrubMort: real; HP ost: real: InsectControlCostsDiscounted: real; InterestRate: real' InventoryCost: real; LayDutCost: real; Lowclass: integer; LowBrubMort: real; MaxBAIncr: real; HaxDiamIncr: real; MaxTA e: integer; HBFVo Int: real; MBFVoIScrib: real; MerchCFV: real: HerchCords:real; HerchPoleCFV: real; NerchSawCFV: real; MinTAge: integer; HinTB : real; Hortl: real; Hort2: real; HortalityBA: real; HortalityClass: p2; MortalityTPA: integer; NortalityTreeCount: integer; NortalityTrees: integer; MortVolSum: real; HPCost: real; N: real; NextScheduledThin: integer; NMcfv: real; NNSawBF: real- NHSawcfv: real; DutbreakYear: integer; PlantingCost: real; PlantingMethod: integer; PoleEA: real' PoleCFV: real- PoleClass: integer; 82 PoleClassUp: real; PoleCords: real; PoleMin: real; PricePerCord: real; PricePerMBF: real; QHDbh: real; ReducedTPA: integer; re s: regpack; R0 hoice: integer; SawBA: real; SawCFV: real: SawClass: integer; SawCIassUp: real; SawCords: real; SawflyControlCost: real; SawflyMonitorCost: real; SawMin: real: SBu Choice: StringIB; See Age: integer; SFCCost: real; SHazardZone: stringib]; SI: integer; SID: stringIIOI; SIReducer: integer; SitePrep: integer: SitePrepCost: real; SmaIIBA: real: SmallCFV: real; SmallestClass: integer; SgittlebuoControlChoice: integer; S lantingfiethod: StringiB; SRClPercent: real; SRCZPercent: real; SRCZPercent: real; SRiskRating: stringIB]; 85: real; SSitePre : StringIB; SSm: rea ; StandAge: integer; StartAge: integer; StartB : real; StartTPA: integer; StartTPAl: integer; StartTPAZ: integer; StorePtr: integer; Survivalhodiiier: real; SurvivalRate: real; ThinChoice: char; ThinnedBA: real; ThinnedBAC: array [1..40] of real; ThinnedClass: p2; ThinnedPoleBA: real; ThinnedSawBA: real; ThinnedSmallBA: real; ThinnedTPA: integer; Thinninglnterval: integer; ThinningType: integer; Time: integer; TMBFVolInt: real; ThBFVolScrib: real; THerchcfv: real; TMerchCords: real; TherchPolecfv: real; TMerchSaucfv: real; TotalCFV: real; TPA: integer; TPolecfv:real; TPoIeCords: real; TreesToRemove: integer; TSawcfv: real; TSawCords: real; TSmallcfv: real; 83 TThinnedTPA: integer; TTNBFVollnt: real- TTherchCords: rea ; TTotalcfv: real; TTPoleCords: real; TTTotalCFV: real; UpCIass: inte er: HeevilControl os : real; WeevilflonitorCost: real; “Mort: real; X6: real; X7: real; X8: real; X9: real: YearSBrubHort: real; Year46rubflort: real; r: array [0..135] of record AveBA: real; BA: real' DGR: rea ; DomHt: real; MBFVolInt: real; HBFVolScrib: real; HerchCFV: real; MerchCords: real; MerchPoleCFV: real; HerchSawCFV: real; HortalityBA: real; hortalityTPA: integer; NHCFV: real; PoleCFV: real; PoleCords: real; thbh: real; SawCFV:real; SawCords: real; SmallCFV: real; StandA e: integer; TotalC V: real; IPA: integer; end; bugr: array [0..135] of record AveBA: real; BA: real; DER: real; DomHt: real; HBFVolInt: real; HBFVolScrib: real; HerchCFV: real; NerchCords: real; HerchPoleCFV: real; HerchSawCFV: real; HortalityBA: real; HortalityTPA: integer; NHCFV: real; PoleCFV: real; PoIeCords: real; DNdbh: real; SawCFV:rea1; SawCords: real; SmallCFV: real; StandA e: integer; TotalC V: real; TPA: integer; end; t: array [0..1351 of 84 record StandA e: inte er; Thinne BA: rea?; ThinnedTPA: integer; TMBFVolInt: real; TMBFVolScrib: real; TherchCFV: real; TherchCords: real; TherchPoleCFV: real; TMerchSawCFV: real; TPoleCFV: real; TPoleCords: real; TSawCFV:real; TSawCords: real; TSmallCFV: real; TTotalCFV: real; end; bugt: array [0..135] of record StandA e:integer; Thinne BA: real; ThinnedTPA: integer; THBFVolInt: real; TMBFVolScrib: real; TherchCFV: real; TherchCords: real; TherchPoleCFV: real; TherchSawCFV: real; TPoleCFV: real; TPoleCords: real; TSawCFV:real; TSawCords: real; TSmaIlCFV: real; TTotalCFV: real; end; econ: array [0..135] of record Control: real; Inventory: real; Layout: real: Monitor: real; end; Procedure Randomize(l,J: Integer); var RSet : record AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Integer; end; Ch : Char; begin 13 {1:0) and (J=0) then begin { Generate a randon random number see J RSet.AX:=$2C00; { DDS time of day function } MSDos(RSet); I:=RSet.CX; { Set I and J to the system tine } J:=RSet.DX; Dela (100); { This delay may have to be increased {or faster systems MSDos(RSet); , if (l=RSet.CX) and (J=RSet.DX) then begin { Clock isn't ticking . 0 85 J := 0- while Ne Pressed do ReadIK d,Ch); { Clear keyboard buffer } Hrite('Hit any key to set the random nulber generator: '); repeat I := 1+13; J := J+17 until KeyEressed; ReadIKbd, h); { Absorb the character } HriteLn end; end- b.5egHIDSeg:$129l:=l; { This is the core of the routine: store a 32 i }hemH[DSeg:$lZBl:=J; { seed at locations DSeg:$0129...DSeg:$012C end; I of procedure Randomize } Function Conln : char; var nyCH: char; BEGIN WITH regs DD BEGIN repeat AH :=8; MSDDSIregs): myCH :=chr(AL); ENBntil myCH in (range + special); IF AutoUpCase THEN nyCH := UpCase(oyCH); conin := nyCH; END; Procedure SetSl; {called from procedure lnitialStandInfo} begin repeat clrscr; gotoxy(1,10);delline; gotoxy(5,10)- ') write('Enter site index for this stand (tase age 50 yrs.). ’ range:= ['0'..'9'l; readln(SI); until 81 in [30..90]. BugSI := SI; end; {of SetSl} Procedure SetPoleHin; {called from procedure lnitialStandInfo} begin repeat clrscr;gotoxy(l,10); delline; gotoxy(5,10); writeI'Choose a minimum poletimber dbh, greater than 3.5 inches. ran e:= ['0'..'9',’.']; rea ln(PoleMin); until Poleflin>3.5; end; {of SetPoleNin} Procedure SetSawNin; {called from procedure InitialStandInfo} begin clrscr; re eat gotoxy(l,10); delline; gotoxy(5,10)' writeI'Choose a minimum sawtimber dbh (inches). ’); 86 ran e:= ['0'..'9','.’l; rea ln(SawHin)- until (Sawhin ) PoleHin); end; {of SetSawhin} Procedure SetEstablishAge; {called from lnitialStandlnio} begin clrscr; repeat gotoxy(l,10)° delline' gotox (5,10): write('How old were tfie seed ings at the time of planting (years)? '); range:= ['0'..'9'l; rea ln(AgeAtEst); until AgeAtEst >=0' end; {0+ SetEstablishAge} Procedure SetAgeAtStart; (called Iron InitialStandInfo} begin case Choice) of I: begin clrscr; gotoxy(5,10); writeln( Stand age begins at the time of stand establishment (year 0).'); repeat gotoxy(1 13); delline; gotoxy(5,l3); write('At what stand age do you want to start projections? ‘); ran := [‘0’..'9’l; rea ln(StartAge); until StartAge >=0; end; 2: StartAge := 0; end: (at case statement} SeedAge:= AoeAtEst + StartAge; StandAge:= StartAge; end; {of SetAgeAtStart} Procedure SetHarvestAge; {called from InitialStandInfo} begin c1rscr;repeat gotoxy(1,10); delline; gotoxy(5,10)° write('At what stand age do you want to harvest this stand? .)3 range:=I'O‘..'9'l; readln(Harves Age)- until (HarvestAge>6tartAde) and (HarvestAge <= 125); BugHarvestAge := HarvestAge; end; {of SetHarvestAge) Procedure SetDisplayInterval; (called from InitialStandInfo} begin clrscr; otoxy(l,10); delline; gotoxy(5,10)- writel' t what interval (years do you want to display stand statistics? '); ran e:=['0'..'9'l; rea ln(Displaylnterval): end; {of SetDisplayInterval} Procedure SetTPA; {called from lnitialStandlnTo} be in Ease StartAge of 0..)0: begin 87 clrscr; repeat clrscr; otoxy(5 10); if Start ge = then write(’ Enter the number of sgedlings per acre in the stand. e se writeI’ Enter the number of established trees per acre in the stand. ' ran e:= I 0' '9' l; rea ln(StartTPA)- ibetartTPA < 206 then e go oxy(5 15);writeln(' Initial number of trees per acre mus be greater than 200. ’); delay(3000); end; until StartTPA >= 200; TPA := StartTPA' Bu TPA := StartIPA; en - else begin clrscr; repeat gotoxy(l, 10); delline; gotoxyIS, 10) write(’ Enter the number of establisAed trees per acre in the plantation. ); ran e:= I' 0 I; rea 1n(StartTPA); until StartTPA <.1600; TFA := StartTPA° BugTPA := StartIPA; end; end; {of case} end; {of SetTPA} Procedure BAU(ASI:integer; ATPA:integer); (Lundgren, 1991; stand age < 25 yrs. be EBAUnderZS := 6. 565 * ASI * (exp (1. 1677 * ln(1-(exp(- 0. 04018 * geedAge)))) ) * (l-exp(-0. 001885p* ATPA)); en Procedure BAUl; begin AU(SI, TPA); BAUnder2 := CBAUnderZS; end; Procedure BugBAU; begin AU(BugSl, BugTPA); gugBAUnderZS. := CBAUnder25; en Procedure BHAge; begin HA1 := SeedAge - (10.5 + if BHAI <= -1 then BHA := else BHA := BHAI; end; (0.05 * 51)); 0 Procedure BugBHAge; be gug BHAl := SeedAge - (10. 5 + (0.05 * BugSIl); if gBugBHAI <= -1 then BugBHA := 0 glee BugBHA := BugBHAl; en 88 Procedure SetBA; (called from InitiaIStandInfo} var ch:char; begin clrscr; BHAge case Seedageg of e in if BHAI <= -1 then begin StartBA :=0 BA := StartBA BugBA := StartBA; end else begin gotoxy(5, 10) ; writeln(' You say specify a basal area per acre or this stand. If you choose gotox (5 11); write)n( not to, the program will estimate it for you. ° g0toxy(5,14); write( Do you want to specify the basal area per acre? (Y or N) ); ran e: = ['y','n',' Y' ,'N' l; rea ln(ch1- if (ch = 't' ) or (ch = 'y') then begin re eat go oxy(1,14); delline; gotoxz(5,14); write( Enter basal area of t a stand in square feet per acre. '); ran e:= ['0'. .‘9‘,’.'l; rea ln(StartBA); until (StartBA >0) and (StartBA < 180); BA := StartBA- BugBA := StartBA; end else be BAUI: ugBAU; StartBAF BAUnder2S; BA := StartBA BugBA := StartBA; end; end; { of else from BHAl < -1 if - then} {of case 1..24} 25..é50: begin repeat goto:y(1,10); delline gotoxy(5 10); write( Enter the basal area of the stand in square feet per acre. '); ran e:= I' 0 '9’,'.']; rea InIStartBA); until (StartBA >= 30); BA := StartBA BugBA := StartBA- end; end; (of case} end; {of SetBA} Procedure DisplayISI; {called from EditlSl} begin clrscr; gotoxy(5,5); writelnI'l. Site index = ,SI); gotoxy(5,7); writeln(' 2. Minimum poletimber dbh = PoleHin: 2:1); gotoxy(5,9); writeln( 3. Minimum sawtimber dbh = ,Sawflin: 2: 1)- gotoxy(5,11); writeln(‘4. Seedling age at planting= ,AgeAtEst) ); gotg:y(EA13;; writeln('5. Stand age at beginning of projections = ar e ; gotoxy(5,?5); writeln(‘b. Initial basal area = BA: 3: 1); otoxy(5,17); writeln(‘7. Trees er acre = A) gotoxy(5,19); writelnI’B. Harves age = HarvestAge); gotoxy(4,21); writeln(‘9. Display intervaI (years) = 89 ‘,Displaylnterval); end; {of DisplayISI} Procedure EditISI; {called from Basics} var Choice:char; Hhich:integer; begin repeat Dis layISl; gotox (5,24); uri e(‘Do you "9“, to cAange any of these values (Y or N)? '); ran e:= ['n','y , N , Y 1; rea ln(Choice); if upcase(Choice) = 889 then begin repeat gotoxy(1,24); delline; gotoxz(5,24); urite('Enter the number of t e part to change. '); ran e:= ['1'..'9']; rea ln(which); until (Hhich>=1) and (Hhich<=10); case Which of : SetSI; SetPoleMin; SetSawMin; SetEstablishAge; SetAoeAtStart; SetBA- SetTPA; SetHarvestAge; SetDisplaylnterval; ; {of case} end; until (Choice = #78) or (Choice = #110); end; (of EditlSI} ~OGJNIO‘Lfl-bO-JNH I‘D 2) 0. Procedure ChooseBug; var chOice: char; begin clrscr; otox (5,5); write(’ . H ite grubs.'); gotoxy(5 8); write(‘2. Pine root collar ueevi .’); gotox urite(’3. Saratoga spittlebug.'); gotoxy(5, write(‘4. Red-headed pine saufly.'); repeat gotoxy(1,19); delline; gotoxz(10,19)' write('Enter the number of t e insect that bugs you most. ’); ran e := ['l'..'4' rea ln(Bu Choice); until Bug hoice in [1..4]; case Bug hoice of 1: SBugChoice := 'Hhite Grubs'- 2: SBugChoice := ’Root Collar Beevil'; 3: SBugChoice := 'Saratoga Spittlebug'; 4: SBugChoice := 'Red-headed Sawfly'; end; {of case} end; (of ChooseBug} y 5 11); 1 ) ( 4 Procedure SetSitePrep; begin clrscr; gotoxy(5,5); urite('1. Mechanical site preparation.'); gotoxg(5,7); write(’2. Chemical site preparation.’); go oxy( ,9); write('3. No site preparation.’); repeat gotoxy(1,15); delline; gotoxy(10,15); write(‘Enter the number of your choice of site preparation. range := ['l'..'3']; 90 readln(SitePrep); until SitePrep in [1..3]; case SiteF‘rep of l: SSitePrep 'Hechanical 2. SSitePrep :; 'Chemical' 3: SSitePrep -= 'None' ; end ( of case} end; { of set site prep} Procedure SetSitePrepCost; var x: real; begin case SitePrep of : begin clrscr; gotoxy(5,5); urite(' You have chosen Mechanical site preparation. '); otox (5,7l- write(’ You must choose a cost per acre or t is 51 e treatment. ); gotoxy(5, 8); write(' You Ia enter a value you have in mind or you may accegt he ); gotoxy(§, 9):»rite(‘ defau t value of ,Hechprep: 3: 2, ' dollars per acre. 80toxy(5, ,10);write(‘ To use the default value enter otherwise enter your value below.’ ); gotoxy(5, 14); write(' Site preparation cost per acre is (xx. xx) '); range := l 0 '9’ ,'.'J; read1n(xP if x = 0 then SitePrepCost := Hechprep else SitePrepCost := x; end; begin clrscr; gotoxy(5, 5); write( You have chosen Chemical site preparation. '); ootoxy(5, 7):write( You must choose a cost per acre ior this site treatment.’ ); gotoxy(5, 8); write(' You ma enter) a value you have in mind or you may acceg the ; gotoxy(§, 9): write(' defau t value) of ,Chem rep: h2,’ dollars per acre. 8otoxy( ,10); write(' To use the deiault value enter NJ otherwise enter your value below.’ ); goto(y (5,1A);w;ite( Site preparation cost per acre _ xx xx - ran e := [ 0’ '9','.'J; rea ln(xP if x = 0 then SitePrepCost := Chemprep elge Si te ePrepCost := x; en : 3 : SitePrepCost := 0; end; { of case} end; { of set site prep cost} Procedure SetPlantingHethod; begin clrscr; gotoxy(5, 7); write(’ 1. Machine plant.’ gotoxy(5,9); write( 2. Hand plant.'); repea gotoxy(1, 12); delline; gotoxy(10,12): . write( Enter the number of your choice of planting method. '); range '3: rea ln(PlantingHethod); until Plantinahethod in [1,2]; case Planting ethod of 1: SPlantingMethod : 'Machine '; 2. SPlantinghethod :2 ‘Hand '; end; end; 91 {of case) { of SetPlantingMethod} Procedure SetPlantingMethodCost; real; var X' begin if SitePre if Start MPCost := HPCost El") d else en MPCost : tr» HPCost do if SitePre if Start PA end MPCost HPCost else MPCos HPCos end; case Plantin Method of en end; d; P-J t t A ()< 3 then begin < 800 then begin 134. 41; 124. 25; 146.65; 116.02; 3 then begin 800 9then begin (88. 109. 056; 36. 24; 48. 97; begin clrscr; gotoxy15 5)' write('You have elected to use Machine Plantin '); otox ( 7P write(' You must choose a cost per acre or t is ac ivity.’ ); gotoxy(5, 8);write(' You may enter a value you have in mind or you may acce the '); gotoxy(o,9); write( defau t value of ,MPCost:3:2, dollars per acre. '); gotoxy(5,10);write(g To use the default value enter , otherwise enter your value below. '); gotoxy(5,14); write(‘ Machine planting cost per acre 15 (xx. xx) ); ran e := [ 0' .‘9','.'J; rea ln(x)' if x = 0 then PlantingCost := MPCost else PlantingCost := x; end; begin clrscr; gotoxy(55 write(' You have elect ted to use Hand Planting.’ ); gotoxy(5, ,7) write( You must choose a cost per acre this activity. gotoxy(5, 8); write(' You may enter a value you have in mind or you may acce the ' ; gotoxy(3, 9);write( defau t value of HPCost:3:2, ollars per acre. ); 80toxy(5,10P write( To use the default value enter , oth rwise enter your value below.’ ); gotoxy(5 4);write(‘ Machine planting cost per acre is xx. ; ran e : '0'..'9','.']; rea ln( 1 = [ x ' if x = 0 then PlantingCost := HPCost else PlantingCost := x; end; 1 XX v { of case} {of SetPlantingMethodCost} Procedure SetwoodPrice; real; var Y1 Z: 92 begin clrscr; gotoxy(5 5); write('The default price for red pine pulpwood is 5 12.00 per standard cord.‘)- gotox (5,7); write(‘Enter the price per cord you want to use, 0 or t e default. .')3 ran e := [‘U .. 9 ,'.'J; rea ln(6)' 1+ y = then PricePerCord := 12 else PricePerCord := y- gotoxy(5,11)' write('The default price for red pine sawlogs is t 0.00 per not (Int. 1/4").')- otox (5,13); write('Enter the price per MBF you want to use, 0 or t e default. '); readln(z)' if z = 0 then PricePerHBF z: 70 else PricePerHBF := 2; end; { of Set Wood Price} Procedure SetlnterestRate; var y: real; begin clrscr' gotoxy(5,5); write( Select the interest rate you wish to use for discounting costs and ’); otox (5,6); write('revenues. This is a real rate (beyond infla ion). The default’); gotoxy(5 7). write('rate is 5 Z.‘)' gotoxy(16,10); write('Enter the interest rate you want to use, for the default. '); ran e := ['0'..'9','.’l; rea ln(y)' if = L then InterestRate := 0.05 else InterestRate := y/lOO; end; { of SetlnterestRate } Procedure SetLayoutCost; var y: real; begin clrscr; gotoxy(5,5); write(’You need to choose a sale layout cost per acre. The default value is '); gotoxy(5 6)- write('s 9.38 per acre.'); gotoxy(16,lb)' write('Enter a value for sale layout costs, 0 or the default value. '); range := ['0'..'9','.']; readln(z); if y = i then La outCost := 9.38 else LayoutCost := y; end; ( of Se LayoutCost } Procedure SetlnventoryCost; var y: real; begin clrscr; gotoxy(5 5); write('You need to choose a timber inventory cost per acre. The default value’); gotoxy(5 b): write('is S 6.73 per acre.'); gotoxy(lb 10); write(‘Enter a value for timber inventory costs, 0 for the default. ’); range := ['0'..‘9','.']; ln( rea )- if y = 5 then InventoryCost := 6.73 else InventoryCost := y; end; ( of SetlnventoryCost } Procedure DisplaySitePrep; {called from EditSitePrepl begin clrscr; 93 gotoxy(5,3); writeln(‘l. The insect of interest is ',SBugChoice); gotoxy(5,5) writeln(‘2. Site preparation is going to be ,SSi ePrep); gotoxy(5,7 ; uriteln('3. Site preparation cost per acre is t ,SitePrepCost:3:2); gotoxy(5,9); writeln(‘4 The trees will be planted by ,SPlantingHethod); gotoxy(5,1 ); writeln('5. Planting cost per acre is 5 ,PlantingCost:3:2)° gotoxy(5 3); writeln('6. Annual interest rate is ',InterestRate * 100:3:1 ' percent.’); gotoxy(5 15); writeln('7. Sale layout cost per acre is S ,Layoutéost:3:2)- otoxy(5,l7); writeln('8. Inventory cost per acre is t ,InventorgCost:3:2); gotoxy(5,1 ); writeln(‘9. Price / cord is S ',PricePercord:3:2,' and price / “RF is $ ',PricePerHBF:3:2); end; {of DisplaySitePrep} Procedure EditSitePrep; (called from Basics} var Choice:char; Hhich:integer; begin repeat Di HI" ra splaySitePrep; gotoxy(5,24); ite(’Do you wan to change any of these values n e:= ['n’,’y’,’N','Y’l; rea ln(Choice); if CB mm 33 D. unti end; Proc upcase(Choice) = 989 then begin repeat gotoxy(l,24); delline; gotoxy(5,24); write('Enter the number of the part to change. ran e:= [‘1'..'9']; rea ln(which); until (Which>=1) and (Hhich<=9); se Which of ChooseBug; SetSitePrep: SetSitePrepCost; SetPlantingHethod; SetPlantinoHethodCost; SetlnterestRate; SetLayoutCost; SetInventoryCost; SetWoodPrice; {of case} 1 (Choice = #78) or (Choice = #110); {of EditSitePrep} aocovcrm-a-on.) '0. ‘0. I. I. O. O. edure HaitABit; forward; Procedure SetSeedlingSurvival; var z : real; begin cl z:=0; Randomize(0 SurvivalMod if SitePrep z := rando TPA := round BugTPA := TP end else TPA := round(TPA * SurvivalModifier); BugTPA := TPA- rscr; gotoxy(lb 11); := random * 0.18 + 0.75; hgn begin “- a ll 4‘0 p. A ; (SurvivalHodifier ~ 2)); (Y or N)? '); write(’The winds of fate have decreed that your lst year survival 94 .). otoxy(10,12); write('rate will be ',100 * SurVivalHodifier—z):3:l,' Z.'); gotoxy(10,14)- write(’Your plantation now contains ',TPA,’ trees / acre.'); WaitABit; end; {of Set Seedling Survival} Procedure ThinningDptionl; {called from AThinningType} begin TreesToRemove := 0; clrscr; gotox (5,10); writeln( You ave chosen a thinning treatment which removes a specific number of '); gotoxy(5,11);writeln( trees per acre.'); repea gotoxy(1,15); delline; gotoxy(5,15)- write(’How many trees per acre should be removed? '); range:= ['0'..'9']; readln(TreesToRemove)' until (TreesToRemove 2:0) and (TreesToRewove <= TPA); end; (of ThinningDptionI} Procedure ThinningUptionZ; {called from AThinningType} begin AProToRemove := 0- clrscr; gotoxy(5,10); writeln( You have chosen a thinning treatment which removes a constant proportion '); gotoxy(5,11);writeln('of the stands basal area or trees per acre at each thinning.’); repeat gotoxy(l,15): delline: gotox (5,15); write n( What proportion of he stand should be removed?’); gotoxy(37,lé); write('(express as'a decimal) '); range:= ['0’.. 9 , . l; rea61n(BAProToRemove); until (BAProToRemove =0) and (BAProToRemove <=l.0); end; {of ThinningUptionZ} Procedure ThinningOptionS; {called from AThinningType} be i n AToLeave :=0; clrscr; gotoxy(5,10); writeln( You have chosen a thinning treatment which will leave a specified '); gotoxy(5,11);writeln('residual basal area per acre.'); repea gotoxy(l,15); delline; gotox (5,15); write('Hhat should residual asal area per acre be (sq.ft./acre)? ’); range:= ['0‘..'9',’.'l; readln(BAToLeave)' until (BAToLeave 2=0); ifb(StandAge >= HinTAge) and (BAToLeave >= BA) then eoin gotox (1,15); delline; gotoxy(15,15); . write n( You have chosen to remove the entire stand. If this was an error,’)' gotoxy(15,lb); writeln(’you will have the opportunity to change this parameter in a minute.'); delay(4000); end; end; {of ThinningOptionS} 95 Procedure AThinningType; {called from Thinningflptions} begin clrscr; gotoxy (5,5); writeln( Please choose one of the following thinning regimes: '); gotoxy(10,8);writeln('1. Remove a specific number of trees per acre. gotoxy(iO, 10); writeln(' 2. Remove a constant proportion of the stands basal area, or trees.’ ); oto§y(}0, ,12); wr1teln(' 3. Thin to a residual basal area eve . gotoxy(1,16); delline; gotoxy(15,16); write(' Your choice is . . . ); ran e:= ['1 rea ln(Thinnin Type); case Thinnin pype of 1: Thinning ionl; ThinningOption2; ThinningDption3; en {of case} end; {of AThinningType} 0.th '0‘ O. I. Procedure SethinTAge; (called from ThinningTiming} begin clrscr; re eat gotoxy(5, 1 delline; gotox (5,10); write(’ Enter age of first t inning (years). '); range: = [’ 9]; rea ln(HinTAge): until MinTfloe >= StartAge; end; {of SetHinTAge} Procedure SetflinTBA; {called from ThinningTiming} begin clrscr; ,gotoxy(5, ,10); writeln You have the option of stipulating a minimum basal area per acre which ’); gotoxy(5, 11); write n( must be present before the first thinning is undertaken The first '); gotoxy(5 12); write n( thinning will not take place until this basal area level is reached. otoxy(5,13); writeln(’ An entry of 0 will cause thinning to e in at the specified min. age.'), go oxy(5,16); write(' Specify a minimum basal area per acre for first thinning. ran e:= 1 0' .. ‘9' ]; rea ln(MinTBA); end; {of SetMinTBA} Procedure SetThinningInterval; {called from ThinningTiming} begin clrscr; repeat gotoxy(l, 10); dell w;ite(' Specify the range:= [‘0'..'9']; readln(Thinninglnterva1) until (Thinnin Interval t: l) and (Thinninglnterval (120); end; {of thinninglntervall i ; gotoxy(5, 10) 1 n ne th n ing interval you wish to use (years). 96 Procedure SetHaxTAge; (called from ThinningTiming} begin clrscr; gotoxy(5, 7); writeln('Harvest age is set at ',HarvestAge,’ years. gotoxy(5, 9); writeln(‘Age at first thinning is ‘,HinTAge,‘ years. ); gotoxy(5, 11); writeln('Thinning interval is ’,Thinninglnterval,’ years. ); re eat go oxy(1,14);de1line; gotox (5,15) write( Specify stand age at inal thinning. ‘); range: = [' 0 '9’ ]; rea ln(HaxTAge) until (HaxTAge 5= (StartAge + Thinninglnterval)) and (HaxTAge (= HarvestAge); end, {of SetflaxTAge} Procedure ThinningTiming; (called from ThinningDptions} begin etHinTAoe; SetMinTBA: SetThinningInterval; SetMaxTAge; end; (of ThinningTiming} Procedure DisplayThinningOptions; (called from EditThinningOptions} begin clrscr; case ThinningType of 1: begin gotoxy(5;5); writeln( 1. Thinning Method: Remove a specific # of trees / acre. gotoxy(5, 7) :writeln(’ 2. Number of trees to remove: ,TreesTo Re move); end 2: begin gotoxy(5 5,5); writeln( 1. Thinning Method: Remove a constant proportion of BA or trees / acre. '); gotoxy(5, 7); writeln(’2. Proportion of BA or trees to remove: ',BAProToRemove: 1: 3); end;n be go ox (5,5); (.4 write n( 1. Thinning Method: Constant residual basal area per acre. ); )3 gotox (5, 7 write n( 2. Residual BA per acre: ',BAToLeave:3:1); end- end; (of case} gotoxy(5,9)- writeln( 3. Age at first thinning: ',HinTAge); gotoxy(5,11); writeln(' 4. inimum BA / acre before thinning be ins: ‘ M1nTBA:3:1); o oxy(5,13)- writeln('5. Thinning interval: ,Thinninglnterval)- gotoxy(5 5); writeln('é Age at last thinning: ',HaxTAge); end. bispl layThinningOptions} Procedure EditThinningOptions; {called from ThinningOptions} Var Choice:char; Which: integer; begin 97 repeat Dis layThinningOptions; gotoxy(5,20)' uri e(‘Do you want to change any of these values 3 ran e:= [' , n ,’Y','N']; rea ln(Choice); it upcase(Choice) = #89 then begin eat re gotoxy(1,20); delline; gotoxK(5,20); write('Enter the number of t e part to change. range:= [’1'..'6'J; readln(which); until Which in [1..6]; case Which of 1: AThinningType' 2: case ThinningType of 1: Thinningflptionl; 2: ThinningOptionZ; 3: ThinningOption3; end; SetMinTAge; SetHinTB ; SetThinninglnterval; : SetHaxTAge: end; {o( case} end; until upcase(Choice) = 078; end; (of EditThinningDptions} U‘Ln-bf/«l I. no on Overlay Procedure Spittlebug; var j, k,SF,0HP,RiskRating,HarvestAgeReducer,HarvestA integer; 2: real; begin Randomize(0,0): SF := random(101); DHP := round(random * (100 - SF) + 0)- if SF}>= 40 then RiskRating := 3; ( 1:10», 2=mo risk if OHP > 70 then RiskRating := 3; if (OHP >= 0) and (UHF <= 0) then be in if (SF >= 30) and (SF <= 35) then iskRating := if (SF > 20) and (SF <= 30) then RiskRating .= dif (SF > 35) and (SF < 40) then RiskRating := 3 en - if (UHP >= 20) and (UHF <= 30) then begin if (SF >= 0) and (SF <= 15) then RiskRating := if (SF > 15) and (SF <= 25) then RiskRating := dif (SF > 25) and (SF <= 30) then RiskRating := en if (DHP > 30) and (DHP <= 40) then begin if (SF >= 0) and (SF <= 10) then RiskRating := dif (SF > 10) and (SF <= 20) then RiskRating := en ! if ((OHP >= 0) and (UHF <= 20)) and ((SF )= 0) and then RiskRatin := l; i( ((DHP > 10) an (OHP <= 20)) and ((SF > 20) and then RiskRatin := 2; if ((OHP > 40) an (OHP <= 70)) and ((SF >= 0) and then RiskRatin := 2; if ((OHP > 30) an (OHP <= 70)) and ((SF > 20) and RiskRating := 3; if ((OHP > 10) and (UHP <= 30)) and ((SF > 30) and RiskRating = 3' 1+ RiskRating 1 (hen SRiskRating : 2 then SRiskRating if RiskRating : if RiskRating 3 then SriskRating : (Y or N)? .); geReducerl: derate, 3=high 2; 1; (AMH- '0‘.-. No— ‘I NO. (SF <= 20)) (SF (= 30)) (SF <= 20)) (SF < 40)) then (SF < 40)) then 98 if RiskRating 1 then { lose from 1 to 4 years growth } HarvestAgeRe ucer := round(random * 4 + 0) if RiskRatin = 2 then ( lose from4 4to 10 years growth } HarvestAgeRe ucer := round(random * 6 if RiskRating = 3 then begin {lose 10 to 20 prob=. 5, else lose all} z := random; if 2 <= 0.5 then HarvestAgeReducer := round(random * 10 + 10) glse HarvestAgeReducer := HarvestAge; en ; clrscr; gotoxy(5, 5); write( You have chosen to simulate the effects of Saratoga spittlebug on ); gotoxy(5, ):wr1te( projected red pine volume yields. A risk rating based on randomly )- gotoxy(5 7); write(' generated Z cover values for sweet-fern and other al ernate host plants' ); gotoxy(5, 8); write(’ has been set. The risk rating is ,SRislzRating, . A growth loss of’); gotoxy(5,9); write(HarvestAgeReducer, 0 correspond to this risk rating. ); years has been randomly set gotoxy(5, 12); write(‘ There are three insect management alternatives of interest in this case. '); goto>y(5 14); write( 1. Chemically control alternate host vegetation before planting. This' ) o>y(5, 15); write(' will lower the risk rating to low until he trees are out of dan er.'); gotoxy(5,16); write(' 2. pply a pesticide to control spittlebug populations directly. One ); gotoxy(5,17); write(' sprayingn for moderate risk sites, two sprayings for high risk sites otoxy(u,18);wr1te(' an extran for ;either class of site if site index is <= 50. goto= 30) and (SI < 70)) then SI:= SI +5- iflgRiskRating = 3) and ((SI >= 30) and (SI < 70)) then SI:= SI 4. . end;’ { of if controlchoice = 1 then} if Spittlebu ControlChoice = 2 then begin clrscr; go oxy(5, 7); write(' You may enter a cost of spraying insecticide you have in mind or you ); gotoxy(5, 8); write(' may accept the default value of 3 12. 00 per acre. ' otox (10,111); write(' Enter the cost (xx.xx), or 0 to use the efau t. l;- range := I' 0' .9','.']; SS := 12' readln(jl; if j <> 0 then SS := j; gotoxy(5,15) write(‘ Spi ttlebug populations must be monitored in order to correctly time spray '); gotoxy(5,16) ; write(' operations. For Hoderate and High risk ratingsé monitor 3 times. If site’); ! gotoxy( 17); write(‘index <= 50 then an extra monitoring must e performed. The default’); gotoxy(5 18)- write(’cost for monitoring is 3 1.50 er acre.'); gotoxy(lé, 23; write(’Enter the cost, or 0 to use t e default. ssh := 1. so; readln(kP if ) <> 0 then SSH := k; if RiskRating = 1 then begin if SI > 50 hen begin econI4l.monitor °= SSH; econIél.monitor := SSH, econIél.control -= SS; end: if SI a: 50 then begin econI4].monitor := SSH, econIb].monitor = SSH; econIbl.control := SS; ecgnIlOl. .monitor := SSH; en ; end; if RiskRating then begin if SI 2 50 hen begin econI4].monitor = SSH; econIbl.monitor := SSH; econIél.control := econIlOl.monitor : end- 11 Si <= .0 then begin econI4J.monitor := SSH; econIbJ.monitor .= SSH; econIbl.control 1: SS: econIlO].monitor := SSH; econI12l.monitor := SSH; econI12J.control := SS; end; end: if RiskRatin = 3 then begin if SI > 50 hen begin econI4l.monitor := SSH; econIBl.monitor := SSH; econI4l.control := SS; econI9l.monitor := SSH; econI9]. control := SS; end if SI <= 50 then econI4l. monitor on a ll to L0 mu- U33 3 100 econISl.monitor := SSH; econI4J.control := SS- econI9l.monitor := SSH; econI9l.control := 58 econIl4l.monitor := SSH; econI14l.control := SS; end; end; HarvestAgeReducerl := round(random * 3 + 0); HarvestAge := HarvestAge - HarvestAgeReducerl; BugHarvestAge := BugHarvestAge - HarvestAgeReducer; end; { of if control choice = 2} end; Overlay Procedure Grubs; var k,j,x,y: real; be in SC ost := 30: SHCost := 8; Randomize(0, 0); GrubNumbers := random * 0. 75; {set 4 of grubs/cu.ft. oftsoi1é}0 o . LowSrubHort := 0.24 * GrubNumbers; (set lower limit of mortality} HighGrubHort := 0.5885714 * Srubnumbers; {set upper limit of seedling mort} GrubHor F'ercent := random * (HighBrubHort - LowBrubHort) + LowGrubHort; SlReducer := round(random * 4 + 5); {generate random SI reduction } x := random; if x C: 0.75 then Year3GrubHort := else Year3 GrubHort := 0.32 * x - y := random; if <= 0.75 then Year4BrubHort := e se Year4GrubHort := 0.08 i y - 0.05; clrscr; gotoxy(5,5); write('You have chosen to simulate the effects of white grubs on projected red ° gotoxy(5, 6P write(' pine volume yields. A randomly generated population df ,Grubnumbers: 0: 2, grubs') gotoxy(5,7); write(' per cubic foot of soiI has been established. his number may vary between ); gotoxy(5,8): write(' 0 and 0. 75. P goto1 (5,10); write( A combined lst and 2nd year seedling morta ity of ' ,(GrubHortPercent*100)12:0, percent has' )- oto1y(5,11); write(' been set to correspond to this popuIation eve , gotoxy(5 13); write(' Seedling mortality in year 3 will be ,(Year3érubHort*1001: 2: 0 percent. 1; otoxy(5 14); write(' SeedIing mortality in year 4 will be ,(Year4érubHort*1001:2:0,' percent. 1; goto:< (5,17); write(' There are two insect management alternatives of in erest in this case. ); gotoxy(5, 20); write('l. Apply a pesticide at the time of plant1ng.)- goto>:y(u, 21;; write('2. Plant the site and ignore the grubs, and incur no immediate cost. ); gotoxy(lo, 24); write( Enter the number of your grub control choice.‘ range I’l rea ln(GrubControlChoice)- if GrubControlChoice = 1 then begin clrscr; gotoxy(5,7); write(' You may enter a cost of grub control you have in mind or accept the ); gotoxy(5,8); write('default value of S',BCCost:2:2,' per acre otoxy(IO 11); write('Enter the cost (xx.xx) or enter 0 to use he defauIt. '); 0.053333 v 101 range := ['0’..'9','.'I; readln(j)° 1+ 3 = 0 then BrubControlCost : J; gotoxy(5,15)' w monitored beiore control actions' gotoxy(5 16); write(’can begin. is $‘,SHDost:2:2,' per acre.'); otox (10,19); wr efau t value. '); readln(k)- if k = 0 then SrubHonitorCost : k- Ten := TPA - Year4GrubHort) * 0.17))); BugTPA := round(( 1 - econIOI.mon1tor : a BugTPA); econ[01.control := SrubControlCost; end; { of ControlChoice = l ) if SrubControlChoice = 2 then begin GrubControlCost := 0; BrubMonitorCost := 0; BugTPA := round(( 1 - (GrubHortPercent + Year46rubflort)) * BugTPA); TPA := Bu TPA- BugSI := ugSl - SlReducer; SI := BugSI; end; { of ControlChoice = 2 } end; {of Grubs} Overlay Procedure Weevil; var ProbHDam SprayCost: real; begin Randomize(0,0); HazardZone round(random * if HazardZone if HazardZone if HazardZone 2 3 InfestDistance := if HazardZone = 1 then be in if lnfestDistance <= 125 S D : '< 1/8 mile" n .0 H "-45 (I) '< t I 1/2 mile'° 'Uw- '14-. cut” 0.05; 1 m1le'; stance > 1000 then 1 mile'; '0‘ C33 mmfbmmp-Osmmu‘] 11m "BID". 5... .95 U) (.00 t0 HHHUAHOAH U3 UIF-‘U D i > end- if hazardZone 2 then begin if lnfestDistance <= 125 then SID ’< 1/8 mile" ' ‘=126) and 1/2 mile'; Distance >=501) and 05; C. '0 II 111 fi C p.- I.“ r.- fl: 3 n m V if U) HHHUAHOA 0": '< t USOIHU' H -H U: "mun-1*“ 04‘ um II a m 11‘" Com 0 ControlChoice,HazardZone,InfestDistance: HDamProb,j,k,g,PruneCost, 1 then SHazardZon then SHazardZon then SHazardZon random(1101); hen ProbHDam : 1 festDistance >=ize1 and (InfestDistance <=soo1 then ProbHDam integer; 2 + 1) can. no a ' o 9 e 'Low 2 ‘Hedi e 'High' = 0.05; ProbHDam := 0; ProbHDam := 0.15; BCCost else SrubControlCost : rite('The proposed)planting site must be The default cost of monitoring ite(‘Enter the cost or enter 0 to use the = BHCost else SrubhonitorCost := (round(TPA * ((SrubflortPercent + Year36rubHort + (SrubflortPercent + Year36rubhort + Year46rubflort)) BugSl := BugSI - SlReducer; = SrubHon1torCost; { no control } Year36rubhort + istance >=501) and (lnfestDistance (=1000) then (InfestDistance (=500) then ProbHDam (InfestDistance <=1000) ProbHDam := 0.05; then 102 if HazardZone = 3 then begin if lnfestDistance <= 125 then ProbHDam := 0.50; SID := '< 1/8 mile" if élgsestDistance >=126) and (InfestDistance (=500) then ProbHDam m- m , SID := < 1/2 mile' if (Infes tDistance >=5011 and (InfestDistance <=10001 then ProbHDam:= . SID := '< 1 mile' ; if lnfestDistance >. :1000 then ProbHDam := 0.10; SID := > 1 mile end; repeat repeat HDamProb := random: until HDamProb <= ProbHDam; if HDamProb <= ProbHDam then be in if HazardZone = 1 then "bar := ((random 5 5 + 0)/100); if HazardZone = 2 then HHort := ((random * 5 + 5)/100)° if HazardZone = 3 then Hhort := ((random * 10 + 5)/100‘; end; { of HDamProb < ProbHDam } until SI”Mort >= 0; if HDamProb > ProbHDam then HHort : 0; clrscr; gotoxy(5, 5P write(' You have chosen to simulate the effects of pine root collar weevil on ); gotoxy(5, 6); write(' projected red pine volume yields. This plantation was first randomly’); gotox (5,7); write(’ assi ned to the ',SHazardZone,’ root collar weevi hazard zone. Nex W; gotox (5, BP write(' a distance of ,SlD,’ to the nearest weevil infes at1on was ’); gotox (5,9): write(’oenerated. Using this information red pine morta ity of ,(NMort*100):2: 0, Z due' P gotoxy(5,1() write(' ine root collar weevil was established. ); gotoxy(5,13); write(’ here are three insect management alternatives of interest 1n this' ); gotoxy(5,l4); write( situation. ); otox (5,17), write(' 1. Basal prune and scrape soil and duff away rom he trees. ); gotoxy(5,18); write(' 2. Apply insecticide to the lower few inches of eac tree trunk. goto>y(5,19), write('3. Do nothing. '); gotoxy(5,23), write( Enter the number of your pine root collar weevil control choice. W; ran e := ['1.'3'l; rea ln(ControlChoice): if ControlChoice = 1 then begin PruneCost := (BugTPA/bo) * 6; {assumes $6.00/hr. & 60 trees/hour} clrscr; gotoxy(5, 7); write(’ You may enter a cost per acre for pruning & scrap1ng,8) or accep t' gotoxy( write(' the default value of S ',PruneCost:2:2,’ per acre. ); gotoxy(lo 11P write(' Enter the cost (xx. xx), or enter 0 to use he default valu ')' range = I 0 u9','.'l; rea ln(j) if j = 0 then NeevilControlCost := PruneCost else NeevilControlCost '= j goto§y(5; ,15P write('The plantation must be monitored at age 4 and age otoxy(5,16P write('The default cost of monitoring is S 0.50 per ree. otoxy(10,19); write('Enter the cost of monitoring, or 0 for the efau t W readln(kP if k = 0 th hen e:= 0.5 else g: 1f Standfirea <= 1 then Neev lMon1torCost := 20 * 9; if (StandArea > 1) and (StandArea <= 3) then Neev1lHonitorCost := 103 7 * StandArea * g- if (StandArea 2 l and (StandArea (=5) then HeevilflonitorCost := 4 * StandArea * 9; if (Standnrea 2 5) and (StandArea (=10) then HeevilHonitorCost := 3 * StandArea if Standnrea > 1 then HeevilMonitorCost := 2 * StandArea ! g; econI7]. control = UeevilControlCost; econI3]. monitor := WeevilHonitorCost; econ[61.monitor := HeevilMonitorCost Bu TPA := round((l - Hflort) 1 Bu TPAl; {of if control choice = 1 if 00ntrolChoice = 2 then begin SprayCost := ((Bu TPA/120) * 6 + 5 P {assumes $6.00/hr. & 120 trees/hour and $5 acre for chemicalsl clrscr; gotox¥15,7); write('You may enter a cost per acre for spraying or accep ; gotoxy(5, B); write('the default value of S ' ,SprayCost:2:2, ' per acre. otoxy(10 11); write(' Enter the cost (xx. xx), or enter 0 to use he default value. )- ran 9 := I’ 0‘ '9' ,'.’l; rea ln(j)' if j = then weevilControlCost := SprayCost else HeevilControlCost := j; goto;y(5,15); write(’The plantation must be monitored at age 4 and age I Q otoxyf5,16); write('The default cost of monitoring is 3 0.50 per ree. ; otoxy<10,19); write('Enter the cost of monitoring, or 0 for the efau t. ’ ' readln(k): if k = 0 then g:= 0.5 else g:= k; if StandArea <= 1 then Neev1lHon1torCost := 20 * ° if (StandArea > 1) and (StandArea <= 3) then Heev1lHonitorCost := 7 * StandArea * gza if (StandArea 2 ) (StandArea (=5) then HeevilflonitorCost := 4 * Standfirea * 9; if (StandArea 2 5) and (StandArea <= 10) then HeevilflonitorCost := 3 * StandArea * 9; if StandArea 2 10 then HeevilhonitorCost := 2 * StandArea * g; econi71.control := WeevilControlCost; econ[31.mon1tor := NeevilMonitorCost; econtb].mon1tor := HeevilMonitorCost Bu 199 := round((l - unort) * BugTPAl; en ; { of if control choice = 2} 1f ControlChoice = 3 then begin Bu TPA := round((l - NMort) * BugTPA); IF := Bu TPA; end; { o if controlchoice = 3 1 end; {of weevil} Overlay Procedure Sawfly; var controlchoice, j,k, temp1,temp2, temp3: integer; SprayCost: real; begin j:=0; templ: =0; temp2 :=0; temp3:=0; Randomize (0, OP OutbreakYear := round(random * 7 + 6); if Bu SI < 50 then begin SRCoPercent '= random; SRCBPercent := (1 - SRC3Percent) * random; :nClPercent := 1 - SRC3F’ercent - SRC2Percent; an if BugSI > 50 the n begin SRC Percent := rando SPClFercent := 1 - SR02Percent; SRC3Percent := 0; 104 end HortI := random * 0.013 + 0; Mort2 := random * 0.018 + 0; templ := round((SRClPercen t * BugTPA) * (1 - Hort1)); temp2 := round((SRCZPercen t * BugTPA) * (1 - Hort2)); Bug PA := templ + temp2; clrscr; gotoxy(5, 5P write(' You)have chosen to simulate the effects of red- headed pine saw y on gotoxy(5, 6); write(' projected red pine volume yields. The year of sawfly outbreak was '); otox (5, 7); write(' randomly determined to be year ',DutbreakYear,'. he s and has been' ); gotoxy(5 8) write(' classs1ified as (SRClPercent * 100): 3:0, Z SRC ,(sntzpercent 1 1001 :3 :o A otox 15,91; iwrite( and (séc3percent 1 1601. -3- o, z sac 111. SRC mor a11t,(Hort1 * 100): 2: l,’ Z and’ otox (5,1 );Swr1te( SRC II mortal1ty is ,(hort2 * 100): 2: 1,‘ Z. RE I I mortality is 1007. '); gotox (5,13); wr1te1'There are three insect management alternatives of in erest in this ); gotoxy(5,14); write( situation. '); gotoxy(5, 17); write(’ 1. Apply herbicide at planting to control compe 1ng vegetation. '); fitox (5&18); write(’ 2. Apply insecticide to the SRC III portion of e s an - gotoxy(5,19) write(' 3. Do nothing. ); gotoxy(10,- write(’ Enter the number of your red- headed pine sawfly control choice. '); range := I 1 ..'3']; readln(ControlCh01ce): if EontrolChoice = 1 then begin i:=) if PlantingMethod = 2 then SFCCost := 70 else SFCCost := 60; c rscr; gotoxy(5, 7P write(’ You may enter a cost per acre for weed control. or accept’); gotoxy(5, ,8); write(’ the default value of S ',SFCCost:2:2,' per acre gotoxy(10 11): write('Enter the cost (xx.xx), or enter 0 to use he default value. ')° ran e := I' 0' 9’ , . '1; rea ln(j) if 1 = then SawflyControlCost := SFCCost else SawflyControlCost J. econIO]. control := SawflyControlCost; temp3 := round((SRC3Fercent * TPA) * (1 - Hort2)); TPA := templ + temp2 + temp3; end; {of if control choice = 1} if ControlChoice = 2 then begin j:=0; k. =0 clrscr; SprayCosi. = gotoxy(5; ,7); write(' You may enter a cost per acre for spraying or accep gotoxy(5,8); write(' the default value of $ HSprayCost 2. 2, per acre. otoxy(10 11); write(’ Enter the cost (xx. xx), or enter 0 to use he default value. ')° range := I‘ 0' .. '9' ,'.'1; readln(j)' if j = 0 then SawflyControlCost := SprayCost else SawflyControlCost := j gotoxy(5,15); write( The plantation must be monitored before and after spraying gotoxy(o,16P write( The default cost of monitoring is S 1. 50 per acre. otoxy(10, 19); write(' Enter the cost of monitoring, or 0 for the e au readln(kP . if k = 0 then SawflyfionitorCost := 1.50 else SawflyHonitorCost := k; If ControlChoice = end; {of Sawfly} econIOutbreakYearl.control 105 SRC3Percent)° econIOutbreakYear - 1]. monitor := SawflyMonitorCost; econIOutbreakYearl. monitor := TPA := templ end; { SawflyMonitorCost := SawflyControlCost * (StandArea * temp3 := round((SRC3Percent 1 TPA) 1 (1 - Mort2‘); + temp2 + temp3; of if control choice = 2} 3 then TPA := BugTPA; Overlay Procedure BugDisplayl; {called from BugSrow} var x: integer; begin clrscr; gotoxy(2, 1P write('Stand l trees/ac = ,StartTPAl); gotoxy(30, 1P write(' Stand 1 harvest a e = ,HarvestAge); gotoxy(621 write(' Stand 1 SI = ,SI gotoxy(2 2)°; write( Stand 2 trees/ac = ,StartTPA2); gotoxy(30,2); write(' Stand 2 harvest age = ,BugHarvestAge); gotoxy(62,2); write(' Stand 2 SI = ,BugSI); gotoxy(2 3P write( Minimum pole dbh = ',PoleMin: 2: 1); gotoxy(30,3); write( Minimum sawtimber dbh = ,SawMin: 2: l); otoxy(62,3); write( '); or x:= 1 to 80 do be in gotoxy(x,4);write(' - W;end; end, {of BugOisp ay1} Overlay Procedure Displayl; {called from grow} var x: integer; begin clrscr; gotoxy(2,2); write('Stand a e) at start = ',StartAge); gotoxy(62 2P write(’ Site index = ' gotoxy(2 3): write(' Original BA/ac = I)StartBA:3 :1) ' gotoxy(30,3l; write( Or1ginal trees/ac = ,StartTPA AI; gotoxy(62,3); write(' Ave. = ,(sqrt((atartba/StartTPA)*183.3466)):2:1); gotoxy(2 4P write( Minimum pole dbh = ,PoleMin: L 1): gotoxy(30,4I; write(' Minimum sawtimber dbh = ,SawMin: 2: 1); otoxy162,4); write(' Harvest age = ,HarvestAge); or x = 1 to 80 do be in gotoxy(x, 5P write(' - 'P ,end; end; {of Display } Overlay Procedure BugCurrentDisplay; write {called from be var g,i,z,x,y:integer; 991 x:= (StandAge - 1); y:= (StandAge - 1); 1f Standage >= Bu otoxy(11, 5P wri eginning of Year oxy(9, 6P ? HarvestAge then e(’ Stand 1: ’,xfl); h: 1c Per real, = BugHarve re Descript BugGrow} stAge - 1: ion at the rite1'Poletimber'); gotoxy(38, 7); write(‘ ite(‘ Trees' 1' write(’ Cu.’ 1; rite( Cu.’ ) write(' /a . write( db’ gotoxy(l 7) - write(SBugChoice); gotoxy(25, ,7); w awtimber )- gotoxy(59,73; write(' Pole + Saw' )- gotoxy(24, 8); write( ------------ ! gotoxy(l 9): write(’Oom'); gotoxy(b gotoxy(lé,9l; write('Ave. ); gotoxg gotoxy(39 9); write(' Cu. ); go oxy( gotoxy(l,10)' write(' Ht.’ ); gotoxy( gotoxy(13,1ol; write( BA’)' gotoxy(l gotoxy(26,10). write('ft.'); gotoxy( gotoxy(40,10):write(’ft.')' gotoxy(4 gotoxy(56,10), write(’ft. i; gotoxy( gotoxy(69 10), write( Cords' ); gotox gotoxy(l,11); write( --- ----- ~7; gotoxy(1,12). write(r[xl.DomHt:3:0); gotoxy(7112) wr1te(rle.TPA)- gotoxy(13,123, write(rle.BA:3:0); 97103:“ 106 gotoxy(18,12); write(rtx].DNdbh:2:l) gotoxy(24,12); write(r[x].HerchPoleC%V:4:0,'*'); gotory(32,12); urite(r[x].PoleCords:3:1,’* ); gotoxy(39,12); write(rtx].HerchSauCFV:4:0,'*'); gotoxy(46,12); urite(r[x].flBFVolInt:2:1,'**'); gotoxy(54,12); write(rix].HerchCFV:S:0, *'); gotoxy(62,12); write(rtx].HerchCFV/x:3:1); gotoxy(69,12); urite(r[xJ.HerchCords:2:1,'*'); gotoxy(76,12); urite(r[x]. HerchCords/x:3:2); gotoxy(24,13); write(r1x1.PoleCFV: 4:0, 0 ); gotoxy(39,13); write(rlx]. SawCFV:4:0, A'); gotoxy(54,13); write((rixJ.PoleCFV + r1xJ.SauCFV): 5:0, '); gotoxy(bZ 13); write((rtxl. PoleCFV + r1x].SaHCFV)/x:4:1, '0'); gotoxz(1,14); write(' Total Non- Insect- Killed Trees = ,Hor alitzTreeCount); for z:= 1 o 80 do begin gotox (z,16);ur1te(");end otoxy(11,17); write( Stand 2: er Acre Description a1 the e inning of Year ,y+1); go oxy(9,18); wr1te(’ --------------------------------------------------------- ! gotoxy(1,19), wr1te(bugr[yL DonHt: 3: 0); gotoxy(7419) urite(bugr[{LT gotoxy(13,19); write(bugr .BA: )3: 0); gotoxy(18,19); write(bugrtyL QHdbh: 2: 1) gotoxy(24,19), wr1te(bugr[y]. MerchPoiecfiv:4:o,'*'); gotoxy(32,19), write(bugrEyL PoleCords:3:1,’* ); gotoxy(39,19); write(bugrEyL MerchSawCFV:4:0,'*'), gotoyy(46,19); wr1te(bugr[yL HBFVolInt:2:1, i*'); qotoxy(54,19); write(bugrEyL HerchCFV: 5:0, *'); gotoyy(62,19); write(bungyL MerchCFV/y:3:1); gotoxy(69,19); write(bugrEyL MerchCords:2:l,’*’); gotoxy(76,19), write(bugrEyL NerchCords/y:2:2); gotoxy(24,20), write(bugrEyL PoleCFV: 4: 0,’ “'); gotoxy(39,20); wr1te(bugr[{L .SawCFV:4 :0, A')' gotoxy(54,20), write((bugr yL PoleCFV + bugriy].SawCFV):5:0,'0'); gotoxy(62,20); write((bugrtyL PoleCFV + buqrEy].SaHCFV)/y:3: 1 ' ); otoxy(1,21)' write(' fatal Non- Insect- Killed Trees = ,BugHortali1yTreeCount); gotoxy(1,23)- write(’ *3 A **6 in. min. top diams. inside bark. '); goto>y(48,23); write( ° Tot stem vol, no top diam 11m. '); end; {of BugCurrentDisplay} Overlay F'rocedure CurrentDisplay; {called from Brow} var g,1,z,x:1nteger; h: real; begin x:= (Stanque*1); gotoxy(13,7): write(' Per Acre Stand Description at the Beginning of Year ,x+l); gotoxy(13,8); write(' ------------------------------------------------------ '); otoxy<25,10); write(' Paletinber ); gotoxy(38, 10); write(‘ awtimber ) gotoxy(59,10 r1te(' Pole + Sau' ); gotoxy(24,11 gotoxy(l 12)- write( Dom ); gotoxy(b 12)° write(' Trees ) gotoxy(lé,12); write( Ave.’); otoxg125 12); write(' Cu.’ 1; gotoxy(39 12); write( Cu. ); go oxy( 5 15); write(' Cu. ); gotoxy(l 13): write(' Ht. '); gotoxy(7,13); write(' /ac.'); gotoxy(l3,l3); write( BA 1- gotoxy(18 131- write( dbh 1; gotoxy(26,13); write(' +t.‘ 1; gotoxy(3é 13); write(' Cords' ); gotoxy(40,13);wr1te(’ft. 1- gotoxy(47 13)- write( MBF )- gotoxy(56,13); write(' ft. '1; gotoxy(63 13)- write(' HA1' 1; gotoxy(b? 13); write( Cords 1; gotoxy(?7,131- write( MAI’ 1; notoxy(1,14); write(' --- ----- ~7; ---- ----------- ~--- ! otoxy(1,15);w write(rExJ.DomHt:3:0); gotoxy(?llfi): write(r[x1.TPA); gotoxy(13,15), write(rix].BA:o:0); 107 gotoxy(18,15); write(rtx]. QHdbh: 2: 1) gotoxy(24,15); write(rEXJ. merchPoiec¢v141o, 1 1; gotoxy(32,15); write(rtx]. PoleCords: 3:1, * ); gotoxy(39,15); write(rEx]. HerchSawCFV:4: 0,‘ *' ); gotoxy(46,15); write(rtx]. HBFVolInt:2:l,' ** ); gotoxy(54,15); write(rlx].HerchCFV:5:0, *' ); gotoxy(62,15); ur1te(r[x].flerchCFV/x:3:1); gotoxy(69,15); ur1te(r[x]. HerchCords:2:1,‘ *' ); gotoxy(76,15); write(rixL HerchCords/x:3:2); gotoxy(24,16); write(rth PoleCFV: 4: 0,‘ “' ); gotoxy(39,16); write(rixL SauCFV: 4: 0, ‘ )3 gotoxy(54,16); write((rth PoleCFV + rle SauCFV): 5:0, '“ '); gotoxy(62 16); write((r[xL PoleCFV + rth SaNCFV)/x:4:1, 'A'); gotox (5,191; «rite( Total Mortality Trees = ,Mor alityTreeCount); gotoxy(4,21); write(' * 3 in. n1n. top dial. inside bark. '); gotoxy(4,22); write(’ ii 6 in. min. to? diam. inside bark. '); gotoxy(4,23)' write('A Total stem vo une, no top 61am. lin1t. '); end; {0* CurrentDisplay} Overlay Procedure BugThinningYearDisplay; {called from BugBrou} var x,y,z:1nteger; begin x:= StandAoe; gotoxy(11,5): write(' Stand 1 Per Acre Description at the Beginning of Year x+1); gotoxy(9, 3); write( --------------------------------------------------------- gotoxy(24) 7); write(‘Poletimber'); gotoxy(38,7); write(' awtimber gotoxy(59,7):wr1te(' Pole + Saw'); gotoxy(1,7); write(SBugChoice) gotoxy(24, e1; ur1ie< -—---7; ------ gotoxy(l 9): write(' Dom' ); gotoxy(b 9); write(' Trees )- gotoxy(lé,9); write(' Ave. ); go toxg125,9); write( Cu. ); gotoxy(39 9); write( Cu ), go oxy( 5,9)- write(‘Cu.'); gotoxy(1130)- wr1te( Ht. ); gotoxy(7,10); write(' lac. ); gotoxy(11,1oi; write( BA )'gotoxy(18 101- write( dbh 1; gotoxy(26,10); write(' ft. ’); gotoxy(Sé 10); write(' Cords' ); gotoxy(40,10);wr1te(’ ft. ) gotoxy(47 30)- write(' HBF' ): gotoxy(56,10); write( +1.);gotoxy163.101- write( HA1 1; gotoxy(é? 10); write( Cords' ); gotoxy(77,16); write(’ MAI' ); gotoxy(1,11); write( --- ----- --7 ---- ----------- ---- ! gotoxy(1,12); write(rixL DonHt: 3: 0); gotoxy(7 12)- write(rExL TPA gotoxy(13,123; write(rEx]. BA: -31 ~01; gotoxy(18,12); write(rExL QHdbh: 2: 1) gotoxy(24,12); write(rth HerchPoleC%V:4:0,' *'); gotoxy(32,12); write(rle PoleCords: 3:1,'* ); gotoxy(39,12); write(rtx].MerchSawCFV:4:0,' i'); gotoxy(46,12); write(rix].HBFVolInt: 2:1,'**'); gotoxy(54,12); write(rix].MerchCFV:S:0, * ); gotoxy(62,12); urite(r[x].MerchCFV/x:3:1)5 gotoxy(69,12); write(rtx].flerchCords: 2:1, * ); gotoxy(76 12); write(rth HerchCords/x:3:2); gotoxy(1,33); write(’ CUT' )' gotoxy(7 13)- write(-1* tixL ThinnedTPA)- gotoxy(13,13); urite((-l 1 ttx]. ThinnedBA): ~31 o1; gotoxy(18,13): write(r[x].QHdbh: 2: 1): gotoxy(24,13); write((-1 * tle TMerchPoieCFV):4:0); gotoxy(32,13): write((-1 * tixL TPoleCords):3:l)' gotoxy(39,13); wr1te((-1 * t[x].THerchSawCFV):4:b): gotoxy(46,13): write((-1 * tth THBFVolInt):2:2); gotoxy(54,13); write((-1 * tth THerchCFV):S:O); gotoxy(é? 1;). write((-1 * tth THerchCords):2:l)£ gocoxy(1,i41; for y := 1 to 80 do begin gotoxy(y,1 ), write(’- );end; 108 gotoxy(1,15); write(rEAL DomHt: 3:0): gotoxy(7 1511 write((rth TPA - t1x3.ThinnedTPA)); gotoxy(l3,15); write((rtxl.BA — t1x].ThinnedBA):3:0); gotoxy(18,15). write(r1xL Qfldbh: 2:1 ° 20toxy(24,15): write((rth HerchPoleéFV - [x]. MerchPoleCFV): 4:0); gotoxy(32,15); write((r1xL PoleCords - tth TPoleCords):3:1)- gotoxy(39,15); write((rth HerchSauCFV - tth THerchSauCFV):4:0): gotoxy(4b,15); write((rIXL HBFVolInt - t1xL THBFVolInt):2:2): gotoxy(54,15). write((rExL MerchCFV - tle THerchCFV): 5:0)- gotoxy(69,15): write((rth HerchCords - t[xL THerchCords):2:1): or z:= 1 to 80 do beg in gotoxy(2 17): write( = ):end: otoxy(11,18). write( 9Stan Per Acre Description at the e 1nn1ng of Year ',x+1); go oxy(9,19); ur1te( --------------------------------------------------------- ! gotoxy(1,20); ur1te(bugr[xL DomHt: 3: 0); gotoxy(7 20)°wr1te(bugr1AL TPA) gotoxy(13,20): write(bugrixL BA: )3: 0); gotoxy(18,20): write(bugrEAL DMdbh:2:1)' gotoxy(24,20); wr1te.'y(76;20): write(bugrth .HerchCords/x:2:2): goto1y11,21); write( CU goto1y(712l)- write(-1 * bugtth ThinnedTPA)' goto 0 then begin Com lnt(control,x)- con rol := DiscountedValue; temp3 := temps + control; end; { of control if inventory <> 0 then begin Complnt(inventory,x)' inventory := DiscountedValue; tenp4 := temp4 + inventory; end; { of inventorz} if layout <> 0 then egin Complnt(la out,x)- layout := iscountedValue; temps := tenpS + layout; end; { of layout } end; { of with - do } end; {of for - do } temp‘ -= temp2 + econlO].nonitor; tempZ := tempS + econ[01.control; {calculate discounted revenues {or controlled stand} cp:=0; sp:=0; pp:=0; dcp:=0; dsp:=0; dpp:=0; {or x := 1 to HarvestAge do begin with tlx] do begin if thinnedBA a> 0 then be in cp -= TMerchCords * Price erCord; sp = TMBFVollnt * PricePerHBF; ED = TPoleCords * PricePerCord; omplntlcp,x); dcp := dcp + DiscountedValue; Complntlsp,x); dsp := dsp + DiscountedValue; Complnt(pp,x)- dpp := dpp + biscountedValue; end; { of if - then } end; ( of with - do } end; { of for - do } sv := r[HarvestAge-ll.HBFVolInt * PricePerHBF; Complnt(sv,HarvestAge); dsv := DiscountedVaIue; cv := rEHarvestAge-ll.MerchCords * PricePerCord; CompInt(cv,HarvestAge); dcv := DiscountedVa ue: pv := rlHarvestAge-l].PoleCords * PricePerCord; Complnt(pv,HarvestA e); dpv := DiscountedVa ue; DiscountedCordsRevenue := dcp + dcv; DiscountedSawRevenue := dsg + dpp + dsv + dpv; AllCostsDiscounted := Site repCost + PlantingCost + tenp2 + ten 3 + temE4 + tenpS; Insec Control ostsDiscounted := temp2 + telp3; ( calculate discounted revenues for bug stand } cp:=0; sp:=0; p:=0; dc :=0; ds :=0; dpp:=0; for x := l to ugHarves Age do egin Hlth bugttxl do be in if thinnedBA <> then be in cp := TMerchCords * Price erCord; sp := THBFVolInt * PricePerHBF; p := TPoleCords * PricePerCord; omplnt(cp,x)' dcp := dcp + biscountedValue; Complnt(sp,x)° dsp := dsp + biscountedValue; Complnt(pp,x)- dpp := dpp + biscountedValue; end; { of_if - then } end; { o{ with - do } end; { of for - do } 111 sv := bungBugHarvestAge-l].HBFVolInt * PricePerHBF; Complnt(sv,BugHarvestAge); dsv := DiscountedValue; cv := bugrEBugHarvestAge-lJ.HerchCords * PricePerCord; Complnt(cv,BugHarvestAge); dcv := DiscountedValue; Ev := bugrtBugHarvestAge-l].PoleCords * PricePerCord; omplnt(pv,BugHarvestAge); dpv := DiscountedValue; BugDiscountedCordsRevenue := dcp + dcv; BugDiscountedSawRevenue := dsp + dpp + dsv + dpv; end; { of NPV } Overlay Procedure VolumeSummary; var x,y: integer; be in $TMerchCords:=0; TTHBFVolInt:=0' TTPoleCords:= BugTTMerchCords:=0; Bugrrnervolint:=o; BugTTPo BugTTTotalCFV:=0; for x := l to HarvestAge do begin with t[x] do be in if ThinnedBA > 0 then begin TTMerchCords := TTHerchCords + TMerchCords; TTMBFVolInt := TTMBFVolInt + THBFVolInt; TTPoleCords := TTPoleCords + TPoleCords' TTTotalCFV := TTTotalCFV + THerchPoleCFO + THerchSawCFV; TThinnedTPA := TThinnedTPA + ThinnedTPA; end; { of if - then } end; { of with - do } end; { of for - do } {or z := 1 to BugHarvestAge do begin wi h bugtEyl do begin if BugThinnedBA x) 0 then begin BugTTMerchCords := Bu TTHerchCords + TMerchCords; BugTTHBFVollnt := Bug THBFVolint + THBFVolInt; BugTTPoleCords := Bu TTPoleCords + TPoleCords; BugTTTotalCFV := Bug TTotalCFV + TMerchPoleCFV + TMerchSawCFV; Bu TThinnedTPA := BugTThinnedTPA + ThinnedTPA; en ; { of if - then } end; { of with - do 1 end; { 04 for - do } end; { of VolumeSummary } 0 TTTotalCFV:=0; l o éc rds:=0; Overlay Procedure DisplayVolumeSummary; var x: integer; begin clrscr; x:=HarvestAge-1: if Choicel = 1 then be in gotoxy(30,l); write(‘S and Volume Summary'); gotoxy(28,2); write(’ ------------------------ '); end: if Choicel = 2 then begin gotoxy(16,1); write('Stand 1 Volume Summary (with insect managementl'); gotoxy(14,2); write(' --------------------------------------------------- '); end; gotoxy(5 4); write('Harvested merchantable cordwood volume = ‘); gotoxy(55é4); write(r[x].HerchCords:4:l,' cords/acre.'); otoxy(5,o); write('Herchantable cordwood volume removed in hinnings = ‘); otoxy(o9 5); write(TTHerchCords:4:l ' cords/acre.'); gotoxy(5,$l; write(’Total merchanta 1e cordwood volume produced = )3 ( vestAge):4: l,’ 112 goto>:y(59, 6) write((r[x].HerchCords + TTHerchCords):4:l,' cords/acre.’ 5, gotoxy(5 7)- write(' "Al (or merchantable cordwood volume gotoxy(59 71; write(((r1xl. HerchCords+TTHerchCords)lHarvestAge):2: 2,’ cordslacre/year.’ ); gotoxy(5,9); write( Harvested International 1/4" bd. ft. volume = wr rite(rtx]. HBFVolInt: 3: 1,‘ HBF/acre.‘ ); write(’Int. 1/4' bd. ft. volume removed in all 1 II \ V "O 9 s gotoxy(d9 9 4) l. 5); write(TTPoleCords:3:1,' cords/acre.‘ ); write( Total pole volume produced in addition to 9 0 l 10) write(TTHBFVolInt: 3: 1, ' HBF/acre.’ gotgxy(§ 11); write( Total International 114" bd.)1t. volume pro uce = ° gotoxy(59,11); write((r[x].HBFVolInt+TTHBFVolInt):3:1, BF/acre )- gotoxy(5,121; write('HAI for International 114" bd. ft. volume = gotoxy(u9,12); write((r[x].MBFVollnt+TTHBFVolInt)/HarvestAge:2:2, BF/acre/year '); gotoxy(5,14); write('Cordwood poles harvested in addition to sawtimber = ’); gotoxy( 9 1 ; write(rExI. PoleCords: 3: 1, cords/acre. '); gotoxy 9 ? write( Cordwood poles removed in all thinnings = '); 6 1 9 r gotoxy(59, ) cords/acre. ) gotoxy(5, 18); goto):y(59, 18); write((rtxJ.HerchPoleCFV + r[x].HerchSawCFV):5:O, cu ft/acre. '); . ggto>y<5 19); write(’flerchantable cubic foot volume removed in innin s = goto>y(u9 19): write(TTTotalCFV: 5: 0, ' cu ft/acre.’ ); goto>:y(5, i0); write(’ Total merchantable cubic foot volume produced ) ; write((rtxl.PoleCords+TTPoleCords):4:1, write('Harvested merchantable cubic foot volume = gotoxy(59,20); write((rle HerchPoleCFV+r[x]. MerchSawCFV+TTTotalCFV): 5: 0, cu ft/acre. ') otox 5 2 gotoxy(59 write( (r1 .write(’HAI for merchantable cubic foot volume = '); HerchPoleCFV+rIxL MerchSawCFV+TTTotalCFV)/Har u ft/acre/year.’ ); of DisplayVolumeSummary } l); 21) x]. c end; Overlay Procedure DisplayBugVolumeSummary; var x: integer; begin clrscr; gotox (15 1); x:=Bu Harvest ge- 1; write 'Stand 2 Volume Summary (without insect management) ); gotoxy(l3,2); write(’ ----------------------------------------------------- '); 9 gotoxy(5 4)' write(’Harvested merchantable cordwood volume = gotoxy(59 4), write(bugr[x].MerchCords:4:l,' cords/acre.'); otoxy(5,5), write('flerchantable cordwood volume removed in hinnin s = ' ; gotoxy(g9 5); write(Bu TTHerchCords:4:1,' cords/acre. ); gotoxy(5,$), write(’ To a1 merchantable cordwood volume produced = gotoxy(59,6); write((bugr[x].HerchCords + BugTTHerchCords):4:1, cords/acre.’); gotoxy(5 7). write('HAI for merchantable cordwood volume = '); gotoxy(59,7); write(((bu rle 2HerchCords + uoTTMerchCords)/Harvest ge): ' cords/acre/ ear.’ goto>:y(5, 9); write( Harvested 2International 1/ " bd. )it. volume = gotoxy( 59,9); write(bugrlxl.MBFVolInt:3:1,' HBF/acre.'); 113 atoxy(5,,10);,)urite(‘1nt. 1/4" bd. ft. volume removed in all 1nn1n s = ' gotoxy( 9 10 );’write(BugTTHBFVolInt 3:1 ' HBF/acre.‘ ); gotoxy(5, 11 ' write('To al Internat1ona1 1/4“ bd. ft. volume produced = ’); agégxy(59 ,}1); write((bugr[x].HBFVollnt + BugTTHBFVolInt):3:1, acre. gotoxy(5, 12); write('HAI for International 1/4" bd. ft. volume = go1ox (59,12)- write((bugrEXL HBFVolInt + TT BFVolIn1)/HarvestA e: 2: 2, ' HBF/acrel ear.'); go oxy(5,14); write(‘ Cor HOOd poles harves ed in addition to sawtimber = ’); gotoxy(59 14); write(bugrixL PoleCords: 3: l cords/acre.’ ); gotoxy(5 15)- write(' Cordwood oles remove in all thinnings = ’); gotoxy(59 15); write(BugTTPole ords: 3: 1,‘ cords/acre. gotoxy(5,16); write('To a1 pole volume produced in add11ion to sawtimber = '); gotoxy(5 9,16); write((bugrtxl.PoleCords + BugTTPoleCords):4:1, cords/acre. ’); gotoxy(5,18); write('Harvested merchantable cubic foot volume = o1oxy(59,18); write((bungXJ. HerchPoleCFV + u r[xL HerchSawCFV):5: 0, cu ft/acre.’ go oxy(S, 19); write(' Merchantable cubic 1oot volume removed in binnin s = ); gotoxy(u9 19); write(BugTTTotalCFV: .5: 0, ' cu ft/acre.’ ); goto>:y(5, 20); write( To a1 merchantable cubic foot volume produced gotox (S9 20); write((bu r[xL HerchPoleCFV + bugrth MerchSauCFV + ugTT ota1CFV) ):s:o, cu t/acre. ); gotoxy(5 21); write(' MAI for merchantable cubic foot volume = '); goto, (55,21); write(((bugr1xl.MerchPoleCFV + bungxl. MerchSauCFV + Bug TTotalCFV)/HarvestAge) 4: 1 cu ft/acre/year.’ ); end; { of DisplayBugVolumeéummary } Procedure DisplayEcon; var y: rea ; begin clrscr; y:= InsectControlCostsDiscounted; gotoxy(28,2); write( Final Economic Analysis ); gotoxy(26é3), write(' --------------------------- '); gotoxy(5,o); write(’ Insect Managed Stand' ); gotoxy(5,6); write(' -------------------- ') gotoxy(5,8); write(' Discounted value of total cordwood volume = gotoxy(éS 8); Hr rite(' S ,DiscountedCordsRevenue: 5: 2); gotoxy(5,9)' wri te( Discounted value of sawtimber plus pole cordwood voiume = gotoxy(bS 9); write(' 3 ,DiscountedSawRevenue: 5: 2); gotoxy(5 10)- write(’ Discounted value of all costs = '); gotoxy(bé 10); write( 3 ,AllCostsDiscounted: 5:2); gotoxy(5,12); write(‘ Net present value of the stand in year of plantin (year 0) is:'); gotox ( 0, 3); write(' Cordwood NPV = 3 ',(DiscountedCordsRevenue - All ostsDiscounted): 3: 2); gotox (40,13); write(' Sawtimber NPV = t ',(DiscountedSauRevenue - All ostsDiscounted):3:2); gotoxy(5,15); write('Evaluation of Insect Management Efforts‘); gotoxy(5,16); write( --------------------------------------- '); gotoyy(5,17); write(’Discounted value of cordwood volume saved = go1oxy(65,17)- write(' 5 ' (DiscountedCordsRevenue - u DiscountedéordsRevenue):5: 2); go oxy(5,18); write(' Discounted value of sawtimber volume saved : ; ; ootoxy write( 5 ' (DiscountedSawRevenue - to: 18) ntedé wRevenue): 5: 2); 19); rite( Discounted value of insect management costs 114 gotoxy(bSA );w rite(' t ',InsectControlCostsDiscounted: 5: 2); ggtox (5 1 ; ur ite(' Discounted value of insect nanageoent e or 5 write(' Cordwood NPV = 3 CordsRevenue - BugDiscountedCordsRevenue)- y): 3: 2); gotox (40, 22 write(' Sawtimber NPV = S ,((DiscountedSawRevenue - Bug iscountedSauRevenue) y). 3: 2); end; { of DisplayEcon } :0 w Qua Program RPPest; Ar‘fif‘ifihhfir‘if“ HHHHHHHHH S $ 5 S S $ $ $ $ p F vardec.inc Variable, type, and constant declarations.) randomize.inc } inp. inc } initial. inc Setting initial stand conditions.} bugs. inc } Display2.inc } CD2. inc } TYD. inc } final.inc } ocedure NaitABit; var ch: char; begin gotoxy(24 25); write(' Press the Space Bar to continue.’); range := {013,8 832 ; repeat read(kbd,ch)' until ch in E913,#323; delline; end; Procedure AvBAl; be in veBfi := BA / TPA end; Procedure BugAvBA; be gugflveBA := BugBH / BugTF‘A; end; Procedure DMDl; be in vBAl; QHdbh := sqrt(fiveBA * 183.346626); end; Procedure BugGMD; begin BungBA; gugfifldbh := sqrt(BugAveBA * 183.346626); en g Procedure HDIl; begin gaxDiamIncr := 0.007 i 51 * exp(-0.01 * BHA); (Lundgren, 1981} en - Prgcedure BugHDl; e gugMaxDiamIncr := 0.007 * BugSI * exp(- -0. 01 * BUEBHA); undgren, 1981} end; Procedure DGRate; WEB 115 if StandA e <> StartAge then begin DER := Q" bh - rEStandAge - 11.0Hdbh; ifdrEStandAge - 11.0Hdbh = 0 then DBR := HaxDiamIncr; en else DGR := HaxDiamInc cr; if DGR (=0 then DGR := 0.0001; end; (01 DGRate} Procedure BugDBRate; begin ugDBR := 0; if StandAge <> StartAge then be in BugDGR := Bu QHDbh - Bu rtStan A e - 1]. DHdbh; ideungStan Age - 11.9" bh = 0 t en BugDBR := BugflaxDiamlncr; en else BuoDGR := BugHaxDianIncr; if BugDGR <= 0 then BugDGR := 0.0001; end; {01 BugDBRate} Procedure MBAll; begin MaxBAIncr := 0.00545415 * TPA * (2 * QHdbh * HaxDiamIncr + sqr(HaxDiamlncr)); end; Frgcedure BugMBAI; e augfia>BAIncr := 0. 00545415 * BuBTPA * (2 * BugDHdbh * BugHaxDiamlncr + sqr(BugHax 1am1ncrl); end; Procedure DHl; be gomHt := int(l.89 * SI * (exp(l.3892 * ln(l - exp(-0.01979 * Seenge))))); end; Procedure BugDH; be gugDomHt := int(1. 89 * BugSl * (exp(1.3892 * ln(l - exp(-0.01979 * Se edAge el)))); end; Procedure 0801; be in iamSD := 0.37628 * QMdbh * (exp((-0.093346 * QMdbh))); end; Procedure BugDSD; be gugDiamSD := 0. 37628 * BquHdbh * (exp((- 0. 093346 * BquHdbh))); end; Procedure ConvertBFtoCFl; be ng erCF := -8.76 + (1.985 * QMdbh) - (0.07253 * sqr(DHdbh)) + (0. 0008421 * exp(3 * ln(QMdbhll) + (0.04951 * DonHt) - (0.00892 * QHdbh * DomHt) + (0. 0003169 * DomHt * exB(2 * ln(QHdbhll) - (0. 000002786 * ;DooHt * exp(3 * ln(QHd if BFperCF <0 then BFperCF := end; {of ConvertBFtoCFl} Procedure BugConvertBFtoCF; be gugBFperCF := -8. 76 + (l. 985 * BquHdbh) - (0. 07253 * 58r(8ug gQHdbhl) + (0. 0008421 * exp(3 * ln(BugDHdbhlll + 931 * BuoDomHt) - (0. 00892 * Bug QMdbh BugDonHt) + (0. 0003169 * BugDomHt * exp12 * ln(BquHdbh))) - (0. 000002786 116 * BuBDomHt * exp(3 * ln(BquHdbh))); if BugB perCF <0 then BugBFperCF := 0; end; {of BugConvertBFtoCF Procedure NumbersPerClass (ATPA: integer; AQHdbh: real; VAR ADianSD: real); {called from NunbersPerClassl} aul, all sduavel, sduaveu, ztl, ztu avelz aveuz, lll, uul, ’sdu1ll, sduuul, 21111, ’ztuul, 1112, lu1z ,ullz, uulz: real; c1,c2,x ,temp1,temp2,tenp3,tenp4 : integer; be in illChar(A, SizeOf(A), 0); templ - temp teop3 1=0 tenp4 := 0; 1+ +rac1AbHDBH12 = 0. 050000 then AveClass := round(AQHDBH) - 1 else AveClass := round(AQHdbh); AUL := AveClass + 0.5; {define upper lilit pf dbh c ass ALL := AveClass - 0.49999999; {p.73 Avery & Burkhart1983} SDUAveL := abs((ALL - AQHdbh) / ADianSD); SDUAveU : abs((AUL - AQMdbh) / ADiaISD); ZTL := 1 / (1 + ZP * SDUAveL); ZTU := 1 / (1 + 2P * SDUAveU); AveLZ := 0.5 - ((1 / sqrt(2 * 91)) * (exp(-sgr(SDUAveL) / 2)) 2B§t1)*12b1 + ZTL * (282 + TL * (283 + Z L * (284 + ZTL * ) ) ' AveUZ := 0.5 - ((1 / sqrt(2 * 1)) * (exp(- 5 r(SDUAveU) / 2)) 2851?)?12b1 + ztu * (282 + 9 (283 2 U i (284 + ZTU * d i ACAveClassl -= round((AveLZ + AveUZ) * ATPA); LULZ := AveLZ, ULLZ := AveUZ. 1 .— 0; repeat {calculate NOT/diam class} x := x + 1; (& assign then to array Class} LowClass := AveClass - x; U Class := AveClass + x L L := LowClass - 0.49999999; UUL := U Class + 0.5; SDULLL = abs((LLL - AQHdbh) / ADianSD); SDUUUL -= abs((UUL - AQfldbh) / ADianSD); ZTLLL := 1 / (l + 2P 1 SDULLL); ZTUUL := 1 / (1 + ZP * )SDUUUL); LLLZ := 0.5 - ((1/sgrt(2*pi) * (ex9(- sqr (SDULLL)/2)) * ZTLLL i éggl);’§tlll * 282 + ZTLLL * ( 83+ ZTLLL * (284 + ZTLLL * ! UULZ := 0.5 - ((1/sgrt(2h pi )) * (exp83 -sqr (SDUUUL)/2)) * ZTUUL * (zbl + ztuul * 282 TUU L i ( + ZTUUL i (284 + ZTUUL * 285))))); A[LowClass] 1= round((LLLZ - LULZ) * ATPA); A[UpClassl := round((UULZ - ULLZ) i ATPA); if A[LowClass] <> 0 then ten 1 := LouClass; if A[UpClassl <> 0 then tem := Upclass tem§3 := temp3 + A[lowclass + A[upclass; LUL := LLLZ; ULLZ := UU 2; L until (A[LowClass] = 0) and (A[Upclass] = 0); temp4 := ten 3 + A[aveclass]; if temp4 < A PA then A[AveClass] := A[AveClass] + (ATPA - Ten 4) else A[Ave lass] := A[AveClass] - (tenp4 - ATPA); SmallestClass := templ; BugSmallestClass := templ; Big estClass := temp2; Bug iggestClass := temp2; 117 end; {of NumbersPerClass} Procedure NumbersPerClassI; {called {rom Brow} var y: integer; be gumbersPerClass(TPA, QHdbh ,DianSD); for y:=SnallestClass to BiggestCIass do Classty] := A[y]; end; {of NumbersPerClass Procedure BugNumbersPerClass; {called from Grow} var y: integer; begin NumbersPerClass(Bu8TPA, ,BquHdbh, BugDiaISD); gorly:=8ug8mallest lass to BugBiggestCIass do BugClassty] := end;y ’ (o: BugNumbersPerClass} Procedure TNumbersPerClass; var y: integer; begin NumbersPerClass(ThinnedTPA, QHdbh DiamSD) for y. =8mallestClass to B1ggestcfass do ihinnedc1assty11= A[y]; end; {of TNumbersPerClass} Procedure BugTNumbersPerClass; var y: integer; begin NumbersPerClass(BuBThinnedTPA ,BquHdbh BugDianSD); for :=Bu Smallest lass to BugBiggestCiass do BugT inne Class[ 1: = At end; {of BugT umbers erCIass} Procedure SawPoleBA (BClass: 2; BTPA:inte er; BBA:real; ASmal estClass: in eger; ABiggestClass:integer); ar 2: integer; temp4,0: real; be gawClass := 0; PoleClass := O; FillChar(BB, Size0f(BB) if fr?c(PoleHin) = 0.50000 then PoleCIass := round(PoleHin) - 1 e se PoleClass := round(PoleMin) if {rac(8awflin) = 0.50000 tben SawClass := round(SauHin) - 1 e se SawClass := round(SawHin); temp4 := 0; {or z := ASmallestClass to ABiggestClassS do be eoin BBEz] .= BDlasstz] * (sqr * 00545 415 i; d temp4 := temp4 + BBLz]; en ; if temp4 <> BBA then begin {modify BA/class array so it = BA} for z := ASmallestClass to ABiggestClass do begin 0 := (abs(tem 4 - BBA) * (BEE: temp4)); 88(2) := BBIz - 0; end; end; 2 := 0; CPoleBA := 0: for z := Sgéeglass to (SawClass - 1) do CPoleBA := CPoleBA + Z 3 118 CSauBA := 0; z := ; for 2 := SawClass to ABiggestClass do CSawBA := CSawBA + BBtz]; z := 0; CSmallBA := 0; {or 2 := 4 to (PoleCIass - 1) do CSnallBA := CSmallBA + 8812]; end; {0+ SauPoleBA} Procedure SawPoleBAl; {called from Grow} var y:integer; be in gawPoleBA(Class TPA,BA SnallestClass,BiggestClass)' for := SmallestCIass to BiggestClass do BACty]:= 08 [y]; Smal BA:= CSnallBA; PoleBA:= CPoleBA; SawBA:= CSawBA; end; {of SawPoleBAI} Procedure BugSawPoleBA; {called from Grow} var y:integer; begin SawPoleBAiBugClass BugTPA BugBA,BugSnallestCIass,BuafliggestClass); for y:= Bu éma lestClass to BugBiggestClass o ugBAClylz= BB y]: BugSmallBA:= CSmallBA; BugPoleBA:= CPoleBA; BugSawBA:= CSawBA; end; {of SawPoleBAl) Procedure TSawPoleBA; var y:integer; be in gg?PoleBA(ThinnedClass,ThinnedTPA,ThinnedBA,SoallestClass,Big gee ass ; {or y:= SmallestClass to BiggestClass do ThinnedBACEyl:= BB [y]; ThinnedSmallBA:= CSmallBA; ThinnedPoleBA:= CPoleBA; ThinnedSawBA:= CSawBA; end; {of TSawPoleBA} Procedure BugTSawPoleBA; var y:integer; be in awPoleBA(BugThinnedClass,BugThinnedTPA,BugThinnedBA,BugSmal lestClass, BugBiggestClass); {or y:= 339%mallestClass to BugBiggestClass do BugThinnedBACEy]:= yl' BugThinnedSmailBA:= CSmallBA; BugThinnedPoleBA:= CPoleBA; 8ugThinnedSawBA:= CSawBA; end; {of BugTSauPoleBA} Procedure VolumeComputation (APoleBA:real; ASawBA:real; ASmallBA:real; ADonHt:reall; {called from Grow} {per acre volume estimates of the entire central stem, no toe} to: begin APoleCFV := 0.4085 * APoleBA * ADomHt; (Buckman, 1962} ASawCFV := 0.4085 * ASawBA * ADomHt; ASmallCFV := 0.4085 * ASmallBA * ADomht; ATotalCFV := ASmallCFV + APoleCFV + ASawCFV; 119 {per acre volume estimates of the central stem to 3" top, dib} APoleCords := 0.003958 * APoleBA * ADomHt; {Buck-an, 1962} ASawCords := 0.003958 * ASawBA * ADomHt; AHerchCords := APoleCords + ASauCords; AHerchPoleCFV := 0.3127 * ADomHt * APoleBA; (Lundgren, 1981} AMerchSawCFV := 0.3127 * ADomHt * ASawBA; AMerchCFV := AHerchPoleCFV + AHerchSauCFV; AHBFVollnt := (ASawCFV * BF erCF) / 1000; (Lundgren, 1981} if AMBFVolInt < 0 then AHBF ollnt := 0- AHBFVolScrib := (2.084 * ASawBA * ADonfit) / 1000; {Buckman 1942} if AHBFVolScrib < 0 then AHBFVolScrib := 0; end; {of VoluneComputation} Prgcedure VolCompl; e1n olumeComputation(PoleBA SawBA SmallBA, DolHtl' PoleCFV := APoleCFV; Sawérv 1= ASawCFV; SmallCFo := ASnallCFV; TotalCFV := ATotalCFV; PoleCords := APoleCords; SauCords := ASawCords; HerchCords := AMerchCords- HerchPoleCFV := AMerchPoleCFV; HerchSawCFV := AMerchSawCPV° HerchCFV := AHerchCFV; HBFVolInt := AHBFVolInt; HéFVolScrib := AHBFVolScrib; end; {end of VolCompl} Prgcedure BugVolComp; eoin VolumeComputation(BugPoleBA, BugSawBA Bu SmallBA BugDomHt); BugPoleCFV := APoleCFV- BugSawCFV := AéawC V; Bugémal CFV := ASmallCFo; BugTotalCFV : ATotalCFV; BugPoleCords := APoleCords; BugSawCords : ASawCords' BugherchCords := Aherchfiords: Bu HerchPoleCFV := AHerchPoleCFV; BugHerchSawCFV := AHerchSawCFV; u MerchCFV := ANerchCFV; BugHBFVollnt := AHBFVolInt; BugMBF olScrib := AMBFVolScrib; end; {end of BugVolComp} Procedure TVolComp; begin VolumeComputation(ThinnedPoleBA, ThinnedSauBA, ThinnegSoallBA, om - TPoleCFV := APoleCFV; TSawCFV := ASawCFV; TSmallCFV := , ASmallCFV; TTotalCFV := ATotalCFV; TPoleCords := APoleCords; TSawCords := ASawCords; THerchCords := AMerchCords- THerchPoleCFV := AHerchPoleCFV; THerchSawCFV := AHerchSawCPV; THerchCFV := AMerchCFV; TMBFVollnt := AHBFVollnt; THBFVolScrib := AHBFVolScrib; end; {end of TVolComp} Prgcedure BugTVolComp; egin VolumeComputation(BugThinnedPoleBA, BugThinnedSawBA Bu ThinnedSnallBA, fiugDomHt); BugTPoleCFV := APoleCFV' BugTSawC V := ASawCFV; BugTSmallCFV := ASmallCPV; BugTTotalCFV := ATotalCFV; BugTPoleCords := APoleCords; BugTSawCords := ASawDords; BugTHerchCords := AMerchCords' BugTHerchPoleCFV := AMerchPoleCPV; BugTMerchSaHCFV := AMerchSaHCFV; Bu TMerchCFV := AHerchCFV; BugTMBFVolInt := AMBFVolInt; BugTHB VolScrib := AHBFVolScrib; end; {end of BugTVolComp} Procedure BAGl; {Lundgren, 1981; stand age < 25 yrs.) 120 begin x6 := exp(1.1677 * ln(l- ex 1- 0. 040172 *(SeedAge+1)))); x7 := l-exp(- 0. 0018854 * T A) x8 := exp(1. 1677*ln(1- ex 0.040172*SeedAge))); x9 := 1- exp(- 0. 0018854*T A); BAGrow th h1 := 6. 5653*SI*(X6*X7- x8*x9); end; Prgcedure BugBABI; {Lundgren, 1981; stand age < 25 yrs.) egin x6 := exp(1. 1677 * 1n(1-exp(- 0. 040172 *(SeedAge+1)))); x7 := 1- exp(- 0. 0018854 * Bu TPA); x8 := exp(1. 1677*ln11- -exp(- .040172*SeedAge))); x9 := 1- ex (- 0. 0018854*8ugTPA); gugBAGrowt 1 := 6. 5653*8ug81*(x6*x7- x8ix9); en Prgcedure BAG2; e gAGrowth2 := 1. 689 + (0. 04107 * 8A) - (0. 000163 * s r(BA)) - (0. 07696 * Seedage) + (0. 0002274 * sqr SeedAge)) + (0. 06441 * SI); end; Procedure BugBAGh be BugBAGrowth2 := 1. 689 + (0.04107 * BugBA) - (0. 000163 * sqr(8ugBA)) - (0. 07696 * Seeda e) + (0. 0002274 * d sqr(SeedAge)) + (0. 06441 * Bug 1); en ; Prgcedure ThinOption; {called {rom ThinningDptions} egin clrscr;ootoxy(5,10); write(' Do you want to thin this stand during this rotation (Y or N) 2 ); range := , ’N' ]; readln(‘fhinzhoicel"Y end; {of ThinDption} Procedure NH(ASmallestClass: integer; ABiggestClass: inte er- AClass: p2; 088: real); var n:real; Temp2,Temp1,x,y,z: integer; be in F1 lChar(AMortality s SizeDf(AMortalityClass), 0); 1 “(8A lass) FillChar(GAClass, S Hortality8A’ 1: o; AHortalityTPA 1:0; CTPA Temp1=6=0; Temp2 : if ASmallestClass <= 1 then 2 := 2 else 2 := ASmallestDlass; i{ ASmallestClass <= 1 then begin SurvivalRate := 0.929 AMortalityClassEl] :=5AClass[1] - (round(AClassll] 1 SurvivalRatel); ChortalityBA := Chortalit 8A + (AHortalityClassllJ * (sqr(x) * 0.0054541 )) BAClassll] := AClassEl] - AhortalityClassEIJ; templ := templ + GAClasstl] temp2 := temp2 + AMortalitytlassEl]; 813 as ze 0f 0; A end: {of if - then} {or x := z to ABiggestClass do begin n:= 1. 9953 + (57. 97 * ex (1. n(ADBR))) + (0.2648 * exp(1. 626 * ln(x- 1)) * g 127?)* (x-llll; n 3 ( AMortalityClasslxl := AClass round(AClassixl i l -0. XP ( Surviv )) 012 * (ex ( SurvivalRate := 0. 9997 - (llélg e x — alRa te CflortalityBA := ChortalityBA + (AH eortalityClasslx] * (sqr(x) * 0. 00545414)); GAClasslxl := AClasstxl - AHortalityClassEx]; 121 Templ := Templ + BAClasstxl' Temp2 := Temp2 + Ahortalityélasslxl; end; {of {or - do loop} CTPA := Temgl; CMortalityT A := Temo2; end; {of Noraalflortality} Procedure Normalhortality; var y,z: integer; begin NM(Sma11estClass BiggestClass,Class,DGR); for y := SmallestClass to BiggestClass do HortalityClasslyl := AHortalityClassly]; {or z := SmallestC ass to BiggestClass do Classly] := GAClassly]; TPA := CTPA; HortalityTPA := CMortalit TPA; Hortalit BA := CHortality A' NMCFV := ; NMSawCFV :=o- NHéauBF 1:0; end; {of NormalHortality} Procedure BugNormalHortality; var y,z: integer; begin NM(8ugSmallestClass 8ugBiggestClass,8u Class,8ugDBR); for y := 8ugSmalles1Class o BugBigges Class do BuohortalityClassly) := AHortalityClassEy]: {or z := BugSmallestC ass to BugBiggestClass do BugCIassly] := BAClassE l; BugTPA := CTP - EugflortalityTPA := CHortalit TPA; BugMortalityBA := CMortality A; BugNMCFV :=U; BugNHSawCFV :=0; BugNMSaHBF :=0; end; {of BugNormalflortality} Procedure NMV(ASma1lestClass:integer; A81gaestClass:integer: ASawClass:integer; AHortalityClass:p2); aile, et.al., 1982} Var GSmallestClass,x;GSawClass : integer; templ,temp2,tempo,temp4,al,a2,a3,c1,c2,c3,d1,d2,d3 : real; be in 2emp1:=0; ANNCFV:=0; ANHSawcfv := 0; ANHSaHBF:=0; temp2:=0; temp3:=0- temp4:=0- GSmallestClass:=0; a1:=114.3; c1:=0.07601; d1:=3.928; a2:=344.9; c2:=0.14728; d2:=7.536; a3:=63.09; c3:=0.12942: d3:=6.202; 1f ASmallestClass < 5 then GSmallestClass:=5 else GSmallestCIass:= ASmallestClass' for x:= GSmallestClass to A8iggestClass do be in tegp1.= exp(d1*ln(a1*(1-exp(-c1*x)))1; temp2.= AHortalityClassEx] i temg1; ANgcfv:= ANHcfv + temp2; {4" op, outside bark} en - end; ’ {of NormalHortVol} Procedure NormalflortVol; be in aMV(SmallestClass,BiggestClass,SauClass,HortalityClass); NHCFV := ANHCFv- NMSawCFV := ANnéawcrv; NHSawBF := ANHSawBF; end; Procedure BugNormalMortVol; beg1n 122 NMV(8ugSmallestClass,8ugBiggestDlass,SawClass,8ugHortalityClass); BugNHCFV := ANNE V; BugNHSawCFV := ANHSawCFV; gugNNSaNBF := ANNSawBF; en ; Procedure Thin; Var frac: real; tenpl: integer; begin {rac:=0; case ThinningType of 1: begin {rac:= TreesToRemove/TPA; TPA:= TPA - TreesToRemove; ThinnedTPA:= TreesToReoove; ThinnedBA:= 8A * frac; BA:= 8A - ThinnedBA; end; {of ThinningType 1} 2: begin Th1nned8A:= BAProToRenove * 8A; BA:= 8A - ThinnedBA' ThinnedTPA:= round(bAProToReoove * TPA); TPA:= TPA - ThinnedTPA: end; {01 Thinninglype 2} 3: begin ThinnedBA:= 8A - BAtoLeave; frac:= 8AtoLeave/8A; BA:= BAtoLeave' Temp1:= round(irac * TPA); ThinnedTPA:= TPA - templ; TPA:= templ; end; {of ThinningType 3} end; {of case statement: end; {of Thin} Procedure BugThin; Var {rac: real; templ: integer; begin {rac:=0; BugThinnedBA :=0; BugThinnedTPA:=0; case ThinningType of 1: begin {rac:= TreesToRemove/BuoTPA; 8ugTPA:= BugTPA - TreesToRenove; BugThinnedT A:= TreesToRenove; 8ugThinnedBA:= BugBA * frac: 8ug8A:= BugBA - BugThinnedBA; end; {of Thinn1ngType 1} 2: begin BugThinnedBA:= BAProToReoove * BugBA; BugBA:= BugBA - BugThinnedBA; Buglhinned PA:= round(BAProToReoove * BugTPA); BugTPA:= BugTPA - BugThinnedTPA; end; {01 ThinningType 2} 3: begin 8ugThinnedBA:= BuoBA - BAtoLeave; {rac:= BAtoLeave/BugBA; 8ugBA:= BAtoLeave; Tem 1:= round(frac * BugTPA); Bug hinnedTPA:= BugTPA - templ; BugTPA = templ' end; {0+ 1hinningType 3} d: { ,case statement en of end; ' {of Thin} 123 Procedure NST; be in extScheduledThin:= StandAge + Thinninglnterval; end; {of NST} Procedure BABrowth; {called from Brow} be in 8H ge; case SeedAge of 1..24: begin BA 1- if BHA <= -1 then BA := BA + 0- if (BHA > -1) and (BHA <= 0) t en BA := 8A + (0.00545415 * TPA * (sqr(0.007 * SI * (BHA+1))))- Fm" 11 BABrowthl < 0 then BA := BA + o; . if BAGrowthl > HaxBAIncr then BA := BA + HaxBAIncr- ‘ if BABrowthl <= HaxBAIncr then BA := BA + BABrowthl; end; 25 .250: be in §_ 8A 2' ' 1+ BAGrowth2 < 0 then on := BA + o; if BAGrowth2 > HaxBAIncr then BA := BA + MaxBAIncr; ideABrowth2 <= haxBAIncr then BA := BA + BABrowthi; en ; end; {of case} end; {of BAGrowth} Procedure BugBAGrowth; {called from Brow} begin BugBHAge; case SeedAge of 1..24: beoin BugBAGl: i BugBHA <= -1 then BugBA := BugBA + 0; if (BugBHA > -1) and (Bu BHA <= ) then BugBA := BugBA + (0. 0545415 * BugTPA * (sqr(0.007 * BugSl * (BugBHA+ )l))- 1: BugBAGrowthl < 0 then BugBA := Bu BA + o; if BugBAGrowthl > BugHaxBAIncr then ugBA := BugBA + Bu HaxBAIncr; if BugBA rowthl <= BugHaxBAIncr then BugBA := BugBA + BugBAGrowthl; end; 25..120: begin Bu BA82: i BugBAGrowth2 < 0 then BugBA := Bu BA + 0; if BugBABrowth2 > BugHaxBAIncr then ugBA := BugBA + BquaxBAIncr; if BugBAGrowth2 <= BugflaxBAIncr then BugBA := BugBA + BugBAGrowch; end; end; {of case} end; {of BugBABrowth} Procedure menul; {called from procedure HainHenu} begin clrscr; otoxy(5,5); writeln( Red pine growth & ield with no insects ’); o ox (5,8); writeln('Bed pine growth ie d with stochastic insect levels . . . . 2');go oxy(5,111; writeln('Exit the program . . . . I O I I ; repeat 124 gotoxy(1,21);delline gotoxy(lo, 21); write( Enter the number o{ your choice '); ran e:= ['1'..'3'l; rea ln(choicel); until Choicel in [1..3]; end; {of Henul} Procedure EditHenul; {called from HainHenu} var choice: char; begin repea at gotoxy(1,24); delline; gotoxy(10, 24) write(' Is your selection 0K (Y or N1? '); range = E' n y ,‘N 'Y' J; rea ln(choicei; case upcase(choice) of 'N': Menul; end; until upcase(choice) = #89; end; Prgcedure InitialStandInfo; {called from Basics} e Se SetPoieNin; SetSawHin; SetEstablishAge; SetA eAtStart; SetT A; SetBA; SetDiSplaylnterval; SetHarves Age; end; {of InitialStandInfo} Procedure SP; {called from BugBasics} begin etSitePrep; Set81tePrepCost; SetPlantingMethod SetPlantingMethodéost; SetwoodPrice: SetlnventoryCost; SetLa outCost: Setln erestRate' end; {of SP} Prgcedure Basics; {called from Hainl} e in illChar(r, Size01 FillChar(t, SizeOf lnitialStandInfo; EditISl' end; 1of Basics} Prgcedure BugBasics; {called from Hain2} e in illChar(r, Size0{(r) FillChar(t, Size0f(t) FillChar(bugr, SizeOf FillChar(bugt, Sizeflf FillChar(econ, SizeOf ChooseBu lnitiangandInfo; EditISI; SP; 125 EditSitePrep; SetSeedlin Survival- end; Procedure be in {of ugBasic51 ThinningDptions; hinOption' 1: upcase(1hinChoice) = beg1n 889 then ThinningTiwing; AThinningType; EditThinningOptions; end; Procedure Procedure Procedure Procedure Procedure Procedure Procedure Procedure {of ThinningOptions} StoreValues; forward; RunOptions; forward; HainHenu; forward; StoreThinValues; forward; StoreBugValues; forward; StoreBugThinValues; forward; CountMortTrees; forward; Browlt; begin H01; M011; DGRate; fiBAll; 0H1: DSDl; BABrowth; NumbersPerClassl; NormalMortality; SawPoleBAl; ConvertBFtoCFl; VolComgl' 1+ Nor aiityTPA > 0 then NormalflortVol; StoreValues; end; Procedure be in {of BrowIt} BugGrowIt; quHD; BugHDl; BugDBRate; BugHBAI; Bu Bug DH- DSB: BugBAGrowth; BugNumbersPerClass; BugNormalHortality; BugSawPoleBA- BugConvertBFtoCF; BugVolCom if Bu MortalityTPA > 0 then NormalflortVol; Store u Values; end; Procedure begin {0 BugGrowIt} Thinlt; w 126 Thin; TNumbersPerClass; TSawPoleBA; TVolComp; StoreThinValues' end; { of Thinlt } Procedure BugThinlt; begin ugThin; BugTNumbersPerClass; BugTSawPoleBA; BugTVolComp; StoreBugThinValues: end; { of BugThinIt } Procedure OtherThin; be in isplayl; ThinningYearDisplay; HaitaBi ; EditThinningOptions; RunOptions; NST; end; {of DtherThin} Procedure ButhherThin; beoin BugDisplay1: BugThinningYearDisplay; HaitaBit; EditThinningOptions; RunDptions; NST; end; {of ButhherThin} Procedure Grow; {called from Mainl} var y,count,x: integer; begin NextScheduledThin := MinTAge - 1; x := 1; clrscr; count := 0; repeat BHAge; if BHAl > if (BA = 0) a (SeedAge < 2 BAUl; BA :=BAUnder25; end; repeat y := 0- 1+ rEStandAge — 11.8A = 0 then begin -1 then begin d (SeedAge >=4) and ) then begin n 5 y:' count - (displayinterval * (trunc(count/displayinterval))); x end else x := 1; y + 11 1 . 1ng calculations for year 1) and (StandAge < HarvestAge) do begin ',StandAge); 127 end; {of thinning if - then} StandAge := StandAge + 1; SeedAge :T; StandAge + AgeAtEst; x := x + end; {of while - do} if o((StandAge - 1) <> (NextScheduledThin - Thinninglnterva1)) ((StandAge - 1) ( HinTAge) or (StandAge > HarvestAge) then be if (BHA1 > -1) and (riStandAge- 1]. BA <> 0) then begin CountHortTrees; Displa l; Curren Display; HaitABit; RunOptions; end; { of if BHA1 > -1 then} end {of if - then} until StandAge )= HarvestAg 9- end; {of major if BHA1 >g-1 then} StandAge := StandAge + 1;> SeedAge := StandAge + AgeAtEst; count := count + until StandA e >= HarvestAge; end; {0 Grow} Procedure BugGrow; {called from Hain2} var .y,coun ,x: integer; e 1n BH 1 :=0;BuoBHA1 :=0 NextScheduledThin := StartIPAl := TPA; S x := : clrscr; count := 0; repeat BHA e; BugBHAge; if BHA1 > -1) or (Bu BHA1 > -1) then begin if (BA = 0) and (SeedAge =4) and (SeedAge < 25) then begin BAUl; BugBAU; BA :=BAUnder25: Bu BA := BugBAUnder2 , en - repeat if rIStandAge - 1]. BA = 0 then begin y. = countl- (displayinterval * (trunc(count/displayinterval))); X 3: Y * 5 AinTA e - 1; tartT A2 := BugTPA; end else x := ;_ while (x {= Dis layInterval) and (StandAge < HarvestAge) do begin c1rscr;o oxy(19,12); writeln( Currently d01ng calculations for year ',StandAge); gotoxy(79, 25); Growlt: if StandAge = NextScheduledThin then begin Thinlt° 1+ BugBHAl <= -1 then OtherThin; end; {of thinningi if - then} if (BugBHAl > -1) and (StandAge < BugHarvestAge) then begin Bu GrowIt; if S andAge = NextScheduledThin then begin BugThin t ButhherThin; econtStandAgeL invento ory := lnventoryCost; econlStandAgel. layout := LayoutCost; end; {of bug thinning if - then} end; {of if u BHA1 9-1 if - then} StandAge := StangAge> + 1; 128 SeedAge := StandAge + AgeAtEst; x := x + 1- end- {of’uhile - do} 11 ((StandAge - 1) <> (NextScheduledThin - Thinninglnterval)) or ((StaBdAge - 1) < HinTAge) or (StandAge > HarvestAge) then e in if (BHA > -1) and (rtStandAge-1J.BA <> 0) then begin CountHortTrees; BugDisplayl; BugCurren Display; Na1tABit; RunDptions; end; { oi if BHA1 > -1 then} end' {of if - then} until 8 andAge >= HarvestAge- end; {of major 1+ BHA1 > -l then} StandAge := StandAge + 1; SeedAge := StandAge + AgeAtEst; count := count + ° until StandA e >= HarvestAge; end; {0 BugGrow} Procedure StoreValues; {called from Grow} var x: integer; begin x:= StandAQe; r[xl.StandAge := StandAge; r[x1.TPA := TPA; rix].BA := BA; r[x].AveBA := AveBA; rtxl.QMdbh := thbh; r[x].DGR := DGR; r[x].DomHt := DomHt; r[x1.PoleCFV := PoleCFV; rtx].SawCFV := SawCFV' r[x].SmallCFV := SmallCFV; r[x1.TotalCFV := TotalCFv; r[x].PoleCords := PoleCords; r[xl.SawCords := SawCords; r[x3.HerchCords := HerchCords; r[x1.MerchFoleCFV := HerchPoleCFV; r[x3.MerchSawav := HerchSawCFV; r[xl.MerchCFV := HerchCFV; rlx].HBFVollnt := HBFVolInt; r[x].beVolScrib := HBFVolScrib' r[xl.MortalityTPA := hortalityTBA; r[x1.NMcfv := NMcfv; end; {of StoreValues} Procedure StoreBugValues; (called from Brow} var x: integer; begin x:= StandAge; bugrtxl.StandAge := StandAge; bugrtx].TPA := bu TPA; bugrExJ.BA := bug A; bugrtx].AveBA := bugAveBA; bugrExJ.QMdbh := bu QHdbh; bugrEx].DGR := bu D R; bugrtx].DomHt := ugDonHt; bugrtx].PoleCFV := bu PoleCFV; bugrtx].5awCFV := bug awCFV' bugrEx].SmallCFV := bugSnallCFV; bugrtxJ.TotaICFV := bugTotalCFV; bugrtx}.PoleCords := bugPoleCords; bungx .SawCords := bug awCords; bugrtxl.HerchCords := bugHerchCords; 129 bugr[x1.HerchPoleCFV := bugHerchPoleCFV; bugr[x3.HerchSawC+v := bugherchSawCFV; bugrtx].HerchCFV := bugMerchCFV; bugrEx].HBFVollnt := bugHBFVolInt; bugrtx].HbfVolScrib := bugHBFVolScrib; bugr[x1.HortalityTPA := bugflortalityTPA; bugrtxl.NMcfv := bu thfV° end; {of Store aluesi Procedure_StoreThinValues; {called from Brow} var x: integer; x12 StandA e; tix].Stand e '= StandAge; t[x).Thinne TPA := ThinnedTPA; t[x].ThinnedBA := ThinnedBA; ttx] TPoleCFV := TPoleCFV; t[x] TSawCFV := TSawCFV- tExJ TSmallCFV := TSnaliCFV; t[x] TTotalCFV := TTotalCFV; t[x1.TPoleCords := TPoleCords; t[x].TSawCords := TSawCords; t[x].TMerchCords := THerchCords; t[x1.THerchPoleCFV := THerchPoleCFV; t1x].THerchSawC§v := TherchSawCFV; t[x].TMerchCFV := THerchCFV; tEx].TMBFVolInt := THBFVolInt; t[x].TbeVolScrib := THBFVolScrib; end; {of StoreThinValues} Procedure StoreBugThinValues; {called from Grow} var x: integer; begin x:= StandAge; bugtix].StandAge := StandAge; bugtlx].ThinnedTPA := bu ThinnedTPA; bugtlx].ThinnedBA := bug hinnedBA; bugt[x1.TPoleCFV := ug PoleCFV; bugt[x].TSawCFV := bug SawCFV° bugt[x3.TSmallCFV := bugTSnallCFV; bugt[x1.TTotalCFV := bugTTotalCFV; bugtlx].TPoleCords := bu TPoleCords; bugtli.TSawCords := bug SawCords; bugtix].TMerchCords := bu TherchCords; bugttx].TMerchPoleCFV := u THerchPoleCFV, bugtlx].TMerchSawav := bug herchSawCFV; bugtix].THerchCFV := bugTHerchCFV; bugttx].TMBFVolInt := bu THBFVollnt; bugttx].ThbfVolScrib := ugThBFVolScrib; end; {of StoreBugThinValues} Procedure RunDptions; {called from Brow} e in clgscr; gotoxy(5,6); write(’l. CONTINUE with this projection.'); gotoxy(5,8)' write('2. CHANGE harvest age.'); gotoxy(5,10); write('3. START a thinning treat-ent.'); gotoxy(5,12); write ('4. REPEAT the previous output screen.’); gotoxy(5,14); write(’S. CHANGE the dis lay interval.')- gotoxy(5,16); write(’b. QUIT & Return 0 ain Henu at beginning of RPPEST.‘); gotoxy(l?,29);‘write('Enter your choice of these options. '); ran e := .. rea ln(RDChoice); ase ROChoice of : be in q i BugChoice <> a then begin 130 SetHarvestAge; RunOptions; end; { of if - then } end; be in i (upcase(ThinChoice) and (upcase(ThinChoice) = ’N') then begin ThinningTiming; AThinningType; EditThinningDptions; NextScheduledThin := HinTAge; end' { of if - then} RunDptions; end; 4: begin ii Choicel = 1 then begin Displayl; Curren Display; Waitabit; RunOptions; end' { 01 Ch £1 ghoi§e11= 2 ug 15p a ' BugCurrentDispla ; Waitabit; RunUptions' end; { oi Choice 2 } end; begin SetDisplayInterval; RunDptions; end; 6: StandAge := HarvestAge + 1; end; {of case} end; {of RunOptions} (.44 £78) and (StandAge < HarvestAge) o'ce 1 } hen begin Y UT Procedure ZeroDut; {called from Hainl & Hain2} be in 81 :=0; PoleMin : ); Sawhin i=0; AgeAtEst :=0; StartAge :=0; BA =0; TPA :=0; HarvestAge i=0; Displaylnterval : ' ghiggingTyge i=0; lreesToRemove i=0; BAProToRemove i=0; ax ge := - BAToLeave :éo; HinTAge i=0; MinTBA :=0; Thinninglnterval :=O' NextScheduledThin i=0; BugSl :=0; BugBA :=0; BugTPA :=0; gugHarvestAge := 0; en ; N O " ll Procedure Coannt; be in iscountedValue := DiscountedValue := end; ( of Coannt } 0. value / (EXP((age + 1) 1 ln( 1 + InterestRate))); Procedure CountHortTrees; var x: integer; begin MortalityTreeCount:=0; BugHortalityTreeCount:=0; HortVolSum :=0; BughortVolSum 1:0; for x := 0 to StandAge do begin with rlxl do be in if HortalityT A > 0 then be in HortalityTreeCount := Horta it TreeCount + MortalityTPA; MortVolSum := HortVolSun + NHC V; end; E of if - then } end° of with - do with bugrtx] do begin 131 if HortalityTPA > 0 then begin BugMortalityTreeCount := Bu Hortalit TreeCount + MortalityTPA; Bu HortVolSun := BugMortVol un + NHC V; en ; { oi if - then } end; { of with - do } end; { of {or - do } end; { of CountflortTrees } Procedure InplenentBug; begin case BugChoice of : Brubs' Weevil; Spittlebug; Sawfly; en (of case stnt.) end; {of lnplenentBug} Obi/4N.“ Procedure Hainl; {called from HainHenu} be in LeroDut; Basics; ThinningDptions; Grow; if ROChoice <> 6 then begin VolumeSummary; DisplayVolumeSunnary; Hai ABit; end; { of ii then } end; { of Mainl } Procedure Main2; {called {rom Mainhenu} be in eroDut; BugBasics; lnplementBug; ThinningOptions; BugBrow; if ROChoice <> 6 then begin NPV; VolumeSummary; DisplayVoluneSummary; HaitABit; Dis layBugVolumeSunnary; Wai ABit; DisplayEcon; NaitABit; end; { 01 if then } end; { of Main 2 } Procedure HainHenu; {called {roe nain program} begin repeat Henul; EditMenul; case choicel of 1: Hainl; 2: Main2; 3: begin clrscr; gotoxy(17,10); wrételn( Normal termination of Program RPPest.’); en ; end; until choicel = 3; end; BEGIN storeptr coninptr ' autoupcas Hainhenu; end. : E Conin o{s(C = tru ptr° onln); 9; { i! 13 2 Main Program *1} "11111111111111