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

grassland_apr22 preloop calibration #663

Open
wants to merge 7 commits into
base: develop
Choose a base branch
from

Conversation

mppalves
Copy link
Contributor

@mppalves mppalves commented Apr 14, 2024

🐦 Description of this PR 🐦

In this pull request, I've streamlined the code by removing redundant sets and added a calibration step for managed pasture areas to the preloop file after eliminating a similar step from calcPastureSuit.R's preprocessing. I've introduced a technical solution to prevent unrealistic grassland exchanges in the initial timestep by applying a conversion cost between rangelands and managed pastures only at the start. Additionally, I enhanced the module's description.

🔧 Checklist for PR creator 🔧

  • Label pull request from the label list.

    • Low risk: Simple bugfixes (missing files, updated documentation, typos) or changes in start or output scripts
    • Medium risk: Uncritical changes in the model core (e.g. moderate modifications in non-default realizations)
    • High risk: Critical changes in model core or default settings (e.g. changing a model default or adjusting a core mechanic in the model)
  • Self-review own code

    • No hard coded numbers and cluster/country/region names.
    • The new code doesn't contain declared but unused parameters or variables.
    • magpie4 R library has been updated accordingly and backwards compatible where necessary.
    • scenario_config.csv has been updated accordingly (important if default.cfg has been updated)
  • Document changes

    • Add changes to CHANGELOG.md
    • Where relevant, put In-code documentation comments
    • Properly address updates in interfaces in the module documentations
    • run goxygen::goxygen() and verify the modified code is properly documented
  • Perform test runs

    • Low risk:
      • Run a compilation check via Rscript start.R --> "compilation check"
    • Medium risk:
      • Run test runs via Rscript start.R --> "test runs"
      • Check logs for errors/warnings
    • High risk:
      • Run test runs via Rscript start.R --> "test runs"
      • Check logs for errors/warnings
      • Default run from the PR target branch for comparison
      • Provide relevant comparison plots (land-use, emissions, food prices, land-use intensity,...)

📉 Performance changes 📈

  • Current develop branch default : ** mins
  • This PR's default : ** mins

🚨 Checklist for reviewer 🚨

  • PR is labeled correctly
  • Code changes look reasonable
    • No hard coded numbers and cluster/country/region names.
    • No unnecessary increase in module interfaces
    • model behavior/performance is satisfactory.
  • Changes are properly documented
    • CHANGELOG is updated correctly
    • Updates in interfaces have been properly addressed in the module documentations
    • In-code documentation looks appropriate
  • content review done (at least 1)
  • RSE review done (at least 1)

@mppalves mppalves added enhancement New feature or request Minor Smaller modifications Low risk Low risk labels Apr 14, 2024
@mppalves mppalves self-assigned this Apr 14, 2024
@mppalves mppalves marked this pull request as ready for review April 14, 2024 10:19
@@ -32,6 +32,8 @@ i31_grassl_areas(t_all,j) Celullar grassland areas
i31_lambda_grass(t,i,grassland) Grassland Scaling factor for non-linear management calibration (1)
i31_grassl_yld_hist_reg(t,i,grassland) Grassland FAO yields per region at the historical referende year (tDM per ha)
i31_grass_hist_yld(t_all,i, grassland) FAO gassland yields (tDM per ha)
p31_pastr_suit_sf(j) Pasture suitability scaling factor (1)
pc31_grasslands_conversion_cost(t,j) Adjusted expansion costs to avoid unrealistic exchange between pastr and range in the first time step (USD05MER per ha)
Copy link
Member

Choose a reason for hiding this comment

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

