Sequential — Original PRCalc algorithm. Greedy largest-to-smallest allocation.
Map Columns to Fields
Select which column maps to each field. Tree ID should be unique within each plot (duplicates are reported). Plot ID and scaling are optional.
Map Species
Map each unique species value in your data to one of the PRCalc species. Codes are read in one convention; names (English, French or Latin) are recognised in any convention.
Your Data
Count
Species
Resolved by
Heights
Product Specifications
#
Species Group
Top DIB(cm)
Log Length(m)
Product Name
Value
Dest.
Color
Sequential — Original PRCalc algorithm. Greedy largest-to-smallest allocation.
Results
Plot
TreeID
Species
DBH
Ht
Vol(m³)
TPH
Product
Ratio%
ProdVol
ProdVol/ha
Logs
Product Breakdown
Size Class Distribution
cm
Stem Profile Viewer
m
Honer (1967), Honer et al. (1983): volume and merchantable volume ratiosKershaw, Richards & Larusic (2006): product ratio allocationLi, Weiskittel & Kershaw (2012): Kozak taper coefficients
PRCalc v.2026.5: Help & Documentation
About PRCalc v.2026.5
PRCalc is a web-based product ratio calculator for northeastern North American tree species. It estimates how much of each tree's stem volume goes to defined timber products (sawlogs, studwood, pulpwood and so on), using the merchantable volume ratio approach of Honer et al. (1983) as implemented by Kershaw, Richards & Larusic (2006), or the Kozak (2004) taper equation with the published Acadian coefficients of Li, Weiskittel & Kershaw (2012).
This version adds to the original PRCalc: a 31-species resolution framework with selectable code conventions, two volume engines with one consistent volume basis per tree, hierarchical data (time, stand, plot, tree), per-hectare scaling for variable-radius, fixed-area and expansion-factor designs, stand statistics with confidence intervals, height estimation from your own measured heights, stand typing with five regional protocols, rotation analysis, interactive SVG charts and Excel input and output.
How It Works
For each tree PRCalc builds one stem model and reads every volume from it: gross total volume, standard merchantable volume, and the volume of each product section. Gross, merchantable and product volumes are therefore always on the same basis.
1. Volume engine (the Volume toggle in the header):
Kozak engine (default). Kozak (2004) Model 02, a variable-exponent taper equation, with the inside-bark coefficients published by Li, Weiskittel & Kershaw (2012, Appendix A):
with z = h/H, p = 1.3/H, X = (1 − z1/3)/(1 − p1/3) and Q = 1 − z1/3; D and d in cm, H and h in m. The planted-stand term is not used (all stands are treated as natural). Coefficients are published for balsam fir, black, red, white and Norway spruce, jack, red and white pine, and northern white-cedar. Volumes are integrated numerically from the taper (better than 0.01% against a fine reference), merchantable heights are found by bisection on the inside-bark taper, and outside-bark gross volume from the paper's Table 2 is reported separately for reference. Species without a usable published inside-bark set (all hardwoods, tamarack, and eastern hemlock, whose published inside-bark parameters are not statistically significant) use the Honer basis under this engine, and the tables show which basis each tree used.
Honer engine. Honer (1967) total volume in the Kershaw metric form
V = a2·D² / (a0 + a1/H)
with species coefficients from Kershaw's Honer tables, including separate sets for cedar, hemlock, balsam poplar, basswood, beech, ironwood, red oak, black cherry and white elm. Species with no published set use the closest group and are marked as substitutes. Merchantable heights and section shares come from the Honer et al. (1983) volume-ratio polynomials (Kershaw et al. 2006, Table 1):
VR(MR) = b0 + b1·MR + b2·MR²
where MR is a height ratio (h/H) or a squared diameter ratio (dib/DBH)² with the b2 breast-height adjustment in metric units.
2. Product allocation: products are placed on the stem from the stump (0.3 m / 1 ft) with a trim allowance (0.1 m / 0.3 ft) on every log, using one of three algorithms (see Allocation Modes). Each product's volume is the stem model's volume between the bottom and top of its logs.
Types of Merchantable Volume
Standard Merchantable Volume: stem volume from the stump to the standard utilization limit, 10 cm DIB (metric) or 4″ DIB (imperial), from the tree's own stem model. It is reported in volume-only mode and as a reference (“Std Merch”) in product mode.
Product Merchantable Volume: the sum of the volumes allocated to your product specifications.
Volume partition: gross volume is split into products + product gaps + sub-merchantable, and the three parts add up to gross exactly. The merchantable reference for each tree is its smallest product top DIB or the 10 cm / 4″ standard, whichever is smaller. Product Gaps are wood above that reference that no product takes (log-length leftovers and sections no product fits). Sub-merchantable is the stump and the top above the reference.
Utilization Efficiency: product volume as a percentage of merchantable volume to the smallest product top. Low values show where shorter logs or smaller tops would recover more wood.
Allocation Modes
Sequential: Kershaw et al. (2006). Products are taken from the largest to the smallest top DIB, bottom up, as many full logs as fit below each product's merchantable height.
Sacrifice: starts from Sequential and tests giving up one log of a multi-log product (each such product in turn) so the smaller products can use the space, keeping the variant with the most volume (or value when prices are set).
Optimized: an exact dynamic program over cut positions, after the log-bucking literature (Pnevmaticos & Mann 1972; Faaland & Briggs 1984; Grondin 1998). Every sequence of full logs and whole-tree pieces from the stump up is considered with exact log and trim lengths. With prices it maximizes value; without prices it maximizes volume. Among solutions with the same value and volume it keeps the most volume in the larger-top products, the same priority Sequential uses. The result is never worse than Sequential, and products may be placed in any order on the stem.
Input Modes
Manual Entry: add trees directly (species, DBH, height). Good for single trees and classroom demonstrations.
Import Data Table: .xlsx, .xls, .csv, .tsv or .txt. Delimited text supports quoted fields; decimal commas are converted in semicolon- or tab-separated files and reported. Columns are auto-detected and you confirm the mapping.
Sample Datasets
Manual Entry: 16 mixed softwood and hardwood trees with measured DBH and height, plus species-grouped products with prices and mill destinations.
Forest Inventory: 2 NB stands (408 and 412), 3 plots, 40 trees of 6 species (JP, BS, BF, WB, QA, RM) in FVS codes. 26 trees have measured heights; the 14 missing heights (6 balsam fir, 5 jack pine, 3 red maple) are estimated from species-level fits. Raw prism tally: BAF 2 variable-radius scaling is pre-selected.
Stand Forecast: the same stands projected by the Open Stand Model over 10 periods (2018 to 2108). Each input tree can have several growth-path rows, each carrying its share of the stems per hectare; every row is a tree occurrence and is counted. Expansion-factor scaling is pre-selected.
Product Specifications
Each product needs a top DIB, a log length (0 for a whole-tree piece to that top) and a name. Optional: species group, price, destination and colour. Load / Save stores specifications as JSON; loading into a table that has products offers Replace, Merge or Update, converts DIB, length and price between unit systems, and migrates old species codes. Files from before v.2026.5 with imperial $/MBF prices load with the price cleared, because board-foot prices are no longer supported.
Data Hierarchy
Time / Period → Stand → Plot → Tree → Product
Tree only: per-tree volumes and ratios.
+ Plot ID + scaling: per-hectare (per-acre) values and plot summaries. Plots are identified within their stand, so plot 1 of stand A and plot 1 of stand B are different plots.
+ Stand ID: stand means ± 95% CI over the stand's plots. A plot that appears in the data with no trees (a row with the plot and stand but no tree) counts as a zero plot, and so does a plot with no trees in a period. A plot you exclude in the outlier review is removed from the stand's sample in every period, so n drops by one; it is never counted as a zero plot.
+ Time / Period: time series, period slider and rotation analysis. A stand with no rows in a period is treated as not measured (missing), not as zero.
Trees that match no product specification still count in basal area, density and gross volume; they simply have no product volume.
Species
All species map to 31 codes, which drive volume, taper, typing and height estimation.
Softwoods (12): Balsam Fir (bF), Red Spruce (rS), Black Spruce (bS), White Spruce (wS), Red Pine (rP), White Pine (wP), Jack Pine (jP), Eastern Hemlock (eH), Eastern Cedar (eC), Tamarack/Larch (tL), Norway Spruce (nS), Other Softwood (oSW).
Hardwoods (19): Sugar Maple (sM), Red Maple (rM), Yellow Birch (yB), White Birch (wB), American Beech (bE), Red Oak (rO), White Ash (wA), Black Ash (bA), Trembling Aspen (tA), Largetooth Aspen (lA), Balsam Poplar (bP), Pin Cherry (pC), Ironwood (iW), Butternut (bW), Basswood (bH), Gray Birch (gB), Black Cherry (bC), White Elm (wE), Other Hardwood (oHW).
Code conventions: species codes mean different things in different systems (for example TA is tamarack in FVS but trembling aspen in NB DNRED codes, and BA is black ash in FVS but basswood in NB). The species step picks the convention that recognises the most codes in your data (FVS/OSM Acadian, NB DNRED, Québec MFFP, or PRCalc's own codes such as bF and bH, matched with their exact case) and lets you change it. NB group, genus and dead-tree codes (SP, BI, PO, MA, PI, DF ...) are recognised but you choose the species. English, French and Latin names are matched as a shared fallback. Values that cannot be resolved are highlighted and must be mapped before you continue; nothing is assigned silently.
Height Estimation
PRCalc fits one set of height models per dataset from your measured heights: five forms (Curtis 1967, Näslund, Wykoff 1982, Weibull and a power model) at the species level, then the softwood/hardwood group, then all species, each tier needing at least 5 measured heights. Implausible heights and trees you exclude are left out of the fits. A fit is offered only if its heights never fall with DBH over the trees it will be applied to and rise by at least 0.1 m (0.1 ft) across the DBH range of the measured trees, so a line that is flat across the data is rejected. The lowest-RMSE fit is preselected; you can choose another, and fits with R² below 0.5 are marked as weak. The same models produce the estimates of missing heights, the H–D review and the Stem Profile height tools.
H–D review: measured heights that differ from their model by more than 60% are listed in the height step before any estimate is made (the step appears whenever heights are missing or a height needs review). Excluding a tree removes it from the height fits and from the results, and the models refit at once. The same decisions appear in the outlier review on the results page, and a change there refits the models and the estimates on the next calculation. Estimates are kept beside your data; the imported values are never changed.
A species with no usable fit at any tier has no height model, and its trees without heights are excluded with a message.
Prices and Unit Conversions
Prices convert to $ per m³ (metric) or $ per ft³ (imperial) of solid wood: $/m³ or $/ft³ directly; $/cord using 2.55 m³ (90.1 ft³) of solid wood per cord; $/GMT or $/ton using green wood density (average of the product's species). Board-foot prices ($/MBF) are not offered because converting them needs a log rule applied to each log. A per-ton price on a product none of whose species has a density is refused with a message.
Green wood density (kg/m³): specific gravity on a green-volume basis × (1 + average wood moisture content as a fraction of oven-dry weight), both from Miles & Smith (2009) Table 1A. Norway spruce and pin cherry use their genus averages and the two Other classes the softwood or hardwood averages (Table 4).
Softwoods: bF 723 · bS 562 · rS 544 · wS 562 · jP 800 · rP 672 · wP 561 · eH 802 · eC 577 · tL 755 · nS 572 · oSW 713 Hardwoods: sM 879 · rM 804 · yB 946 · wB 835 · bE 868 · rO 1025 · wA 803 · bA 833 · tA 802 · lA 688 · bP 642 · pC 719 · iW 964 · bW 738 · bH 656 · gB 738 · bC 719 · wE 892 · oHW 910
Units: switching metric/imperial converts the values you entered (BAF, plot size, product DIB, length and price) and recalculates. Imported DBH and height are read in the units you choose, so after importing data the switch asks before re-reading them.
Output Tabs
Tree-Level, Charts and Stem Profile work in both manual entry and import modes. Plot-Level, Stand-Level and Time Series need imported data with the grouping fields and scaling described under Data Hierarchy. Views follow the stand selector and, with time data, the period slider.
Tree-Level: one row per tree per product, with grouping fields, tree attributes, product ratios, volumes and log counts. Ht Src shows how each height was obtained (measured or the fitted model tier) and Basis shows the coefficient set behind the tree's volumes. With the Kozak engine a Gross OB column shows outside-bark gross volume where Li et al. (2012) publish it.
Plot-Level: per-plot basal area, density, QMD, Lorey height, gross and merchantable volume, and the product breakdown (volume and logs per unit area, % of merchantable). Needs Plot ID and a scaling method.
Stand-Level: mean ± 95% CI over the stand's plots (Student t). QMD and Lorey height are pooled ratio estimates, so they agree with the stand basal area and density. Needs Plot ID, Stand ID and a scaling method.
Charts: interactive SVG views, all on the same per-unit-area denominator (the stand's plot set):
Product breakdown (ratio, volume or value) and species composition.
Size-class histograms (DBH and height frequency, BA-weighted DBH) with bin width, gap collapsing and, with time data, a Lock range toggle that keeps the classes fixed across periods.
Plot comparison with a mean line, a sort toggle and a Lock range toggle.
Value bars (when prices are set) and a destination chart (when any product has a destination; products without one are “Unassigned”).
An Unutilized option adds Product Gaps and Sub-merchantable volume (see Types of Merchantable Volume).
Time Series: stand means by period for eight metrics: product merchantable volume, species total volume, species merchantable volume, species basal area, species density, Lorey height, top height (H100: mean height of the 100 largest-diameter stems per hectare) and species composition (% of basal area). The volume metrics can show the same Product Gaps and Sub-merchantable bands as the Charts tab. A Reineke self-thinning reference (TPH ∝ Dq−1.605, Reineke 1933), anchored at the first period, is drawn on the density chart against each period's quadratic mean diameter when density falls over the record.
Rotation analysis: PAI (between periods) and MAI (stock ÷ age) with the culmination of MAI (CMAI). Stand age comes only from Age-mode periods, a stand age you enter, or an establishment year; PRCalc does not estimate age from tree sizes. Period values that look like an index (1, 2, 3 ...) are not read as ages. With prices, a discounted gross revenue curve P·V(t)/((1+r)t − 1) is drawn; harvest, haul and regeneration costs are not included, so it is not a land expectation value. Optima at the first or last period are flagged as lying at the edge of the data. An optional ± age band shows how CMAI and the revenue peak move with age error.
Stem Profile: an SVG taper diagram of the selected tree from its own stem model:
Inside-bark outline (with the outside-bark outline dashed where published), product zones and log breaks from the same allocation as the tables, stump and breast-height lines, and neiloid / paraboloid / cone form zones.
Tree picker, stepper buttons and a filter (species, plot, stand, product). The chosen tree is followed across periods by stand, plot and tree ID; when it is absent in a period the view says so.
Scale modes: Fit, Relative (the tree's largest size across periods, or the tallest tree without time data) and Fixed (a reference height you set).
Exploratory ± buttons change the tree's height by 1 m (or ft) per click and scale DBH using the local height-diameter elasticity of the fitted height model. They need a fitted model (at least 5 measured heights at the species, group or all-species level).
A product allocation table, and a DBH-class table that sweeps tree size, with heights from the fitted height model scaled to pass through the selected tree, and runs the current allocation mode at each size.
Excel Export: Tree-, Plot- and Stand-Level sheets for every period (with a Time column), product columns for every stand, the volume basis, outside-bark gross where available, the volume partition (products, gaps, sub-merchantable), stand types when typing is on, the Species Map, and an Exclusions sheet listing every tree and plot left out of the results and why. Headers carry unit suffixes. With destinations, each product has a _Dest column.
Interface Features
Light / Dark Mode: the moon and sun buttons in the header switch between dark and light mode. PRCalc starts in light mode when your system is set to light, otherwise dark. Charts, tables and stem profiles redraw in the chosen colours.
Original Species Codes: the checkbox below the tab bar switches all displays between PRCalc’s mapped 2-letter codes and the original species values from your input data. This affects the tree table, charts, time series, stem profile picker, stem filter, and all labels. Useful when your data uses codes from a different system (e.g., OSM Acadian, FVS-NE, USDA PLANTS).
SVG Charts: all charts render as resolution-independent SVGs rather than canvas bitmaps. Screenshots and exports will be sharp at any zoom level or display density.
Suggested Citation
Kershaw, J. A., Ogilvie, J., & Claude (Anthropic). (2026). PRCalc: A product ratio calculator for northeastern tree species (Version 2026.5) [Web application]. University of New Brunswick, Faculty of Forestry and Environmental Management. https://prcalc.ext.unb.ca
References
Curtis, R.O. 1967. Height-diameter and height-diameter-age equations for second-growth Douglas-fir. Forest Science 13(4): 365–375. doi:10.1093/forestscience/13.4.365
Faaland, B. & Briggs, D. 1984. Log bucking and lumber manufacturing using dynamic programming. Management Science 30(2): 245–257. doi:10.1287/mnsc.30.2.245
Grondin, F. 1998. Improvements of the dynamic programming algorithm for tree bucking. Wood and Fiber Science 30(1): 91–104.
Honer, T.G. 1967. Standard volume tables and merchantable conversion factors for the commercial tree species of central and eastern Canada. Can. Dept. Forestry Rural Devel., For. Mgmt. Res. and Serv. Inst. Info. Rep. FMR-X-5.
Honer, T.G., Ker, M.F. & Alemdag, I.S. 1983. Metric timber tables for the commercial tree species of central and eastern Canada. Can. For. Serv., Maritimes For. Res. Centre. Info. Rep. M-X-140. 139 p.
Husch, B., Beers, T.W. & Kershaw, J.A., Jr. 2003. Forest Mensuration. 4th Edition. Wiley. 443 p.
Kershaw, J.A., Jr., Richards, E. & Larusic, J. 2006. A product ratio calculator for northeastern tree species. Northern Journal of Applied Forestry 23(1): 45–48. PDF
Kershaw, J.A., Jr., Ducey, M.J., Beers, T.W. & Husch, B. 2016. Forest Mensuration. 5th Edition. Wiley. 630 p.
Kozak, A. 2004. My last words on taper equations. The Forestry Chronicle 80(4): 507–515. doi:10.5558/tfc80507-4
Labelle, E.R. et al. 2025. An open-source tree bucking optimizer based on dynamic programming. Forests 16(5): 780. doi:10.3390/f16050780
Li, R., Weiskittel, A.R. & Kershaw, J.A., Jr. 2012. Regional stem taper equations for eleven conifer species in the Acadian Region of North America: development and assessment. Northern Journal of Applied Forestry 29(1): 5–14. doi:10.5849/njaf.10-037
Näslund, M. 1936. Skogsförsöksanstaltens gallringsförsök i tallskog. Meddelanden från Statens Skogsförsöksanstalt 29(1).
Pnevmaticos, S.M. & Mann, S.H. 1972. Dynamic programming in tree bucking. Forest Products Journal 22(8): 26–30.
Reineke, L.H. 1933. Perfecting a stand-density index for even-aged forests. Journal of Agricultural Research 46: 627–638.
Wykoff, W.R., Crookston, N.L. & Stage, A.R. 1982. User’s guide to the Stand Prognosis Model. USDA Forest Service General Technical Report INT-133.
MacPhee, C., Kershaw, J.A., Weiskittel, A.R., Golding, J. & Lavigne, M.B. 2018. Comparison of approaches for estimating individual tree height–diameter relationships in the Acadian forest region. Forestry 91(1): 132–146. doi:10.1093/forestry/cpx039
Miles, P.D. & Smith, W.B. 2009. Specific gravity and other properties of wood and bark for 156 tree species found in North America. USDA Forest Service, Northern Research Station, Research Note NRS-38.
Product ratios come from regional volume, volume-ratio and taper equations. Validate them against local stem analysis or scale data before operational use.
The Honer (1967) and Honer et al. (1983) equations were developed from natural stands in central and eastern Canada; the Li et al. (2012) taper coefficients from conifer stem data in the Acadian Region. Neither has been validated for plantations or other regions, and PRCalc treats every stand as natural.
Under the Kozak engine, hardwoods, tamarack and eastern hemlock use the Honer basis because no usable inside-bark taper is published for them. Comparisons between engines for those species show no difference by design.
Species without their own Honer coefficients use a substitute set (marked in the Basis column), so their volumes carry extra uncertainty.
Stand-level confidence intervals assume plots are a simple random sample within each stand.
Estimated heights come from models fitted to your own measured heights. Review the fit statistics before accepting them; estimates far outside the measured DBH range are extrapolations. The same caution applies to the DBH-class table and the exploratory height buttons on the Stem Profile tab.
Discounted gross revenue ignores all costs and is not a land expectation value.
This tool is provided for educational and planning purposes.
Acknowledgments
The original PRCalc was developed by Dr. John A. Kershaw, Jr. (University of New Brunswick) with Dr. Evelyn Richards and John Larusic. PRCalc v.2026 was created by Jae Ogilvie (University of New Brunswick) with assistance from Claude (Anthropic). This version extends the original with Excel I/O, hierarchical data support (time, stand, plot), multi-metric time series views, interactive SVG visualizations, stem profile exploration tools, DBH class ratio tables, stand typing with regional classification protocols (NB ERD, NS FEC, Ontario PFT, SAF/FIA), species-cued colour palettes, and optimization modes adapted from the log bucking dynamic programming literature.
Re-shows dismissed hint cards on all steps
Version & Changelog
PRCalc v.2026.5
Audit fixes: one volume basis per tree, published coefficients, exact allocation · October 2026
Volume engines: each tree's gross, merchantable and product volumes now come from one stem model. Kozak uses the published Li, Weiskittel & Kershaw (2012) inside-bark coefficients (outside-bark gross shown separately); Honer uses species Honer (1967) coefficients with the Honer et al. (1983) ratios. The mixed “full Kozak” option is removed. The tables show each tree's basis.
Allocation: Remainder mode removed. Optimized is now an exact dynamic program over cut positions (never worse than Sequential). Product volumes are read from the stem model, so products, gaps and sub-merchantable add up to gross volume in every view and in the export.
Heights: the regional Rijal et al. (2012) fallback is removed; heights come only from models fitted to your data, which must rise with DBH. Imported heights are no longer overwritten, and the height outlier check runs.
Aggregation: plots are identified within their stand; plots with no trees count as zero plots; growth-path rows are counted as separate tree occurrences; pooled QMD and Lorey height; H100 per 100 stems/ha. One shared accumulator feeds the plot table, stand table, charts and time series.
Time series: stand age is no longer estimated from tree sizes. Reineke's reference is drawn against QMD. The LEV curve is relabelled discounted gross revenue, with edge-of-data flags.
Species: code conventions (FVS/OSM, NB DNRED from the official inventory data dictionary, Québec MFFP, PRCalc's own codes) with automatic detection; unmapped codes must be resolved; balsam poplar, black cherry and white elm added (31 species), so the published Honer sets for cherry and elm are used.
Prices and units: imperial prices in $/ft³, $/cord or $/ton ($/MBF removed); the units switch converts entered values and recalculates.
Import and export: CSV/TSV/TXT import with quoted fields; Excel export of every period with stand-qualified plots and the volume basis; product files record engine and mode.
Typing: rule parser with validation. The NB protocol is renamed NB Forest Units (FUNA, partial): its unit names match the NB DNRED data dictionary, but its rules match no single dated version, so FPHW, DFDS and the unreachable units are flagged, not changed. SAF/FIA forest-type groups checked against the Forest Service list and regrouped to FIA membership: basswood, white ash and black cherry now count toward Maple/Beech/Birch (800), and Elm/Ash/Cottonwood (700) is black ash and white elm; the invalid white ash result code is gone.
Height models and review: one set of height models per dataset serves the estimates, the H–D review and the Stem Profile tools, with your model choices carried through. Measured heights that disagree with their model are reviewed in the height step before estimates are made, and any exclusion refits the models. Flat fits are rejected.
Green wood densities: rebuilt for all 31 species from one source, Miles & Smith (2009), as green specific gravity × (1 + average moisture content). The previous values could not be traced to their cited sources; several softwoods were 20 to 35% too high (black spruce 870, now 562), which overstated per-ton prices converted to volume.
Plot exclusion: a plot flagged for basal area can be excluded in the outlier review; it leaves its stand's sample in every period. Exclusions are listed in the run message and a new Exclusions sheet in the export.
Earlier versions
PRCalc v.2026.4
Canonical 28-species resolution — April 2026
Even-aged detection for age estimation — Before estimating stand age from tree sizes, the tool now assesses whether the stand’s diameter distribution is consistent with even-aged structure. The TPH-weighted coefficient of variation (CV) of DBH at the first period is computed: CV ≤ 35% is classified as even-aged and proceeds with BA-weighted DBH age estimation; CV > 45%, or CV > 35% with a diameter range ratio exceeding 3×, is classified as uneven-aged and has age estimation suppressed. Uneven-aged stands show an amber “uneven-aged — age estimation suppressed” note in the Time axis bar. The user can still override with a known age. This prevents misleading age estimates for multi-cohort stands where the BA-weighted mean DBH reflects a mix of age classes rather than a single establishment event.
Stand selector iOS fix — Replaced the <input list="datalist"> stand selector with a <select> element. iOS Safari’s <datalist> support is unreliable and was only displaying the current stand value. The <select> element works correctly across all platforms.
Sample data from Open Stand Model — Forest Inventory (sample 2) and Stand Forecast (sample 3) now use real NB forest data. Sample 2: 2 stands, 3 survey plots, 40 trees across 6 species (JP, BS, BF, WB, QA, RM) with partial height subsample (26/40 measured). Sample 3: same stands forecast through 10 periods (2018–2108) using the Open Stand Model, with multiple growth paths per tree carrying per-path stem expansion factors. Replaces the previous synthetic Chapman–Richards growth data.
Validation and Kershaw samples removed — The 46-tree validation dataset (Honer 1983, Kershaw 2006, Li 2012, NHRI 2018 plots with expected volumes), the 21-tree manual-entry validation sample, and the Kershaw 2006 product specs loader have been removed. These were calibrated against the old (incorrect) Honer equation and are no longer needed.
28-species canonical resolution — All input species now resolve to one of 28 typing species at the first step. PRCalc’s 14 Honer volume groups and the 27 Kozak taper species are both derived downstream from this single canonical mapping. This replaces the previous architecture where PRCalc 14 was the primary resolution target and finer species detail was only available when a typing protocol was active. The unified dropdown always shows 28 species (grouped SW/HW) with the PRCalc volume group displayed as a read-only derived indicator.
Species-specific Rijal H–D coefficients — Regional height-diameter defaults now use species-specific Chapman–Richards coefficients from Rijal, Weiskittel & Kershaw (2012) for all 15 published Acadian species. Previously, species like red maple, American beech, red oak, eastern hemlock, and gray birch were collapsed to the “Other Hardwood” or “Other Conifer” group defaults. Now each has its own published H–D curve: e.g., red maple (c0=15.04) vs. sugar maple (c0=9.02) produce substantially different height predictions at the same diameter.
Species-specific green wood densities — Green wood density values for all 28 species now sourced from the USDA Forest Products Laboratory Wood Handbook (FPL GTR-282) Table 4-1 and Miles & Smith (2009). Used for $/GMT price conversions. Notable corrections from previous grouped values: red maple 845 (was 920), red oak 1010 (was 920), eastern hemlock 830 (was 720), butternut 775 (was 920), basswood 750 (was 920).
Product species groups at 28-species resolution — Product specification species groups now use the 28 typing species codes. Saved product spec JSON files using old PRCalc 14 codes are automatically expanded on import (e.g., OH → sM, rM, bE, rO, wA, bA, pC, iW, bW, bH, oHW). Default product specs updated accordingly.
Unified species mapping — The Map Species step always shows the 28-species dropdown regardless of whether a typing protocol is active. The previous dual-mode UI (14 species in standard mode, 28 in typing mode) is replaced by a single unified interface. Stand typing uses the mapped species directly without a separate resolution step.
Height estimation species resolution — The height estimation system now resolves to the 28 typing species when “Mapped species” is selected, enabling species-level H–D model fitting at finer resolution than the previous PRCalc 14 grouping.
Kozak taper species stored on tree records — Each tree result record now carries a kzSp field (Kozak species code) set during calculation. Stem profile, ratio tables, and the merchantable volume engine use this stored field directly rather than re-resolving at render time.
Excel export columns — Tree-Level sheet now includes Species (28-code), PRCalcSpecies (derived), and KozakSpecies (derived) columns. Species Map sheet enhanced with PRCalcGroup and KozakSpecies columns.
Species colour palette extended — All 28 species have distinct colours with SW/HW family grouping and PRCalc-group fallback for charts, stem profiles, and all visualizations.
Kozak Model 02 taper engine — Variable-exponent taper equation (Kozak 2004) with FIA-refitted species-specific coefficients from Li & Weiskittel (2010), Li, Weiskittel & Kershaw (2012), and Smith’s inventoryfunctions R package. Computes total stem volume via 100-section Smalian integration (stump to tip, outside bark). Species-specific DOB→DIB bark conversion using power equations or percentage deduction. Provides coefficients for 20+ northeastern species including red maple, sugar maple, red oak, white ash, eastern hemlock, tamarack, and northern white cedar — species that the Honer engine groups into “Other Hardwood” or “Other Conifer.”
Volume engine selector — Header toolbar toggle switches between three engines: Kozak (default) uses Kozak taper for gross volume and stem profile while retaining VR polynomials for product allocation; Kozak (Full) uses Kozak taper for everything including product allocation — merchantable heights found by bisection on the taper curve, product volumes via Smalian integration, no VR polynomials; Honer uses the Kershaw et al. (2006) metric form of Honer et al. (1967) with VR product allocation. Switching engines triggers a full recalculation.
Kozak-full product allocation — Experimental mode where merchantable heights are computed by bisecting the Kozak taper curve to find where stem diameter equals the product’s minimum DIB. Product volumes are computed as Smalian-integrated taper sections between log boundaries, eliminating the VR polynomial indirection entirely. All four allocation modes (Sequential, Remainder, Sacrifice, Optimized DP) are fully reimplemented against the Kozak primitives. Product volumes are physically consistent with the taper curve — what you see in the stem profile is what you get in the ratio table.
Anatomical stem profiles — When the Kozak engine is active, the stem profile viewer draws the actual taper equation curve rather than inverting VR polynomials. Eliminates the linear-cone tip approximation above 70% height and the synthetic butt swell below stump. The profile now reflects species-specific stem form (e.g. the pronounced butt flare of tamarack vs. the cylindrical bole of red pine).
Species resolution for taper — Automatic resolution of raw input species codes (FVS, OSM Acadian, FIA numeric, USDA PLANTS, NB French) to the best available Kozak coefficient set. Falls back gracefully through alias mapping and PRCalc species groups when exact matches are unavailable.
v.2026.4, continued: Stand typing and species visualization release (April 2026)
Stand typing engine — Classifies plots and stands into forest types based on basal area composition using configurable rule-based protocols. Results appear as type badges throughout outputs (stand-level, plot-level, charts, time series) with tooltips showing code, label, SW/HW percentages, matched branch, and rule. Typing runs per stand, per plot, and per time period — scrubbing through periods shows successional type transitions.
Five built-in protocols:
Simple SW/MW/HW (default) — three-class with 75% BA threshold
NB ERD 2008 Forest Unit — 44 types across SW/HW/MW branches with species-specific rules (New Brunswick)
NS FEC Forest Groups (2010) — 6 major groups: Wet Coniferous, Spruce–Pine, Spruce–Hemlock, Mixedwood, Tolerant Hardwood, Intolerant Hardwood (Nova Scotia)
SAF/FIA Forest Type Groups (NE) — northeastern US forest-type groups approximated from BA% (USDA FIA)
Protocol editor — slide-in panel for creating and editing custom typing protocols. Full CRUD for protocol metadata, species groups, branches (with conditions), and rules (with test expressions). Up/down reordering, add/remove at all levels. Built-in protocols are cloned when edited (originals protected). Export/import as JSON.
Single-column species mapping — the Map Species step uses 28 finer-grained species (grouped by SW/HW in the dropdown). PRCalc volume species is auto-derived and shown as a read-only indicator. User maps once; typing, volume, and taper calculations are all served from the same mapping.
Expanded species auto-detection — ~200+ direct code mappings (NB PSP, OSM Acadian, FVS-NE, FIA numeric, USDA PLANTS, Quebec/French) and ~90+ keyword name matches (English, French, Latin genus). 7-strategy resolution function with smart disambiguation for PRCalc’s ambiguous OC/OH codes.
Species-cued colour palette — species with colour names get hues echoing their name: Red Spruce → brick red, Yellow Birch → orange-amber, Black Spruce → steel blue-grey, White Spruce → cool blue, Balsam Fir → forest green. All co-occurring pairs have sufficient contrast. Applies to species composition donut, size class distribution, plot volume chart, and time series stacked area.
Species Composition chart — now available in the Charts tab alongside Product Breakdown (selectable via a mode toggle dropdown). Donut chart with basal area, stem count, gross volume, or merch volume sub-metrics. When typing is active: inner SW/HW ring, SW/HW percentage in center text, species slices grouped by SW then HW under the ring. Unutilized toggle adds SW/HW-split sub-merchantable slices for volume metrics. Full hover tooltips matching product donut pattern.
Time series typing overlay — on the Species Composition (% BA) chart, a dashed SW% trend line with dots tracks the softwood percentage across periods, with a horizontal threshold line at the protocol’s SW cutoff (70% or 75%). Shows when a stand crosses the typing boundary. TYPE dashboard chip updates as you scrub periods.
SW/HW indicators — green/gold colour dots next to each species in the Map Species table, matching the product specs pattern. Updates live on dropdown change.
Iterative workflow — after computing results, clicking back to earlier steps (Products, Map Species) marks results as stale. Clicking the Results heading in the stepper bar triggers a full recompute with updated parameters. All steps remain clickable once results have been computed.
Stand typing in Excel export — Plot-Level and Stand-Level sheets include StandType, StandTypeLabel, SW_pct, and HW_pct columns when a typing protocol is active. Plot-Level sheet also gains StandID column.
Sample data from real NB inventory — Forest Inventory and Stand Forecast datasets replaced with real NB stand data (stands 408 and 412) from PSP surveys. Stand Forecast uses Open Stand Model projections with per-growth-path stem expansion factors across 10 forecast periods (2018–2108). Auto-detect keywords updated: surveyid/survey for plot mapping, stems for expansion factors, forecastyear for time axis.
Stand ID = 0 fix — fixed 12 locations where JavaScript’s falsy value || ‘fallback’ silently replaced stand/plot/time IDs of 0 with fallback values.
Product gating — Product Breakdown option hidden from the mode toggle when no product specs are loaded. Size class “by Product” modes, plot chart product modes, and time series product options similarly gated.
Honer volume equation fix — Corrected the Kershaw metric form of Honer’s (1967) total volume equation. The correct form is V = a₂D²/(a₀ + a₁/H), a direct algebraic conversion of the original imperial equation V = D²/(b₁ + b₂/H). The previous implementation used an incorrect additive form with a fabricated 10⁻⁴ scaling factor. The form-factor ceiling (min(Honer, cone ff=0.42)) has been removed — it was compensating for the wrong equation producing inflated small-tree volumes. The corrected equation produces volumes consistent with Kershaw’s published UNB tables and with measured Smalian volumes from stem analysis data.
Outlier detection — Two-phase system with chart clamping: (1) automatic exclusion of implausible values (negative dimensions, DBH >120 cm, height >45 m, volume >8 m³/tree, TPH extremes), (2) statistical flagging for user review (H–D consistency >60% deviation from fitted species model, per-plot BA/ha >80 m²/ha). Time series chart clamping triggers when any period’s total exceeds 2.5× the median (amber arrow indicators with true values). Review panel with per-tree Keep/Exclude toggles and bulk actions; user decisions preserved across recomputes.
Stand selector — Multi-stand datasets show a stand selector dropdown in the results control bar. Selecting a stand filters all charts, summaries, and time series to that stand’s plots.
Protocol viewer — Read-only structured view of any typing protocol (built-in, imported, or custom). Shows header, source reference citation, species groups with hover tooltips, and decision tree with branches and numbered rules. Source references added to all four regional protocols (NB ERD, NS FEC, Ontario PFT, SAF/FIA).
Even-aged detection gating — Age estimation from tree sizes is now gated on the stand’s diameter distribution. The tool computes the TPH-weighted CV of DBH at the first period: CV ≤ 35% → even-aged (estimation proceeds); CV > 45%, or CV > 35% with diameter range ratio > 3× → uneven-aged (estimation suppressed). The Time axis bar shows an amber “uneven-aged — age estimation suppressed” note for affected stands; MAI, CMAI, and LEV fall back to PAI-only mode. Users can override with a known age at any time. Thresholds calibrated against Acadian forest conditions (plantation CV ~15%, tolerant hardwood CV ~45–70%).
Engine consolidation 4 → 3 — Removed the capped Honer engine (min of Honer and cone ff=0.42). The form-factor ceiling was compensating for the old wrong equation; with the corrected Honer formula it is no longer needed. The volume engine toggle now shows three options: Kozak, Kozak (Full), and Honer.
Stand selector fix — Replaced the <input list="datalist"> stand selector with a standard <select> element. iOS Safari’s <datalist> rendering was unreliable, often showing only the current value in the native picker overlay. The <select> works consistently across all platforms.
Sample data restructuring (later replaced in this release by the Open Stand Model samples above) — Stand Forecast sample (sample 3) rebuilt with biologically credible NB dynamics. S1: managed BS plantation (BAF-2 prism, 3 plots, 7 periods; ~1700 → 350 SPH, Kozak vol 166 → 182 m³/ha). S2: uneven-aged tolerant hardwood (400 m² fixed area, 3 plots, 7 periods; SM/YB/RS mix, Kozak vol 112 → 211 m³/ha). Columns reordered to StandID, ForecastYear, StandAge, PlotID, TreeID, Species, DBH_cm, Height_m, TPH. Auto-detect keywords forecastyear and standage added to the time field mapping.
Validation and Kershaw samples removed — Removed the 46-tree validation dataset (5 plots from Honer 1983, Kershaw 2006, Li 2012, NHRI 2018, and boundary cases), the 21-tree manual validation sample, and the Kershaw 2006 product specs loader. These were tied to the old wrong Honer equation and are no longer needed for cross-checking.
PRCalc v.2026.1
Rotation analysis release — April 2026
Rotation analysis — Stand-specific time-series analysis panel showing PAI (Periodic Annual Increment, the average annual growth between measurement periods, plotted at interval midpoints) and MAI (Mean Annual Increment, Y(t)/t, plotted at each sample age). The age at which MAI culminates is labeled CMAI — for merchantable and product volume this is the biological rotation age; for total volume, basal area, and value it is labeled simply “CMAI” (mathematically valid but not a harvest prescription). Mathematically, CMAI occurs where the PAI curve crosses MAI from above. Supports five stock metrics: merchantable volume, total volume, basal area, stand value ($), and individual product volume.
Age sensitivity exploration — The ± Age slider in the Time axis bar lets you explore how age uncertainty propagates through rotation decisions and site classification. In practice, foresters reduce age uncertainty through increment coring rather than computing sensitivity bands — this feature is provided for educational exploration, not prescription-grade analysis.
MAI band (amber) — envelope of MAI curves recomputed at each age offset. Shows how cumulative yield per year changes with age assumptions.
LEV band (purple) — envelope of LEV curves at each offset. LEV is exponentially sensitive to age through the discount denominator (1+r)t−1.
CMAI range (red segment on PAI line) — the portion of the PAI curve where it passes through the MAI band, containing the first downward PAI×MAI crossing. Entry/exit markers show the age range within which the biological rotation could fall.
Financial rotation path (teal polyline) — each age offset produces a different LEV curve with its own peak. The path connects these peaks at 1-year offset resolution, showing how the optimal financial rotation migrates. Points on this path do not lie on the central LEV curve — each sits on its own offset curve.
SI range (orange segment on H100 line) — site index is H100 interpolated at a reference age. Shifting the age axis slides where SI is read on the H100 curve. The highlighted segment and label range show the possible SI values.
Defaults: 0 yr for axis-provided ages, 5 yr for estimated ages, 2 yr for manually entered ages. All sensitivity elements are suppressed when the slider is at 0.
Per-stand age handling — Rotation analysis is per-stand by definition (MAI = stock ÷ age). When a stand is selected and the time axis is Year or Unknown, the tool first assesses whether the stand’s diameter distribution is consistent with even-aged structure using the TPH-weighted coefficient of variation (CV) of DBH at the first period. If even-aged (CV ≤ 35%, or CV ≤ 45% with diameter range ratio ≤ 3×), the tool estimates stand age from BA-weighted mean DBH and species-specific growth rates (±30% band). If uneven-aged (CV > 45%, or CV > 35% with range > 3×), age estimation is suppressed and the Time axis bar shows an amber “uneven-aged — age estimation suppressed” note. Rotation analysis falls back to PAI-only mode — MAI, CMAI, and LEV are withheld rather than fabricated from a meaningless age estimate. Users can override by entering a known stand age in the Time axis bar, which re-enables full rotation analysis regardless of the evenness assessment.
Faustmann financial rotation — On the Value metric, a land expectation value (LEV) curve is plotted on a secondary axis with a user-adjustable discount rate (1–10%, adjustable via slider or −/+ step buttons in 0.5% increments). The LEV curve is drawn as a smooth line using monotone cubic interpolation of the stock values at 1-year resolution, so the curve peaks exactly where the Faustmann formula says it peaks — not at a sample vertex. The financial rotation age (LEV maximum) is marked with a dashed vertical line. Teaches the divergence between biological and economic optimality: higher discount rates push the financial rotation earlier.
Age-axis inference — Time-series periods are automatically classified as stand age, calendar year, or arbitrary index. Users can override with a segmented control and provide a base year or age offset. For even-aged stands, a BA-weighted DBH-based estimator suggests a plausible stand age with a ±30% confidence band; for uneven-aged stands (detected via diameter CV), age estimation is suppressed. All rotation metrics respect the chosen axis interpretation.
Site index overlay — Dominant height (H100) chart now supports a reference-age selector (25/50/100 yr). The interpolated top height at reference age is displayed as a site index annotation for quick comparison with regional yield tables.
Self-thinning reference — Trees-per-hectare chart overlays Reineke's −3/2 self-thinning curve (anchored at the first period's density) when stand density is declining, providing visual context for mortality relative to the maximum density line.
Stand Forecast sample data — Rebuilt with species-specific growth, natural mortality, and successional dynamics calibrated to NB Acadian forest conditions. Two stands (managed BS plantation + uneven-aged tolerant hardwood), three plots each, seven periods (age 40–100). Individual tree DBH increments, height from species-specific H-D curves, density-dependent mortality, intolerant species decline, shade-tolerant ingrowth, and corrected Honer (1967) / Kershaw (2006) volume equations ensure biologically defensible per-hectare volumes throughout the rotation.
Chart fixes — Volume-by-destination chart now sorts by the same value used for bar width (previously insertion order). Size class histograms with "skip blank bins" enabled now honor the user’s requested bin width (previously capped at 50 bins regardless of gaps). "By plot" chart gains a sort toggle between total-value descending and input order. Site-index label on H100 chart uses adaptive left/right placement based on chart-edge proximity and curve-polygon collision checks, and subscript formatting (SI50) for compactness. Reference lines and annotation text on rotation-analysis and H100 charts now render with a background halo for legibility against filled polygons. Boundary-case MAI notes (when the peak is at the first or last period) appear as a subdued italic note without a rotation marker, rather than claiming a specific rotation age where the observation is ambiguous.
Minor refinements — Charts tab content now scrolls internally rather than extending the page. Improved tooltip consistency across time-series overlays.
PRCalc v.2026.0
First release — April 2026
Core engine — Honer et al. (1983) volume equations and merchantable volume ratios for 14 northeastern species. Four allocation modes: Sequential (original Kershaw algorithm), Remainder, Sacrifice, and Optimized (dynamic programming).
Data pipeline — Excel/CSV import with auto-detected field mapping, species auto-matching (PRCalc codes, NB French codes, OSM Acadian codes, common names), hierarchical data support (plot, stand, time/period), and four scaling modes (variable radius, fixed area, expansion factor, no scaling).
Height estimation — Five data-driven model forms (Curtis 1967, Näslund, Wykoff 1982, Weibull, Power) fitted at species, group, and global levels with automatic best-RMSE selection. Acadian regional defaults from Rijal et al. (2012) with species-specific coefficients for 15 Acadian species. Species resolution toggle for original vs mapped codes.
Visualizations — Product breakdown (donut/bar), size class distribution (5 modes), product volume by plot, stand value by product, volume by destination, interactive stem profile viewer with taper curves and exploratory height adjustment, stacked area time series (5 metrics). All charts exportable as standalone SVG with full light/dark mode support.
Outputs — Tree-level, plot-level, and stand-level tabular results with confidence intervals. Excel export. Interactive tooltips on all chart elements. Period scrubbing across all time-aware views. Product specification load/save (JSON) for reuse across sessions.
Manual entry mode — Direct tree and product input for quick single-tree or small-sample analysis without file import.
Contact
Jae Ogilvie
Faculty of Forestry & Environmental Management
University of New Brunswick, Fredericton, NB, Canada jae.ogilvie@unb.ca
PRCalc v.2026.5 — Faculty of Forestry & Environmental Management, University of New Brunswick