Title: | Carbon-Related Assessment of Silvicultural Concepts |
---|---|
Description: | A simulation model and accompanying functions that support assessing silvicultural concepts on the forest estate level with a focus on the CO2 uptake by wood growth and CO2 emissions by forest operations. For achieving this, a virtual forest estate area is split into the areas covered by typical phases of the silvicultural concept of interest. Given initial area shares of these phases, the dynamics of these areas is simulated. The typical carbon stocks and flows which are known for all phases are attributed post-hoc to the areas and upscaled to the estate level. CO2 emissions by forest operations are estimated based on the amounts and dimensions of the harvested timber. Probabilities of damage events are taken into account. |
Authors: | Peter Biber [aut, cre, cph] , Stefano Grigolato [ctb] , Julia Schmucker [ctb] , Enno Uhl [ctb] , Hans Pretzsch [ctb] |
Maintainer: | Peter Biber <[email protected]> |
License: | GPL (>= 3) |
Version: | 1.0.3 |
Built: | 2024-12-23 06:49:49 UTC |
Source: | CRAN |
Aggregate and prepare raw simulation output as obtained from
sim_area_single_concept_with_risk
in a way that makes them
readable and appropriate for further processing.
aggregate_raw_sim_rslt(sim_areas_raw, concept_def)
aggregate_raw_sim_rslt(sim_areas_raw, concept_def)
sim_areas_raw |
Raw simulation results as obtained from
|
concept_def |
The concept definition (a |
A list of three matrices with named columns. Each row of these
matrices represents a point in simulation time, but only integer times. The
time distance from one row to the next one is one time unit, typically one
year. The first column of the matrices is time, the other columns represent
the stand development phases as defined in concept_def
. The three
list elements (matrices) are:
areas: Contains the simulated areas of each stand development
phase in the area units defined in concept_def
, usually ha.
area_inflows_regular: The area inflows into each stand development phase as caused by regular development, not by damage events. An entry at a given point in time represents the inflow between (and up to) this and the previous point in time. Therefore, the entries at time 0 are NA.
area_outflows_events: Area outflows of each stand development phase as caused by damage events. An entry at a given point in time represents the inflow between (and up to) this and the previous point in time. Therefore, the entries at time 0 are NA.
# Make a simulation state_vars <- setup_statevars( pine_thinning_from_above_1, c(1000, 0, 0, 0, 0, 0) ) time_span <- 50 parms <- setup_parms(pine_thinning_from_above_1) parms$risk_mat <- setup_risk_events( time_span, avg_event_strength = 1, parms$risk ) # Simulate sim_rslt_raw <- sim_area_single_concept_with_risk( state_vars, parms = parms, event_times = c(0:time_span), time_span = time_span ) aggregate_raw_sim_rslt(sim_rslt_raw, pine_thinning_from_above_1)
# Make a simulation state_vars <- setup_statevars( pine_thinning_from_above_1, c(1000, 0, 0, 0, 0, 0) ) time_span <- 50 parms <- setup_parms(pine_thinning_from_above_1) parms$risk_mat <- setup_risk_events( time_span, avg_event_strength = 1, parms$risk ) # Simulate sim_rslt_raw <- sim_area_single_concept_with_risk( state_vars, parms = parms, event_times = c(0:time_span), time_span = time_span ) aggregate_raw_sim_rslt(sim_rslt_raw, pine_thinning_from_above_1)
Estimate Average Wood Extraction Distance From Forest Road Density
avg_extraction_distance(frd)
avg_extraction_distance(frd)
frd |
Forest road density (truck roads) in m/ha |
The average extraction distance from the felling spot to the nearest landing at a truck road.
frd <- c(15, 30, 60, 100) # Forest road densities m/ha avg_extraction_distance(frd)
frd <- c(15, 30, 60, 100) # Forest road densities m/ha avg_extraction_distance(frd)
For creating a c4c_concept object under normal circumstances, you should not
use the constructor new_c4c_concept
directly, but this
function.
c4c_concept(growth_and_yield, concept_name)
c4c_concept(growth_and_yield, concept_name)
growth_and_yield |
data.frame with at least two rows and the columns "phase_no", "phase_name", "duration", "n_subphases", "vol_standing", "vol_remove", "vol_mort", "dbh_standing", "dbh_remove", "n_standing", "n_remove", "harvest_interval", and "survival_cum". |
concept_name |
Character, name of the concept defined |
Special attention needs to be paid to the definition of vol_remove in
cases when the standing volume decreases from one phase to the next. If the
value given for vol_remove
is too low, it will result in a negative
volume increment for the respective phase. This will not pass the validation
called inside this function.
A valid object of class c4c_concept, if it can be constructed from
the input data; stops with an error otherwise. The object is basically a
list. Its most important ingredient is a tibble named
growth_and_yield
which is a honed version of the input
growth_and_yield
to this function. It contains, in addition, phase
wise periodical volume increments per ha (column vol_increment
),
which result from the given information. There is no option for
user-provided volume increments in order to guarantee consistency.
# construct dummy example (without real life relevance) g_and_y <- data.frame( phase_no = 1:2, phase_name = c("young", "older"), duration = c(10, 10), n_subphases = c(3, 3), vol_standing = c(166, 304), vol_remove = c(0, 23.6), vol_mort = c(0.01, 0.11), n_standing = c(3200, 970), n_remove = c(0, 306), dbh_standing = c(9.4, 22.3), dbh_remove = c(0, 12.3), harvest_interval = c(0, 5), survival_cum = c(0.999, 0.852) ) dummy_concept <- c4c_concept(g_and_y, "dummy_concept") dummy_concept
# construct dummy example (without real life relevance) g_and_y <- data.frame( phase_no = 1:2, phase_name = c("young", "older"), duration = c(10, 10), n_subphases = c(3, 3), vol_standing = c(166, 304), vol_remove = c(0, 23.6), vol_mort = c(0.01, 0.11), n_standing = c(3200, 970), n_remove = c(0, 306), dbh_standing = c(9.4, 22.3), dbh_remove = c(0, 12.3), harvest_interval = c(0, 5), survival_cum = c(0.999, 0.852) ) dummy_concept <- c4c_concept(g_and_y, "dummy_concept") dummy_concept
Given the output of a simulation run (i.e. an object of class
c4c_base_result
) as created with the function
simulate_single_concept
, the fuel consumption and CO2 emissions
for cutting (i.e. felling, limbing, cutting the trees into logs) are
calculated. Currently, this function assumes only harvester operations.
co2_eval_cutting(x, mode = c("standard", "nordic"))
co2_eval_cutting(x, mode = c("standard", "nordic"))
x |
An object of class |
mode |
Character string to choose between "standard" (default) and
"nordic". For "standard", the function |
A data frame (tibble) with the columns time, harvest_type (damage or regular), phase_no, phase_name (numbers and names of the stand development phases), fuel_cutting_l_per_m3 (liters of fuel consumed per m3 of harvested wood), fuel_cutting_total_l (liters of fuel consumed in total), co2_cutting_total_kg (kg CO2 emitted).
base_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(50, 100, 10, 50, 150, 600), time_span = 50, risk_level = 3 ) co2_eval_cutting(base_out, "standard") co2_eval_cutting(base_out, "nordic")
base_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(50, 100, 10, 50, 150, 600), time_span = 50, risk_level = 3 ) co2_eval_cutting(base_out, "standard") co2_eval_cutting(base_out, "nordic")
Given the output of a simulation run (i.e. an object of class
c4c_base_result
) as created with the function
simulate_single_concept
, the fuel consumption and CO2 emissions
for moving the wood to a truck road are calculated. Currently, this function
assumes only forwarder operations.
co2_eval_moving( x, road_density, rel_loss = 0.1, mode = c("standard", "nordic") )
co2_eval_moving( x, road_density, rel_loss = 0.1, mode = c("standard", "nordic") )
x |
An object of class |
road_density |
Forest road density (m/ha), relating to truck-accessible roads |
rel_loss |
Relative amount of the standing tree volume that is lost during harvesting (default 0.1). Note that the harvested amount is reduced with the factor 1 - rel_loss before upscaling from the fuel consumption per m³, because only the wood remaining after the harvest loss (mainly the stumps) is actually moved. |
mode |
Character string to choose between "standard" (default) and
"nordic". With the option "standard", the function
|
A data frame (tibble) with the columns time, harvest_type (damage or regular), phase_no, phase_name (numbers and names of the stand development phases), fuel_moving_l_per_m3 (liters of fuel consumed per m3 of moved wood), fuel_moving_total_l (liters of fuel consumed in total), co2_moving_total_kg (kg CO2 emitted).
base_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(50, 100, 10, 50, 150, 600), time_span = 50, risk_level = 3 ) co2_eval_moving(base_out, road_density = 35, mode = "standard") co2_eval_moving(base_out, road_density = 35, mode = "nordic")
base_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(50, 100, 10, 50, 150, 600), time_span = 50, risk_level = 3 ) co2_eval_moving(base_out, road_density = 35, mode = "standard") co2_eval_moving(base_out, road_density = 35, mode = "nordic")
Assuming an exponential decay process y = exp(-r * t), this function
calculates r if the following informaion is given:
y_1 = exp(-r \* t_1),
y_2 = exp(-r \* t_2)
Hereby, t_1 is the earlier, t_2 the later point in
time. This implies the following conditions: t_2 > t_1, y_2 <= y_1
If
these conditions are not given, the function will terminate with an error.
exp_decay_rate(t_1, t_2, y_1, y_2)
exp_decay_rate(t_1, t_2, y_1, y_2)
t_1 |
Earlier point in time, coupled to |
t_2 |
Later point in time, coupled to |
y_1 |
Earlier value, coupled to |
y_2 |
Later value, coupled to |
The exponential decay rate r
, relating to the time unit of
t_1
and t_2
# Up to an age of t_1 = 30, a forest stand of interest has a survival # probability of 0.95. Up to an age of t_2 = 80, it has a survival # probability of 0.83. If we assume an exponential decay process for the # 50-year period, what is the exponential decay rate r? r <- exp_decay_rate(30, 80, 0.95, 0.83) print(r) # Check it 0.95 * exp(-r * (80 - 30)) # 0.83
# Up to an age of t_1 = 30, a forest stand of interest has a survival # probability of 0.95. Up to an age of t_2 = 80, it has a survival # probability of 0.83. If we assume an exponential decay process for the # 50-year period, what is the exponential decay rate r? r <- exp_decay_rate(30, 80, 0.95, 0.83) print(r) # Check it 0.95 * exp(-r * (80 - 30)) # 0.83
Given the output of a simulation run generated with
simulate_single_concept
, i.e. an object of class
c4c_base_result
, a set of information related to CO2 emissions and
storage is generated on different levels of aggregation.
fuel_and_co2_evaluation( x, road_density_m_ha, raw_density_kg_m3 = 520, harvest_loss = 0.1, bark_share = 0.12, mode = c("standard", "nordic") )
fuel_and_co2_evaluation( x, road_density_m_ha, raw_density_kg_m3 = 520, harvest_loss = 0.1, bark_share = 0.12, mode = c("standard", "nordic") )
x |
An object of class |
road_density_m_ha |
The forest road density on the whole area in m/ha |
raw_density_kg_m3 |
The raw wood density (kg/m³) to be used for wood
volume conversions (i.e. density of air-dry wood (12% water content)).
Default is 520 kg/m³ (typical for Scots pine). Internally, wood volume is
converted into CO2 equivalents with |
harvest_loss |
Relative loss fraction of wood volume during harvest, mainly comprising the stumps (default = 0.1). Does not include bark losses. |
bark_share |
Relative wood volume share of the bark. Required, as the CO2 equivalents of harvested wood are calculated for wood volume under bark. |
mode |
Character string indicating the mode of calculating fuel
consumption due to harvest operations. This relates to the functions
|
An object of class c4c_co2_result
which is, in essence, a list
of three result data frames (and metadata about the underlying simulation),
providing information about co2 emissions, storage, and fuel consumption on
different levels of aggregation.
# Make a simulation run first # The resulting object base_output (class c4c_base_result) comprises # the simulated phase area dynamics as well as extended growth and yield # information base_output <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 ) # Generate fuel and CO2 related information fuel_and_co2_evaluation( base_output, road_density_m_ha = 35, mode = "nordic" )
# Make a simulation run first # The resulting object base_output (class c4c_base_result) comprises # the simulated phase area dynamics as well as extended growth and yield # information base_output <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 ) # Generate fuel and CO2 related information fuel_and_co2_evaluation( base_output, road_density_m_ha = 35, mode = "nordic" )
Fuel consumption per m³ harvested wood derived from the data provided by Grigolato and Cadei (2022). Includes loading, transportation, and unloading.
fuel_cons_forwarder_1(aed)
fuel_cons_forwarder_1(aed)
aed |
Average extraction distance to the nearest truck road |
Fuel consumption of a forwarder in liters diesel fuel per m³ wood to be handled
Grigolato S, Cadei A (2022). “Full-mechanized CTL production data in Scots pine forest in Poland.” https://researchdata.cab.unipd.it/659/.
frd <- c(15, 30, 60, 100) # Forest road densities m/ha avg_extraction_distance(frd) |> fuel_cons_forwarder_1()
frd <- c(15, 30, 60, 100) # Forest road densities m/ha avg_extraction_distance(frd) |> fuel_cons_forwarder_1()
Fuel consumption per m³ harvested wood after Kärhä et al. (2023). Includes loading, transportation, and unloading.
fuel_cons_forwarder_2(aed, harvest_vol_ha, mineral_soil = TRUE)
fuel_cons_forwarder_2(aed, harvest_vol_ha, mineral_soil = TRUE)
aed |
Average extraction distance to the nearest truck road |
harvest_vol_ha |
Harvested merchandable wood volume over bark per ha (m³/ha) |
mineral_soil |
Logical, TRUE (default) if the operation takes place on mineral soil, FALSE if not |
Fuel consumption of a forwarder in liters diesel fuel per m³ wood to be handled
Kärhä K, Haavikko H, Kääriäinen H, Palander T, Eliasson L, Roininen K (2023). “Fossil-fuel consumption and CO2eq emissions of cut-to-length industrial roundwood logging operations in Finland.” European Journal of Forest Research, 1–17.
frd <- c(15, 30, 60, 100) # Forest road densities m/ha aed <- avg_extraction_distance(frd) fuel_cons_forwarder_2(aed, 100, TRUE) fuel_cons_forwarder_2(aed, 100, FALSE)
frd <- c(15, 30, 60, 100) # Forest road densities m/ha aed <- avg_extraction_distance(frd) fuel_cons_forwarder_2(aed, 100, TRUE) fuel_cons_forwarder_2(aed, 100, FALSE)
Fuel consumption depends on the average tree volume. For tree diameters at
breast height < 15 cm the function gives back NA
, because the assumed
machine does not work with such small trees. Estimated after
Bacescu et al. (2022).
fuel_cons_harvester_1(tree_vol, tree_dbh)
fuel_cons_harvester_1(tree_vol, tree_dbh)
tree_vol |
Average standing merchandable wood volume over bark (m³) per harvested tree |
tree_dbh |
Average diameter at breast height (cm) per harvested tree |
Fuel consumption of a harvester in liters diesel fuel per m³ harvested wood
Bacescu NM, Cadei A, Moskalik T, Wiśniewski M, Talbot B, Grigolato S (2022). “Efficiency Assessment of Fully Mechanized Harvesting System through the Use of Fleet Management System.” Sustainability, 14(24). ISSN 2071-1050, doi:10.3390/su142416751, https://www.mdpi.com/2071-1050/14/24/16751.
dbh <- seq(10, 70, 10) # Vector of tree dbh in cm vol <- dbh ^ 2 / 1000 # Simple Volume estimate (m³) with Denzin's formula fuel_cons_harvester_1(vol, dbh)
dbh <- seq(10, 70, 10) # Vector of tree dbh in cm vol <- dbh ^ 2 / 1000 # Simple Volume estimate (m³) with Denzin's formula fuel_cons_harvester_1(vol, dbh)
Fuel consumption of a harvester in liters diesel per m³ havested wood after Kärhä et al. (2023).
fuel_cons_harvester_2(tree_vol, harvest_vol_ha, thinning = TRUE)
fuel_cons_harvester_2(tree_vol, harvest_vol_ha, thinning = TRUE)
tree_vol |
Average standing merchandable wood volume over bark (m³) per harvested tree |
harvest_vol_ha |
Harvested merchandable wood volume over bark per ha (m³/ha) |
thinning |
Logical, TRUE (default) if the harvest is a thinning, or another kind of felling operation (FALSE) |
Fuel consumption of a harvester in liters diesel fuel per m³ harvested wood
Kärhä K, Haavikko H, Kääriäinen H, Palander T, Eliasson L, Roininen K (2023). “Fossil-fuel consumption and CO2eq emissions of cut-to-length industrial roundwood logging operations in Finland.” European Journal of Forest Research, 1–17.
tree_vol <- c(0.03, 0.10, 1.00, 2.00, 5.00) harvest_vol <- c(5.00, 10.00, 50.00, 25.00, 10.00) fuel_cons_harvester_2(tree_vol, harvest_vol, TRUE) fuel_cons_harvester_2(tree_vol, harvest_vol, FALSE)
tree_vol <- c(0.03, 0.10, 1.00, 2.00, 5.00) harvest_vol <- c(5.00, 10.00, 50.00, 25.00, 10.00) fuel_cons_harvester_2(tree_vol, harvest_vol, TRUE) fuel_cons_harvester_2(tree_vol, harvest_vol, FALSE)
Estimate the annual diesel fuel consumption per ha for maintaining an existing truck road network in the forest. Estimate based on Enache and Stampfer (2015).
fuel_cons_road_maintenance(frd)
fuel_cons_road_maintenance(frd)
frd |
Forest road density in m/ha |
Diesel fuel consumption for truck road network maintenance in l/ha/year
Enache A, Stampfer K (2015). “Machine utilization rates, energy requirements and greenhouse gas emissions of forest road construction and maintenance in Romanian mountain forests.” Journal of Green Engineering, 4(4), 325–350.
frd <- c(15, 30, 60, 100) fuel_cons_road_maintenance(frd)
frd <- c(15, 30, 60, 100) fuel_cons_road_maintenance(frd)
Simple conversion assuming a factor of 2.61 kg CO2 / l diesel fuel
fuel_to_co2(fuel_cons_ltrs, fuel_type = c("diesel"))
fuel_to_co2(fuel_cons_ltrs, fuel_type = c("diesel"))
fuel_cons_ltrs |
Fuel amount consumed by a harvester in liters. |
fuel_type |
Fuel type (character string), required to find the correct conversion factor. Currently, only "diesel" is accepted. |
The emitted amount of CO2 in kg coming form burning
fuel_cons_ltrs
dbh <- seq(20, 70, 10) # Vector of tree dbh in cm vol <- dbh ^ 2 / 1000 # Simple Volume estimate (m³) with Denzin's formula fuel_cons_harvester_1(vol, dbh) |> fuel_to_co2()
dbh <- seq(20, 70, 10) # Vector of tree dbh in cm vol <- dbh ^ 2 / 1000 # Simple Volume estimate (m³) with Denzin's formula fuel_cons_harvester_1(vol, dbh) |> fuel_to_co2()
Provide an extensive compilation of growth and yield related results.
growth_and_yield_evaluation(sim_agg, concept_def, detailed_out = FALSE)
growth_and_yield_evaluation(sim_agg, concept_def, detailed_out = FALSE)
sim_agg |
Aggregated simulated area dynamics, more precisely, the output
of |
concept_def |
Concept definition matching |
detailed_out |
Boolean, if TRUE, also pre-evaluation output (calculated by the internal function growth_and_yield_pre_eval) will be part of the result list (default = FALSE) |
The result object, a list, contains the following elements:
gyield_summary: A tibble that contains phase overarching growth and yield information. In this tibble, each row is a point in time. The columns (in addition to time) are: vol_standing, the standing volume on the total area of interest; vol_rmv_cont,the continuous removals that take place, as long as an area is in a given phase; vol_rmv_trans, the volume removals occurring at phase transitions from phases with more to such with less standing volume; vol_rmv_damage, the volume losses due to damage events; vol_rmv_harvest, regular harvest volume, the sum of vol_rmv_cont and vol_rmv_trans; vol_rmv_total, all removed volume, the sum of vol_rmv_harvest and vol_rmv_damage; vol_mort, the mortality volume (normal, not event-triggered); vol_inc, the volume increment on the whole area resulting from the vol_standing, vol_rmv_total, and vol_mort.
gyield_phases: A list of tibbles, one for each variable as contained in gyield_summary (except the volume increment) which makes no sense in a phase-wise context), but in phase-wise resolution. In each tibble, each row is a point in time, the columns represent the stand development phases.
gyield_pre (in case the user has chosen
detailed_out = TRUE
): A tibble, where each row is a point in
time. The columns (in addition to time) are: vol_standing, the standing
volume on the total area of interest; vol_rmv_cont,the continuous
removals that take place, as long as an area is in a given phase;
vol_rmv_trans, the volume removals occurring at phase transitions from
phases with more to such with less standing volume;vol_rmv_damage, the
volume losses due to damage events; vol_rmv_harvest, regular harvest
volume, the sum of vol_rmv_cont and vol_rmv_trans; vol_rmv_total, all
removed volume, the sum of vol_rmv_harvest and vol_rmv_damage;
vol_mort, the mortality volume (normal, not event-triggered);
vol_inc, the volume increment on the whole area resulting from the
vol_standing, vol_rmv_total, and vol_mort.
A list with two elements (see also details),
gyield_summary: A tibble that contains phase overarching growth and yield information.
gyield_phases: A list of tibbles, each one representing one of the growth and yield variables also found in gyield_summary, but here on the level of the single stand development phases.
If the user has selected detailed_out = TRUE
, there will also be
another list element, gyield_pre, which contains the interim information
from which gyield_summary and gyield_phases are calculated.
# Run a simulation and store the aggregated outcome state_vars <- setup_statevars( pine_thinning_from_above_1, c(1000, 0, 0, 0, 0, 0) ) time_span <- 200 parms <- setup_parms(pine_thinning_from_above_1) parms$risk_mat <- setup_risk_events( time_span, avg_event_strength = 1, parms$risk ) sim_areas_agg <- sim_area_single_concept_with_risk( state_vars, parms = parms, event_times = c(0:time_span), time_span = time_span ) |> aggregate_raw_sim_rslt(pine_thinning_from_above_1) # Growth and yield evaluation growth_and_yield_evaluation(sim_areas_agg, pine_thinning_from_above_1)
# Run a simulation and store the aggregated outcome state_vars <- setup_statevars( pine_thinning_from_above_1, c(1000, 0, 0, 0, 0, 0) ) time_span <- 200 parms <- setup_parms(pine_thinning_from_above_1) parms$risk_mat <- setup_risk_events( time_span, avg_event_strength = 1, parms$risk ) sim_areas_agg <- sim_area_single_concept_with_risk( state_vars, parms = parms, event_times = c(0:time_span), time_span = time_span ) |> aggregate_raw_sim_rslt(pine_thinning_from_above_1) # Growth and yield evaluation growth_and_yield_evaluation(sim_areas_agg, pine_thinning_from_above_1)
Check if an Object is of Class c4c_concept
is_c4c_concept(x)
is_c4c_concept(x)
x |
object to check |
TRUE
, if x
has class c4c_concept, FALSE
if not
data(pine_thinning_from_above_1) x <- unclass(pine_thinning_from_above_1) is_c4c_concept(pine_thinning_from_above_1) is_c4c_concept(x)
data(pine_thinning_from_above_1) x <- unclass(pine_thinning_from_above_1) is_c4c_concept(pine_thinning_from_above_1) is_c4c_concept(x)
Constructor for a c4c_concept Object
new_c4c_concept(x = list())
new_c4c_concept(x = list())
x |
a list object |
Returns an object of class c4c_concept
# remove the c4c_class attribute for the example's sake x <- unclass(pine_thinning_from_above_1) x <- new_c4c_concept(x)
# remove the c4c_class attribute for the example's sake x <- unclass(pine_thinning_from_above_1) x <- new_c4c_concept(x)
Generated from simulation runs to mimic a concept of treating a Scots pine stand with no thinnings and a short final harvest phase with the model SILVA.
pine_no_thinning_and_clearcut_1
pine_no_thinning_and_clearcut_1
An object of class c4c_concept
of length 3.
Generated from simulation runs to mimic a concept similar to the Scots pine management of the Bavarian State Forest with the model SILVA.
pine_thinning_from_above_1
pine_thinning_from_above_1
An object of class c4c_concept
of length 3.
Plot Function for c4c_base_result Objects
## S3 method for class 'c4c_base_result' plot( x, variable = c("area", "vol_standing", "vol_inc_ups", "vol_rmv_total", "vol_rmv_cont", "vol_rmv_damage", "vol_mort", "hrvst_det_reg", "hrvst_det_dam"), ... )
## S3 method for class 'c4c_base_result' plot( x, variable = c("area", "vol_standing", "vol_inc_ups", "vol_rmv_total", "vol_rmv_cont", "vol_rmv_damage", "vol_mort", "hrvst_det_reg", "hrvst_det_dam"), ... )
x |
Object of class |
variable |
Character string, specifies the variable to be plotted. The options are:
|
... |
Other parameters, currently not used |
A ggplot object
sim_base_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 ) # Make a plot plot(sim_base_out, variable = "area") # Also try the following options for the parameter "variable": # "vol_standing", "vol_inc_ups", "vol_rmv_total", "vol_rmv_cont", # "vol_rmv_damage", "vol_mort", "hrvst_det_reg", "hrvst_det_dam"
sim_base_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 ) # Make a plot plot(sim_base_out, variable = "area") # Also try the following options for the parameter "variable": # "vol_standing", "vol_inc_ups", "vol_rmv_total", "vol_rmv_cont", # "vol_rmv_damage", "vol_mort", "hrvst_det_reg", "hrvst_det_dam"
Plot Function for c4c_co2_result Objects
## S3 method for class 'c4c_co2_result' plot( x, plot_type = c("em_by_type", "fl_by_type", "em_by_phase", "fl_by_phase", "em_vs_inc", "em_vs_hrv", "em_inc_ratio"), ... )
## S3 method for class 'c4c_co2_result' plot( x, plot_type = c("em_by_type", "fl_by_type", "em_by_phase", "fl_by_phase", "em_vs_inc", "em_vs_hrv", "em_inc_ratio"), ... )
x |
Object of class |
plot_type |
Character string, specifies the kind of diagram to be plotted. The options are:
|
... |
Other parameters; currently not used |
A ggplot object
sim_co2_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 ) |> fuel_and_co2_evaluation(road_density_m_ha = 35, mode = "nordic") # Make a plot plot(sim_co2_out, plot_type = "em_by_type") # Also try the plot types "fl_by_type", "em_by_phase", "fl_by_phase", # "em_vs_inc", "em_vs_hrv", "em_inc_ratio"
sim_co2_out <- simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 ) |> fuel_and_co2_evaluation(road_density_m_ha = 35, mode = "nordic") # Make a plot plot(sim_co2_out, plot_type = "em_by_type") # Also try the plot types "fl_by_type", "em_by_phase", "fl_by_phase", # "em_vs_inc", "em_vs_hrv", "em_inc_ratio"
Given a c4c_concept
concept definition, a list of parameter elements
is handed back. This information is required for simulations and subsequent
evaluations.
setup_parms(concept_def)
setup_parms(concept_def)
concept_def |
Concept definition as a |
The element risk
as part of the output describe as 'normal' risk as
assumed for the silvicultural concept defined in concept_def
. This can
be adjusted with the parameter avg_event_strength
of the function
setup_risk_events
, which has to be called in any case after the
parameter setup.
A list with three elements. The first, dwell_time
, is a vector
of dwell times for each subphase area, i.e. it indicates the average time a
unit area is dwelling in this subphase (assuming an exponential
distribution over time). The second element, risk
, is a vector of
the same length and order. It represents, for each subphase area, the
average relative loss rate per year. It is derived from the cumulative
survival probabilities (survival_com
) given in the data frame
growth_and_yield
which is part of the concept definition
(concept_def
). The third element, phase_indexes
, is a tibble
which contains, for each stand development phase in concept_def
, a
vector of indexes which can be used to easier access the phase wise
information in the different kinds of simulation outputs.
parms <- pine_thinning_from_above_1 |> setup_parms() parms
parms <- pine_thinning_from_above_1 |> setup_parms() parms
Low-level function for setting up a risk matrix for a simulation run.
Available for users who want to build simulation runs out of single elements.
Regular users are recommended to use the function
simulate_single_concept
for running a simulation with one
single command (where this function is internally used).
setup_risk_events(time_span, avg_event_strength = 1, area_risks)
setup_risk_events(time_span, avg_event_strength = 1, area_risks)
time_span |
Simulation time span to be covered (integer) |
avg_event_strength |
Number which indicates the average strength of a damage event in the simulation. Default is 1 which means that the survival probabilities as defined in the silvicultural concept of interest are applied exactly as they are. A value of 2 would mean that one damage event would have the same effect as would two subsequent events with normal strength. A value of 0 would trigger no damage events at all. |
area_risks |
Vector of subphase-wise baseline damage risks, contained in
the list made with |
The function uses exponentially distributed random numbers (with expectation
= 1) for simulating the strenghth of damaging events. Such kind of
distribution where small events are much more frequent than strong ones is a
realistic assumption for forest damages. Such a random number is drawn for
each simulation point in time. The actual damage strength (i.e. relative area
loss) for a given subphase is then calculated as follows:rel_area_loss = 1 - ((1 - x) ^ avg_event_strength) ^ event_strength
,
where
x: The baseline area loss risk of a given stand development subphase as resulting from the silvicultural concept definition of interest
avg_event_strength: The user defined overall average event strenghth
event_strength: Exponentially distributed random number with expectation 1, indicating the damage event strength in a given year
A matrix where each row is a point in simulation time, and each column represents a subphase of the silvicultural concept of interest (in increasing order). Each matrix element describes the relative area loss that will happen at a given time to a given subphase.
parms <- setup_parms(pine_no_thinning_and_clearcut_1) setup_risk_events(time_span = 200, avg_event_strength = 3, area_risks = parms$risk)
parms <- setup_parms(pine_no_thinning_and_clearcut_1) setup_risk_events(time_span = 200, avg_event_strength = 3, area_risks = parms$risk)
c4c_concept
concept definition, and a matching vector of
initial areas the state variables required for simulating the concept are set
up and initialized.The state variables to be created are the areas attributed to the single
stand development phases defined in the concept definition of interest. More
precisely, each subphase has an area which is a state variable. When
initializing, the intial areas can be given for each phase in
init_areas
, or for each subphase. In the former case the initial phase
areas are equally divided among the respective subphases.
In order to
allow post-hoc reconstruction of the area flows, the function also creates
the cumulative inflows and outflows to each subphase area as state variables
and initializes them with 0.
setup_statevars(concept_def, init_areas, detailed = FALSE)
setup_statevars(concept_def, init_areas, detailed = FALSE)
concept_def |
The concept definition of interest as a |
init_areas |
A vector providing the initial areas for the stand
development (sub) phases defined in |
detailed |
Logical, |
A vector which is actually a sequence of three different blocks. This
format is required for simulations with ode
.
Each block has as many elements as the total number of subpbases defined in
concept_def
. Each element refers to each subphase in the order of
the phase sequence. The first block, contains the initial areas attributed
to all subphases in the order of the phase sequence. The second and the
third block will track the cumulative in- and outflows of each area during
the simulation. They are initialized with 0.
# Initialize with phase wise initial areas init_areas <- c(1000, 400, 250, 125, 125, 100) state_vars <- pine_thinning_from_above_1 |> setup_statevars(init_areas) state_vars # Initialize with subphase wise initial areas # Assume, we are afforesting 1000 ha, so all area has to be initially in # the first subphase of the first stand development phase n_sub <- sum(pine_thinning_from_above_1$growth_and_yield$n_subphases) init_areas <- rep(0, n_sub) init_areas[1] <- 1000 state_vars <- setup_statevars(pine_thinning_from_above_1, init_areas, detailed = TRUE) state_vars
# Initialize with phase wise initial areas init_areas <- c(1000, 400, 250, 125, 125, 100) state_vars <- pine_thinning_from_above_1 |> setup_statevars(init_areas) state_vars # Initialize with subphase wise initial areas # Assume, we are afforesting 1000 ha, so all area has to be initially in # the first subphase of the first stand development phase n_sub <- sum(pine_thinning_from_above_1$growth_and_yield$n_subphases) init_areas <- rep(0, n_sub) init_areas[1] <- 1000 state_vars <- setup_statevars(pine_thinning_from_above_1, init_areas, detailed = TRUE) state_vars
Low-level simulation function for area-phase dynamics, available for users
who want to compose simulations out of the single steps. Regular users are
recommended to use the function simulate_single_concept
.
sim_area_single_concept_with_risk( state_vars, parms, event_times, time_span = 100L, time_frac = 4L, integ_method = "lsoda" )
sim_area_single_concept_with_risk( state_vars, parms, event_times, time_span = 100L, time_frac = 4L, integ_method = "lsoda" )
state_vars |
list of state variable(s) (vectors), all initialized |
parms |
list of parameter(s) (vectors) |
event_times |
vector of integers specifying the points in time when
damage events can happen. Usually all numbers between (and including) zero
and the endpoint of the simulation (i.e. |
time_span |
simulation time span, integer, in the chosen time unit (typically years) |
time_frac |
integer >= 1, defines the time step to be used for numerical
integration (time step = 1 / time_frac), i.e. one time unit will be split
into time_frac substeps. Too small values of |
integ_method |
integration method, passed to |
an object of class deSolve
# Work with the example data pine_thinning_from_above_1 # Initialize state variables (areas per stand development phase) state_vars <- setup_statevars(pine_thinning_from_above_1, c(1000, 0, 0, 0, 0, 0)) # Set time frame time_span <- 200 # Initialize parameters parms <- setup_parms(pine_thinning_from_above_1) # Build risk matrix and add it to parms parms$risk_mat <- setup_risk_events( time_span, avg_event_strength = 1, parms$risk ) # Simulate sim_area_single_concept_with_risk( state_vars, parms = parms, event_times = c(0:time_span), time_span = time_span )
# Work with the example data pine_thinning_from_above_1 # Initialize state variables (areas per stand development phase) state_vars <- setup_statevars(pine_thinning_from_above_1, c(1000, 0, 0, 0, 0, 0)) # Set time frame time_span <- 200 # Initialize parameters parms <- setup_parms(pine_thinning_from_above_1) # Build risk matrix and add it to parms parms$risk_mat <- setup_risk_events( time_span, avg_event_strength = 1, parms$risk ) # Simulate sim_area_single_concept_with_risk( state_vars, parms = parms, event_times = c(0:time_span), time_span = time_span )
Top level function for running a simulation and obtaining all fundamental results, i.e. the simulated area dynamics and all growth and yield related outcomes.
simulate_single_concept( concept_def, init_areas, time_span, risk_level = 1, detailed_init = FALSE, detailed_out = FALSE, ... )
simulate_single_concept( concept_def, init_areas, time_span, risk_level = 1, detailed_init = FALSE, detailed_out = FALSE, ... )
concept_def |
Silvicultural Concept definition to be used in the
simulation; a |
init_areas |
The initial areas for each stand development phase defined
in |
time_span |
Time span to be covered by the simulation |
risk_level |
Risk level relative to the standard risk level as defined
in |
detailed_init |
Logical; is |
detailed_out |
Logical; should the output also include growth and yield pre-evaluation results (which are a very detailed interim evaluation output that is usally only required for internal efficiency)? The default is FALSE. |
... |
Additional arguments to
|
The output of this function is an object of class c4c_base_result
.
There is no other way to generate such an object, therefore there is neither
a constructor nor a validator available to the user.
An object of class c4c_base_result
which is actually a named
list containing all information that was used to define and set up a
simulation, as well as all fundamental simulation results, i.e. the
simulated area dynamics, and all growth and yield related results.
simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 )
simulate_single_concept( pine_thinning_from_above_1, init_areas = c(1000, 0, 0, 0, 0, 0), time_span = 200, risk_level = 3 )
Estimates the probability of a forest stand to survive a period t after its establishment, based on the Weibull-Method published by Staupendahl (2011) Forstarchiv 82, 10-19.
survival_weibull(t, alpha, s_100)
survival_weibull(t, alpha, s_100)
t |
Time in years after stand establishment |
alpha |
Shape parameter. According to Staupendahl, Values < 1 indicate a high risk at young ages, alpha = 1 indicates an indifference of the risk to t (exponential distribution), values > 1 indicate high risk at old ages, where 1 < alpha < 2 means a degressively increasing, alpha = 2 a constantly increasing, and alpha > 2 a progressively increasing risk. |
s_100 |
Survival probability up to t = 100 |
The parameter s_100
represents the survival probability after t = 100
years, and alpha
is the shape parameter, indicating the risk profile
of the stand (type) of interest.
The probability to survive up to t = 100
# Calculations for Common oak, European beech, Norway spruce, Douglas fir, # and Scots pine with parameters after Staupendahl and Zucchini (AFJZ 2011) t <- seq(0, 120, 5) survival_weibull(t, alpha = 2.75, s_100 = 0.971) # oak survival_weibull(t, alpha = 1.76, s_100 = 0.967) # beech survival_weibull(t, alpha = 2.78, s_100 = 0.726) # spruce survival_weibull(t, alpha = 3.11, s_100 = 0.916) # Douglas survival_weibull(t, alpha = 2.45, s_100 = 0.923) # pine
# Calculations for Common oak, European beech, Norway spruce, Douglas fir, # and Scots pine with parameters after Staupendahl and Zucchini (AFJZ 2011) t <- seq(0, 120, 5) survival_weibull(t, alpha = 2.75, s_100 = 0.971) # oak survival_weibull(t, alpha = 1.76, s_100 = 0.967) # beech survival_weibull(t, alpha = 2.78, s_100 = 0.726) # spruce survival_weibull(t, alpha = 3.11, s_100 = 0.916) # Douglas survival_weibull(t, alpha = 2.45, s_100 = 0.923) # pine
Validator for a c4c_concept Object
validate_c4c_concept(x)
validate_c4c_concept(x)
x |
an object of class c4c_concept to be validated |
Returns the input object if it passes validation, stops with an error otherwise
pine_thinning_from_above_1 |> validate_c4c_concept() pine_no_thinning_and_clearcut_1 |> validate_c4c_concept()
pine_thinning_from_above_1 |> validate_c4c_concept() pine_no_thinning_and_clearcut_1 |> validate_c4c_concept()
Convert Wood Volume to CO2 Equivalents
wood_to_co2(volume_m3, raw_density_kg_m3, water_perc = 12)
wood_to_co2(volume_m3, raw_density_kg_m3, water_perc = 12)
volume_m3 |
Wood volume to be converted in cubic meters |
raw_density_kg_m3 |
The raw density of the wood in kg/m³ |
water_perc |
The water content of the wood at raw density in percent (usually defined as 12 %, i.e. air-dry) |
The CO2 equivalent of the input wood volume in kg
# Conversion of 1 m³ wood with typical values for important tree species wood_to_co2(1, raw_density_kg_m3 = 520) # Scots pine wood_to_co2(1, raw_density_kg_m3 = 470) # Norway spruce wood_to_co2(1, raw_density_kg_m3 = 600) # European larch wood_to_co2(1, raw_density_kg_m3 = 700) # sessile/pedunculate oak wood_to_co2(1, raw_density_kg_m3 = 730) # European beech
# Conversion of 1 m³ wood with typical values for important tree species wood_to_co2(1, raw_density_kg_m3 = 520) # Scots pine wood_to_co2(1, raw_density_kg_m3 = 470) # Norway spruce wood_to_co2(1, raw_density_kg_m3 = 600) # European larch wood_to_co2(1, raw_density_kg_m3 = 700) # sessile/pedunculate oak wood_to_co2(1, raw_density_kg_m3 = 730) # European beech