diff --git a/src/geophires_sam_economics/Generic_400_MWe.sam b/src/geophires_sam_economics/Generic_400_MWe.sam index b1972ad1..410b9534 100644 Binary files a/src/geophires_sam_economics/Generic_400_MWe.sam and b/src/geophires_sam_economics/Generic_400_MWe.sam differ diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index 9f1f8f42..821aaed2 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -6,7 +6,7 @@ from geophires_x import EconomicsSam from geophires_x.EconomicsSam import calculate_sam_economics, SamEconomicsCalculations from geophires_x.EconomicsUtils import BuildPricingModel, wacc_output_parameter, nominal_discount_rate_parameter, \ - real_discount_rate_parameter + real_discount_rate_parameter, after_tax_irr_parameter from geophires_x.OptionList import Configuration, WellDrillingCostCorrelation, EconomicModel, EndUseOptions, PlantType, \ _WellDrillingCostCorrelationCitation from geophires_x.Parameter import intParameter, floatParameter, OutputParameter, ReadParameter, boolParameter, \ @@ -884,7 +884,7 @@ def __init__(self, model: Model): PreferredUnits=PercentUnit.TENTH, CurrentUnits=PercentUnit.TENTH, ErrMessage="assume default fraction of investment in bonds (0.5)", - ToolTipText="Fraction of geothermal project financing through bonds (see docs)" + ToolTipText="Fraction of geothermal project financing through bonds (debt)." ) self.BIR = self.ParameterDict[self.BIR.Name] = floatParameter( "Inflated Bond Interest Rate", @@ -1581,12 +1581,19 @@ def __init__(self, model: Model): PreferredUnits=CurrencyUnit.MDOLLARS, CurrentUnits=CurrencyUnit.MDOLLARS ) + + # See TODO re:parameterizing indirect costs at src/geophires_x/Economics.py:652 + # (https://github.com/NREL/GEOPHIRES-X/issues/383) self.Cexpl = self.OutputParameterDict[self.Cexpl.Name] = OutputParameter( Name="Exploration cost", display_name='Exploration costs', UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, - CurrentUnits=CurrencyUnit.MDOLLARS + CurrentUnits=CurrencyUnit.MDOLLARS, + ToolTipText=f'Default correlation: 60% of the cost of one production well plus 15% contingency ' + f'plus 12% indirect costs. ' + f'Provide {self.ccexpladjfactor.Name} to multiply the default correlation. ' + f'Provide {self.ccexplfixed.Name} to override the default correlation and set your own cost.' ) self.Cwell = self.OutputParameterDict[self.Cwell.Name] = OutputParameter( @@ -1597,6 +1604,7 @@ def __init__(self, model: Model): CurrentUnits=CurrencyUnit.MDOLLARS, # See TODO re:parameterizing indirect costs at src/geophires_x/Economics.py:652 + # (https://github.com/NREL/GEOPHIRES-X/issues/383) ToolTipText="Includes total drilling and completion cost of all injection and production wells and " "laterals, plus 5% indirect costs." ) @@ -1776,6 +1784,8 @@ def __init__(self, model: Model): CurrentUnits=PercentUnit.PERCENT ) + self.after_tax_irr = self.OutputParameterDict[self.after_tax_irr.Name] = ( + after_tax_irr_parameter()) self.real_discount_rate = self.OutputParameterDict[self.real_discount_rate.Name] = ( real_discount_rate_parameter()) self.nominal_discount_rate = self.OutputParameterDict[self.nominal_discount_rate.Name] = ( @@ -2767,7 +2777,9 @@ def Calculate(self, model: Model) -> None: self.nominal_discount_rate.value = self.sam_economics_calculations.nominal_discount_rate.value self.ProjectNPV.value = self.sam_economics_calculations.project_npv.quantity().to( convertible_unit(self.ProjectNPV.CurrentUnits)).magnitude - self.ProjectIRR.value = self.sam_economics_calculations.project_irr.quantity().to( + + self.ProjectIRR.value = non_calculated_output_placeholder_val # SAM calculates After-Tax IRR instead + self.after_tax_irr.value = self.sam_economics_calculations.after_tax_irr.quantity().to( convertible_unit(self.ProjectIRR.CurrentUnits)).magnitude self.ProjectVIR.value = non_calculated_output_placeholder_val # TODO SAM VIR diff --git a/src/geophires_x/EconomicsSam.py b/src/geophires_x/EconomicsSam.py index 00e59d14..d2ddd18e 100644 --- a/src/geophires_x/EconomicsSam.py +++ b/src/geophires_x/EconomicsSam.py @@ -27,7 +27,12 @@ from geophires_x import Model as Model from geophires_x.EconomicsSamCashFlow import _calculate_sam_economics_cash_flow -from geophires_x.EconomicsUtils import BuildPricingModel, wacc_output_parameter, nominal_discount_rate_parameter +from geophires_x.EconomicsUtils import ( + BuildPricingModel, + wacc_output_parameter, + nominal_discount_rate_parameter, + after_tax_irr_parameter, +) from geophires_x.GeoPHIRESUtils import is_float, is_int from geophires_x.OptionList import EconomicModel, EndUseOptions from geophires_x.Parameter import Parameter, OutputParameter, floatParameter @@ -44,24 +49,22 @@ class SamEconomicsCalculations: CurrentUnits=EnergyCostUnit.CENTSSPERKWH, ) ) + capex: OutputParameter = field( default_factory=lambda: OutputParameter( UnitType=Units.CURRENCY, CurrentUnits=CurrencyUnit.MDOLLARS, ) ) + project_npv: OutputParameter = field( default_factory=lambda: OutputParameter( UnitType=Units.CURRENCY, CurrentUnits=CurrencyUnit.MDOLLARS, ) ) - project_irr: OutputParameter = field( - default_factory=lambda: OutputParameter( - UnitType=Units.PERCENT, - CurrentUnits=PercentUnit.PERCENT, - ) - ) + + after_tax_irr: OutputParameter = field(default_factory=after_tax_irr_parameter) nominal_discount_rate: OutputParameter = field(default_factory=nominal_discount_rate_parameter) @@ -157,7 +160,7 @@ def sf(_v: float) -> float: sam_economics: SamEconomicsCalculations = SamEconomicsCalculations(sam_cash_flow_profile=cash_flow) sam_economics.lcoe_nominal.value = sf(single_owner.Outputs.lcoe_nom) - sam_economics.project_irr.value = sf(single_owner.Outputs.project_return_aftertax_irr) + sam_economics.after_tax_irr.value = sf(single_owner.Outputs.project_return_aftertax_irr) sam_economics.project_npv.value = sf(single_owner.Outputs.project_return_aftertax_npv * 1e-6) sam_economics.capex.value = single_owner.Outputs.adjusted_installed_cost * 1e-6 diff --git a/src/geophires_x/EconomicsUtils.py b/src/geophires_x/EconomicsUtils.py index 03ad6d26..0df75e9a 100644 --- a/src/geophires_x/EconomicsUtils.py +++ b/src/geophires_x/EconomicsUtils.py @@ -37,27 +37,39 @@ def BuildPricingModel(plantlifetime: int, StartPrice: float, EndPrice: float, return Price +def after_tax_irr_parameter() -> OutputParameter: + return OutputParameter( + Name='After-Tax IRR', + UnitType=Units.PERCENT, + CurrentUnits=PercentUnit.PERCENT, + PreferredUnits=PercentUnit.PERCENT, + ToolTipText='The After-Tax IRR (internal rate of return) is the nominal discount rate that corresponds to ' + 'a net present value (NPV) of zero for PPA SAM Economic models. ' + 'See https://samrepo.nrelcloud.org/help/mtf_irr.html.' + ) + + def real_discount_rate_parameter() -> OutputParameter: return OutputParameter( - Name="Real Discount Rate", - UnitType=Units.PERCENT, - CurrentUnits=PercentUnit.PERCENT, - PreferredUnits=PercentUnit.PERCENT, - ) + Name="Real Discount Rate", + UnitType=Units.PERCENT, + CurrentUnits=PercentUnit.PERCENT, + PreferredUnits=PercentUnit.PERCENT, + ) def nominal_discount_rate_parameter() -> OutputParameter: return OutputParameter( - Name="Nominal Discount Rate", - ToolTipText="Nominal Discount Rate is displayed for SAM Economic Models. " - "It is calculated " - "per https://samrepo.nrelcloud.org/help/fin_single_owner.html?q=nominal+discount+rate: " - "Nominal Discount Rate = [ ( 1 + Real Discount Rate ÷ 100 ) " - "× ( 1 + Inflation Rate ÷ 100 ) - 1 ] × 100.", - UnitType=Units.PERCENT, - CurrentUnits=PercentUnit.PERCENT, - PreferredUnits=PercentUnit.PERCENT, - ) + Name="Nominal Discount Rate", + ToolTipText="Nominal Discount Rate is displayed for SAM Economic Models. " + "It is calculated " + "per https://samrepo.nrelcloud.org/help/fin_single_owner.html?q=nominal+discount+rate: " + "Nominal Discount Rate = [ ( 1 + Real Discount Rate ÷ 100 ) " + "× ( 1 + Inflation Rate ÷ 100 ) - 1 ] × 100.", + UnitType=Units.PERCENT, + CurrentUnits=PercentUnit.PERCENT, + PreferredUnits=PercentUnit.PERCENT, + ) def wacc_output_parameter() -> OutputParameter: diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 75ab9b76..e5c144c9 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -1,4 +1,5 @@ import datetime +import math import time import sys from pathlib import Path @@ -274,7 +275,12 @@ def PrintOutputs(self, model: Model): # TODO should use CurrentUnits instead of PreferredUnits f.write(f' {npv_field_label}{e_npv.value:10.2f} {e_npv.PreferredUnits.value}\n') - f.write(f' {econ.ProjectIRR.display_name}: {econ.ProjectIRR.value:10.2f} {econ.ProjectIRR.PreferredUnits.value}\n') + irr_output_param: OutputParameter = econ.ProjectIRR \ + if econ.econmodel.value != EconomicModel.SAM_SINGLE_OWNER_PPA else econ.after_tax_irr + irr_field_label = Outputs._field_label(irr_output_param.display_name, 49) + irr_display_value = f'{irr_output_param.value:10.2f}' \ + if not math.isnan(irr_output_param.value) else 'NaN' + f.write(f' {irr_field_label}{irr_display_value} {irr_output_param.CurrentUnits.value}\n') if econ.econmodel.value != EconomicModel.SAM_SINGLE_OWNER_PPA: # VIR, MOIC, and Payback period not currently supported by SAM economic model(s) diff --git a/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe.json b/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe.json index 0c331bf9..d7cf47e5 100644 --- a/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe.json +++ b/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe.json @@ -220,7 +220,7 @@ "pbi_oth_escal" : 0, "pbi_oth_tax_fed" : 1, "pbi_oth_tax_sta" : 1, - "term_tenor" : 30, + "term_tenor" : 20, "term_int_rate" : 5, "dscr" : 1.05, "dscr_limit_debt_fraction" : 0, diff --git a/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe_singleowner.json b/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe_singleowner.json index fd159a64..a53bcf19 100644 --- a/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe_singleowner.json +++ b/src/geophires_x/sam_economics/Generic_400_MWe/Generic_400_MWe_singleowner.json @@ -172,7 +172,7 @@ "pbi_oth_escal" : 0, "pbi_oth_tax_fed" : 1, "pbi_oth_tax_sta" : 1, - "term_tenor" : 30, + "term_tenor" : 20, "term_int_rate" : 5, "dscr" : 1.05, "dscr_limit_debt_fraction" : 0, diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index 71665351..7f5f4d3c 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -862,8 +862,8 @@ def _parse_number(self, number_str, field='string') -> int | float: return None try: - number_str = number_str.replace(',', '') - if '.' in number_str: + number_str = number_str.replace(',', '').lower() + if '.' in number_str or number_str == 'nan': # TODO should probably ideally use decimal.Decimal to preserve precision, # i.e. 1.00 for USD instead of 1.0 return float(number_str) diff --git a/src/geophires_x_schema_generator/geophires-request.json b/src/geophires_x_schema_generator/geophires-request.json index 21fc70ac..41224f7b 100644 --- a/src/geophires_x_schema_generator/geophires-request.json +++ b/src/geophires_x_schema_generator/geophires-request.json @@ -1595,7 +1595,7 @@ "maximum": null }, "Fraction of Investment in Bonds": { - "description": "Fraction of geothermal project financing through bonds (see docs)", + "description": "Fraction of geothermal project financing through bonds (debt).", "type": "number", "units": "", "category": "Economics", diff --git a/src/geophires_x_schema_generator/geophires-result.json b/src/geophires_x_schema_generator/geophires-result.json index 936e8f50..12cfb6c9 100644 --- a/src/geophires_x_schema_generator/geophires-result.json +++ b/src/geophires_x_schema_generator/geophires-result.json @@ -362,7 +362,7 @@ "Total surface equipment costs": {}, "Exploration costs": { "type": "number", - "description": "Exploration cost", + "description": "Exploration cost. Default correlation: 60% of the cost of one production well plus 15% contingency plus 12% indirect costs. Provide Exploration Capital Cost Adjustment Factor to multiply the default correlation. Provide Exploration Capital Cost to override the default correlation and set your own cost.", "units": "MUSD" }, "Investment Tax Credit": { diff --git a/tests/examples/Fervo_Project_Cape-4.out b/tests/examples/Fervo_Project_Cape-4.out new file mode 100644 index 00000000..33113a2c --- /dev/null +++ b/tests/examples/Fervo_Project_Cape-4.out @@ -0,0 +1,409 @@ + ***************** + ***CASE REPORT*** + ***************** + +Simulation Metadata +---------------------- + GEOPHIRES Version: 3.9.7 + Simulation Date: 2025-05-21 + Simulation Time: 09:51 + Calculation Time: 1.041 sec + + ***SUMMARY OF RESULTS*** + + End-Use Option: Electricity + Average Net Electricity Production: 522.55 MW + Electricity breakeven price: 8.67 cents/kWh + Number of production wells: 48 + Number of injection wells: 48 + Flowrate per production well: 120.0 kg/sec + Well depth: 2.6 kilometer + Geothermal gradient: 74 degC/km + + + ***ECONOMIC PARAMETERS*** + + Economic Model = SAM Single Owner PPA + Real Discount Rate: 8.00 % + Nominal Discount Rate: 10.16 % + WACC: 8.86 % + Accrued financing during construction: 5.00 % + Project lifetime: 20 yr + Capacity factor: 90.0 % + Project NPV: 1940.10 MUSD + After-Tax IRR: 24.75 % + Estimated Jobs Created: 1190 + + ***ENGINEERING PARAMETERS*** + + Number of Production Wells: 48 + Number of Injection Wells: 48 + Well depth: 2.6 kilometer + Water loss rate: 10.0 % + Pump efficiency: 80.0 % + Injection temperature: 56.7 degC + Production Wellbore heat transmission calculated with Ramey's model + Average production well temperature drop: 1.6 degC + Flowrate per production well: 120.0 kg/sec + Injection well casing ID: 9.625 in + Production well casing ID: 9.625 in + Number of times redrilling: 1 + Power plant type: Supercritical ORC + + + ***RESOURCE CHARACTERISTICS*** + + Maximum reservoir temperature: 500.0 degC + Number of segments: 1 + Geothermal gradient: 74 degC/km + + + ***RESERVOIR PARAMETERS*** + + Reservoir Model = Multiple Parallel Fractures Model + Bottom-hole temperature: 201.72 degC + Fracture model = Rectangular + Well separation: fracture height: 1400.00 meter + Fracture width: 1400.00 meter + Fracture area: 1960000.00 m**2 + Reservoir volume calculated with fracture separation and number of fractures as input + Number of fractures: 149.00 + Fracture separation: 30.00 meter + Reservoir volume: 8702400000 m**3 + Reservoir impedance: 0.0010 GPa.s/m**3 + Reservoir density: 2800.00 kg/m**3 + Reservoir thermal conductivity: 3.05 W/m/K + Reservoir heat capacity: 790.00 J/kg/K + + + ***RESERVOIR SIMULATION RESULTS*** + + Maximum Production Temperature: 199.8 degC + Average Production Temperature: 199.3 degC + Minimum Production Temperature: 196.8 degC + Initial Production Temperature: 198.6 degC + Average Reservoir Heat Extraction: 3440.59 MW + Production Wellbore Heat Transmission Model = Ramey Model + Average Production Well Temperature Drop: 1.6 degC + Total Average Pressure Drop: 4534.4 kPa + Average Injection Well Pressure Drop: 690.9 kPa + Average Reservoir Pressure Drop: 6048.4 kPa + Average Production Well Pressure Drop: 633.4 kPa + Average Buoyancy Pressure Drop: -2838.3 kPa + + + ***CAPITAL COSTS (M$)*** + + Drilling and completion costs: 368.64 MUSD + Drilling and completion costs per well: 3.84 MUSD + Stimulation costs: 287.63 MUSD + Surface power plant costs: 1533.02 MUSD + Field gathering system costs: 68.66 MUSD + Total surface equipment costs: 1601.68 MUSD + Exploration costs: 30.00 MUSD + Investment Tax Credit: -686.38 MUSD + Total capital costs: 1601.56 MUSD + + + ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** + + Wellfield maintenance costs: 5.32 MUSD/yr + Power plant maintenance costs: 25.82 MUSD/yr + Water costs: 15.12 MUSD/yr + Total operating and maintenance costs: 79.07 MUSD/yr + + + ***SURFACE EQUIPMENT SIMULATION RESULTS*** + + Initial geofluid availability: 0.19 MW/(kg/s) + Maximum Total Electricity Generation: 562.37 MW + Average Total Electricity Generation: 558.74 MW + Minimum Total Electricity Generation: 541.76 MW + Initial Total Electricity Generation: 554.02 MW + Maximum Net Electricity Generation: 526.30 MW + Average Net Electricity Generation: 522.55 MW + Minimum Net Electricity Generation: 504.99 MW + Initial Net Electricity Generation: 517.86 MW + Average Annual Total Electricity Generation: 4405.08 GWh + Average Annual Net Electricity Generation: 4119.78 GWh + Initial pumping power/net installed power: 6.98 % + Average Pumping Power: 36.19 MW + Heat to Power Conversion Efficiency: 15.19 % + + ************************************************************ + * HEATING, COOLING AND/OR ELECTRICITY PRODUCTION PROFILE * + ************************************************************ + YEAR THERMAL GEOFLUID PUMP NET FIRST LAW + DRAWDOWN TEMPERATURE POWER POWER EFFICIENCY + (degC) (MW) (MW) (%) + 1 1.0000 198.60 36.1596 517.8646 15.1241 + 2 1.0046 199.51 36.1111 524.1605 15.2109 + 3 1.0054 199.67 36.1022 525.3153 15.2267 + 4 1.0058 199.76 36.0978 525.9092 15.2349 + 5 1.0061 199.80 36.0969 526.2326 15.2392 + 6 1.0060 199.80 36.1052 526.1784 15.2384 + 7 1.0055 199.69 36.1331 525.4345 15.2279 + 8 1.0042 199.43 36.1946 523.5582 15.2014 + 9 1.0017 198.94 36.3057 520.0266 15.1515 + 10 0.9976 198.13 36.4833 514.2910 15.0699 + 11 0.9916 196.93 36.7432 505.8337 14.9483 + 12 1.0043 199.46 36.0805 523.8583 15.2073 + 13 1.0053 199.65 36.0777 525.2054 15.2256 + 14 1.0058 199.75 36.0746 525.8539 15.2345 + 15 1.0060 199.80 36.0725 526.2231 15.2395 + 16 1.0061 199.80 36.0769 526.2509 15.2398 + 17 1.0056 199.72 36.0981 525.6523 15.2314 + 18 1.0045 199.49 36.1498 524.0026 15.2081 + 19 1.0022 199.04 36.2481 520.7885 15.1628 + 20 0.9984 198.29 36.4100 515.4612 15.0872 + + + ******************************************************************* + * ANNUAL HEATING, COOLING AND/OR ELECTRICITY PRODUCTION PROFILE * + ******************************************************************* + YEAR ELECTRICITY HEAT RESERVOIR PERCENTAGE OF + PROVIDED EXTRACTED HEAT CONTENT TOTAL HEAT MINED + (GWh/year) (GWh/year) (10^15 J) (%) + 1 4116.2 27111.6 2572.70 3.66 + 2 4137.7 27185.9 2474.83 7.32 + 3 4144.1 27208.3 2376.88 10.99 + 4 4147.7 27220.7 2278.89 14.66 + 5 4148.9 27225.0 2180.88 18.33 + 6 4146.0 27215.4 2082.90 22.00 + 7 4136.0 27181.7 1985.05 25.66 + 8 4115.1 27110.8 1887.45 29.32 + 9 4078.9 26988.1 1790.29 32.96 + 10 4023.3 26798.8 1693.82 36.57 + 11 4096.1 27042.1 1596.47 40.21 + 12 4136.2 27180.2 1498.62 43.88 + 13 4143.5 27205.4 1400.68 47.55 + 14 4147.5 27219.2 1302.69 51.22 + 15 4149.1 27225.1 1204.68 54.89 + 16 4147.1 27218.4 1106.69 58.56 + 17 4138.6 27189.5 1008.81 62.22 + 18 4119.8 27125.8 911.16 65.88 + 19 4086.5 27012.8 813.91 69.52 + 20 4037.1 26845.0 717.27 73.14 + + *************************** + * SAM CASH FLOW PROFILE * + *************************** +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Year 0 Year 1 Year 2 Year 3 Year 4 Year 5 Year 6 Year 7 Year 8 Year 9 Year 10 Year 11 Year 12 Year 13 Year 14 Year 15 Year 16 Year 17 Year 18 Year 19 Year 20 +ENERGY +Electricity to grid (kWh) 0.0 4,116,398,851 4,137,819,399 4,144,281,104 4,147,876,305 4,149,085,882 4,146,192,382 4,136,184,234 4,115,222,031 4,079,044,274 4,023,409,688 4,096,272,590 4,136,400,237 4,143,656,480 4,147,609,239 4,149,300,407 4,147,288,763 4,138,737,927 4,119,917,007 4,086,603,102 4,037,266,598 +Electricity from grid (kWh) 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +Electricity to grid net (kWh) 0.0 4,116,398,851 4,137,819,399 4,144,281,104 4,147,876,305 4,149,085,882 4,146,192,382 4,136,184,234 4,115,222,031 4,079,044,274 4,023,409,688 4,096,272,590 4,136,400,237 4,143,656,480 4,147,609,239 4,149,300,407 4,147,288,763 4,138,737,927 4,119,917,007 4,086,603,102 4,037,266,598 + +REVENUE +PPA price (cents/kWh) 0.0 12.0 12.0 12.41 12.81 13.22 13.62 14.03 14.43 14.84 15.24 15.65 16.05 16.46 16.86 17.27 17.67 18.08 18.49 18.89 19.30 +PPA revenue ($) 0 493,967,862 496,538,328 514,111,428 531,369,692 548,341,817 564,764,855 580,166,493 593,906,119 605,218,245 613,271,376 640,980,667 664,025,554 681,985,579 699,447,331 716,550,567 733,013,058 748,276,968 761,573,119 771,978,905 779,022,945 +Curtailment payment revenue ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Capacity payment revenue ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Salvage value ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1,201,171,892 +Total revenue ($) 0 493,967,862 496,538,328 514,111,428 531,369,692 548,341,817 564,764,855 580,166,493 593,906,119 605,218,245 613,271,376 640,980,667 664,025,554 681,985,579 699,447,331 716,550,567 733,013,058 748,276,968 761,573,119 771,978,905 1,980,194,836 + +Property tax net assessed value ($) 0 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 2,402,343,783 + +OPERATING EXPENSES +O&M fixed expense ($) 0 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 +O&M production-based expense ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +O&M capacity-based expense ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Fuel expense ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Electricity purchase ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Property tax expense ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Insurance expense ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Total operating expenses ($) 0 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 79,071,975 + +EBITDA ($) 0 414,895,887 417,466,353 435,039,453 452,297,717 469,269,842 485,692,880 501,094,519 514,834,144 526,146,270 534,199,401 561,908,692 584,953,579 602,913,604 620,375,356 637,478,592 653,941,083 669,204,993 682,501,144 692,906,930 1,901,122,861 + +OPERATING ACTIVITIES +EBITDA ($) 0 414,895,887 417,466,353 435,039,453 452,297,717 469,269,842 485,692,880 501,094,519 514,834,144 526,146,270 534,199,401 561,908,692 584,953,579 602,913,604 620,375,356 637,478,592 653,941,083 669,204,993 682,501,144 692,906,930 1,901,122,861 +Interest earned on reserves ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +plus PBI if not available for debt service: +Federal PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Utility PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Other PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Debt interest payment ($) 0 24,023,438 23,296,907 22,534,049 21,733,049 20,891,999 20,008,896 19,081,638 18,108,017 17,085,715 16,012,298 14,885,210 13,701,768 12,459,153 11,154,408 9,784,426 8,345,944 6,835,539 5,249,613 3,584,391 1,835,907 +Cash flow from operating activities ($) 0 390,872,449 394,169,446 412,505,404 430,564,668 448,377,843 465,683,984 482,012,881 496,726,127 509,060,555 518,187,103 547,023,482 571,251,812 590,454,450 609,220,947 627,694,166 645,595,139 662,369,454 677,251,531 689,322,539 1,899,286,954 + +INVESTING ACTIVITIES +Total installed cost ($) -2,402,343,783 +Debt closing costs ($) 0 +Debt up-front fee ($) 0 +minus: +Total IBI income ($) 0 +Total CBI income ($) 0 +equals: +Purchase of property ($) -2,402,343,783 +plus: +Reserve (increase)/decrease debt service ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve (increase)/decrease working capital ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve (increase)/decrease receivables ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve (increase)/decrease major equipment 1 ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve (increase)/decrease major equipment 2 ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve (increase)/decrease major equipment 3 ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve capital spending major equipment 1 ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve capital spending major equipment 2 ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserve capital spending major equipment 3 ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +equals: +Cash flow from investing activities ($) -2,402,343,783 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +FINANCING ACTIVITIES +Issuance of equity ($) 1,921,875,027 +Size of debt ($) 480,468,757 +minus: +Debt principal payment ($) 0 14,530,618 15,257,149 16,020,007 16,821,007 17,662,057 18,545,160 19,472,418 20,446,039 21,468,341 22,541,758 23,668,846 24,852,288 26,094,903 27,399,648 28,769,630 30,208,112 31,718,517 33,304,443 34,969,665 36,718,149 +equals: +Cash flow from financing activities ($) 2,402,343,783 -14,530,618 -15,257,149 -16,020,007 -16,821,007 -17,662,057 -18,545,160 -19,472,418 -20,446,039 -21,468,341 -22,541,758 -23,668,846 -24,852,288 -26,094,903 -27,399,648 -28,769,630 -30,208,112 -31,718,517 -33,304,443 -34,969,665 -36,718,149 + +PROJECT RETURNS +Pre-tax Cash Flow: +Cash flow from operating activities ($) 0 390,872,449 394,169,446 412,505,404 430,564,668 448,377,843 465,683,984 482,012,881 496,726,127 509,060,555 518,187,103 547,023,482 571,251,812 590,454,450 609,220,947 627,694,166 645,595,139 662,369,454 677,251,531 689,322,539 1,899,286,954 +Cash flow from investing activities ($) -2,402,343,783 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Cash flow from financing activities ($) 2,402,343,783 -14,530,618 -15,257,149 -16,020,007 -16,821,007 -17,662,057 -18,545,160 -19,472,418 -20,446,039 -21,468,341 -22,541,758 -23,668,846 -24,852,288 -26,094,903 -27,399,648 -28,769,630 -30,208,112 -31,718,517 -33,304,443 -34,969,665 -36,718,149 +Total pre-tax cash flow ($) 0 376,341,831 378,912,297 396,485,397 413,743,661 430,715,786 447,138,824 462,540,462 476,280,088 487,592,214 495,645,345 523,354,636 546,399,523 564,359,548 581,821,299 598,924,536 615,387,027 630,650,936 643,947,088 654,352,874 1,862,568,805 + +Pre-tax Returns: +Issuance of equity ($) 1,921,875,027 +Total pre-tax cash flow ($) 0 376,341,831 378,912,297 396,485,397 413,743,661 430,715,786 447,138,824 462,540,462 476,280,088 487,592,214 495,645,345 523,354,636 546,399,523 564,359,548 581,821,299 598,924,536 615,387,027 630,650,936 643,947,088 654,352,874 1,862,568,805 +Total pre-tax returns ($) -1,921,875,027 376,341,831 378,912,297 396,485,397 413,743,661 430,715,786 447,138,824 462,540,462 476,280,088 487,592,214 495,645,345 523,354,636 546,399,523 564,359,548 581,821,299 598,924,536 615,387,027 630,650,936 643,947,088 654,352,874 1,862,568,805 + +After-tax Returns: +Total pre-tax returns ($) -1,921,875,027 376,341,831 378,912,297 396,485,397 413,743,661 430,715,786 447,138,824 462,540,462 476,280,088 487,592,214 495,645,345 523,354,636 546,399,523 564,359,548 581,821,299 598,924,536 615,387,027 630,650,936 643,947,088 654,352,874 1,862,568,805 +Federal ITC total income ($) 0 720,703,135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Federal PTC income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Federal tax benefit (liability) ($) 0 -66,367,362 -57,041,239 -60,622,251 -64,149,226 -67,628,139 -71,008,028 -74,197,062 -77,070,559 -79,479,472 -81,261,887 -86,893,632 -91,625,425 -95,375,700 -99,040,797 -102,648,617 -106,144,677 -109,420,700 -112,327,170 -114,684,638 -350,990,688 +State ITC total income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State PTC income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State tax benefit (liability) ($) 0 -23,787,585 -20,444,888 -21,728,405 -22,992,554 -24,239,476 -25,450,906 -26,593,929 -27,623,856 -28,487,266 -29,126,124 -31,144,671 -32,840,654 -34,184,839 -35,498,494 -36,791,619 -38,044,687 -39,218,889 -40,260,634 -41,105,605 -125,803,114 +Total after-tax returns ($) -1,921,875,027 1,006,890,019 301,426,170 314,134,740 326,601,881 338,848,171 350,679,890 361,749,472 371,585,673 379,625,476 385,257,333 405,316,333 421,933,444 434,799,009 447,282,009 459,484,300 471,197,664 482,011,347 491,359,283 498,562,631 1,385,775,003 + +After-tax cumulative IRR (%) NaN -47.61 -26.32 -10.0 0.71 7.72 12.43 15.67 17.96 19.60 20.80 21.73 22.43 22.98 23.40 23.73 23.99 24.19 24.35 24.48 24.75 +After-tax cumulative NPV ($) -1,921,875,027 -1,007,849,955 -759,460,531 -524,473,342 -302,693,039 -93,818,498 102,412,358 286,167,887 457,511,351 616,417,244 762,807,322 902,614,962 1,034,731,390 1,158,319,728 1,273,730,527 1,381,355,181 1,481,544,239 1,574,580,125 1,660,673,251 1,739,971,775 1,940,056,612 + +AFTER-TAX LCOE AND PPA PRICE +Annual costs ($) -1,921,875,027 512,922,156 -195,112,158 -199,976,688 -204,767,811 -209,493,646 -214,084,965 -218,417,022 -222,320,446 -225,592,770 -228,014,043 -235,664,334 -242,092,110 -247,186,570 -252,165,322 -257,066,267 -261,815,395 -266,265,620 -270,213,835 -273,416,274 606,752,058 +PPA revenue ($) 0 493,967,862 496,538,328 514,111,428 531,369,692 548,341,817 564,764,855 580,166,493 593,906,119 605,218,245 613,271,376 640,980,667 664,025,554 681,985,579 699,447,331 716,550,567 733,013,058 748,276,968 761,573,119 771,978,905 779,022,945 +Electricity to grid (kWh) 0.0 4,116,398,851 4,137,819,399 4,144,281,104 4,147,876,305 4,149,085,882 4,146,192,382 4,136,184,234 4,115,222,031 4,079,044,274 4,023,409,688 4,096,272,590 4,136,400,237 4,143,656,480 4,147,609,239 4,149,300,407 4,147,288,763 4,138,737,927 4,119,917,007 4,086,603,102 4,037,266,598 + +Present value of annual costs ($) 3,012,069,942 +Present value of annual energy nominal (kWh) 34,739,281,954 +LCOE Levelized cost of energy nominal (cents/kWh) 8.67 + +Present value of PPA revenue ($) 4,952,126,554 +Present value of annual energy nominal (kWh) 34,739,281,954 +LPPA Levelized PPA price nominal (cents/kWh) 14.26 + +PROJECT STATE INCOME TAXES +EBITDA ($) 0 414,895,887 417,466,353 435,039,453 452,297,717 469,269,842 485,692,880 501,094,519 514,834,144 526,146,270 534,199,401 561,908,692 584,953,579 602,913,604 620,375,356 637,478,592 653,941,083 669,204,993 682,501,144 692,906,930 1,901,122,861 +State taxable PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Interest earned on reserves ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State taxable IBI income ($) 0 +State taxable CBI income ($) 0 +minus: +Debt interest payment ($) 0 24,023,438 23,296,907 22,534,049 21,733,049 20,891,999 20,008,896 19,081,638 18,108,017 17,085,715 16,012,298 14,885,210 13,701,768 12,459,153 11,154,408 9,784,426 8,345,944 6,835,539 5,249,613 3,584,391 1,835,907 +Total state tax depreciation ($) 0 51,049,805 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 +equals: +State taxable income ($) 0 339,822,644 292,069,835 310,405,793 328,465,057 346,278,232 363,584,374 379,913,270 394,626,516 406,960,945 416,087,492 444,923,871 469,152,201 488,354,840 507,121,337 525,594,555 543,495,528 560,269,843 575,151,920 587,222,928 1,797,187,343 + +State income tax rate (frac) 0.0 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 0.07 +State tax benefit (liability) ($) 0 -23,787,585 -20,444,888 -21,728,405 -22,992,554 -24,239,476 -25,450,906 -26,593,929 -27,623,856 -28,487,266 -29,126,124 -31,144,671 -32,840,654 -34,184,839 -35,498,494 -36,791,619 -38,044,687 -39,218,889 -40,260,634 -41,105,605 -125,803,114 + +PROJECT FEDERAL INCOME TAXES +EBITDA ($) 0 414,895,887 417,466,353 435,039,453 452,297,717 469,269,842 485,692,880 501,094,519 514,834,144 526,146,270 534,199,401 561,908,692 584,953,579 602,913,604 620,375,356 637,478,592 653,941,083 669,204,993 682,501,144 692,906,930 1,901,122,861 +Interest earned on reserves ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State tax benefit (liability) ($) 0 -23,787,585 -20,444,888 -21,728,405 -22,992,554 -24,239,476 -25,450,906 -26,593,929 -27,623,856 -28,487,266 -29,126,124 -31,144,671 -32,840,654 -34,184,839 -35,498,494 -36,791,619 -38,044,687 -39,218,889 -40,260,634 -41,105,605 -125,803,114 +State ITC total income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State PTC income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Federal taxable IBI income ($) 0 +Federal taxable CBI income ($) 0 +Federal taxable PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +minus: +Debt interest payment ($) 0 24,023,438 23,296,907 22,534,049 21,733,049 20,891,999 20,008,896 19,081,638 18,108,017 17,085,715 16,012,298 14,885,210 13,701,768 12,459,153 11,154,408 9,784,426 8,345,944 6,835,539 5,249,613 3,584,391 1,835,907 +Total federal tax depreciation ($) 0 51,049,805 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 102,099,611 +equals: +Federal taxable income ($) 0 316,035,059 271,624,947 288,677,387 305,472,503 322,038,756 338,133,467 353,319,341 367,002,660 378,473,678 386,961,368 413,779,200 436,311,547 454,170,001 471,622,843 488,802,936 505,450,841 521,050,954 534,891,286 546,117,323 1,671,384,229 + +Federal income tax rate (frac) 0.0 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 0.21 +Federal tax benefit (liability) ($) 0 -66,367,362 -57,041,239 -60,622,251 -64,149,226 -67,628,139 -71,008,028 -74,197,062 -77,070,559 -79,479,472 -81,261,887 -86,893,632 -91,625,425 -95,375,700 -99,040,797 -102,648,617 -106,144,677 -109,420,700 -112,327,170 -114,684,638 -350,990,688 + +CASH INCENTIVES +Federal IBI income ($) 0 +State IBI income ($) 0 +Utility IBI income ($) 0 +Other IBI income ($) 0 +Total IBI income ($) 0 + +Federal CBI income ($) 0 +State CBI income ($) 0 +Utility CBI income ($) 0 +Other CBI income ($) 0 +Total CBI income ($) 0 + +Federal PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Utility PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Other PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Total PBI income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +TAX CREDITS +Federal PTC income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State PTC income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +Federal ITC amount income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Federal ITC percent income ($) 0 720,703,135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Federal ITC total income ($) 0 720,703,135 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +State ITC amount income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State ITC percent income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +State ITC total income ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +DEBT REPAYMENT +Debt balance ($) 480,468,757 465,938,138 450,680,989 434,660,983 417,839,976 400,177,918 381,632,758 362,160,340 341,714,301 320,245,960 297,704,202 274,035,356 249,183,067 223,088,165 195,688,517 166,918,886 136,710,775 104,992,257 71,687,814 36,718,149 0 +Debt interest payment ($) 0 24,023,438 23,296,907 22,534,049 21,733,049 20,891,999 20,008,896 19,081,638 18,108,017 17,085,715 16,012,298 14,885,210 13,701,768 12,459,153 11,154,408 9,784,426 8,345,944 6,835,539 5,249,613 3,584,391 1,835,907 +Debt principal payment ($) 0 14,530,618 15,257,149 16,020,007 16,821,007 17,662,057 18,545,160 19,472,418 20,446,039 21,468,341 22,541,758 23,668,846 24,852,288 26,094,903 27,399,648 28,769,630 30,208,112 31,718,517 33,304,443 34,969,665 36,718,149 +Debt total payment ($) 0 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 + +DSCR (DEBT FRACTION) +EBITDA ($) 0 414,895,887 417,466,353 435,039,453 452,297,717 469,269,842 485,692,880 501,094,519 514,834,144 526,146,270 534,199,401 561,908,692 584,953,579 602,913,604 620,375,356 637,478,592 653,941,083 669,204,993 682,501,144 692,906,930 1,901,122,861 +minus: +Reserves major equipment 1 funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 2 funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 3 funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves receivables funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +equals: +Cash available for debt service (CAFDS) ($) 0 414,895,887 417,466,353 435,039,453 452,297,717 469,269,842 485,692,880 501,094,519 514,834,144 526,146,270 534,199,401 561,908,692 584,953,579 602,913,604 620,375,356 637,478,592 653,941,083 669,204,993 682,501,144 692,906,930 1,901,122,861 +Debt total payment ($) 0 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 38,554,056 +DSCR (pre-tax) 0.0 10.76 10.83 11.28 11.73 12.17 12.60 13.0 13.35 13.65 13.86 14.57 15.17 15.64 16.09 16.53 16.96 17.36 17.70 17.97 49.31 + +RESERVES +Reserves working capital funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves working capital disbursement ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves working capital balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +Reserves debt service funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves debt service disbursement ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves debt service balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +Reserves receivables funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves receivables disbursement ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves receivables balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +Reserves major equipment 1 funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 1 disbursement ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 1 balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +Reserves major equipment 2 funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 2 disbursement ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 2 balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +Reserves major equipment 3 funding ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 3 disbursement ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Reserves major equipment 3 balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + +Reserves total reserves balance ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +Interest on reserves (%/year) 1.75 +Interest earned on reserves ($) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/tests/examples/Fervo_Project_Cape-4.txt b/tests/examples/Fervo_Project_Cape-4.txt new file mode 100644 index 00000000..cbe24a42 --- /dev/null +++ b/tests/examples/Fervo_Project_Cape-4.txt @@ -0,0 +1,70 @@ +# Case Study: Fervo Cape Station: 500 MWe Production +https://github.com/NREL/GEOPHIRES-X/issues/385?title=Fervo+Cape+Station+500+MWe+update + +# *** ECONOMIC/FINANCIAL PARAMETERS *** +# ************************************* +Economic Model, 5, -- SAM Single Owner PPA +Starting Electricity Sale Price, 0.12 +Ending Electricity Sale Price, 1.00 +Electricity Escalation Rate Per Year, 0.004053223 +Electricity Escalation Start Year, 1 +Fraction of Investment in Bonds, .2 +Inflated Bond Interest Rate, .05 +Discount Rate, 0.08 +Inflation Rate, .02 +Inflation Rate During Construction, 0.05 +Combined Income Tax Rate, .28 +Investment Tax Credit Rate, 0.3 +Property Tax Rate, 0 +Capital Cost for Power Plant for Electricity Generation, 1900, -- (peak production) +Exploration Capital Cost, 30, -- TODO source/citation +Well Drilling and Completion Capital Cost, 3.84, -- Assume cost continues to decrease from $4.8M/well (https://houston.innovationmap.com/fervo-energy-drilling-utah-project-2667300142.html) +Reservoir Stimulation Capital Cost Adjustment Factor, 3.97 + +# *** SURFACE & SUBSURFACE TECHNICAL PARAMETERS *** +# ************************************************* +End-Use Option, 1 +Plant Lifetime, 20 +Power Plant Type, 2, -- Supercritical ORC +Reservoir Model, 1 +Reservoir Volume Option, 1 +Reservoir Density, 2800 +Reservoir Depth, 8500 feet, -- https://pangea.stanford.edu/ERE/db/GeoConf/papers/SGW/2024/Fercho.pdf +Reservoir Heat Capacity, 790 +Reservoir Thermal Conductivity, 3.05 +Reservoir Porosity, 0.0118 +Reservoir Impedance, 0.001 +Number of Fractures, 149 +Fracture Shape, 4 +Fracture Height, 1400 +Fracture Width, 1400 +Fracture Separation, 30 +Number of Segments, 1 +Gradient 1, 74, -- temperature at 8500 ft: 200 degC (https://pangea.stanford.edu/ERE/db/GeoConf/papers/SGW/2024/Fercho.pdf); 228.89 degC @ 9824 ft (https://doi.org/10.31223/X5VH8C) +Number of Injection Wells, 48 +Number of Production Wells, 48 +Production Flow Rate per Well, 120, -- peak flow reported in paper +Production Well Diameter, 9.625 +Injection Well Diameter, 9.625 +Well Separation, 365 feet +Ramey Production Wellbore Model, 1 +Injection Temperature, 60 degC +Injection Wellbore Temperature Gain, 3 +Plant Outlet Pressure, 1000 psi +Production Wellhead Pressure, 325 psi +Utilization Factor, .9 +Water Loss Fraction, 0.10 +Maximum Drawdown, 0.009 +Ambient Temperature, 10 degC +Surface Temperature, 10 degC +Circulation Pump Efficiency, 0.80 +Well Geometry Configuration, 4 +Has Nonvertical Section, True +Multilaterals Cased, True +Number of Multilateral Sections, 3 +Nonvertical Length per Multilateral Section, 4700 feet + +# *** SIMULATION PARAMETERS *** +# ***************************** +Maximum Temperature, 500 +Time steps per year, 12 diff --git a/tests/examples/example_SAM-single-owner-PPA.out b/tests/examples/example_SAM-single-owner-PPA.out index b93d2781..102db9de 100644 --- a/tests/examples/example_SAM-single-owner-PPA.out +++ b/tests/examples/example_SAM-single-owner-PPA.out @@ -5,9 +5,9 @@ Simulation Metadata ---------------------- GEOPHIRES Version: 3.9.7 - Simulation Date: 2025-05-15 - Simulation Time: 10:13 - Calculation Time: 0.891 sec + Simulation Date: 2025-05-21 + Simulation Time: 09:55 + Calculation Time: 0.888 sec ***SUMMARY OF RESULTS*** @@ -31,7 +31,7 @@ Simulation Metadata Project lifetime: 20 yr Capacity factor: 90.0 % Project NPV: 2877.00 MUSD - Project IRR: 59.73 % + After-Tax IRR: 59.73 % Estimated Jobs Created: 976 ***ENGINEERING PARAMETERS*** diff --git a/tests/test_geophires_x.py b/tests/test_geophires_x.py index c7ef8fd3..e1520b02 100644 --- a/tests/test_geophires_x.py +++ b/tests/test_geophires_x.py @@ -1,3 +1,4 @@ +import math import os import tempfile import uuid @@ -194,6 +195,9 @@ def get_output_file_for_example(example_file: str): del expected_result.result['metadata'] del expected_result.result['Simulation Metadata'] + self._sanitize_nan(geophires_result) + self._sanitize_nan(expected_result) + try: self.assertDictEqual( expected_result.result, geophires_result.result, msg=f'Example test: {example_file_path}' @@ -244,6 +248,22 @@ def get_output_file_for_example(example_file: str): if len(regenerate_cmds) > 0: print(f'Command to regenerate {len(regenerate_cmds)} failed examples:\n{" && ".join(regenerate_cmds)}') + # noinspection PyMethodMayBeStatic + def _sanitize_nan(self, r: GeophiresXResult) -> None: + """ + Workaround for float('nan') != float('nan') + See https://stackoverflow.com/questions/51728427/unittest-how-to-assert-if-the-two-possibly-nan-values-are-equal + + TODO generalize beyond After-Tax IRR + """ + irr_key = 'After-Tax IRR' + if irr_key in r.result['ECONOMIC PARAMETERS']: + try: + if math.isnan(r.result['ECONOMIC PARAMETERS'][irr_key]['value']): + r.result['ECONOMIC PARAMETERS'][irr_key]['value'] = 'NaN' + except TypeError: + pass + def _get_unequal_dicts_approximate_percent_difference(self, d1: dict, d2: dict) -> Optional[float]: for i in range(99): try: