cdmAcm0019-methodology.RmdThis vignette demonstrates the consolidated CDM methodology
ACM0019 N2O abatement from nitric acid production using
the cdmAcm0019 package. The workflow follows tidyverse
idioms and mirrors the structure of the official methodology:
applicability diagnostics, simulation of monitoring data, equation
walkthrough, monitoring-period aggregation, and an end-to-end
estimator.
monitoring <- simulate_acm0019_dataset(periods = 2, observations_per_period = 10, seed = 101)
check_applicability_monitoring_coverage(monitoring$data_capture_rate)## [1] TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
## [13] TRUE TRUE TRUE FALSE TRUE FALSE TRUE FALSE
check_applicability_catalyst_configuration(monitoring$catalyst_configuration)## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE
check_applicability_operating_regime("weak-acid", TRUE)## [1] TRUE
monitoring |>
dplyr::select(period, production_tonnes, baseline_ef_kg_per_tonne, project_ef_kg_per_tonne,
electricity_mwh, grid_ef_t_per_mwh, steam_tonnes, steam_ef_t_per_tonne) |>
head() |>
knitr::kable()## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| period | production_tonnes | baseline_ef_kg_per_tonne | project_ef_kg_per_tonne | electricity_mwh | grid_ef_t_per_mwh | steam_tonnes | steam_ef_t_per_tonne |
|---|---|---|---|---|---|---|---|
| P1 | 1460.876 | 9.434498 | 1.2964918 | 108.95138 | 0.6624767 | 73.07909 | 0.0868068 |
| P1 | 1566.295 | 9.783409 | 1.3516428 | 123.66278 | 0.7560508 | 77.42299 | 0.0837344 |
| P1 | 1419.007 | 9.392808 | 0.7361345 | 154.90548 | 0.6826065 | 99.31623 | 0.0764293 |
| P1 | 1525.723 | 8.914431 | 1.1080990 | 116.29781 | 0.7634736 | 125.29717 | 0.0797948 |
| P1 | 1537.292 | 9.797774 | 0.9789233 | 134.12146 | 0.6958688 | 97.52752 | 0.0825664 |
| P1 | 1640.876 | 8.935844 | 1.2805857 | 93.72912 | 0.6722205 | 55.35659 | 0.0664523 |
example_row <- monitoring |> dplyr::slice(1)
baseline <- calculate_baseline_emissions_acm0019(example_row$production_tonnes,
example_row$baseline_ef_kg_per_tonne)
project <- calculate_project_emissions_acm0019(example_row$production_tonnes,
example_row$project_ef_kg_per_tonne)
leakage <- calculate_leakage_emissions_acm0019(example_row$electricity_mwh,
example_row$grid_ef_t_per_mwh,
example_row$steam_tonnes,
example_row$steam_ef_t_per_tonne)
net <- calculate_net_emission_reductions_acm0019(baseline, project, leakage)
tibble::tibble(Component = c("Baseline", "Project", "Leakage", "Net"),
Value_tCO2e = c(baseline, project, leakage, net))## # A tibble: 4 × 2
## Component Value_tCO2e
## <chr> <dbl>
## 1 Baseline 3652.
## 2 Project 502.
## 3 Leakage 78.5
## 4 Net 3072.
period_summary <- aggregate_monitoring_periods_acm0019(monitoring)
period_summary |> knitr::kable()## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| period | production_tonnes | baseline_ef_kg_per_tonne | project_ef_kg_per_tonne | electricity_mwh | grid_ef_t_per_mwh | steam_tonnes | steam_ef_t_per_tonne | baseline_emissions | project_emissions | leakage_emissions | net_emission_reductions |
|---|---|---|---|---|---|---|---|---|---|---|---|
| P1 | 15294.05 | 9.477270 | 1.122257 | 1228.478 | 0.6656830 | 817.4657 | 0.0761864 | 38410.64 | 4548.422 | 880.0570 | 32982.16 |
| P2 | 14472.39 | 9.534625 | 1.193442 | 1462.237 | 0.6223642 | 707.0520 | 0.0816696 | 36567.04 | 4577.070 | 967.7889 | 31022.18 |
estimate_emission_reductions_acm0019(monitoring)## # A tibble: 1 × 5
## total_production_tonnes total_baseline_emissions total_project_emissions
## <dbl> <dbl> <dbl>
## 1 29766. 74978. 9125.
## # ℹ 2 more variables: total_leakage_emissions <dbl>,
## # total_net_emission_reductions <dbl>
tibble::tibble(
Function = c(
"check_applicability_monitoring_coverage",
"check_applicability_catalyst_configuration",
"check_applicability_operating_regime",
"simulate_acm0019_dataset",
"calculate_baseline_emissions_acm0019",
"calculate_project_emissions_acm0019",
"calculate_leakage_emissions_acm0019",
"calculate_net_emission_reductions_acm0019",
"aggregate_monitoring_periods_acm0019",
"estimate_emission_reductions_acm0019"
),
Signature = c(
"(data_capture_rate, minimum_coverage = 0.9)",
"(catalyst_configuration, allowed_configurations = c(\"secondary\", \"tertiary\"))",
"(plant_regime, has_continuous_monitoring)",
"(periods = 6, observations_per_period = 30, seed = NULL)",
"(production_tonnes, baseline_ef_kg_per_tonne, gwp_n2o = 265)",
"(production_tonnes, project_ef_kg_per_tonne, gwp_n2o = 265)",
"(electricity_mwh = 0, grid_ef_t_per_mwh = 0, steam_tonnes = 0, steam_ef_t_per_tonne = 0)",
"(baseline_emissions_tco2e, project_emissions_tco2e, leakage_emissions_tco2e = 0)",
"(monitoring_data)",
"(monitoring_data)"
),
Purpose = c(
"Verify sufficient monitoring coverage",
"Confirm catalyst configuration eligibility",
"Ensure regime has continuous monitoring",
"Generate representative monitoring data",
"Compute baseline emissions",
"Compute project emissions",
"Quantify auxiliary leakage",
"Calculate net reductions",
"Aggregate monitoring periods",
"Summarise total reductions"
)
) |> knitr::kable()## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| Function | Signature | Purpose |
|---|---|---|
| check_applicability_monitoring_coverage | (data_capture_rate, minimum_coverage = 0.9) | Verify sufficient monitoring coverage |
| check_applicability_catalyst_configuration | (catalyst_configuration, allowed_configurations = c(“secondary”, “tertiary”)) | Confirm catalyst configuration eligibility |
| check_applicability_operating_regime | (plant_regime, has_continuous_monitoring) | Ensure regime has continuous monitoring |
| simulate_acm0019_dataset | (periods = 6, observations_per_period = 30, seed = NULL) | Generate representative monitoring data |
| calculate_baseline_emissions_acm0019 | (production_tonnes, baseline_ef_kg_per_tonne, gwp_n2o = 265) | Compute baseline emissions |
| calculate_project_emissions_acm0019 | (production_tonnes, project_ef_kg_per_tonne, gwp_n2o = 265) | Compute project emissions |
| calculate_leakage_emissions_acm0019 | (electricity_mwh = 0, grid_ef_t_per_mwh = 0, steam_tonnes = 0, steam_ef_t_per_tonne = 0) | Quantify auxiliary leakage |
| calculate_net_emission_reductions_acm0019 | (baseline_emissions_tco2e, project_emissions_tco2e, leakage_emissions_tco2e = 0) | Calculate net reductions |
| aggregate_monitoring_periods_acm0019 | (monitoring_data) | Aggregate monitoring periods |
| estimate_emission_reductions_acm0019 | (monitoring_data) | Summarise total reductions |
tibble::tibble(
Step = c(
"Check applicability",
"Simulate or collect data",
"Apply equation helpers",
"Aggregate monitoring periods",
"Report totals"
),
Description = c(
"Validate monitoring coverage, catalyst setup, and regime",
"Assemble nitric acid production and monitoring records",
"Compute baseline, project, leakage, and net reductions",
"Roll observations up to reporting periods",
"Generate project-level emission reduction totals"
)
) |> knitr::kable()## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| Step | Description |
|---|---|
| Check applicability | Validate monitoring coverage, catalyst setup, and regime |
| Simulate or collect data | Assemble nitric acid production and monitoring records |
| Apply equation helpers | Compute baseline, project, leakage, and net reductions |
| Aggregate monitoring periods | Roll observations up to reporting periods |
| Report totals | Generate project-level emission reduction totals |