the prefix "c" stands for current which means that it only contains the value of the current time step, but this parameter has time as a dimension.
Looking further down in the code I saw that you use this only to set a value in 1995 but have 0s for all other years. That does not look sensible to me. Lets have a discussion about what it does and why

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Hi Jan. This was a way I found to have a parameter that I could add a cost only to the first time step.
I could not think about another solution to apply this idea to the following equation.
Do you have any suggestion?
q31_expansion_cost(j2,grassland) ..
v31_cost_grass_expansion(j2, grassland) =g=
(v31_grass_area(j2, grassland) - pc31_grass(j2,grassland)) * sum(ct, pc31_grasslands_conversion_cost(ct,j2));

@@ -7,10 +7,11 @@


scalars
s31_cost_expansion Grasslands expansion costs (USD05MER per hectare) / 1 /
s31_cost_expansion Grasslands expansion costs (USD05MER per hectare) / 1000 /
Copy link
Member

Choose a reason for hiding this comment

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

why does this scalar not show up in the default.cfg?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

If we agree on adding a cost for land expansion I will add it the config in the next commit.

@@ -7,7 +7,20 @@


pc31_grass(j,grassland) = f31_LUH2v2("y1995",j,grassland);
pc31_grasslands_conversion_cost(t,j) = 0;
Copy link
Member

Choose a reason for hiding this comment

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

why are there costs in 1995 but not in any other year?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is the way I found to add cost just on the first time step.

As we have discussed, cost information on the conversion between managed pastures and rangelands on a global scale is not available. I also believe that based on our current definition of managed pastures and rangelands, they should be very small and heterogeneous across the globe. Therefore, I would prefer to have zero cost for land conversion costs and let the model decide the type of pastures to use based on the productivity needed, constrained by the "max managed pasture." The expansion costs for total pasture are already defined for the expansion of grasslands in general in the land module.

The need for this variable is only to assign a cost for the first time step, where for some inexplicable reason, even when managed pasture has a clear advantage in terms of productivity and no extra costs associated with it, CONOPT decides to revert the areas of managed pastures and rangelands, especially in Latin America and Africa, but to a lesser extent on other continents

Comment on lines +20 to +23
i31_manpast_suit(t_all,j)$(i31_manpast_suit(t_all,j) = 0) = f31_LUH2v2("y1995",j,"pastr");
p31_pastr_suit_sf(j) = (f31_LUH2v2("y1995",j,"pastr") / i31_manpast_suit("y1995",j))$(i31_manpast_suit("y1995",j) <> 0);
i31_manpast_suit(t_all,j) = i31_manpast_suit(t_all,j) * p31_pastr_suit_sf(j);
i31_manpast_suit(t_past,j) = f31_LUH2v2(t_past,j,"pastr");
Copy link
Member

Choose a reason for hiding this comment

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

I do not understand this part

Copy link
Contributor Author

Choose a reason for hiding this comment

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

i31_manpast_suit(t_all,j)$(i31_manpast_suit(t_all,j) = 0) = f31_LUH2v2("y1995",j,"pastr");

This replaces areas with 0 in the predicted i31_manpast_suit (managed pasture max) with the values from 1995. This is necessary because if a cluster has 0 managed pasture in the estimated (managed pasture max), it will always be 0. This 0 can appear as a result of applying the LUH method on a larger cell size, but this might not be the case from our historical reference dataset. To allow these areas with 0 to support pasture expansion, I allow them to have at least the same value they had in 1995, the beginning of our simulation period.

p31_pastr_suit_sf(j) = (f31_LUH2v2("y1995",j,"pastr") / i31_manpast_suit("y1995",j))$(i31_manpast_suit("y1995",j) <> 0);
Calculate a calibration factor to harmonize the i31_manpast_suit (managed pasture max) estimated to match LUH data in the year 1995.

i31_manpast_suit(t_all,j) = i31_manpast_suit(t_all,j) * p31_pastr_suit_sf(j);
Apply the calibration factor over the whole dataset.

i31_manpast_suit(t_past,j) = f31_LUH2v2(t_past,j,"pastr");
This last line ensures that the areas where we already have a pasture suitability calculated by LUH (t_past) use that instead of our estimates.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request Low risk Low risk Minor Smaller modifications
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants