From b91d8e0727ac3194e7aa201314e2420727c13e2c Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 12:10:37 -0600 Subject: [PATCH 01/37] move files to github.com --- b_inputs.gms | 57 ++++- c_mga.gms | 81 +++++++ cases.csv | 17 +- cplex.op2 | 2 +- cplex.op3 | 84 +++++++ cplex.op4 | 84 +++++++ cplex.opt | 2 +- d_solveoneyear.gms | 1 + docs/source/user_guide.md | 45 ++-- e_report.gms | 55 +++++ e_report_params.csv | 13 ++ input_processing/copy_files.py | 97 +++++---- .../employment_factor_inter_transmission.csv | 3 + .../employment_factor_plant_JEDI.csv | 206 ++++++++++++++++++ .../employment_factor_plant_Mayfield.csv | 206 ++++++++++++++++++ .../employment_factor_plant_Ram.csv | 206 ++++++++++++++++++ .../employment_factor_plant_Rutovitz.csv | 206 ++++++++++++++++++ inputs/sets/jtype.csv | 3 + reeds/log.py | 4 +- runbatch.py | 65 +++--- runfiles.csv | 14 +- 21 files changed, 1334 insertions(+), 117 deletions(-) create mode 100644 cplex.op3 create mode 100644 cplex.op4 create mode 100644 inputs/employment/employment_factor_inter_transmission.csv create mode 100644 inputs/employment/employment_factor_plant_JEDI.csv create mode 100644 inputs/employment/employment_factor_plant_Mayfield.csv create mode 100644 inputs/employment/employment_factor_plant_Ram.csv create mode 100644 inputs/employment/employment_factor_plant_Rutovitz.csv create mode 100644 inputs/sets/jtype.csv diff --git a/b_inputs.gms b/b_inputs.gms index 0d59e5626..cbbfebe16 100644 --- a/b_inputs.gms +++ b/b_inputs.gms @@ -160,6 +160,13 @@ $include inputs_case%ds%etype.csv $onlisting / ; +set jtype "job types used in model (construction and o&m jobs)" +/ +$offlisting +$include inputs_case%ds%jtype.csv +$onlisting +/ ; + Sets nercr "NERC regions" * https://www.nerc.com/pa/RAPA/ra/Reliability%20Assessments%20DL/NERC_LTRA_2021.pdf @@ -442,7 +449,6 @@ set evmc_storage(i) "ev flexibility as direct load control", evmc_shape(i) "ev flexibility as adoptable change to load from response to pricing", fossil(i) "fossil technologies" - fuel_cell(i) "fuel cell technologies", gas_cc_ccs(i) "techs that are gas combined cycle and have CCS", gas_cc(i) "techs that are gas combined cycle", gas_ct(i) "techs that are gas combustion turbine", @@ -752,10 +758,6 @@ if(Sw_H2Combustionupgrade = 0, ban(i)$[i_subsets(i,'h2_combustion')$upgrade(i)] = yes ; ) ; -if(Sw_FuelCell = 0, - ban(i)$i_subsets(i,'fuel_cell') = yes ; -) ; - if(Sw_LfillGas = 0, ban('lfill-gas') = yes ; ) ; @@ -975,7 +977,6 @@ evmc(i)$(not ban(i)) = yes$i_subsets(i,'evmc') ; evmc_storage(i)$(not ban(i)) = yes$i_subsets(i,'evmc_storage') ; evmc_shape(i)$(not ban(i)) = yes$i_subsets(i,'evmc_shape') ; fossil(i)$(not ban(i)) = yes$i_subsets(i,'fossil') ; -fuel_cell(i)$(not ban(i)) = yes$i_subsets(i,'fuel_cell') ; gas_cc_ccs(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc_ccs') ; gas_cc(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc') ; gas_ct(i)$(not ban(i)) = yes$i_subsets(i,'gas_ct') ; @@ -3522,12 +3523,11 @@ $offempty $onempty parameter trancap_init_itlgrp(itlgrp,itlgrpp,trtype) "--MW-- initial upper limit on interface flows between itlgrps" / -*** TEMPORARY 20260402: Skip itlgrp functionality until we fix it -* $offlisting -* $ondelim -* $include inputs_case%ds%trancap_init_itlgrp.csv -* $offdelim -* $onlisting +$offlisting +$ondelim +$include inputs_case%ds%trancap_init_itlgrp.csv +$offdelim +$onlisting / ; $offempty @@ -6597,6 +6597,39 @@ parameter z_rep_inv(t) = 0 ; z_rep_op(t) = 0 ; +*==================================== +* --- Employment Factors --- +*==================================== +* Employment factors of construction and operation of power plants +$onempty +Table employment_factor_plant(i,jtype) "--job-years/MW or job-years/MWh-- employment factors of power plants by technology and job type (construction and o&m jobs)" +$offlisting +$ondelim +$include inputs_case%ds%employment_factor_plant.csv +$offdelim +$onlisting +; +$offempty + +* Employment factors of transmission deployment and flow +parameter employment_factor_inter_transmission(jtype) "--job-years/MW or job-years/$M-- employment factors of transmission lines by job type (construction or o&m jobs)" +/ +$offlisting +$ondelim +$include inputs_case%ds%employment_factor_inter_transmission.csv +$offdelim +$onlisting +/ ; + +* If upgrade techs, construction employment factor is half +* Only apply this to non CCS upgrades if using JEDI EFs since JEDI already specifies CCS upgrade EFs +$ifthen.upgrade_ef %GSw_EmploymentFactor% == "JEDI" +employment_factor_plant(i,"construction")$[upgrade(i) + $(not ccs(i))] = employment_factor_plant(i,"construction") * 0.5 ; +$else.upgrade_ef +employment_factor_plant(i,"construction")$upgrade(i) = employment_factor_plant(i,"construction") * 0.5 ; +$endif.upgrade_ef + *================================================================================================ *== h- and szn-dependent sets and parameters (declared here, populated in d1_temporal_params) === diff --git a/c_mga.gms b/c_mga.gms index 8bf3841b2..3bbe72236 100644 --- a/c_mga.gms +++ b/c_mga.gms @@ -12,6 +12,19 @@ eq_MGA_CostEnvelope(t)$[tmodel(t)$Sw_MGA].. * --------------------------------------------------------------------------- $ifthen.mgaobj %GSw_MGA_Objective% == 'capacity' +$ifthen.mgasubobj %GSw_MGA_SubObjective% == 'all' +Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; +Variable MGA_OBJ "--MW-- Capacity of all technologies to be minimized/maximied" ; +eq_MGA_Objective$Sw_MGA.. + MGA_OBJ + =e= + sum{(i,v,r,t) + $[tmodel(t) + $valcap(i,v,r,t)], + CAP(i,v,r,t) + } +; +$else.mgasubobj Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; Variable MGA_OBJ "--MW-- Capacity of technology to be minimized/maximied" ; eq_MGA_Objective$Sw_MGA.. @@ -25,6 +38,23 @@ eq_MGA_Objective$Sw_MGA.. } ; +$endif.mgasubobj +* --------------------------------------------------------------------------- + +$elseif.mgaobj %GSw_MGA_Objective% == 'generation' +Equation eq_MGA_Objective "--MW-- Defines generation for MGA" ; +Variable MGA_OBJ "--MWh-- Generation of technology to be minimized/maximied" ; +eq_MGA_Objective$Sw_MGA.. + MGA_OBJ + =e= + sum{(i,v,r,h,t) + $[tmodel(t) + $valgen(i,v,r,t) + $%GSw_MGA_SubObjective%(i)], + GEN(i,v,r,h,t) * hours(h) + } +; + * --------------------------------------------------------------------------- $elseif.mgaobj %GSw_MGA_Objective% == 'transmission' @@ -74,4 +104,55 @@ eq_MGA_Objective$Sw_MGA.. * --------------------------------------------------------------------------- +$elseif.mgaobj %GSw_MGA_Objective% == 'employment' +Equation eq_MGA_Objective "--job-years-- Defines number of job-years for MGA" ; +Variable MGA_OBJ "--job-years-- Total job-years to be minimized/maximized" ; +eq_MGA_Objective$Sw_MGA.. + MGA_OBJ + =e= + sum{(i,v,r,t) + $[tmodel(t) + $valcap(i,v,r,t)], + CAP(i,v,r,t) * pvf_onm(t) * employment_factor_plant(i,"fom") + } + + sum{(i,v,r,h,t) + $[tmodel(t) + $valgen(i,v,r,t)], + GEN(i,v,r,h,t) * pvf_onm(t) * hours(h) * employment_factor_plant(i,"vom") + } + + sum{(i,v,r,t) + $[tmodel(t) + $valinv(i,v,r,t)], + INV(i,v,r,t) * pvf_capital(t) * employment_factor_plant(i,"construction") + } + + # AC construction employment formula here is slightly different than in + # e_report.gms as only cumulative term TRAN_CAPEX_BINS is included here vs + # annual term used in e_report.gms + + sum{(r,rr,tscbin,t) + $[tmodel(t) + $routes_inv(r,rr,"AC",t) + $tsc_binwidth(r,rr,tscbin)], + trans_cost_cap_fin_mult(t) + * ((TRAN_CAPEX_BINS(r,rr,tscbin,t)) + * pvf_capital(t) + * employment_factor_inter_transmission("construction"))} + + + sum{trtype + $[routes_inv(r,rr,trtype,t) + $(not aclike(trtype))], + trans_cost_cap_fin_mult(t) + * transmission_cost_nonac(r,rr,trtype) + * INVTRAN(r,rr,trtype,t) + * employment_factor_inter_transmission("construction") / 2 } + + + sum{(r,rr,trtype,t) + $[tmodel(t) + $routes(r,rr,trtype,t)], + CAPTRAN_ENERGY(r,rr,trtype,t) + * pvf_onm(t) + * employment_factor_inter_transmission("fom") } +; + + $endif.mgaobj diff --git a/cases.csv b/cases.csv index 9d0752e77..0dc5bb244 100644 --- a/cases.csv +++ b/cases.csv @@ -15,7 +15,6 @@ plantchar_biopower,Biopower generators cost and performance characteristics (inp plantchar_coal_ccs,Coal CCS generators cost and performance characteristics (inputs\plant_characteristics\{plantchar_coal_ccs}.csv). Options start with 'coal-ccs_' and the switch should be set to the entire file name (ex: coal-ccs_ATB_2024_moderate),coal-ccs_ATB_(2024)_(conservative|moderate|advanced),coal-ccs_ATB_2024_moderate, plantchar_coal,Coal generators cost and performance characteristics (inputs\plant_characteristics\{plantchar_coal}.csv). Options start with 'coal_' and the switch should be set to the entire file name (ex: coal_ATB_2024_moderate),coal_ATB_(2024)_(moderate),coal_ATB_2024_moderate, plantchar_csp,CSP cost and performance characteristics (inputs\plant_characteristics\{plantchar_csp}.csv). The options for plantchar_csp start with 'csp_' and the switch should be set to the entire file name (ex: csp_ATB_2024_advanced),csp_ATB_(2023|2024)_(conservative|moderate|advanced),csp_ATB_2024_moderate, -plantchar_fuelcell,Fuel cell cost and performance characteristics (inputs\plant_characteristics\{plantchar_fuelcell}.csv). The options for plantchar_fuelcell start with 'fuelcell_' and the switch should be set to the entire file name (ex: fuelcell_ATB_2024_advanced),fuelcell_ATB_2024_(moderate|advanced),fuelcell_ATB_2024_moderate, plantchar_gas_ccs,Natural gas CCS generator cost and performance characteristics (inputs\plant_characteristics\{plantchar_gas_ccs}.csv). Options start with 'gas-ccs' and the switch should be set to the entire file name (ex: gas-ccs_ATB_2024_moderate),gas-ccs_ATB_(2024)_(conservative|moderate|advanced),gas-ccs_ATB_2024_moderate, plantchar_gas,Natural gas generator cost and performance characteristics (inputs\plant_characteristics\{plantchar_gas}.csv). Options start with 'gas_' and the switch should be set to the entire file name (ex: gas_ATB_2024_moderate),gas_ATB_(2024)_(moderate),gas_ATB_2024_moderate, plantchar_geo,Geothermal cost setting (inputs\plant_characteristics\{plantchar_geo}.csv).The options for plantchar_geo start with 'geo_' and the switch should be set to the entire file name (ex: geo_ATB_2023_conservative),geo_ATB_(2023|2024)_(conservative|moderate|advanced),geo_ATB_2024_moderate, @@ -47,7 +46,7 @@ retscen,Retirement Scenario,Nuke60RetireYear; Nuke80RetireYear; NukeEarlyRetireY supplycurve,Wind and Solar Supply Curves,default; 0; naris; 2018,default, uraniumscen,Uranium price scenario,AEO_(2023|2025)_reference,AEO_2025_reference, GSw_Region,Specify column from inputs/userinput/modeled_regions.csv or from {column of hierarchy.csv}/{period-delimited entries to keep from that column},N/A,country/USA, -GSw_ZoneSet,Set of geospatial zones to use as balancing areas (described in inputs/zones/README.md),^(z48|z54|z69|z132|z134|z3109|UTcounty|PJMcounty)$,z132 +GSw_RegionResolution,Specify the spatial resolution of modeled regions,county; ba; aggreg; mixed,aggreg, capcredit_hierarchy_level,Select level at which to aggregate net load for capacity-credit calculation,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region,transreg, construction_schedules_suffix,File suffix for construction schedules,default,default, construction_times_suffix,File suffix for construction times by technology,default,default, @@ -134,9 +133,9 @@ GSw_distpv,Turn on/off distpv,0;1,1, GSw_DRShed, switch to turn on/off demand response shed resource,0;1,0, GSw_EFS_Flex,Switch for turning EFS load flexibility on or off,0,0, GSw_EFS2_FlexCase,"Case used for electrification flex_type - format is {1}_{2}, where 1 in [EFS_REFERENCE, EFS_MEDIUM, EFS_HIGH, EFS_Clean2035] and 2 in [Baseflex, Currentflex, Enhancedflex, Uberflex1, Uberflex2]",N/A,EFS_MEDIUM_EnhancedflexStretch2046, +GSw_EmploymentFactor,Employment factor - options to choose from are factor from JEDI model and two papers,JEDI; Mayfield ;Rutovitz ;Ram ,JEDI, GSw_EVMC,Turn on adoptable EV managed charging,0; 1,0, GSw_ForcePrescription,Turn on/off forced prescriptions - turning off will allow unlimited but not free builds in historical years,0; 1,1, -GSw_FuelCell,Turn on/off fuel cells (natural gas / H2) as a technology option,0; 1,0, GSw_FutureHydCF_RepYears,_-delimited years of historical hydro plant data from which to calculate capacity factors representing future hydro,N/A,2007_2008_2009_2010_2011_2012_2013_2016_2017_2018_2019_2020_2021_2022, GSw_GasCurve,"Select natural gas supply curve (0 = cendiv, 1 = national + cendiv, 2 = static, 3 = national)",0; 1; 2; 3,1, GSw_GasCC_H_1x1,Turn on/off both gas-CC_H_1x1 and gas-CC_H_1x1-CCS_mod/max plant options,0; 1,0, @@ -147,7 +146,8 @@ GSw_GenMandate,Turn on/off national Gen Requirement. 2 turns on and applies cons GSw_GenMandateList,Select technology list for national generation standard (see inputs/national_generation/nat_gen_tech_frac.csv),RE; Nuclear; NuclearCCS,RE, GSw_GenMandateScen,Select trajectory for national generation standard (see inputs/national_generation/gen_mandate_trajectory.csv),N/A,100_2035, GSw_Geothermal,"Geothermal can be turned off [0], left to the default representation [1], or have an extended representation [2]",0; 1; 2,1, -GSw_gopt,Select opt file to be used,N/A,1, +GSw_gopt,Select opt file to be used,^[1-4]$,1, +GSw_gopt_mga,Select opt file to be used for MGA runs,^[1-4]$,3, GSw_GrowthAbsCon,Turn on/off absolute growth constraint,0; 1,0, GSw_GrowthConLastYear,The last year that the growth constraint (GSw_GrowthAbsCon) is applied (if it is turned on),int,2026, GSw_GrowthPenalties,Turn on/off relative growth penalties,0; 1,0, @@ -169,6 +169,7 @@ GSw_H2Combustion,Switch to turn on/off H2CT and H2CC techs,0; 1,1, GSw_H2Combustionupgrade,Indicate whether to allow gas-CC and gas-CT to upgrade to H2-CT and H2-CC,0; 1,1, GSw_H2CombinedCycle,Indicate whether to allow H2-CC,0; 1,1, GSw_H2LeakageScen,Scenarios of H2 leakage rates from upstream and process of producing electricity by technology; scenario name options from emission_constraints/h2_leakage_rate.csv,N/A,Fan_et_al_2022/Med, +GSw_HierarchyFile,Indicate the version of the hierarchy file to use (default=hierarchy.csv with 132 zones),default; agg125; agg69; agg54,default, GSw_HourlyChunkAggMethod,How to aggregate CF and load within the chunks specified by GSw_HourlyChunkLengthRep (if set to anything other than 'mean' this switch overrides GSw_PRM_StressLoadAggMethod) (ties for mid are broken by the later hour; i.e. for 4-hour chunks and a setting of 'mid' the 3rd hour is used) (if an integer is provided the index starts at 1; i.e. 1 is the 1st hour),(mean|mid|\d),mean, GSw_HourlyChunkLengthRep,Length of representative-period dispatch timeslices in hours; must be divisible into 24,1; 2; 3; 4; 6; 8; 12; 24,3, GSw_HourlyChunkLengthStress,Length of stress-period dispatch timeslices in hours; must be divisible into 24,1; 2; 3; 4; 6; 8; 12; 24,3, @@ -206,7 +207,7 @@ GSw_Int_CC,"Select intertemporal CC method (0=average undifferentiated, 1=averag GSw_Int_Curt,"Select intertemporal Curt method (0=average undifferentiated, 1=average differentiated , 2=marginal undifferentiated, 3=marginal differentiated)",0; 1; 2; 3,0, GSw_InterDayLinkage,Turn on (1) or off (0) the ability for interday storage techs (specified in tech-subset-table.csv) to shift energy between representative days (non-interday techs are unaffected),0; 1,0, GSw_LfillGas,Turn on/off lfill-gas,0; 1,1, -GSw_LoadProfiles,Name of demand profile matching `inputs/profiles_demand/demand_{GSw_LoadProfiles}.h5` OR an absolute filepath to an EER-formatted demand .h5 file,^(historic|EFS_REFERENCE|EFS_MEDIUM|EFS_HIGH|EFS_Clean2035|EFS_Clean2035clip1pct|EFS_Clean2035_LTS|EFS_MEDIUMStretch2040|EFS_MEDIUMStretch2046|EER2023_Baseline_AEO2022|EER2023_IRAlow|EER2023_IRAmoderate|EER2023_100by2050|EER2025_Baseline_AEO2023|EER2025_IRAlow|EER2025_100by2050|\/.+|[a-zA-Z]:[\\\/].+)$,EER2025_IRAlow, +GSw_LoadProfiles,Name of demand profile matching `inputs/profiles_demand/demand_{GSw_LoadProfiles}.h5` OR an absolute filepath to an EER-formatted demand .h5 file,^(historic|EFS_REFERENCE|EFS_MEDIUM|EFS_HIGH|EFS_Clean2035|EFS_Clean2035clip1pct|EFS_Clean2035_LTS|EFS_MEDIUMStretch2046|EER2023_Baseline_AEO2022|EER2023_IRAlow|EER2023_IRAmoderate|EER2023_100by2050|EER2025_Baseline_AEO2023|EER2025_IRAlow|EER2025_100by2050|\/.+|[a-zA-Z]:[\\\/].+)$,EER2025_IRAlow, GSw_LoadAllocationMethod,"How to allocate state-level load to model regions ('population' uses each region's share of state population, 'state_lpf' uses county-state load participation factors calculated from the NARIS nodal network dataset)",population; state_lpf,population, GSw_Loadpoint,Switch to use or disable a loadpoint for the intertemporal solve after the first iteration,0; 1,0, GSw_LoadSiteCF,Annual capacity factor of optimally sited load (if 0 then optimally sited load is turned off; if between 0 and 1 then load is flexible (obeying stress period weight); if 1 then load is inflexible),float,0, @@ -217,8 +218,8 @@ GSw_MaxDailyCF,Turn on/off daily maximum capacity factor constraint,0; 1,1, GSw_MethaneLeakageScen,Fractional leakage of methane from upstream natural gas production: either float (fixed rate) or scenario name from emission_constraints/methane_leakage_rate.csv,N/A,Alvarez2018_30by2030, GSw_MGA_CostDelta,MGA: Fraction by which to allow objective function to increase when using Modeling to Generate Alternatives (MGA is turned off if set to 0; a common choice for MGA is 0.01),float,0, GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, -GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|transmission|rasharing|co2),rasharing, -GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity of (only used for GSw_MGA_Objective=capacity),(battery|ccs|coal|dac|fossil|gas|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind),storage, +GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, +GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind|all),storage, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, GSw_MingenFixed,Turn on/off fixed min-gen constraints,0; 1,1, @@ -326,7 +327,7 @@ GSw_TransCostMult,Multiplier for bulk BA-BA transmission costs,float,1, GSw_TransHurdleLevel1,Apply hurdle rates from inputs/transmission/cost_hurdle_intra.csv between regions at the specified hierarchy level,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region; hurdlereg,transgrp, GSw_TransHurdleLevel2,Apply hurdle rates from inputs/transmission/cost_hurdle_intra.csv between regions at the specified hierarchy level,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region; hurdlereg,hurdlereg, GSw_TransHurdleRate,Turn on (1) or off (0) hurdle rates between hierarchy regions as defined by GSw_TransHurdleLevel1/GSw_TransHurdleLevel2 and inputs/transmission/cost_hurdle_intra.csv,0; 1,0, -GSw_TransNetworkSource,Network source for the initial transmission network used in the model,NARIS2024,NARIS2024, +GSw_TransNetworkSource,Network source for the initial transmission network used in the model,NARIS2024; REFS2009,NARIS2024, GSw_TransRestrict,hierarchy level within which to allow new transmission lines,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region,country, GSw_TransScen,Transmission expansion scenario (options in inputs/transmission),N/A,default, GSw_TransSquiggliness,Transmission distance multiplier to approximate the squigglier paths followed by actual lines (only applied to NEW lines),float,1, diff --git a/cplex.op2 b/cplex.op2 index e01f19dd1..48862a654 100644 --- a/cplex.op2 +++ b/cplex.op2 @@ -68,4 +68,4 @@ barcolnz 100 * bardisplay 2 *** solutiontype (integer): type of solution (basic or non basic): 0 does basic with crossover, 2 skips crossover -* solutiontype 2 +* solutiontype 2 \ No newline at end of file diff --git a/cplex.op3 b/cplex.op3 new file mode 100644 index 000000000..090894160 --- /dev/null +++ b/cplex.op3 @@ -0,0 +1,84 @@ +*** https://www.gams.com/latest/docs/S_CPLEX.html +*** threads (integer): global default thread count +threads = 8 + +*** lpmethod (integer): algorithm to be used for LP problems [4 = barrier] +lpmethod = 4 + +*** advind (integer): advanced basis use [0 = do not use advanced basis] +advind 0 + +*** reslim (integer): solve time limit in seconds [172800 seconds = 2 days] +reslim 172800 + +*** scaind (integer): matrix scaling on/off [1 = modified, more aggressive scaling method] +scaind 1 + +*** aggind (integer): aggregator on/off [5 = aggregator will be applied 5 times] +aggind 5 + +*** iis (boolean): run the conflict refiner also known as IIS finder if the problem is infeasible +iis 1 + +*** eprhs (float): feasibility tolerance [default = 1e-6] +eprhs = 1e-5 + +*** epopt (float): optimality tolerance [default = 1e-6] +epopt = 1e-6 + +*** memoryemphasis (boolean): reduces use of memory but writes TBs of files to disk +memoryemphasis 0 + +*** epmrk (float): Markowitz pivot tolerance +*epmrk = 0.1 + +*** barepcomp (float): tolerance on complementarity for convergence of the barrier algorithm [default 1e-8] +barepcomp = 1e-8 + +*############################################################################################ +*## The settings below can reduce solve time substantially, but their impacts on the solution +*## have not yet been fully characterized, and some of them might do nothing. Use at your own risk. +*## Some background details are available at +*## https://www.slideshare.net/IEA-ETSAP/improving-the-solution-time-of-times-by-playing-with-cplexbarrier +*## https://iea-etsap.org/webinar/CPLEX%20options%20for%20running%20TIMES%20models.pdf +*## This setting is specifically for MGA runs which have difficulties with cplex.opt and cplex.op2 +*## This setting differs from cplex.opt and cplex.op2 in that it: 1. sets predual = -1, which does not +*## dual to optimizer to reduce time; 2. sets barcrossalg = 1, which only performs primal crossover; +*## and 3, sets baralg = 3 + +*** numericalemphasis (boolean): emphasizes precision in numerically unstable or difficult problems [default 0] +* numericalemphasis 1 + +*** depind (integer): dependency checker on/off. 3 = turn on at beginning and end of preprocessing [default -1] +* depind 3 + +*** barcolnz (integer): specifies the number of entries in columns to be considered as dense [default 0] +*** 0 lets CPLEX choose; values ranging from 30-300 can sometimes shorten runtime +barcolnz 100 + +*** barorder (integer): row ordering algorithm selection. 1 = approximate minimum degree (AMD) [default 0] +* barorder 1 + +*** baralg (integer): barrier algorithm selection. 1 = infeasibility-estimate start, 3 = standard barrier [default 0] +baralg 3 + +*** barstartalg (integer): barrier starting point algorithm. 2 = default primal, estimate dual [default 1] +* barstartalg 2 + +*** scaind (described above) +* scaind 0 + +*** Can use bardisplay=2 to print more diagnostics about the barrier method and choice of barcolnz +* bardisplay 2 + +*** solutiontype (integer): type of solution (basic or non basic): 0 does basic with crossover, 2 skips crossover +* solutiontype 2 + +*** predual (integer) [default = 0]: 0 automatic, 1 gives dual to optimizer, -1 does not give dual to optimizer +predual = -1 + +*** barcrossalg (integer) [default = 0]: 0 automatic, 1 primal crossover, 2 dual crossver +barcrossalg = 1 + +*** ppriind (integer): Pricing algorithm +*ppriind = 3 diff --git a/cplex.op4 b/cplex.op4 new file mode 100644 index 000000000..53cd53891 --- /dev/null +++ b/cplex.op4 @@ -0,0 +1,84 @@ +*** https://www.gams.com/latest/docs/S_CPLEX.html +*** threads (integer): global default thread count +threads = 8 + +*** lpmethod (integer): algorithm to be used for LP problems [4 = barrier] +lpmethod = 4 + +*** advind (integer): advanced basis use [0 = do not use advanced basis] +advind 0 + +*** reslim (integer): solve time limit in seconds [172800 seconds = 2 days] +reslim 172800 + +*** scaind (integer): matrix scaling on/off [1 = modified, more aggressive scaling method] +scaind 1 + +*** aggind (integer): aggregator on/off [5 = aggregator will be applied 5 times] +aggind 5 + +*** iis (boolean): run the conflict refiner also known as IIS finder if the problem is infeasible +iis 1 + +*** eprhs (float): feasibility tolerance [default = 1e-6] +eprhs = 1e-5 + +*** epopt (float): optimality tolerance [default = 1e-6] +epopt = 1e-6 + +*** memoryemphasis (boolean): reduces use of memory but writes TBs of files to disk +memoryemphasis 0 + +*** epmrk (float): Markowitz pivot tolerance +*epmrk = 0.1 + +*** barepcomp (float): tolerance on complementarity for convergence of the barrier algorithm [default 1e-8] +barepcomp = 1e-8 + +*############################################################################################ +*## The settings below can reduce solve time substantially, but their impacts on the solution +*## have not yet been fully characterized, and some of them might do nothing. Use at your own risk. +*## Some background details are available at +*## https://www.slideshare.net/IEA-ETSAP/improving-the-solution-time-of-times-by-playing-with-cplexbarrier +*## https://iea-etsap.org/webinar/CPLEX%20options%20for%20running%20TIMES%20models.pdf +*## This setting is specifically for MGA runs which have difficulties with cplex.opt, cplex.op2, and cplex.op3 +*## This setting differs from cplex.opt and cplex.op2 in that it: 1. sets predual = -1, which does not +*## dual to optimizer to reduce time; 2. sets barcrossalg = 1, which only performs primal crossover. +*## It also differs from cplex.op3 in that it keeps baralg at default value (=0) + +*** numericalemphasis (boolean): emphasizes precision in numerically unstable or difficult problems [default 0] +* numericalemphasis 1 + +*** depind (integer): dependency checker on/off. 3 = turn on at beginning and end of preprocessing [default -1] +* depind 3 + +*** barcolnz (integer): specifies the number of entries in columns to be considered as dense [default 0] +*** 0 lets CPLEX choose; values ranging from 30-300 can sometimes shorten runtime +barcolnz 100 + +*** barorder (integer): row ordering algorithm selection. 1 = approximate minimum degree (AMD) [default 0] +* barorder 1 + +*** baralg (integer): barrier algorithm selection. 1 = infeasibility-estimate start, 3 = standard barrier [default 0] +* baralg 3 + +*** barstartalg (integer): barrier starting point algorithm. 2 = default primal, estimate dual [default 1] +* barstartalg 2 + +*** scaind (described above) +* scaind 0 + +*** Can use bardisplay=2 to print more diagnostics about the barrier method and choice of barcolnz +* bardisplay 2 + +*** solutiontype (integer): type of solution (basic or non basic): 0 does basic with crossover, 2 skips crossover +* solutiontype 2 + +*** predual (integer) [default = 0]: 0 automatic, 1 gives dual to optimizer, -1 does not give dual to optimizer +predual = -1 + +*** barcrossalg (integer) [default = 0]: 0 automatic, 1 primal crossover, 2 dual crossver +barcrossalg = 1 + +*** ppriind (integer): Pricing algorithm +*ppriind = 3 diff --git a/cplex.opt b/cplex.opt index 0a6c3ea68..0cc4443fe 100644 --- a/cplex.opt +++ b/cplex.opt @@ -68,4 +68,4 @@ barcolnz 30 * bardisplay 2 *** solutiontype (integer): type of solution (basic or non basic): 0 does basic with crossover, 2 skips crossover -* solutiontype 2 +* solutiontype 2 \ No newline at end of file diff --git a/d_solveoneyear.gms b/d_solveoneyear.gms index b3484a805..41ea9390c 100644 --- a/d_solveoneyear.gms +++ b/d_solveoneyear.gms @@ -267,6 +267,7 @@ $ifthene.mga %GSw_MGA_CostDelta%>0 $ifthene.mga1 %cur_year%>=%GSw_StartMarkets% *## Activate MGA mode Sw_MGA = 1 ; +ReEDSmodel.optfile = %GSw_gopt_mga% ; solve ReEDSmodel %GSw_MGA_Direction%imizing MGA_OBJ using lp ; *## Deactivate MGA mode Sw_MGA = 0 ; diff --git a/docs/source/user_guide.md b/docs/source/user_guide.md index dd5483eab..7f0864f97 100644 --- a/docs/source/user_guide.md +++ b/docs/source/user_guide.md @@ -36,7 +36,7 @@ Here is partial list of remotely hosted files used by ReEDS: - Switch to `GSw_HourlyType=wek`, which increases the length of the periods from 1 day to 5 days. If all the other switches are left at their defaults, switching to `wek` would increase the coverage from 42 days to 5*42=210 days. - Reduce `GSw_HourlyClusterRegionLevel` to something smaller than transreg (like `st`), and then increase `GSw_HourlyNumClusters` - Switch to `GSw_HourlyClusteAlgorithm=hierarchical` and then increase `GSw_HourlyNumClusters` (although that's less desirable, because hierarchical clustering doesn't do as good of a job of reproducing the actual spatial distribution of CF and load) - - Switch to `Gsw_HourlyType=year`. Although if you're running for the whole US you'll need to turn on region aggregation (`GSw_ZoneSet` in [`z54` or `z69`]) for it to solve. + - Switch to `Gsw_HourlyType=year`. Although if you're running for the whole US you'll need to turn on region aggregation (`GSw_RegionResolution=aggreg` and `GSw_HierarchyFile` in [`default` or `agg1`, or `agg2` or `agg3`]) for it to solve. - `GSw_HourlyClusterAlgorithm` - If set to 'hierarchical', then hierarchical clustering is used via @@ -47,14 +47,15 @@ Here is partial list of remotely hosted files used by ReEDS: ``` - If set to 'optimized', then a two-step custom optimization is performed using the `hourly_repperiods.optimize_period_weights()` and `hourly_repperiods.assign_representative_days()` functions to minimize the deviation in regional load and PV/wind CF between the weighted representative periods and the full year. - - If set to a string containing the substring 'user', then instead of optimizing the choice of representative periods for this run, the model reads a user-supplied file at `inputs/temporal/period_szn_{GSw_HourlyClusterAlgorithm}.csv`. - - So if you want to use the example period:szn map, set `GSw_HourlyClusterAlgorithm=user` and provide `inputs/temporal/period_szn_user.csv`. - - If you want to specify a different period:szn map, then create a file with your label in the filename and set `GSw_HourlyClusterAlgorithm` to that same label (which must contain the substring 'user'). For example, for `GSw_HourlyClusterAlgorithm=user_myname_20230130`, provide `inputs/temporal/period_szn_user_myname_20230130.csv`. - - Make sure the settings for `GSw_HourlyType` and `GSw_HourlyWeatherYears` match your user-defined map. For example, if your user-defined map includes 365 representative days for weather year 2012, then set `GSw_HourlyType=day` and `GSw_HourlyWeatherYears=2012`. + - If set to a string containing the substring 'user', then instead of optimizing the choice of representative periods for this run, we read them from the inputs/temporal/period_szn_user.csv file. + - The scenario name is in the first column, labeled 'scenario'. ReEDS will use rows with the same label as `GSw_HourlyClusterAlgorithm`. + - So if you want to use the example period:szn map, just set `GSw_HourlyClusterAlgorithm=user`. + - If you want to specify a different period:szn map, then add your mapping at the bottom of inputs/temporal/period_szn_user.csv with a unique scenario name in the 'scenario' column, and set `GSw_HourlyClusterAlgorithm` to your unique scenario name, *which must contain the substring 'user'*. (For example, I could use a mapping called 'user_myname_20230130' by adding my period:szn map to inputs/temporal/period_szn_user.csv with 'user_myname_20230130' in the 'scenario' column and setting `GSw_HourlyClusterAlgorithm=user_myname_20230130`.) + - Make sure the settings for `GSw_HourlyType` and `GSw_HourlyWeatherYears` match your user-defined map. For example, if your 'user_myname_20230130' map includes 365 representative days for weather year 2012, then set `GSw_HourlyType=day` and `GSw_HourlyWeatherYears=2012`. - You can feed the period:szn mapping from a completed run into the inputs folder of your repo to force ReEDS to use the same representative or stress periods. More detail can be found in the postprocessing tools guide. -- `GSw_PRM_StressThreshold`: The default setting of 'transgrp_1_EUE_sum' means a threshold of "**1** ppm NEUE in each **transgrp**", with stress periods selected by the daily **sum** of **EUE** within each **transgrp**. +- `GSw_PRM_StressThreshold`: The default setting of 'transgrp_10_EUE_sum' means a threshold of "**10** ppm NEUE in each **transgrp**", with stress periods selected by the daily **sum** of **EUE** within each **transgrp**. - The first argument can be selected from ['country', 'interconnect', 'nercr', 'transreg', 'transgrp', 'st', 'r'] and specifies the hierarchy level within which to compare RA performance against the threshold. - The second argument can be any float and specifies the RA performance threshold in parts per million [ppm]. - The third argument can be 'NEUE' or 'EUE', specifying which metric to use when selecting stress periods. If set to 'NEUE' the model will add stress periods with the largest **fraction** of dropped load; if set to 'EUE' the model will add stress periods with the largest **absolute MWh** of dropped load. @@ -163,7 +164,7 @@ The low cost scenario assumes further declines from 2030 to 2050. Fixed O&M values are assumed to be 5% of CAPEX (source: ) Electrolyzer performance (efficiency) as well as SMR cost and performance assumptions are derived from assumptions [H2A: Hydrogen Analysis Production Models](https://www.nrel.gov/hydrogen/h2a-production-models.html), with guidance from Paige Jadun. -See original input assumptions in the [ReEDS_Input_Processing repo](https://github.com/ReEDS-Model/ReEDS_Input_Processing/blob/main/hydrogen/costs/H2ProductionCosts-20210414.xlsx). +See original input assumptions in the [ReEDS-2.0_Input_Processing repo](https://github.nrel.gov/ReEDS/ReEDS-2.0_Input_Processing/blob/main/H2/costs/H2ProductionCosts-20210414.xlsx). Note that SMR costs are currently in 2018$ and electrolyzer costs are in 2022$. @@ -182,7 +183,7 @@ Note that SMR costs are currently in 2018$ and electrolyzer costs are in 2022$. | Storage | Electric load | MWh/metric ton | The values in `H2_transport_and_storage_costs.csv` are based on raw data provided from the SERA model by Paige Jadun. -The raw data are formatted by the [`process-h2-inputs.py` script](https://github.com/ReEDS-Model/ReEDS_Input_Processing/blob/main/hydrogen/process-h2-inputs.py) in the input processing repository. +The raw data are formatted by the [`process-h2-inputs.py` script](https://github.nrel.gov/ReEDS/ReEDS-2.0_Input_Processing/blob/main/H2/process-h2-inputs.py) in the input processing repository. ### Intra-Regional Hydrogen Transport Cost @@ -379,9 +380,29 @@ In addition, the `GSw_ReducedResource` switch allows for a uniform reduction of ## Transmission +Most transmission input files are in the `inputs/transmission/` folder. + +### Input files + +1. *cost_hurdle_country.csv*: Indicates the hurdle rate for transmission flows between USA/Canada and USA/Mexico. +1. *rev_transmission_basecost.csv*: Base transmission costs (before terrain multipliers) used in reV. Sources for numeric values are: + 1. TEPPC: + 1. SCE: + 1. MISO: + 1. A more recent guide with a working link (as of 20230227) is available at . + 1. Southeast: Private communication with a representative Southeastern utility +1. *transmission_capacity_future_baseline.csv*: Historically installed (since 2010) and currently planned transmission capacity additions. +1. *transmission_capacity_future_{`GSw_TransScen`}.csv*: Available future routes for transmission capacity as specified by `GSw_TransScen`. +1. *transmission_capacity_init_AC_NARIS2024.csv*: Initial AC transmission capacities between 134 US ReEDS zones. Calculated using the code available at and nodal network data from . The method is described by Brown, P.R. et al 2023, "A general method for estimating zonal transmission interface limits from nodal network data", in prep. +1. *transmission_capacity_init_AC_REFS2009.csv*: Initial AC transmission capacities between 134 US ReEDS zones. Calculated for . +1. *transmission_capacity_init_nonAC.csv*: Initial DC transmission capacities between 134 US ReEDS zones. +1. *transmission_cost_ac_500kv_ba.csv* and *transmission_distance_ba.csv*: Distance and cost for a representative transmission route between each pair of 134 US ReEDS zones, assuming a 500 kV single-circuit line. Routes are determined by the reV model using a least-cost-path algorithm accounting for terrain and land type multipliers. Costs represent the appropriate base cost from rev_transmission_basecost.csv multiplied by the appropriate terrain and land type multipliers for each 90m pixel crossed by the path. Endpoints are in inputs/shapefiles/transmission_endpoints and represent a point within the largest urban area in each of the 134 ReEDS zones. +1. *transmission_cost_dc_ba.csv*: Same as transmission_cost_ac_500kv_ba.csv except assuming a 500 kV bipole DC line. + + ### Relevant switches -1. `GSw_ZoneSet`: Defines the model zones via the `inputs/zones/{GSw_ZoneSet}` files. +1. `GSw_HierarchyFile`: Indicate the suffix of the inputs/hierarchy.csv file you wish to use. 1. By default the transreg boundaries are used for operating reserve sharing, capacity credit calculations, and the boundaries for limited-transmission cases. 1. `GSw_TransInvMaxLongTerm`: Limit on annual transmission deployment nationwide **IN/AFTER** `firstyear_trans_longterm`, measured in TW-miles 1. `GSw_TransInvMaxNearTerm`: Limit on annual transmission deployment nationwide **BEFORE** `firstyear_trans_longterm`, measured in TW-miles @@ -391,9 +412,7 @@ In addition, the `GSw_ReducedResource` switch allows for a uniform reduction of 1. `GSw_TransHurdle`: Intra-US hurdle rate for interzonal flows, measured in $2004/MWh 1. `GSw_TransHurdleLevel`: Indicate the level of hierarchy.csv between which to apply the hurdle rate specified by `GSw_TransHurdle`. i.e. if set to ‘st’, intra-state flows will have no hurdle rates but inter-state flows will have hurdle rates specified by `GSw_TransHurdle`. 1. `GSw_TransRestrict`: Indicate the level of hierarchy.csv within which to allow transmission expansion. i.e. if set to ‘st’, no inter-state expansion is allowed. -1. `GSw_TransScen`: Indicate the inputs/transmission/transmission_capacity_future_{`GSw_TransScen`}.csv file to use, which includes the list of interfaces that can be expanded. -Note that the full list of expandable interfaces is indicated by this file plus transmission_capacity_future_default.csv (currently planned additions) plus existing AC and DC interfaces (which can be expanded by default). -Applies to AC, LCC, and VSC. +1. `GSw_TransScen`: Indicate the inputs/transmission/transmission_capacity_future_{`GSw_TransScen`}.csv file to use, which includes the list of interfaces that can be expanded. Note that the full list of expandable interfaces is indicated by this file plus transmission_capacity_future_default.csv (currently planned additions) plus transmission_capacity_init_AC_NARIS2024.csv (existing AC interfaces, which can be expanded by default) plus transmission_capacity_init_nonAC.csv (existing DC connections, which can be expanded by default). Applies to AC, LCC, and VSC. 1. `GSw_PRM_hierarchy_level`: Level of hierarchy.csv within which to calculate net load, used for capacity credit. Larger levels indicate more planning coordination between regions. 1. `GSw_PRMTRADE_level`: Level of hierarchy.csv within which to allow PRM trading. By default it’s set to ‘country’, indicating no limits. If set to ‘r’, no PRM trading is allowed. @@ -596,7 +615,7 @@ MGA is turned off if set to 0; a reasonable choice for MGA is in the range of 0. - `GSw_MGA_Direction` (default `min`): Directionality of the second optimization. Options are `min` or `max`. - `GSw_MGA_Objective` (default `capacity`): Objective for MGA (uses `GSw_MGA_SubObjective` to specify technology subset if set to `capacity`). -Options are `capacity`, `transmission`, `rasharing`, and `co2`. +Options are `capacity`, `generation`, `transmission`, `rasharing`, and `co2`. - `GSw_MGA_SubObjective` (default `fossil`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity`). Options are the column names in the `inputs/tech-subset-table.csv` file. diff --git a/e_report.gms b/e_report.gms index ebd14d10e..a1a15e4ca 100644 --- a/e_report.gms +++ b/e_report.gms @@ -2072,6 +2072,61 @@ h2_usage(r,h,t)$tmodel_new(t) = + sum{(i,v)$[valgen(i,v,r,t)$h2_combustion(i)], GEN.l(i,v,r,h,t) * h2_combustion_intensity * heat_rate(i,v,r,t) } ; +*========================= +* EMPLOYMENT +*========================= +* Employment from generators +* Generator O&M employment +employment_generator_fom_ivrt(i,v,r,t)$valcap(i,v,r,t) = CAP.l(i,v,r,t) * employment_factor_plant(i,"fom") ; +employment_generator_vom_ivrt(i,v,r,t)$valgen(i,v,r,t) = sum{h, GEN.l(i,v,r,h,t) + * hours(h) + * employment_factor_plant(i,"vom")} ; +employment_generator_om_ivrt(i,v,r,t) = employment_generator_fom_ivrt(i,v,r,t) + employment_generator_vom_ivrt(i,v,r,t) ; + +* Generator construction employment +employment_generator_construction_inv_ivrt(i,v,r,t)$valinv(i,v,r,t) = INV.l(i,v,r,t) * employment_factor_plant(i,"construction") ; +employment_generator_construction_ivrt(i,v,r,t) = employment_generator_construction_inv_ivrt(i,v,r,t) + sum{tt$tprev(t,tt),employment_generator_construction_inv_ivrt(i,v,r,tt)} ; +* Total generator employment +employment_generator_irt(i,r,t) = sum{v, employment_generator_om_ivrt(i,v,r,t) + employment_generator_construction_ivrt(i,v,r,t)} ; + +* Employment from transmission +* Transmission construction employment +employment_trans_construction_rt(r,rr,t) = +* AC lines +sum{tscbin + $[routes_inv(r,rr,"AC",t) + $tsc_binwidth(r,rr,tscbin)], + trans_cost_cap_fin_mult(t) + * ((TRAN_CAPEX_BINS.l(r,rr,tscbin,t) - sum{tt$tprev(t,tt), TRAN_CAPEX_BINS.l(r,rr,tscbin,tt)}) + * employment_factor_inter_transmission("construction")) } +* non AC lines ++ sum{trtype + $[routes_inv(r,rr,trtype,t) + $(not aclike(trtype))], + trans_cost_cap_fin_mult(t) + * transmission_cost_nonac(r,rr,trtype) + * INVTRAN.l(r,rr,trtype,t) + * employment_factor_inter_transmission("construction") / 2 } ; + +* Transmission O&M employment +employment_trans_om_rt(r,rr,t) = sum{trtype + $[routes(r,rr,trtype,t)], + CAPTRAN_ENERGY.l(r,rr,trtype,t) + * employment_factor_inter_transmission("fom") } ; + +* Total transmission employment +employment_trans_rt(r,t) = sum{rr,(employment_trans_construction_rt(r,rr,t) + employment_trans_om_rt(r,rr,t)) / 2} ; + +* Total O&M employment (generator + transmission) +employment_tot_om_rt(r,t) = sum{(i,v), employment_generator_om_ivrt(i,v,r,t)} + sum{rr,(employment_trans_om_rt(r,rr,t)) / 2} ; + +* Total construction employment (generator + transmission) +employment_tot_construction_rt(r,t) = sum{(i,v), employment_generator_construction_ivrt(i,v,r,t)} + sum{rr,(employment_trans_construction_rt(r,rr,t)) / 2} ; + +* Total employment (generator + transmission) + (construction + O&M) +employment_tot_rt(r,t) = sum{i, employment_generator_irt(i,r,t)} + employment_trans_rt(r,t) ; +employment_tot_t(t) = sum{r, employment_tot_rt(r,t)} ; + *======================================== * Calculate powfrac *======================================== diff --git a/e_report_params.csv b/e_report_params.csv index 70b370208..6cb16126b 100644 --- a/e_report_params.csv +++ b/e_report_params.csv @@ -68,6 +68,19 @@ curt_rate(t),frac,fraction of VRE generation that is curtailed,,, "emit_r(etype,eall,r,t)",metric tons,"emissions by pollutant, regional",,, "emit_rate_regional(r,t)",metric tons,"regional average CO2 emissions rate, used in state CO2 caps",,, "emit_weighted(etype,eall)",metric tons * pvf,national emissions * pvf_onm,,, +"employment_generator_fom_ivrt(i,v,r,t)",jobs,generator fixed o&m jobs,,, +"employment_generator_vom_ivrt(i,v,r,t)",jobs,generator variable o&m jobs,,, +"employment_generator_om_ivrt(i,v,r,t)",jobs,generator variable o&m jobs,,, +"employment_generator_construction_inv_ivrt(i,v,r,t)",jobs,generator construction jobs,,, +"employment_generator_construction_ivrt(i,v,r,t)",jobs,cumulative generator construction jobs,,, +"employment_generator_irt(i,r,t)",jobs,generator jobs by tech and region,,, +"employment_trans_construction_rt(r,rr,t)",jobs,transmission construction jobs,,, +"employment_trans_om_rt(r,rr,t)",jobs,transmission o&m jobs,,, +"employment_trans_rt(r,t)",jobs,total transmission jobs by year,,, +"employment_tot_om_rt(r,t)",jobs,total O&M jobs by year and region,,, +"employment_tot_construction_rt(r,t)",jobs,total construction jobs by year and region,,, +"employment_tot_rt(r,t)",jobs,total jobs by region and year,,, +"employment_tot_t(t)",jobs,all jobs nation-wide by year,,, error_check(*),unitless,set of checks to determine if there is an error - values should be zero if there is no error,,, "error_gen(i,v,r,allh,t)",MWh,"erroneous generation that disobeys valgen(i,v,r,t)",,, "excess_load(r,allh,t)",MW,level values of EXCESS variable for surplus load,,, diff --git a/input_processing/copy_files.py b/input_processing/copy_files.py index 90e22a098..3e0edbbee 100644 --- a/input_processing/copy_files.py +++ b/input_processing/copy_files.py @@ -11,7 +11,6 @@ import yaml import json import h5py -from pathlib import Path # Local Imports sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import reeds @@ -181,6 +180,7 @@ def get_regions_and_agglevel( reeds_path, inputs_case, save_regions_and_agglevel=True, + NARIS=False ): """ Create a regional mapping to help filter for specific regions and aggregation levels. @@ -192,18 +192,17 @@ def get_regions_and_agglevel( """ sw = reeds.io.get_switches(inputs_case) - ## TEMPORARY 20260402: Load the full regions list - ## Use the line below once we make the switch - # hierarchy = reeds.io.assemble_hierarchy(inputs_case) + # Load the full regions list hierarchy = pd.read_csv( - Path(reeds.io.reeds_path, 'inputs', 'zones', sw.GSw_ZoneSet, 'hierarchy_from134.csv') + os.path.join(reeds_path, 'inputs', 'hierarchy{}.csv'.format( + '' if (sw['GSw_HierarchyFile'] == 'default') + else '_'+sw['GSw_HierarchyFile'])) ) hierarchy['offshore'] = 0 # Append offshore zones if using if int(sw.GSw_OffshoreZones): - hierarchy_offshore = reeds.io.assemble_hierarchy( - fpath=os.path.join(reeds_path, 'inputs', 'zones', 'hierarchy_offshore.csv'), - extra=False, + hierarchy_offshore = pd.read_csv( + os.path.join(reeds_path, 'inputs', 'hierarchy_offshore.csv') ).assign(offshore=1) hierarchy = pd.concat([hierarchy, hierarchy_offshore], ignore_index=True) @@ -214,11 +213,12 @@ def get_regions_and_agglevel( index=False, header=True ) + if not NARIS: + hierarchy = hierarchy.loc[hierarchy.country.str.lower()=='usa'].copy() + # Add a row for each county - ## TEMPORARY 20260402: Use the old 134-zone county2zone until the aggregation approach is updated - county2zone = ( - reeds.io.get_county2zone(GSw_ZoneSet='z134', as_map=False) - .rename(columns={'r':'ba'}) + county2zone = pd.read_csv( + os.path.join(reeds_path, 'inputs', 'county2zone.csv'), dtype={'FIPS':str}, ) county2zone['county'] = 'p' + county2zone.FIPS county2zone.to_csv( @@ -232,32 +232,44 @@ def get_regions_and_agglevel( # Subset hierarchy for the region of interest (based on the GSw_Region switch) # Parse the GSw_Region switch. If it includes a '/' character, it has the format # {column of hierarchy.csv}/{period-delimited entries to keep from that column}. - hier_sub = pd.DataFrame() - # allow the list defined by the user to include multiple spatial resolutions - region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] - # separate lists associated with each spatial resolution - for region_group in region_groups: - GSw_RegionLevel, GSw_Region = region_group.split('/') - GSw_Region = GSw_Region.split('.') - - hier_sub_partial = pd.concat([ - hierarchy[hierarchy[GSw_RegionLevel] == region] for region in GSw_Region - ]) + if '/' in sw['GSw_Region']: + hier_sub = pd.DataFrame() + # allow the list defined by the user to include multiple spatial resolutions + region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] + # separate lists associated with each spatial resolution + for region_group in region_groups: + GSw_RegionLevel, GSw_Region = region_group.split('/') + GSw_Region = GSw_Region.split('.') + + hier_sub_partial = pd.concat([ + hierarchy[hierarchy[GSw_RegionLevel] == region] for region in GSw_Region + ]) + + hier_sub = pd.concat([hier_sub, hier_sub_partial]) + # Otherwise use the modeled_regions.csv file to define the regions + else: + modeled_regions = pd.read_csv( + os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv')) + modeled_regions.columns = modeled_regions.columns.str.lower() + val_r_in = list( + modeled_regions[~modeled_regions[sw['GSw_Region'].lower()].isna()]['r'].unique()) + hier_sub = hierarchy[hierarchy['ba'].isin(val_r_in)].copy() - hier_sub = pd.concat([hier_sub, hier_sub_partial]) # Read region resolution switch to determine agglevel agglevel = sw['GSw_RegionResolution'].lower() # Check if desired spatial resolution is mixed if agglevel == 'mixed': + #Set value in resolution column of hier_sub to match value assigned in modeled_regions.csv region_def = pd.read_csv( - os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv') - )[['r', sw.GSw_ZoneSet]] + os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv')) + region_def = region_def[['r', sw['GSw_Region']]] - res_map = region_def.set_index('r').squeeze(1).to_dict() + res_map = region_def.set_index('r')[sw['GSw_Region']].to_dict() hier_sub['resolution'] = hier_sub['ba'].map(res_map) + else: hier_sub['resolution'] = agglevel @@ -325,7 +337,7 @@ def get_regions_and_agglevel( os.path.join(inputs_case, 'val_r_all.csv'), header=False, index=False) # Rename columns and save as hierarchy_with_res.csv for use in agglevel_variables function - hier_sub.drop(columns='offshore', errors='ignore').rename(columns={'r':'*r'}).to_csv( + hier_sub.rename(columns={'r':'*r'}).to_csv( os.path.join(inputs_case, 'hierarchy_with_res.csv'), index=False) # Drop county name and resolution columns @@ -350,7 +362,7 @@ def get_regions_and_agglevel( if sw.GSw_RegionResolution == 'mixed': mod_reg = pd.read_csv( os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv')) - if 'aggreg' in mod_reg[sw.GSw_ZoneSet].tolist(): + if 'aggreg' in mod_reg[sw.GSw_Region].tolist(): hier_sub['itlgrp'] = hier_sub['aggreg'] hier_sub[['r','itlgrp']].rename(columns={'r':'*r'}).to_csv( os.path.join(inputs_case, 'hierarchy_itlgrp.csv'), index=False) @@ -360,7 +372,7 @@ def get_regions_and_agglevel( os.path.join(inputs_case, 'val_itlgrp.csv'), header=False, index=False) # Drop any substate region columns as these will no longer be needed - hier_sub = hier_sub.drop(['county', 'ba', 'itlgrp'], axis=1) + hier_sub = hier_sub.drop(['county','ba','itlgrp','st_interconnect'],axis=1) # Populate val_st as unique states (not st_int) from the subsetted hierarchy table # Also include "voluntary" state for modeling voluntary market REC trading @@ -389,7 +401,7 @@ def get_regions_and_agglevel( os.path.join(inputs_case, 'offshore.csv'), index=False, header=False, ) - levels = [i for i in hier_sub if i != 'offshore'] + levels = list(hier_sub.columns) valid_regions = {level: list(hier_sub[level].unique()) for level in levels} val_r = sorted(valid_regions['r']) @@ -623,6 +635,8 @@ def subset_to_valid_regions( # Transmission files need to be filtered differently to allow interfaces between BA and county resolution regions transmission_files = [ + 'transmission_capacity_init_AC_r.csv', + 'transmission_capacity_init_nonAC.csv', 'transmission_cost_ac.csv', 'transmission_cost_dc.csv', 'transmission_distance.csv', @@ -1074,11 +1088,7 @@ def write_disagg_data_files(runfiles, inputs_case): # region-to-county fractions, and the latter is needed to calculate # state-to-county and BA-to-county fractions. county_r_map = reeds.io.get_county2zone(os.path.dirname(inputs_case)) - ## TEMPORARY 20260402: Use the old 134-zone county2zone until the aggregation approach is updated - county2zone = ( - reeds.io.get_county2zone(GSw_ZoneSet='z134', as_map=False) - .rename(columns={'r':'ba'}) - ) + county2zone = reeds.io.get_county2zone(as_map=False) county2zone['county'] = 'p' + county2zone['FIPS'].astype(str).str.zfill(5) county2zone['r'] = county2zone['FIPS'].map(county_r_map) @@ -1335,6 +1345,13 @@ def write_miscellaneous_files( )[sw['GSw_H2LeakageScen']].rename_axis('*i').round(5).to_csv( os.path.join(inputs_case,'h2_leakage_rate.csv')) + # Transmission employment factors: + pd.read_csv( + os.path.join(reeds_path,'inputs','employment','employment_factor_inter_transmission.csv'), + index_col='jtype', + )[sw['GSw_EmploymentFactor']].rename_axis('*jtype').round(8).to_csv( + os.path.join(inputs_case,'employment_factor_inter_transmission.csv')) + # Add this_year to years_until_endogenous to generate the tech-specific firstyear.csv file scalars = reeds.io.get_scalars(full=True) ( @@ -1572,13 +1589,14 @@ def generate_maps_gpkg(inputs_case): #%% =========================================================================== ### --- PROCEDURE --- ### =========================================================================== -def main(reeds_path, inputs_case): +def main(reeds_path, inputs_case, NARIS=False): """ Run copy_files.py for use in the ReEDS workflow Parameters: reeds_path : str (Path to the ReEDS directory) inputs_case : str (Path to the run/inputs_case directory) + NARIS : Ture/False (NARIS: North American Renewable Integration Study) Returns: None (Writes files to the inputs_case directory) @@ -1587,7 +1605,7 @@ def main(reeds_path, inputs_case): ### --- Gather dataframes and dictionaries necessary for the script execution --- ### =========================================================================== # Obtain data necessary to filter and aggregate regions - regions_and_agglevel = get_regions_and_agglevel(reeds_path, inputs_case) + regions_and_agglevel = get_regions_and_agglevel(reeds_path, inputs_case, NARIS=NARIS) # Use agglevel_variables function to obtain spatial resolution variables agglevel_variables = reeds.spatial.get_agglevel_variables(reeds_path, inputs_case) @@ -1664,7 +1682,8 @@ def main(reeds_path, inputs_case): # #%% Settings for testing ### # reeds_path = reeds.io.reeds_path - # inputs_case = os.path.join(reeds_path,'runs','v20260305_itlM0_USA_defaults','inputs_case') + #inputs_case = os.path.join(reeds_path,'runs','test_employment_Pacific','inputs_case') + #NARIS = False # ---- Set up logger ---- diff --git a/inputs/employment/employment_factor_inter_transmission.csv b/inputs/employment/employment_factor_inter_transmission.csv new file mode 100644 index 000000000..1abcc94bb --- /dev/null +++ b/inputs/employment/employment_factor_inter_transmission.csv @@ -0,0 +1,3 @@ +jtype,JEDI,Mayfield,Rutovitz,Ram +construction,0.00000331,0.00000499,0.00000029,0.00000596 +fom,0.00075584,0.444,0,0 \ No newline at end of file diff --git a/inputs/employment/employment_factor_plant_JEDI.csv b/inputs/employment/employment_factor_plant_JEDI.csv new file mode 100644 index 000000000..ae6cb8f9f --- /dev/null +++ b/inputs/employment/employment_factor_plant_JEDI.csv @@ -0,0 +1,206 @@ +,construction,fom,vom +battery_li,0.937020565,0.033333333,0 +biopower,3.76446807,1.453074326,0 +beccs_mod,3.76446807,1.453074326,0 +beccs_max,3.76446807,1.453074326,0 +coal-CCS_mod,4.196159448,0.186153846,0.00005346 +coal-CCS_max,4.196159448,0.186153846,0.00005346 +coal-CCS-F1,4.196159448,0.186153846,0.00005346 +coal-CCS-F2,4.196159448,0.186153846,0.00005346 +coal-CCS-F3,4.196159448,0.186153846,0.00005346 +Coal-IGCC,4.149232006,0.181538462,0.00003725 +coal-new,2.663868535,0.16,0.00003948 +CoalOldScr,2.663868535,0.16,0.00003948 +CoalOldUns,2.663868535,0.16,0.00003948 +CofireNew,2.663868535,0.16,0.00003948 +CofireOld,2.663868535,0.16,0.00003948 +csp-ns,5.860286945,0.257823504,0 +distpv,2.97777666,0.203887755,0 +Gas-CC,0.57898781,0.052,0.00002764 +Gas-CC-CCS_mod,1.301540146,0.072,0.00005346 +Gas-CC-CCS_max,1.301540146,0.072,0.00005346 +Gas-CC-CCS-F1,1.301540146,0.072,0.00005346 +Gas-CC-CCS-F2,1.301540146,0.072,0.00005346 +Gas-CC-CCS-F3,1.301540146,0.072,0.00005346 +Gas-CT,1.124155973,0.28,0.00004233 +H2-CT,1.124155973,0.28,0 +H2-CC,0.57898781,0.052,0 +geothermal,4.614237729,0.15681119,0.00003511 +Hydro,3.088992778,0.019831569,0 +lfill-gas,0.57898781,0.052,0 +Nuclear,13.74608053,1.042875956,0.00002946 +Nuclear-SMR,4.35325963,0.278978818,0.00001645 +o-g-s,0.57898781,0.052,0.00002764 +pumped-hydro,4.437357277,0.105776354,0 +pumped-hydro-flex,4.437357277,0.105776354,0 +upv_1,2.31800771,0.049966822,0 +upv_2,2.31800771,0.049966822,0 +upv_3,2.31800771,0.049966822,0 +upv_4,2.31800771,0.049966822,0 +upv_5,2.31800771,0.049966822,0 +upv_6,2.31800771,0.049966822,0 +upv_7,2.31800771,0.049966822,0 +upv_8,2.31800771,0.049966822,0 +upv_9,2.31800771,0.049966822,0 +upv_10,2.31800771,0.049966822,0 +pvb1_1,2.31800771,0.049966822,0 +pvb1_2,2.31800771,0.049966822,0 +pvb1_3,2.31800771,0.049966822,0 +pvb1_4,2.31800771,0.049966822,0 +pvb1_5,2.31800771,0.049966822,0 +pvb1_6,2.31800771,0.049966822,0 +pvb1_7,2.31800771,0.049966822,0 +pvb1_8,2.31800771,0.049966822,0 +pvb1_9,2.31800771,0.049966822,0 +pvb1_10,2.31800771,0.049966822,0 +pvb2_1,2.31800771,0.049966822,0 +pvb2_2,2.31800771,0.049966822,0 +pvb2_3,2.31800771,0.049966822,0 +pvb2_4,2.31800771,0.049966822,0 +pvb2_5,2.31800771,0.049966822,0 +pvb2_6,2.31800771,0.049966822,0 +pvb2_7,2.31800771,0.049966822,0 +pvb2_8,2.31800771,0.049966822,0 +pvb2_9,2.31800771,0.049966822,0 +pvb2_10,2.31800771,0.049966822,0 +pvb3_1,2.31800771,0.049966822,0 +pvb3_2,2.31800771,0.049966822,0 +pvb3_3,2.31800771,0.049966822,0 +pvb3_4,2.31800771,0.049966822,0 +pvb3_5,2.31800771,0.049966822,0 +pvb3_6,2.31800771,0.049966822,0 +pvb3_7,2.31800771,0.049966822,0 +pvb3_8,2.31800771,0.049966822,0 +pvb3_9,2.31800771,0.049966822,0 +pvb3_10,2.31800771,0.049966822,0 +wind-ofs_1,1.747743604,0.11549396,0 +wind-ofs_2,1.747743604,0.11549396,0 +wind-ofs_3,1.747743604,0.11549396,0 +wind-ofs_4,1.747743604,0.11549396,0 +wind-ofs_5,1.747743604,0.11549396,0 +wind-ofs_6,1.747743604,0.11549396,0 +wind-ofs_7,1.747743604,0.11549396,0 +wind-ofs_8,1.747743604,0.11549396,0 +wind-ofs_9,1.747743604,0.11549396,0 +wind-ofs_10,1.747743604,0.11549396,0 +wind-ons_1,1.233305044,0.033060233,0 +wind-ons_2,1.233305044,0.033060233,0 +wind-ons_3,1.233305044,0.033060233,0 +wind-ons_4,1.233305044,0.033060233,0 +wind-ons_5,1.233305044,0.033060233,0 +wind-ons_6,1.233305044,0.033060233,0 +wind-ons_7,1.233305044,0.033060233,0 +wind-ons_8,1.233305044,0.033060233,0 +wind-ons_9,1.233305044,0.033060233,0 +wind-ons_10,1.233305044,0.033060233,0 +csp1_1,5.860286945,0.257823504,0 +csp1_2,5.860286945,0.257823504,0 +csp1_3,5.860286945,0.257823504,0 +csp1_4,5.860286945,0.257823504,0 +csp1_5,5.860286945,0.257823504,0 +csp1_6,5.860286945,0.257823504,0 +csp1_7,5.860286945,0.257823504,0 +csp1_8,5.860286945,0.257823504,0 +csp1_9,5.860286945,0.257823504,0 +csp1_10,5.860286945,0.257823504,0 +csp1_11,5.860286945,0.257823504,0 +csp1_12,5.860286945,0.257823504,0 +csp2_1,5.860286945,0.257823504,0 +csp2_2,5.860286945,0.257823504,0 +csp2_3,5.860286945,0.257823504,0 +csp2_4,5.860286945,0.257823504,0 +csp2_5,5.860286945,0.257823504,0 +csp2_6,5.860286945,0.257823504,0 +csp2_7,5.860286945,0.257823504,0 +csp2_8,5.860286945,0.257823504,0 +csp2_9,5.860286945,0.257823504,0 +csp2_10,5.860286945,0.257823504,0 +csp2_11,5.860286945,0.257823504,0 +csp2_12,5.860286945,0.257823504,0 +csp3_1,5.860286945,0.257823504,0 +csp3_2,5.860286945,0.257823504,0 +csp3_3,5.860286945,0.257823504,0 +csp3_4,5.860286945,0.257823504,0 +csp3_5,5.860286945,0.257823504,0 +csp3_6,5.860286945,0.257823504,0 +csp3_7,5.860286945,0.257823504,0 +csp3_8,5.860286945,0.257823504,0 +csp3_9,5.860286945,0.257823504,0 +csp3_10,5.860286945,0.257823504,0 +csp3_11,5.860286945,0.257823504,0 +csp3_12,5.860286945,0.257823504,0 +csp4_1,5.860286945,0.257823504,0 +csp4_2,5.860286945,0.257823504,0 +csp4_3,5.860286945,0.257823504,0 +csp4_4,5.860286945,0.257823504,0 +csp4_5,5.860286945,0.257823504,0 +csp4_6,5.860286945,0.257823504,0 +csp4_7,5.860286945,0.257823504,0 +csp4_8,5.860286945,0.257823504,0 +csp4_9,5.860286945,0.257823504,0 +csp4_10,5.860286945,0.257823504,0 +csp4_11,5.860286945,0.257823504,0 +csp4_12,5.860286945,0.257823504,0 +hydD,3.088992778,0.019831569,0 +hydND,3.088992778,0.019831569,0 +hydSD,3.088992778,0.019831569,0 +hydSND,3.088992778,0.019831569,0 +hydUD,3.088992778,0.019831569,0 +hydUND,3.088992778,0.019831569,0 +hydNPD,3.088992778,0.019831569,0 +hydNPND,3.088992778,0.019831569,0 +hydED,3.088992778,0.019831569,0 +hydEND,3.088992778,0.019831569,0 +egs_allkm_1,5.506553405,0.151210424,0.00004967 +egs_allkm_2,5.506553405,0.151210424,0.00004967 +egs_allkm_3,5.506553405,0.151210424,0.00004967 +egs_allkm_4,5.506553405,0.151210424,0.00004967 +egs_allkm_5,5.506553405,0.151210424,0.00004967 +egs_allkm_6,5.506553405,0.151210424,0.00004967 +egs_allkm_7,5.506553405,0.151210424,0.00004967 +egs_allkm_8,5.506553405,0.151210424,0.00004967 +egs_allkm_9,5.506553405,0.151210424,0.00004967 +egs_allkm_10,5.506553405,0.151210424,0.00004967 +geohydro_allkm_1,4.614237729,0.15681119,0.00003511 +geohydro_allkm_2,4.614237729,0.15681119,0.00003511 +geohydro_allkm_3,4.614237729,0.15681119,0.00003511 +geohydro_allkm_4,4.614237729,0.15681119,0.00003511 +geohydro_allkm_5,4.614237729,0.15681119,0.00003511 +geohydro_allkm_6,4.614237729,0.15681119,0.00003511 +geohydro_allkm_7,4.614237729,0.15681119,0.00003511 +geohydro_allkm_8,4.614237729,0.15681119,0.00003511 +geohydro_allkm_9,4.614237729,0.15681119,0.00003511 +geohydro_allkm_10,4.614237729,0.15681119,0.00003511 +egs_nearfield_1,5.506553405,0.151210424,0.00004967 +egs_nearfield_2,5.506553405,0.151210424,0.00004967 +egs_nearfield_3,5.506553405,0.151210424,0.00004967 +egs_nearfield_4,5.506553405,0.151210424,0.00004967 +egs_nearfield_5,5.506553405,0.151210424,0.00004967 +egs_nearfield_6,5.506553405,0.151210424,0.00004967 +egs_nearfield_7,5.506553405,0.151210424,0.00004967 +egs_nearfield_8,5.506553405,0.151210424,0.00004967 +egs_nearfield_9,5.506553405,0.151210424,0.00004967 +egs_nearfield_10,5.506553405,0.151210424,0.00004967 +Gas-CT_H2-CT,1.124155973,0.28,0.00004233 +Gas-CC_H2-CC,0.57898781,0.052,0.00002764 +CoalOldUns_CoalOldScr,2.663868535,0.16,0.00003948 +CoalOldUns_CofireOld,2.663868535,0.16,0.00003948 +CoalOldScr_CofireOld,2.663868535,0.16,0.00003948 +coal-new_CofireNew,2.663868535,0.16,0.00003948 +Gas-CC_Gas-CC-CCS_mod,0.858296124,0.084,0.00005634 +Coal-IGCC_coal-CCS_mod,1.617499527,0.156923077,0.00005634 +coal-new_coal-CCS_mod,1.617499527,0.156923077,0.00005634 +CoalOldScr_coal-CCS_mod,1.617499527,0.156923077,0.00005634 +CoalOldUns_coal-CCS_mod,1.617499527,0.156923077,0.00005634 +CofireNew_coal-CCS_mod,1.617499527,0.156923077,0.00005634 +CofireOld_coal-CCS_mod,1.617499527,0.156923077,0.00005634 +Gas-CC_Gas-CC-CCS_max,0.858296124,0.084,0.00005634 +Coal-IGCC_coal-CCS_max,1.617499527,0.156923077,0.00005634 +coal-new_coal-CCS_max,1.617499527,0.156923077,0.00005634 +CoalOldScr_coal-CCS_max,1.617499527,0.156923077,0.00005634 +CoalOldUns_coal-CCS_max,1.617499527,0.156923077,0.00005634 +CofireNew_coal-CCS_max,1.617499527,0.156923077,0.00005634 +CofireOld_coal-CCS_max,1.617499527,0.156923077,0.00005634 +hydEND_hydED,3.088992778,0.019831569,0 +hydED_pumped-hydro,4.437357277,0.105776354,0 +hydED_pumped-hydro-flex,4.437357277,0.105776354,0 \ No newline at end of file diff --git a/inputs/employment/employment_factor_plant_Mayfield.csv b/inputs/employment/employment_factor_plant_Mayfield.csv new file mode 100644 index 000000000..c2da29421 --- /dev/null +++ b/inputs/employment/employment_factor_plant_Mayfield.csv @@ -0,0 +1,206 @@ +,construction,fom,vom +battery_li,0,0,0 +biopower,0.346,0.123,0 +beccs_mod,0.346,0.123,0 +beccs_max,0.346,0.123,0 +coal-CCS_mod,0,0.266,0 +coal-CCS_max,0,0.266,0 +coal-CCS-F1,0,0.266,0 +coal-CCS-F2,0,0.266,0 +coal-CCS-F3,0,0.266,0 +Coal-IGCC,0,0.266,0 +coal-new,0,0.266,0 +CoalOldScr,0,0.266,0 +CoalOldUns,0,0.266,0 +CofireNew,0,0.266,0 +CofireOld,0,0.266,0 +csp-ns,6.468,0.448,0 +distpv,35.337,0.541,0 +Gas-CC,0.346,0.123,0 +Gas-CC-CCS_mod,0.346,0.123,0 +Gas-CC-CCS_max,0.346,0.123,0 +Gas-CC-CCS-F1,0.346,0.123,0 +Gas-CC-CCS-F2,0.346,0.123,0 +Gas-CC-CCS-F3,0.346,0.123,0 +Gas-CT,0.346,0.123,0 +H2-CT,0.346,0.123,0 +H2-CC,0.346,0.123,0 +geothermal,0,0,0 +Hydro,0,0,0 +lfill-gas,0.346,0.123,0 +Nuclear,9.93,0.513,0 +Nuclear-SMR,9.93,0.513,0 +o-g-s,0.346,0.123,0 +pumped-hydro,0,0,0 +pumped-hydro-flex,0,0,0 +upv_1,6.468,0.448,0 +upv_2,6.468,0.448,0 +upv_3,6.468,0.448,0 +upv_4,6.468,0.448,0 +upv_5,6.468,0.448,0 +upv_6,6.468,0.448,0 +upv_7,6.468,0.448,0 +upv_8,6.468,0.448,0 +upv_9,6.468,0.448,0 +upv_10,6.468,0.448,0 +pvb1_1,6.468,0.448,0 +pvb1_2,6.468,0.448,0 +pvb1_3,6.468,0.448,0 +pvb1_4,6.468,0.448,0 +pvb1_5,6.468,0.448,0 +pvb1_6,6.468,0.448,0 +pvb1_7,6.468,0.448,0 +pvb1_8,6.468,0.448,0 +pvb1_9,6.468,0.448,0 +pvb1_10,6.468,0.448,0 +pvb2_1,6.468,0.448,0 +pvb2_2,6.468,0.448,0 +pvb2_3,6.468,0.448,0 +pvb2_4,6.468,0.448,0 +pvb2_5,6.468,0.448,0 +pvb2_6,6.468,0.448,0 +pvb2_7,6.468,0.448,0 +pvb2_8,6.468,0.448,0 +pvb2_9,6.468,0.448,0 +pvb2_10,6.468,0.448,0 +pvb3_1,6.468,0.448,0 +pvb3_2,6.468,0.448,0 +pvb3_3,6.468,0.448,0 +pvb3_4,6.468,0.448,0 +pvb3_5,6.468,0.448,0 +pvb3_6,6.468,0.448,0 +pvb3_7,6.468,0.448,0 +pvb3_8,6.468,0.448,0 +pvb3_9,6.468,0.448,0 +pvb3_10,6.468,0.448,0 +wind-ofs_1,0.263,0.894,0 +wind-ofs_2,0.263,0.894,0 +wind-ofs_3,0.263,0.894,0 +wind-ofs_4,0.263,0.894,0 +wind-ofs_5,0.263,0.894,0 +wind-ofs_6,0.263,0.894,0 +wind-ofs_7,0.263,0.894,0 +wind-ofs_8,0.263,0.894,0 +wind-ofs_9,0.263,0.894,0 +wind-ofs_10,0.263,0.894,0 +wind-ons_1,0.263,0.894,0 +wind-ons_2,0.263,0.894,0 +wind-ons_3,0.263,0.894,0 +wind-ons_4,0.263,0.894,0 +wind-ons_5,0.263,0.894,0 +wind-ons_6,0.263,0.894,0 +wind-ons_7,0.263,0.894,0 +wind-ons_8,0.263,0.894,0 +wind-ons_9,0.263,0.894,0 +wind-ons_10,0.263,0.894,0 +csp1_1,6.468,0.448,0 +csp1_2,6.468,0.448,0 +csp1_3,6.468,0.448,0 +csp1_4,6.468,0.448,0 +csp1_5,6.468,0.448,0 +csp1_6,6.468,0.448,0 +csp1_7,6.468,0.448,0 +csp1_8,6.468,0.448,0 +csp1_9,6.468,0.448,0 +csp1_10,6.468,0.448,0 +csp1_11,6.468,0.448,0 +csp1_12,6.468,0.448,0 +csp2_1,6.468,0.448,0 +csp2_2,6.468,0.448,0 +csp2_3,6.468,0.448,0 +csp2_4,6.468,0.448,0 +csp2_5,6.468,0.448,0 +csp2_6,6.468,0.448,0 +csp2_7,6.468,0.448,0 +csp2_8,6.468,0.448,0 +csp2_9,6.468,0.448,0 +csp2_10,6.468,0.448,0 +csp2_11,6.468,0.448,0 +csp2_12,6.468,0.448,0 +csp3_1,6.468,0.448,0 +csp3_2,6.468,0.448,0 +csp3_3,6.468,0.448,0 +csp3_4,6.468,0.448,0 +csp3_5,6.468,0.448,0 +csp3_6,6.468,0.448,0 +csp3_7,6.468,0.448,0 +csp3_8,6.468,0.448,0 +csp3_9,6.468,0.448,0 +csp3_10,6.468,0.448,0 +csp3_11,6.468,0.448,0 +csp3_12,6.468,0.448,0 +csp4_1,6.468,0.448,0 +csp4_2,6.468,0.448,0 +csp4_3,6.468,0.448,0 +csp4_4,6.468,0.448,0 +csp4_5,6.468,0.448,0 +csp4_6,6.468,0.448,0 +csp4_7,6.468,0.448,0 +csp4_8,6.468,0.448,0 +csp4_9,6.468,0.448,0 +csp4_10,6.468,0.448,0 +csp4_11,6.468,0.448,0 +csp4_12,6.468,0.448,0 +hydD,0,0,0 +hydND,0,0,0 +hydSD,0,0,0 +hydSND,0,0,0 +hydUD,0,0,0 +hydUND,0,0,0 +hydNPD,0,0,0 +hydNPND,0,0,0 +hydED,0,0,0 +hydEND,0,0,0 +egs_allkm_1,0,0,0 +egs_allkm_2,0,0,0 +egs_allkm_3,0,0,0 +egs_allkm_4,0,0,0 +egs_allkm_5,0,0,0 +egs_allkm_6,0,0,0 +egs_allkm_7,0,0,0 +egs_allkm_8,0,0,0 +egs_allkm_9,0,0,0 +egs_allkm_10,0,0,0 +geohydro_allkm_1,0,0,0 +geohydro_allkm_2,0,0,0 +geohydro_allkm_3,0,0,0 +geohydro_allkm_4,0,0,0 +geohydro_allkm_5,0,0,0 +geohydro_allkm_6,0,0,0 +geohydro_allkm_7,0,0,0 +geohydro_allkm_8,0,0,0 +geohydro_allkm_9,0,0,0 +geohydro_allkm_10,0,0,0 +egs_nearfield_1,0,0,0 +egs_nearfield_2,0,0,0 +egs_nearfield_3,0,0,0 +egs_nearfield_4,0,0,0 +egs_nearfield_5,0,0,0 +egs_nearfield_6,0,0,0 +egs_nearfield_7,0,0,0 +egs_nearfield_8,0,0,0 +egs_nearfield_9,0,0,0 +egs_nearfield_10,0,0,0 +Gas-CT_H2-CT,0.346,0.123,0 +Gas-CC_H2-CC,0.346,0.123,0 +CoalOldUns_CoalOldScr,0,0.266,0 +CoalOldUns_CofireOld,0,0.266,0 +CoalOldScr_CofireOld,0,0.266,0 +coal-new_CofireNew,0,0.266,0 +Gas-CC_Gas-CC-CCS_mod,0.346,0.266,0 +Coal-IGCC_coal-CCS_mod,0,0.266,0 +coal-new_coal-CCS_mod,0,0.266,0 +CoalOldScr_coal-CCS_mod,0,0.266,0 +CoalOldUns_coal-CCS_mod,0,0.266,0 +CofireNew_coal-CCS_mod,0,0.266,0 +CofireOld_coal-CCS_mod,0,0.266,0 +Gas-CC_Gas-CC-CCS_max,0.346,0.123,0 +Coal-IGCC_coal-CCS_max,0,0.266,0 +coal-new_coal-CCS_max,0,0.266,0 +CoalOldScr_coal-CCS_max,0,0.266,0 +CoalOldUns_coal-CCS_max,0,0.266,0 +CofireNew_coal-CCS_max,0,0.266,0 +CofireOld_coal-CCS_max,0,0.266,0 +hydEND_hydED,0,0,0 +hydED_pumped-hydro,0,0,0 +hydED_pumped-hydro-flex,0,0,0 \ No newline at end of file diff --git a/inputs/employment/employment_factor_plant_Ram.csv b/inputs/employment/employment_factor_plant_Ram.csv new file mode 100644 index 000000000..43731f32c --- /dev/null +++ b/inputs/employment/employment_factor_plant_Ram.csv @@ -0,0 +1,206 @@ +,construction,fom,vom +battery_li,0.53,0.23,0 +biopower,14,1.5,0 +beccs_mod,14,1.5,0 +beccs_max,14,1.5,0 +coal-CCS_mod,11.08,0.22,0.00001 +coal-CCS_max,11.08,0.22,0.00001 +coal-CCS-F1,11.08,0.22,0.00001 +coal-CCS-F2,11.08,0.22,0.00001 +coal-CCS-F3,11.08,0.22,0.00001 +Coal-IGCC,11.08,0.22,0.00001 +coal-new,11.08,0.22,0.00001 +CoalOldScr,11.08,0.22,0.00001 +CoalOldUns,11.08,0.22,0.00001 +CofireNew,11.08,0.22,0.00001 +CofireOld,11.08,0.22,0.00001 +csp-ns,1.61,0.14,0 +distpv,4.19,0.13,0 +Gas-CC,1.27,0.14,0.00007 +Gas-CC-CCS_mod,1.27,0.14,0.00007 +Gas-CC-CCS_max,1.27,0.14,0.00007 +Gas-CC-CCS-F1,1.27,0.14,0.00007 +Gas-CC-CCS-F2,1.27,0.14,0.00007 +Gas-CC-CCS-F3,1.27,0.14,0.00007 +Gas-CT,1.27,0.14,0.00007 +H2-CT,1.27,0.14,0.00007 +H2-CC,1.27,0.14,0.00007 +geothermal,6.8,0.4,0 +Hydro,7.36,0.14,0 +lfill-gas,1.27,0.14,0 +Nuclear,11.8,0.6,0 +Nuclear-SMR,11.8,0.6,0 +o-g-s,1.27,0.14,0 +pumped-hydro,7.18,0.08,0 +pumped-hydro-flex,7.18,0.08,0 +upv_1,1.61,0.09,0 +upv_2,1.61,0.09,0 +upv_3,1.61,0.09,0 +upv_4,1.61,0.09,0 +upv_5,1.61,0.09,0 +upv_6,1.61,0.09,0 +upv_7,1.61,0.09,0 +upv_8,1.61,0.09,0 +upv_9,1.61,0.09,0 +upv_10,1.61,0.09,0 +pvb1_1,1.61,0.09,0 +pvb1_2,1.61,0.09,0 +pvb1_3,1.61,0.09,0 +pvb1_4,1.61,0.09,0 +pvb1_5,1.61,0.09,0 +pvb1_6,1.61,0.09,0 +pvb1_7,1.61,0.09,0 +pvb1_8,1.61,0.09,0 +pvb1_9,1.61,0.09,0 +pvb1_10,1.61,0.09,0 +pvb2_1,1.61,0.09,0 +pvb2_2,1.61,0.09,0 +pvb2_3,1.61,0.09,0 +pvb2_4,1.61,0.09,0 +pvb2_5,1.61,0.09,0 +pvb2_6,1.61,0.09,0 +pvb2_7,1.61,0.09,0 +pvb2_8,1.61,0.09,0 +pvb2_9,1.61,0.09,0 +pvb2_10,1.61,0.09,0 +pvb3_1,1.61,0.09,0 +pvb3_2,1.61,0.09,0 +pvb3_3,1.61,0.09,0 +pvb3_4,1.61,0.09,0 +pvb3_5,1.61,0.09,0 +pvb3_6,1.61,0.09,0 +pvb3_7,1.61,0.09,0 +pvb3_8,1.61,0.09,0 +pvb3_9,1.61,0.09,0 +pvb3_10,1.61,0.09,0 +wind-ofs_1,1.5,0.28,0 +wind-ofs_2,1.5,0.28,0 +wind-ofs_3,1.5,0.28,0 +wind-ofs_4,1.5,0.28,0 +wind-ofs_5,1.5,0.28,0 +wind-ofs_6,1.5,0.28,0 +wind-ofs_7,1.5,0.28,0 +wind-ofs_8,1.5,0.28,0 +wind-ofs_9,1.5,0.28,0 +wind-ofs_10,1.5,0.28,0 +wind-ons_1,2.65,0.21,0 +wind-ons_2,2.65,0.21,0 +wind-ons_3,2.65,0.21,0 +wind-ons_4,2.65,0.21,0 +wind-ons_5,2.65,0.21,0 +wind-ons_6,2.65,0.21,0 +wind-ons_7,2.65,0.21,0 +wind-ons_8,2.65,0.21,0 +wind-ons_9,2.65,0.21,0 +wind-ons_10,2.65,0.21,0 +csp1_1,1.61,0.6,0 +csp1_2,1.61,0.6,0 +csp1_3,1.61,0.6,0 +csp1_4,1.61,0.6,0 +csp1_5,1.61,0.6,0 +csp1_6,1.61,0.6,0 +csp1_7,1.61,0.6,0 +csp1_8,1.61,0.6,0 +csp1_9,1.61,0.6,0 +csp1_10,1.61,0.6,0 +csp1_11,1.61,0.6,0 +csp1_12,1.61,0.6,0 +csp2_1,1.61,0.6,0 +csp2_2,1.61,0.6,0 +csp2_3,1.61,0.6,0 +csp2_4,1.61,0.6,0 +csp2_5,1.61,0.6,0 +csp2_6,1.61,0.6,0 +csp2_7,1.61,0.6,0 +csp2_8,1.61,0.6,0 +csp2_9,1.61,0.6,0 +csp2_10,1.61,0.6,0 +csp2_11,1.61,0.6,0 +csp2_12,1.61,0.6,0 +csp3_1,1.61,0.6,0 +csp3_2,1.61,0.6,0 +csp3_3,1.61,0.6,0 +csp3_4,1.61,0.6,0 +csp3_5,1.61,0.6,0 +csp3_6,1.61,0.6,0 +csp3_7,1.61,0.6,0 +csp3_8,1.61,0.6,0 +csp3_9,1.61,0.6,0 +csp3_10,1.61,0.6,0 +csp3_11,1.61,0.6,0 +csp3_12,1.61,0.6,0 +csp4_1,1.61,0.6,0 +csp4_2,1.61,0.6,0 +csp4_3,1.61,0.6,0 +csp4_4,1.61,0.6,0 +csp4_5,1.61,0.6,0 +csp4_6,1.61,0.6,0 +csp4_7,1.61,0.6,0 +csp4_8,1.61,0.6,0 +csp4_9,1.61,0.6,0 +csp4_10,1.61,0.6,0 +csp4_11,1.61,0.6,0 +csp4_12,1.61,0.6,0 +hydD,7.36,0.14,0 +hydND,7.36,0.14,0 +hydSD,7.36,0.14,0 +hydSND,7.36,0.14,0 +hydUD,7.36,0.14,0 +hydUND,7.36,0.14,0 +hydNPD,7.36,0.14,0 +hydNPND,7.36,0.14,0 +hydED,7.36,0.14,0 +hydEND,7.36,0.14,0 +egs_allkm_1,6.8,0.4,0 +egs_allkm_2,6.8,0.4,0 +egs_allkm_3,6.8,0.4,0 +egs_allkm_4,6.8,0.4,0 +egs_allkm_5,6.8,0.4,0 +egs_allkm_6,6.8,0.4,0 +egs_allkm_7,6.8,0.4,0 +egs_allkm_8,6.8,0.4,0 +egs_allkm_9,6.8,0.4,0 +egs_allkm_10,6.8,0.4,0 +geohydro_allkm_1,6.8,0.4,0 +geohydro_allkm_2,6.8,0.4,0 +geohydro_allkm_3,6.8,0.4,0 +geohydro_allkm_4,6.8,0.4,0 +geohydro_allkm_5,6.8,0.4,0 +geohydro_allkm_6,6.8,0.4,0 +geohydro_allkm_7,6.8,0.4,0 +geohydro_allkm_8,6.8,0.4,0 +geohydro_allkm_9,6.8,0.4,0 +geohydro_allkm_10,6.8,0.4,0 +egs_nearfield_1,6.8,0.4,0 +egs_nearfield_2,6.8,0.4,0 +egs_nearfield_3,6.8,0.4,0 +egs_nearfield_4,6.8,0.4,0 +egs_nearfield_5,6.8,0.4,0 +egs_nearfield_6,6.8,0.4,0 +egs_nearfield_7,6.8,0.4,0 +egs_nearfield_8,6.8,0.4,0 +egs_nearfield_9,6.8,0.4,0 +egs_nearfield_10,6.8,0.4,0 +Gas-CT_H2-CT,1.27,0.14,0.00007 +Gas-CC_H2-CC,1.27,0.14,0.00007 +CoalOldUns_CoalOldScr,11.08,0.22,0.00001 +CoalOldUns_CofireOld,11.08,0.22,0.00001 +CoalOldScr_CofireOld,11.08,0.22,0.00001 +coal-new_CofireNew,11.08,0.22,0.00001 +Gas-CC_Gas-CC-CCS_mod,1.27,0.14,0.00007 +Coal-IGCC_coal-CCS_mod,11.08,0.22,0.00001 +coal-new_coal-CCS_mod,11.08,0.22,0.00001 +CoalOldScr_coal-CCS_mod,11.08,0.22,0.00001 +CoalOldUns_coal-CCS_mod,11.08,0.22,0.00001 +CofireNew_coal-CCS_mod,11.08,0.22,0.00001 +CofireOld_coal-CCS_mod,11.08,0.22,0.00001 +Gas-CC_Gas-CC-CCS_max,1.27,0.14,0.00007 +Coal-IGCC_coal-CCS_max,11.08,0.22,0.00001 +coal-new_coal-CCS_max,11.08,0.22,0.00001 +CoalOldScr_coal-CCS_max,11.08,0.22,0.00001 +CoalOldUns_coal-CCS_max,11.08,0.22,0.00001 +CofireNew_coal-CCS_max,11.08,0.22,0.00001 +CofireOld_coal-CCS_max,11.08,0.22,0.00001 +hydEND_hydED,7.36,0.14,0 +hydED_pumped-hydro,7.18,0.08,0 +hydED_pumped-hydro-flex,7.18,0.08,0 \ No newline at end of file diff --git a/inputs/employment/employment_factor_plant_Rutovitz.csv b/inputs/employment/employment_factor_plant_Rutovitz.csv new file mode 100644 index 000000000..43731f32c --- /dev/null +++ b/inputs/employment/employment_factor_plant_Rutovitz.csv @@ -0,0 +1,206 @@ +,construction,fom,vom +battery_li,0.53,0.23,0 +biopower,14,1.5,0 +beccs_mod,14,1.5,0 +beccs_max,14,1.5,0 +coal-CCS_mod,11.08,0.22,0.00001 +coal-CCS_max,11.08,0.22,0.00001 +coal-CCS-F1,11.08,0.22,0.00001 +coal-CCS-F2,11.08,0.22,0.00001 +coal-CCS-F3,11.08,0.22,0.00001 +Coal-IGCC,11.08,0.22,0.00001 +coal-new,11.08,0.22,0.00001 +CoalOldScr,11.08,0.22,0.00001 +CoalOldUns,11.08,0.22,0.00001 +CofireNew,11.08,0.22,0.00001 +CofireOld,11.08,0.22,0.00001 +csp-ns,1.61,0.14,0 +distpv,4.19,0.13,0 +Gas-CC,1.27,0.14,0.00007 +Gas-CC-CCS_mod,1.27,0.14,0.00007 +Gas-CC-CCS_max,1.27,0.14,0.00007 +Gas-CC-CCS-F1,1.27,0.14,0.00007 +Gas-CC-CCS-F2,1.27,0.14,0.00007 +Gas-CC-CCS-F3,1.27,0.14,0.00007 +Gas-CT,1.27,0.14,0.00007 +H2-CT,1.27,0.14,0.00007 +H2-CC,1.27,0.14,0.00007 +geothermal,6.8,0.4,0 +Hydro,7.36,0.14,0 +lfill-gas,1.27,0.14,0 +Nuclear,11.8,0.6,0 +Nuclear-SMR,11.8,0.6,0 +o-g-s,1.27,0.14,0 +pumped-hydro,7.18,0.08,0 +pumped-hydro-flex,7.18,0.08,0 +upv_1,1.61,0.09,0 +upv_2,1.61,0.09,0 +upv_3,1.61,0.09,0 +upv_4,1.61,0.09,0 +upv_5,1.61,0.09,0 +upv_6,1.61,0.09,0 +upv_7,1.61,0.09,0 +upv_8,1.61,0.09,0 +upv_9,1.61,0.09,0 +upv_10,1.61,0.09,0 +pvb1_1,1.61,0.09,0 +pvb1_2,1.61,0.09,0 +pvb1_3,1.61,0.09,0 +pvb1_4,1.61,0.09,0 +pvb1_5,1.61,0.09,0 +pvb1_6,1.61,0.09,0 +pvb1_7,1.61,0.09,0 +pvb1_8,1.61,0.09,0 +pvb1_9,1.61,0.09,0 +pvb1_10,1.61,0.09,0 +pvb2_1,1.61,0.09,0 +pvb2_2,1.61,0.09,0 +pvb2_3,1.61,0.09,0 +pvb2_4,1.61,0.09,0 +pvb2_5,1.61,0.09,0 +pvb2_6,1.61,0.09,0 +pvb2_7,1.61,0.09,0 +pvb2_8,1.61,0.09,0 +pvb2_9,1.61,0.09,0 +pvb2_10,1.61,0.09,0 +pvb3_1,1.61,0.09,0 +pvb3_2,1.61,0.09,0 +pvb3_3,1.61,0.09,0 +pvb3_4,1.61,0.09,0 +pvb3_5,1.61,0.09,0 +pvb3_6,1.61,0.09,0 +pvb3_7,1.61,0.09,0 +pvb3_8,1.61,0.09,0 +pvb3_9,1.61,0.09,0 +pvb3_10,1.61,0.09,0 +wind-ofs_1,1.5,0.28,0 +wind-ofs_2,1.5,0.28,0 +wind-ofs_3,1.5,0.28,0 +wind-ofs_4,1.5,0.28,0 +wind-ofs_5,1.5,0.28,0 +wind-ofs_6,1.5,0.28,0 +wind-ofs_7,1.5,0.28,0 +wind-ofs_8,1.5,0.28,0 +wind-ofs_9,1.5,0.28,0 +wind-ofs_10,1.5,0.28,0 +wind-ons_1,2.65,0.21,0 +wind-ons_2,2.65,0.21,0 +wind-ons_3,2.65,0.21,0 +wind-ons_4,2.65,0.21,0 +wind-ons_5,2.65,0.21,0 +wind-ons_6,2.65,0.21,0 +wind-ons_7,2.65,0.21,0 +wind-ons_8,2.65,0.21,0 +wind-ons_9,2.65,0.21,0 +wind-ons_10,2.65,0.21,0 +csp1_1,1.61,0.6,0 +csp1_2,1.61,0.6,0 +csp1_3,1.61,0.6,0 +csp1_4,1.61,0.6,0 +csp1_5,1.61,0.6,0 +csp1_6,1.61,0.6,0 +csp1_7,1.61,0.6,0 +csp1_8,1.61,0.6,0 +csp1_9,1.61,0.6,0 +csp1_10,1.61,0.6,0 +csp1_11,1.61,0.6,0 +csp1_12,1.61,0.6,0 +csp2_1,1.61,0.6,0 +csp2_2,1.61,0.6,0 +csp2_3,1.61,0.6,0 +csp2_4,1.61,0.6,0 +csp2_5,1.61,0.6,0 +csp2_6,1.61,0.6,0 +csp2_7,1.61,0.6,0 +csp2_8,1.61,0.6,0 +csp2_9,1.61,0.6,0 +csp2_10,1.61,0.6,0 +csp2_11,1.61,0.6,0 +csp2_12,1.61,0.6,0 +csp3_1,1.61,0.6,0 +csp3_2,1.61,0.6,0 +csp3_3,1.61,0.6,0 +csp3_4,1.61,0.6,0 +csp3_5,1.61,0.6,0 +csp3_6,1.61,0.6,0 +csp3_7,1.61,0.6,0 +csp3_8,1.61,0.6,0 +csp3_9,1.61,0.6,0 +csp3_10,1.61,0.6,0 +csp3_11,1.61,0.6,0 +csp3_12,1.61,0.6,0 +csp4_1,1.61,0.6,0 +csp4_2,1.61,0.6,0 +csp4_3,1.61,0.6,0 +csp4_4,1.61,0.6,0 +csp4_5,1.61,0.6,0 +csp4_6,1.61,0.6,0 +csp4_7,1.61,0.6,0 +csp4_8,1.61,0.6,0 +csp4_9,1.61,0.6,0 +csp4_10,1.61,0.6,0 +csp4_11,1.61,0.6,0 +csp4_12,1.61,0.6,0 +hydD,7.36,0.14,0 +hydND,7.36,0.14,0 +hydSD,7.36,0.14,0 +hydSND,7.36,0.14,0 +hydUD,7.36,0.14,0 +hydUND,7.36,0.14,0 +hydNPD,7.36,0.14,0 +hydNPND,7.36,0.14,0 +hydED,7.36,0.14,0 +hydEND,7.36,0.14,0 +egs_allkm_1,6.8,0.4,0 +egs_allkm_2,6.8,0.4,0 +egs_allkm_3,6.8,0.4,0 +egs_allkm_4,6.8,0.4,0 +egs_allkm_5,6.8,0.4,0 +egs_allkm_6,6.8,0.4,0 +egs_allkm_7,6.8,0.4,0 +egs_allkm_8,6.8,0.4,0 +egs_allkm_9,6.8,0.4,0 +egs_allkm_10,6.8,0.4,0 +geohydro_allkm_1,6.8,0.4,0 +geohydro_allkm_2,6.8,0.4,0 +geohydro_allkm_3,6.8,0.4,0 +geohydro_allkm_4,6.8,0.4,0 +geohydro_allkm_5,6.8,0.4,0 +geohydro_allkm_6,6.8,0.4,0 +geohydro_allkm_7,6.8,0.4,0 +geohydro_allkm_8,6.8,0.4,0 +geohydro_allkm_9,6.8,0.4,0 +geohydro_allkm_10,6.8,0.4,0 +egs_nearfield_1,6.8,0.4,0 +egs_nearfield_2,6.8,0.4,0 +egs_nearfield_3,6.8,0.4,0 +egs_nearfield_4,6.8,0.4,0 +egs_nearfield_5,6.8,0.4,0 +egs_nearfield_6,6.8,0.4,0 +egs_nearfield_7,6.8,0.4,0 +egs_nearfield_8,6.8,0.4,0 +egs_nearfield_9,6.8,0.4,0 +egs_nearfield_10,6.8,0.4,0 +Gas-CT_H2-CT,1.27,0.14,0.00007 +Gas-CC_H2-CC,1.27,0.14,0.00007 +CoalOldUns_CoalOldScr,11.08,0.22,0.00001 +CoalOldUns_CofireOld,11.08,0.22,0.00001 +CoalOldScr_CofireOld,11.08,0.22,0.00001 +coal-new_CofireNew,11.08,0.22,0.00001 +Gas-CC_Gas-CC-CCS_mod,1.27,0.14,0.00007 +Coal-IGCC_coal-CCS_mod,11.08,0.22,0.00001 +coal-new_coal-CCS_mod,11.08,0.22,0.00001 +CoalOldScr_coal-CCS_mod,11.08,0.22,0.00001 +CoalOldUns_coal-CCS_mod,11.08,0.22,0.00001 +CofireNew_coal-CCS_mod,11.08,0.22,0.00001 +CofireOld_coal-CCS_mod,11.08,0.22,0.00001 +Gas-CC_Gas-CC-CCS_max,1.27,0.14,0.00007 +Coal-IGCC_coal-CCS_max,11.08,0.22,0.00001 +coal-new_coal-CCS_max,11.08,0.22,0.00001 +CoalOldScr_coal-CCS_max,11.08,0.22,0.00001 +CoalOldUns_coal-CCS_max,11.08,0.22,0.00001 +CofireNew_coal-CCS_max,11.08,0.22,0.00001 +CofireOld_coal-CCS_max,11.08,0.22,0.00001 +hydEND_hydED,7.36,0.14,0 +hydED_pumped-hydro,7.18,0.08,0 +hydED_pumped-hydro-flex,7.18,0.08,0 \ No newline at end of file diff --git a/inputs/sets/jtype.csv b/inputs/sets/jtype.csv new file mode 100644 index 000000000..4c3e2f6bb --- /dev/null +++ b/inputs/sets/jtype.csv @@ -0,0 +1,3 @@ +construction +fom +vom \ No newline at end of file diff --git a/reeds/log.py b/reeds/log.py index 2dee9a4ab..c60fe2e4b 100755 --- a/reeds/log.py +++ b/reeds/log.py @@ -68,7 +68,7 @@ def toc(tic, year, process, path=''): def get_solve_times(path=''): """Get all solve times, disaggregated by GAMS/barrier/crossover/remainder. Disaggregation only works when using CPLEX as the solver.""" - # path = '/Users/pbrown/github/ReEDS-2.0/runs/v20240111_stressM0_stress_WECC_crossover' + #path = '/Users/apham/Documents/GitHub/ReEDS/ReEDS-2.0/runs/test_log' lengths = { 'gams': {}, 'barrier': {}, @@ -79,7 +79,7 @@ def get_solve_times(path=''): 'start': {}, 'stop': {}, } - with open(os.path.join(path, 'gamslog.txt'), 'r') as f: + with open(os.path.join(path, 'gamslog.txt'), 'r', encoding="ISO-8859-1") as f: for _line in f: line = _line.strip() ## Get the year/iteration diff --git a/runbatch.py b/runbatch.py index 33b329796..0441501c6 100644 --- a/runbatch.py +++ b/runbatch.py @@ -9,7 +9,6 @@ import time import shutil import csv -import importlib import numpy as np import pandas as pd import subprocess @@ -283,8 +282,6 @@ def check_compatibility(sw): .format('\n'.join(err_switch_configs)) ) - reeds.inputs.validate_zoneset(sw['GSw_ZoneSet']) - ### Aggregation if (sw['GSw_RegionResolution'] != 'aggreg') and (int(sw['GSw_NumCSPclasses']) != 12): raise NotImplementedError( @@ -295,7 +292,7 @@ def check_compatibility(sw): ### Parsed string switches ## Automatic inputs reeds_path = os.path.dirname(__file__) - hierarchy = reeds.io.get_hierarchy(GSw_ZoneSet=sw['GSw_ZoneSet']).reset_index() + hierarchy = pd.read_csv(os.path.join(reeds_path,'inputs','hierarchy.csv')) for threshold in sw['GSw_PRM_StressThreshold'].split('/'): ## Example: threshold = 'transgrp_10_EUE_sum' @@ -428,29 +425,33 @@ def check_compatibility(sw): raise ValueError(err) # Add a row for each county - ## TEMPORARY 20260402 until the aggregation procedure is updated - county2zone = reeds.io.get_county2zone(GSw_ZoneSet='z134', as_map=False) + county2zone = pd.read_csv( + os.path.join(reeds_path, 'inputs', 'county2zone.csv'), dtype={'FIPS':str}, + ) county2zone['county'] = 'p' + county2zone.FIPS # Add county info to hierarchy - hierarchy = hierarchy.merge(county2zone.drop(columns=['FIPS','state']), on='r') - - # Make sure specified regions are allowed for the specified hierarchy level - region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] - for group in region_groups: - level, regions = group.split('/') - if level not in hierarchy: - err = ( - f"The specified hierarchy level '{level}' does not exist in the hierarchy file." - f"\nUpdate GSw_Region={sw['GSw_Region']} to specify a valid level." - ) - raise ValueError(err) - invalid_regions = [ - region for region in regions.split('.') - if region.lower() not in hierarchy[level].str.lower().values - ] - if invalid_regions: - err = f"GSw_Region: {', '.join(invalid_regions)} need to be in {hierarchy[level].unique()}" - raise Exception(err) + hierarchy = hierarchy.merge(county2zone.drop(columns=['FIPS','state']), on='ba') + + if '/' in sw['GSw_Region']: + # Handle multiple spatial resolutions + region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] + for group in region_groups: + level, regions = group.split('/') + if level not in hierarchy: + raise ValueError("Fix level in GSw_Region") + invalid_regions = [ + region for region in regions.split('.') + if region.lower() not in hierarchy[level].str.lower().values + ] + if invalid_regions: + err = f"GSw_Region: {', '.join(invalid_regions)} need to be in {hierarchy[level].unique()}" + raise Exception(err) + else: + modeled_regions = pd.read_csv( + os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv') + ) + if sw['GSw_Region'] not in modeled_regions: + raise ValueError("No column in modeled_regions.csv matching GSw_Region") ### Compatible switch combinations if sw['GSw_LoadProfiles'] == 'historic': @@ -496,19 +497,6 @@ def check_compatibility(sw): ### Contents of user-specified files reeds.checks.check_switches(sw) - ### Uncommonly used packages - if sw['GSw_HourlyClusterAlgorithm'].lower().startswith('kmedoids'): - if importlib.util.find_spec("sklearn_extra") is None: - err = ( - "The scikit-learn-extra package is required for GSw_HourlyClusterAlgorithm=" - f"{sw['GSw_HourlyClusterAlgorithm']} but is not available in your conda " - "environment. Please install it by running:\n" - " pip install 'scikit-learn-extra>=0.2.0,<0.3.0'" - "\nor:\n" - " conda install -c conda-forge scikit-learn-extra=0.2" - ) - raise ModuleNotFoundError(err) - def solvestring_sequential( batch_case, caseSwitches, @@ -543,6 +531,7 @@ def solvestring_sequential( 'GSw_ClimateHydro', 'GSw_ClimateWater', 'GSw_gopt', + 'GSw_gopt_mga', 'GSw_HourlyChunkLengthRep', 'GSw_HourlyChunkLengthStress', 'GSw_HourlyType', diff --git a/runfiles.csv b/runfiles.csv index 1a60f823d..3179e6f7b 100644 --- a/runfiles.csv +++ b/runfiles.csv @@ -127,6 +127,8 @@ e.csv,inputs/sets/e.csv,1,ignore,ignore,,,,,0,,,,e,, eall.csv,inputs/sets/eall.csv,1,ignore,ignore,,,,,,,,,eall,, emit_rate.csv,,1,ignore,ignore,,"etype,e,i,v,r",,0,0,,,,,,ReEDS-to-PLEXOS output emitrate.csv,inputs/emission_constraints/emitrate.csv,1,ignore,ignore,,,,,0,,,,,, +employment_factor_plant.csv,inputs/employment/employment_factor_plant_{GSw_EmploymentFactor}.csv,1,ignore,ignore,,,,,0,,,,,, +employment_factor_inter_transmission.csv,inputs/employment/employment_factor_inter_transmission.csv,1,ignore,ignore,,,,,0,,,,,, energy_communities.csv,inputs/financials/energy_communities.csv,1,ignore,ignore,,,,,0,,,,,,region aggregation and filtering is handled in copy_files etype.csv,inputs/sets/etype.csv,1,ignore,ignore,,,,,,,,,etype,, eval_period_adj_mult.csv,,1,ignore,ignore,,,,,0,,,,,, @@ -233,12 +235,13 @@ itc_frac_monetized.csv,,1,ignore,ignore,,,,,0,,,,,, itc_fractions.csv,,1,ignore,ignore,,"i,country,t",,0,0,,,,,, ivt.csv,,1,ignore,ignore,,,,,0,,,,,,created in runbatch.py ivt_step.csv,,1,ignore,ignore,,,,,0,,,,,, +jtype.csv,inputs/sets/jtype.csv,1,ignore,ignore,,,,,,,,,jtype,, lcclike.csv,inputs/sets/lcclike.csv,1,ignore,ignore,,,,,0,,,,lcclike,, load_2010.csv,,1,sum,ignore,r,wide,,1,0,,1,,,,disaggfunc set to ignore because load will already be in correct spatial resolution load_allyear.csv,,1,sum,ignore,*r,"h,t",,0,0,,1,,,,disaggfunc set to ignore because load will already be in correct spatial resolution load_multiplier.csv,inputs/load/demand_{demandscen}.csv,1,ignore,ignore,,,,,0,,,,,, load_multiplier_r.csv,,1,ignore,ignore,,,,1,0,,,,,, -loadsite_annual.csv,inputs/load/loadsite_{GSw_LoadSiteTrajectory}.csv,float(sw.GSw_LoadSiteCF) > 0,ignore,ignore,*loadsitereg,t,,,0,,,,,, +loadsite_annual.csv,inputs/load/loadsite_{GSw_LoadSiteTrajectory}.csv,int(sw.GSw_LoadSiteCF) != 0,ignore,ignore,*loadsitereg,t,,,0,,,,,, maps.gpkg,,1,ignore,ignore,,,,,,,1,,,, maxage.csv,inputs/plant_characteristics/maxage.csv,1,ignore,ignore,,,,,0,,,,,, maxdailycf.csv,inputs/plant_characteristics/maxdailycf.csv,int(sw.GSw_MaxDailyCF) != 0,ignore,ignore,,,,,0,,,,,, @@ -314,7 +317,6 @@ plantchar_dr_shed_vom.csv,inputs/plant_characteristics/dr_shed_vom_{dr_shedscen} plantchar_dr_shed_fom.csv,inputs/plant_characteristics/dr_shed_fom_{dr_shedscen}.csv,int(sw.GSw_DRShed) != 0,ignore,ignore,r,"tech,wide",,1,0,,,,,,used to define plantcharout.csv plantchar_evmc_shape.csv,inputs/plant_characteristics/evmc_shape_{evmcscen}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_evmc_storage.csv,inputs/plant_characteristics/evmc_storage_{evmcscen}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv -plantchar_fuelcell.csv,inputs/plant_characteristics/{plantchar_fuelcell}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_gas_ccs.csv,inputs/plant_characteristics/{plantchar_gas_ccs}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_gas.csv,inputs/plant_characteristics/{plantchar_gas}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_geo.csv,inputs/plant_characteristics/{plantchar_geo}.csv,int(sw.GSw_Geothermal) != 0,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv @@ -427,6 +429,10 @@ tranloss.csv,,1,trans_lookup,ignore,"*r,rr",trtype,,0,0,drop_dup_r,1,,,,disaggfu trans_itc_fractions.csv,,1,ignore,ignore,,,,,0,,,,,, transmission_capacity_future.csv,inputs/transmission/transmission_capacity_future_{lvl}_{GSw_TransScen}.csv,1,sum,ignore,"r,rr","status,trtype,t",,0,0,drop_dup_r,,,,,'ignore’ in disaggfunc because all transmisison data will be read into model at appropriate spatial resolution transmission_capacity_future_baseline.csv,inputs/transmission/transmission_capacity_future_{lvl}_baseline.csv,1,sum,ignore,"r,rr","status,trtype,t",,0,0,drop_dup_r,,,,,'ignore’ in disaggfunc because all transmisison data will be read into model at appropriate spatial resolution +transmission_capacity_init_AC_r.csv,inputs/transmission/transmission_capacity_init_AC_{lvl}_{GSw_TransNetworkSource}.csv,1,sum,ignore,"r,rr",interface,,0,0,drop_dup_r,,,,, +transmission_capacity_init_AC_itlgrp.csv,inputs/transmission/transmission_capacity_init_AC_ba_{GSw_TransNetworkSource}.csv,1,sum,ignore,"r,rr",interface,,0,0,drop_dup_r,,,,, +transmission_capacity_init_AC_transgrp.csv,inputs/transmission/transmission_capacity_init_AC_transgrp_{GSw_TransNetworkSource}.csv,1,sum,ignore,"transgrp,transgrpp",interface,,0,0,,,,,, +transmission_capacity_init_nonAC.csv,inputs/transmission/transmission_capacity_init_nonAC_{lvl}.csv,1,sum,ignore,"r,rr",trtype,,0,0,drop_dup_r,,,,,'ignore’ in disaggfunc because all transmisison data will be read into model at appropriate spatial resolution transmission_cost_ac.csv,inputs/transmission/transmission_cost_ac_{GSw_TransUpgradeMethod}_{lvl}.h5,1,trans_lookup,ignore,"r,rr",tscbin,,0,0,drop_dup_r,,,,, transmission_cost_dc.csv,inputs/transmission/transmission_cost_dc_{lvl}.csv,1,trans_lookup,ignore,"r,rr",,,0,0,drop_dup_r,,,,, transmission_distance.csv,inputs/transmission/transmission_distance_{lvl}.h5,1,trans_lookup,ignore,"r,rr",,,0,0,drop_dup_r,,,,,Stored in wide-format h5 to reduce county filesize but converted to long in copy_files.py @@ -496,6 +502,8 @@ c_supplymodel.gms,c_supplymodel.gms,1,ignore,ignore,,,,,,,,,,, c_supplyobjective.gms,c_supplyobjective.gms,1,ignore,ignore,,,,,,,,,,, cbc.opt,cbc.opt,1,ignore,ignore,,,,,,,,,,, cplex.op2,cplex.op2,1,ignore,ignore,,,,,,,,,,, +cplex.op3,cplex.op3,1,ignore,ignore,,,,,,,,,,, +cplex.op4,cplex.op4,1,ignore,ignore,,,,,,,,,,, cplex.opt,cplex.opt,1,ignore,ignore,,,,,,,,,,, createmodel.gms,createmodel.gms,1,ignore,ignore,,,,,,,,,,, d_solveallyears.gms,d_solveallyears.gms,1,ignore,ignore,,,,,,,,,,, @@ -522,4 +530,4 @@ max_hintage_number.txt,,1,ignore,ignore,,,,,0,,,,,, raw_value_streams.py,raw_value_streams.py,1,ignore,ignore,,,,,,,,,,, runbatch.py,runbatch.py,1,ignore,ignore,,,,,,,,,,, tc_phaseout.py,tc_phaseout.py,1,ignore,ignore,,,,,,,,,,, -valuestreams.py,valuestreams.py,1,ignore,ignore,,,,,,,,,,, +valuestreams.py,valuestreams.py,1,ignore,ignore,,,,,,,,,,, \ No newline at end of file From 261d0f441bfb0aaa51a0fbd1ff2c2d4160b0ae27 Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 12:59:17 -0600 Subject: [PATCH 02/37] use gentech as MGA subobjective instead of all techs --- b_inputs.gms | 2 + c_mga.gms | 13 --- cases.csv | 2 +- inputs/tech-subset-table.csv | 148 +++++++++++++++++------------------ 4 files changed, 77 insertions(+), 88 deletions(-) diff --git a/b_inputs.gms b/b_inputs.gms index cbbfebe16..a3cb2c06c 100644 --- a/b_inputs.gms +++ b/b_inputs.gms @@ -453,6 +453,7 @@ set gas_cc(i) "techs that are gas combined cycle", gas_ct(i) "techs that are gas combustion turbine", gas(i) "techs that use gas (but not o-g-s)", + gentech(i) "generation technologies", geo(i) "geothermal technologies", geo_base(i) "geothermal technologies typically considered in model runs", geo_hydro(i) "geothermal hydrothermal technologies", @@ -981,6 +982,7 @@ gas_cc_ccs(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc_ccs') ; gas_cc(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc') ; gas_ct(i)$(not ban(i)) = yes$i_subsets(i,'gas_ct') ; gas(i)$(not ban(i)) = yes$i_subsets(i,'gas') ; +gentech(i)$(not ban(i)) = yes$i_subsets(i,'gentech') geo(i)$(not ban(i)) = yes$i_subsets(i,'geo') ; geo_base(i)$(not ban(i)) = yes$i_subsets(i,'geo_base') ; geo_hydro(i)$(not ban(i)) = yes$i_subsets(i,'geo_hydro') ; diff --git a/c_mga.gms b/c_mga.gms index 3bbe72236..23e66ce68 100644 --- a/c_mga.gms +++ b/c_mga.gms @@ -12,19 +12,6 @@ eq_MGA_CostEnvelope(t)$[tmodel(t)$Sw_MGA].. * --------------------------------------------------------------------------- $ifthen.mgaobj %GSw_MGA_Objective% == 'capacity' -$ifthen.mgasubobj %GSw_MGA_SubObjective% == 'all' -Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; -Variable MGA_OBJ "--MW-- Capacity of all technologies to be minimized/maximied" ; -eq_MGA_Objective$Sw_MGA.. - MGA_OBJ - =e= - sum{(i,v,r,t) - $[tmodel(t) - $valcap(i,v,r,t)], - CAP(i,v,r,t) - } -; -$else.mgasubobj Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; Variable MGA_OBJ "--MW-- Capacity of technology to be minimized/maximied" ; eq_MGA_Objective$Sw_MGA.. diff --git a/cases.csv b/cases.csv index 0dc5bb244..70585853c 100644 --- a/cases.csv +++ b/cases.csv @@ -219,7 +219,7 @@ GSw_MethaneLeakageScen,Fractional leakage of methane from upstream natural gas p GSw_MGA_CostDelta,MGA: Fraction by which to allow objective function to increase when using Modeling to Generate Alternatives (MGA is turned off if set to 0; a common choice for MGA is 0.01),float,0, GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, -GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind|all),storage, +GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|geo|gentech|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind),gentech, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, GSw_MingenFixed,Turn on/off fixed min-gen constraints,0; 1,1, diff --git a/inputs/tech-subset-table.csv b/inputs/tech-subset-table.csv index 2c5507ec3..e17ad247d 100644 --- a/inputs/tech-subset-table.csv +++ b/inputs/tech-subset-table.csv @@ -1,74 +1,74 @@ -,BIO,COAL,COAL_CCS,GAS,GAS_CC,GAS_CC_CCS,GAS_CT,COMBINED_CYCLE,COMBUSTION_TURBINE,FUEL_CELL,CONV,CCS,CCS_MOD,CCS_MAX,CCSFLEX,CCSFLEX_BYP,CCSFLEX_STO,CCSFLEX_DAC,BECCS,RE,VRE,RSC,WIND,ONSWIND,OFSWIND,UPV,distpv,PV,PVB,PVB1,PVB2,PVB3,CSP,CSP_STORAGE,CSP1,CSP2,CSP3,CSP4,STORAGE,STORAGE_HYBRID,STORAGE_STANDALONE,STORAGE_INTERDAY,THERMAL_STORAGE,BATTERY,DEMAND_FLEX,EVMC,EVMC_STORAGE,EVMC_SHAPE,COFIRE,HYDRO,HYDRO_D,HYDRO_ND,PSH,GEO,GEO_HYDRO,GEO_EGS,GEO_EGS_ALLKM,GEO_EGS_NF,GEO_BASE,GEO_EXTRA,CANADA,VRE_NO_CSP,VRE_UTILITY,VRE_DISTRIBUTED,NUCLEAR,OGS,CONSUME,H2,SMR,DAC,LFILL,H2_COMBUSTION,H2_CC,H2_CT,REFURBTECH,cf_tech,FOSSIL,BOILER,NONDISPATCH,DR_SHED -can-imports,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,, -coal-CCS_mod,,YES,YES,,,,,,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -coal-CCS_max,,YES,YES,,,,,,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -coal-CCS-F1,,YES,YES,,,,,,,,YES,YES,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -coal-CCS-F2,,YES,YES,,,,,,,,YES,YES,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -coal-CCS-F3,,YES,YES,,,,,,,,YES,YES,YES,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -Coal-IGCC,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -coal-new,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -CoalOldScr,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -CoalOldUns,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -CofireNew,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -CofireOld,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,, -Gas-CC,,,,YES,YES,,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC_H_1x1,,,,YES,YES,,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC_H_2x1,,,,YES,YES,,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC-CCS_mod,,,,YES,YES,YES,,YES,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC-CCS_max,,,,YES,YES,YES,,YES,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC_H_1x1-CCS_mod,,,,YES,YES,YES,,YES,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC_H_1x1-CCS_max,,,,YES,YES,YES,,YES,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC_H_2x1-CCS_mod,,,,YES,YES,YES,,YES,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC_H_2x1-CCS_max,,,,YES,YES,YES,,YES,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC-CCS-F1,,,,YES,YES,YES,,YES,,,YES,YES,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC-CCS-F2,,,,YES,YES,YES,,YES,,,YES,YES,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CC-CCS-F3,,,,YES,YES,YES,,YES,,,YES,YES,YES,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CT,,,,YES,,,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -Gas-CT_aero,,,,YES,,,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -ng-fuel-cell,,,,YES,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,, -o-g-s,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,YES,YES,, -Nuclear,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,YES,, -Nuclear-SMR,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,YES,, -H2-CT,,,,,,,,,YES,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,, -H2-CC,,,,,,,,YES,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,, -biopower,YES,,,,,,,,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,, -geothermal,,,,,,,,,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,, -beccs_mod,YES,,,,,,,,,,YES,YES,YES,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,, -beccs_max,YES,,,,,,,,,,YES,YES,,YES,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,, -Hydro,,,,,,,,,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -lfill-gas,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,, -battery_li,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -dr_shed_1*dr_shed_2,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES -evmc_storage_1*evmc_storage_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,YES,,YES,,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,, -evmc_shape_1*evmc_shape_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,, -pumped-hydro,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,YES,,YES,YES,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,, -pumped-hydro-flex,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,, -distpv,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,,YES, -upv_1*upv_10,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,YES,YES,,,, -pvb1_1*pvb1_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,YES,YES,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,, -pvb2_1*pvb2_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,YES,,YES,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,, -pvb3_1*pvb3_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,YES,,,YES,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,, -wind-ofs_1*wind-ofs_10,,,,,,,,,,,,,,,,,,,,YES,YES,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,YES,YES,,,, -wind-ons_1*wind-ons_10,,,,,,,,,,,,,,,,,,,,YES,YES,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,YES,YES,,,, -csp1_1*csp1_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,YES,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -csp2_1*csp2_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,YES,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -csp3_1*csp3_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -csp4_1*csp4_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -hydD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -hydND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES, -hydSD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -hydSND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES, -hydUD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -hydUND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES, -hydNPD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -hydNPND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES, -hydED,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,, -hydEND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES, -electrolyzer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,, -smr,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,, -smr_ccs,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,, -dac,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,, -dac_gas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,, -egs_allkm_1*egs_allkm_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,YES,,,YES,,,,,,,,,,,,,,,,,,,, -geohydro_allkm_1*geohydro_allkm_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,YES,,,,,,,,,,,,,,,,,,,,, -egs_nearfield_1*egs_nearfield_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,, +,BIO,COAL,COAL_CCS,GAS,GAS_CC,GAS_CC_CCS,GAS_CT,COMBINED_CYCLE,COMBUSTION_TURBINE,FUEL_CELL,CONV,CCS,CCS_MOD,CCS_MAX,CCSFLEX,CCSFLEX_BYP,CCSFLEX_STO,CCSFLEX_DAC,BECCS,RE,VRE,RSC,WIND,ONSWIND,OFSWIND,UPV,distpv,PV,PVB,PVB1,PVB2,PVB3,CSP,CSP_STORAGE,CSP1,CSP2,CSP3,CSP4,STORAGE,STORAGE_HYBRID,STORAGE_STANDALONE,STORAGE_INTERDAY,THERMAL_STORAGE,BATTERY,DEMAND_FLEX,EVMC,EVMC_STORAGE,EVMC_SHAPE,COFIRE,HYDRO,HYDRO_D,HYDRO_ND,PSH,GEO,GEO_HYDRO,GEO_EGS,GEO_EGS_ALLKM,GEO_EGS_NF,GEO_BASE,GEO_EXTRA,CANADA,VRE_NO_CSP,VRE_UTILITY,VRE_DISTRIBUTED,NUCLEAR,OGS,CONSUME,H2,SMR,DAC,LFILL,H2_COMBUSTION,H2_CC,H2_CT,REFURBTECH,cf_tech,FOSSIL,BOILER,NONDISPATCH,DR_SHED,GENTECH +can-imports,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,, +coal-CCS_mod,,YES,YES,,,,,,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +coal-CCS_max,,YES,YES,,,,,,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +coal-CCS-F1,,YES,YES,,,,,,,,YES,YES,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +coal-CCS-F2,,YES,YES,,,,,,,,YES,YES,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +coal-CCS-F3,,YES,YES,,,,,,,,YES,YES,YES,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +Coal-IGCC,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +coal-new,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +CoalOldScr,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +CoalOldUns,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +CofireNew,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +CofireOld,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,YES +Gas-CC,,,,YES,YES,,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC_H_1x1,,,,YES,YES,,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC_H_2x1,,,,YES,YES,,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC-CCS_mod,,,,YES,YES,YES,,YES,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC-CCS_max,,,,YES,YES,YES,,YES,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC_H_1x1-CCS_mod,,,,YES,YES,YES,,YES,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC_H_1x1-CCS_max,,,,YES,YES,YES,,YES,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC_H_2x1-CCS_mod,,,,YES,YES,YES,,YES,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC_H_2x1-CCS_max,,,,YES,YES,YES,,YES,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC-CCS-F1,,,,YES,YES,YES,,YES,,,YES,YES,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC-CCS-F2,,,,YES,YES,YES,,YES,,,YES,YES,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CC-CCS-F3,,,,YES,YES,YES,,YES,,,YES,YES,YES,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CT,,,,YES,,,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +Gas-CT_aero,,,,YES,,,YES,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +ng-fuel-cell,,,,YES,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,YES +o-g-s,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,YES,YES,,,YES +Nuclear,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,YES,,,YES +Nuclear-SMR,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,YES,,,YES +H2-CT,,,,,,,,,YES,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,YES +H2-CC,,,,,,,,YES,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,YES +biopower,YES,,,,,,,,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES +geothermal,,,,,,,,,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,YES +beccs_mod,YES,,,,,,,,,,YES,YES,YES,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES +beccs_max,YES,,,,,,,,,,YES,YES,,YES,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES +Hydro,,,,,,,,,,,YES,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES +lfill-gas,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,YES +battery_li,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES +dr_shed_1*dr_shed_2,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES, +evmc_storage_1*evmc_storage_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,YES,,YES,,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,, +evmc_shape_1*evmc_shape_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,, +pumped-hydro,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,YES,,YES,YES,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES +pumped-hydro-flex,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES +distpv,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,,YES,,YES +upv_1*upv_10,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,YES,YES,,,,,YES +pvb1_1*pvb1_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,YES,YES,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,YES +pvb2_1*pvb2_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,YES,,YES,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,YES +pvb3_1*pvb3_10,,,,,,,,,,,,,,,,,,,,,,YES,,,,,,,YES,,,YES,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,YES +wind-ofs_1*wind-ofs_10,,,,,,,,,,,,,,,,,,,,YES,YES,YES,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,YES,YES,,,,,YES +wind-ons_1*wind-ons_10,,,,,,,,,,,,,,,,,,,,YES,YES,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,YES,YES,,,,,YES +csp1_1*csp1_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,YES,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +csp2_1*csp2_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,YES,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +csp3_1*csp3_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +csp4_1*csp4_12,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,YES,YES,,,,YES,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +hydD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +hydND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,YES +hydSD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +hydSND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,YES +hydUD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +hydUND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,YES +hydNPD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +hydNPND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,YES +hydED,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES +hydEND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,YES +electrolyzer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,YES +smr,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,,,YES +smr_ccs,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,,,YES +dac,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,,,YES +dac_gas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,,,YES +egs_allkm_1*egs_allkm_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,YES,,,YES,,,,,,,,,,,,,,,,,,,,,YES +geohydro_allkm_1*geohydro_allkm_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,YES,,,,,,,,,,,,,,,,,,,,,,YES +egs_nearfield_1*egs_nearfield_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,YES \ No newline at end of file From 0149846328abeb6f5b00db452501ee807b1a824e Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 13:42:49 -0600 Subject: [PATCH 03/37] resolve conflicts --- cases.csv | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cases.csv b/cases.csv index 70585853c..21dcd2901 100644 --- a/cases.csv +++ b/cases.csv @@ -15,6 +15,7 @@ plantchar_biopower,Biopower generators cost and performance characteristics (inp plantchar_coal_ccs,Coal CCS generators cost and performance characteristics (inputs\plant_characteristics\{plantchar_coal_ccs}.csv). Options start with 'coal-ccs_' and the switch should be set to the entire file name (ex: coal-ccs_ATB_2024_moderate),coal-ccs_ATB_(2024)_(conservative|moderate|advanced),coal-ccs_ATB_2024_moderate, plantchar_coal,Coal generators cost and performance characteristics (inputs\plant_characteristics\{plantchar_coal}.csv). Options start with 'coal_' and the switch should be set to the entire file name (ex: coal_ATB_2024_moderate),coal_ATB_(2024)_(moderate),coal_ATB_2024_moderate, plantchar_csp,CSP cost and performance characteristics (inputs\plant_characteristics\{plantchar_csp}.csv). The options for plantchar_csp start with 'csp_' and the switch should be set to the entire file name (ex: csp_ATB_2024_advanced),csp_ATB_(2023|2024)_(conservative|moderate|advanced),csp_ATB_2024_moderate, +plantchar_fuelcell,Fuel cell cost and performance characteristics (inputs\plant_characteristics\{plantchar_fuelcell}.csv). The options for plantchar_fuelcell start with 'fuelcell_' and the switch should be set to the entire file name (ex: fuelcell_ATB_2024_advanced),fuelcell_ATB_2024_(moderate|advanced),fuelcell_ATB_2024_moderate, plantchar_gas_ccs,Natural gas CCS generator cost and performance characteristics (inputs\plant_characteristics\{plantchar_gas_ccs}.csv). Options start with 'gas-ccs' and the switch should be set to the entire file name (ex: gas-ccs_ATB_2024_moderate),gas-ccs_ATB_(2024)_(conservative|moderate|advanced),gas-ccs_ATB_2024_moderate, plantchar_gas,Natural gas generator cost and performance characteristics (inputs\plant_characteristics\{plantchar_gas}.csv). Options start with 'gas_' and the switch should be set to the entire file name (ex: gas_ATB_2024_moderate),gas_ATB_(2024)_(moderate),gas_ATB_2024_moderate, plantchar_geo,Geothermal cost setting (inputs\plant_characteristics\{plantchar_geo}.csv).The options for plantchar_geo start with 'geo_' and the switch should be set to the entire file name (ex: geo_ATB_2023_conservative),geo_ATB_(2023|2024)_(conservative|moderate|advanced),geo_ATB_2024_moderate, @@ -46,7 +47,7 @@ retscen,Retirement Scenario,Nuke60RetireYear; Nuke80RetireYear; NukeEarlyRetireY supplycurve,Wind and Solar Supply Curves,default; 0; naris; 2018,default, uraniumscen,Uranium price scenario,AEO_(2023|2025)_reference,AEO_2025_reference, GSw_Region,Specify column from inputs/userinput/modeled_regions.csv or from {column of hierarchy.csv}/{period-delimited entries to keep from that column},N/A,country/USA, -GSw_RegionResolution,Specify the spatial resolution of modeled regions,county; ba; aggreg; mixed,aggreg, +GSw_ZoneSet,Set of geospatial zones to use as balancing areas (described in inputs/zones/README.md),^(z48|z54|z69|z132|z134|z3109|UTcounty|PJMcounty)$,z132 capcredit_hierarchy_level,Select level at which to aggregate net load for capacity-credit calculation,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region,transreg, construction_schedules_suffix,File suffix for construction schedules,default,default, construction_times_suffix,File suffix for construction times by technology,default,default, @@ -136,6 +137,7 @@ GSw_EFS2_FlexCase,"Case used for electrification flex_type - format is {1}_{2}, GSw_EmploymentFactor,Employment factor - options to choose from are factor from JEDI model and two papers,JEDI; Mayfield ;Rutovitz ;Ram ,JEDI, GSw_EVMC,Turn on adoptable EV managed charging,0; 1,0, GSw_ForcePrescription,Turn on/off forced prescriptions - turning off will allow unlimited but not free builds in historical years,0; 1,1, +GSw_FuelCell,Turn on/off fuel cells (natural gas / H2) as a technology option,0; 1,0, GSw_FutureHydCF_RepYears,_-delimited years of historical hydro plant data from which to calculate capacity factors representing future hydro,N/A,2007_2008_2009_2010_2011_2012_2013_2016_2017_2018_2019_2020_2021_2022, GSw_GasCurve,"Select natural gas supply curve (0 = cendiv, 1 = national + cendiv, 2 = static, 3 = national)",0; 1; 2; 3,1, GSw_GasCC_H_1x1,Turn on/off both gas-CC_H_1x1 and gas-CC_H_1x1-CCS_mod/max plant options,0; 1,0, @@ -169,7 +171,6 @@ GSw_H2Combustion,Switch to turn on/off H2CT and H2CC techs,0; 1,1, GSw_H2Combustionupgrade,Indicate whether to allow gas-CC and gas-CT to upgrade to H2-CT and H2-CC,0; 1,1, GSw_H2CombinedCycle,Indicate whether to allow H2-CC,0; 1,1, GSw_H2LeakageScen,Scenarios of H2 leakage rates from upstream and process of producing electricity by technology; scenario name options from emission_constraints/h2_leakage_rate.csv,N/A,Fan_et_al_2022/Med, -GSw_HierarchyFile,Indicate the version of the hierarchy file to use (default=hierarchy.csv with 132 zones),default; agg125; agg69; agg54,default, GSw_HourlyChunkAggMethod,How to aggregate CF and load within the chunks specified by GSw_HourlyChunkLengthRep (if set to anything other than 'mean' this switch overrides GSw_PRM_StressLoadAggMethod) (ties for mid are broken by the later hour; i.e. for 4-hour chunks and a setting of 'mid' the 3rd hour is used) (if an integer is provided the index starts at 1; i.e. 1 is the 1st hour),(mean|mid|\d),mean, GSw_HourlyChunkLengthRep,Length of representative-period dispatch timeslices in hours; must be divisible into 24,1; 2; 3; 4; 6; 8; 12; 24,3, GSw_HourlyChunkLengthStress,Length of stress-period dispatch timeslices in hours; must be divisible into 24,1; 2; 3; 4; 6; 8; 12; 24,3, @@ -207,7 +208,7 @@ GSw_Int_CC,"Select intertemporal CC method (0=average undifferentiated, 1=averag GSw_Int_Curt,"Select intertemporal Curt method (0=average undifferentiated, 1=average differentiated , 2=marginal undifferentiated, 3=marginal differentiated)",0; 1; 2; 3,0, GSw_InterDayLinkage,Turn on (1) or off (0) the ability for interday storage techs (specified in tech-subset-table.csv) to shift energy between representative days (non-interday techs are unaffected),0; 1,0, GSw_LfillGas,Turn on/off lfill-gas,0; 1,1, -GSw_LoadProfiles,Name of demand profile matching `inputs/profiles_demand/demand_{GSw_LoadProfiles}.h5` OR an absolute filepath to an EER-formatted demand .h5 file,^(historic|EFS_REFERENCE|EFS_MEDIUM|EFS_HIGH|EFS_Clean2035|EFS_Clean2035clip1pct|EFS_Clean2035_LTS|EFS_MEDIUMStretch2046|EER2023_Baseline_AEO2022|EER2023_IRAlow|EER2023_IRAmoderate|EER2023_100by2050|EER2025_Baseline_AEO2023|EER2025_IRAlow|EER2025_100by2050|\/.+|[a-zA-Z]:[\\\/].+)$,EER2025_IRAlow, +GSw_LoadProfiles,Name of demand profile matching `inputs/profiles_demand/demand_{GSw_LoadProfiles}.h5` OR an absolute filepath to an EER-formatted demand .h5 file,^(historic|EFS_REFERENCE|EFS_MEDIUM|EFS_HIGH|EFS_Clean2035|EFS_Clean2035clip1pct|EFS_Clean2035_LTS|EFS_MEDIUMStretch2040|EFS_MEDIUMStretch2046|EER2023_Baseline_AEO2022|EER2023_IRAlow|EER2023_IRAmoderate|EER2023_100by2050|EER2025_Baseline_AEO2023|EER2025_IRAlow|EER2025_100by2050|\/.+|[a-zA-Z]:[\\\/].+)$,EER2025_IRAlow, GSw_LoadAllocationMethod,"How to allocate state-level load to model regions ('population' uses each region's share of state population, 'state_lpf' uses county-state load participation factors calculated from the NARIS nodal network dataset)",population; state_lpf,population, GSw_Loadpoint,Switch to use or disable a loadpoint for the intertemporal solve after the first iteration,0; 1,0, GSw_LoadSiteCF,Annual capacity factor of optimally sited load (if 0 then optimally sited load is turned off; if between 0 and 1 then load is flexible (obeying stress period weight); if 1 then load is inflexible),float,0, @@ -327,7 +328,7 @@ GSw_TransCostMult,Multiplier for bulk BA-BA transmission costs,float,1, GSw_TransHurdleLevel1,Apply hurdle rates from inputs/transmission/cost_hurdle_intra.csv between regions at the specified hierarchy level,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region; hurdlereg,transgrp, GSw_TransHurdleLevel2,Apply hurdle rates from inputs/transmission/cost_hurdle_intra.csv between regions at the specified hierarchy level,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region; hurdlereg,hurdlereg, GSw_TransHurdleRate,Turn on (1) or off (0) hurdle rates between hierarchy regions as defined by GSw_TransHurdleLevel1/GSw_TransHurdleLevel2 and inputs/transmission/cost_hurdle_intra.csv,0; 1,0, -GSw_TransNetworkSource,Network source for the initial transmission network used in the model,NARIS2024; REFS2009,NARIS2024, +GSw_TransNetworkSource,Network source for the initial transmission network used in the model,NARIS2024,NARIS2024, GSw_TransRestrict,hierarchy level within which to allow new transmission lines,r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region,country, GSw_TransScen,Transmission expansion scenario (options in inputs/transmission),N/A,default, GSw_TransSquiggliness,Transmission distance multiplier to approximate the squigglier paths followed by actual lines (only applied to NEW lines),float,1, From c980617f92ad44583f843c2231a45a067ceb6c73 Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 13:53:33 -0600 Subject: [PATCH 04/37] Update user_guide.md --- docs/source/user_guide.md | 47 ++++++++++++--------------------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/docs/source/user_guide.md b/docs/source/user_guide.md index 7f0864f97..5955bea8c 100644 --- a/docs/source/user_guide.md +++ b/docs/source/user_guide.md @@ -36,7 +36,7 @@ Here is partial list of remotely hosted files used by ReEDS: - Switch to `GSw_HourlyType=wek`, which increases the length of the periods from 1 day to 5 days. If all the other switches are left at their defaults, switching to `wek` would increase the coverage from 42 days to 5*42=210 days. - Reduce `GSw_HourlyClusterRegionLevel` to something smaller than transreg (like `st`), and then increase `GSw_HourlyNumClusters` - Switch to `GSw_HourlyClusteAlgorithm=hierarchical` and then increase `GSw_HourlyNumClusters` (although that's less desirable, because hierarchical clustering doesn't do as good of a job of reproducing the actual spatial distribution of CF and load) - - Switch to `Gsw_HourlyType=year`. Although if you're running for the whole US you'll need to turn on region aggregation (`GSw_RegionResolution=aggreg` and `GSw_HierarchyFile` in [`default` or `agg1`, or `agg2` or `agg3`]) for it to solve. + - Switch to `Gsw_HourlyType=year`. Although if you're running for the whole US you'll need to turn on region aggregation (`GSw_ZoneSet` in [`z54` or `z69`]) for it to solve. - `GSw_HourlyClusterAlgorithm` - If set to 'hierarchical', then hierarchical clustering is used via @@ -47,15 +47,14 @@ Here is partial list of remotely hosted files used by ReEDS: ``` - If set to 'optimized', then a two-step custom optimization is performed using the `hourly_repperiods.optimize_period_weights()` and `hourly_repperiods.assign_representative_days()` functions to minimize the deviation in regional load and PV/wind CF between the weighted representative periods and the full year. - - If set to a string containing the substring 'user', then instead of optimizing the choice of representative periods for this run, we read them from the inputs/temporal/period_szn_user.csv file. - - The scenario name is in the first column, labeled 'scenario'. ReEDS will use rows with the same label as `GSw_HourlyClusterAlgorithm`. - - So if you want to use the example period:szn map, just set `GSw_HourlyClusterAlgorithm=user`. - - If you want to specify a different period:szn map, then add your mapping at the bottom of inputs/temporal/period_szn_user.csv with a unique scenario name in the 'scenario' column, and set `GSw_HourlyClusterAlgorithm` to your unique scenario name, *which must contain the substring 'user'*. (For example, I could use a mapping called 'user_myname_20230130' by adding my period:szn map to inputs/temporal/period_szn_user.csv with 'user_myname_20230130' in the 'scenario' column and setting `GSw_HourlyClusterAlgorithm=user_myname_20230130`.) - - Make sure the settings for `GSw_HourlyType` and `GSw_HourlyWeatherYears` match your user-defined map. For example, if your 'user_myname_20230130' map includes 365 representative days for weather year 2012, then set `GSw_HourlyType=day` and `GSw_HourlyWeatherYears=2012`. + - If set to a string containing the substring 'user', then instead of optimizing the choice of representative periods for this run, the model reads a user-supplied file at `inputs/temporal/period_szn_{GSw_HourlyClusterAlgorithm}.csv`. + - So if you want to use the example period:szn map, set `GSw_HourlyClusterAlgorithm=user` and provide `inputs/temporal/period_szn_user.csv`. + - If you want to specify a different period:szn map, then create a file with your label in the filename and set `GSw_HourlyClusterAlgorithm` to that same label (which must contain the substring 'user'). For example, for `GSw_HourlyClusterAlgorithm=user_myname_20230130`, provide `inputs/temporal/period_szn_user_myname_20230130.csv`. + - Make sure the settings for `GSw_HourlyType` and `GSw_HourlyWeatherYears` match your user-defined map. For example, if your user-defined map includes 365 representative days for weather year 2012, then set `GSw_HourlyType=day` and `GSw_HourlyWeatherYears=2012`. - You can feed the period:szn mapping from a completed run into the inputs folder of your repo to force ReEDS to use the same representative or stress periods. More detail can be found in the postprocessing tools guide. -- `GSw_PRM_StressThreshold`: The default setting of 'transgrp_10_EUE_sum' means a threshold of "**10** ppm NEUE in each **transgrp**", with stress periods selected by the daily **sum** of **EUE** within each **transgrp**. +- `GSw_PRM_StressThreshold`: The default setting of 'transgrp_1_EUE_sum' means a threshold of "**1** ppm NEUE in each **transgrp**", with stress periods selected by the daily **sum** of **EUE** within each **transgrp**. - The first argument can be selected from ['country', 'interconnect', 'nercr', 'transreg', 'transgrp', 'st', 'r'] and specifies the hierarchy level within which to compare RA performance against the threshold. - The second argument can be any float and specifies the RA performance threshold in parts per million [ppm]. - The third argument can be 'NEUE' or 'EUE', specifying which metric to use when selecting stress periods. If set to 'NEUE' the model will add stress periods with the largest **fraction** of dropped load; if set to 'EUE' the model will add stress periods with the largest **absolute MWh** of dropped load. @@ -164,7 +163,7 @@ The low cost scenario assumes further declines from 2030 to 2050. Fixed O&M values are assumed to be 5% of CAPEX (source: ) Electrolyzer performance (efficiency) as well as SMR cost and performance assumptions are derived from assumptions [H2A: Hydrogen Analysis Production Models](https://www.nrel.gov/hydrogen/h2a-production-models.html), with guidance from Paige Jadun. -See original input assumptions in the [ReEDS-2.0_Input_Processing repo](https://github.nrel.gov/ReEDS/ReEDS-2.0_Input_Processing/blob/main/H2/costs/H2ProductionCosts-20210414.xlsx). +See original input assumptions in the [ReEDS_Input_Processing repo](https://github.com/ReEDS-Model/ReEDS_Input_Processing/blob/main/hydrogen/costs/H2ProductionCosts-20210414.xlsx). Note that SMR costs are currently in 2018$ and electrolyzer costs are in 2022$. @@ -183,7 +182,7 @@ Note that SMR costs are currently in 2018$ and electrolyzer costs are in 2022$. | Storage | Electric load | MWh/metric ton | The values in `H2_transport_and_storage_costs.csv` are based on raw data provided from the SERA model by Paige Jadun. -The raw data are formatted by the [`process-h2-inputs.py` script](https://github.nrel.gov/ReEDS/ReEDS-2.0_Input_Processing/blob/main/H2/process-h2-inputs.py) in the input processing repository. +The raw data are formatted by the [`process-h2-inputs.py` script](https://github.com/ReEDS-Model/ReEDS_Input_Processing/blob/main/hydrogen/process-h2-inputs.py) in the input processing repository. ### Intra-Regional Hydrogen Transport Cost @@ -327,7 +326,7 @@ This assumption is enforced by the constraints `eq_h2_ptc_region_balance` and `e | -- | -- | -- | -- | | GSw_H2_PTC | 1 | Required | Turns on and off hydrogen production tax credit | | GSw_H2 | 2 | Recommended | Representation of hydrogen supply/demand balance. Sw_H2=1 will not cause the model to fail but it is not recommended for the most accurate representation of the H2 PTC. | -| GSw_H2_Demand_Case | Anything except 'none' | Recommended |  Annual H2 demand profile | +| GSw_H2_Demand_Case | Anything except 'none' | Recommended | Annual H2 demand profile | | GSw_H2_IntraReg_Transport | 0.32 | Recommended | Flat cost for intra-ReEDS BA hydrogen transport and storage in $2004 / kg H2 produced. Note: This is now included as the default representation even if the H2 PTC is not enabled. This is assuming transport via pipelines. Transport costs could be more expensive if you assume other methods of H2 transport (ex. trucking). | | GSw_RetailAdder | $0/MWh | Recommended | 2004$/MWh adder to the cost of energy consumed by hydrogen producing facilities and direct air CO2 capture facilities. Included to represent the non-bulk-power-system costs of increasing electrical loads that are not captured within ReEDS. The default value of 0 indicates an assumption that these facilities are large enough to participate directly in wholesale markets. | @@ -380,29 +379,9 @@ In addition, the `GSw_ReducedResource` switch allows for a uniform reduction of ## Transmission -Most transmission input files are in the `inputs/transmission/` folder. - -### Input files - -1. *cost_hurdle_country.csv*: Indicates the hurdle rate for transmission flows between USA/Canada and USA/Mexico. -1. *rev_transmission_basecost.csv*: Base transmission costs (before terrain multipliers) used in reV. Sources for numeric values are: - 1. TEPPC: - 1. SCE: - 1. MISO: - 1. A more recent guide with a working link (as of 20230227) is available at . - 1. Southeast: Private communication with a representative Southeastern utility -1. *transmission_capacity_future_baseline.csv*: Historically installed (since 2010) and currently planned transmission capacity additions. -1. *transmission_capacity_future_{`GSw_TransScen`}.csv*: Available future routes for transmission capacity as specified by `GSw_TransScen`. -1. *transmission_capacity_init_AC_NARIS2024.csv*: Initial AC transmission capacities between 134 US ReEDS zones. Calculated using the code available at and nodal network data from . The method is described by Brown, P.R. et al 2023, "A general method for estimating zonal transmission interface limits from nodal network data", in prep. -1. *transmission_capacity_init_AC_REFS2009.csv*: Initial AC transmission capacities between 134 US ReEDS zones. Calculated for . -1. *transmission_capacity_init_nonAC.csv*: Initial DC transmission capacities between 134 US ReEDS zones. -1. *transmission_cost_ac_500kv_ba.csv* and *transmission_distance_ba.csv*: Distance and cost for a representative transmission route between each pair of 134 US ReEDS zones, assuming a 500 kV single-circuit line. Routes are determined by the reV model using a least-cost-path algorithm accounting for terrain and land type multipliers. Costs represent the appropriate base cost from rev_transmission_basecost.csv multiplied by the appropriate terrain and land type multipliers for each 90m pixel crossed by the path. Endpoints are in inputs/shapefiles/transmission_endpoints and represent a point within the largest urban area in each of the 134 ReEDS zones. -1. *transmission_cost_dc_ba.csv*: Same as transmission_cost_ac_500kv_ba.csv except assuming a 500 kV bipole DC line. - - ### Relevant switches -1. `GSw_HierarchyFile`: Indicate the suffix of the inputs/hierarchy.csv file you wish to use. +1. `GSw_ZoneSet`: Defines the model zones via the `inputs/zones/{GSw_ZoneSet}` files. 1. By default the transreg boundaries are used for operating reserve sharing, capacity credit calculations, and the boundaries for limited-transmission cases. 1. `GSw_TransInvMaxLongTerm`: Limit on annual transmission deployment nationwide **IN/AFTER** `firstyear_trans_longterm`, measured in TW-miles 1. `GSw_TransInvMaxNearTerm`: Limit on annual transmission deployment nationwide **BEFORE** `firstyear_trans_longterm`, measured in TW-miles @@ -412,7 +391,9 @@ Most transmission input files are in the `inputs/transmission/` folder. 1. `GSw_TransHurdle`: Intra-US hurdle rate for interzonal flows, measured in $2004/MWh 1. `GSw_TransHurdleLevel`: Indicate the level of hierarchy.csv between which to apply the hurdle rate specified by `GSw_TransHurdle`. i.e. if set to ‘st’, intra-state flows will have no hurdle rates but inter-state flows will have hurdle rates specified by `GSw_TransHurdle`. 1. `GSw_TransRestrict`: Indicate the level of hierarchy.csv within which to allow transmission expansion. i.e. if set to ‘st’, no inter-state expansion is allowed. -1. `GSw_TransScen`: Indicate the inputs/transmission/transmission_capacity_future_{`GSw_TransScen`}.csv file to use, which includes the list of interfaces that can be expanded. Note that the full list of expandable interfaces is indicated by this file plus transmission_capacity_future_default.csv (currently planned additions) plus transmission_capacity_init_AC_NARIS2024.csv (existing AC interfaces, which can be expanded by default) plus transmission_capacity_init_nonAC.csv (existing DC connections, which can be expanded by default). Applies to AC, LCC, and VSC. +1. `GSw_TransScen`: Indicate the inputs/transmission/transmission_capacity_future_{`GSw_TransScen`}.csv file to use, which includes the list of interfaces that can be expanded. +Note that the full list of expandable interfaces is indicated by this file plus transmission_capacity_future_default.csv (currently planned additions) plus existing AC and DC interfaces (which can be expanded by default). +Applies to AC, LCC, and VSC. 1. `GSw_PRM_hierarchy_level`: Level of hierarchy.csv within which to calculate net load, used for capacity credit. Larger levels indicate more planning coordination between regions. 1. `GSw_PRMTRADE_level`: Level of hierarchy.csv within which to allow PRM trading. By default it’s set to ‘country’, indicating no limits. If set to ‘r’, no PRM trading is allowed. @@ -616,7 +597,7 @@ MGA is turned off if set to 0; a reasonable choice for MGA is in the range of 0. Options are `min` or `max`. - `GSw_MGA_Objective` (default `capacity`): Objective for MGA (uses `GSw_MGA_SubObjective` to specify technology subset if set to `capacity`). Options are `capacity`, `generation`, `transmission`, `rasharing`, and `co2`. -- `GSw_MGA_SubObjective` (default `fossil`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity`). +- `GSw_MGA_SubObjective` (default `gentech`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity`). Options are the column names in the `inputs/tech-subset-table.csv` file. Users familiar with GAMS can add alternative objective functions to the `c_mga.gms` file and associated options to the `GSw_MGA_Objective` switch in `cases.csv`. From 54fac4163fdaf80ad0cc35db350ee7202d813ff4 Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 14:17:40 -0600 Subject: [PATCH 05/37] resolve conflicts --- b_inputs.gms | 19 ++++--- c_mga.gms | 13 +++++ cases.csv | 2 +- docs/source/user_guide.md | 4 +- input_processing/copy_files.py | 90 +++++++++++++++------------------- runbatch.py | 64 ++++++++++++++---------- runfiles.csv | 7 +-- 7 files changed, 107 insertions(+), 92 deletions(-) diff --git a/b_inputs.gms b/b_inputs.gms index a3cb2c06c..9f0400a86 100644 --- a/b_inputs.gms +++ b/b_inputs.gms @@ -449,11 +449,11 @@ set evmc_storage(i) "ev flexibility as direct load control", evmc_shape(i) "ev flexibility as adoptable change to load from response to pricing", fossil(i) "fossil technologies" + fuel_cell(i) "fuel cell technologies", gas_cc_ccs(i) "techs that are gas combined cycle and have CCS", gas_cc(i) "techs that are gas combined cycle", gas_ct(i) "techs that are gas combustion turbine", gas(i) "techs that use gas (but not o-g-s)", - gentech(i) "generation technologies", geo(i) "geothermal technologies", geo_base(i) "geothermal technologies typically considered in model runs", geo_hydro(i) "geothermal hydrothermal technologies", @@ -759,6 +759,10 @@ if(Sw_H2Combustionupgrade = 0, ban(i)$[i_subsets(i,'h2_combustion')$upgrade(i)] = yes ; ) ; +if(Sw_FuelCell = 0, + ban(i)$i_subsets(i,'fuel_cell') = yes ; +) ; + if(Sw_LfillGas = 0, ban('lfill-gas') = yes ; ) ; @@ -978,11 +982,11 @@ evmc(i)$(not ban(i)) = yes$i_subsets(i,'evmc') ; evmc_storage(i)$(not ban(i)) = yes$i_subsets(i,'evmc_storage') ; evmc_shape(i)$(not ban(i)) = yes$i_subsets(i,'evmc_shape') ; fossil(i)$(not ban(i)) = yes$i_subsets(i,'fossil') ; +fuel_cell(i)$(not ban(i)) = yes$i_subsets(i,'fuel_cell') ; gas_cc_ccs(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc_ccs') ; gas_cc(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc') ; gas_ct(i)$(not ban(i)) = yes$i_subsets(i,'gas_ct') ; gas(i)$(not ban(i)) = yes$i_subsets(i,'gas') ; -gentech(i)$(not ban(i)) = yes$i_subsets(i,'gentech') geo(i)$(not ban(i)) = yes$i_subsets(i,'geo') ; geo_base(i)$(not ban(i)) = yes$i_subsets(i,'geo_base') ; geo_hydro(i)$(not ban(i)) = yes$i_subsets(i,'geo_hydro') ; @@ -3525,11 +3529,12 @@ $offempty $onempty parameter trancap_init_itlgrp(itlgrp,itlgrpp,trtype) "--MW-- initial upper limit on interface flows between itlgrps" / -$offlisting -$ondelim -$include inputs_case%ds%trancap_init_itlgrp.csv -$offdelim -$onlisting +*** TEMPORARY 20260402: Skip itlgrp functionality until we fix it +* $offlisting +* $ondelim +* $include inputs_case%ds%trancap_init_itlgrp.csv +* $offdelim +* $onlisting / ; $offempty diff --git a/c_mga.gms b/c_mga.gms index 23e66ce68..3bbe72236 100644 --- a/c_mga.gms +++ b/c_mga.gms @@ -12,6 +12,19 @@ eq_MGA_CostEnvelope(t)$[tmodel(t)$Sw_MGA].. * --------------------------------------------------------------------------- $ifthen.mgaobj %GSw_MGA_Objective% == 'capacity' +$ifthen.mgasubobj %GSw_MGA_SubObjective% == 'all' +Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; +Variable MGA_OBJ "--MW-- Capacity of all technologies to be minimized/maximied" ; +eq_MGA_Objective$Sw_MGA.. + MGA_OBJ + =e= + sum{(i,v,r,t) + $[tmodel(t) + $valcap(i,v,r,t)], + CAP(i,v,r,t) + } +; +$else.mgasubobj Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; Variable MGA_OBJ "--MW-- Capacity of technology to be minimized/maximied" ; eq_MGA_Objective$Sw_MGA.. diff --git a/cases.csv b/cases.csv index 21dcd2901..f6ef90c74 100644 --- a/cases.csv +++ b/cases.csv @@ -220,7 +220,7 @@ GSw_MethaneLeakageScen,Fractional leakage of methane from upstream natural gas p GSw_MGA_CostDelta,MGA: Fraction by which to allow objective function to increase when using Modeling to Generate Alternatives (MGA is turned off if set to 0; a common choice for MGA is 0.01),float,0, GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, -GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|geo|gentech|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind),gentech, +GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind|all),storage, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, GSw_MingenFixed,Turn on/off fixed min-gen constraints,0; 1,1, diff --git a/docs/source/user_guide.md b/docs/source/user_guide.md index 5955bea8c..50a565061 100644 --- a/docs/source/user_guide.md +++ b/docs/source/user_guide.md @@ -326,7 +326,7 @@ This assumption is enforced by the constraints `eq_h2_ptc_region_balance` and `e | -- | -- | -- | -- | | GSw_H2_PTC | 1 | Required | Turns on and off hydrogen production tax credit | | GSw_H2 | 2 | Recommended | Representation of hydrogen supply/demand balance. Sw_H2=1 will not cause the model to fail but it is not recommended for the most accurate representation of the H2 PTC. | -| GSw_H2_Demand_Case | Anything except 'none' | Recommended | Annual H2 demand profile | +| GSw_H2_Demand_Case | Anything except 'none' | Recommended |  Annual H2 demand profile | | GSw_H2_IntraReg_Transport | 0.32 | Recommended | Flat cost for intra-ReEDS BA hydrogen transport and storage in $2004 / kg H2 produced. Note: This is now included as the default representation even if the H2 PTC is not enabled. This is assuming transport via pipelines. Transport costs could be more expensive if you assume other methods of H2 transport (ex. trucking). | | GSw_RetailAdder | $0/MWh | Recommended | 2004$/MWh adder to the cost of energy consumed by hydrogen producing facilities and direct air CO2 capture facilities. Included to represent the non-bulk-power-system costs of increasing electrical loads that are not captured within ReEDS. The default value of 0 indicates an assumption that these facilities are large enough to participate directly in wholesale markets. | @@ -597,7 +597,7 @@ MGA is turned off if set to 0; a reasonable choice for MGA is in the range of 0. Options are `min` or `max`. - `GSw_MGA_Objective` (default `capacity`): Objective for MGA (uses `GSw_MGA_SubObjective` to specify technology subset if set to `capacity`). Options are `capacity`, `generation`, `transmission`, `rasharing`, and `co2`. -- `GSw_MGA_SubObjective` (default `gentech`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity`). +- `GSw_MGA_SubObjective` (default `fossil`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity`). Options are the column names in the `inputs/tech-subset-table.csv` file. Users familiar with GAMS can add alternative objective functions to the `c_mga.gms` file and associated options to the `GSw_MGA_Objective` switch in `cases.csv`. diff --git a/input_processing/copy_files.py b/input_processing/copy_files.py index 3e0edbbee..731b2533d 100644 --- a/input_processing/copy_files.py +++ b/input_processing/copy_files.py @@ -11,6 +11,7 @@ import yaml import json import h5py +from pathlib import Path # Local Imports sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import reeds @@ -180,7 +181,6 @@ def get_regions_and_agglevel( reeds_path, inputs_case, save_regions_and_agglevel=True, - NARIS=False ): """ Create a regional mapping to help filter for specific regions and aggregation levels. @@ -192,17 +192,18 @@ def get_regions_and_agglevel( """ sw = reeds.io.get_switches(inputs_case) - # Load the full regions list + ## TEMPORARY 20260402: Load the full regions list + ## Use the line below once we make the switch + # hierarchy = reeds.io.assemble_hierarchy(inputs_case) hierarchy = pd.read_csv( - os.path.join(reeds_path, 'inputs', 'hierarchy{}.csv'.format( - '' if (sw['GSw_HierarchyFile'] == 'default') - else '_'+sw['GSw_HierarchyFile'])) + Path(reeds.io.reeds_path, 'inputs', 'zones', sw.GSw_ZoneSet, 'hierarchy_from134.csv') ) hierarchy['offshore'] = 0 # Append offshore zones if using if int(sw.GSw_OffshoreZones): - hierarchy_offshore = pd.read_csv( - os.path.join(reeds_path, 'inputs', 'hierarchy_offshore.csv') + hierarchy_offshore = reeds.io.assemble_hierarchy( + fpath=os.path.join(reeds_path, 'inputs', 'zones', 'hierarchy_offshore.csv'), + extra=False, ).assign(offshore=1) hierarchy = pd.concat([hierarchy, hierarchy_offshore], ignore_index=True) @@ -213,12 +214,11 @@ def get_regions_and_agglevel( index=False, header=True ) - if not NARIS: - hierarchy = hierarchy.loc[hierarchy.country.str.lower()=='usa'].copy() - # Add a row for each county - county2zone = pd.read_csv( - os.path.join(reeds_path, 'inputs', 'county2zone.csv'), dtype={'FIPS':str}, + ## TEMPORARY 20260402: Use the old 134-zone county2zone until the aggregation approach is updated + county2zone = ( + reeds.io.get_county2zone(GSw_ZoneSet='z134', as_map=False) + .rename(columns={'r':'ba'}) ) county2zone['county'] = 'p' + county2zone.FIPS county2zone.to_csv( @@ -232,44 +232,32 @@ def get_regions_and_agglevel( # Subset hierarchy for the region of interest (based on the GSw_Region switch) # Parse the GSw_Region switch. If it includes a '/' character, it has the format # {column of hierarchy.csv}/{period-delimited entries to keep from that column}. - if '/' in sw['GSw_Region']: - hier_sub = pd.DataFrame() - # allow the list defined by the user to include multiple spatial resolutions - region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] - # separate lists associated with each spatial resolution - for region_group in region_groups: - GSw_RegionLevel, GSw_Region = region_group.split('/') - GSw_Region = GSw_Region.split('.') - - hier_sub_partial = pd.concat([ - hierarchy[hierarchy[GSw_RegionLevel] == region] for region in GSw_Region - ]) - - hier_sub = pd.concat([hier_sub, hier_sub_partial]) - # Otherwise use the modeled_regions.csv file to define the regions - else: - modeled_regions = pd.read_csv( - os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv')) - modeled_regions.columns = modeled_regions.columns.str.lower() - val_r_in = list( - modeled_regions[~modeled_regions[sw['GSw_Region'].lower()].isna()]['r'].unique()) - hier_sub = hierarchy[hierarchy['ba'].isin(val_r_in)].copy() + hier_sub = pd.DataFrame() + # allow the list defined by the user to include multiple spatial resolutions + region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] + # separate lists associated with each spatial resolution + for region_group in region_groups: + GSw_RegionLevel, GSw_Region = region_group.split('/') + GSw_Region = GSw_Region.split('.') + + hier_sub_partial = pd.concat([ + hierarchy[hierarchy[GSw_RegionLevel] == region] for region in GSw_Region + ]) + hier_sub = pd.concat([hier_sub, hier_sub_partial]) # Read region resolution switch to determine agglevel agglevel = sw['GSw_RegionResolution'].lower() # Check if desired spatial resolution is mixed if agglevel == 'mixed': - #Set value in resolution column of hier_sub to match value assigned in modeled_regions.csv region_def = pd.read_csv( - os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv')) - region_def = region_def[['r', sw['GSw_Region']]] + os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv') + )[['r', sw.GSw_ZoneSet]] - res_map = region_def.set_index('r')[sw['GSw_Region']].to_dict() + res_map = region_def.set_index('r').squeeze(1).to_dict() hier_sub['resolution'] = hier_sub['ba'].map(res_map) - else: hier_sub['resolution'] = agglevel @@ -337,7 +325,7 @@ def get_regions_and_agglevel( os.path.join(inputs_case, 'val_r_all.csv'), header=False, index=False) # Rename columns and save as hierarchy_with_res.csv for use in agglevel_variables function - hier_sub.rename(columns={'r':'*r'}).to_csv( + hier_sub.drop(columns='offshore', errors='ignore').rename(columns={'r':'*r'}).to_csv( os.path.join(inputs_case, 'hierarchy_with_res.csv'), index=False) # Drop county name and resolution columns @@ -362,7 +350,7 @@ def get_regions_and_agglevel( if sw.GSw_RegionResolution == 'mixed': mod_reg = pd.read_csv( os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv')) - if 'aggreg' in mod_reg[sw.GSw_Region].tolist(): + if 'aggreg' in mod_reg[sw.GSw_ZoneSet].tolist(): hier_sub['itlgrp'] = hier_sub['aggreg'] hier_sub[['r','itlgrp']].rename(columns={'r':'*r'}).to_csv( os.path.join(inputs_case, 'hierarchy_itlgrp.csv'), index=False) @@ -372,7 +360,7 @@ def get_regions_and_agglevel( os.path.join(inputs_case, 'val_itlgrp.csv'), header=False, index=False) # Drop any substate region columns as these will no longer be needed - hier_sub = hier_sub.drop(['county','ba','itlgrp','st_interconnect'],axis=1) + hier_sub = hier_sub.drop(['county', 'ba', 'itlgrp'], axis=1) # Populate val_st as unique states (not st_int) from the subsetted hierarchy table # Also include "voluntary" state for modeling voluntary market REC trading @@ -401,7 +389,7 @@ def get_regions_and_agglevel( os.path.join(inputs_case, 'offshore.csv'), index=False, header=False, ) - levels = list(hier_sub.columns) + levels = [i for i in hier_sub if i != 'offshore'] valid_regions = {level: list(hier_sub[level].unique()) for level in levels} val_r = sorted(valid_regions['r']) @@ -635,8 +623,6 @@ def subset_to_valid_regions( # Transmission files need to be filtered differently to allow interfaces between BA and county resolution regions transmission_files = [ - 'transmission_capacity_init_AC_r.csv', - 'transmission_capacity_init_nonAC.csv', 'transmission_cost_ac.csv', 'transmission_cost_dc.csv', 'transmission_distance.csv', @@ -1088,7 +1074,11 @@ def write_disagg_data_files(runfiles, inputs_case): # region-to-county fractions, and the latter is needed to calculate # state-to-county and BA-to-county fractions. county_r_map = reeds.io.get_county2zone(os.path.dirname(inputs_case)) - county2zone = reeds.io.get_county2zone(as_map=False) + ## TEMPORARY 20260402: Use the old 134-zone county2zone until the aggregation approach is updated + county2zone = ( + reeds.io.get_county2zone(GSw_ZoneSet='z134', as_map=False) + .rename(columns={'r':'ba'}) + ) county2zone['county'] = 'p' + county2zone['FIPS'].astype(str).str.zfill(5) county2zone['r'] = county2zone['FIPS'].map(county_r_map) @@ -1589,14 +1579,13 @@ def generate_maps_gpkg(inputs_case): #%% =========================================================================== ### --- PROCEDURE --- ### =========================================================================== -def main(reeds_path, inputs_case, NARIS=False): +def main(reeds_path, inputs_case): """ Run copy_files.py for use in the ReEDS workflow Parameters: reeds_path : str (Path to the ReEDS directory) inputs_case : str (Path to the run/inputs_case directory) - NARIS : Ture/False (NARIS: North American Renewable Integration Study) Returns: None (Writes files to the inputs_case directory) @@ -1605,7 +1594,7 @@ def main(reeds_path, inputs_case, NARIS=False): ### --- Gather dataframes and dictionaries necessary for the script execution --- ### =========================================================================== # Obtain data necessary to filter and aggregate regions - regions_and_agglevel = get_regions_and_agglevel(reeds_path, inputs_case, NARIS=NARIS) + regions_and_agglevel = get_regions_and_agglevel(reeds_path, inputs_case) # Use agglevel_variables function to obtain spatial resolution variables agglevel_variables = reeds.spatial.get_agglevel_variables(reeds_path, inputs_case) @@ -1682,8 +1671,7 @@ def main(reeds_path, inputs_case, NARIS=False): # #%% Settings for testing ### # reeds_path = reeds.io.reeds_path - #inputs_case = os.path.join(reeds_path,'runs','test_employment_Pacific','inputs_case') - #NARIS = False + # inputs_case = os.path.join(reeds_path,'runs','v20260305_itlM0_USA_defaults','inputs_case') # ---- Set up logger ---- diff --git a/runbatch.py b/runbatch.py index 0441501c6..c2670376d 100644 --- a/runbatch.py +++ b/runbatch.py @@ -9,6 +9,7 @@ import time import shutil import csv +import importlib import numpy as np import pandas as pd import subprocess @@ -282,6 +283,8 @@ def check_compatibility(sw): .format('\n'.join(err_switch_configs)) ) + reeds.inputs.validate_zoneset(sw['GSw_ZoneSet']) + ### Aggregation if (sw['GSw_RegionResolution'] != 'aggreg') and (int(sw['GSw_NumCSPclasses']) != 12): raise NotImplementedError( @@ -292,7 +295,7 @@ def check_compatibility(sw): ### Parsed string switches ## Automatic inputs reeds_path = os.path.dirname(__file__) - hierarchy = pd.read_csv(os.path.join(reeds_path,'inputs','hierarchy.csv')) + hierarchy = reeds.io.get_hierarchy(GSw_ZoneSet=sw['GSw_ZoneSet']).reset_index() for threshold in sw['GSw_PRM_StressThreshold'].split('/'): ## Example: threshold = 'transgrp_10_EUE_sum' @@ -425,33 +428,29 @@ def check_compatibility(sw): raise ValueError(err) # Add a row for each county - county2zone = pd.read_csv( - os.path.join(reeds_path, 'inputs', 'county2zone.csv'), dtype={'FIPS':str}, - ) + ## TEMPORARY 20260402 until the aggregation procedure is updated + county2zone = reeds.io.get_county2zone(GSw_ZoneSet='z134', as_map=False) county2zone['county'] = 'p' + county2zone.FIPS # Add county info to hierarchy - hierarchy = hierarchy.merge(county2zone.drop(columns=['FIPS','state']), on='ba') - - if '/' in sw['GSw_Region']: - # Handle multiple spatial resolutions - region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] - for group in region_groups: - level, regions = group.split('/') - if level not in hierarchy: - raise ValueError("Fix level in GSw_Region") - invalid_regions = [ - region for region in regions.split('.') - if region.lower() not in hierarchy[level].str.lower().values - ] - if invalid_regions: - err = f"GSw_Region: {', '.join(invalid_regions)} need to be in {hierarchy[level].unique()}" - raise Exception(err) - else: - modeled_regions = pd.read_csv( - os.path.join(reeds_path,'inputs','userinput','modeled_regions.csv') - ) - if sw['GSw_Region'] not in modeled_regions: - raise ValueError("No column in modeled_regions.csv matching GSw_Region") + hierarchy = hierarchy.merge(county2zone.drop(columns=['FIPS','state']), on='r') + + # Make sure specified regions are allowed for the specified hierarchy level + region_groups = sw['GSw_Region'].split('//') if '//' in sw['GSw_Region'] else [sw['GSw_Region']] + for group in region_groups: + level, regions = group.split('/') + if level not in hierarchy: + err = ( + f"The specified hierarchy level '{level}' does not exist in the hierarchy file." + f"\nUpdate GSw_Region={sw['GSw_Region']} to specify a valid level." + ) + raise ValueError(err) + invalid_regions = [ + region for region in regions.split('.') + if region.lower() not in hierarchy[level].str.lower().values + ] + if invalid_regions: + err = f"GSw_Region: {', '.join(invalid_regions)} need to be in {hierarchy[level].unique()}" + raise Exception(err) ### Compatible switch combinations if sw['GSw_LoadProfiles'] == 'historic': @@ -497,6 +496,19 @@ def check_compatibility(sw): ### Contents of user-specified files reeds.checks.check_switches(sw) + ### Uncommonly used packages + if sw['GSw_HourlyClusterAlgorithm'].lower().startswith('kmedoids'): + if importlib.util.find_spec("sklearn_extra") is None: + err = ( + "The scikit-learn-extra package is required for GSw_HourlyClusterAlgorithm=" + f"{sw['GSw_HourlyClusterAlgorithm']} but is not available in your conda " + "environment. Please install it by running:\n" + " pip install 'scikit-learn-extra>=0.2.0,<0.3.0'" + "\nor:\n" + " conda install -c conda-forge scikit-learn-extra=0.2" + ) + raise ModuleNotFoundError(err) + def solvestring_sequential( batch_case, caseSwitches, diff --git a/runfiles.csv b/runfiles.csv index 3179e6f7b..1900a9440 100644 --- a/runfiles.csv +++ b/runfiles.csv @@ -241,7 +241,7 @@ load_2010.csv,,1,sum,ignore,r,wide,,1,0,,1,,,,disaggfunc set to ignore because l load_allyear.csv,,1,sum,ignore,*r,"h,t",,0,0,,1,,,,disaggfunc set to ignore because load will already be in correct spatial resolution load_multiplier.csv,inputs/load/demand_{demandscen}.csv,1,ignore,ignore,,,,,0,,,,,, load_multiplier_r.csv,,1,ignore,ignore,,,,1,0,,,,,, -loadsite_annual.csv,inputs/load/loadsite_{GSw_LoadSiteTrajectory}.csv,int(sw.GSw_LoadSiteCF) != 0,ignore,ignore,*loadsitereg,t,,,0,,,,,, +loadsite_annual.csv,inputs/load/loadsite_{GSw_LoadSiteTrajectory}.csv,float(sw.GSw_LoadSiteCF) > 0,ignore,ignore,*loadsitereg,t,,,0,,,,,, maps.gpkg,,1,ignore,ignore,,,,,,,1,,,, maxage.csv,inputs/plant_characteristics/maxage.csv,1,ignore,ignore,,,,,0,,,,,, maxdailycf.csv,inputs/plant_characteristics/maxdailycf.csv,int(sw.GSw_MaxDailyCF) != 0,ignore,ignore,,,,,0,,,,,, @@ -317,6 +317,7 @@ plantchar_dr_shed_vom.csv,inputs/plant_characteristics/dr_shed_vom_{dr_shedscen} plantchar_dr_shed_fom.csv,inputs/plant_characteristics/dr_shed_fom_{dr_shedscen}.csv,int(sw.GSw_DRShed) != 0,ignore,ignore,r,"tech,wide",,1,0,,,,,,used to define plantcharout.csv plantchar_evmc_shape.csv,inputs/plant_characteristics/evmc_shape_{evmcscen}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_evmc_storage.csv,inputs/plant_characteristics/evmc_storage_{evmcscen}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv +plantchar_fuelcell.csv,inputs/plant_characteristics/{plantchar_fuelcell}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_gas_ccs.csv,inputs/plant_characteristics/{plantchar_gas_ccs}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_gas.csv,inputs/plant_characteristics/{plantchar_gas}.csv,1,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv plantchar_geo.csv,inputs/plant_characteristics/{plantchar_geo}.csv,int(sw.GSw_Geothermal) != 0,ignore,ignore,,,,,0,,,,,,used to define plantcharout.csv @@ -429,10 +430,6 @@ tranloss.csv,,1,trans_lookup,ignore,"*r,rr",trtype,,0,0,drop_dup_r,1,,,,disaggfu trans_itc_fractions.csv,,1,ignore,ignore,,,,,0,,,,,, transmission_capacity_future.csv,inputs/transmission/transmission_capacity_future_{lvl}_{GSw_TransScen}.csv,1,sum,ignore,"r,rr","status,trtype,t",,0,0,drop_dup_r,,,,,'ignore’ in disaggfunc because all transmisison data will be read into model at appropriate spatial resolution transmission_capacity_future_baseline.csv,inputs/transmission/transmission_capacity_future_{lvl}_baseline.csv,1,sum,ignore,"r,rr","status,trtype,t",,0,0,drop_dup_r,,,,,'ignore’ in disaggfunc because all transmisison data will be read into model at appropriate spatial resolution -transmission_capacity_init_AC_r.csv,inputs/transmission/transmission_capacity_init_AC_{lvl}_{GSw_TransNetworkSource}.csv,1,sum,ignore,"r,rr",interface,,0,0,drop_dup_r,,,,, -transmission_capacity_init_AC_itlgrp.csv,inputs/transmission/transmission_capacity_init_AC_ba_{GSw_TransNetworkSource}.csv,1,sum,ignore,"r,rr",interface,,0,0,drop_dup_r,,,,, -transmission_capacity_init_AC_transgrp.csv,inputs/transmission/transmission_capacity_init_AC_transgrp_{GSw_TransNetworkSource}.csv,1,sum,ignore,"transgrp,transgrpp",interface,,0,0,,,,,, -transmission_capacity_init_nonAC.csv,inputs/transmission/transmission_capacity_init_nonAC_{lvl}.csv,1,sum,ignore,"r,rr",trtype,,0,0,drop_dup_r,,,,,'ignore’ in disaggfunc because all transmisison data will be read into model at appropriate spatial resolution transmission_cost_ac.csv,inputs/transmission/transmission_cost_ac_{GSw_TransUpgradeMethod}_{lvl}.h5,1,trans_lookup,ignore,"r,rr",tscbin,,0,0,drop_dup_r,,,,, transmission_cost_dc.csv,inputs/transmission/transmission_cost_dc_{lvl}.csv,1,trans_lookup,ignore,"r,rr",,,0,0,drop_dup_r,,,,, transmission_distance.csv,inputs/transmission/transmission_distance_{lvl}.h5,1,trans_lookup,ignore,"r,rr",,,0,0,drop_dup_r,,,,,Stored in wide-format h5 to reduce county filesize but converted to long in copy_files.py From 4edc116b895c5b5387ab9a95511b57e466425582 Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 14:36:51 -0600 Subject: [PATCH 06/37] clean up --- b_inputs.gms | 164 +++++++++++++++++++------------------- c_mga.gms | 13 --- cases.csv | 2 +- docs/source/user_guide.md | 2 +- 4 files changed, 85 insertions(+), 96 deletions(-) diff --git a/b_inputs.gms b/b_inputs.gms index 9f0400a86..658529e67 100644 --- a/b_inputs.gms +++ b/b_inputs.gms @@ -415,88 +415,89 @@ $onlisting set *technology-specific subsets - battery(i) "battery storage technologies", - beccs(i) "Bio with CCS", - bio(i) "technologies that use only biofuel", - boiler(i) "technologies that use steam boilers" - canada(i) "Canadian imports", - ccs(i) "CCS technologies", - ccs_mod(i) "CCS technologies with moderate capture rate", - ccs_max(i) "CCS technologies with maximum capture rate", - ccsflex_byp(i) "Flexible CCS technologies with bypass", - ccsflex_dac(i) "Flexible CCS technologies with direct air capture", - ccsflex_sto(i) "Flexible CCS technologies with storage", - ccsflex(i) "Flexible CCS technologies", - cf_tech(i) "technologies that have a specified capacity factor" - coal_ccs(i) "technologies that use coal and have CCS", - coal(i) "technologies that use coal", - cofire(i) "cofire technologies", - combined_cycle(i) "combined cycle technologies", - combustion_turbine(i)"combustion turbine technologies", - consume(i) "technologies that consume electricity and add to load", - conv(i) "conventional generation technologies", - csp_storage(i) "csp generation technologies with thermal storage", - csp(i) "csp generation technologies", - csp1(i) "csp-tes generation technologies 1", - csp2(i) "csp-tes generation technologies 2", - csp3(i) "csp-tes generation technologies 3", - csp4(i) "csp-tes generation technologies 4", - dac(i) "direct air capture technologies", - distpv(i) "distpv (i.e., rooftop PV) generation technologies", - demand_flex(i) "demand flexibility technologies (includes DR and EVMC)", - dr_shed(i) "DR shed technologies" - evmc(i) "ev flexibility technologies", - evmc_storage(i) "ev flexibility as direct load control", - evmc_shape(i) "ev flexibility as adoptable change to load from response to pricing", - fossil(i) "fossil technologies" - fuel_cell(i) "fuel cell technologies", - gas_cc_ccs(i) "techs that are gas combined cycle and have CCS", - gas_cc(i) "techs that are gas combined cycle", - gas_ct(i) "techs that are gas combustion turbine", - gas(i) "techs that use gas (but not o-g-s)", - geo(i) "geothermal technologies", - geo_base(i) "geothermal technologies typically considered in model runs", - geo_hydro(i) "geothermal hydrothermal technologies", - geo_egs(i) "geothermal enhanced geothermal systems technologies", - geo_extra(i) "geothermal technologies not typically considered in model runs", - geo_egs_allkm(i) "egs (covering deep egs depths of all km) technologies", - geo_egs_nf(i) "egs (near-field) technologies", - h2_combustion(i) "h2-ct and h2-cc technologies", - h2_cc(i) "h2-cc technologies" - h2_ct(i) "h2-ct technologies", - h2(i) "hydrogen-producing technologies", - hyd_add_pump(i) "hydro techs with an added pump", - hydro_d(i) "dispatchable hydro technologies", - hydro_nd(i) "non-dispatchable hydro technologies", - hydro(i) "hydro technologies", - lfill(i) "land-fill gas technologies", - nondispatch(i) "technologies that are not dispatchable" - nuclear(i) "nuclear technologies", - ofswind(i) "offshore wind technologies", - ogs(i) "oil-gas-steam technologies", - onswind(i) "onshore wind technologies", - psh(i) "pumped hydro storage technologies", - pv(i) "all PV generation technologies", - pvb(i) "hybrid pv+battery technologies", - pvb1(i) "pvb generation technologies 1", - pvb2(i) "pvb generation technologies 2", - pvb3(i) "pvb generation technologies 3", - re(i) "renewable energy technologies", - refurbtech(i) "technologies that can be refurbished", - rsc_i(i) "technologies based on Resource supply curves", - smr(i) "steam methane reforming technologies", - storage_hybrid(i) "hybrid VRE-storage technologies", + battery(i) "battery storage technologies", + beccs(i) "Bio with CCS", + bio(i) "technologies that use only biofuel", + boiler(i) "technologies that use steam boilers" + canada(i) "Canadian imports", + ccs(i) "CCS technologies", + ccs_mod(i) "CCS technologies with moderate capture rate", + ccs_max(i) "CCS technologies with maximum capture rate", + ccsflex_byp(i) "Flexible CCS technologies with bypass", + ccsflex_dac(i) "Flexible CCS technologies with direct air capture", + ccsflex_sto(i) "Flexible CCS technologies with storage", + ccsflex(i) "Flexible CCS technologies", + cf_tech(i) "technologies that have a specified capacity factor" + coal_ccs(i) "technologies that use coal and have CCS", + coal(i) "technologies that use coal", + cofire(i) "cofire technologies", + combined_cycle(i) "combined cycle technologies", + combustion_turbine(i) "combustion turbine technologies", + consume(i) "technologies that consume electricity and add to load", + conv(i) "conventional generation technologies", + csp_storage(i) "csp generation technologies with thermal storage", + csp(i) "csp generation technologies", + csp1(i) "csp-tes generation technologies 1", + csp2(i) "csp-tes generation technologies 2", + csp3(i) "csp-tes generation technologies 3", + csp4(i) "csp-tes generation technologies 4", + dac(i) "direct air capture technologies", + distpv(i) "distpv (i.e., rooftop PV) generation technologies", + demand_flex(i) "demand flexibility technologies (includes DR and EVMC)", + dr_shed(i) "DR shed technologies" + evmc(i) "ev flexibility technologies", + evmc_storage(i) "ev flexibility as direct load control", + evmc_shape(i) "ev flexibility as adoptable change to load from response to pricing", + fossil(i) "fossil technologies" + fuel_cell(i) "fuel cell technologies", + gas_cc_ccs(i) "techs that are gas combined cycle and have CCS", + gas_cc(i) "techs that are gas combined cycle", + gas_ct(i) "techs that are gas combustion turbine", + gas(i) "techs that use gas (but not o-g-s)", + gentech(i) "generation technologies", + geo(i) "geothermal technologies", + geo_base(i) "geothermal technologies typically considered in model runs", + geo_hydro(i) "geothermal hydrothermal technologies", + geo_egs(i) "geothermal enhanced geothermal systems technologies", + geo_extra(i) "geothermal technologies not typically considered in model runs", + geo_egs_allkm(i) "egs (covering deep egs depths of all km) technologies", + geo_egs_nf(i) "egs (near-field) technologies", + h2_combustion(i) "h2-ct and h2-cc technologies", + h2_cc(i) "h2-cc technologies" + h2_ct(i) "h2-ct technologies", + h2(i) "hydrogen-producing technologies", + hyd_add_pump(i) "hydro techs with an added pump", + hydro_d(i) "dispatchable hydro technologies", + hydro_nd(i) "non-dispatchable hydro technologies", + hydro(i) "hydro technologies", + lfill(i) "land-fill gas technologies", + nondispatch(i) "technologies that are not dispatchable" + nuclear(i) "nuclear technologies", + ofswind(i) "offshore wind technologies", + ogs(i) "oil-gas-steam technologies", + onswind(i) "onshore wind technologies", + psh(i) "pumped hydro storage technologies", + pv(i) "all PV generation technologies", + pvb(i) "hybrid pv+battery technologies", + pvb1(i) "pvb generation technologies 1", + pvb2(i) "pvb generation technologies 2", + pvb3(i) "pvb generation technologies 3", + re(i) "renewable energy technologies", + refurbtech(i) "technologies that can be refurbished", + rsc_i(i) "technologies based on Resource supply curves", + smr(i) "steam methane reforming technologies", + storage_hybrid(i) "hybrid VRE-storage technologies", storage_standalone(i) "stand alone storage technologies", - storage(i) "storage technologies", - storage_interday(i) "interday storage", - thermal_storage(i) "thermal storage technologies", - upgrade(i) "technologies that are upgrades from other technologies", - upv(i) "upv generation technologies", - vre_distributed(i) "distributed PV technologies", - vre_no_csp(i) "variable renewable energy technologies that are not csp", - vre_utility(i) "utility scale wind and PV technologies", - vre(i) "variable renewable energy technologies", - wind(i) "wind generation technologies", + storage(i) "storage technologies", + storage_interday(i) "interday storage", + thermal_storage(i) "thermal storage technologies", + upgrade(i) "technologies that are upgrades from other technologies", + upv(i) "upv generation technologies", + vre_distributed(i) "distributed PV technologies", + vre_no_csp(i) "variable renewable energy technologies that are not csp", + vre_utility(i) "utility scale wind and PV technologies", + vre(i) "variable renewable energy technologies", + wind(i) "wind generation technologies", t(allt) "full set of years" /%startyear%*%endyear%/, @@ -987,6 +988,7 @@ gas_cc_ccs(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc_ccs') ; gas_cc(i)$(not ban(i)) = yes$i_subsets(i,'gas_cc') ; gas_ct(i)$(not ban(i)) = yes$i_subsets(i,'gas_ct') ; gas(i)$(not ban(i)) = yes$i_subsets(i,'gas') ; +gentech(i)$(not ban(i)) = yes$i_subsets(i,'gentech') ; geo(i)$(not ban(i)) = yes$i_subsets(i,'geo') ; geo_base(i)$(not ban(i)) = yes$i_subsets(i,'geo_base') ; geo_hydro(i)$(not ban(i)) = yes$i_subsets(i,'geo_hydro') ; diff --git a/c_mga.gms b/c_mga.gms index 3bbe72236..23e66ce68 100644 --- a/c_mga.gms +++ b/c_mga.gms @@ -12,19 +12,6 @@ eq_MGA_CostEnvelope(t)$[tmodel(t)$Sw_MGA].. * --------------------------------------------------------------------------- $ifthen.mgaobj %GSw_MGA_Objective% == 'capacity' -$ifthen.mgasubobj %GSw_MGA_SubObjective% == 'all' -Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; -Variable MGA_OBJ "--MW-- Capacity of all technologies to be minimized/maximied" ; -eq_MGA_Objective$Sw_MGA.. - MGA_OBJ - =e= - sum{(i,v,r,t) - $[tmodel(t) - $valcap(i,v,r,t)], - CAP(i,v,r,t) - } -; -$else.mgasubobj Equation eq_MGA_Objective "--MW-- Defines generation capacity for MGA" ; Variable MGA_OBJ "--MW-- Capacity of technology to be minimized/maximied" ; eq_MGA_Objective$Sw_MGA.. diff --git a/cases.csv b/cases.csv index f6ef90c74..c82479512 100644 --- a/cases.csv +++ b/cases.csv @@ -220,7 +220,7 @@ GSw_MethaneLeakageScen,Fractional leakage of methane from upstream natural gas p GSw_MGA_CostDelta,MGA: Fraction by which to allow objective function to increase when using Modeling to Generate Alternatives (MGA is turned off if set to 0; a common choice for MGA is 0.01),float,0, GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, -GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind|all),storage, +GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|gentech|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind|all),gentech, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, GSw_MingenFixed,Turn on/off fixed min-gen constraints,0; 1,1, diff --git a/docs/source/user_guide.md b/docs/source/user_guide.md index 50a565061..eca9e5bfc 100644 --- a/docs/source/user_guide.md +++ b/docs/source/user_guide.md @@ -597,7 +597,7 @@ MGA is turned off if set to 0; a reasonable choice for MGA is in the range of 0. Options are `min` or `max`. - `GSw_MGA_Objective` (default `capacity`): Objective for MGA (uses `GSw_MGA_SubObjective` to specify technology subset if set to `capacity`). Options are `capacity`, `generation`, `transmission`, `rasharing`, and `co2`. -- `GSw_MGA_SubObjective` (default `fossil`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity`). +- `GSw_MGA_SubObjective` (default `gentech`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity` or `GSw_MGA_Objective = generation`). Options are the column names in the `inputs/tech-subset-table.csv` file. Users familiar with GAMS can add alternative objective functions to the `c_mga.gms` file and associated options to the `GSw_MGA_Objective` switch in `cases.csv`. From 145d3c20fadc58a2dfe9ca6dcf79027bfb335b70 Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 14:52:50 -0600 Subject: [PATCH 07/37] remove all cap MGA max/min option --- cases.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cases.csv b/cases.csv index c82479512..051efcf0f 100644 --- a/cases.csv +++ b/cases.csv @@ -220,7 +220,7 @@ GSw_MethaneLeakageScen,Fractional leakage of methane from upstream natural gas p GSw_MGA_CostDelta,MGA: Fraction by which to allow objective function to increase when using Modeling to Generate Alternatives (MGA is turned off if set to 0; a common choice for MGA is 0.01),float,0, GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, -GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|gentech|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind|all),gentech, +GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|gentech|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind),gentech, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, GSw_MingenFixed,Turn on/off fixed min-gen constraints,0; 1,1, From 6f8216b90f1a6094796b7ac9c9ea817396c252b6 Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 16:26:31 -0600 Subject: [PATCH 08/37] add gentech to i_subtech set --- c_mga.gms | 1 - docs/source/user_guide.md | 2 +- inputs/sets/i_subtech.csv | 3 ++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/c_mga.gms b/c_mga.gms index 23e66ce68..9d65f13a8 100644 --- a/c_mga.gms +++ b/c_mga.gms @@ -25,7 +25,6 @@ eq_MGA_Objective$Sw_MGA.. } ; -$endif.mgasubobj * --------------------------------------------------------------------------- $elseif.mgaobj %GSw_MGA_Objective% == 'generation' diff --git a/docs/source/user_guide.md b/docs/source/user_guide.md index eca9e5bfc..04b6613a3 100644 --- a/docs/source/user_guide.md +++ b/docs/source/user_guide.md @@ -597,7 +597,7 @@ MGA is turned off if set to 0; a reasonable choice for MGA is in the range of 0. Options are `min` or `max`. - `GSw_MGA_Objective` (default `capacity`): Objective for MGA (uses `GSw_MGA_SubObjective` to specify technology subset if set to `capacity`). Options are `capacity`, `generation`, `transmission`, `rasharing`, and `co2`. -- `GSw_MGA_SubObjective` (default `gentech`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = capacity` or `GSw_MGA_Objective = generation`). +- `GSw_MGA_SubObjective` (default `gentech`): Technology subset to minimize or maximize the capacity of (only used for `GSw_MGA_Objective = (capacity or generation)`). Options are the column names in the `inputs/tech-subset-table.csv` file. Users familiar with GAMS can add alternative objective functions to the `c_mga.gms` file and associated options to the `GSw_MGA_Objective` switch in `cases.csv`. diff --git a/inputs/sets/i_subtech.csv b/inputs/sets/i_subtech.csv index fabf8237a..c60eefce6 100755 --- a/inputs/sets/i_subtech.csv +++ b/inputs/sets/i_subtech.csv @@ -79,4 +79,5 @@ REFURBTECH cf_tech FOSSIL BOILER -NONDISPATCH \ No newline at end of file +NONDISPATCH +GENTECH From ffd3c6ffb2e878623ec8e79afd23966fbb674516 Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 17:59:13 -0600 Subject: [PATCH 09/37] resolve to pass github tests --- inputs/userinput/futurefiles.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inputs/userinput/futurefiles.csv b/inputs/userinput/futurefiles.csv index defb65b56..10443b6d9 100644 --- a/inputs/userinput/futurefiles.csv +++ b/inputs/userinput/futurefiles.csv @@ -126,6 +126,8 @@ e.csv,.csv,1,None,9999,None,9999,0,constant,None,None,new, eall.csv,.csv,1,None,9999,None,9999,0,constant,None,None,new, emit_rate.csv,.csv,0,None,t,"etype,e,i,v,r",0,0,constant,0,None,done,constant emitrate.csv,.csv,1,None,9999,None,9999,0,constant,None,None,done,constant +employment_factor_plant.csv,.csv,1,ignore,9999,None,9999,0,constant,0,None,, +employment_factor_inter_transmission.csv,.csv,1,ignore,9999,None,9999,0,constant,0,None,, energy_communities.csv,.csv,1,None,9999,None,9999,0,constant,None,None,new, etype.csv,.csv,1,None,9999,None,9999,0,constant,None,None,new, ev_baseline_load.csv,.csv,0,None,2,"0,1",0,None,linear_5,None,None,linear or saturate?,linear_5 From 255c39f605789ae1a84a4ba6bf0194eb353fb6ec Mon Sep 17 00:00:00 2001 From: An Pham Date: Thu, 16 Apr 2026 19:30:15 -0600 Subject: [PATCH 10/37] Update futurefiles.csv --- inputs/userinput/futurefiles.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/inputs/userinput/futurefiles.csv b/inputs/userinput/futurefiles.csv index 10443b6d9..3fd2c4635 100644 --- a/inputs/userinput/futurefiles.csv +++ b/inputs/userinput/futurefiles.csv @@ -243,6 +243,7 @@ ivt_default.csv,.csv,1,None,9999,None,9999,0,constant,None,None,done (special ca ivt_small.csv,.csv,1,None,9999,None,9999,0,constant,None,None,done (special case: ivt is extended in calc_financial_inputs.py since ivt is needed there),constant ivt_step.csv,.csv,1,None,9999,None,9999,0,constant,None,None,done,constant ivt.csv,.csv,1,None,9999,None,9999,0,constant,None,None,done (special case: ivt is extended in calc_financial_inputs.py since ivt is needed there),constant +jtype.csv,.csv,1,None,9999,None,9999,0,constant,None,None,, lcclike.csv,.csv,1,None,9999,None,9999,0,constant,None,None,new, load_2010.csv,.csv,1,None,9999,None,9999,0,constant,None,None,done,constant load_allyear.csv,.csv,0,None,t,"*r,h",0,0,linear_5,0,None,done,linear_5 From ab732e8adcb79f34b302d90b4cfa20ee2404c88a Mon Sep 17 00:00:00 2001 From: An Pham Date: Mon, 27 Apr 2026 14:00:58 -0600 Subject: [PATCH 11/37] reduce number of employment output files --- e_report_params.csv | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/e_report_params.csv b/e_report_params.csv index 6cb16126b..cf7bf3e6d 100644 --- a/e_report_params.csv +++ b/e_report_params.csv @@ -68,19 +68,9 @@ curt_rate(t),frac,fraction of VRE generation that is curtailed,,, "emit_r(etype,eall,r,t)",metric tons,"emissions by pollutant, regional",,, "emit_rate_regional(r,t)",metric tons,"regional average CO2 emissions rate, used in state CO2 caps",,, "emit_weighted(etype,eall)",metric tons * pvf,national emissions * pvf_onm,,, -"employment_generator_fom_ivrt(i,v,r,t)",jobs,generator fixed o&m jobs,,, -"employment_generator_vom_ivrt(i,v,r,t)",jobs,generator variable o&m jobs,,, -"employment_generator_om_ivrt(i,v,r,t)",jobs,generator variable o&m jobs,,, -"employment_generator_construction_inv_ivrt(i,v,r,t)",jobs,generator construction jobs,,, -"employment_generator_construction_ivrt(i,v,r,t)",jobs,cumulative generator construction jobs,,, -"employment_generator_irt(i,r,t)",jobs,generator jobs by tech and region,,, -"employment_trans_construction_rt(r,rr,t)",jobs,transmission construction jobs,,, -"employment_trans_om_rt(r,rr,t)",jobs,transmission o&m jobs,,, -"employment_trans_rt(r,t)",jobs,total transmission jobs by year,,, -"employment_tot_om_rt(r,t)",jobs,total O&M jobs by year and region,,, -"employment_tot_construction_rt(r,t)",jobs,total construction jobs by year and region,,, -"employment_tot_rt(r,t)",jobs,total jobs by region and year,,, -"employment_tot_t(t)",jobs,all jobs nation-wide by year,,, +"employment_generator(i,jtype,r,t)",jobs,"generator job-years by job type, tech, region, and solveyear",,, +"employment_transmission(jtype,r,t)",jobs,"transmission job-years by job type, region, and solveyear",,, +"employment_tot(r,t)",jobs,all job-years nation-wide by region and solveyear,,, error_check(*),unitless,set of checks to determine if there is an error - values should be zero if there is no error,,, "error_gen(i,v,r,allh,t)",MWh,"erroneous generation that disobeys valgen(i,v,r,t)",,, "excess_load(r,allh,t)",MW,level values of EXCESS variable for surplus load,,, From ea35ef81046f160ff83ab7b37eb9cadff5b0569d Mon Sep 17 00:00:00 2001 From: An Pham Date: Mon, 27 Apr 2026 15:47:45 -0600 Subject: [PATCH 12/37] consolidate employment output files --- e_report.gms | 61 +++++++++++++++++++++------------------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/e_report.gms b/e_report.gms index a1a15e4ca..ed19c98ff 100644 --- a/e_report.gms +++ b/e_report.gms @@ -2075,23 +2075,27 @@ h2_usage(r,h,t)$tmodel_new(t) = *========================= * EMPLOYMENT *========================= -* Employment from generators -* Generator O&M employment -employment_generator_fom_ivrt(i,v,r,t)$valcap(i,v,r,t) = CAP.l(i,v,r,t) * employment_factor_plant(i,"fom") ; -employment_generator_vom_ivrt(i,v,r,t)$valgen(i,v,r,t) = sum{h, GEN.l(i,v,r,h,t) - * hours(h) - * employment_factor_plant(i,"vom")} ; -employment_generator_om_ivrt(i,v,r,t) = employment_generator_fom_ivrt(i,v,r,t) + employment_generator_vom_ivrt(i,v,r,t) ; - -* Generator construction employment -employment_generator_construction_inv_ivrt(i,v,r,t)$valinv(i,v,r,t) = INV.l(i,v,r,t) * employment_factor_plant(i,"construction") ; -employment_generator_construction_ivrt(i,v,r,t) = employment_generator_construction_inv_ivrt(i,v,r,t) + sum{tt$tprev(t,tt),employment_generator_construction_inv_ivrt(i,v,r,tt)} ; -* Total generator employment -employment_generator_irt(i,r,t) = sum{v, employment_generator_om_ivrt(i,v,r,t) + employment_generator_construction_ivrt(i,v,r,t)} ; - -* Employment from transmission -* Transmission construction employment -employment_trans_construction_rt(r,rr,t) = +* Employment from generators (job-years) +* Generator O&M job-years +employment_generator(i,"fom",r,t) = sum{v, CAP.l(i,v,r,t)$valcap(i,v,r,t) * employment_factor_plant(i,"fom")} ; +employment_generator(i,"vom",r,t) = sum{(v,h), GEN.l(i,v,r,h,t)$valgen(i,v,r,t) * hours(h)* employment_factor_plant(i,"vom")} ; +* Generator construction job-years +parameter employment_generator_construction_inv(i,r,t) "Annual generator construction employment" ; +employment_generator_construction_inv(i,r,t) = sum{v, INV.l(i,v,r,t)$valinv(i,v,r,t) * employment_factor_plant(i,"construction")} ; +employment_generator(i,"construction",r,t) = employment_generator_construction_inv(i,r,t) + sum{tt$tprev(t,tt),employment_generator_construction_inv(i,r,tt)} ; + +* Employment from transmission (job-years) +* Transmission O&M job-years +parameter employment_transmission_fom(r,rr,t) "Transmission FO&M employment by line" ; +employment_transmission_fom(r,rr,t) = sum{trtype + $[routes(r,rr,trtype,t)], + CAPTRAN_ENERGY.l(r,rr,trtype,t) + * employment_factor_inter_transmission("fom") } ; +* Transmission FO&M employment by region and solveyear +employment_transmission("fom",r,t) = sum{rr,(employment_transmission_r_rr("fom",r,rr,t)) / 2} ; +* Transmission construction job-years +parameter employment_transmission_construction(r,rr,t) "Transmission construction employment by line" ; +employment_transmission_construction(r,rr,t) = * AC lines sum{tscbin $[routes_inv(r,rr,"AC",t) @@ -2107,25 +2111,10 @@ sum{tscbin * transmission_cost_nonac(r,rr,trtype) * INVTRAN.l(r,rr,trtype,t) * employment_factor_inter_transmission("construction") / 2 } ; - -* Transmission O&M employment -employment_trans_om_rt(r,rr,t) = sum{trtype - $[routes(r,rr,trtype,t)], - CAPTRAN_ENERGY.l(r,rr,trtype,t) - * employment_factor_inter_transmission("fom") } ; - -* Total transmission employment -employment_trans_rt(r,t) = sum{rr,(employment_trans_construction_rt(r,rr,t) + employment_trans_om_rt(r,rr,t)) / 2} ; - -* Total O&M employment (generator + transmission) -employment_tot_om_rt(r,t) = sum{(i,v), employment_generator_om_ivrt(i,v,r,t)} + sum{rr,(employment_trans_om_rt(r,rr,t)) / 2} ; - -* Total construction employment (generator + transmission) -employment_tot_construction_rt(r,t) = sum{(i,v), employment_generator_construction_ivrt(i,v,r,t)} + sum{rr,(employment_trans_construction_rt(r,rr,t)) / 2} ; - -* Total employment (generator + transmission) + (construction + O&M) -employment_tot_rt(r,t) = sum{i, employment_generator_irt(i,r,t)} + employment_trans_rt(r,t) ; -employment_tot_t(t) = sum{r, employment_tot_rt(r,t)} ; +employment_transmission("construction",r,t) = sum{rr,(employment_transmission_construction(r,rr,t)) / 2} ; +* Total employment (generator + transmission) +employment_tot(r,t) = sum{(i,jtype), employment_generator(i,jtype,r,t) } + + sum{jtype, employment_transmission(jtype,r,t) } ; *======================================== * Calculate powfrac From a010fccd4b6d433610a490a9e9f37926ecc6220b Mon Sep 17 00:00:00 2001 From: An Pham Date: Mon, 27 Apr 2026 15:59:13 -0600 Subject: [PATCH 13/37] clean up --- e_report.gms | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/e_report.gms b/e_report.gms index ed19c98ff..9e96c9dfa 100644 --- a/e_report.gms +++ b/e_report.gms @@ -2077,24 +2077,29 @@ h2_usage(r,h,t)$tmodel_new(t) = *========================= * Employment from generators (job-years) * Generator O&M job-years -employment_generator(i,"fom",r,t) = sum{v, CAP.l(i,v,r,t)$valcap(i,v,r,t) * employment_factor_plant(i,"fom")} ; -employment_generator(i,"vom",r,t) = sum{(v,h), GEN.l(i,v,r,h,t)$valgen(i,v,r,t) * hours(h)* employment_factor_plant(i,"vom")} ; +employment_generator(i,"fom",r,t) = sum{v, CAP.l(i,v,r,t)$valcap(i,v,r,t) + * employment_factor_plant(i,"fom")} ; +employment_generator(i,"vom",r,t) = sum{(v,h), GEN.l(i,v,r,h,t)$valgen(i,v,r,t) + * hours(h)* employment_factor_plant(i,"vom")} ; * Generator construction job-years -parameter employment_generator_construction_inv(i,r,t) "Annual generator construction employment" ; -employment_generator_construction_inv(i,r,t) = sum{v, INV.l(i,v,r,t)$valinv(i,v,r,t) * employment_factor_plant(i,"construction")} ; -employment_generator(i,"construction",r,t) = employment_generator_construction_inv(i,r,t) + sum{tt$tprev(t,tt),employment_generator_construction_inv(i,r,tt)} ; +parameter employment_generator_construction_inv(i,r,t) "Annual generator construction job-years" ; +employment_generator_construction_inv(i,r,t) = sum{v, INV.l(i,v,r,t)$valinv(i,v,r,t) + * employment_factor_plant(i,"construction")} ; +* Cumulative generator construction job-years +employment_generator(i,"construction",r,t) = employment_generator_construction_inv(i,r,t) + + sum{tt$tprev(t,tt),employment_generator_construction_inv(i,r,tt)} ; * Employment from transmission (job-years) * Transmission O&M job-years -parameter employment_transmission_fom(r,rr,t) "Transmission FO&M employment by line" ; +parameter employment_transmission_fom(r,rr,t) "Transmission FO&M job-years by line and solveyear" ; employment_transmission_fom(r,rr,t) = sum{trtype $[routes(r,rr,trtype,t)], CAPTRAN_ENERGY.l(r,rr,trtype,t) * employment_factor_inter_transmission("fom") } ; -* Transmission FO&M employment by region and solveyear +* Transmission FO&M job-years by region and solveyear employment_transmission("fom",r,t) = sum{rr,(employment_transmission_r_rr("fom",r,rr,t)) / 2} ; * Transmission construction job-years -parameter employment_transmission_construction(r,rr,t) "Transmission construction employment by line" ; +parameter employment_transmission_construction(r,rr,t) "Transmission construction job-years by line and solveyear" ; employment_transmission_construction(r,rr,t) = * AC lines sum{tscbin @@ -2111,8 +2116,10 @@ sum{tscbin * transmission_cost_nonac(r,rr,trtype) * INVTRAN.l(r,rr,trtype,t) * employment_factor_inter_transmission("construction") / 2 } ; +* Transmission construction job-years by region and solveyear employment_transmission("construction",r,t) = sum{rr,(employment_transmission_construction(r,rr,t)) / 2} ; -* Total employment (generator + transmission) + +* Total employment (generator + transmission) by region and solveyear employment_tot(r,t) = sum{(i,jtype), employment_generator(i,jtype,r,t) } + sum{jtype, employment_transmission(jtype,r,t) } ; From de3059730ff6f92c83041e0ac0879e0fbc529dbf Mon Sep 17 00:00:00 2001 From: An Pham Date: Mon, 27 Apr 2026 16:56:24 -0600 Subject: [PATCH 14/37] clean up --- e_report.gms | 2 +- e_report_params.csv | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e_report.gms b/e_report.gms index 9e96c9dfa..7e67bb4fa 100644 --- a/e_report.gms +++ b/e_report.gms @@ -2097,7 +2097,7 @@ employment_transmission_fom(r,rr,t) = sum{trtype CAPTRAN_ENERGY.l(r,rr,trtype,t) * employment_factor_inter_transmission("fom") } ; * Transmission FO&M job-years by region and solveyear -employment_transmission("fom",r,t) = sum{rr,(employment_transmission_r_rr("fom",r,rr,t)) / 2} ; +employment_transmission("fom",r,t) = sum{rr,(employment_transmission_fom(r,rr,t)) / 2} ; * Transmission construction job-years parameter employment_transmission_construction(r,rr,t) "Transmission construction job-years by line and solveyear" ; employment_transmission_construction(r,rr,t) = diff --git a/e_report_params.csv b/e_report_params.csv index cf7bf3e6d..5aaa491bd 100644 --- a/e_report_params.csv +++ b/e_report_params.csv @@ -68,8 +68,8 @@ curt_rate(t),frac,fraction of VRE generation that is curtailed,,, "emit_r(etype,eall,r,t)",metric tons,"emissions by pollutant, regional",,, "emit_rate_regional(r,t)",metric tons,"regional average CO2 emissions rate, used in state CO2 caps",,, "emit_weighted(etype,eall)",metric tons * pvf,national emissions * pvf_onm,,, -"employment_generator(i,jtype,r,t)",jobs,"generator job-years by job type, tech, region, and solveyear",,, -"employment_transmission(jtype,r,t)",jobs,"transmission job-years by job type, region, and solveyear",,, +"employment_generator(i,jtype,r,t)",job-years,"generator employment by job type, tech, region, and solveyear",,, +"employment_transmission(jtype,r,t)",job-years,"transmission employment by job type, region, and solveyear",,, "employment_tot(r,t)",jobs,all job-years nation-wide by region and solveyear,,, error_check(*),unitless,set of checks to determine if there is an error - values should be zero if there is no error,,, "error_gen(i,v,r,allh,t)",MWh,"erroneous generation that disobeys valgen(i,v,r,t)",,, From 98f2e4370794af86b02c8e708cd7f2ec384450e7 Mon Sep 17 00:00:00 2001 From: An Pham Date: Mon, 27 Apr 2026 17:59:27 -0600 Subject: [PATCH 15/37] fix construction job-years calculation --- e_report.gms | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/e_report.gms b/e_report.gms index 7e67bb4fa..2bcb13de4 100644 --- a/e_report.gms +++ b/e_report.gms @@ -2082,12 +2082,8 @@ employment_generator(i,"fom",r,t) = sum{v, CAP.l(i,v,r,t)$valcap(i,v,r,t) employment_generator(i,"vom",r,t) = sum{(v,h), GEN.l(i,v,r,h,t)$valgen(i,v,r,t) * hours(h)* employment_factor_plant(i,"vom")} ; * Generator construction job-years -parameter employment_generator_construction_inv(i,r,t) "Annual generator construction job-years" ; -employment_generator_construction_inv(i,r,t) = sum{v, INV.l(i,v,r,t)$valinv(i,v,r,t) - * employment_factor_plant(i,"construction")} ; -* Cumulative generator construction job-years -employment_generator(i,"construction",r,t) = employment_generator_construction_inv(i,r,t) - + sum{tt$tprev(t,tt),employment_generator_construction_inv(i,r,tt)} ; +employment_generator(i,"construction",r,t) = sum{v, INV.l(i,v,r,t)$valinv(i,v,r,t) + * employment_factor_plant(i,"construction")} ; * Employment from transmission (job-years) * Transmission O&M job-years From 13224b8ddaef5e5fa15ce6c91514e35f19360e34 Mon Sep 17 00:00:00 2001 From: An Pham Date: Mon, 27 Apr 2026 18:28:21 -0600 Subject: [PATCH 16/37] no longer need encoding when writing log file --- reeds/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reeds/log.py b/reeds/log.py index c60fe2e4b..f2496c91c 100755 --- a/reeds/log.py +++ b/reeds/log.py @@ -79,7 +79,7 @@ def get_solve_times(path=''): 'start': {}, 'stop': {}, } - with open(os.path.join(path, 'gamslog.txt'), 'r', encoding="ISO-8859-1") as f: + with open(os.path.join(path, 'gamslog.txt'), 'r') as f: for _line in f: line = _line.strip() ## Get the year/iteration From a8278792e2e452632d0668568950284d5238a3cc Mon Sep 17 00:00:00 2001 From: An Pham Date: Tue, 12 May 2026 01:43:51 -0600 Subject: [PATCH 17/37] revert changes --- reeds/log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reeds/log.py b/reeds/log.py index 914b1b323..e11d8d53c 100755 --- a/reeds/log.py +++ b/reeds/log.py @@ -79,7 +79,7 @@ def get_solve_times(path=''): 'start': {}, 'stop': {}, } - with open(os.path.join(path, 'gamslog.txt'), 'r') as f: + with open(os.path.join(path, 'gamslog.txt'), 'r') as f: for _line in f: line = _line.strip() ## Get the year/iteration From 61e2c5d07442e9c7aeb267884f6689215e4f1b19 Mon Sep 17 00:00:00 2001 From: An Pham Date: Tue, 12 May 2026 01:46:46 -0600 Subject: [PATCH 18/37] revert changes --- reeds/log.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reeds/log.py b/reeds/log.py index e11d8d53c..2216eebdd 100755 --- a/reeds/log.py +++ b/reeds/log.py @@ -79,7 +79,7 @@ def get_solve_times(path=''): 'start': {}, 'stop': {}, } - with open(os.path.join(path, 'gamslog.txt'), 'r') as f: + with open(os.path.join(path, 'gamslog.txt'), 'r') as f: for _line in f: line = _line.strip() ## Get the year/iteration @@ -259,3 +259,4 @@ def get_model_dimensions(casedir, t): except Exception: print('meta.csv not found or not writeable:') print(traceback.format_exc()) + \ No newline at end of file From 3e52966f8db68a22bc2d78ba2e900c93648d6b38 Mon Sep 17 00:00:00 2001 From: An Pham Date: Tue, 12 May 2026 01:47:35 -0600 Subject: [PATCH 19/37] Update log.py --- reeds/log.py | 1 - 1 file changed, 1 deletion(-) diff --git a/reeds/log.py b/reeds/log.py index 2216eebdd..9816d719f 100755 --- a/reeds/log.py +++ b/reeds/log.py @@ -259,4 +259,3 @@ def get_model_dimensions(casedir, t): except Exception: print('meta.csv not found or not writeable:') print(traceback.format_exc()) - \ No newline at end of file From 11ff01c00b7780a95aee0b1f1d70874a428e3adf Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 10:05:55 -0400 Subject: [PATCH 20/37] fix handling of jtype set for employment factors --- reeds/core/setup/b_inputs.gms | 7 ------- reeds/input_processing/runfiles.csv | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/reeds/core/setup/b_inputs.gms b/reeds/core/setup/b_inputs.gms index 7557757b9..d8f9cd35d 100644 --- a/reeds/core/setup/b_inputs.gms +++ b/reeds/core/setup/b_inputs.gms @@ -93,13 +93,6 @@ $gdxin set land(r) "land-based (not offshore) zones" ; land(r)$[not offshore(r)] = yes ; -* TODO: is this needed? -* set jtype "job types used in model (construction and o&m jobs)" -* / -* $offlisting -* $include inputs_case%ds%jtype.csv -* $onlisting -* / ; sets diff --git a/reeds/input_processing/runfiles.csv b/reeds/input_processing/runfiles.csv index 1643045b7..8826f447e 100644 --- a/reeds/input_processing/runfiles.csv +++ b/reeds/input_processing/runfiles.csv @@ -234,7 +234,7 @@ itc_frac_monetized.csv,,1,ignore,ignore,,,,,0,,,,,, itc_fractions.csv,,1,ignore,ignore,,"i,country,t",,0,0,,,,,, ivt.csv,,1,ignore,ignore,,,,,0,,,,,,created in runreeds.py ivt_step.csv,,1,ignore,ignore,,,,,0,,,,,, -jtype.csv,inputs/sets/jtype.csv,1,ignore,ignore,,,,,,,,,jtype,, +jtype.csv,inputs/sets/jtype.csv,1,ignore,ignore,,,,,0,,,set,jtype,job type for employment factors, lcclike.csv,inputs/sets/lcclike.csv,1,ignore,ignore,,,,,0,,,set,lcclike,transmission capacity types where lines are bundled with AC/DC converters, load_2010.csv,,1,sum,ignore,r,wide,,1,0,,1,,,,disaggfunc set to ignore because load will already be in correct spatial resolution load_allyear.csv,,1,sum,ignore,*r,"h,t",,0,0,,1,,,,disaggfunc set to ignore because load will already be in correct spatial resolution From 111fabf259d6279ec2a47bad5c750cd72dce62a2 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 10:07:32 -0400 Subject: [PATCH 21/37] setup of multiple runs for MGA RV and creation of weights --- reeds/input_processing/mcs_sampler.py | 81 ++++++++++++++++++++++++++- reeds/input_processing/runfiles.csv | 3 +- reeds/inputs.py | 39 +++++++------ runreeds.py | 2 +- 4 files changed, 104 insertions(+), 21 deletions(-) diff --git a/reeds/input_processing/mcs_sampler.py b/reeds/input_processing/mcs_sampler.py index deee88d67..5342de95b 100644 --- a/reeds/input_processing/mcs_sampler.py +++ b/reeds/input_processing/mcs_sampler.py @@ -14,6 +14,7 @@ import pandas as pd import scipy.stats import sys +import re import yaml from typing import Tuple, List from collections import defaultdict @@ -1861,7 +1862,7 @@ def write_samples( #%% =========================================================================== ### --- MAIN PROCEDURE --- ### =========================================================================== -def main( +def main_mcs( reeds_path: str, inputs_case: str, n_samples: int = 1, @@ -1926,6 +1927,73 @@ def main( # Write Samples write_samples(sample_group, samples_dict, aux_files) +def main_mga_rv( + reeds_path: str, + inputs_case: str, + sw: dict, + n_samples: int = 1, + lhs_sampling: int = 1, + seed: int = 0, +): + + # get dimensions based on number of regions and subojectives + + ## regions + # val_r generated in copy_files.py + val_r = list(reeds.io.read_input(inputs_case, 'r')['*']) + + ## objective + if sw.GSw_MGA_Objective in ['capacity', 'generation']: + ## if the subojective is an aggregated category, break it up into smaller groups + ## otherwise just use the subobjective as the group + mapped_categories ={ + 'gentech': ['coal', 'gas', 'nuclear', 'h2_combustion', 'geo', 'hydro', 'ofswind', 'onswind', 'storage', 'upv'], + 'fossil' : ['coal', 'gas'], + 're': ['geo', 'hydro', 'ofswind', 'onswind', 'pv', 'vre', 'wind'], + 'vre': ['ofswind', 'onswind', 'upv'], + } + if sw.GSw_MGA_SubObjective in mapped_categories: + subsets = mapped_categories[sw.GSw_MGA_SubObjective] + else: + subsets = [sw.GSw_MGA_SubObjective] + + ## sample weights for each subojective group and region + dimensions = len(subsets) * len(val_r) + + else: + raise NotImplementedError(f"Objective '{sw.GSw_MGA_Objective}' is not yet supported for MGA random vector sampling.") + + runs_folder_name = os.path.basename(os.path.dirname(inputs_case.rstrip(os.path.sep))) + mga_run_number = int((runs_folder_name.split('_')[-1]).replace('R', '')) + + # sample using LHS or random approach + if lhs_sampling: + # lhs requires drawing all samples simultaneously, so rather than using + # a run-specific seed we draw for all runs at once using the global seed value + lhs_sampler = scipy.stats.qmc.LatinHypercube(d=dimensions, seed=seed) + # lhs_samples are arranged n x d (n = samples, d = dimensions) + lhs_samples = lhs_sampler.random(n=n_samples) + # record the lhs sampling matrix in each run folder + lhs_samples_out = pd.DataFrame({'run': [f"R{i:0>4}" for i in range(1, n_samples + 1)]}) + lhs_samples_out = pd.concat( + [lhs_samples_out, pd.DataFrame(lhs_samples.round(6))], axis=1 + ) + lhs_samples_out.to_csv(os.path.join(inputs_case, "mga_rv_latin_hypercube_samples.csv"), index=False) + + # get the weights for this specific run (-1 to adjust for zero indexing) + mga_weights_raw = lhs_samples[mga_run_number - 1] + else: + # set random seed using the global seed + MGA run number to allow reproducibility + np.random.seed(seed + mga_run_number) + # get the weights for this specific run + mga_weights_raw = np.random.uniform(0, 1, dimensions) + + # save vector of weights for this run (rounded to 6 decimal places) + region_labels = np.repeat(val_r, len(subsets)) + subset_labels = np.tile(subsets, len(val_r)) + mga_weights = pd.DataFrame({'*r': region_labels, 'i_subtech': subset_labels, 'weight': mga_weights_raw.round(6)}) + mga_weights.to_csv(os.path.join(inputs_case, "mga_weights.csv"), index=False) + if __name__ == '__main__' and not hasattr(sys, 'ps1'): parser = argparse.ArgumentParser(description='Copy files needed for this run') @@ -1956,17 +2024,24 @@ def main( sw = reeds.io.get_switches(inputs_case) MCS_runs = int(sw.get('MCS_runs', 0)) MCS_lhs = int(sw.get('MCS_lhs', 0)) + MGA_rv_runs = int(sw.get('MGA_RV_runs', 0)) # get global seed from scalars (used to set the seed for a batch of runs) scalars = reeds.io.get_scalars() seed = int(scalars['MCS_seed']) if MCS_runs >= 1: - print('Starting mcs_sampler.py') - main(reeds_path, inputs_case, n_samples=MCS_runs, lhs_sampling=MCS_lhs, seed=seed) + print('Starting Monte Carlo sampling with mcs_sampler.py') + main_mcs(reeds_path, inputs_case, n_samples=MCS_runs, lhs_sampling=MCS_lhs, seed=seed) else: print('MCS_runs switch is set to 0 or not found. No Monte Carlo sampling will be performed') + if MGA_rv_runs >= 1: + print('Starting random vector sampling for MGA with mcs_sampler.py') + main_mga_rv(reeds_path, inputs_case, sw, n_samples=MGA_rv_runs, lhs_sampling=MCS_lhs, seed=seed) + else: + print('MGA_RV_runs switch is set to 0 or not found. No MGA random vector sampling will be performed') + # Final log/timing update. reeds.log.toc( tic=tic, diff --git a/reeds/input_processing/runfiles.csv b/reeds/input_processing/runfiles.csv index 8826f447e..c0640a691 100644 --- a/reeds/input_processing/runfiles.csv +++ b/reeds/input_processing/runfiles.csv @@ -478,4 +478,5 @@ Project.toml,Project.toml,1,ignore,ignore,,,,,,,,,,, gamslice.txt,gamslice.txt,0,ignore,ignore,,,,,,,,,,, max_hintage_number.txt,,1,ignore,ignore,,,,,0,,,,,, mcs_latin_hypercube_samples.csv,,0,ignore,ignore,,,,,,,,,,, -runreeds.py,runreeds.py,1,ignore,ignore,,,,,,,,,,, +mga_weights.csv,,0,ignore,ignore,,,,,,,,,,, +runreeds.py,runreeds.py,1,ignore,ignore,,,,,,,,,,, \ No newline at end of file diff --git a/reeds/inputs.py b/reeds/inputs.py index a2abd5077..c710f5e55 100644 --- a/reeds/inputs.py +++ b/reeds/inputs.py @@ -272,14 +272,14 @@ def parse_cases( print("Please change the delimeter in the GSw_Region switch from ',' to '.'") quit() - # If doing a Monte Carlo run, modify dfcases by adding new columns - # for each scenario run. Also validate the distribution file. + # If doing a Monte Carlo or MGA Random Vector run, modify dfcases by adding new columns + # for each scenario run. For Monte Carlo we also validate the distribution file. warned_about_cluster_alg = False - if 'MCS_runs' in dfcases.index: + if 'MCS_runs' in dfcases.index or 'MGA_RV_runs' in dfcases.index: for c in dfcases.columns: if ( c not in ['Description','Default Value','Choices'] - and (int(dfcases.loc['MCS_runs',c]) > 0) + and ((int(dfcases.loc['MCS_runs',c]) > 0) or (int(dfcases.loc['MGA_RV_runs',c]) > 0)) and (not int(dfcases.loc['ignore',c])) ): # Warn user if the hourly clustering algorithm is not fixed for Monte Carlo runs @@ -289,7 +289,7 @@ def parse_cases( ): print(f"\n[Warning] Case Column: '{c}'") print( - "You are attempting to run a Monte Carlo simulation with " + "You are attempting to run a Monte Carlo or MGA Random Vector simulation with " "`GSw_HourlyClusterAlgorithm` set to a value other than 'user'.\n" "This may result in inconsistent representative days across MCS runs.\n\n" "To ensure consistency, we strongly recommend setting " @@ -309,23 +309,29 @@ def parse_cases( reeds.io.reeds_path, 'inputs', 'userinput', 'mcs_distributions_{}.yaml'.format(sw.MCS_dist) ) - mcs_sampler.general_mcs_dist_validation(reeds.io.reeds_path, mcs_dist_path, sw) - - # c (column) is a case with monte carlo runs. - # replicate this column N (NumMonteCarloRuns) times - NumMonteCarloRuns = int(dfcases.loc['MCS_runs',c]) + if int(dfcases[c].MCS_runs) > 0: + mcs_sampler.general_mcs_dist_validation(reeds.io.reeds_path, mcs_dist_path, sw) + numruns = int(dfcases[c].MCS_runs) + run_type = 'MCS' + else: + numruns = int(dfcases[c].MGA_RV_runs) + run_type = 'R' + + # c (column) is a case with monte carlo or MGA random vector runs. + # replicate this column N times NewColumnNames = [ - f"{c}_MC{i:0>4}" - for i in range(1, NumMonteCarloRuns + 1) + f"{c}_{run_type}{i:0>4}" + for i in range(1, numruns + 1) ] - # Each new column is a copy of the original column with name c_{MC1,MC2,...} - dfcases_MC = pd.DataFrame( - data=np.array([dfcases[c].values]*NumMonteCarloRuns).T, + # Each new column is a copy of the original column with name + # c_{MCS1,MCS2,...} or c_{R1,R2,...} + dfcases_all = pd.DataFrame( + data=np.array([dfcases[c].values]*numruns).T, index=dfcases.index, columns=NewColumnNames, ) - dfcases = pd.concat([dfcases, dfcases_MC], axis=1) + dfcases = pd.concat([dfcases, dfcases_all], axis=1) # drop the original column dfcases.drop(c, axis=1, inplace=True) @@ -372,6 +378,7 @@ def solvestring_sequential( 'GSw_ClimateWater', 'GSw_gopt', 'GSw_gopt_mga', + 'MGA_RV_runs', 'GSw_HourlyChunkLengthRep', 'GSw_HourlyChunkLengthStress', 'GSw_HourlyType', diff --git a/runreeds.py b/runreeds.py index ac9a8b6a6..ad33e08fb 100644 --- a/runreeds.py +++ b/runreeds.py @@ -998,7 +998,7 @@ def setupEnvironment( print('Syncing remote files') # If using Monte Carlo sampling, download everything (since combinations of switches ## not listed in cases{}.csv may be used) - if df_cases.loc['MCS_runs'].astype(int).sum(): + if df_cases.loc['MCS_runs'].astype(int).sum() or df_cases.loc['MGA_RV_runs'].astype(int).sum(): reeds.remote.download_remote_files() ## Otherwise, only download the files needed for the present set of runs else: From 303544f5721d372e721b4e1db8aa96d930fd3154 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 10:12:24 -0400 Subject: [PATCH 22/37] handling of MGA weights in GAMS --- reeds/core/setup/b_inputs.gms | 28 ++++++++++++++++++++++++++++ reeds/core/setup/d_mga.gms | 6 ++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/reeds/core/setup/b_inputs.gms b/reeds/core/setup/b_inputs.gms index d8f9cd35d..92dca6910 100644 --- a/reeds/core/setup/b_inputs.gms +++ b/reeds/core/setup/b_inputs.gms @@ -6033,6 +6033,34 @@ $else.upgrade_ef employment_factor_plant(i,"construction")$upgrade(i) = employment_factor_plant(i,"construction") * 0.5 ; $endif.upgrade_ef +*==================================== +* --- MGA Random Vector Weights --- +*==================================== + +$ifthene.mgaobj ((sameas(%GSw_MGA_Objective%,capacity))or(sameas(%GSw_MGA_Objective%,generation))) + +parameter mga_weights(r,i_subtech) "--unitless-- weight to assign to given MGA subobjective by region" ; + +$ifthene.mga_rv (%MGA_RV_runs%>=1) +parameter mga_weights_in(r,i_subtech) +/ +$offlisting +$ondelim +$include inputs_case%ds%mga_weights.csv +$offdelim +$onlisting +/ ; +mga_weights(r,i_subtech) = mga_weights_in(r,i_subtech) ; +$else.mga_rv +mga_weights(r,i_subtech) = 1 ; +$endif.mga_rv + +$endif.mgaobj + + +*TODO: add different handling for other subobjectives with different dimensions +* should we also include error checking? + *================================================================================================ *== h- and szn-dependent sets and parameters (declared here, populated in 2_temporal_params) === diff --git a/reeds/core/setup/d_mga.gms b/reeds/core/setup/d_mga.gms index 9d65f13a8..632184bc3 100644 --- a/reeds/core/setup/d_mga.gms +++ b/reeds/core/setup/d_mga.gms @@ -21,7 +21,8 @@ eq_MGA_Objective$Sw_MGA.. $[tmodel(t) $valcap(i,v,r,t) $%GSw_MGA_SubObjective%(i)], - CAP(i,v,r,t) + CAP(i,v,r,t) + * sum{i_subtech$i_subsets(i,i_subtech), mga_weights(r,i_subtech)} } ; @@ -37,7 +38,8 @@ eq_MGA_Objective$Sw_MGA.. $[tmodel(t) $valgen(i,v,r,t) $%GSw_MGA_SubObjective%(i)], - GEN(i,v,r,h,t) * hours(h) + GEN(i,v,r,h,t) * hours(h) + * sum{i_subtech$i_subsets(i,i_subtech), mga_weights(r,i_subtech)} } ; From 7aeda82ff2dff1d9bff9b31ddf4f8b584ab5ed7a Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 10:13:49 -0400 Subject: [PATCH 23/37] add MGA random vector test case, group switches --- cases_test.csv | 127 +++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 63 deletions(-) diff --git a/cases_test.csv b/cases_test.csv index fea9f712b..5866de0a9 100644 --- a/cases_test.csv +++ b/cases_test.csv @@ -1,63 +1,64 @@ -,Default Value,Pacific,USA_defaults,Mid_Case,USA_decarb,github_Pacific,github_Everything,github_MA_county_CC,Pacific_CC,Pacific_weks,Pacific_full_year,Interday_storage,Pacific_2020,Pacific_rep7,WY_county,WECC_county,PJM_county_CC,NYVT_mixed,OR_water,MonteCarlo_Random,MonteCarlo_LHS,Everything,Simple,USA_fast,USA_faster,Pacific_DR,Pacific_MGA,Pacific_LoadSite95,MARICTNYNJPAOH_Offshore,R2P -ignore,1,0,,,,,,,,,,,,,,,,,,,,,,,,,,,, -GSw_Region,cendiv/Pacific,,country/USA,country/USA,country/USA,,st/ID.WY.NE.IA.IL,st/MA,,,,,,,st/WY,interconnect/western,transreg/PJM,st/NY.VT,st/OR,st/NE.NY.PA,st/NE.NY.PA,st/ID.WY.NE.IA.IL,st/KS,country/USA,country/USA,,,,st/MA.RI.CT.NY.NJ.PA.OH, -endyear,2032,,2050,2050,2050,2029,2060,2026,,,,,,,,,,,2035,2030,2030,2060,2035,2050,2050,,,,, -yearset,,,,,,,2010..2060..10,,,,,,,,,,,,,2010..2050..5,2010..2050..5,2010..2060..10,,,2010_2025_2050,,,,, -GSw_ZoneSet,,,,,,,z54,z3109,,,,,,,z3109,z3109,z3109,PJMcounty,,,,z54,,z54,z48,,,,, -GSw_GasCurve,2,,1,1,,,,,,,,,,,,,,,,,,,,1,1,,,,, -GSw_Geothermal,,,,2,,,,,,,,,,,,,,,,,,,0,,0,,,,, -GSw_GrowthPenalties,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, -GSw_Upstream,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, -GSw_TransHurdleRate,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, -distpvscen,,,,,stscen2023_mid_case_95_by_2035,,,,,,,,,,,,,,,,,,,,,,,,, -GSw_AnnualCap,,,,,2,,1,,,,,,,,,,,,,,,1,,,,,,,, -GSw_AnnualCapScen,,,,,start2024_90pct2035_100pct2045,,start2027_95pct2035,,,,,,,,,,,,,,,start2027_95pct2035,,,,,,,, -GSw_LoadProfiles,,,,,EER2025_100by2050,EER2025_IRAlow,EER2025_IRAlow,EER2025_IRAlow,,,,,historic,,,,,,,,,EER2025_100by2050,,,,historic,,,, -GSw_NG_CRF_penalty,,,,,ramp_2045,,ramp_2023_2035,,,,,,,,,,,,,,,ramp_2023_2035,,,,,,,, -GSw_PRM_NetImportLimit,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,, -GSw_RetirePenalty,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,, -GSw_FakeData,,,,,,1,1,1,,,,,,,,,,,,,,,,,,,,,, -GSw_PRM_CapCredit,,,,,,,,1,1,,,,,,,,1,,,,,,,,,,,,, -GSw_PRM_scenario,,,,,,,,,static,,,,,,,,static,,,,,,,,,,,,, -GSw_HourlyType,,,,,,,,,,wek,year,,,,,,,,,,,,,,,,,,, -GSw_InterDayLinkage,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,, -GSw_HourlyWeatherYears,,,,,,,2012_2013,,,,,,2020,2007_2008_2009_2010_2011_2012_2013,,,,,,,,2012_2013,,,,2018,,,, -GSw_WaterCapacity,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,, -GSw_WaterMain,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,, -GSw_WaterUse,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,, -resource_adequacy_years,,,,,,,2011_2012_2013_2021_2022_2023,,,,,,,,,,,,,,,2011_2012_2013_2021_2022_2023,,,,,,,, -GSw_HourlyClusterAlgorithm,,,,,,,,,,,,,,,,,,,,user,user,,,,,,,,, -MCS_runs,,,,,,,,,,,,,,,,,,,,2,2,,,,,,,,, -MCS_dist_groups,,,,,,,,,,,,,,,,,,,,tech.hydro.nuclear.gas.coal.load_country,upv_tri.nuclear_tri.ng_fuel_price_tri.load_country_unif,,,,,,,,, -MCS_lhs,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,, -GSw_PRM_StressIterateMax,,,,,,,,0,,,,,,,,0,0,,,1,1,,,,,,,,, -GSw_ReducedResource,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,, -GSw_SitingUPV,,,,,,limited,limited,limited,,,,,,,,,,,,,,limited,,,,,,,, -GSw_SitingWindOfs,,,,,,limited,limited,limited,,,,,,,,,,,,,,open,,,,,,,, -GSw_SitingWindOns,,,,,,limited,limited,limited,,,,,,,,,,,,,,limited,,,,,,,, -GSw_TransScen,,,,,,,VSC_all,,,,,,,,,,,,,,,VSC_all,,,,,,,, -GSw_CO2_Detail,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,, -GSw_DAC,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,, -GSw_NoFossilOffsetCDR,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,, -GSw_Biopower,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,, -GSw_HourlyChunkLengthRep,,,,,,,,,,,,,,,,,,,,,,,6,4,4,,,,, -GSw_HourlyChunkLengthStress,,,,,,,,,,,,,,,,,,,,,,,6,4,4,,,,, -GSw_LfillGas,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,, -GSw_Nuclear,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,, -GSw_OpRes,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,, -GSw_StartCost,,,,,,,,,,,,,,,,,,,,,,,0,0,0,,,,, -GSw_H2,,,,,,,,,,,,,,,,,,,,,,,,0,0,,,,, -GSw_H2_PTC,,,,,,,,,,,,,,,,,,,,,,,,0,0,,,,, -GSw_H2Combustion,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,, -GSw_DRShed,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,, -GSw_MGA_CostDelta,,,,,,,,,,,,,,,,,,,,,,,,,,,0.01,,, -GSw_LoadSiteCF,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.95,, -GSw_OffshoreZones,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -GSw_OffshoreBackbone,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -GSw_OffshoreBackflow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, -pras_agg_ogs_lfillgas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -pras_existing_unit_size,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 -pras_scheduled_outage,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 -pras_unitsize_source,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r2x -pras_vre_combine,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -pras_samples,,,,,,10,10,10,,,,,,,,,,,,,,,,10,10,,,,, +,Default Value,Pacific,USA_defaults,Mid_Case,USA_decarb,github_Pacific,github_Everything,github_MA_county_CC,Pacific_CC,Pacific_weks,Pacific_full_year,Interday_storage,Pacific_2020,Pacific_rep7,WY_county,WECC_county,PJM_county_CC,NYVT_mixed,OR_water,MonteCarlo_Random,MonteCarlo_LHS,Everything,Simple,USA_fast,USA_faster,Pacific_DR,Pacific_MGA,Pacific_MGA_RV,Pacific_LoadSite95,MARICTNYNJPAOH_Offshore,R2P +ignore,1,0,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +GSw_Region,cendiv/Pacific,,country/USA,country/USA,country/USA,,st/ID.WY.NE.IA.IL,st/MA,,,,,,,st/WY,interconnect/western,transreg/PJM,st/NY.VT,st/OR,st/NE.NY.PA,st/NE.NY.PA,st/ID.WY.NE.IA.IL,st/KS,country/USA,country/USA,,,,,st/MA.RI.CT.NY.NJ.PA.OH, +endyear,2032,,2050,2050,2050,2029,2060,2026,,,,,,,,,,,2035,2030,2030,2060,2035,2050,2050,,,,,, +yearset,,,,,,,2010..2060..10,,,,,,,,,,,,,2010..2050..5,2010..2050..5,2010..2060..10,,,2010_2025_2050,,,,,, +GSw_ZoneSet,,,,,,,z54,z3109,,,,,,,z3109,z3109,z3109,PJMcounty,,,,z54,,z54,z48,,,,,, +GSw_GasCurve,2,,1,1,,,,,,,,,,,,,,,,,,,,1,1,,,,,, +GSw_Geothermal,,,,2,,,,,,,,,,,,,,,,,,,0,,0,,,,,, +GSw_GrowthPenalties,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, +GSw_Upstream,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, +GSw_TransHurdleRate,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,, +distpvscen,,,,,stscen2023_mid_case_95_by_2035,,,,,,,,,,,,,,,,,,,,,,,,,, +GSw_AnnualCap,,,,,2,,1,,,,,,,,,,,,,,,1,,,,,,,,, +GSw_AnnualCapScen,,,,,start2024_90pct2035_100pct2045,,start2027_95pct2035,,,,,,,,,,,,,,,start2027_95pct2035,,,,,,,,, +GSw_LoadProfiles,,,,,EER2025_100by2050,EER2025_IRAlow,EER2025_IRAlow,EER2025_IRAlow,,,,,historic,,,,,,,,,EER2025_100by2050,,,,historic,,,,, +GSw_NG_CRF_penalty,,,,,ramp_2045,,ramp_2023_2035,,,,,,,,,,,,,,,ramp_2023_2035,,,,,,,,, +GSw_PRM_NetImportLimit,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,, +GSw_RetirePenalty,,,,,0,,,,,,,,,,,,,,,,,,,,,,,,,, +GSw_FakeData,,,,,,1,1,1,,,,,,,,,,,,,,,,,,,,,,, +GSw_PRM_CapCredit,,,,,,,,1,1,,,,,,,,1,,,,,,,,,,,,,, +GSw_PRM_scenario,,,,,,,,,static,,,,,,,,static,,,,,,,,,,,,,, +GSw_HourlyType,,,,,,,,,,wek,year,,,,,,,,,,,,,,,,,,,, +GSw_InterDayLinkage,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,, +GSw_HourlyWeatherYears,,,,,,,2012_2013,,,,,,2020,2007_2008_2009_2010_2011_2012_2013,,,,,,,,2012_2013,,,,2018,,,,, +GSw_WaterCapacity,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +GSw_WaterMain,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +GSw_WaterUse,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, +resource_adequacy_years,,,,,,,2011_2012_2013_2021_2022_2023,,,,,,,,,,,,,,,2011_2012_2013_2021_2022_2023,,,,,,,,, +MCS_runs,,,,,,,,,,,,,,,,,,,,2,2,,,,,,,,,, +MCS_dist_groups,,,,,,,,,,,,,,,,,,,,tech.hydro.nuclear.gas.coal.load_country,upv_tri.nuclear_tri.ng_fuel_price_tri.load_country_unif,,,,,,,,,, +MCS_lhs,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,, +GSw_MGA_CostDelta,,,,,,,,,,,,,,,,,,,,,,,,,,,0.01,0.01,,, +MGA_RV_runs,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,, +GSw_HourlyClusterAlgorithm,,,,,,,,,,,,,,,,,,,,user,user,,,,,,,user,,, +GSw_PRM_StressIterateMax,,,,,,,,0,,,,,,,,0,0,,,1,1,,,,,,,,,, +GSw_ReducedResource,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,,, +GSw_SitingUPV,,,,,,limited,limited,limited,,,,,,,,,,,,,,limited,,,,,,,,, +GSw_SitingWindOfs,,,,,,limited,limited,limited,,,,,,,,,,,,,,open,,,,,,,,, +GSw_SitingWindOns,,,,,,limited,limited,limited,,,,,,,,,,,,,,limited,,,,,,,,, +GSw_TransScen,,,,,,,VSC_all,,,,,,,,,,,,,,,VSC_all,,,,,,,,, +GSw_CO2_Detail,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,,, +GSw_DAC,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,,, +GSw_NoFossilOffsetCDR,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,,, +GSw_Biopower,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,,, +GSw_HourlyChunkLengthRep,,,,,,,,,,,,,,,,,,,,,,,6,4,4,,,,,, +GSw_HourlyChunkLengthStress,,,,,,,,,,,,,,,,,,,,,,,6,4,4,,,,,, +GSw_LfillGas,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,,, +GSw_Nuclear,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,,, +GSw_OpRes,,,,,,,,,,,,,,,,,,,,,,,0,,0,,,,,, +GSw_StartCost,,,,,,,,,,,,,,,,,,,,,,,0,0,0,,,,,, +GSw_H2,,,,,,,,,,,,,,,,,,,,,,,,0,0,,,,,, +GSw_H2_PTC,,,,,,,,,,,,,,,,,,,,,,,,0,0,,,,,, +GSw_H2Combustion,,,,,,,,,,,,,,,,,,,,,,,,,0,,,,,, +GSw_DRShed,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,, +GSw_LoadSiteCF,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.95,, +GSw_OffshoreZones,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +GSw_OffshoreBackbone,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +GSw_OffshoreBackflow,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +pras_agg_ogs_lfillgas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 +pras_existing_unit_size,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +pras_scheduled_outage,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 +pras_unitsize_source,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r2x +pras_vre_combine,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 +pras_samples,,,,,,10,10,10,,,,,,,,,,,,,,,,10,10,,,,,, \ No newline at end of file From eab1b631db5486f5b61ac5d085386716033244db Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 10:14:28 -0400 Subject: [PATCH 24/37] remove electrolyzer/dac/smr from gentech --- inputs/tech-subset-table.csv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/inputs/tech-subset-table.csv b/inputs/tech-subset-table.csv index e17ad247d..a01d5b332 100644 --- a/inputs/tech-subset-table.csv +++ b/inputs/tech-subset-table.csv @@ -64,11 +64,11 @@ hydNPD,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,, hydNPND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,YES hydED,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,,,YES hydEND,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,YES -electrolyzer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,,YES -smr,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,,,YES -smr_ccs,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,,,YES -dac,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,,,YES -dac_gas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,,,YES +electrolyzer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,,,,,,,,,, +smr,,,,,,,,,,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,,, +smr_ccs,,,,,,,,,,,YES,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,YES,,,,,,,,,,,, +dac,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,,, +dac_gas,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,,YES,,,,,,,,,,, egs_allkm_1*egs_allkm_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,YES,,,YES,,,,,,,,,,,,,,,,,,,,,YES geohydro_allkm_1*geohydro_allkm_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,YES,,,,YES,,,,,,,,,,,,,,,,,,,,,,YES egs_nearfield_1*egs_nearfield_10,,,,,,,,,,,,,,,,,,,,YES,,YES,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,YES,,YES,,YES,YES,,,,,,,,,,,,,,,,,,,,,,YES \ No newline at end of file From 81a033a6ff04a99779b6efad457fd2a3ec496224 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 10:20:35 -0400 Subject: [PATCH 25/37] update switch name for MGA RV approach --- cases.csv | 1 + cases_test.csv | 2 +- reeds/core/setup/b_inputs.gms | 2 +- reeds/input_processing/mcs_sampler.py | 8 ++++---- reeds/inputs.py | 8 ++++---- runreeds.py | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/cases.csv b/cases.csv index c180ebb99..fa0479b8a 100644 --- a/cases.csv +++ b/cases.csv @@ -222,6 +222,7 @@ GSw_MGA_CostDelta,MGA: Fraction by which to allow objective function to increase GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|gentech|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind),gentech, +GSw_MGA_RV_runs,"MGA: Number of samples used for random vector weights that are applied to variables specified in GSw_MGA_Objective and GSw_MGA_SubObjective. Only active when GSw_MGA_CostDelta != 0; set to an integer N>0 to run N ReEDS simulations with sampling (0 disables sampling).",int,0, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, GSw_MingenFixed,Turn on/off fixed min-gen constraints,0; 1,1, diff --git a/cases_test.csv b/cases_test.csv index 5866de0a9..4313fa80b 100644 --- a/cases_test.csv +++ b/cases_test.csv @@ -30,7 +30,7 @@ MCS_runs,,,,,,,,,,,,,,,,,,,,2,2,,,,,,,,,, MCS_dist_groups,,,,,,,,,,,,,,,,,,,,tech.hydro.nuclear.gas.coal.load_country,upv_tri.nuclear_tri.ng_fuel_price_tri.load_country_unif,,,,,,,,,, MCS_lhs,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,, GSw_MGA_CostDelta,,,,,,,,,,,,,,,,,,,,,,,,,,,0.01,0.01,,, -MGA_RV_runs,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,, +GSw_MGA_RV_runs,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,, GSw_HourlyClusterAlgorithm,,,,,,,,,,,,,,,,,,,,user,user,,,,,,,user,,, GSw_PRM_StressIterateMax,,,,,,,,0,,,,,,,,0,0,,,1,1,,,,,,,,,, GSw_ReducedResource,,,,,,,1,,,,,,,,,,,,,,,1,,,,,,,,, diff --git a/reeds/core/setup/b_inputs.gms b/reeds/core/setup/b_inputs.gms index 92dca6910..b1a3cfcd5 100644 --- a/reeds/core/setup/b_inputs.gms +++ b/reeds/core/setup/b_inputs.gms @@ -6041,7 +6041,7 @@ $ifthene.mgaobj ((sameas(%GSw_MGA_Objective%,capacity))or(sameas(%GSw_MGA_Object parameter mga_weights(r,i_subtech) "--unitless-- weight to assign to given MGA subobjective by region" ; -$ifthene.mga_rv (%MGA_RV_runs%>=1) +$ifthene.mga_rv (%GSw_MGA_RV_runs%>=1) parameter mga_weights_in(r,i_subtech) / $offlisting diff --git a/reeds/input_processing/mcs_sampler.py b/reeds/input_processing/mcs_sampler.py index 5342de95b..713e21c1b 100644 --- a/reeds/input_processing/mcs_sampler.py +++ b/reeds/input_processing/mcs_sampler.py @@ -2024,7 +2024,7 @@ def main_mga_rv( sw = reeds.io.get_switches(inputs_case) MCS_runs = int(sw.get('MCS_runs', 0)) MCS_lhs = int(sw.get('MCS_lhs', 0)) - MGA_rv_runs = int(sw.get('MGA_RV_runs', 0)) + GSw_MGA_RV_runs = int(sw.get('GSw_MGA_RV_runs', 0)) # get global seed from scalars (used to set the seed for a batch of runs) scalars = reeds.io.get_scalars() @@ -2036,11 +2036,11 @@ def main_mga_rv( else: print('MCS_runs switch is set to 0 or not found. No Monte Carlo sampling will be performed') - if MGA_rv_runs >= 1: + if GSw_MGA_RV_runs >= 1: print('Starting random vector sampling for MGA with mcs_sampler.py') - main_mga_rv(reeds_path, inputs_case, sw, n_samples=MGA_rv_runs, lhs_sampling=MCS_lhs, seed=seed) + main_mga_rv(reeds_path, inputs_case, sw, n_samples=GSw_MGA_RV_runs, lhs_sampling=MCS_lhs, seed=seed) else: - print('MGA_RV_runs switch is set to 0 or not found. No MGA random vector sampling will be performed') + print('GSw_MGA_RV_runs switch is set to 0 or not found. No MGA random vector sampling will be performed') # Final log/timing update. reeds.log.toc( diff --git a/reeds/inputs.py b/reeds/inputs.py index c710f5e55..4ce4dceba 100644 --- a/reeds/inputs.py +++ b/reeds/inputs.py @@ -275,11 +275,11 @@ def parse_cases( # If doing a Monte Carlo or MGA Random Vector run, modify dfcases by adding new columns # for each scenario run. For Monte Carlo we also validate the distribution file. warned_about_cluster_alg = False - if 'MCS_runs' in dfcases.index or 'MGA_RV_runs' in dfcases.index: + if 'MCS_runs' in dfcases.index or 'GSw_MGA_RV_runs' in dfcases.index: for c in dfcases.columns: if ( c not in ['Description','Default Value','Choices'] - and ((int(dfcases.loc['MCS_runs',c]) > 0) or (int(dfcases.loc['MGA_RV_runs',c]) > 0)) + and ((int(dfcases.loc['MCS_runs',c]) > 0) or (int(dfcases.loc['GSw_MGA_RV_runs',c]) > 0)) and (not int(dfcases.loc['ignore',c])) ): # Warn user if the hourly clustering algorithm is not fixed for Monte Carlo runs @@ -314,7 +314,7 @@ def parse_cases( numruns = int(dfcases[c].MCS_runs) run_type = 'MCS' else: - numruns = int(dfcases[c].MGA_RV_runs) + numruns = int(dfcases[c].GSw_MGA_RV_runs) run_type = 'R' # c (column) is a case with monte carlo or MGA random vector runs. @@ -378,13 +378,13 @@ def solvestring_sequential( 'GSw_ClimateWater', 'GSw_gopt', 'GSw_gopt_mga', - 'MGA_RV_runs', 'GSw_HourlyChunkLengthRep', 'GSw_HourlyChunkLengthStress', 'GSw_HourlyType', 'GSw_HourlyWrapLevel', 'GSw_MGA_CostDelta', 'GSw_MGA_Direction', + 'GSw_MGA_RV_runs', 'GSw_PVB_Dur', 'GSw_SkipRAyear', 'GSw_StateCO2ImportLevel', diff --git a/runreeds.py b/runreeds.py index ad33e08fb..471fe93b2 100644 --- a/runreeds.py +++ b/runreeds.py @@ -998,7 +998,7 @@ def setupEnvironment( print('Syncing remote files') # If using Monte Carlo sampling, download everything (since combinations of switches ## not listed in cases{}.csv may be used) - if df_cases.loc['MCS_runs'].astype(int).sum() or df_cases.loc['MGA_RV_runs'].astype(int).sum(): + if df_cases.loc['MCS_runs'].astype(int).sum() or df_cases.loc['GSw_MGA_RV_runs'].astype(int).sum(): reeds.remote.download_remote_files() ## Otherwise, only download the files needed for the present set of runs else: From e5c225f54be5039a80124c44b78d0e3fd73f2f10 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 11:48:39 -0400 Subject: [PATCH 26/37] fix bug with monte carlo run naming --- reeds/inputs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reeds/inputs.py b/reeds/inputs.py index 49c2a9f07..2a6e5d3ac 100644 --- a/reeds/inputs.py +++ b/reeds/inputs.py @@ -301,7 +301,7 @@ def parse_cases( if int(dfcases[c].MCS_runs) > 0: mcs_sampler.general_mcs_dist_validation(reeds.io.reeds_path, mcs_dist_path, sw) numruns = int(dfcases[c].MCS_runs) - run_type = 'MCS' + run_type = 'MC' else: numruns = int(dfcases[c].GSw_MGA_RV_runs) run_type = 'R' From ebc1bb2b64602755e4c7802f7562cfb93ff8cc20 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 12:12:40 -0400 Subject: [PATCH 27/37] remove unneeded files from runfiles.csv --- reeds/input_processing/runfiles.csv | 2 -- 1 file changed, 2 deletions(-) diff --git a/reeds/input_processing/runfiles.csv b/reeds/input_processing/runfiles.csv index 3e9f6b54f..f581eb5c5 100644 --- a/reeds/input_processing/runfiles.csv +++ b/reeds/input_processing/runfiles.csv @@ -273,6 +273,4 @@ wst_climate.csv,inputs/sets/wst_climate.csv,1,ignore,ignore,,,,,0,,,set,wst_clim yearafter.csv,inputs/sets/yearafter.csv,1,ignore,ignore,,,,,,,,set,yearafter,set to loop over for the final year calculation, Project.toml,Project.toml,1,ignore,ignore,,,,,,,,,,, gamslice.txt,gamslice.txt,0,ignore,ignore,,,,,,,,,,, -mcs_latin_hypercube_samples.csv,,0,ignore,ignore,,,,,,,,,,, -mga_weights.csv,,0,ignore,ignore,,,,,,,,,,, runreeds.py,runreeds.py,1,ignore,ignore,,,,,,,,,,, \ No newline at end of file From 5bda41daaab0199837fcc352bbcccd47b3a4a4a3 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 12:13:10 -0400 Subject: [PATCH 28/37] reformat and add descriptive names to LHS MGA RV file --- reeds/input_processing/mcs_sampler.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/reeds/input_processing/mcs_sampler.py b/reeds/input_processing/mcs_sampler.py index 70360fe5a..240f36da2 100644 --- a/reeds/input_processing/mcs_sampler.py +++ b/reeds/input_processing/mcs_sampler.py @@ -1964,6 +1964,8 @@ def main_mga_rv( runs_folder_name = os.path.basename(os.path.dirname(inputs_case.rstrip(os.path.sep))) mga_run_number = int((runs_folder_name.split('_')[-1]).replace('R', '')) + region_labels = np.repeat(val_r, len(subsets)) + subset_labels = np.tile(subsets, len(val_r)) # sample using LHS or random approach if lhs_sampling: @@ -1974,10 +1976,12 @@ def main_mga_rv( lhs_samples = lhs_sampler.random(n=n_samples) # record the lhs sampling matrix in each run folder lhs_samples_out = pd.DataFrame({'run': [f"R{i:0>4}" for i in range(1, n_samples + 1)]}) - lhs_samples_out = pd.concat( - [lhs_samples_out, pd.DataFrame(lhs_samples.round(6))], axis=1 - ) - lhs_samples_out.to_csv(os.path.join(inputs_case, "mga_rv_latin_hypercube_samples.csv"), index=False) + + lhs_samples_out = pd.DataFrame(lhs_samples.round(6)).T + lhs_samples_out.columns = [f"R{i:0>4}" for i in range(1, n_samples + 1)] + lhs_samples_out.index = [f"{region_labels[i]}_{subset_labels[i]}" for i in range(len(region_labels))] + lhs_samples_out.index.name = 'dimension' + lhs_samples_out.to_csv(os.path.join(inputs_case, "mga_rv_latin_hypercube_samples.csv")) # get the weights for this specific run (-1 to adjust for zero indexing) mga_weights_raw = lhs_samples[mga_run_number - 1] @@ -1988,8 +1992,6 @@ def main_mga_rv( mga_weights_raw = np.random.uniform(0, 1, dimensions) # save vector of weights for this run (rounded to 6 decimal places) - region_labels = np.repeat(val_r, len(subsets)) - subset_labels = np.tile(subsets, len(val_r)) mga_weights = pd.DataFrame({'*r': region_labels, 'i_subtech': subset_labels, 'weight': mga_weights_raw.round(6)}) mga_weights.to_csv(os.path.join(inputs_case, "mga_weights.csv"), index=False) From eeeaad6cac73d3e5949a689e930c385ba3d6810b Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 8 Jun 2026 17:37:51 -0400 Subject: [PATCH 29/37] draw weights from uniform(-1,1) --- reeds/input_processing/mcs_sampler.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/reeds/input_processing/mcs_sampler.py b/reeds/input_processing/mcs_sampler.py index 240f36da2..003925c94 100644 --- a/reeds/input_processing/mcs_sampler.py +++ b/reeds/input_processing/mcs_sampler.py @@ -1973,10 +1973,11 @@ def main_mga_rv( # a run-specific seed we draw for all runs at once using the global seed value lhs_sampler = scipy.stats.qmc.LatinHypercube(d=dimensions, seed=seed) # lhs_samples are arranged n x d (n = samples, d = dimensions) - lhs_samples = lhs_sampler.random(n=n_samples) + lhs_samples_cdf = lhs_sampler.random(n=n_samples) + # translate CDF samples into weights using uniform distribution (-1 to 1 to allow for simultaneous min/max) + lhs_samples = scipy.stats.uniform.ppf(lhs_samples_cdf, loc=-1, scale=2) + # record the lhs sampling matrix in each run folder - lhs_samples_out = pd.DataFrame({'run': [f"R{i:0>4}" for i in range(1, n_samples + 1)]}) - lhs_samples_out = pd.DataFrame(lhs_samples.round(6)).T lhs_samples_out.columns = [f"R{i:0>4}" for i in range(1, n_samples + 1)] lhs_samples_out.index = [f"{region_labels[i]}_{subset_labels[i]}" for i in range(len(region_labels))] @@ -1988,8 +1989,8 @@ def main_mga_rv( else: # set random seed using the global seed + MGA run number to allow reproducibility np.random.seed(seed + mga_run_number) - # get the weights for this specific run - mga_weights_raw = np.random.uniform(0, 1, dimensions) + # get the weights for this specific run (-1 to 1 to allow for simultaneous min/max) + mga_weights_raw = np.random.uniform(-1, 1, dimensions) # save vector of weights for this run (rounded to 6 decimal places) mga_weights = pd.DataFrame({'*r': region_labels, 'i_subtech': subset_labels, 'weight': mga_weights_raw.round(6)}) From 13056924085ded09847ff629bfb32830a7f17dc3 Mon Sep 17 00:00:00 2001 From: bsergi Date: Thu, 25 Jun 2026 16:04:34 -0400 Subject: [PATCH 30/37] add option for discrete sampling with MGA random vector --- reeds/input_processing/mcs_sampler.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/reeds/input_processing/mcs_sampler.py b/reeds/input_processing/mcs_sampler.py index 003925c94..3ffbe1475 100644 --- a/reeds/input_processing/mcs_sampler.py +++ b/reeds/input_processing/mcs_sampler.py @@ -1933,6 +1933,7 @@ def main_mga_rv( n_samples: int = 1, lhs_sampling: int = 1, seed: int = 0, + discrete: bool = True, ): # get dimensions based on number of regions and subojectives @@ -1974,9 +1975,13 @@ def main_mga_rv( lhs_sampler = scipy.stats.qmc.LatinHypercube(d=dimensions, seed=seed) # lhs_samples are arranged n x d (n = samples, d = dimensions) lhs_samples_cdf = lhs_sampler.random(n=n_samples) - # translate CDF samples into weights using uniform distribution (-1 to 1 to allow for simultaneous min/max) - lhs_samples = scipy.stats.uniform.ppf(lhs_samples_cdf, loc=-1, scale=2) - + if discrete: + # bin CDF samples in discrete choices (-1 or 1 with equal probability) + lhs_samples = np.where(lhs_samples_cdf < 0.5, -1, 1) + else: + # translate CDF samples into weights using uniform distribution (-1 to 1 to allow for simultaneous min/max) + lhs_samples = scipy.stats.uniform.ppf(lhs_samples_cdf, loc=-1, scale=2) + # record the lhs sampling matrix in each run folder lhs_samples_out = pd.DataFrame(lhs_samples.round(6)).T lhs_samples_out.columns = [f"R{i:0>4}" for i in range(1, n_samples + 1)] @@ -1990,7 +1995,10 @@ def main_mga_rv( # set random seed using the global seed + MGA run number to allow reproducibility np.random.seed(seed + mga_run_number) # get the weights for this specific run (-1 to 1 to allow for simultaneous min/max) - mga_weights_raw = np.random.uniform(-1, 1, dimensions) + if discrete: + mga_weights_raw = np.random.choice([-1,1], dimensions) + else: + mga_weights_raw = np.random.uniform(-1, 1, dimensions) # save vector of weights for this run (rounded to 6 decimal places) mga_weights = pd.DataFrame({'*r': region_labels, 'i_subtech': subset_labels, 'weight': mga_weights_raw.round(6)}) From af1b96282dd8efe7d3bdf899fb41aebc0e8b4a6a Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 27 Jul 2026 15:52:58 -0400 Subject: [PATCH 31/37] Add option to sample weights at any level in the hierarchy file --- cases.csv | 1 + reeds/input_processing/mcs_sampler.py | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/cases.csv b/cases.csv index 77583d7e9..9aab6703c 100644 --- a/cases.csv +++ b/cases.csv @@ -226,6 +226,7 @@ GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|gentech|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind),gentech, GSw_MGA_RV_runs,"MGA: Number of samples used for random vector weights that are applied to variables specified in GSw_MGA_Objective and GSw_MGA_SubObjective. Only active when GSw_MGA_CostDelta != 0; set to an integer N>0 to run N ReEDS simulations with sampling (0 disables sampling).",int,0, +GSw_MGA_RV_region,"MGA: regionality to use with random vector method (active when GSw_MGA_RV_runs>=1)",r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region,r, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, GSw_MingenFixed,Turn on/off fixed min-gen constraints,0; 1,1, diff --git a/reeds/input_processing/mcs_sampler.py b/reeds/input_processing/mcs_sampler.py index ead7792e6..70dda7201 100644 --- a/reeds/input_processing/mcs_sampler.py +++ b/reeds/input_processing/mcs_sampler.py @@ -1886,9 +1886,14 @@ def main_mga_rv( # get dimensions based on number of regions and subojectives ## regions - # val_r generated in copy_files.py + # get list of valid regions (val_r generated in copy_files.py) val_r = list(reeds.io.read_input(inputs_case, 'r')['*']) + # option to draw samples based on aggregated regions (samples will be mapped back to r regions) + hierarchy = reeds.io.get_hierarchy(GSw_ZoneSet=sw['GSw_ZoneSet']).reset_index() + hierarchy_val_r = hierarchy.loc[hierarchy.r.isin(val_r)] + sampling_regions = hierarchy_val_r[sw['GSw_MGA_RV_region']].unique() + ## objective if sw.GSw_MGA_Objective in ['capacity', 'generation']: ## if the subojective is an aggregated category, break it up into smaller groups @@ -1904,16 +1909,17 @@ def main_mga_rv( else: subsets = [sw.GSw_MGA_SubObjective] - ## sample weights for each subojective group and region - dimensions = len(subsets) * len(val_r) + ## sample weights for each subojective group and sampling region + dimensions = len(subsets) * len(sampling_regions) else: raise NotImplementedError(f"Objective '{sw.GSw_MGA_Objective}' is not yet supported for MGA random vector sampling.") + # setup output runs_folder_name = os.path.basename(os.path.dirname(inputs_case.rstrip(os.path.sep))) mga_run_number = int((runs_folder_name.split('_')[-1]).replace('R', '')) - region_labels = np.repeat(val_r, len(subsets)) - subset_labels = np.tile(subsets, len(val_r)) + region_labels = np.repeat(sampling_regions, len(subsets)) + subset_labels = np.tile(subsets, len(sampling_regions)) # sample using LHS or random approach if lhs_sampling: @@ -1947,8 +1953,12 @@ def main_mga_rv( else: mga_weights_raw = np.random.uniform(-1, 1, dimensions) - # save vector of weights for this run (rounded to 6 decimal places) - mga_weights = pd.DataFrame({'*r': region_labels, 'i_subtech': subset_labels, 'weight': mga_weights_raw.round(6)}) + # save vector of weights for this run, mapped back to r regions and rounded to 6 decimal places + mga_weights = pd.DataFrame({sw['GSw_MGA_RV_region']: region_labels, 'i_subtech': subset_labels, 'weight': mga_weights_raw.round(6)}) + if sw['GSw_MGA_RV_region'] != 'r': + mga_weights = pd.merge(mga_weights, hierarchy_val_r[[sw['GSw_MGA_RV_region'], 'r']], on=sw['GSw_MGA_RV_region']) + mga_weights = mga_weights.rename(columns={'r':'*r'})[['*r','i_subtech','weight']] + mga_weights = mga_weights.sort_values(by=['*r', 'i_subtech'], ascending=True) mga_weights.to_csv(os.path.join(inputs_case, "mga_weights.csv"), index=False) @@ -2006,3 +2016,5 @@ def main_mga_rv( process='input_processing/mcs_sampler.py', path=os.path.join(os.path.dirname(inputs_case)) ) + +# %% From 7085ff9a597562bb0c77bebd2e6d7cb6329c45e5 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 27 Jul 2026 16:12:46 -0400 Subject: [PATCH 32/37] Move MGA random vector compatibility check up --- reeds/input_processing/mcs_sampler.py | 34 +++++++++++---------------- runreeds.py | 5 ++++ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/reeds/input_processing/mcs_sampler.py b/reeds/input_processing/mcs_sampler.py index 70dda7201..0a1dcfb9b 100644 --- a/reeds/input_processing/mcs_sampler.py +++ b/reeds/input_processing/mcs_sampler.py @@ -1894,26 +1894,20 @@ def main_mga_rv( hierarchy_val_r = hierarchy.loc[hierarchy.r.isin(val_r)] sampling_regions = hierarchy_val_r[sw['GSw_MGA_RV_region']].unique() - ## objective - if sw.GSw_MGA_Objective in ['capacity', 'generation']: - ## if the subojective is an aggregated category, break it up into smaller groups - ## otherwise just use the subobjective as the group - mapped_categories ={ - 'gentech': ['coal', 'gas', 'nuclear', 'h2_combustion', 'geo', 'hydro', 'ofswind', 'onswind', 'storage', 'upv'], - 'fossil' : ['coal', 'gas'], - 're': ['geo', 'hydro', 'ofswind', 'onswind', 'pv', 'vre', 'wind'], - 'vre': ['ofswind', 'onswind', 'upv'], - } - if sw.GSw_MGA_SubObjective in mapped_categories: - subsets = mapped_categories[sw.GSw_MGA_SubObjective] - else: - subsets = [sw.GSw_MGA_SubObjective] - - ## sample weights for each subojective group and sampling region - dimensions = len(subsets) * len(sampling_regions) - - else: - raise NotImplementedError(f"Objective '{sw.GSw_MGA_Objective}' is not yet supported for MGA random vector sampling.") + ## objective (assumes sw.GSw_MGA_Objective in ['capacity', 'generation'] based on + ## check in runreeds.check_compatibility() + ## if the subojective is an aggregated category, break it up into smaller groups + ## otherwise just use the subobjective as the group + mapped_categories ={ + 'gentech': ['coal', 'gas', 'nuclear', 'h2_combustion', 'geo', 'hydro', 'ofswind', 'onswind', 'storage', 'upv'], + 'fossil' : ['coal', 'gas'], + 're': ['geo', 'hydro', 'ofswind', 'onswind', 'pv', 'vre', 'wind'], + 'vre': ['ofswind', 'onswind', 'upv'], + } + subsets = mapped_categories.get(sw.GSw_MGA_SubObjective, [sw.GSw_MGA_SubObjective]) + + ## sample weights for each subojective group and sampling region + dimensions = len(subsets) * len(sampling_regions) # setup output runs_folder_name = os.path.basename(os.path.dirname(inputs_case.rstrip(os.path.sep))) diff --git a/runreeds.py b/runreeds.py index 870b3b6d0..d9c25abe5 100644 --- a/runreeds.py +++ b/runreeds.py @@ -487,6 +487,11 @@ def check_compatibility(sw): ) raise ValueError(err) + if (sw['GSw_MGA_Objective'] not in ['capacity', 'generation']) and int(sw['GSw_MGA_RV_runs']) > 0: + raise NotImplementedError( + f"GSw_MGA_Objective='{sw['GSw_MGA_Objective']}' is not yet supported for MGA random vector sampling." + ) + ### Dependent model availability if ( ((int(sw['pras']) == 2) or int(sw['GSw_PRM_StressIterateMax'])) From 611d2bf4960e4b75e4c2dedf1c576e217f230562 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 27 Jul 2026 16:19:18 -0400 Subject: [PATCH 33/37] Add details on MGA random vector to user guide --- cases.csv | 2 +- docs/source/user_guide.md | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cases.csv b/cases.csv index 9aab6703c..11b984fad 100644 --- a/cases.csv +++ b/cases.csv @@ -225,7 +225,7 @@ GSw_MGA_CostDelta,MGA: Fraction by which to allow objective function to increase GSw_MGA_Direction,MGA: Directionality of second optimization,(min|max),min, GSw_MGA_Objective,MGA: Objective for MGA (uses GSw_MGA_SubObjective to specify technology subset if set to capacity),(capacity|generation|transmission|rasharing|co2|employment),capacity, GSw_MGA_SubObjective,MGA: Technology subset to minimize or maximize the capacity or generation of (only used for GSw_MGA_Objective=(capacity or generation)),(battery|ccs|coal|dac|fossil|gas|gentech|geo|h2_combustion|hydro|nuclear|ofswind|onswind|pv|re|storage|upv|vre|wind),gentech, -GSw_MGA_RV_runs,"MGA: Number of samples used for random vector weights that are applied to variables specified in GSw_MGA_Objective and GSw_MGA_SubObjective. Only active when GSw_MGA_CostDelta != 0; set to an integer N>0 to run N ReEDS simulations with sampling (0 disables sampling).",int,0, +GSw_MGA_RV_runs,"MGA: Number of samples drawn for the random vector weights that are applied to variables specified in GSw_MGA_Objective and GSw_MGA_SubObjective. Only active when GSw_MGA_CostDelta != 0; set to an integer N>0 to run N ReEDS simulations with sampling (0 disables sampling).",int,0, GSw_MGA_RV_region,"MGA: regionality to use with random vector method (active when GSw_MGA_RV_runs>=1)",r; nercr; transreg; transgrp; cendiv; st; interconnect; country; usda_region,r, GSw_MinCF,Turn on/off regional min CF constraint (applied at i/r level),0; 1,1, GSw_Mingen,Turn on/off min-gen constraints by r/h/szn,0; 1,0, diff --git a/docs/source/user_guide.md b/docs/source/user_guide.md index 9de220985..e856602b4 100644 --- a/docs/source/user_guide.md +++ b/docs/source/user_guide.md @@ -631,8 +631,17 @@ Options are the column names in the `inputs/tech-subset-table.csv` file. Users familiar with GAMS can add alternative objective functions to the `d_mga.gms` file and associated options to the `GSw_MGA_Objective` switch in `cases.csv`. +By default the MGA min/max is applied to the sum of the variable across all regions being modeled. +The MGA approach also supports an option to randomly sample of a vector of weights to apply to the regional values of the variable being optimized. +This method can be useful to characterizing the uncertainty in the regional distribution of the results. +Weights are sampled as discrete values from a support of {-1,1} to allow for simultaneous minimization and maximization. +The MGA random vector capability is controlled by the following switches: +- `GSw_MGA_RV_runs` (default `0`): Number of random samples of weight vectors to draw; corresponds to the number of runs. +- `GSw_MGA_RV_region` (default `r`): Regionality level (specified by hierarhcy file) over which to sample the random weights. +Note that this capability is currently only supported when `GSw_MGA_Objective = (capacity or generation)`. +Weights for each run are stored in the `mga_weights` parameter. ## Uncertainty Plots From 71e5ab1fa58ab17b6703524517664745ce47e3f0 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 27 Jul 2026 16:39:35 -0400 Subject: [PATCH 34/37] remove "download everything" requirement for MGA random vector --- runreeds.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runreeds.py b/runreeds.py index d9c25abe5..78c0fd6b5 100644 --- a/runreeds.py +++ b/runreeds.py @@ -1001,7 +1001,7 @@ def setupEnvironment( print('Syncing remote files') # If using Monte Carlo sampling, download everything (since combinations of switches ## not listed in cases{}.csv may be used) - if df_cases.loc['MCS_runs'].astype(int).sum() or df_cases.loc['GSw_MGA_RV_runs'].astype(int).sum(): + if df_cases.loc['MCS_runs'].astype(int).sum(): reeds.remote.download_remote_files() ## Otherwise, only download the files needed for the present set of runs else: From ead44e09ea65548e206c15877d6238ad32e974f9 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 27 Jul 2026 16:47:11 -0400 Subject: [PATCH 35/37] revert unrelated change to transmission employment --- inputs/employment/employment_factor_inter_transmission.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inputs/employment/employment_factor_inter_transmission.csv b/inputs/employment/employment_factor_inter_transmission.csv index 950cb746d..fd68987b2 100644 --- a/inputs/employment/employment_factor_inter_transmission.csv +++ b/inputs/employment/employment_factor_inter_transmission.csv @@ -2,4 +2,4 @@ jedi,0.00000331 mayfield,0.00000499 rutovitz,0.00000029 -ram,0.00000596 +ram,0.00000596 \ No newline at end of file From 64986afd161ba67f8d2addc6bfe3e94aed9bbe1f Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 27 Jul 2026 16:51:29 -0400 Subject: [PATCH 36/37] remove upper case files --- .../employment_factor_plant_JEDI.csv | 206 ------------------ .../employment_factor_plant_Mayfield.csv | 206 ------------------ .../employment_factor_plant_Ram.csv | 206 ------------------ .../employment_factor_plant_Rutovitz.csv | 206 ------------------ 4 files changed, 824 deletions(-) delete mode 100644 inputs/employment/employment_factor_plant_JEDI.csv delete mode 100644 inputs/employment/employment_factor_plant_Mayfield.csv delete mode 100644 inputs/employment/employment_factor_plant_Ram.csv delete mode 100644 inputs/employment/employment_factor_plant_Rutovitz.csv diff --git a/inputs/employment/employment_factor_plant_JEDI.csv b/inputs/employment/employment_factor_plant_JEDI.csv deleted file mode 100644 index ae6cb8f9f..000000000 --- a/inputs/employment/employment_factor_plant_JEDI.csv +++ /dev/null @@ -1,206 +0,0 @@ -,construction,fom,vom -battery_li,0.937020565,0.033333333,0 -biopower,3.76446807,1.453074326,0 -beccs_mod,3.76446807,1.453074326,0 -beccs_max,3.76446807,1.453074326,0 -coal-CCS_mod,4.196159448,0.186153846,0.00005346 -coal-CCS_max,4.196159448,0.186153846,0.00005346 -coal-CCS-F1,4.196159448,0.186153846,0.00005346 -coal-CCS-F2,4.196159448,0.186153846,0.00005346 -coal-CCS-F3,4.196159448,0.186153846,0.00005346 -Coal-IGCC,4.149232006,0.181538462,0.00003725 -coal-new,2.663868535,0.16,0.00003948 -CoalOldScr,2.663868535,0.16,0.00003948 -CoalOldUns,2.663868535,0.16,0.00003948 -CofireNew,2.663868535,0.16,0.00003948 -CofireOld,2.663868535,0.16,0.00003948 -csp-ns,5.860286945,0.257823504,0 -distpv,2.97777666,0.203887755,0 -Gas-CC,0.57898781,0.052,0.00002764 -Gas-CC-CCS_mod,1.301540146,0.072,0.00005346 -Gas-CC-CCS_max,1.301540146,0.072,0.00005346 -Gas-CC-CCS-F1,1.301540146,0.072,0.00005346 -Gas-CC-CCS-F2,1.301540146,0.072,0.00005346 -Gas-CC-CCS-F3,1.301540146,0.072,0.00005346 -Gas-CT,1.124155973,0.28,0.00004233 -H2-CT,1.124155973,0.28,0 -H2-CC,0.57898781,0.052,0 -geothermal,4.614237729,0.15681119,0.00003511 -Hydro,3.088992778,0.019831569,0 -lfill-gas,0.57898781,0.052,0 -Nuclear,13.74608053,1.042875956,0.00002946 -Nuclear-SMR,4.35325963,0.278978818,0.00001645 -o-g-s,0.57898781,0.052,0.00002764 -pumped-hydro,4.437357277,0.105776354,0 -pumped-hydro-flex,4.437357277,0.105776354,0 -upv_1,2.31800771,0.049966822,0 -upv_2,2.31800771,0.049966822,0 -upv_3,2.31800771,0.049966822,0 -upv_4,2.31800771,0.049966822,0 -upv_5,2.31800771,0.049966822,0 -upv_6,2.31800771,0.049966822,0 -upv_7,2.31800771,0.049966822,0 -upv_8,2.31800771,0.049966822,0 -upv_9,2.31800771,0.049966822,0 -upv_10,2.31800771,0.049966822,0 -pvb1_1,2.31800771,0.049966822,0 -pvb1_2,2.31800771,0.049966822,0 -pvb1_3,2.31800771,0.049966822,0 -pvb1_4,2.31800771,0.049966822,0 -pvb1_5,2.31800771,0.049966822,0 -pvb1_6,2.31800771,0.049966822,0 -pvb1_7,2.31800771,0.049966822,0 -pvb1_8,2.31800771,0.049966822,0 -pvb1_9,2.31800771,0.049966822,0 -pvb1_10,2.31800771,0.049966822,0 -pvb2_1,2.31800771,0.049966822,0 -pvb2_2,2.31800771,0.049966822,0 -pvb2_3,2.31800771,0.049966822,0 -pvb2_4,2.31800771,0.049966822,0 -pvb2_5,2.31800771,0.049966822,0 -pvb2_6,2.31800771,0.049966822,0 -pvb2_7,2.31800771,0.049966822,0 -pvb2_8,2.31800771,0.049966822,0 -pvb2_9,2.31800771,0.049966822,0 -pvb2_10,2.31800771,0.049966822,0 -pvb3_1,2.31800771,0.049966822,0 -pvb3_2,2.31800771,0.049966822,0 -pvb3_3,2.31800771,0.049966822,0 -pvb3_4,2.31800771,0.049966822,0 -pvb3_5,2.31800771,0.049966822,0 -pvb3_6,2.31800771,0.049966822,0 -pvb3_7,2.31800771,0.049966822,0 -pvb3_8,2.31800771,0.049966822,0 -pvb3_9,2.31800771,0.049966822,0 -pvb3_10,2.31800771,0.049966822,0 -wind-ofs_1,1.747743604,0.11549396,0 -wind-ofs_2,1.747743604,0.11549396,0 -wind-ofs_3,1.747743604,0.11549396,0 -wind-ofs_4,1.747743604,0.11549396,0 -wind-ofs_5,1.747743604,0.11549396,0 -wind-ofs_6,1.747743604,0.11549396,0 -wind-ofs_7,1.747743604,0.11549396,0 -wind-ofs_8,1.747743604,0.11549396,0 -wind-ofs_9,1.747743604,0.11549396,0 -wind-ofs_10,1.747743604,0.11549396,0 -wind-ons_1,1.233305044,0.033060233,0 -wind-ons_2,1.233305044,0.033060233,0 -wind-ons_3,1.233305044,0.033060233,0 -wind-ons_4,1.233305044,0.033060233,0 -wind-ons_5,1.233305044,0.033060233,0 -wind-ons_6,1.233305044,0.033060233,0 -wind-ons_7,1.233305044,0.033060233,0 -wind-ons_8,1.233305044,0.033060233,0 -wind-ons_9,1.233305044,0.033060233,0 -wind-ons_10,1.233305044,0.033060233,0 -csp1_1,5.860286945,0.257823504,0 -csp1_2,5.860286945,0.257823504,0 -csp1_3,5.860286945,0.257823504,0 -csp1_4,5.860286945,0.257823504,0 -csp1_5,5.860286945,0.257823504,0 -csp1_6,5.860286945,0.257823504,0 -csp1_7,5.860286945,0.257823504,0 -csp1_8,5.860286945,0.257823504,0 -csp1_9,5.860286945,0.257823504,0 -csp1_10,5.860286945,0.257823504,0 -csp1_11,5.860286945,0.257823504,0 -csp1_12,5.860286945,0.257823504,0 -csp2_1,5.860286945,0.257823504,0 -csp2_2,5.860286945,0.257823504,0 -csp2_3,5.860286945,0.257823504,0 -csp2_4,5.860286945,0.257823504,0 -csp2_5,5.860286945,0.257823504,0 -csp2_6,5.860286945,0.257823504,0 -csp2_7,5.860286945,0.257823504,0 -csp2_8,5.860286945,0.257823504,0 -csp2_9,5.860286945,0.257823504,0 -csp2_10,5.860286945,0.257823504,0 -csp2_11,5.860286945,0.257823504,0 -csp2_12,5.860286945,0.257823504,0 -csp3_1,5.860286945,0.257823504,0 -csp3_2,5.860286945,0.257823504,0 -csp3_3,5.860286945,0.257823504,0 -csp3_4,5.860286945,0.257823504,0 -csp3_5,5.860286945,0.257823504,0 -csp3_6,5.860286945,0.257823504,0 -csp3_7,5.860286945,0.257823504,0 -csp3_8,5.860286945,0.257823504,0 -csp3_9,5.860286945,0.257823504,0 -csp3_10,5.860286945,0.257823504,0 -csp3_11,5.860286945,0.257823504,0 -csp3_12,5.860286945,0.257823504,0 -csp4_1,5.860286945,0.257823504,0 -csp4_2,5.860286945,0.257823504,0 -csp4_3,5.860286945,0.257823504,0 -csp4_4,5.860286945,0.257823504,0 -csp4_5,5.860286945,0.257823504,0 -csp4_6,5.860286945,0.257823504,0 -csp4_7,5.860286945,0.257823504,0 -csp4_8,5.860286945,0.257823504,0 -csp4_9,5.860286945,0.257823504,0 -csp4_10,5.860286945,0.257823504,0 -csp4_11,5.860286945,0.257823504,0 -csp4_12,5.860286945,0.257823504,0 -hydD,3.088992778,0.019831569,0 -hydND,3.088992778,0.019831569,0 -hydSD,3.088992778,0.019831569,0 -hydSND,3.088992778,0.019831569,0 -hydUD,3.088992778,0.019831569,0 -hydUND,3.088992778,0.019831569,0 -hydNPD,3.088992778,0.019831569,0 -hydNPND,3.088992778,0.019831569,0 -hydED,3.088992778,0.019831569,0 -hydEND,3.088992778,0.019831569,0 -egs_allkm_1,5.506553405,0.151210424,0.00004967 -egs_allkm_2,5.506553405,0.151210424,0.00004967 -egs_allkm_3,5.506553405,0.151210424,0.00004967 -egs_allkm_4,5.506553405,0.151210424,0.00004967 -egs_allkm_5,5.506553405,0.151210424,0.00004967 -egs_allkm_6,5.506553405,0.151210424,0.00004967 -egs_allkm_7,5.506553405,0.151210424,0.00004967 -egs_allkm_8,5.506553405,0.151210424,0.00004967 -egs_allkm_9,5.506553405,0.151210424,0.00004967 -egs_allkm_10,5.506553405,0.151210424,0.00004967 -geohydro_allkm_1,4.614237729,0.15681119,0.00003511 -geohydro_allkm_2,4.614237729,0.15681119,0.00003511 -geohydro_allkm_3,4.614237729,0.15681119,0.00003511 -geohydro_allkm_4,4.614237729,0.15681119,0.00003511 -geohydro_allkm_5,4.614237729,0.15681119,0.00003511 -geohydro_allkm_6,4.614237729,0.15681119,0.00003511 -geohydro_allkm_7,4.614237729,0.15681119,0.00003511 -geohydro_allkm_8,4.614237729,0.15681119,0.00003511 -geohydro_allkm_9,4.614237729,0.15681119,0.00003511 -geohydro_allkm_10,4.614237729,0.15681119,0.00003511 -egs_nearfield_1,5.506553405,0.151210424,0.00004967 -egs_nearfield_2,5.506553405,0.151210424,0.00004967 -egs_nearfield_3,5.506553405,0.151210424,0.00004967 -egs_nearfield_4,5.506553405,0.151210424,0.00004967 -egs_nearfield_5,5.506553405,0.151210424,0.00004967 -egs_nearfield_6,5.506553405,0.151210424,0.00004967 -egs_nearfield_7,5.506553405,0.151210424,0.00004967 -egs_nearfield_8,5.506553405,0.151210424,0.00004967 -egs_nearfield_9,5.506553405,0.151210424,0.00004967 -egs_nearfield_10,5.506553405,0.151210424,0.00004967 -Gas-CT_H2-CT,1.124155973,0.28,0.00004233 -Gas-CC_H2-CC,0.57898781,0.052,0.00002764 -CoalOldUns_CoalOldScr,2.663868535,0.16,0.00003948 -CoalOldUns_CofireOld,2.663868535,0.16,0.00003948 -CoalOldScr_CofireOld,2.663868535,0.16,0.00003948 -coal-new_CofireNew,2.663868535,0.16,0.00003948 -Gas-CC_Gas-CC-CCS_mod,0.858296124,0.084,0.00005634 -Coal-IGCC_coal-CCS_mod,1.617499527,0.156923077,0.00005634 -coal-new_coal-CCS_mod,1.617499527,0.156923077,0.00005634 -CoalOldScr_coal-CCS_mod,1.617499527,0.156923077,0.00005634 -CoalOldUns_coal-CCS_mod,1.617499527,0.156923077,0.00005634 -CofireNew_coal-CCS_mod,1.617499527,0.156923077,0.00005634 -CofireOld_coal-CCS_mod,1.617499527,0.156923077,0.00005634 -Gas-CC_Gas-CC-CCS_max,0.858296124,0.084,0.00005634 -Coal-IGCC_coal-CCS_max,1.617499527,0.156923077,0.00005634 -coal-new_coal-CCS_max,1.617499527,0.156923077,0.00005634 -CoalOldScr_coal-CCS_max,1.617499527,0.156923077,0.00005634 -CoalOldUns_coal-CCS_max,1.617499527,0.156923077,0.00005634 -CofireNew_coal-CCS_max,1.617499527,0.156923077,0.00005634 -CofireOld_coal-CCS_max,1.617499527,0.156923077,0.00005634 -hydEND_hydED,3.088992778,0.019831569,0 -hydED_pumped-hydro,4.437357277,0.105776354,0 -hydED_pumped-hydro-flex,4.437357277,0.105776354,0 \ No newline at end of file diff --git a/inputs/employment/employment_factor_plant_Mayfield.csv b/inputs/employment/employment_factor_plant_Mayfield.csv deleted file mode 100644 index c2da29421..000000000 --- a/inputs/employment/employment_factor_plant_Mayfield.csv +++ /dev/null @@ -1,206 +0,0 @@ -,construction,fom,vom -battery_li,0,0,0 -biopower,0.346,0.123,0 -beccs_mod,0.346,0.123,0 -beccs_max,0.346,0.123,0 -coal-CCS_mod,0,0.266,0 -coal-CCS_max,0,0.266,0 -coal-CCS-F1,0,0.266,0 -coal-CCS-F2,0,0.266,0 -coal-CCS-F3,0,0.266,0 -Coal-IGCC,0,0.266,0 -coal-new,0,0.266,0 -CoalOldScr,0,0.266,0 -CoalOldUns,0,0.266,0 -CofireNew,0,0.266,0 -CofireOld,0,0.266,0 -csp-ns,6.468,0.448,0 -distpv,35.337,0.541,0 -Gas-CC,0.346,0.123,0 -Gas-CC-CCS_mod,0.346,0.123,0 -Gas-CC-CCS_max,0.346,0.123,0 -Gas-CC-CCS-F1,0.346,0.123,0 -Gas-CC-CCS-F2,0.346,0.123,0 -Gas-CC-CCS-F3,0.346,0.123,0 -Gas-CT,0.346,0.123,0 -H2-CT,0.346,0.123,0 -H2-CC,0.346,0.123,0 -geothermal,0,0,0 -Hydro,0,0,0 -lfill-gas,0.346,0.123,0 -Nuclear,9.93,0.513,0 -Nuclear-SMR,9.93,0.513,0 -o-g-s,0.346,0.123,0 -pumped-hydro,0,0,0 -pumped-hydro-flex,0,0,0 -upv_1,6.468,0.448,0 -upv_2,6.468,0.448,0 -upv_3,6.468,0.448,0 -upv_4,6.468,0.448,0 -upv_5,6.468,0.448,0 -upv_6,6.468,0.448,0 -upv_7,6.468,0.448,0 -upv_8,6.468,0.448,0 -upv_9,6.468,0.448,0 -upv_10,6.468,0.448,0 -pvb1_1,6.468,0.448,0 -pvb1_2,6.468,0.448,0 -pvb1_3,6.468,0.448,0 -pvb1_4,6.468,0.448,0 -pvb1_5,6.468,0.448,0 -pvb1_6,6.468,0.448,0 -pvb1_7,6.468,0.448,0 -pvb1_8,6.468,0.448,0 -pvb1_9,6.468,0.448,0 -pvb1_10,6.468,0.448,0 -pvb2_1,6.468,0.448,0 -pvb2_2,6.468,0.448,0 -pvb2_3,6.468,0.448,0 -pvb2_4,6.468,0.448,0 -pvb2_5,6.468,0.448,0 -pvb2_6,6.468,0.448,0 -pvb2_7,6.468,0.448,0 -pvb2_8,6.468,0.448,0 -pvb2_9,6.468,0.448,0 -pvb2_10,6.468,0.448,0 -pvb3_1,6.468,0.448,0 -pvb3_2,6.468,0.448,0 -pvb3_3,6.468,0.448,0 -pvb3_4,6.468,0.448,0 -pvb3_5,6.468,0.448,0 -pvb3_6,6.468,0.448,0 -pvb3_7,6.468,0.448,0 -pvb3_8,6.468,0.448,0 -pvb3_9,6.468,0.448,0 -pvb3_10,6.468,0.448,0 -wind-ofs_1,0.263,0.894,0 -wind-ofs_2,0.263,0.894,0 -wind-ofs_3,0.263,0.894,0 -wind-ofs_4,0.263,0.894,0 -wind-ofs_5,0.263,0.894,0 -wind-ofs_6,0.263,0.894,0 -wind-ofs_7,0.263,0.894,0 -wind-ofs_8,0.263,0.894,0 -wind-ofs_9,0.263,0.894,0 -wind-ofs_10,0.263,0.894,0 -wind-ons_1,0.263,0.894,0 -wind-ons_2,0.263,0.894,0 -wind-ons_3,0.263,0.894,0 -wind-ons_4,0.263,0.894,0 -wind-ons_5,0.263,0.894,0 -wind-ons_6,0.263,0.894,0 -wind-ons_7,0.263,0.894,0 -wind-ons_8,0.263,0.894,0 -wind-ons_9,0.263,0.894,0 -wind-ons_10,0.263,0.894,0 -csp1_1,6.468,0.448,0 -csp1_2,6.468,0.448,0 -csp1_3,6.468,0.448,0 -csp1_4,6.468,0.448,0 -csp1_5,6.468,0.448,0 -csp1_6,6.468,0.448,0 -csp1_7,6.468,0.448,0 -csp1_8,6.468,0.448,0 -csp1_9,6.468,0.448,0 -csp1_10,6.468,0.448,0 -csp1_11,6.468,0.448,0 -csp1_12,6.468,0.448,0 -csp2_1,6.468,0.448,0 -csp2_2,6.468,0.448,0 -csp2_3,6.468,0.448,0 -csp2_4,6.468,0.448,0 -csp2_5,6.468,0.448,0 -csp2_6,6.468,0.448,0 -csp2_7,6.468,0.448,0 -csp2_8,6.468,0.448,0 -csp2_9,6.468,0.448,0 -csp2_10,6.468,0.448,0 -csp2_11,6.468,0.448,0 -csp2_12,6.468,0.448,0 -csp3_1,6.468,0.448,0 -csp3_2,6.468,0.448,0 -csp3_3,6.468,0.448,0 -csp3_4,6.468,0.448,0 -csp3_5,6.468,0.448,0 -csp3_6,6.468,0.448,0 -csp3_7,6.468,0.448,0 -csp3_8,6.468,0.448,0 -csp3_9,6.468,0.448,0 -csp3_10,6.468,0.448,0 -csp3_11,6.468,0.448,0 -csp3_12,6.468,0.448,0 -csp4_1,6.468,0.448,0 -csp4_2,6.468,0.448,0 -csp4_3,6.468,0.448,0 -csp4_4,6.468,0.448,0 -csp4_5,6.468,0.448,0 -csp4_6,6.468,0.448,0 -csp4_7,6.468,0.448,0 -csp4_8,6.468,0.448,0 -csp4_9,6.468,0.448,0 -csp4_10,6.468,0.448,0 -csp4_11,6.468,0.448,0 -csp4_12,6.468,0.448,0 -hydD,0,0,0 -hydND,0,0,0 -hydSD,0,0,0 -hydSND,0,0,0 -hydUD,0,0,0 -hydUND,0,0,0 -hydNPD,0,0,0 -hydNPND,0,0,0 -hydED,0,0,0 -hydEND,0,0,0 -egs_allkm_1,0,0,0 -egs_allkm_2,0,0,0 -egs_allkm_3,0,0,0 -egs_allkm_4,0,0,0 -egs_allkm_5,0,0,0 -egs_allkm_6,0,0,0 -egs_allkm_7,0,0,0 -egs_allkm_8,0,0,0 -egs_allkm_9,0,0,0 -egs_allkm_10,0,0,0 -geohydro_allkm_1,0,0,0 -geohydro_allkm_2,0,0,0 -geohydro_allkm_3,0,0,0 -geohydro_allkm_4,0,0,0 -geohydro_allkm_5,0,0,0 -geohydro_allkm_6,0,0,0 -geohydro_allkm_7,0,0,0 -geohydro_allkm_8,0,0,0 -geohydro_allkm_9,0,0,0 -geohydro_allkm_10,0,0,0 -egs_nearfield_1,0,0,0 -egs_nearfield_2,0,0,0 -egs_nearfield_3,0,0,0 -egs_nearfield_4,0,0,0 -egs_nearfield_5,0,0,0 -egs_nearfield_6,0,0,0 -egs_nearfield_7,0,0,0 -egs_nearfield_8,0,0,0 -egs_nearfield_9,0,0,0 -egs_nearfield_10,0,0,0 -Gas-CT_H2-CT,0.346,0.123,0 -Gas-CC_H2-CC,0.346,0.123,0 -CoalOldUns_CoalOldScr,0,0.266,0 -CoalOldUns_CofireOld,0,0.266,0 -CoalOldScr_CofireOld,0,0.266,0 -coal-new_CofireNew,0,0.266,0 -Gas-CC_Gas-CC-CCS_mod,0.346,0.266,0 -Coal-IGCC_coal-CCS_mod,0,0.266,0 -coal-new_coal-CCS_mod,0,0.266,0 -CoalOldScr_coal-CCS_mod,0,0.266,0 -CoalOldUns_coal-CCS_mod,0,0.266,0 -CofireNew_coal-CCS_mod,0,0.266,0 -CofireOld_coal-CCS_mod,0,0.266,0 -Gas-CC_Gas-CC-CCS_max,0.346,0.123,0 -Coal-IGCC_coal-CCS_max,0,0.266,0 -coal-new_coal-CCS_max,0,0.266,0 -CoalOldScr_coal-CCS_max,0,0.266,0 -CoalOldUns_coal-CCS_max,0,0.266,0 -CofireNew_coal-CCS_max,0,0.266,0 -CofireOld_coal-CCS_max,0,0.266,0 -hydEND_hydED,0,0,0 -hydED_pumped-hydro,0,0,0 -hydED_pumped-hydro-flex,0,0,0 \ No newline at end of file diff --git a/inputs/employment/employment_factor_plant_Ram.csv b/inputs/employment/employment_factor_plant_Ram.csv deleted file mode 100644 index 43731f32c..000000000 --- a/inputs/employment/employment_factor_plant_Ram.csv +++ /dev/null @@ -1,206 +0,0 @@ -,construction,fom,vom -battery_li,0.53,0.23,0 -biopower,14,1.5,0 -beccs_mod,14,1.5,0 -beccs_max,14,1.5,0 -coal-CCS_mod,11.08,0.22,0.00001 -coal-CCS_max,11.08,0.22,0.00001 -coal-CCS-F1,11.08,0.22,0.00001 -coal-CCS-F2,11.08,0.22,0.00001 -coal-CCS-F3,11.08,0.22,0.00001 -Coal-IGCC,11.08,0.22,0.00001 -coal-new,11.08,0.22,0.00001 -CoalOldScr,11.08,0.22,0.00001 -CoalOldUns,11.08,0.22,0.00001 -CofireNew,11.08,0.22,0.00001 -CofireOld,11.08,0.22,0.00001 -csp-ns,1.61,0.14,0 -distpv,4.19,0.13,0 -Gas-CC,1.27,0.14,0.00007 -Gas-CC-CCS_mod,1.27,0.14,0.00007 -Gas-CC-CCS_max,1.27,0.14,0.00007 -Gas-CC-CCS-F1,1.27,0.14,0.00007 -Gas-CC-CCS-F2,1.27,0.14,0.00007 -Gas-CC-CCS-F3,1.27,0.14,0.00007 -Gas-CT,1.27,0.14,0.00007 -H2-CT,1.27,0.14,0.00007 -H2-CC,1.27,0.14,0.00007 -geothermal,6.8,0.4,0 -Hydro,7.36,0.14,0 -lfill-gas,1.27,0.14,0 -Nuclear,11.8,0.6,0 -Nuclear-SMR,11.8,0.6,0 -o-g-s,1.27,0.14,0 -pumped-hydro,7.18,0.08,0 -pumped-hydro-flex,7.18,0.08,0 -upv_1,1.61,0.09,0 -upv_2,1.61,0.09,0 -upv_3,1.61,0.09,0 -upv_4,1.61,0.09,0 -upv_5,1.61,0.09,0 -upv_6,1.61,0.09,0 -upv_7,1.61,0.09,0 -upv_8,1.61,0.09,0 -upv_9,1.61,0.09,0 -upv_10,1.61,0.09,0 -pvb1_1,1.61,0.09,0 -pvb1_2,1.61,0.09,0 -pvb1_3,1.61,0.09,0 -pvb1_4,1.61,0.09,0 -pvb1_5,1.61,0.09,0 -pvb1_6,1.61,0.09,0 -pvb1_7,1.61,0.09,0 -pvb1_8,1.61,0.09,0 -pvb1_9,1.61,0.09,0 -pvb1_10,1.61,0.09,0 -pvb2_1,1.61,0.09,0 -pvb2_2,1.61,0.09,0 -pvb2_3,1.61,0.09,0 -pvb2_4,1.61,0.09,0 -pvb2_5,1.61,0.09,0 -pvb2_6,1.61,0.09,0 -pvb2_7,1.61,0.09,0 -pvb2_8,1.61,0.09,0 -pvb2_9,1.61,0.09,0 -pvb2_10,1.61,0.09,0 -pvb3_1,1.61,0.09,0 -pvb3_2,1.61,0.09,0 -pvb3_3,1.61,0.09,0 -pvb3_4,1.61,0.09,0 -pvb3_5,1.61,0.09,0 -pvb3_6,1.61,0.09,0 -pvb3_7,1.61,0.09,0 -pvb3_8,1.61,0.09,0 -pvb3_9,1.61,0.09,0 -pvb3_10,1.61,0.09,0 -wind-ofs_1,1.5,0.28,0 -wind-ofs_2,1.5,0.28,0 -wind-ofs_3,1.5,0.28,0 -wind-ofs_4,1.5,0.28,0 -wind-ofs_5,1.5,0.28,0 -wind-ofs_6,1.5,0.28,0 -wind-ofs_7,1.5,0.28,0 -wind-ofs_8,1.5,0.28,0 -wind-ofs_9,1.5,0.28,0 -wind-ofs_10,1.5,0.28,0 -wind-ons_1,2.65,0.21,0 -wind-ons_2,2.65,0.21,0 -wind-ons_3,2.65,0.21,0 -wind-ons_4,2.65,0.21,0 -wind-ons_5,2.65,0.21,0 -wind-ons_6,2.65,0.21,0 -wind-ons_7,2.65,0.21,0 -wind-ons_8,2.65,0.21,0 -wind-ons_9,2.65,0.21,0 -wind-ons_10,2.65,0.21,0 -csp1_1,1.61,0.6,0 -csp1_2,1.61,0.6,0 -csp1_3,1.61,0.6,0 -csp1_4,1.61,0.6,0 -csp1_5,1.61,0.6,0 -csp1_6,1.61,0.6,0 -csp1_7,1.61,0.6,0 -csp1_8,1.61,0.6,0 -csp1_9,1.61,0.6,0 -csp1_10,1.61,0.6,0 -csp1_11,1.61,0.6,0 -csp1_12,1.61,0.6,0 -csp2_1,1.61,0.6,0 -csp2_2,1.61,0.6,0 -csp2_3,1.61,0.6,0 -csp2_4,1.61,0.6,0 -csp2_5,1.61,0.6,0 -csp2_6,1.61,0.6,0 -csp2_7,1.61,0.6,0 -csp2_8,1.61,0.6,0 -csp2_9,1.61,0.6,0 -csp2_10,1.61,0.6,0 -csp2_11,1.61,0.6,0 -csp2_12,1.61,0.6,0 -csp3_1,1.61,0.6,0 -csp3_2,1.61,0.6,0 -csp3_3,1.61,0.6,0 -csp3_4,1.61,0.6,0 -csp3_5,1.61,0.6,0 -csp3_6,1.61,0.6,0 -csp3_7,1.61,0.6,0 -csp3_8,1.61,0.6,0 -csp3_9,1.61,0.6,0 -csp3_10,1.61,0.6,0 -csp3_11,1.61,0.6,0 -csp3_12,1.61,0.6,0 -csp4_1,1.61,0.6,0 -csp4_2,1.61,0.6,0 -csp4_3,1.61,0.6,0 -csp4_4,1.61,0.6,0 -csp4_5,1.61,0.6,0 -csp4_6,1.61,0.6,0 -csp4_7,1.61,0.6,0 -csp4_8,1.61,0.6,0 -csp4_9,1.61,0.6,0 -csp4_10,1.61,0.6,0 -csp4_11,1.61,0.6,0 -csp4_12,1.61,0.6,0 -hydD,7.36,0.14,0 -hydND,7.36,0.14,0 -hydSD,7.36,0.14,0 -hydSND,7.36,0.14,0 -hydUD,7.36,0.14,0 -hydUND,7.36,0.14,0 -hydNPD,7.36,0.14,0 -hydNPND,7.36,0.14,0 -hydED,7.36,0.14,0 -hydEND,7.36,0.14,0 -egs_allkm_1,6.8,0.4,0 -egs_allkm_2,6.8,0.4,0 -egs_allkm_3,6.8,0.4,0 -egs_allkm_4,6.8,0.4,0 -egs_allkm_5,6.8,0.4,0 -egs_allkm_6,6.8,0.4,0 -egs_allkm_7,6.8,0.4,0 -egs_allkm_8,6.8,0.4,0 -egs_allkm_9,6.8,0.4,0 -egs_allkm_10,6.8,0.4,0 -geohydro_allkm_1,6.8,0.4,0 -geohydro_allkm_2,6.8,0.4,0 -geohydro_allkm_3,6.8,0.4,0 -geohydro_allkm_4,6.8,0.4,0 -geohydro_allkm_5,6.8,0.4,0 -geohydro_allkm_6,6.8,0.4,0 -geohydro_allkm_7,6.8,0.4,0 -geohydro_allkm_8,6.8,0.4,0 -geohydro_allkm_9,6.8,0.4,0 -geohydro_allkm_10,6.8,0.4,0 -egs_nearfield_1,6.8,0.4,0 -egs_nearfield_2,6.8,0.4,0 -egs_nearfield_3,6.8,0.4,0 -egs_nearfield_4,6.8,0.4,0 -egs_nearfield_5,6.8,0.4,0 -egs_nearfield_6,6.8,0.4,0 -egs_nearfield_7,6.8,0.4,0 -egs_nearfield_8,6.8,0.4,0 -egs_nearfield_9,6.8,0.4,0 -egs_nearfield_10,6.8,0.4,0 -Gas-CT_H2-CT,1.27,0.14,0.00007 -Gas-CC_H2-CC,1.27,0.14,0.00007 -CoalOldUns_CoalOldScr,11.08,0.22,0.00001 -CoalOldUns_CofireOld,11.08,0.22,0.00001 -CoalOldScr_CofireOld,11.08,0.22,0.00001 -coal-new_CofireNew,11.08,0.22,0.00001 -Gas-CC_Gas-CC-CCS_mod,1.27,0.14,0.00007 -Coal-IGCC_coal-CCS_mod,11.08,0.22,0.00001 -coal-new_coal-CCS_mod,11.08,0.22,0.00001 -CoalOldScr_coal-CCS_mod,11.08,0.22,0.00001 -CoalOldUns_coal-CCS_mod,11.08,0.22,0.00001 -CofireNew_coal-CCS_mod,11.08,0.22,0.00001 -CofireOld_coal-CCS_mod,11.08,0.22,0.00001 -Gas-CC_Gas-CC-CCS_max,1.27,0.14,0.00007 -Coal-IGCC_coal-CCS_max,11.08,0.22,0.00001 -coal-new_coal-CCS_max,11.08,0.22,0.00001 -CoalOldScr_coal-CCS_max,11.08,0.22,0.00001 -CoalOldUns_coal-CCS_max,11.08,0.22,0.00001 -CofireNew_coal-CCS_max,11.08,0.22,0.00001 -CofireOld_coal-CCS_max,11.08,0.22,0.00001 -hydEND_hydED,7.36,0.14,0 -hydED_pumped-hydro,7.18,0.08,0 -hydED_pumped-hydro-flex,7.18,0.08,0 \ No newline at end of file diff --git a/inputs/employment/employment_factor_plant_Rutovitz.csv b/inputs/employment/employment_factor_plant_Rutovitz.csv deleted file mode 100644 index 43731f32c..000000000 --- a/inputs/employment/employment_factor_plant_Rutovitz.csv +++ /dev/null @@ -1,206 +0,0 @@ -,construction,fom,vom -battery_li,0.53,0.23,0 -biopower,14,1.5,0 -beccs_mod,14,1.5,0 -beccs_max,14,1.5,0 -coal-CCS_mod,11.08,0.22,0.00001 -coal-CCS_max,11.08,0.22,0.00001 -coal-CCS-F1,11.08,0.22,0.00001 -coal-CCS-F2,11.08,0.22,0.00001 -coal-CCS-F3,11.08,0.22,0.00001 -Coal-IGCC,11.08,0.22,0.00001 -coal-new,11.08,0.22,0.00001 -CoalOldScr,11.08,0.22,0.00001 -CoalOldUns,11.08,0.22,0.00001 -CofireNew,11.08,0.22,0.00001 -CofireOld,11.08,0.22,0.00001 -csp-ns,1.61,0.14,0 -distpv,4.19,0.13,0 -Gas-CC,1.27,0.14,0.00007 -Gas-CC-CCS_mod,1.27,0.14,0.00007 -Gas-CC-CCS_max,1.27,0.14,0.00007 -Gas-CC-CCS-F1,1.27,0.14,0.00007 -Gas-CC-CCS-F2,1.27,0.14,0.00007 -Gas-CC-CCS-F3,1.27,0.14,0.00007 -Gas-CT,1.27,0.14,0.00007 -H2-CT,1.27,0.14,0.00007 -H2-CC,1.27,0.14,0.00007 -geothermal,6.8,0.4,0 -Hydro,7.36,0.14,0 -lfill-gas,1.27,0.14,0 -Nuclear,11.8,0.6,0 -Nuclear-SMR,11.8,0.6,0 -o-g-s,1.27,0.14,0 -pumped-hydro,7.18,0.08,0 -pumped-hydro-flex,7.18,0.08,0 -upv_1,1.61,0.09,0 -upv_2,1.61,0.09,0 -upv_3,1.61,0.09,0 -upv_4,1.61,0.09,0 -upv_5,1.61,0.09,0 -upv_6,1.61,0.09,0 -upv_7,1.61,0.09,0 -upv_8,1.61,0.09,0 -upv_9,1.61,0.09,0 -upv_10,1.61,0.09,0 -pvb1_1,1.61,0.09,0 -pvb1_2,1.61,0.09,0 -pvb1_3,1.61,0.09,0 -pvb1_4,1.61,0.09,0 -pvb1_5,1.61,0.09,0 -pvb1_6,1.61,0.09,0 -pvb1_7,1.61,0.09,0 -pvb1_8,1.61,0.09,0 -pvb1_9,1.61,0.09,0 -pvb1_10,1.61,0.09,0 -pvb2_1,1.61,0.09,0 -pvb2_2,1.61,0.09,0 -pvb2_3,1.61,0.09,0 -pvb2_4,1.61,0.09,0 -pvb2_5,1.61,0.09,0 -pvb2_6,1.61,0.09,0 -pvb2_7,1.61,0.09,0 -pvb2_8,1.61,0.09,0 -pvb2_9,1.61,0.09,0 -pvb2_10,1.61,0.09,0 -pvb3_1,1.61,0.09,0 -pvb3_2,1.61,0.09,0 -pvb3_3,1.61,0.09,0 -pvb3_4,1.61,0.09,0 -pvb3_5,1.61,0.09,0 -pvb3_6,1.61,0.09,0 -pvb3_7,1.61,0.09,0 -pvb3_8,1.61,0.09,0 -pvb3_9,1.61,0.09,0 -pvb3_10,1.61,0.09,0 -wind-ofs_1,1.5,0.28,0 -wind-ofs_2,1.5,0.28,0 -wind-ofs_3,1.5,0.28,0 -wind-ofs_4,1.5,0.28,0 -wind-ofs_5,1.5,0.28,0 -wind-ofs_6,1.5,0.28,0 -wind-ofs_7,1.5,0.28,0 -wind-ofs_8,1.5,0.28,0 -wind-ofs_9,1.5,0.28,0 -wind-ofs_10,1.5,0.28,0 -wind-ons_1,2.65,0.21,0 -wind-ons_2,2.65,0.21,0 -wind-ons_3,2.65,0.21,0 -wind-ons_4,2.65,0.21,0 -wind-ons_5,2.65,0.21,0 -wind-ons_6,2.65,0.21,0 -wind-ons_7,2.65,0.21,0 -wind-ons_8,2.65,0.21,0 -wind-ons_9,2.65,0.21,0 -wind-ons_10,2.65,0.21,0 -csp1_1,1.61,0.6,0 -csp1_2,1.61,0.6,0 -csp1_3,1.61,0.6,0 -csp1_4,1.61,0.6,0 -csp1_5,1.61,0.6,0 -csp1_6,1.61,0.6,0 -csp1_7,1.61,0.6,0 -csp1_8,1.61,0.6,0 -csp1_9,1.61,0.6,0 -csp1_10,1.61,0.6,0 -csp1_11,1.61,0.6,0 -csp1_12,1.61,0.6,0 -csp2_1,1.61,0.6,0 -csp2_2,1.61,0.6,0 -csp2_3,1.61,0.6,0 -csp2_4,1.61,0.6,0 -csp2_5,1.61,0.6,0 -csp2_6,1.61,0.6,0 -csp2_7,1.61,0.6,0 -csp2_8,1.61,0.6,0 -csp2_9,1.61,0.6,0 -csp2_10,1.61,0.6,0 -csp2_11,1.61,0.6,0 -csp2_12,1.61,0.6,0 -csp3_1,1.61,0.6,0 -csp3_2,1.61,0.6,0 -csp3_3,1.61,0.6,0 -csp3_4,1.61,0.6,0 -csp3_5,1.61,0.6,0 -csp3_6,1.61,0.6,0 -csp3_7,1.61,0.6,0 -csp3_8,1.61,0.6,0 -csp3_9,1.61,0.6,0 -csp3_10,1.61,0.6,0 -csp3_11,1.61,0.6,0 -csp3_12,1.61,0.6,0 -csp4_1,1.61,0.6,0 -csp4_2,1.61,0.6,0 -csp4_3,1.61,0.6,0 -csp4_4,1.61,0.6,0 -csp4_5,1.61,0.6,0 -csp4_6,1.61,0.6,0 -csp4_7,1.61,0.6,0 -csp4_8,1.61,0.6,0 -csp4_9,1.61,0.6,0 -csp4_10,1.61,0.6,0 -csp4_11,1.61,0.6,0 -csp4_12,1.61,0.6,0 -hydD,7.36,0.14,0 -hydND,7.36,0.14,0 -hydSD,7.36,0.14,0 -hydSND,7.36,0.14,0 -hydUD,7.36,0.14,0 -hydUND,7.36,0.14,0 -hydNPD,7.36,0.14,0 -hydNPND,7.36,0.14,0 -hydED,7.36,0.14,0 -hydEND,7.36,0.14,0 -egs_allkm_1,6.8,0.4,0 -egs_allkm_2,6.8,0.4,0 -egs_allkm_3,6.8,0.4,0 -egs_allkm_4,6.8,0.4,0 -egs_allkm_5,6.8,0.4,0 -egs_allkm_6,6.8,0.4,0 -egs_allkm_7,6.8,0.4,0 -egs_allkm_8,6.8,0.4,0 -egs_allkm_9,6.8,0.4,0 -egs_allkm_10,6.8,0.4,0 -geohydro_allkm_1,6.8,0.4,0 -geohydro_allkm_2,6.8,0.4,0 -geohydro_allkm_3,6.8,0.4,0 -geohydro_allkm_4,6.8,0.4,0 -geohydro_allkm_5,6.8,0.4,0 -geohydro_allkm_6,6.8,0.4,0 -geohydro_allkm_7,6.8,0.4,0 -geohydro_allkm_8,6.8,0.4,0 -geohydro_allkm_9,6.8,0.4,0 -geohydro_allkm_10,6.8,0.4,0 -egs_nearfield_1,6.8,0.4,0 -egs_nearfield_2,6.8,0.4,0 -egs_nearfield_3,6.8,0.4,0 -egs_nearfield_4,6.8,0.4,0 -egs_nearfield_5,6.8,0.4,0 -egs_nearfield_6,6.8,0.4,0 -egs_nearfield_7,6.8,0.4,0 -egs_nearfield_8,6.8,0.4,0 -egs_nearfield_9,6.8,0.4,0 -egs_nearfield_10,6.8,0.4,0 -Gas-CT_H2-CT,1.27,0.14,0.00007 -Gas-CC_H2-CC,1.27,0.14,0.00007 -CoalOldUns_CoalOldScr,11.08,0.22,0.00001 -CoalOldUns_CofireOld,11.08,0.22,0.00001 -CoalOldScr_CofireOld,11.08,0.22,0.00001 -coal-new_CofireNew,11.08,0.22,0.00001 -Gas-CC_Gas-CC-CCS_mod,1.27,0.14,0.00007 -Coal-IGCC_coal-CCS_mod,11.08,0.22,0.00001 -coal-new_coal-CCS_mod,11.08,0.22,0.00001 -CoalOldScr_coal-CCS_mod,11.08,0.22,0.00001 -CoalOldUns_coal-CCS_mod,11.08,0.22,0.00001 -CofireNew_coal-CCS_mod,11.08,0.22,0.00001 -CofireOld_coal-CCS_mod,11.08,0.22,0.00001 -Gas-CC_Gas-CC-CCS_max,1.27,0.14,0.00007 -Coal-IGCC_coal-CCS_max,11.08,0.22,0.00001 -coal-new_coal-CCS_max,11.08,0.22,0.00001 -CoalOldScr_coal-CCS_max,11.08,0.22,0.00001 -CoalOldUns_coal-CCS_max,11.08,0.22,0.00001 -CofireNew_coal-CCS_max,11.08,0.22,0.00001 -CofireOld_coal-CCS_max,11.08,0.22,0.00001 -hydEND_hydED,7.36,0.14,0 -hydED_pumped-hydro,7.18,0.08,0 -hydED_pumped-hydro-flex,7.18,0.08,0 \ No newline at end of file From b6aae52777b47cfbedd683d2c5fbb44860317872 Mon Sep 17 00:00:00 2001 From: bsergi Date: Mon, 27 Jul 2026 16:52:57 -0400 Subject: [PATCH 37/37] revert line ending changes --- reeds/solver/cplex.op2 | 2 +- reeds/solver/cplex.opt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reeds/solver/cplex.op2 b/reeds/solver/cplex.op2 index 48862a654..e01f19dd1 100644 --- a/reeds/solver/cplex.op2 +++ b/reeds/solver/cplex.op2 @@ -68,4 +68,4 @@ barcolnz 100 * bardisplay 2 *** solutiontype (integer): type of solution (basic or non basic): 0 does basic with crossover, 2 skips crossover -* solutiontype 2 \ No newline at end of file +* solutiontype 2 diff --git a/reeds/solver/cplex.opt b/reeds/solver/cplex.opt index 0cc4443fe..0a6c3ea68 100644 --- a/reeds/solver/cplex.opt +++ b/reeds/solver/cplex.opt @@ -68,4 +68,4 @@ barcolnz 30 * bardisplay 2 *** solutiontype (integer): type of solution (basic or non basic): 0 does basic with crossover, 2 skips crossover -* solutiontype 2 \ No newline at end of file +* solutiontype 2