Spaces:
Build error
Build error
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| import seaborn as sns | |
| def run_analyzer(): | |
| st.title("Hydrogen Production Analyzer") | |
| st.markdown("### AI-Powered Techno-Economic Analysis Tool") | |
| # Create tabs for different analysis sections | |
| tabs = st.tabs(["Input Parameters", "Production Analysis", "Cost Analysis", "Environmental Impact"]) | |
| with tabs[0]: | |
| st.subheader("System Configuration") | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| capacity = st.number_input("Electrolyzer Capacity (MW)", 1.0, 1000.0, 10.0) | |
| efficiency = st.number_input("Efficiency (%)", 50.0, 100.0, 70.0) | |
| lifetime = st.number_input("System Lifetime (years)", 5, 30, 20) | |
| capacity_factor = st.number_input("Capacity Factor (%)", 10.0, 100.0, 90.0) | |
| with col2: | |
| tech_type = st.selectbox("Electrolyzer Technology", | |
| ["Alkaline", "PEM", "Solid Oxide", "AEM"]) | |
| electricity_source = st.selectbox("Electricity Source", | |
| ["Grid Mix", "Solar PV", "Wind", "Nuclear", "Hydropower", "Hybrid Renewable"]) | |
| electricity_cost = st.number_input("Electricity Cost ($/MWh)", 10.0, 200.0, 50.0) | |
| water_cost = st.number_input("Water Cost ($/m³)", 0.5, 10.0, 2.0) | |
| with tabs[1]: | |
| st.subheader("Hydrogen Production Analysis") | |
| # Calculate hydrogen production | |
| operating_hours = capacity_factor / 100 * 8760 # hours per year | |
| energy_consumption = capacity * operating_hours # MWh per year | |
| h2_production_rate = capacity * efficiency / 100 * 18.4 # kg/h for 1 MW at 100% efficiency | |
| annual_h2_production = h2_production_rate * operating_hours # kg per year | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.metric("Annual Hydrogen Production", f"{annual_h2_production/1000:.2f} tonnes") | |
| st.metric("Energy Consumption", f"{energy_consumption:.2f} MWh") | |
| with col2: | |
| st.metric("Average Production Rate", f"{h2_production_rate:.2f} kg/hour") | |
| st.metric("Operating Hours", f"{operating_hours:.0f} hours/year") | |
| # Production over time | |
| st.subheader("Production Forecast") | |
| years = range(1, lifetime + 1) | |
| # Assume slight efficiency degradation over time | |
| degradation_factor = 0.5 # 0.5% per year | |
| yearly_production = [annual_h2_production * (1 - degradation_factor/100 * year) for year in years] | |
| df_production = pd.DataFrame({ | |
| 'Year': years, | |
| 'Production (tonnes)': [p/1000 for p in yearly_production] | |
| }) | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| sns.barplot(x='Year', y='Production (tonnes)', data=df_production, ax=ax, color='#1E88E5') | |
| ax.set_title('Yearly Hydrogen Production Forecast') | |
| ax.set_xlabel('Year of Operation') | |
| ax.set_ylabel('Hydrogen Production (tonnes)') | |
| # Only show every other year on x-axis if more than 10 years | |
| if lifetime > 10: | |
| ax.set_xticks(range(0, lifetime, 2)) | |
| ax.set_xticklabels([str(y) for y in range(1, lifetime+1, 2)]) | |
| st.pyplot(fig) | |
| with tabs[2]: | |
| st.subheader("Cost Analysis") | |
| # Capital costs based on technology type | |
| capex_map = { | |
| "Alkaline": 1000, # $/kW | |
| "PEM": 1400, | |
| "Solid Oxide": 2000, | |
| "AEM": 1200 | |
| } | |
| capex_per_kw = capex_map[tech_type] | |
| total_capex = capacity * 1000 * capex_per_kw # $ (capacity in MW -> kW) | |
| # Operating costs | |
| electricity_opex_annual = electricity_cost * energy_consumption | |
| water_consumption = annual_h2_production * 9 # 9 kg water per kg H2 | |
| water_opex_annual = water_cost * water_consumption / 1000 # Convert to m³ | |
| maintenance_cost = total_capex * 0.03 # 3% of CAPEX per year | |
| labor_cost = 50000 * (1 + capacity/10) # Base + scale factor | |
| total_opex_annual = electricity_opex_annual + water_opex_annual + maintenance_cost + labor_cost | |
| # Financial metrics | |
| discount_rate = 0.08 # 8% | |
| # Calculate NPV and LCOH | |
| cash_flows = [] | |
| total_production = 0 | |
| for year in range(lifetime): | |
| production = yearly_production[year] | |
| total_production += production / (1 + discount_rate)**year | |
| opex = total_opex_annual * (1 + 0.02)**year # 2% inflation on OPEX | |
| if year == 0: | |
| cash_flow = -total_capex - opex | |
| else: | |
| cash_flow = -opex | |
| cash_flows.append(cash_flow) | |
| npv = sum(cf / (1 + discount_rate)**i for i, cf in enumerate(cash_flows)) | |
| lcoh = -npv / total_production # $ per kg | |
| # Display financial metrics | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.metric("Capital Expenditure (CAPEX)", f"${total_capex:,.0f}") | |
| st.metric("Annual Operating Cost (OPEX)", f"${total_opex_annual:,.0f}/year") | |
| with col2: | |
| st.metric("Levelized Cost of Hydrogen (LCOH)", f"${lcoh:.2f}/kg") | |
| simple_payback = total_capex / (annual_h2_production * 3 - total_opex_annual) # Assuming $3/kg H2 sale price | |
| st.metric("Simple Payback Period", f"{simple_payback:.1f} years") | |
| # Cost breakdown | |
| st.subheader("Annual Cost Breakdown") | |
| cost_data = { | |
| 'Category': ['Electricity', 'Water', 'Maintenance', 'Labor'], | |
| 'Cost ($)': [electricity_opex_annual, water_opex_annual, maintenance_cost, labor_cost] | |
| } | |
| df_costs = pd.DataFrame(cost_data) | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| colors = ['#1E88E5', '#0F9D58', '#FFC107', '#E53935'] | |
| explode = (0.1, 0, 0, 0) # Explode electricity slice | |
| ax.pie(df_costs['Cost ($)'], labels=df_costs['Category'], autopct='%1.1f%%', | |
| startangle=90, colors=colors, explode=explode, shadow=True) | |
| ax.axis('equal') | |
| st.pyplot(fig) | |
| # LCOH Sensitivity Analysis | |
| st.subheader("LCOH Sensitivity Analysis") | |
| # Create sensitivity data | |
| electricity_range = np.linspace(electricity_cost * 0.5, electricity_cost * 1.5, 5) | |
| capex_range = np.linspace(capex_per_kw * 0.5, capex_per_kw * 1.5, 5) | |
| sensitivity_data = [] | |
| for e_cost in electricity_range: | |
| for c_cost in capex_range: | |
| # Recalculate with new parameters | |
| new_total_capex = capacity * 1000 * c_cost | |
| new_electricity_opex = e_cost * energy_consumption | |
| new_total_opex = new_electricity_opex + water_opex_annual + new_total_capex * 0.03 + labor_cost | |
| # Simple LCOH calculation for sensitivity | |
| new_lcoh = (new_total_capex / lifetime + new_total_opex) / annual_h2_production | |
| sensitivity_data.append({ | |
| 'Electricity Cost ($/MWh)': e_cost, | |
| 'CAPEX ($/kW)': c_cost, | |
| 'LCOH ($/kg)': new_lcoh | |
| }) | |
| df_sensitivity = pd.DataFrame(sensitivity_data) | |
| pivot_table = df_sensitivity.pivot_table( | |
| values='LCOH ($/kg)', | |
| index='Electricity Cost ($/MWh)', | |
| columns='CAPEX ($/kW)' | |
| ) | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| sns.heatmap(pivot_table, annot=True, fmt=".2f", cmap="YlGnBu", ax=ax) | |
| ax.set_title('LCOH Sensitivity ($/kg)') | |
| st.pyplot(fig) | |
| with tabs[3]: | |
| st.subheader("Environmental Impact Analysis") | |
| # Emissions factors by electricity source (kg CO2e/MWh) | |
| emissions_factors = { | |
| "Grid Mix": 400, | |
| "Solar PV": 40, | |
| "Wind": 11, | |
| "Nuclear": 12, | |
| "Hydropower": 24, | |
| "Hybrid Renewable": 30 | |
| } | |
| emissions_factor = emissions_factors[electricity_source] | |
| # Calculate emissions | |
| total_emissions = energy_consumption * emissions_factor | |
| emission_intensity = total_emissions / annual_h2_production | |
| # Water consumption | |
| water_intensity = water_consumption / annual_h2_production | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.metric("Carbon Intensity", f"{emission_intensity:.2f} kg CO₂e/kg H₂") | |
| st.metric("Annual CO₂ Emissions", f"{total_emissions/1000:.2f} tonnes CO₂e") | |
| with col2: | |
| st.metric("Water Intensity", f"{water_intensity:.2f} kg H₂O/kg H₂") | |
| st.metric("Annual Water Consumption", f"{water_consumption/1000:.2f} m³") | |
| # Comparison with other production methods | |
| st.subheader("Carbon Intensity Comparison") | |
| comparison_data = { | |
| 'Production Method': ['Your Configuration', 'SMR without CCS', 'SMR with CCS', 'Coal Gasification'], | |
| 'Carbon Intensity (kg CO₂e/kg H₂)': [emission_intensity, 9.0, 2.5, 19.0] | |
| } | |
| df_comparison = pd.DataFrame(comparison_data) | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| bars = sns.barplot(x='Production Method', y='Carbon Intensity (kg CO₂e/kg H₂)', | |
| data=df_comparison, ax=ax, palette=['#0F9D58', '#E53935', '#FFC107', '#1E88E5']) | |
| # Add value labels | |
| for i, bar in enumerate(bars.patches): | |
| bars.text(bar.get_x() + bar.get_width()/2., | |
| bar.get_height() + 0.3, | |
| f"{df_comparison['Carbon Intensity (kg CO₂e/kg H₂)'][i]:.1f}", | |
| ha='center', va='bottom', color='black') | |
| ax.set_title('Carbon Intensity Comparison') | |
| ax.set_ylabel('kg CO₂e per kg H₂') | |
| ax.set_ylim(0, max(df_comparison['Carbon Intensity (kg CO₂e/kg H₂)']) * 1.2) | |
| st.pyplot(fig) | |
| if __name__ == "__main__": | |
| run_analyzer() | |