Skip to content

eq_rsc_INVlim infeasibility for geohydro_allkm when exogenous capacity exceeds m_rsc_dat * geo_discovery #84

@Yunzhi-Chen

Description

@Yunzhi-Chen

Summary

Infeasibility in eq_rsc_INVlim for geohydro_allkm for Western interconnect at county-level resolution. At p35023 in 2015, the right-hand side of eq_rsc_INVlim for geohydro_allkm_9 bin1 is negative by ~0.447 MW, so the model has no feasible value for INV_RSC (which is constrained to be ≥ 0).

Branch / commit: yc_pbitl (in ReEDS-2.0)

Case / scenario: cases_pbitl.csv → pbitl1_Western_Default_Stress

Solve year where it fails: 2015

Region / tech: county p35023, geohydro_allkm

Steps to reproduce:

  1. Check out branch yc_pbitl (which I think is consistent with ReEDS main on this constraint)
  2. Run county-level Western Interconnect
  3. Model is infeasible at the 2015 solve

Observation

eq_rsc_INVlim enforces:

m_rsc_dat * geo_discovery  >=  sum(INV_RSC) + capacity_exog_rsc

geo_discovery(i,r,t) is the fraction of the geothermal supply curve treated as "discovered" in year t (e.g., 0.10–0.15 in early years, monotonically increasing toward 1).

In p35023 in 2015, the left-hand side m_rsc_dat * geo_discovery evaluates to slightly less than the right-hand-side terms, producing a negative RHS of ~0.447 MW and making the constraint infeasible together with the prescribed builds requirement (eq_forceprescription_power).


Solutions considered

A. Inflate m_rsc_dat so RHS becomes positive — e.g., extend the year-aware capacity top-up logic from commit 77fb3a6 in b_inputs.gms to add enough geothermal m_rsc_dat to bin1 so prescribed builds always fit, after accounting for geo_discovery.

  • Pros: confirmed to resolve the p35023 infeasibility; works within the same framework used for wind and solar; no equation changes needed
  • Cons: the "extra" MW added to bin1 are made-up numbers that show up later in capacity reports; piling everything into bin1 can mislead the optimizer's cost ranking across bins; treats the symptom rather than addressing why the constraint produced negative RHS in the first place

B. Disable eq_rsc_INVlim for offending bins via flag_eq_rsc_INVlim

  • Pros: targeted; preserves data
  • Cons: bin loses physical upper bound; may concentrate prescribed builds in one bin; conceptually a patch

C. Set geo_discovery = 1 wherever a bin has negative RHS

  • Pros: trivially feasible
  • Cons: opens all bins in the region (geo_discovery is region-level, not bin-level); requires updating rsc_capacity_scalar to stay consistent

D. Reformulate eq_rsc_INVlim so geo_discovery is applied symmetrically to both sides of the supply-curve accounting, by also scaling the capacity_exog_rsc term by rsc_capacity_scalar. Equivalent form:

   (m_rsc_dat - exog) * geo_discovery  >=  sum(INV_RSC)
  • Pros: mathematically clean; no parameter fabrication; no special-case logic; backward-compatible (non-geothermal techs have rsc_capacity_scalar = 1, so unchanged); auto-converges as geo_discovery → 1
  • Cons: touches the model equation itself, so future maintainers must understand the new convention; the conceptual interpretation of geo_discovery relative to existing capacity should be confirmed with the modeling team

Suggested Solution: D

Two synchronized changes:

  1. c_supplymodel.gmseq_rsc_INVlim: multiply the capacity_exog_rsc term by rsc_capacity_scalar.
  2. d_solveoneyear.gmsrhs_eq_rsc_INVlim pre-solve calculation: apply the same geo_discovery factor to the exogenous term to match the new equation.

Validation

  • Re-run pbitl1_Western_Default_Stress through 2015 — confirm infeasibility is resolved
  • Spot-check INV_RSC.l for geohydro_allkm in p35023 across solve years to verify reasonable bin allocation
  • Run a baseline (non-pbitl) Standard Scenarios case to confirm no regression for non-geothermal technologies
  • Verify the geothermal branch of the 77fb3a6 pre-processing no longer adds capacity once D is in effect

Labels: bug

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions