From e5601b695d7fbdb77bbbf7de1795beebfa644d0f Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 28 Aug 2023 15:40:45 -0600 Subject: [PATCH 1/3] Small updates to get things working with Green Steel --- .../LCA_single_scenario_ProFAST.py | 4 +- hopp/to_organize/H2_Analysis/hopp_for_h2.py | 9 ++- .../distributed_pipe_cost_analysis.py | 2 +- hopp/to_organize/hopp_tools_steel.py | 71 ++++++++++++------- 4 files changed, 57 insertions(+), 29 deletions(-) diff --git a/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py b/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py index f7175b363..37d4819c8 100644 --- a/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py +++ b/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py @@ -19,7 +19,7 @@ def hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_name,policy_option,hydrogen_production_while_running,H2_Results,electrolyzer_energy_kWh_per_kg,solar_size_mw,storage_size_mw,hopp_dict): - dircambium = os.path.join(hopp_dict.main_dict["Configuration"]["parent_path"], "H2_Analysis", "Cambium_data", "StdScen21_MidCase95by2035_hourly_") + dircambium = os.path.join(hopp_dict.main_dict["Configuration"]["parent_path"], "H2_Analysis", "Cambium_data", "Cambium22_MidCase100by2035_hourly_") #============================================================================== # DATA @@ -68,7 +68,7 @@ def hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_n energy_from_renewables_df = pd.DataFrame(hopp_dict.main_dict["Models"]["grid"]["ouput_dict"]['energy_from_renewables'],columns=['Energy from renewables (kWh)']) # Read in Cambium data cambiumdata_filepath = dircambium + site_name + '_'+str(cambium_year) + '.csv' - cambium_data = pd.read_csv(cambiumdata_filepath,index_col = None,header = 4,usecols = ['lrmer_co2_c','lrmer_ch4_c','lrmer_n2o_c','lrmer_co2_p','lrmer_ch4_p','lrmer_n2o_p','lrmer_co2e_c','lrmer_co2e_p','lrmer_co2e']) + cambium_data = pd.read_csv(cambiumdata_filepath,index_col = None,header = 5,usecols = ['lrmer_co2_c','lrmer_ch4_c','lrmer_n2o_c','lrmer_co2_p','lrmer_ch4_p','lrmer_n2o_p','lrmer_co2e_c','lrmer_co2e_p','lrmer_co2e']) cambium_data = cambium_data.reset_index().rename(columns = {'index':'Interval','lrmer_co2_c':'LRMER CO2 combustion (kg-CO2/MWh)','lrmer_ch4_c':'LRMER CH4 combustion (g-CH4/MWh)','lrmer_n2o_c':'LRMER N2O combustion (g-N2O/MWh)',\ 'lrmer_co2_p':'LRMER CO2 production (kg-CO2/MWh)','lrmer_ch4_p':'LRMER CH4 production (g-CH4/MWh)','lrmer_n2o_p':'LRMER N2O production (g-N2O/MWh)','lrmer_co2e_c':'LRMER CO2 equiv. combustion (kg-CO2e/MWh)',\ diff --git a/hopp/to_organize/H2_Analysis/hopp_for_h2.py b/hopp/to_organize/H2_Analysis/hopp_for_h2.py index 78f399015..ec39e3842 100644 --- a/hopp/to_organize/H2_Analysis/hopp_for_h2.py +++ b/hopp/to_organize/H2_Analysis/hopp_for_h2.py @@ -169,7 +169,14 @@ def hopp_for_h2(site, scenario, technologies, wind_size_mw, solar_size_mw, stora #wind_plant_size_check = hybrid_plant.wind.system_capacity_kw # Save the outputs annual_energies = hybrid_plant.annual_energies - wind_plus_solar_npv = hybrid_plant.net_present_values.wind + hybrid_plant.net_present_values.pv + if 'wind' in technologies and 'solar' in technologies: + wind_plus_solar_npv = hybrid_plant.net_present_values.wind + hybrid_plant.net_present_values.pv + elif 'wind' not in technologies and 'solar' in technologies: + wind_plus_solar_npv = hybrid_plant.net_present_values.pv + elif 'solar' not in technologies and 'wind' in technologies: + wind_plus_solar_npv = hybrid_plant.net_present_values.wind + else: + wind_plus_solar_npv = 0 npvs = hybrid_plant.net_present_values lcoe = hybrid_plant.lcoe_real.hybrid lcoe_nom = hybrid_plant.lcoe_nom.hybrid diff --git a/hopp/to_organize/distributed_pipe_cost_analysis.py b/hopp/to_organize/distributed_pipe_cost_analysis.py index 20fb0d095..17d67a879 100644 --- a/hopp/to_organize/distributed_pipe_cost_analysis.py +++ b/hopp/to_organize/distributed_pipe_cost_analysis.py @@ -116,7 +116,7 @@ def hydrogen_steel_pipeline_cost_analysis(parent_path,turbine_model,hydrogen_max pipe_row_cost_USD.append(cpi_ratio*72634*(pipe_diam_in**1.07566)/(pipeline_length_miles**0.05284)*pipe_diam_in*pipeline_length_miles) - elif site_name == 'IA' or site_name == 'WY': + elif site_name == 'IA' or site_name == 'WY' or site_name == 'MN': pipe_material_cost_USD.append(cpi_ratio*5813*(pipe_diam_in**0.31599)/(pipeline_length_miles**0.00376)*pipe_diam_in*pipeline_length_miles) pipe_labor_cost_USD.append(cpi_ratio*10406*(pipe_diam_in**0.20953)/(pipeline_length_miles**0.08419)*pipe_diam_in*pipeline_length_miles) diff --git a/hopp/to_organize/hopp_tools_steel.py b/hopp/to_organize/hopp_tools_steel.py index 6f15cf0d2..96b0116c5 100644 --- a/hopp/to_organize/hopp_tools_steel.py +++ b/hopp/to_organize/hopp_tools_steel.py @@ -162,12 +162,9 @@ def set_electrolyzer_info(hopp_dict, atb_year, electrolysis_scale,electrolyzer_c electrolyzer_energy_kWh_per_kg = 54.61 # Centralized costs and scales for 2020 - if electrolyzer_cost_case == 'Low' or electrolyzer_cost_case == 'low': - component_costs_centralized = {'Stack':807.3,'Power Electronics':129.5,'BOP':82.8,'H2 Conditioning':94.8} - else: - component_costs_centralized = {'Stack':807.3,'Power Electronics':129.5,'BOP':82.8,'H2 Conditioning':94.8} - component_scales_centralized = {'Stack':10000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} - component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + component_costs_centralized = {'Stack':450,'Power Electronics':200,'BOP':250,'H2 Conditioning':100} + component_scales_centralized = {'Stack':1000,'Power Electronics':1000,'BOP':1000,'H2 Conditioning':1000} + component_scales_distributed = {'Stack':1000,'Power Electronics':1000,'BOP':1000,'H2 Conditioning':1000} # Stack durability for 2020 if electrolyzer_replacement_scenario == 'Standard': @@ -181,11 +178,17 @@ def set_electrolyzer_info(hopp_dict, atb_year, electrolysis_scale,electrolyzer_c # Centralized costs and scales for 2025 if electrolyzer_cost_case == 'Low' or electrolyzer_cost_case == 'low': - component_costs_centralized = {'Stack':227.9,'Power Electronics':89.7,'BOP':55.5,'H2 Conditioning':77.0} - else: - component_costs_centralized = {'Stack':524.6,'Power Electronics':127.5,'BOP':81.4,'H2 Conditioning':94.0} - component_scales_centralized = {'Stack':10000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} - component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + component_costs_centralized = {'Stack':200.1,'Power Electronics':94.8,'BOP':111.6,'H2 Conditioning':31.0} + component_scales_centralized = {'Stack':2000,'Power Electronics':18000,'BOP':18000,'H2 Conditioning':18000} + component_scales_distributed = {'Stack':2000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + elif electrolyzer_cost_case == 'Mid' or electrolyzer_cost_case == 'mid': + component_costs_centralized = {'Stack':274.9,'Power Electronics':113.8,'BOP':136.0,'H2 Conditioning':41.2} + component_scales_centralized = {'Stack':2000,'Power Electronics':9000,'BOP':9000,'H2 Conditioning':9000} + component_scales_distributed = {'Stack':2000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + elif electrolyzer_cost_case == 'High' or electrolyzer_cost_case == 'high': + component_costs_centralized = {'Stack':336.1,'Power Electronics':167.0,'BOP':205.8,'H2 Conditioning':75.5} + component_scales_centralized = {'Stack':1000,'Power Electronics':2000,'BOP':2000,'H2 Conditioning':2000} + component_scales_distributed = {'Stack':1000,'Power Electronics':2000,'BOP':2000,'H2 Conditioning':2000} # Stack durability for 2025 if electrolyzer_replacement_scenario == 'Standard': @@ -197,13 +200,19 @@ def set_electrolyzer_info(hopp_dict, atb_year, electrolysis_scale,electrolyzer_c electrolyzer_energy_kWh_per_kg = 54.61 - # Centralized costs and scales for 2030 + # Centralized costs and scales for 2025 if electrolyzer_cost_case == 'Low' or electrolyzer_cost_case == 'low': - component_costs_centralized = {'Stack':90.0,'Power Electronics':39.3,'BOP':22.6,'H2 Conditioning':48.1} - else: - component_costs_centralized = {'Stack':182.8,'Power Electronics':74.5,'BOP':45.4,'H2 Conditioning':69.3} - component_scales_centralized = {'Stack':10000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} - component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + component_costs_centralized = {'Stack':47.9,'Power Electronics':49.5,'BOP':55.1,'H2 Conditioning':17.5} + component_scales_centralized = {'Stack':10000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} + component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + elif electrolyzer_cost_case == 'Mid' or electrolyzer_cost_case == 'mid': + component_costs_centralized = {'Stack':168.6,'Power Electronics':69.7,'BOP':80.0,'H2 Conditioning':21.2} + component_scales_centralized = {'Stack':2000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} + component_scales_distributed = {'Stack':2000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + elif electrolyzer_cost_case == 'High' or electrolyzer_cost_case == 'high': + component_costs_centralized = {'Stack':225.4,'Power Electronics':90.9,'BOP':106.7,'H2 Conditioning':29.5} + component_scales_centralized = {'Stack':2000,'Power Electronics':20000,'BOP':20000,'H2 Conditioning':20000} + component_scales_distributed = {'Stack':2000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} # Stack durability for 2030 if electrolyzer_replacement_scenario == 'Standard': @@ -215,13 +224,19 @@ def set_electrolyzer_info(hopp_dict, atb_year, electrolysis_scale,electrolyzer_c electrolyzer_energy_kWh_per_kg = 54.61 - # Centralized costs and scales for 2035 + # Centralized costs and scales for 2025 if electrolyzer_cost_case == 'Low' or electrolyzer_cost_case == 'low': - component_costs_centralized = {'Stack':64.5,'Power Electronics':28.9,'BOP':16.2,'H2 Conditioning':40.5} - else: - component_costs_centralized = {'Stack':147.7,'Power Electronics':61.6,'BOP':36.9,'H2 Conditioning':62.2} - component_scales_centralized = {'Stack':10000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} - component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + component_costs_centralized = {'Stack':40.1,'Power Electronics':44.5,'BOP':49.0,'H2 Conditioning':16.4} + component_scales_centralized = {'Stack':10000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} + component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + elif electrolyzer_cost_case == 'Mid' or electrolyzer_cost_case == 'mid': + component_costs_centralized = {'Stack':122.1,'Power Electronics':64.3,'BOP':73.2,'H2 Conditioning':20.3} + component_scales_centralized = {'Stack':10000,'Power Electronics':40000,'BOP':40000,'H2 Conditioning':40000} + component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} + elif electrolyzer_cost_case == 'High' or electrolyzer_cost_case == 'high': + component_costs_centralized = {'Stack':177.3,'Power Electronics':87.9,'BOP':102.8,'H2 Conditioning':28.9} + component_scales_centralized = {'Stack':5000,'Power Electronics':20000,'BOP':20000,'H2 Conditioning':20000} + component_scales_distributed = {'Stack':turbine_rating*1000,'Power Electronics':turbine_rating*1000,'BOP':turbine_rating*1000,'H2 Conditioning':turbine_rating*1000} # Stack durability for 2035 if electrolyzer_replacement_scenario == 'Standard': @@ -1566,9 +1581,12 @@ def write_outputs_ProFAST(electrical_generation_timeseries, scenario_choice, lcoe, cf_electricity, + cf_wind, + cf_solar, run_RODeO_selector, grid_connection_scenario, grid_price_scenario, + grid_elec_price, lcoh, h2_transmission_price, h2_production_capex, @@ -1659,10 +1677,13 @@ def write_outputs_ProFAST(electrical_generation_timeseries, # Define grid connection scenario for naming if grid_connection_scenario == 'off-grid': grid_string = grid_connection_scenario + grid_price = 0 elif grid_connection_scenario == 'grid-only': grid_string = grid_connection_scenario+'-'+grid_price_scenario + grid_price = grid_elec_price elif grid_connection_scenario == 'hybrid-grid': grid_string = grid_connection_scenario+'-'+grid_price_scenario + grid_price = grid_elec_price if grid_connection_scenario != 'grid-only': if run_pv_battery_sweep ==True: @@ -1755,7 +1776,7 @@ def write_outputs_ProFAST(electrical_generation_timeseries, total_elec_production,scenario['Debt Equity'], atb_year,electrolysis_total_EI_policy_grid,electrolysis_total_EI_policy_offgrid, H2_PTC,Ren_PTC,scenario['Wind PTC'], - discount_rate, tlcc_wind_costs, tlcc_solar_costs, tlcc_hvdc_costs,lcoe*10,cf_electricity,lcoh, + discount_rate, tlcc_wind_costs, tlcc_solar_costs, tlcc_hvdc_costs,lcoe*10,grid_price,cf_electricity,cf_wind,cf_solar,lcoh, elec_cf,ren_frac,stack_avg_life_hrs,n_pem_clusters,hydrogen_storage_duration_hr,hydrogen_storage_capacity_kg,hydrogen_storage_cost_USDprkg, H2_Results['hydrogen_annual_output'], h2_production_capex,h2_transmission_capex,steel_total_capex,ammonia_total_capex, @@ -1773,7 +1794,7 @@ def write_outputs_ProFAST(electrical_generation_timeseries, 'Wind capacity (MW)','Solar capacity (MW)','Battery storage capacity (MW)','Battery storage duration (hr)','Electrolyzer capacity (MW)', 'Total Electricity Production (kWh)','Debt Equity', 'ATB Year','Grid Total Emission Intensity (kg-CO2/kg-H2)','Off-grid Total Emission Intensity (kg-CO2/kg-H2)','H2 PTC ($/kg)','Ren PTC ($/kg)', 'Wind PTC', - 'Discount Rate', 'NPV Wind Expenses', 'NPV Solar Expenses', 'NPV HVDC Expenses','LCOE ($/MWh)','Electricity CF (-)','LCOH ($/kg)', + 'Discount Rate', 'NPV Wind Expenses', 'NPV Solar Expenses', 'NPV HVDC Expenses','LCOE ($/MWh)','Grid Price ($/MWh)','Electricity CF (-)','Wind plant CF (-),','Solar plant CF (-)','LCOH ($/kg)', 'Electrolyzer CF (-)','Fraction of electricity from renewables (-)','Average stack life (hrs)','Number of stack clusters (-)','Hydrogen storage duration (hr)','Hydrogen storage capacity (kg)','Hydrogen storage CAPEX ($/kg)', 'Hydrogen annual production (kg)', 'Hydrogen production total CAPEX ($)','Hydrogen transmission total CAPEX ($)','Steel Plant Total CAPEX ($)','Ammonia Plant Total CAPEX ($)', From 0008f91909fa3667645d125cd7c259c43e0ec904 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 30 Aug 2023 12:40:30 -0600 Subject: [PATCH 2/3] Small changes to get working with latest version of ProFAST --- hopp/to_organize/hopp_tools_steel.py | 82 ++++++++++++------- hopp/to_organize/run_profast_for_ammonia.py | 8 +- .../run_profast_for_h2_transmission.py | 8 +- hopp/to_organize/run_profast_for_hydrogen.py | 22 +++-- hopp/to_organize/run_profast_for_steel.py | 8 +- 5 files changed, 76 insertions(+), 52 deletions(-) diff --git a/hopp/to_organize/hopp_tools_steel.py b/hopp/to_organize/hopp_tools_steel.py index 96b0116c5..798b1ca67 100644 --- a/hopp/to_organize/hopp_tools_steel.py +++ b/hopp/to_organize/hopp_tools_steel.py @@ -319,45 +319,65 @@ def set_turbine_model(hopp_dict, turbine_model, scenario, parent_path, floris_di # TODO: replace nTurbs placeholder value with real value nTurbs = 0 + if site_location == 'Site 1': + tower_height = 115 + rotor_diameter = 170 + elif site_location == 'Site 2': + tower_height = 115 + rotor_diameter = 170 - # Scaled from reference 15MW turbine: https://github.com/IEAWindTask37/IEA-15-240-RWT - if turbine_model == '12MW': - custom_powercurve_path = '2022atb_osw_12MW.csv' - tower_height = 136 - rotor_diameter = 215 - - elif turbine_model == '15MW': - custom_powercurve_path = '2022atb_osw_15MW.csv' - tower_height = 150 - rotor_diameter = 240 - - elif turbine_model == '18MW': - custom_powercurve_path = '2022atb_osw_18MW.csv' - tower_height = 161 - rotor_diameter = 263 + elif site_location == 'Site 3': + tower_height = 130 + rotor_diameter = 196 - elif turbine_model == '4MW': - #TODO: replace with correct power curve - custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' + elif site_location == 'Site 4': tower_height = 130 - rotor_diameter = 185 + rotor_diameter = 196 - elif turbine_model == '6MW': - #TODO: replace with correct power curve - custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' + elif site_location == 'Site 5': tower_height = 115 rotor_diameter = 170 - elif turbine_model == '8MW': - #TODO: replace with correct power curve - custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' - tower_height = 160 - rotor_diameter = 225 - elif turbine_model == '7MW': - custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' # https://nrel.github.io/turbine-models/2020ATB_NREL_Reference_12MW_214.html - tower_height = 175 - rotor_diameter = 200 + custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' + + # # Scaled from reference 15MW turbine: https://github.com/IEAWindTask37/IEA-15-240-RWT + # if turbine_model == '12MW': + # custom_powercurve_path = '2022atb_osw_12MW.csv' + # tower_height = 136 + # rotor_diameter = 215 + + # elif turbine_model == '15MW': + # custom_powercurve_path = '2022atb_osw_15MW.csv' + # tower_height = 150 + # rotor_diameter = 240 + + # elif turbine_model == '18MW': + # custom_powercurve_path = '2022atb_osw_18MW.csv' + # tower_height = 161 + # rotor_diameter = 263 + + # elif turbine_model == '4MW': + # #TODO: replace with correct power curve + # custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' + # tower_height = 130 + # rotor_diameter = 185 + + # elif turbine_model == '6MW': + # #TODO: replace with correct power curve + # custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' + # tower_height = 115 + # rotor_diameter = 170 + + # elif turbine_model == '8MW': + # #TODO: replace with correct power curve + # custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' + # tower_height = 160 + # rotor_diameter = 225 + # elif turbine_model == '7MW': + # custom_powercurve_path = '2020ATB_NREL_Reference_7MW_200.csv' # https://nrel.github.io/turbine-models/2020ATB_NREL_Reference_12MW_214.html + # tower_height = 175 + # rotor_diameter = 200 scenario['Tower Height'] = tower_height scenario['Turbine Rating'] = turbine_rating_mw diff --git a/hopp/to_organize/run_profast_for_ammonia.py b/hopp/to_organize/run_profast_for_ammonia.py index 889e307f3..9f9addb9a 100644 --- a/hopp/to_organize/run_profast_for_ammonia.py +++ b/hopp/to_organize/run_profast_for_ammonia.py @@ -100,19 +100,19 @@ def run_profast_for_ammonia(plant_capacity_kgpy,plant_capacity_factor,plant_life pf.set_params('sales tax',0) pf.set_params('license and permit',{'value':00,'escalation':gen_inflation}) pf.set_params('rent',{'value':0,'escalation':gen_inflation}) - pf.set_params('property tax and insurance percent',0) - pf.set_params('admin expense percent',0) + pf.set_params('property tax and insurance',0) + pf.set_params('admin expense',0) pf.set_params('total income tax rate',0.27) pf.set_params('capital gains tax rate',0.15) pf.set_params('sell undepreciated cap',True) pf.set_params('tax losses monetized',True) - pf.set_params('operating incentives taxable',True) + # pf.set_params('operating incentives taxable',True) pf.set_params('general inflation rate',gen_inflation) pf.set_params('leverage after tax nominal discount rate',0.0824) pf.set_params('debt equity ratio of initial financing',1.38) pf.set_params('debt type','Revolving debt') pf.set_params('debt interest rate',0.0489) - pf.set_params('cash onhand percent',1) + pf.set_params('cash onhand',1) #----------------------------------- Add capital items to ProFAST ---------------- pf.add_capital_item(name="Air Separation by Cryogenic",cost=capex_air_separation_crygenic,depr_type="MACRS",depr_period=7,refurb=[0]) diff --git a/hopp/to_organize/run_profast_for_h2_transmission.py b/hopp/to_organize/run_profast_for_h2_transmission.py index 6d2ca6e74..8b154a38a 100644 --- a/hopp/to_organize/run_profast_for_h2_transmission.py +++ b/hopp/to_organize/run_profast_for_h2_transmission.py @@ -75,19 +75,19 @@ def run_profast_for_h2_transmission(project_dir, max_hydrogen_production_rate_kg pf.set_params('sales tax',0) pf.set_params('license and permit',{'value':00,'escalation':gen_inflation}) pf.set_params('rent',{'value':0,'escalation':gen_inflation}) - pf.set_params('property tax and insurance percent',0) - pf.set_params('admin expense percent',0) + pf.set_params('property tax and insurance',0) + pf.set_params('admin expense',0) pf.set_params('total income tax rate',0.27) pf.set_params('capital gains tax rate',0.15) pf.set_params('sell undepreciated cap',True) pf.set_params('tax losses monetized',True) - pf.set_params('operating incentives taxable',True) + #pf.set_params('operating incentives taxable',True) pf.set_params('general inflation rate',gen_inflation) pf.set_params('leverage after tax nominal discount rate',0.0824) pf.set_params('debt equity ratio of initial financing',1.38) pf.set_params('debt type','Revolving debt') pf.set_params('debt interest rate',0.0489) - pf.set_params('cash onhand percent',1) + pf.set_params('cash onhand',1) #----------------------------------- Add capital items to ProFAST ---------------- pf.add_capital_item(name="Pipeline",cost=pipeline_capex,depr_type="MACRS",depr_period=7,refurb=[0]) diff --git a/hopp/to_organize/run_profast_for_hydrogen.py b/hopp/to_organize/run_profast_for_hydrogen.py index e276ff5fd..071a2b45b 100644 --- a/hopp/to_organize/run_profast_for_hydrogen.py +++ b/hopp/to_organize/run_profast_for_hydrogen.py @@ -23,7 +23,7 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ electrolyzer_system_capex_kw,user_defined_time_between_replacement,electrolyzer_energy_kWh_per_kg,hydrogen_storage_capacity_kg,hydrogen_storage_cost_USDprkg,\ capex_desal,opex_desal,plant_life,water_cost,wind_size_mw,solar_size_mw,storage_size_mw,renewable_plant_cost_info,wind_om_cost_kw,grid_connected_hopp,\ grid_connection_scenario, atb_year, site_name, policy_option, energy_to_electrolyzer, combined_pv_wind_power_production_hopp,combined_pv_wind_curtailment_hopp,\ - energy_shortfall_hopp, elec_price, grid_price_scenario,user_defined_stack_replacement_time,use_optimistic_pem_efficiency): + energy_shortfall_hopp, elec_price,grid_prices_interpolated_USDperkwh, grid_price_scenario,user_defined_stack_replacement_time,use_optimistic_pem_efficiency): mwh_to_kwh = 0.001 # plant_life=useful_life # electrolyzer_system_capex_kw = electrolyzer_capex_kw @@ -335,12 +335,15 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ # Fill these in - can have most of them as 0 also gen_inflation = 0.00 + install_years = 3 + analysis_start = atb_year + 5 - install_years + pf.set_params('commodity',{"name":'Hydrogen',"unit":"kg","initial price":100,"escalation":gen_inflation}) pf.set_params('capacity',electrolysis_plant_capacity_kgperday) #units/day pf.set_params('maintenance',{"value":0,"escalation":gen_inflation}) pf.set_params('analysis start year',2022) pf.set_params('operating life',plant_life) - pf.set_params('installation months',36) + pf.set_params('installation months',install_years*12) pf.set_params('installation cost',{"value":0,"depr type":"Straight line","depr period":4,"depreciable":False}) pf.set_params('non depr assets',land_cost) pf.set_params('end of proj sale non depr assets',land_cost*(1+gen_inflation)**plant_life) @@ -350,19 +353,20 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ pf.set_params('sales tax',0) pf.set_params('license and permit',{'value':00,'escalation':gen_inflation}) pf.set_params('rent',{'value':0,'escalation':gen_inflation}) - pf.set_params('property tax and insurance percent',property_tax_insurance) - pf.set_params('admin expense percent',0) + pf.set_params('property tax and insurance',property_tax_insurance) + pf.set_params('admin expense',0) pf.set_params('total income tax rate',0.27) pf.set_params('capital gains tax rate',0.15) pf.set_params('sell undepreciated cap',True) pf.set_params('tax losses monetized',True) - pf.set_params('operating incentives taxable',True) + pf.set_params('annual operating incentive',{"value":H2_PTC + Ren_PTC,"decay":0.00,"sunset years":H2_PTC_duration,'taxable':True}) + #pf.set_params('annual operating incentive',True) pf.set_params('general inflation rate',gen_inflation) pf.set_params('leverage after tax nominal discount rate',0.0824) pf.set_params('debt equity ratio of initial financing',1.38) pf.set_params('debt type','Revolving debt') pf.set_params('debt interest rate',0.0489) - pf.set_params('cash onhand percent',1) + pf.set_params('cash onhand',1) pf.set_params('one time cap inct',{'value':ITC*(capex_storage_installed+capex_battery_installed),'depr type':'MACRS','depr period':7,'depreciable':True}) #pf.set_params('one time cap inct',{'value':ITC*capex_solar_installed,'depr type':'MACRS','depr period':7,'depreciable':True}) #pf.set_params('one time cap inct',{'value':ITC*capex_battery_installed,'depr type':'MACRS','depr period':7,'depreciable':True}) @@ -420,10 +424,10 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ pf.add_feedstock(name='Water',usage=water_consumption_avg_galH2O_prkgH2,unit='gallon-water',cost=water_cost,escalation=gen_inflation) pf.add_feedstock(name='Var O&M',usage=1.0,unit='$/kg',cost=total_variable_OM_perkg,escalation=gen_inflation) - pf.add_feedstock(name='Grid Electricity Cost',usage=grid_electricity_useage_kWhpkg,unit='$/kWh',cost=elec_price_perkWh,escalation=gen_inflation) + pf.add_feedstock(name='Grid Electricity Cost',usage=grid_electricity_useage_kWhpkg,unit='$/kWh',cost=grid_prices_interpolated_USDperkwh,escalation=gen_inflation) #---------------------- Add various tax credit incentives ------------------- - pf.add_incentive(name ='Renewable PTC credit', value=Ren_PTC, decay = 0, sunset_years = Ren_PTC_duration, tax_credit = True) - pf.add_incentive(name ='Hydrogen PTC credit', value=H2_PTC, decay = 0, sunset_years = H2_PTC_duration, tax_credit = True) + #pf.add_incentive(name ='Renewable PTC credit', value=Ren_PTC, decay = 0, sunset_years = Ren_PTC_duration, tax_credit = True) + #pf.add_incentive(name ='Hydrogen PTC credit', value=H2_PTC, decay = 0, sunset_years = H2_PTC_duration, tax_credit = True) sol = pf.solve_price() diff --git a/hopp/to_organize/run_profast_for_steel.py b/hopp/to_organize/run_profast_for_steel.py index 69d796321..51673de2f 100644 --- a/hopp/to_organize/run_profast_for_steel.py +++ b/hopp/to_organize/run_profast_for_steel.py @@ -157,19 +157,19 @@ def run_profast_for_steel(plant_capacity_mtpy,plant_capacity_factor,\ pf.set_params('sales tax',0) pf.set_params('license and permit',{'value':00,'escalation':gen_inflation}) pf.set_params('rent',{'value':0,'escalation':gen_inflation}) - pf.set_params('property tax and insurance percent',0) - pf.set_params('admin expense percent',0) + pf.set_params('property tax and insurance',0) + pf.set_params('admin expense',0) pf.set_params('total income tax rate',0.27) pf.set_params('capital gains tax rate',0.15) pf.set_params('sell undepreciated cap',True) pf.set_params('tax losses monetized',True) - pf.set_params('operating incentives taxable',True) + #pf.set_params('operating incentives taxable',True) pf.set_params('general inflation rate',gen_inflation) pf.set_params('leverage after tax nominal discount rate',0.0824) pf.set_params('debt equity ratio of initial financing',1.38) pf.set_params('debt type','Revolving debt') pf.set_params('debt interest rate',0.0489) - pf.set_params('cash onhand percent',1) + pf.set_params('cash onhand',1) #----------------------------------- Add capital items to ProFAST ---------------- pf.add_capital_item(name="EAF & Casting",cost=capex_eaf_casting,depr_type="MACRS",depr_period=7,refurb=[0]) From 72303311f4941a7f5b62c4dd8d3a1f21408fc4cd Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 31 Aug 2023 12:19:36 -0600 Subject: [PATCH 3/3] Updates so that incentives are applied per year for first 10 years rather than just first year --- .../LCA_single_scenario_ProFAST.py | 139 +++++---- hopp/to_organize/hopp_tools_steel.py | 8 +- hopp/to_organize/run_profast_for_hydrogen.py | 284 +++++++++--------- 3 files changed, 224 insertions(+), 207 deletions(-) diff --git a/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py b/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py index 37d4819c8..7031523eb 100644 --- a/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py +++ b/hopp/to_organize/H2_Analysis/LCA_single_scenario_ProFAST.py @@ -17,7 +17,7 @@ # grid_price_scenario = 'retail-flat' # electrolyzer_energy_kWh_per_kg = 55 -def hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_name,policy_option,hydrogen_production_while_running,H2_Results,electrolyzer_energy_kWh_per_kg,solar_size_mw,storage_size_mw,hopp_dict): +def hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_name,policy_option,hydrogen_production_while_running,H2_Results,electrolyzer_energy_kWh_per_kg,solar_size_mw,storage_size_mw,hopp_dict,H2_PTC_duration): dircambium = os.path.join(hopp_dict.main_dict["Configuration"]["parent_path"], "H2_Analysis", "Cambium_data", "Cambium22_MidCase100by2035_hourly_") @@ -33,7 +33,7 @@ def hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_n #------------------------------------------------------------------------------ # Renewable infrastructure embedded emission intensities #------------------------------------------------------------------------------ - system_life = 30 + #system_life = plant_life ely_stack_capex_EI = 0.019 # PEM electrolyzer CAPEX emissions (kg CO2e/kg H2) wind_capex_EI = 10 # Electricity generation capacity from wind, nominal value taken (g CO2e/kWh) if solar_size_mw != 0: @@ -62,67 +62,84 @@ def hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_n cambium_year =2035 elif atb_year == 2035: cambium_year = 2040 - - + + energy_from_grid_df = pd.DataFrame(hopp_dict.main_dict["Models"]["grid"]["ouput_dict"]['energy_from_the_grid'],columns=['Energy from the grid (kWh)']) energy_from_renewables_df = pd.DataFrame(hopp_dict.main_dict["Models"]["grid"]["ouput_dict"]['energy_from_renewables'],columns=['Energy from renewables (kWh)']) # Read in Cambium data - cambiumdata_filepath = dircambium + site_name + '_'+str(cambium_year) + '.csv' - cambium_data = pd.read_csv(cambiumdata_filepath,index_col = None,header = 5,usecols = ['lrmer_co2_c','lrmer_ch4_c','lrmer_n2o_c','lrmer_co2_p','lrmer_ch4_p','lrmer_n2o_p','lrmer_co2e_c','lrmer_co2e_p','lrmer_co2e']) - - cambium_data = cambium_data.reset_index().rename(columns = {'index':'Interval','lrmer_co2_c':'LRMER CO2 combustion (kg-CO2/MWh)','lrmer_ch4_c':'LRMER CH4 combustion (g-CH4/MWh)','lrmer_n2o_c':'LRMER N2O combustion (g-N2O/MWh)',\ - 'lrmer_co2_p':'LRMER CO2 production (kg-CO2/MWh)','lrmer_ch4_p':'LRMER CH4 production (g-CH4/MWh)','lrmer_n2o_p':'LRMER N2O production (g-N2O/MWh)','lrmer_co2e_c':'LRMER CO2 equiv. combustion (kg-CO2e/MWh)',\ - 'lrmer_co2e_p':'LRMER CO2 equiv. production (kg-CO2e/MWh)','lrmer_co2e':'LRMER CO2 equiv. total (kg-CO2e/MWh)'}) - - cambium_data['Interval']=cambium_data['Interval']+1 - cambium_data = cambium_data.set_index('Interval') - - # Read in rodeo data -# rodeo_data = hydrogen_hourly_results_RODeO[['Interval','Input Power (MW)','Non-Ren Import (MW)','Renewable Input (MW)','Curtailment (MW)','Product Sold (units of product)']] -# rodeo_data = rodeo_data.rename(columns = {'Input Power (MW)':'Electrolyzer Power (MW)','Non-Ren Import (MW)':'Grid Import (MW)','Renewable Input (MW)':'Renewable Input (MW)', 'Curtailment (MW)':'Curtailment (MW)','Product Sold (units of product)':'Hydrogen production (kg-H2)'}) - # Combine RODeO and Cambium data into one dataframe -# combined_data = rodeo_data.merge(cambium_data, on = 'Interval',how = 'outer') - - # Calculate hourly grid emissions factors of interest. If we want to use different GWPs, we can do that here. The Grid Import is an hourly data i.e., in MWh - cambium_data['Total grid emissions (kg-CO2e)'] = energy_from_grid_df['Energy from the grid (kWh)'] * cambium_data['LRMER CO2 equiv. total (kg-CO2e/MWh)'] / 1000 - cambium_data['Scope 2 (combustion) grid emissions (kg-CO2e)'] = energy_from_grid_df['Energy from the grid (kWh)'] * cambium_data['LRMER CO2 equiv. combustion (kg-CO2e/MWh)'] / 1000 - cambium_data['Scope 3 (production) grid emissions (kg-CO2e)'] = energy_from_grid_df['Energy from the grid (kWh)'] * cambium_data['LRMER CO2 equiv. production (kg-CO2e/MWh)'] / 1000 - - # Sum total emissions - scope2_grid_emissions_sum = cambium_data['Scope 2 (combustion) grid emissions (kg-CO2e)'].sum()*system_life*kg_to_MT_conv - scope3_grid_emissions_sum = cambium_data['Scope 3 (production) grid emissions (kg-CO2e)'].sum()*system_life*kg_to_MT_conv - #scope3_ren_sum = energy_from_renewables_df['Energy from renewables (kWh)'].sum()/1000 # MWh - scope3_ren_sum = energy_from_renewables_df['Energy from renewables (kWh)'].sum()*system_life/1000 # MWh - #h2prod_sum = np.sum(hydrogen_production_while_running)*system_life*kg_to_MT_conv -# h2prod_grid_frac = cambium_data['Grid Import (MW)'].sum() / cambium_data['Electrolyzer Power (MW)'].sum() - h2prod_sum=H2_Results['hydrogen_annual_output']*system_life*kg_to_MT_conv - - - if grid_connection_scenario == 'hybrid-grid' : - # Calculate grid-connected electrolysis emissions/ future cases should reflect targeted electrolyzer electricity usage - electrolysis_Scope3_EI = scope3_grid_emissions_sum/h2prod_sum # + (wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv + ely_stack_capex_EI # kg CO2e/kg H2 - electrolysis_Scope2_EI = scope2_grid_emissions_sum/h2prod_sum - electrolysis_Scope1_EI = 0 - electrolysis_total_EI = electrolysis_Scope1_EI + electrolysis_Scope2_EI + electrolysis_Scope3_EI - electrolysis_total_EI_policy_grid = electrolysis_total_EI # - (wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv - electrolysis_total_EI_policy_offgrid = 0 #(wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv + ely_stack_capex_EI - elif grid_connection_scenario == 'grid-only': - # Calculate grid-connected electrolysis emissions - electrolysis_Scope3_EI = scope3_grid_emissions_sum/h2prod_sum # + ely_stack_capex_EI # kg CO2e/kg H2 - electrolysis_Scope2_EI = scope2_grid_emissions_sum/h2prod_sum - electrolysis_Scope1_EI = 0 - electrolysis_total_EI = electrolysis_Scope1_EI + electrolysis_Scope2_EI + electrolysis_Scope3_EI - electrolysis_total_EI_policy_grid = electrolysis_total_EI - electrolysis_total_EI_policy_offgrid = 0 - elif grid_connection_scenario == 'off-grid': - # Calculate renewable only electrolysis emissions - electrolysis_Scope3_EI = 0#(wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv + ely_stack_capex_EI # kg CO2e/kg H2 - electrolysis_Scope2_EI = 0 - electrolysis_Scope1_EI = 0 - electrolysis_total_EI = electrolysis_Scope1_EI + electrolysis_Scope2_EI + electrolysis_Scope3_EI - electrolysis_total_EI_policy_offgrid = electrolysis_total_EI - electrolysis_total_EI_policy_grid = 0 - - return(electrolysis_total_EI_policy_grid,electrolysis_total_EI_policy_offgrid) + + emission_intensity_grid = [] + emission_intensity_offgrid = [] + years = list(range(cambium_year,2055,5)) + for year in years: + cambiumdata_filepath = dircambium + site_name + '_'+str(year) + '.csv' + cambium_data = pd.read_csv(cambiumdata_filepath,index_col = None,header = 5,usecols = ['lrmer_co2_c','lrmer_ch4_c','lrmer_n2o_c','lrmer_co2_p','lrmer_ch4_p','lrmer_n2o_p','lrmer_co2e_c','lrmer_co2e_p','lrmer_co2e']) + + cambium_data = cambium_data.reset_index().rename(columns = {'index':'Interval','lrmer_co2_c':'LRMER CO2 combustion (kg-CO2/MWh)','lrmer_ch4_c':'LRMER CH4 combustion (g-CH4/MWh)','lrmer_n2o_c':'LRMER N2O combustion (g-N2O/MWh)',\ + 'lrmer_co2_p':'LRMER CO2 production (kg-CO2/MWh)','lrmer_ch4_p':'LRMER CH4 production (g-CH4/MWh)','lrmer_n2o_p':'LRMER N2O production (g-N2O/MWh)','lrmer_co2e_c':'LRMER CO2 equiv. combustion (kg-CO2e/MWh)',\ + 'lrmer_co2e_p':'LRMER CO2 equiv. production (kg-CO2e/MWh)','lrmer_co2e':'LRMER CO2 equiv. total (kg-CO2e/MWh)'}) + + cambium_data['Interval']=cambium_data['Interval']+1 + cambium_data = cambium_data.set_index('Interval') + + # Calculate hourly grid emissions factors of interest. If we want to use different GWPs, we can do that here. The Grid Import is an hourly data i.e., in MWh + cambium_data['Total grid emissions (kg-CO2e)'] = energy_from_grid_df['Energy from the grid (kWh)'] * cambium_data['LRMER CO2 equiv. total (kg-CO2e/MWh)'] / 1000 + cambium_data['Scope 2 (combustion) grid emissions (kg-CO2e)'] = energy_from_grid_df['Energy from the grid (kWh)'] * cambium_data['LRMER CO2 equiv. combustion (kg-CO2e/MWh)'] / 1000 + cambium_data['Scope 3 (production) grid emissions (kg-CO2e)'] = energy_from_grid_df['Energy from the grid (kWh)'] * cambium_data['LRMER CO2 equiv. production (kg-CO2e/MWh)'] / 1000 + + # Sum total emissions + scope2_grid_emissions_sum = cambium_data['Scope 2 (combustion) grid emissions (kg-CO2e)'].sum()*kg_to_MT_conv + scope3_grid_emissions_sum = cambium_data['Scope 3 (production) grid emissions (kg-CO2e)'].sum()*kg_to_MT_conv + #scope3_ren_sum = energy_from_renewables_df['Energy from renewables (kWh)'].sum()/1000 # MWh + scope3_ren_sum = energy_from_renewables_df['Energy from renewables (kWh)'].sum()/1000 # MWh + #h2prod_sum = np.sum(hydrogen_production_while_running)*system_life*kg_to_MT_conv + # h2prod_grid_frac = cambium_data['Grid Import (MW)'].sum() / cambium_data['Electrolyzer Power (MW)'].sum() + h2prod_sum=H2_Results['hydrogen_annual_output']*kg_to_MT_conv + + + if grid_connection_scenario == 'hybrid-grid' : + # Calculate grid-connected electrolysis emissions/ future cases should reflect targeted electrolyzer electricity usage + electrolysis_Scope3_EI = scope3_grid_emissions_sum/h2prod_sum # + (wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv + ely_stack_capex_EI # kg CO2e/kg H2 + electrolysis_Scope2_EI = scope2_grid_emissions_sum/h2prod_sum + electrolysis_Scope1_EI = 0 + electrolysis_total_EI = electrolysis_Scope1_EI + electrolysis_Scope2_EI + electrolysis_Scope3_EI + electrolysis_total_EI_policy_grid = electrolysis_total_EI # - (wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv + electrolysis_total_EI_policy_offgrid = 0 #(wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv + ely_stack_capex_EI + elif grid_connection_scenario == 'grid-only': + # Calculate grid-connected electrolysis emissions + electrolysis_Scope3_EI = scope3_grid_emissions_sum/h2prod_sum # + ely_stack_capex_EI # kg CO2e/kg H2 + electrolysis_Scope2_EI = scope2_grid_emissions_sum/h2prod_sum + electrolysis_Scope1_EI = 0 + electrolysis_total_EI = electrolysis_Scope1_EI + electrolysis_Scope2_EI + electrolysis_Scope3_EI + electrolysis_total_EI_policy_grid = electrolysis_total_EI + electrolysis_total_EI_policy_offgrid = 0 + elif grid_connection_scenario == 'off-grid': + # Calculate renewable only electrolysis emissions + electrolysis_Scope3_EI = 0#(wind_capex_EI + solar_pv_capex_EI + battery_EI) * (scope3_ren_sum/h2prod_sum) * g_to_kg_conv + ely_stack_capex_EI # kg CO2e/kg H2 + electrolysis_Scope2_EI = 0 + electrolysis_Scope1_EI = 0 + electrolysis_total_EI = electrolysis_Scope1_EI + electrolysis_Scope2_EI + electrolysis_Scope3_EI + electrolysis_total_EI_policy_offgrid = electrolysis_total_EI + electrolysis_total_EI_policy_grid = 0 + + emission_intensity_grid.append(electrolysis_total_EI_policy_grid) + emission_intensity_offgrid.append(electrolysis_total_EI_policy_offgrid) + + emission_intensities_df = pd.DataFrame({'Year':years,'Grid EI (kg CO2e/kg H2)':emission_intensity_grid,'Off-grid EI (kg CO2e/kg H2)':emission_intensity_offgrid}) + + # Interpolate results + endofincentives_year = cambium_year + H2_PTC_duration + + grid_EI_interpolated = {} + offgrid_EI_interpolated = {} + for year in range(cambium_year,endofincentives_year): + if year <= max(emission_intensities_df['Year']): + grid_EI_interpolated[year]=np.interp(year,emission_intensities_df['Year'],emission_intensities_df['Grid EI (kg CO2e/kg H2)']) + offgrid_EI_interpolated[year]=np.interp(year,emission_intensities_df['Year'],emission_intensities_df['Off-grid EI (kg CO2e/kg H2)']) + else: + grid_EI_interpolated[year]=emission_intensities_df['Grid EI (kg CO2e/kg H2)'].values[-1:][0] + offgrid_EI_interpolated[year]=emission_intensities_df['Off-grid EI (kg CO2e/kg H2)'].values[-1:][0] + + return(grid_EI_interpolated,offgrid_EI_interpolated) diff --git a/hopp/to_organize/hopp_tools_steel.py b/hopp/to_organize/hopp_tools_steel.py index 798b1ca67..0642b66c0 100644 --- a/hopp/to_organize/hopp_tools_steel.py +++ b/hopp/to_organize/hopp_tools_steel.py @@ -1615,8 +1615,8 @@ def write_outputs_ProFAST(electrical_generation_timeseries, ren_frac, electrolysis_total_EI_policy_grid, electrolysis_total_EI_policy_offgrid, - H2_PTC, - Ren_PTC, + H2_PTC_firstyear, + Ren_PTC_firstyear, run_pv_battery_sweep, electrolyzer_degradation_penalty, user_defined_stack_replacement_time, @@ -1795,7 +1795,7 @@ def write_outputs_ProFAST(electrical_generation_timeseries, wind_size_mw,solar_size_mw,storage_size_mw,storage_hours,electrolyzer_size_mw, total_elec_production,scenario['Debt Equity'], atb_year,electrolysis_total_EI_policy_grid,electrolysis_total_EI_policy_offgrid, - H2_PTC,Ren_PTC,scenario['Wind PTC'], + H2_PTC_firstyear,Ren_PTC_firstyear,scenario['Wind PTC'], discount_rate, tlcc_wind_costs, tlcc_solar_costs, tlcc_hvdc_costs,lcoe*10,grid_price,cf_electricity,cf_wind,cf_solar,lcoh, elec_cf,ren_frac,stack_avg_life_hrs,n_pem_clusters,hydrogen_storage_duration_hr,hydrogen_storage_capacity_kg,hydrogen_storage_cost_USDprkg, H2_Results['hydrogen_annual_output'], @@ -1813,7 +1813,7 @@ def write_outputs_ProFAST(electrical_generation_timeseries, ['Useful Life', 'Wind Cost ($/kW)', 'Solar Cost ($/kW)', 'Electrolyzer Installed Cost ($/kW)', 'Wind capacity (MW)','Solar capacity (MW)','Battery storage capacity (MW)','Battery storage duration (hr)','Electrolyzer capacity (MW)', 'Total Electricity Production (kWh)','Debt Equity', - 'ATB Year','Grid Total Emission Intensity (kg-CO2/kg-H2)','Off-grid Total Emission Intensity (kg-CO2/kg-H2)','H2 PTC ($/kg)','Ren PTC ($/kg)', 'Wind PTC', + 'ATB Year','Grid Total Emission Intensity (kg-CO2/kg-H2)','Off-grid Total Emission Intensity (kg-CO2/kg-H2)','H2 PTC first year ($/kg)','Ren PTC first year ($/kg)', 'Wind PTC', 'Discount Rate', 'NPV Wind Expenses', 'NPV Solar Expenses', 'NPV HVDC Expenses','LCOE ($/MWh)','Grid Price ($/MWh)','Electricity CF (-)','Wind plant CF (-),','Solar plant CF (-)','LCOH ($/kg)', 'Electrolyzer CF (-)','Fraction of electricity from renewables (-)','Average stack life (hrs)','Number of stack clusters (-)','Hydrogen storage duration (hr)','Hydrogen storage capacity (kg)','Hydrogen storage CAPEX ($/kg)', 'Hydrogen annual production (kg)', diff --git a/hopp/to_organize/run_profast_for_hydrogen.py b/hopp/to_organize/run_profast_for_hydrogen.py index 071a2b45b..a6ee2ed06 100644 --- a/hopp/to_organize/run_profast_for_hydrogen.py +++ b/hopp/to_organize/run_profast_for_hydrogen.py @@ -107,8 +107,11 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ property_tax_insurance = 1.5/100 #[% of Cap/y] variable_OM = 1.30 #[$/MWh] + H2_PTC_duration = 10 # years the tax credit is active + Ren_PTC_duration = 10 # years the tax credit is active + electrolysis_total_EI_policy_grid,electrolysis_total_EI_policy_offgrid\ - = LCA_single_scenario_ProFAST.hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_name,policy_option,hydrogen_production_while_running,H2_Results,electrolyzer_energy_kWh_per_kg,solar_size_mw,storage_size_mw,hopp_dict) + = LCA_single_scenario_ProFAST.hydrogen_LCA_singlescenario_ProFAST(grid_connection_scenario,atb_year,site_name,policy_option,hydrogen_production_while_running,H2_Results,electrolyzer_energy_kWh_per_kg,solar_size_mw,storage_size_mw,hopp_dict,H2_PTC_duration) grid_electricity_useage_kWhpkg = sum(hopp_dict.main_dict['Models']['grid']['ouput_dict']['energy_from_the_grid'])/(H2_Results['hydrogen_annual_output']) ren_electricity_useage_kWhpkg = sum(hopp_dict.main_dict['Models']['grid']['ouput_dict']['energy_from_renewables'])/(H2_Results['hydrogen_annual_output']) @@ -117,50 +120,35 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ elec_cf = H2_Results['cap_factor'] - if grid_connection_scenario == 'grid-only': - # If grid connected, conservatively assume electrolyzer runs with high CF - # Or just take this straight from H2_Results if that works - #elec_cf = 1 # possibly define this earlier in the framework - Ren_PTC = 0 - electrolysis_total_EI_policy = electrolysis_total_EI_policy_grid - #grid_electricity_usage = electrolyzer_energy_kWh_per_kg - #ren_frac = 0 - elif grid_connection_scenario == 'off-grid': - # If not grid connected, max CF will be relative to total renewable energy in - #elec_cf = electrolyzer_cf_from_ren - #elec_cf = H2_Results['cap_factor'] - #ren_frac = 1 - electrolysis_total_EI_policy = electrolysis_total_EI_policy_offgrid - #grid_electricity_usage = 0 - if policy_option == 'no policy': - Ren_PTC = 0 - elif policy_option == 'base': - Ren_PTC = 0.0051 * ren_electricity_useage_kWhpkg#np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) - elif policy_option == 'max': - Ren_PTC = 0.03072 * ren_electricity_useage_kWhpkg#np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) - elif grid_connection_scenario == 'hybrid-grid': - #elec_cf = 1 - #TODO: change this - #grid_annual_energy=sum(hopp_dict.main_dict['Models']['grid']['ouput_dict']['energy_from_the_grid']) - #energy_from_renewables=sum(hopp_dict.main_dict['Models']['grid']['ouput_dict']['energy_from_renewables']) - #grid_annual_energy = sum(energy_shortfall_hopp) - #ren_cf = 1 - grid_annual_energy/(electrolyzer_size_mw*1000*8760) - #grid_cf = elec_cf# - ren_cf - #ren_frac = ren_cf/elec_cf - #H2_PTC_offgrid = 0 - #H2_PTC_grid = 0 - electrolysis_total_EI_policy = 0 - #NOTE: energy_to_electrolyzer is the electrical genertion timeseries now, which - #lumps together grid power and renewable power for grid-connected cases - #grid_electricity_usage = elec_consumption_kWhprkg_design * (1-ren_frac) - if policy_option == 'no policy': - Ren_PTC = 0 - elif policy_option == 'base': - Ren_PTC = 0.0051 * ren_electricity_useage_kWhpkg#energy_from_renewables / (H2_Results['hydrogen_annual_output']) - #Ren_PTC = 0.0051 * np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) # We will need to fix this by introducing ren_frac multiplier to denominator when HOPP changes to dealing with grid cases are changed - elif policy_option == 'max': - Ren_PTC = 0.03072 * ren_electricity_useage_kWhpkg#energy_from_renewables/ (H2_Results['hydrogen_annual_output']) - # Ren_PTC = 0.03072 * np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) # We will need to fix this by introducing ren_frac multiplier to denominator when HOPP changes to dealing with grid cases are changed + + # Establish Ren PTC and assign total emission intensity + start_year = atb_year + 5 + endofincentives_year = start_year + H2_PTC_duration + Ren_PTC = {} + electrolysis_total_EI_policy = {} + for year in range(start_year,endofincentives_year): + + if grid_connection_scenario == 'grid-only': + Ren_PTC[year] = 0 + electrolysis_total_EI_policy[year] = electrolysis_total_EI_policy_grid[year] + elif grid_connection_scenario == 'off-grid': + electrolysis_total_EI_policy[year] = electrolysis_total_EI_policy_offgrid[year] + if policy_option == 'no-policy': + Ren_PTC[year] = 0 + elif policy_option == 'base': + Ren_PTC[year] = 0.0051 * ren_electricity_useage_kWhpkg#np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) + elif policy_option == 'max': + Ren_PTC[year] = 0.03072 * ren_electricity_useage_kWhpkg#np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) + elif grid_connection_scenario == 'hybrid-grid': + electrolysis_total_EI_policy[year] = 0 # Basically this is not used for hybrid-grid + if policy_option == 'no-policy': + Ren_PTC[year] = 0 + elif policy_option == 'base': + Ren_PTC[year] = 0.0051 * ren_electricity_useage_kWhpkg#energy_from_renewables / (H2_Results['hydrogen_annual_output']) + #Ren_PTC = 0.0051 * np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) # We will need to fix this by introducing ren_frac multiplier to denominator when HOPP changes to dealing with grid cases are changed + elif policy_option == 'max': + Ren_PTC[year] = 0.03072 * ren_electricity_useage_kWhpkg#energy_from_renewables/ (H2_Results['hydrogen_annual_output']) + # Ren_PTC = 0.03072 * np.sum(energy_to_electrolyzer)/ (H2_Results['hydrogen_annual_output']) # We will need to fix this by introducing ren_frac multiplier to denominator when HOPP changes to dealing with grid cases are changed # add in electrolzyer replacement schedule if user_defined_stack_replacement_time: @@ -228,106 +216,120 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ # battery_capex_per_kw= renewable_plant_cost_info['battery']['capex_per_kwh']*battery_hrs + renewable_plant_cost_info['battery']['capex_per_kw'] # capex_battery_installed = battery_capex_per_kw * renewable_plant_cost_info['battery']['size_mw']*1000 # fixed_cost_battery = renewable_plant_cost_info['battery']['o&m_percent'] * capex_battery_installed - H2_PTC_duration = 10 # years the tax credit is active - Ren_PTC_duration = 10 # years the tax credit is active - - if policy_option == 'no-policy': - ITC = 0 - H2_PTC = 0 # $/kg H2 - Ren_PTC = 0 # $/kWh - - elif policy_option == 'max': - - ITC = 0.5 - - if electrolysis_total_EI_policy <= 0.45: # kg CO2e/kg H2 - H2_PTC = 3 # $/kg H2 - elif electrolysis_total_EI_policy > 0.45 and electrolysis_total_EI_policy <= 1.5: # kg CO2e/kg H2 - H2_PTC = 1 # $/kg H2 - elif electrolysis_total_EI_policy > 1.5 and electrolysis_total_EI_policy <= 2.5: # kg CO2e/kg H2 - H2_PTC = 0.75 # $/kg H2 - elif electrolysis_total_EI_policy > 2.5 and electrolysis_total_EI_policy <= 4: # kg CO2e/kg H2 - H2_PTC = 0.6 # $/kg H2 - elif electrolysis_total_EI_policy > 4: - H2_PTC = 0 - - elif policy_option == 'base': - - ITC = 0.06 - - if electrolysis_total_EI_policy <= 0.45: # kg CO2e/kg H2 - H2_PTC = 0.6 # $/kg H2 - elif electrolysis_total_EI_policy > 0.45 and electrolysis_total_EI_policy <= 1.5: # kg CO2e/kg H2 - H2_PTC = 0.2 # $/kg H2 - elif electrolysis_total_EI_policy > 1.5 and electrolysis_total_EI_policy <= 2.5: # kg CO2e/kg H2 - H2_PTC = 0.15 # $/kg H2 - elif electrolysis_total_EI_policy > 2.5 and electrolysis_total_EI_policy <= 4: # kg CO2e/kg H2 - H2_PTC = 0.12 # $/kg H2 - elif electrolysis_total_EI_policy > 4: - H2_PTC = 0 - - if grid_connection_scenario == 'hybrid-grid': - - if policy_option == 'no-policy': - H2_PTC_grid = 0 - H2_PTC_offgrid = 0 - - elif policy_option == 'max': - - if electrolysis_total_EI_policy_grid <= 0.45: # kg CO2e/kg H2 - H2_PTC_grid = 3 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 0.45 and electrolysis_total_EI_policy_grid <= 1.5: # kg CO2e/kg H2 - H2_PTC_grid = 1 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 1.5 and electrolysis_total_EI_policy_grid <= 2.5: # kg CO2e/kg H2 - H2_PTC_grid = 0.75 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 2.5 and electrolysis_total_EI_policy_grid <= 4: # kg CO2e/kg H2 - H2_PTC_grid = 0.6 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 4: - H2_PTC_grid = 0 - - if electrolysis_total_EI_policy_offgrid <= 0.45: # kg CO2e/kg H2 - H2_PTC_offgrid = 3 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 0.45 and electrolysis_total_EI_policy_offgrid <= 1.5: # kg CO2e/kg H2 - H2_PTC_offgrid = 1 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 1.5 and electrolysis_total_EI_policy_offgrid <= 2.5: # kg CO2e/kg H2 - H2_PTC_offgrid = 0.75 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 2.5 and electrolysis_total_EI_policy_offgrid <= 4: # kg CO2e/kg H2 - H2_PTC_offgrid = 0.6 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 4: - H2_PTC_offgrid = 0 - - elif policy_option == 'base': - - if electrolysis_total_EI_policy_grid <= 0.45: # kg CO2e/kg H2 - H2_PTC_grid = 0.6 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 0.45 and electrolysis_total_EI_policy_grid <= 1.5: # kg CO2e/kg H2 - H2_PTC_grid = 0.2 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 1.5 and electrolysis_total_EI_policy_grid <= 2.5: # kg CO2e/kg H2 - H2_PTC_grid = 0.15 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 2.5 and electrolysis_total_EI_policy_grid <= 4: # kg CO2e/kg H2 - H2_PTC_grid = 0.12 # $/kg H2 - elif electrolysis_total_EI_policy_grid > 4: + + #Calculate H2 and combined PTC + cambium_year = atb_year + 5 + endofincentives_year = cambium_year + H2_PTC_duration + H2_PTC = {} + for year in range(cambium_year,endofincentives_year): + + if grid_connection_scenario == 'grid-only' or grid_connection_scenario == 'off-grid': + + if policy_option == 'no-policy': + ITC = 0 + H2_PTC[year] = 0 # $/kg H2 + Ren_PTC[year] = 0 # $/kWh + + elif policy_option == 'max': + + ITC = 0.5 + + if electrolysis_total_EI_policy[year] <= 0.45: # kg CO2e/kg H2 + H2_PTC[year] = 3 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 0.45 and electrolysis_total_EI_policy[year] <= 1.5: # kg CO2e/kg H2 + H2_PTC[year] = 1 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 1.5 and electrolysis_total_EI_policy[year] <= 2.5: # kg CO2e/kg H2 + H2_PTC[year] = 0.75 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 2.5 and electrolysis_total_EI_policy[year] <= 4: # kg CO2e/kg H2 + H2_PTC[year] = 0.6 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 4: + H2_PTC[year] = 0 + + elif policy_option == 'base': + + ITC = 0.06 + + if electrolysis_total_EI_policy[year] <= 0.45: # kg CO2e/kg H2 + H2_PTC[year] = 0.6 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 0.45 and electrolysis_total_EI_policy[year] <= 1.5: # kg CO2e/kg H2 + H2_PTC[year] = 0.2 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 1.5 and electrolysis_total_EI_policy[year] <= 2.5: # kg CO2e/kg H2 + H2_PTC[year] = 0.15 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 2.5 and electrolysis_total_EI_policy[year] <= 4: # kg CO2e/kg H2 + H2_PTC[year] = 0.12 # $/kg H2 + elif electrolysis_total_EI_policy[year] > 4: + H2_PTC[year] = 0 + + + if grid_connection_scenario == 'hybrid-grid': + + if policy_option == 'no-policy': H2_PTC_grid = 0 - - - if electrolysis_total_EI_policy_offgrid <= 0.45: # kg CO2e/kg H2 - H2_PTC_offgrid = 0.6 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 0.45 and electrolysis_total_EI_policy_offgrid <= 1.5: # kg CO2e/kg H2 - H2_PTC_offgrid = 0.2 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 1.5 and electrolysis_total_EI_policy_offgrid <= 2.5: # kg CO2e/kg H2 - H2_PTC_offgrid = 0.15 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 2.5 and electrolysis_total_EI_policy_offgrid <= 4: # kg CO2e/kg H2 - H2_PTC_offgrid = 0.12 # $/kg H2 - elif electrolysis_total_EI_policy_offgrid > 4: H2_PTC_offgrid = 0 - - #H2_PTC = ren_frac * H2_PTC_offgrid + (elec_cf - ren_frac) * H2_PTC_grid - H2_PTC = ren_frac * H2_PTC_offgrid + (1 - ren_frac) * H2_PTC_grid + ITC = 0.0 + + elif policy_option == 'max': + + if electrolysis_total_EI_policy_grid[year] <= 0.45: # kg CO2e/kg H2 + H2_PTC_grid = 3 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 0.45 and electrolysis_total_EI_policy_grid[year] <= 1.5: # kg CO2e/kg H2 + H2_PTC_grid = 1 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 1.5 and electrolysis_total_EI_policy_grid[year] <= 2.5: # kg CO2e/kg H2 + H2_PTC_grid = 0.75 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 2.5 and electrolysis_total_EI_policy_grid[year] <= 4: # kg CO2e/kg H2 + H2_PTC_grid = 0.6 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 4: + H2_PTC_grid = 0 + + if electrolysis_total_EI_policy_offgrid[year] <= 0.45: # kg CO2e/kg H2 + H2_PTC_offgrid = 3 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 0.45 and electrolysis_total_EI_policy_offgrid[year] <= 1.5: # kg CO2e/kg H2 + H2_PTC_offgrid = 1 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 1.5 and electrolysis_total_EI_policy_offgrid[year] <= 2.5: # kg CO2e/kg H2 + H2_PTC_offgrid = 0.75 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 2.5 and electrolysis_total_EI_policy_offgrid[year] <= 4: # kg CO2e/kg H2 + H2_PTC_offgrid = 0.6 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 4: + H2_PTC_offgrid = 0 + + ITC = 0.5 + + elif policy_option == 'base': + + if electrolysis_total_EI_policy_grid[year] <= 0.45: # kg CO2e/kg H2 + H2_PTC_grid = 0.6 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 0.45 and electrolysis_total_EI_policy_grid[year] <= 1.5: # kg CO2e/kg H2 + H2_PTC_grid = 0.2 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 1.5 and electrolysis_total_EI_policy_grid[year] <= 2.5: # kg CO2e/kg H2 + H2_PTC_grid = 0.15 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 2.5 and electrolysis_total_EI_policy_grid[year] <= 4: # kg CO2e/kg H2 + H2_PTC_grid = 0.12 # $/kg H2 + elif electrolysis_total_EI_policy_grid[year] > 4: + H2_PTC_grid = 0 + + + if electrolysis_total_EI_policy_offgrid[year] <= 0.45: # kg CO2e/kg H2 + H2_PTC_offgrid = 0.6 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 0.45 and electrolysis_total_EI_policy_offgrid[year] <= 1.5: # kg CO2e/kg H2 + H2_PTC_offgrid = 0.2 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 1.5 and electrolysis_total_EI_policy_offgrid[year] <= 2.5: # kg CO2e/kg H2 + H2_PTC_offgrid = 0.15 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 2.5 and electrolysis_total_EI_policy_offgrid[year] <= 4: # kg CO2e/kg H2 + H2_PTC_offgrid = 0.12 # $/kg H2 + elif electrolysis_total_EI_policy_offgrid[year] > 4: + H2_PTC_offgrid = 0 + + ITC = 0.06 + + #H2_PTC = ren_frac * H2_PTC_offgrid + (elec_cf - ren_frac) * H2_PTC_grid + H2_PTC[year] = ren_frac * H2_PTC_offgrid + (1 - ren_frac) * H2_PTC_grid + #combined_PTC[year] = H2_PTC[year]+Ren_PTC[year] # Reassign PTC values to zero for atb year 2035 if atb_year == 2035: # need to clarify with Matt when exactly the H2 PTC would end H2_PTC = 0 Ren_PTC = 0 + ITC = 0.0 if grid_price_scenario == 'retail-flat': elec_price_perkWh = mwh_to_kwh*elec_price # convert $/MWh to $/kWh # Set up ProFAST @@ -359,8 +361,6 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ pf.set_params('capital gains tax rate',0.15) pf.set_params('sell undepreciated cap',True) pf.set_params('tax losses monetized',True) - pf.set_params('annual operating incentive',{"value":H2_PTC + Ren_PTC,"decay":0.00,"sunset years":H2_PTC_duration,'taxable':True}) - #pf.set_params('annual operating incentive',True) pf.set_params('general inflation rate',gen_inflation) pf.set_params('leverage after tax nominal discount rate',0.0824) pf.set_params('debt equity ratio of initial financing',1.38) @@ -426,8 +426,8 @@ def run_profast_for_hydrogen(hopp_dict,electrolyzer_size_mw,H2_Results,\ pf.add_feedstock(name='Grid Electricity Cost',usage=grid_electricity_useage_kWhpkg,unit='$/kWh',cost=grid_prices_interpolated_USDperkwh,escalation=gen_inflation) #---------------------- Add various tax credit incentives ------------------- - #pf.add_incentive(name ='Renewable PTC credit', value=Ren_PTC, decay = 0, sunset_years = Ren_PTC_duration, tax_credit = True) - #pf.add_incentive(name ='Hydrogen PTC credit', value=H2_PTC, decay = 0, sunset_years = H2_PTC_duration, tax_credit = True) + pf.add_incentive(name ='Renewable PTC credit', value=Ren_PTC, decay = 0, sunset_years = Ren_PTC_duration, tax_credit = True) + pf.add_incentive(name ='Hydrogen PTC credit', value=H2_PTC, decay = 0, sunset_years = H2_PTC_duration, tax_credit = True) sol = pf.solve_price()