Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bugfixes ac_est #624

Merged
merged 8 commits into from
Jan 18, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### fixed
- **scripts** Fixed disaggregation.R and disaggregation_LUH2.R to be used with 67k
- **scripts** bugfix highres.R for bioenergy demand and GHG prices in coupled runs
- **35_natveg** bugfixes ac_est
- **44_biodiversity** bugfix condition for constraints


## [4.7.0] - 2023-12-11
Expand Down
2 changes: 1 addition & 1 deletion modules/32_forestry/dynamic_feb21/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum(

q32_land_expansion(j2,type32) ..
v32_land_expansion(j2,type32) =e=
sum(ac_est, v32_land(j2,type32,ac_est)) - sum(ac_est, pc32_land(j2,type32,ac_est));
sum(ac_est, v32_land(j2,type32,ac_est));

q32_land_reduction(j2,type32,ac_sub) ..
v32_land_reduction(j2,type32,ac_sub) =e= pc32_land(j2,type32,ac_sub) - v32_land(j2,type32,ac_sub);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to make sure: the pc32_lanc(j2,type32,ac_est) is no longer needed in q32_land_expansion, but in q32_land_reduction it still enters?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. But ac_est and ac_sub are dynamic sets of ac, depending on the time step length. It is not possible to define parameters, variables and equations for dynamics sets. Therefore, pc32_land is defined over ac.

Expand Down
2 changes: 1 addition & 1 deletion modules/32_forestry/dynamic_feb21/presolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ else
);

p32_disturbance_loss_ftype32(t,j,"aff",ac_sub) = pc32_land(j,"aff",ac_sub) * f32_forest_shock(t,"%c32_shock_scenario%") * m_timestep_length;
pc32_land(j,"aff",ac_est) = pc32_land(j,"aff",ac_est) + sum(ac_sub,p32_disturbance_loss_ftype32(t,j,"aff",ac_sub))/card(ac_est);
pc32_land(j,"aff",ac_est) = pc32_land(j,"aff",ac_est) + sum(ac_sub,p32_disturbance_loss_ftype32(t,j,"aff",ac_sub))/card(ac_est2);

pc32_land(j,"aff",ac_sub) = pc32_land(j,"aff",ac_sub) - p32_disturbance_loss_ftype32(t,j,"aff",ac_sub);

Expand Down
16 changes: 8 additions & 8 deletions modules/35_natveg/dynamic_feb21/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ equations
q35_min_forest(j) Minimum forest land constraint (mio. ha)
q35_min_other(j) Minimum other land constraint (mio. ha)
q35_landdiff Difference in natveg land (mio. ha)
q35_other_expansion(j,ac) Other land expansion (mio. ha)
q35_other_expansion(j) Other land expansion (mio. ha)
q35_other_reduction(j,ac) Other land reduction (mio. ha)
q35_secdforest_expansion(j,ac) Secdforest reduction (mio. ha)
q35_secdforest_expansion(j) Secdforest reduction (mio. ha)
q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha)
q35_primforest_reduction(j) Primforest reduction (mio. ha)
q35_secdforest_regeneration(j) Secondary forest remains secondary forest (mio. ha)
Expand All @@ -70,9 +70,9 @@ positive variables
v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha)
v35_other(j,ac) Detailed stock of other land (mio. ha)
vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha)
v35_other_expansion(j,ac) Other land expansion compared to previous timestep (mio. ha)
v35_other_expansion(j) Other land expansion compared to previous timestep (mio. ha)
v35_other_reduction(j,ac) Other land reduction compared to previous timestep (mio. ha)
v35_secdforest_expansion(j,ac) Secdforest reduction compared to previous timestep (mio. ha)
v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha)
v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha)
v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha)
v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha)
Expand All @@ -88,9 +88,9 @@ parameters
ov35_secdforest(t,j,ac,type) Detailed stock of secdforest (mio. ha)
ov35_other(t,j,ac,type) Detailed stock of other land (mio. ha)
ov_landdiff_natveg(t,type) Aggregated difference in natveg land compared to previous timestep (mio. ha)
ov35_other_expansion(t,j,ac,type) Other land expansion compared to previous timestep (mio. ha)
ov35_other_expansion(t,j,type) Other land expansion compared to previous timestep (mio. ha)
ov35_other_reduction(t,j,ac,type) Other land reduction compared to previous timestep (mio. ha)
ov35_secdforest_expansion(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha)
ov35_secdforest_expansion(t,j,type) Secdforest reduction compared to previous timestep (mio. ha)
ov35_secdforest_reduction(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha)
ov35_primforest_reduction(t,j,type) Primforest reduction compared to previous timestep (mio. ha)
ov35_hvarea_secdforest(t,j,ac,type) Harvested area from secondary forest (mio. ha)
Expand All @@ -106,9 +106,9 @@ parameters
oq35_min_forest(t,j,type) Minimum forest land constraint (mio. ha)
oq35_min_other(t,j,type) Minimum other land constraint (mio. ha)
oq35_landdiff(t,type) Difference in natveg land (mio. ha)
oq35_other_expansion(t,j,ac,type) Other land expansion (mio. ha)
oq35_other_expansion(t,j,type) Other land expansion (mio. ha)
oq35_other_reduction(t,j,ac,type) Other land reduction (mio. ha)
oq35_secdforest_expansion(t,j,ac,type) Secdforest reduction (mio. ha)
oq35_secdforest_expansion(t,j,type) Secdforest reduction (mio. ha)
oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha)
oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha)
oq35_secdforest_regeneration(t,j,type) Secondary forest remains secondary forest (mio. ha)
Expand Down
22 changes: 11 additions & 11 deletions modules/35_natveg/dynamic_feb21/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -73,24 +73,24 @@
*' This information is then passed to the land module ([10_land]):

