1. Feed intake: net energy treated as metabolisable energy

The IPCC equations give an animal's energy requirement as net energy (NE). Feed supplies metabolisable energy (ME), and only part of it becomes net energy. IPCC 2019 Eq. 10.14–10.16 (Vol 4 Ch 10, pp. 10.29–10.30) converts between them with the efficiency ratios REM and REG. The package skips that step (R/energy_requirement.R:170), so it underestimates how much an animal eats. Enteric CH4, manure, land and N are all calculated from that intake.

The test diet gives every feed 9.5 MJ ME/kg DM, which is about 64% digestible.

Animal IPCC kg DM/day Current kg DM/day Fixed kg DM/day Current / IPCC Fixed / IPCC
Cattle - Calves 2.2 1.2 2.2 0.55 1.00
Cattle - Steers/heifers (improved) 5.0 2.9 5.0 0.57 1.00
Cattle - Cows (improved) 13.9 8.7 13.9 0.63 1.00

Currently the package gives these animals only 55–63% of the IPCC intake when energy is the limiting factor. The fix applies Eq. 10.14–10.16 to cattle, buffalo, sheep and goats, and warns if the diet is too poor for the equations to be valid.

--- a/R/energy_requirement.R	2026-09-29 10:30:38
+++ b/R/energy_requirement.R	2026-09-29 10:30:38
@@ -138,6 +138,9 @@
   #Compute annual energy and protein required
   annual_requirement <- lactation_cp%>%
     mutate(energy_required_annually=(er_maintenance+er_activity+er_growth+er_lactation+er_pregnancy+er_work+er_wool)*no_days*herd_composition,
+           # IPCC 2019 Eq. 10.16 splits NE into terms divided by REM and by REG
+           ne_rem_annually=(er_maintenance+er_activity+er_lactation+er_pregnancy+er_work)*no_days*herd_composition,
+           ne_reg_annually=(er_growth+er_wool)*no_days*herd_composition,
            protein_required_annually =((cp_maintenance*no_days)+
                                          ifelse(!is.finite(((cp_lys_pregnancy/(no_days*birth_interval))*no_days)),0,((cp_lys_pregnancy/(no_days*birth_interval))*no_days))+
                                          ifelse(!is.finite(((cp_lactation/(no_days*birth_interval))*no_days)),0,((cp_lactation/(no_days*birth_interval))*no_days))+
@@ -167,8 +170,16 @@
              energy_required_by_season = energy_required_annually*(sl/no_days),#compute energy require by season
              protein_required_by_season = protein_required_annually*(sl/no_days))%>% #compute protein require by season
       left_join(s_feed_basket_quality, by = "livestock_category_code")%>%
-      mutate(fresh_intake_required_e = energy_required_by_season/average_me,
-             dmi_required_e = fresh_intake_required_e*average_dm/100,
+      mutate(de_pct = ((average_me*100/average_dm)/0.81)/18.45*100, #DE as % of GE, package ME/DE = 0.81
+             # IPCC 2019 p. 10.21: common ruminant DE ranges start at 45%; below that REG
+             # (Eq. 10.15) approaches 0 and intake diverges, so 45% is used as a floor.
+             de_eq = pmax(de_pct, 45),
+             rem = 1.123-(4.092e-3*de_eq)+(1.126e-5*de_eq^2)-(25.4/de_eq), #IPCC 2019 equation 10.14
+             reg = 1.164-(5.16e-3*de_eq)+(1.308e-5*de_eq^2)-(37.4/de_eq), #IPCC 2019 equation 10.15
+             ipcc_ruminant = grepl("^(Cattle|Buffalo|Sheep|Goats)", livestock_category_name),
+             ge_required_by_season = ((ne_rem_annually*sl/no_days)/rem+(ne_reg_annually*sl/no_days)/reg)/(de_eq/100), #IPCC 2019 equation 10.16
+             dmi_required_e = ifelse(ipcc_ruminant, ge_required_by_season/18.45, (energy_required_by_season/average_me)*average_dm/100),
+             fresh_intake_required_e = dmi_required_e*100/average_dm,
              fresh_intake_required_cp = protein_required_by_season/(average_cp/100),
              dmi_required_cp = fresh_intake_required_cp*average_dm/100,
... (14 more lines in results/F01.diff)
Reproduce this Open in Colab (R runtime; section 1)
Rscript reproduce_critical_issues.R 1 using reproduce_critical_issues.R (installs what it needs into its own library and cleaned @ 800d53a). Add CLEANED_FIXES=proposed_fixes.R with proposed_fixes.R for the fixed column.
Test: test-critical-01-energy-ne-vs-me.R · Proposed change: F01.diff · Open an issue in CIAT/cleaned

Comments

Comments are GitHub Discussions on peetmate/cleaned-review; sign in with GitHub to post.