From 2a1616e705668f005db872baf9905edbc57f9c45 Mon Sep 17 00:00:00 2001 From: ql0320 Date: Fri, 1 Dec 2023 10:17:08 -0500 Subject: [PATCH] Assign variables at the beginning functions --- src/load_inputs/load_generators_data.jl | 3 +- src/model/core/co2.jl | 18 +++-- src/model/core/fuel.jl | 84 ++++++++++++--------- src/write_outputs/write_fuel_consumption.jl | 15 ++-- 4 files changed, 68 insertions(+), 52 deletions(-) diff --git a/src/load_inputs/load_generators_data.jl b/src/load_inputs/load_generators_data.jl index 2b9548d828..e7ce15079f 100644 --- a/src/load_inputs/load_generators_data.jl +++ b/src/load_inputs/load_generators_data.jl @@ -8,6 +8,7 @@ function load_generators_data!(setup::Dict, path::AbstractString, inputs_gen::Di filename = "Generators_data.csv" gen_in = load_dataframe(joinpath(path, filename)) + # Store DataFrame of generators/resources input data for use in model inputs_gen["dfGen"] = gen_in @@ -23,7 +24,6 @@ function load_generators_data!(setup::Dict, path::AbstractString, inputs_gen::Di # Add Resource IDs after reading to prevent user errors gen_in[!,:R_ID] = 1:G - scale_factor = setup["ParameterScale"] == 1 ? ModelScalingFactor : 1 ## Defining sets of generation and storage resources @@ -418,6 +418,7 @@ end Function for reading input parameters related to co-located VRE-storage resources """ function load_vre_stor_data!(inputs_gen::Dict, setup::Dict, path::AbstractString) + error_strings = String[] dfGen = inputs_gen["dfGen"] inputs_gen["VRE_STOR"] = "VRE_STOR" in names(dfGen) ? dfGen[dfGen.VRE_STOR.==1,:R_ID] : Int[] diff --git a/src/model/core/co2.jl b/src/model/core/co2.jl index e85292ef8b..421cc3d1e6 100644 --- a/src/model/core/co2.jl +++ b/src/model/core/co2.jl @@ -60,8 +60,10 @@ function co2!(EP::Model, inputs::Dict) Z = inputs["Z"] # Number of zones MULTI_FUELS = inputs["MULTI_FUELS"] SINGLE_FUEL = inputs["SINGLE_FUEL"] - fuel_CO2 = inputs["fuel_CO2"] # CO2 content of fuel (t CO2/MMBTU or ktCO2/Billion BTU) + fuel_cols = inputs["FUEL_COLS"] + max_fuels = inputs["MAX_NUM_FUELS"] + omega = inputs["omega"] ### Expressions ### # CO2 emissions from power plants in "Generators_data.csv" # If all the CO2 capture fractions from Generators_data are zeros, the CO2 emissions from thermal generators are determined by fuel consumption times CO2 content per MMBTU @@ -71,7 +73,7 @@ function co2!(EP::Model, inputs::Dict) if y in SINGLE_FUEL ((1-dfGen[y, :Biomass]) *(EP[:vFuel][y, t] + EP[:vStartFuel][y, t]) * fuel_CO2[dfGen[y,:Fuel]]) else - sum(((1-dfGen[y, :Biomass]) *(EP[:vMulFuels][y, i, t] + EP[:vMulStartFuels][y, i, t]) * fuel_CO2[dfGen[y,inputs["FUEL_COLS"][i]]]) for i = 1:inputs["MAX_NUM_FUELS"]) + sum(((1-dfGen[y, :Biomass]) *(EP[:vMulFuels][y, i, t] + EP[:vMulStartFuels][y, i, t]) * fuel_CO2[dfGen[y,fuel_cols[i]]]) for i = 1:max_fuels) end) else @info "Using the CO2 module to determine the CO2 emissions of CCS-equipped plants" @@ -84,8 +86,8 @@ function co2!(EP::Model, inputs::Dict) (1-dfGen[y, :Biomass] - dfGen[y, :CO2_Capture_Fraction]) * EP[:vFuel][y, t] * fuel_CO2[dfGen[y,:Fuel]]+ (1-dfGen[y, :Biomass] - dfGen[y, :CO2_Capture_Fraction_Startup]) * EP[:vStartFuel][y, t] * fuel_CO2[dfGen[y,:Fuel]] else - sum((1-dfGen[y, :Biomass] - dfGen[y, :CO2_Capture_Fraction]) * EP[:vMulFuels][y, i, t] * fuel_CO2[dfGen[y, inputs["FUEL_COLS"][i]]] for i = 1:inputs["MAX_NUM_FUELS"])+ - sum((1-dfGen[y, :Biomass] - dfGen[y, :CO2_Capture_Fraction_Startup]) * EP[:vMulStartFuels][y, i, t] * fuel_CO2[dfGen[y, inputs["FUEL_COLS"][i]]] for i = 1:inputs["MAX_NUM_FUELS"]) + sum((1-dfGen[y, :Biomass] - dfGen[y, :CO2_Capture_Fraction]) * EP[:vMulFuels][y, i, t] * fuel_CO2[dfGen[y, fuel_cols[i]]] for i = 1:max_fuels)+ + sum((1-dfGen[y, :Biomass] - dfGen[y, :CO2_Capture_Fraction_Startup]) * EP[:vMulStartFuels][y, i, t] * fuel_CO2[dfGen[y, fuel_cols[i]]] for i = 1:max_fuels) end) # CO2 captured from power plants in "Generators_data.csv" @@ -94,17 +96,17 @@ function co2!(EP::Model, inputs::Dict) dfGen[y, :CO2_Capture_Fraction] * EP[:vFuel][y, t] * fuel_CO2[dfGen[y,:Fuel]]+ dfGen[y, :CO2_Capture_Fraction_Startup] * EP[:eStartFuel][y, t] * fuel_CO2[dfGen[y,:Fuel]] else - sum(dfGen[y, :CO2_Capture_Fraction] * EP[:vMulFuels][y, i, t] * fuel_CO2[dfGen[y, inputs["FUEL_COLS"][i]]] for i = 1:inputs["MAX_NUM_FUELS"])+ - sum(dfGen[y, :CO2_Capture_Fraction_Startup] * EP[:vMulStartFuels][y, i, t] * fuel_CO2[dfGen[y, inputs["FUEL_COLS"][i]]] for i = 1:inputs["MAX_NUM_FUELS"]) + sum(dfGen[y, :CO2_Capture_Fraction] * EP[:vMulFuels][y, i, t] * fuel_CO2[dfGen[y, fuel_cols[i]]] for i = 1:max_fuels)+ + sum(dfGen[y, :CO2_Capture_Fraction_Startup] * EP[:vMulStartFuels][y, i, t] * fuel_CO2[dfGen[y, fuel_cols[i]]] for i = 1:max_fuels) end) @expression(EP, eEmissionsCaptureByPlantYear[y=1:G], - sum(inputs["omega"][t] * eEmissionsCaptureByPlant[y, t] + sum(omega[t] * eEmissionsCaptureByPlant[y, t] for t in 1:T)) # add CO2 sequestration cost to objective function # when scale factor is on tCO2/MWh = > kt CO2/GWh @expression(EP, ePlantCCO2Sequestration[y=1:G], - sum(inputs["omega"][t] * eEmissionsCaptureByPlant[y, t] * + sum(omega[t] * eEmissionsCaptureByPlant[y, t] * dfGen[y, :CCS_Disposal_Cost_per_Metric_Ton] for t in 1:T)) @expression(EP, eZonalCCO2Sequestration[z=1:Z], diff --git a/src/model/core/fuel.jl b/src/model/core/fuel.jl index b715be79eb..53ef83606c 100644 --- a/src/model/core/fuel.jl +++ b/src/model/core/fuel.jl @@ -89,7 +89,17 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) HAS_FUEL = inputs["HAS_FUEL"] MULTI_FUELS = inputs["MULTI_FUELS"] SINGLE_FUEL = inputs["SINGLE_FUEL"] + max_fuels = inputs["MAX_NUM_FUELS"] + fuel_cols = inputs["FUEL_COLS"] fuels = inputs["fuels"] + fuel_costs = inputs["fuel_costs"] + heat_rates = inputs["HEAT_RATES"] + min_cofire = inputs["MIN_COFIRE"] + max_cofire = inputs["MAX_COFIRE"] + min_cofire_start =inputs["MIN_COFIRE_START"] + max_cofire_start =inputs["MAX_COFIRE_START"] + omega = inputs["omega"] + NUM_FUEL = length(fuels) # create variable for fuel consumption for output @@ -100,8 +110,8 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) # for resources that use multi fuels # vMulFuels[y, f, t]: y - resource ID; f - fuel ID; t: time if !isempty(MULTI_FUELS) - @variable(EP, vMulFuels[y in MULTI_FUELS, i = 1:inputs["MAX_NUM_FUELS"], t = 1:T] >= 0) - @variable(EP, vMulStartFuels[y in MULTI_FUELS, i = 1:inputs["MAX_NUM_FUELS"], t = 1:T] >= 0) + @variable(EP, vMulFuels[y in MULTI_FUELS, i = 1:max_fuels, t = 1:T] >= 0) + @variable(EP, vMulStartFuels[y in MULTI_FUELS, i = 1:max_fuels, t = 1:T] >= 0) end @@ -121,23 +131,23 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) if y in SINGLE_FUEL # for single fuel plants EP[:vFuel][y, t] else # for multi fuel plants - sum(EP[:vMulFuels][y, i, t] for i in 1:inputs["MAX_NUM_FUELS"]) + sum(EP[:vMulFuels][y, i, t] for i in 1:max_fuels) end) @expression(EP, ePlantFuel_start[y in 1:G, t = 1:T], if y in SINGLE_FUEL # for single fuel plants EP[:vStartFuel][y, t] else # for multi fuel plants - sum(EP[:vMulStartFuels][y, i, t] for i in 1:inputs["MAX_NUM_FUELS"]) + sum(EP[:vMulStartFuels][y, i, t] for i in 1:max_fuels) end) # for multi-fuel resources # annual fuel consumption by plant and fuel type if !isempty(MULTI_FUELS) - @expression(EP, ePlantFuelConsumptionYear_multi_generation[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"]], - sum(inputs["omega"][t] * EP[:vMulFuels][y, i, t] for t in 1:T)) - @expression(EP, ePlantFuelConsumptionYear_multi_start[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"]], - sum(inputs["omega"][t] * EP[:vMulStartFuels][y, i, t] for t in 1:T)) - @expression(EP, ePlantFuelConsumptionYear_multi[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"]], + @expression(EP, ePlantFuelConsumptionYear_multi_generation[y in MULTI_FUELS, i in 1:max_fuels], + sum(omega[t] * EP[:vMulFuels][y, i, t] for t in 1:T)) + @expression(EP, ePlantFuelConsumptionYear_multi_start[y in MULTI_FUELS, i in 1:max_fuels], + sum(omega[t] * EP[:vMulStartFuels][y, i, t] for t in 1:T)) + @expression(EP, ePlantFuelConsumptionYear_multi[y in MULTI_FUELS, i in 1:max_fuels], EP[:ePlantFuelConsumptionYear_multi_generation][y, i] + EP[:ePlantFuelConsumptionYear_multi_start][y, i]) end # fuel_cost is in $/MMBTU (M$/billion BTU if scaled) @@ -148,25 +158,25 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) # for multi-fuel resources if !isempty(MULTI_FUELS) # time-series fuel consumption costs by plant and fuel type during startup - @expression(EP, eCFuelOut_multi_start[y in MULTI_FUELS , i in 1:inputs["MAX_NUM_FUELS"], t = 1:T], - inputs["fuel_costs"][dfGen[y,inputs["FUEL_COLS"][i]]][t] * EP[:vMulStartFuels][y, i, t] + @expression(EP, eCFuelOut_multi_start[y in MULTI_FUELS , i in 1:max_fuels, t = 1:T], + fuel_costs[dfGen[y,fuel_cols[i]]][t] * EP[:vMulStartFuels][y, i, t] ) # annual plant level fuel cost by fuel type during generation - @expression(EP, ePlantCFuelOut_multi_start[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"]], - sum(inputs["omega"][t] * EP[:eCFuelOut_multi_start][y, i, t] for t in 1:T)) + @expression(EP, ePlantCFuelOut_multi_start[y in MULTI_FUELS, i in 1:max_fuels], + sum(omega[t] * EP[:eCFuelOut_multi_start][y, i, t] for t in 1:T)) end @expression(EP, eCFuelStart[y = 1:G, t = 1:T], if y in SINGLE_FUEL - (inputs["fuel_costs"][dfGen[y,:Fuel]][t] * EP[:vStartFuel][y, t]) + (fuel_costs[dfGen[y,:Fuel]][t] * EP[:vStartFuel][y, t]) else - sum(EP[:eCFuelOut_multi_start][y, i, t] for i in 1:inputs["MAX_NUM_FUELS"]) + sum(EP[:eCFuelOut_multi_start][y, i, t] for i in 1:max_fuels) end) # plant level start-up fuel cost for output @expression(EP, ePlantCFuelStart[y = 1:G], - sum(inputs["omega"][t] * EP[:eCFuelStart][y, t] for t in 1:T)) + sum(omega[t] * EP[:eCFuelStart][y, t] for t in 1:T)) # zonal level total fuel cost for output @expression(EP, eZonalCFuelStart[z = 1:Z], sum(EP[:ePlantCFuelStart][y] for y in dfGen[dfGen[!, :Zone].==z, :R_ID])) @@ -175,24 +185,24 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) # for multi-fuel resources if !isempty(MULTI_FUELS) # time-series fuel consumption costs by plant and fuel type during generation - @expression(EP, eCFuelOut_multi[y in MULTI_FUELS , i in 1:inputs["MAX_NUM_FUELS"], t = 1:T], - inputs["fuel_costs"][dfGen[y,inputs["FUEL_COLS"][i]]][t] * EP[:vMulFuels][y,i,t] + @expression(EP, eCFuelOut_multi[y in MULTI_FUELS , i in 1:max_fuels, t = 1:T], + fuel_costs[dfGen[y,fuel_cols[i]]][t] * EP[:vMulFuels][y,i,t] ) # annual plant level fuel cost by fuel type during generation - @expression(EP, ePlantCFuelOut_multi[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"]], - sum(inputs["omega"][t] * EP[:eCFuelOut_multi][y, i, t] for t in 1:T)) + @expression(EP, ePlantCFuelOut_multi[y in MULTI_FUELS, i in 1:max_fuels], + sum(omega[t] * EP[:eCFuelOut_multi][y, i, t] for t in 1:T)) end @expression(EP, eCFuelOut[y = 1:G, t = 1:T], if y in SINGLE_FUEL - (inputs["fuel_costs"][dfGen[y,:Fuel]][t] * EP[:vFuel][y, t]) + (fuel_costs[dfGen[y,:Fuel]][t] * EP[:vFuel][y, t]) else - sum(EP[:eCFuelOut_multi][y, i, t] for i in 1:inputs["MAX_NUM_FUELS"]) + sum(EP[:eCFuelOut_multi][y, i, t] for i in 1:max_fuels) end) # plant level start-up fuel cost for output @expression(EP, ePlantCFuelOut[y = 1:G], - sum(inputs["omega"][t] * EP[:eCFuelOut][y, t] for t in 1:T)) + sum(omega[t] * EP[:eCFuelOut][y, t] for t in 1:T)) # zonal level total fuel cost for output @expression(EP, eZonalCFuelOut[z = 1:Z], sum(EP[:ePlantCFuelOut][y] for y in dfGen[dfGen[!, :Zone].==z, :R_ID])) @@ -210,8 +220,8 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) if !isempty(MULTI_FUELS) @expression(EP, eFuelConsumption_multi[f in 1:NUM_FUEL, t in 1:T], sum((EP[:vMulFuels][y, i, t] + EP[:vMulStartFuels][y, i, t]) #i: fuel id - for i in 1:inputs["MAX_NUM_FUELS"], - y in intersect(dfGen[dfGen[!,inputs["FUEL_COLS"][i]] .== string(inputs["fuels"][f]) ,:R_ID], MULTI_FUELS)) + for i in 1:max_fuels, + y in intersect(dfGen[dfGen[!,fuel_cols[i]] .== string(fuels[f]) ,:R_ID], MULTI_FUELS)) ) end @@ -227,7 +237,7 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) end) @expression(EP, eFuelConsumptionYear[f in 1:NUM_FUEL], - sum(inputs["omega"][t] * EP[:eFuelConsumption][f, t] for t in 1:T)) + sum(omega[t] * EP[:eFuelConsumption][f, t] for t in 1:T)) ### Constraint ### @@ -238,7 +248,7 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) if !isempty(MULTI_FUELS) @constraint(EP, cFuelCalculation_multi[y in intersect(MULTI_FUELS, setdiff(HAS_FUEL, THERM_COMMIT)), t = 1:T], - sum(EP[:vMulFuels][y, i, t]/inputs["HEAT_RATES"][i][y] for i in 1:inputs["MAX_NUM_FUELS"]) - EP[:vP][y, t] == 0 + sum(EP[:vMulFuels][y, i, t]/heat_rates[i][y] for i in 1:max_fuels) - EP[:vP][y, t] == 0 ) end @@ -269,7 +279,7 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) EP[:vFuel][y, t] - EP[:vP][y, t] * dfGen[y, :Heat_Rate_MMBTU_per_MWh] == 0) if !isempty(MULTI_FUELS) @constraint(EP, FuelCalculationCommit_multi[y in intersect(setdiff(THERM_COMMIT,THERM_COMMIT_PWFU), MULTI_FUELS), t = 1:T], - sum(EP[:vMulFuels][y, i, t]/inputs["HEAT_RATES"][i][y] for i in 1:inputs["MAX_NUM_FUELS"]) - EP[:vP][y, t] .== 0 + sum(EP[:vMulFuels][y, i, t]/heat_rates[i][y] for i in 1:max_fuels) - EP[:vP][y, t] .== 0 ) end end @@ -280,7 +290,7 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) ) if !isempty(MULTI_FUELS) @constraint(EP, cStartFuel_multi[y in intersect(THERM_COMMIT, MULTI_FUELS), t = 1:T], - sum(EP[:vMulStartFuels][y, i, t] for i in 1:inputs["MAX_NUM_FUELS"]) - (dfGen[y,:Cap_Size] * EP[:vSTART][y, t] * dfGen[y,:Start_Fuel_MMBTU_per_MW]) .== 0 + sum(EP[:vMulStartFuels][y, i, t] for i in 1:max_fuels) - (dfGen[y,:Cap_Size] * EP[:vSTART][y, t] * dfGen[y,:Start_Fuel_MMBTU_per_MW]) .== 0 ) end @@ -290,18 +300,18 @@ function fuel!(EP::Model, inputs::Dict, setup::Dict) # fuel2/heat rate <= max_cofire_level * total power without retrofit if !isempty(MULTI_FUELS) # during power generation - @constraint(EP, cMinCofire[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"], t = 1:T], - EP[:vMulFuels][y, i, t] >= inputs["MIN_COFIRE"][i][y] * EP[:ePlantFuel_generation][y,t] + @constraint(EP, cMinCofire[y in MULTI_FUELS, i in 1:max_fuels, t = 1:T], + EP[:vMulFuels][y, i, t] >= min_cofire[i][y] * EP[:ePlantFuel_generation][y,t] ) - @constraint(EP, cMaxCofire[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"], t = 1:T], - EP[:vMulFuels][y, i, t] <= inputs["MAX_COFIRE"][i][y] * EP[:ePlantFuel_generation][y,t] + @constraint(EP, cMaxCofire[y in MULTI_FUELS, i in 1:max_fuels, t = 1:T], + EP[:vMulFuels][y, i, t] <= max_cofire[i][y] * EP[:ePlantFuel_generation][y,t] ) # startup - @constraint(EP, cMinCofireStart[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"], t = 1:T], - EP[:vMulStartFuels][y, i, t] >= inputs["MIN_COFIRE_START"][i][y] * EP[:ePlantFuel_start][y,t] + @constraint(EP, cMinCofireStart[y in MULTI_FUELS, i in 1:max_fuels, t = 1:T], + EP[:vMulStartFuels][y, i, t] >= min_cofire_start[i][y] * EP[:ePlantFuel_start][y,t] ) - @constraint(EP, cMaxCofireStart[y in MULTI_FUELS, i in 1:inputs["MAX_NUM_FUELS"], t = 1:T], - EP[:vMulStartFuels][y, i, t] <= inputs["MAX_COFIRE_START"][i][y] * EP[:ePlantFuel_start][y,t] + @constraint(EP, cMaxCofireStart[y in MULTI_FUELS, i in 1:max_fuels, t = 1:T], + EP[:vMulStartFuels][y, i, t] <= max_cofire_start[i][y] * EP[:ePlantFuel_start][y,t] ) end diff --git a/src/write_outputs/write_fuel_consumption.jl b/src/write_outputs/write_fuel_consumption.jl index ea5909ab6b..3660b26ba8 100644 --- a/src/write_outputs/write_fuel_consumption.jl +++ b/src/write_outputs/write_fuel_consumption.jl @@ -15,6 +15,9 @@ function write_fuel_consumption_plant(path::AbstractString,inputs::Dict, setup:: G = inputs["G"] HAS_FUEL = inputs["HAS_FUEL"] MULTI_FUELS = inputs["MULTI_FUELS"] + fuel_cols = inputs["FUEL_COLS"] + max_fuels = inputs["MAX_NUM_FUELS"] + # Fuel consumption cost by each resource, including start up fuel dfPlantFuel = DataFrame(Resource = inputs["RESOURCES"][HAS_FUEL], Fuel = dfGen[HAS_FUEL, :Fuel], @@ -24,7 +27,7 @@ function write_fuel_consumption_plant(path::AbstractString,inputs::Dict, setup:: if !isempty(MULTI_FUELS) dfPlantFuel.Multi_Fuels = dfGen[HAS_FUEL, :MULTI_FUELS] - for i = 1:inputs["MAX_NUM_FUELS"] + for i = 1:max_fuels tempannualsum_fuel_heat_multi_generation = zeros(length(HAS_FUEL)) tempannualsum_fuel_heat_multi_start = zeros(length(HAS_FUEL)) tempannualsum_fuel_heat_multi_total = zeros(length(HAS_FUEL)) @@ -42,11 +45,11 @@ function write_fuel_consumption_plant(path::AbstractString,inputs::Dict, setup:: tempannualsum_fuel_cost_multi *= ModelScalingFactor^2 end - dfPlantFuel[!, inputs["FUEL_COLS"][i]] = dfGen[HAS_FUEL, inputs["FUEL_COLS"][i]] - dfPlantFuel[!, Symbol(string(inputs["FUEL_COLS"][i],"_AnnualSum_Fuel_HeatInput_Generation"))] = tempannualsum_fuel_heat_multi_generation - dfPlantFuel[!, Symbol(string(inputs["FUEL_COLS"][i],"_AnnualSum_Fuel_HeatInput_Start"))] = tempannualsum_fuel_heat_multi_start - dfPlantFuel[!, Symbol(string(inputs["FUEL_COLS"][i],"_AnnualSum_Fuel_HeatInput_Total"))] = tempannualsum_fuel_heat_multi_total - dfPlantFuel[!, Symbol(string(inputs["FUEL_COLS"][i],"_AnnualSum_Fuel_Cost"))] = tempannualsum_fuel_cost_multi + dfPlantFuel[!, fuel_cols[i]] = dfGen[HAS_FUEL, fuel_cols[i]] + dfPlantFuel[!, Symbol(string(fuel_cols[i],"_AnnualSum_Fuel_HeatInput_Generation"))] = tempannualsum_fuel_heat_multi_generation + dfPlantFuel[!, Symbol(string(fuel_cols[i],"_AnnualSum_Fuel_HeatInput_Start"))] = tempannualsum_fuel_heat_multi_start + dfPlantFuel[!, Symbol(string(fuel_cols[i],"_AnnualSum_Fuel_HeatInput_Total"))] = tempannualsum_fuel_heat_multi_total + dfPlantFuel[!, Symbol(string(fuel_cols[i],"_AnnualSum_Fuel_Cost"))] = tempannualsum_fuel_cost_multi end end