q35_landdiff .. vm_landdiff_natveg =e=
sum((j2,ac),
v35_other_expansion(j2,ac)
+ v35_other_reduction(j2,ac)
+ v35_secdforest_expansion(j2,ac)
+ v35_secdforest_reduction(j2,ac)
sum(j2,
v35_other_expansion(j2)
+ sum(ac_sub, v35_other_reduction(j2,ac_sub))
+ v35_secdforest_expansion(j2)
+ sum(ac_sub, v35_secdforest_reduction(j2,ac_sub))
+ v35_primforest_reduction(j2));

q35_other_expansion(j2,ac_est) ..
v35_other_expansion(j2,ac_est) =e=
v35_other(j2,ac_est) - pc35_other(j2,ac_est);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To me it's not clear, why it is no longer necessary to subtract pc35_other here.
Now expansion is just equal to the stock?

Is the pc35_other parameter still used somewhere or not necessary anymore?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And I have the same question for: q32_land_expansion(j2,type32) and q35_secdforest_expansion(j2,ac_est)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pc35_other(j2,ac_est) is always zero because other land added in the previous time step has been shifted to higher age-classes in-between the iterations. The same holds true for q32_land_expansion and q35_secdforest_expansion. pc35_other(j2,ac_sub) is the other part of the full ac set, which in the optimization can only decrease.

Copy link
Contributor

@emolinab emolinab Jan 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In that case, should the name of the variables and equations change to something pointing towards "aggregated forestry land pools"? The expansion part is confusing (or is the naming related to specific jargon used in the forestry field?). I thought pc32_land and pc35_other were related to the information from the previous step.

Copy link
Contributor Author

@flohump flohump Jan 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To which variables and equations are you referring regarding the naming?
Expansion refers to land gross land expansion and can be directly linked to the ac_est subset. Reduction refers to gross land reduction and can be direclty linked to the ac_sub subset.
Yes, pc32_land and pc35_other hold information from the previous time step, but in the case of forestry and natveg the shifting for regrowth happens between the time steps. This has to be accounted for.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I refer to q32_land_expansion(j2,type32), q35_secdforest_expansion(j2,ac_est), v35_other_expansion(j2,ac_est), and v32_land_expansion(j2,ac_est). So, is the difference between the previous and current steps (expansion) handled with the ac_sub dynamic set?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. In the optimization, expansion can only happen in v35_other(j2,ac_est) and reduction can only happen in v35_other(j2,ac_sub). ac_est and ac_sub are dynamic sets, depeding on the time step lengths. Because of the age-class shifting ac_est will always be zero in p35_other(j2,ac_est). Therefore, for expansion only v35_other(j2,ac_est) is needed. For the reduction, both v35_other(j2,ac_sub) and p35_other(j2,ac_sub) are needed. The areas added in the previous time step are included in p35_other(j2,ac_sub). Same holds true for v32_land and v35_secdforest.

q35_other_expansion(j2) ..
v35_other_expansion(j2) =e=
sum(ac_est, v35_other(j2,ac_est));

q35_other_reduction(j2,ac_sub) ..
v35_other_reduction(j2,ac_sub) =e=
pc35_other(j2,ac_sub) - v35_other(j2,ac_sub);

q35_secdforest_expansion(j2,ac_est) ..
v35_secdforest_expansion(j2,ac_est) =e=
v35_secdforest(j2,ac_est) - pc35_secdforest(j2,ac_est);
q35_secdforest_expansion(j2) ..
v35_secdforest_expansion(j2) =e=
sum(ac_est, v35_secdforest(j2,ac_est));

q35_secdforest_reduction(j2,ac_sub) ..
v35_secdforest_reduction(j2,ac_sub) =e=
Expand Down
32 changes: 16 additions & 16 deletions modules/35_natveg/dynamic_feb21/postsolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac);
ov35_other(t,j,ac,"marginal") = v35_other.m(j,ac);
ov_landdiff_natveg(t,"marginal") = vm_landdiff_natveg.m;
ov35_other_expansion(t,j,ac,"marginal") = v35_other_expansion.m(j,ac);
ov35_other_expansion(t,j,"marginal") = v35_other_expansion.m(j);
ov35_other_reduction(t,j,ac,"marginal") = v35_other_reduction.m(j,ac);
ov35_secdforest_expansion(t,j,ac,"marginal") = v35_secdforest_expansion.m(j,ac);
ov35_secdforest_expansion(t,j,"marginal") = v35_secdforest_expansion.m(j);
ov35_secdforest_reduction(t,j,ac,"marginal") = v35_secdforest_reduction.m(j,ac);
ov35_primforest_reduction(t,j,"marginal") = v35_primforest_reduction.m(j);
ov35_hvarea_secdforest(t,j,ac,"marginal") = v35_hvarea_secdforest.m(j,ac);
Expand All @@ -33,9 +33,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
oq35_min_forest(t,j,"marginal") = q35_min_forest.m(j);
oq35_min_other(t,j,"marginal") = q35_min_other.m(j);
oq35_landdiff(t,"marginal") = q35_landdiff.m;
oq35_other_expansion(t,j,ac,"marginal") = q35_other_expansion.m(j,ac);
oq35_other_expansion(t,j,"marginal") = q35_other_expansion.m(j);
oq35_other_reduction(t,j,ac,"marginal") = q35_other_reduction.m(j,ac);
oq35_secdforest_expansion(t,j,ac,"marginal") = q35_secdforest_expansion.m(j,ac);
oq35_secdforest_expansion(t,j,"marginal") = q35_secdforest_expansion.m(j);
oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac);
oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j);
oq35_secdforest_regeneration(t,j,"marginal") = q35_secdforest_regeneration.m(j);
Expand All @@ -56,9 +56,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
ov35_secdforest(t,j,ac,"level") = v35_secdforest.l(j,ac);
ov35_other(t,j,ac,"level") = v35_other.l(j,ac);
ov_landdiff_natveg(t,"level") = vm_landdiff_natveg.l;
ov35_other_expansion(t,j,ac,"level") = v35_other_expansion.l(j,ac);
ov35_other_expansion(t,j,"level") = v35_other_expansion.l(j);
ov35_other_reduction(t,j,ac,"level") = v35_other_reduction.l(j,ac);
ov35_secdforest_expansion(t,j,ac,"level") = v35_secdforest_expansion.l(j,ac);
ov35_secdforest_expansion(t,j,"level") = v35_secdforest_expansion.l(j);
ov35_secdforest_reduction(t,j,ac,"level") = v35_secdforest_reduction.l(j,ac);
ov35_primforest_reduction(t,j,"level") = v35_primforest_reduction.l(j);
ov35_hvarea_secdforest(t,j,ac,"level") = v35_hvarea_secdforest.l(j,ac);
Expand All @@ -74,9 +74,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
oq35_min_forest(t,j,"level") = q35_min_forest.l(j);
oq35_min_other(t,j,"level") = q35_min_other.l(j);
oq35_landdiff(t,"level") = q35_landdiff.l;
oq35_other_expansion(t,j,ac,"level") = q35_other_expansion.l(j,ac);
oq35_other_expansion(t,j,"level") = q35_other_expansion.l(j);
oq35_other_reduction(t,j,ac,"level") = q35_other_reduction.l(j,ac);
oq35_secdforest_expansion(t,j,ac,"level") = q35_secdforest_expansion.l(j,ac);
oq35_secdforest_expansion(t,j,"level") = q35_secdforest_expansion.l(j);
oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac);
oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j);
oq35_secdforest_regeneration(t,j,"level") = q35_secdforest_regeneration.l(j);
Expand All @@ -97,9 +97,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
ov35_secdforest(t,j,ac,"upper") = v35_secdforest.up(j,ac);
ov35_other(t,j,ac,"upper") = v35_other.up(j,ac);
ov_landdiff_natveg(t,"upper") = vm_landdiff_natveg.up;
ov35_other_expansion(t,j,ac,"upper") = v35_other_expansion.up(j,ac);
ov35_other_expansion(t,j,"upper") = v35_other_expansion.up(j);
ov35_other_reduction(t,j,ac,"upper") = v35_other_reduction.up(j,ac);
ov35_secdforest_expansion(t,j,ac,"upper") = v35_secdforest_expansion.up(j,ac);
ov35_secdforest_expansion(t,j,"upper") = v35_secdforest_expansion.up(j);
ov35_secdforest_reduction(t,j,ac,"upper") = v35_secdforest_reduction.up(j,ac);
ov35_primforest_reduction(t,j,"upper") = v35_primforest_reduction.up(j);
ov35_hvarea_secdforest(t,j,ac,"upper") = v35_hvarea_secdforest.up(j,ac);
Expand All @@ -115,9 +115,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
oq35_min_forest(t,j,"upper") = q35_min_forest.up(j);
oq35_min_other(t,j,"upper") = q35_min_other.up(j);
oq35_landdiff(t,"upper") = q35_landdiff.up;
oq35_other_expansion(t,j,ac,"upper") = q35_other_expansion.up(j,ac);
oq35_other_expansion(t,j,"upper") = q35_other_expansion.up(j);
oq35_other_reduction(t,j,ac,"upper") = q35_other_reduction.up(j,ac);
oq35_secdforest_expansion(t,j,ac,"upper") = q35_secdforest_expansion.up(j,ac);
oq35_secdforest_expansion(t,j,"upper") = q35_secdforest_expansion.up(j);
oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac);
oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j);
oq35_secdforest_regeneration(t,j,"upper") = q35_secdforest_regeneration.up(j);
Expand All @@ -138,9 +138,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
ov35_secdforest(t,j,ac,"lower") = v35_secdforest.lo(j,ac);
ov35_other(t,j,ac,"lower") = v35_other.lo(j,ac);
ov_landdiff_natveg(t,"lower") = vm_landdiff_natveg.lo;
ov35_other_expansion(t,j,ac,"lower") = v35_other_expansion.lo(j,ac);
ov35_other_expansion(t,j,"lower") = v35_other_expansion.lo(j);
ov35_other_reduction(t,j,ac,"lower") = v35_other_reduction.lo(j,ac);
ov35_secdforest_expansion(t,j,ac,"lower") = v35_secdforest_expansion.lo(j,ac);
ov35_secdforest_expansion(t,j,"lower") = v35_secdforest_expansion.lo(j);
ov35_secdforest_reduction(t,j,ac,"lower") = v35_secdforest_reduction.lo(j,ac);
ov35_primforest_reduction(t,j,"lower") = v35_primforest_reduction.lo(j);
ov35_hvarea_secdforest(t,j,ac,"lower") = v35_hvarea_secdforest.lo(j,ac);
Expand All @@ -156,9 +156,9 @@ p35_other(t,j,ac) = v35_other.l(j,ac);
oq35_min_forest(t,j,"lower") = q35_min_forest.lo(j);
oq35_min_other(t,j,"lower") = q35_min_other.lo(j);
oq35_landdiff(t,"lower") = q35_landdiff.lo;
oq35_other_expansion(t,j,ac,"lower") = q35_other_expansion.lo(j,ac);
oq35_other_expansion(t,j,"lower") = q35_other_expansion.lo(j);
oq35_other_reduction(t,j,ac,"lower") = q35_other_reduction.lo(j,ac);
oq35_secdforest_expansion(t,j,ac,"lower") = q35_secdforest_expansion.lo(j,ac);
oq35_secdforest_expansion(t,j,"lower") = q35_secdforest_expansion.lo(j);
oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac);
oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j);
oq35_secdforest_regeneration(t,j,"lower") = q35_secdforest_regeneration.lo(j);
Expand Down
2 changes: 1 addition & 1 deletion modules/35_natveg/dynamic_feb21/presolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ if(s35_forest_damage=4,
);

* Distribution of damages correctly
pc35_secdforest(j,ac_est) = pc35_secdforest(j,ac_est) + sum(ac_sub,p35_disturbance_loss_secdf(t,j,ac_sub))/card(ac_est) + p35_disturbance_loss_primf(t,j)/card(ac_est);
pc35_secdforest(j,ac_est) = pc35_secdforest(j,ac_est) + sum(ac_sub,p35_disturbance_loss_secdf(t,j,ac_sub))/card(ac_est2) + p35_disturbance_loss_primf(t,j)/card(ac_est2);

pc35_secdforest(j,ac_sub) = pc35_secdforest(j,ac_sub) - p35_disturbance_loss_secdf(t,j,ac_sub);
pcm_land(j,"primforest") = pcm_land(j,"primforest") - p35_disturbance_loss_primf(t,j);
Expand Down
4 changes: 2 additions & 2 deletions modules/35_natveg/dynamic_feb21/scaling.gms
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
*** | MAgPIE License Exception, version 1.0 (see LICENSE file).
*** | Contact: [email protected]

v35_other_expansion.scale(j,ac) = 10e-3;
v35_other_expansion.scale(j) = 10e-3;
v35_other_reduction.scale(j,ac) = 10e-3;
v35_secdforest_expansion.scale(j,ac) = 10e-3;
v35_secdforest_expansion.scale(j) = 10e-3;
v35_secdforest_reduction.scale(j,ac) = 10e-3;
v35_hvarea_other.scale(j,ac) = 10e-3;
vm_cost_hvarea_natveg.scale(i)$(s35_hvarea = 1 OR s35_hvarea = 2) = 10e4;
4 changes: 2 additions & 2 deletions modules/44_biodiversity/bii_target/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
*' The Biodiversity Intactness Index (BII) is calculated at the level of 71 biomes.
*' The regional layer is needed for compatibility with the high resolution parallel optimization output script (scripts/output/extra/highres.R)

q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. v44_bii(i2,biome44)
q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 1e-10) .. v44_bii(i2,biome44)
=e=
(sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_biome(j2,biome44)));

*' For each of the 71 biomes, the BII has to meet a minium level based on `s44_bii_lower_bound`.
*' `v44_bii_missing` is a technical variable to maintain feasibility in case `v44_bii` cannot be increased.

q44_bii_target(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) ..
q44_bii_target(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 1e-10) ..
v44_bii(i2,biome44) + v44_bii_missing(i2,biome44) =g= sum(ct, p44_bii_lower_bound(ct,i2,biome44));

*' Costs accrue only for `v44_bii_missing`. In the best case costs should be zero or close to zero.
Expand Down