From 71b45f2cda39aab0a878a9c945694e58c7292732 Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Tue, 13 Feb 2024 19:57:27 -0600 Subject: [PATCH 01/36] Fixed typo in Economics.py for Parallel CHP production LCOH calculation. --- src/geophires_x/Economics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index f580636c..b36bea56 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -292,7 +292,7 @@ def CalculateLCOELCOH(self, model: Model) -> tuple: LCOH = (NPVcap + NPVoandm + NPVfc + NPVit + NPVgrt - NPVitc - np.sum( annualelectricityincome * inflationvector * discountvector)) / np.sum( model.surfaceplant.HeatkWhProduced.value * inflationvector * discountvector) * 1E8 - LCOH = self.LCOELCOHCombined.value * 2.931 # $/MMBTU + LCOH = LCOH * 2.931 # $/MMBTU elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: PumpingCosts = model.surfaceplant.PumpingkWh.value * model.surfaceplant.electricity_cost_to_buy.value / 1E6 From 7897f47417986e85b9e14c229f4e0b8bdd9fc51b Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Tue, 20 Feb 2024 17:08:10 -0600 Subject: [PATCH 02/36] Update HIP-RA-X functions to include pressure in all calculations. --- src/geophires_x/GeoPHIRESUtils.py | 42 +++-- src/geophires_x/Reservoir.py | 6 +- src/geophires_x/Units.py | 1 + src/geophires_x/WellBores.py | 2 +- src/hip_ra_x/hip_ra_x.py | 161 +++++++++++------- tests/geophires_x_tests/test_reservoir.py | 4 +- .../examples/HIP-RA-X_example1.out | 32 ++-- 7 files changed, 147 insertions(+), 101 deletions(-) diff --git a/src/geophires_x/GeoPHIRESUtils.py b/src/geophires_x/GeoPHIRESUtils.py index a3d726e4..3be12dc4 100644 --- a/src/geophires_x/GeoPHIRESUtils.py +++ b/src/geophires_x/GeoPHIRESUtils.py @@ -102,15 +102,13 @@ def quantity(value: float, unit: str) -> PlainQuantity: @lru_cache -def density_water_kg_per_m3( - Twater_degC: float, - pressure: Optional[PlainQuantity] = None) -> float: +def density_water_kg_per_m3(Twater_degC: float, pressure: Optional[PlainQuantity] = None) -> float: """ Calculate the density of water as a function of temperature. Args: Twater_degC: The temperature of water in degrees C. - pressure: Pressure - should be provided + pressure: Pressure - should be provided as a Pint quantity that knows its units Returns: The density of water in kg/m³. Raises: @@ -245,15 +243,13 @@ def RecoverableHeat(Twater_degC: float) -> float: @lru_cache -def vapor_pressure_water_kPa( - Twater_degC: float, - pressure: Optional[PlainQuantity] = None) -> float: +def vapor_pressure_water_kPa(Twater_degC: float, pressure: Optional[PlainQuantity] = None) -> float: """ Calculate the vapor pressure of water as a function of temperature. Args: Twater_degC: the temperature of water in degrees C - pressure: Pressure - should be provided + pressure: Pressure - should be provided as a Pint quantity that knows its units Returns: The vapor pressure of water as a function of temperature in kPa Raises: @@ -276,22 +272,23 @@ def vapor_pressure_water_kPa( return (quantity(CP.PropsSI('P', 'T', celsius_to_kelvin(Twater_degC), 'Q', 0, 'Water'), 'Pa') .to('kPa').magnitude) - except (NotImplementedError, ValueError) as e: raise ValueError(f'Input temperature {Twater_degC} is out of range or otherwise not implemented') from e @lru_cache -def entropy_water_kJ_per_kg_per_K(temperature_degC: float) -> float: +def entropy_water_kJ_per_kg_per_K(temperature_degC: float, pressure: Optional[PlainQuantity] = None) -> float: """ Calculate the entropy of water as a function of temperature - TODO take pressure as a parameter https://github.com/NREL/GEOPHIRES-X/issues/119 Args: temperature_degC: the temperature of water in degrees C + pressure: Pressure - should be provided as a Pint quantity that knows its units Returns: the entropy of water as a function of temperature in kJ/(kg·K) Raises: + TypeError: If temperature is not a float or convertible to float. + ValueError: If temperature is not within the range of 0 to 373.946 degrees C. """ try: @@ -300,19 +297,23 @@ def entropy_water_kJ_per_kg_per_K(temperature_degC: float) -> float: raise TypeError(f'Input temperature ({temperature_degC}) must be a float') try: - return CP.PropsSI('S', 'T', celsius_to_kelvin(temperature_degC), 'Q', 0, 'Water') * 1e-3 + if pressure is not None: + return CP.PropsSI('S', 'T', celsius_to_kelvin(temperature_degC), + 'P', pressure.to('Pa').magnitude, 'Water') * 1e-3 + else: + return CP.PropsSI('S', 'T', celsius_to_kelvin(temperature_degC), 'Q', 0, 'Water') * 1e-3 except (NotImplementedError, ValueError) as e: raise ValueError(f'Input temperature {temperature_degC} is out of range or otherwise not implemented') from e @lru_cache -def enthalpy_water_kJ_per_kg(temperature_degC: float) -> float: +def enthalpy_water_kJ_per_kg(temperature_degC: float, pressure: Optional[PlainQuantity] = None) -> float: """ Calculate the enthalpy of water as a function of temperature - TODO take pressure as a parameter https://github.com/NREL/GEOPHIRES-X/issues/119 Args: temperature_degC: the temperature of water in degrees C (float) + pressure: Pressure - should be provided as a Pint quantity that knows its units Returns: the enthalpy of water as a function of temperature in kJ/kg Raises: @@ -325,7 +326,12 @@ def enthalpy_water_kJ_per_kg(temperature_degC: float) -> float: raise TypeError(f'Input temperature ({temperature_degC}) must be a float') try: - return CP.PropsSI('H', 'T', celsius_to_kelvin(temperature_degC), 'Q', 0, 'Water') * 1e-3 + if pressure is not None: + return CP.PropsSI('H', 'T', celsius_to_kelvin(temperature_degC), + 'P', pressure.to('Pa').magnitude, 'Water') * 1e-3 + else: + return CP.PropsSI('H', 'T', celsius_to_kelvin(temperature_degC), 'Q', 0, 'Water') * 1e-3 + except (NotImplementedError, ValueError) as e: raise ValueError(f'Input temperature {temperature_degC} is out of range or otherwise not implemented') from e @@ -457,15 +463,15 @@ def json_dumpse(obj) -> str: return json.dumps(obj, cls=_EnhancedJSONEncoder) -def lithostatic_pressure_MPa(rho_kg_per_m3: float, depth_m: float) -> float: +def static_pressure_MPa(rho_kg_per_m3: float, depth_m: float) -> float: """ - Calculate lithostatic pressure in a reservoir. + Calculate litho- (or hydro-) static pressure in a reservoir. Args: rho_kg_per_m3 (float): Density of the fluid in kg/m^3. depth_m (float): Depth of the reservoir in meters. Returns: - float: Lithostatic pressure in megapascals (MPa). + pint quantity: Lithostatic pressure in megapascals (MPa). """ g = scipy.constants.g # Acceleration due to gravity (m/s^2) diff --git a/src/geophires_x/Reservoir.py b/src/geophires_x/Reservoir.py index 05fb1a81..81f61b18 100644 --- a/src/geophires_x/Reservoir.py +++ b/src/geophires_x/Reservoir.py @@ -10,7 +10,7 @@ from .Units import * import geophires_x.Model as Model -from geophires_x.GeoPHIRESUtils import heat_capacity_water_J_per_kg_per_K, quantity, lithostatic_pressure_MPa +from geophires_x.GeoPHIRESUtils import heat_capacity_water_J_per_kg_per_K, quantity, static_pressure_MPa from geophires_x.GeoPHIRESUtils import density_water_kg_per_m3 class Reservoir: @@ -783,7 +783,7 @@ def Calculate(self, model: Model) -> None: model.logger.info(f'complete {str(__class__)}: {sys._getframe().f_code.co_name}') def lithostatic_pressure(self) -> PlainQuantity: - return quantity(lithostatic_pressure_MPa(self.rhorock.quantity().to('kg/m**3').magnitude, - self.depth.quantity().to('m').magnitude), 'MPa') + return quantity(static_pressure_MPa(self.rhorock.quantity().to('kg/m**3').magnitude, + self.depth.quantity().to('m').magnitude), 'MPa') diff --git a/src/geophires_x/Units.py b/src/geophires_x/Units.py index 008531eb..fef9c48f 100644 --- a/src/geophires_x/Units.py +++ b/src/geophires_x/Units.py @@ -193,6 +193,7 @@ class CostPerDistanceUnit(str, Enum): class PressureUnit(str, Enum): """Pressure Units""" + MPASCAL = "mPa" KPASCAL = "kPa" PASCAL = "Pa" BAR = "bar" diff --git a/src/geophires_x/WellBores.py b/src/geophires_x/WellBores.py index 480c9d3b..6a95fdfb 100644 --- a/src/geophires_x/WellBores.py +++ b/src/geophires_x/WellBores.py @@ -3,7 +3,7 @@ from pint.facets.plain import PlainQuantity from .Parameter import floatParameter, intParameter, boolParameter, OutputParameter, ReadParameter -from geophires_x.GeoPHIRESUtils import vapor_pressure_water_kPa, quantity, lithostatic_pressure_MPa +from geophires_x.GeoPHIRESUtils import vapor_pressure_water_kPa, quantity, static_pressure_MPa from geophires_x.GeoPHIRESUtils import density_water_kg_per_m3 from geophires_x.GeoPHIRESUtils import viscosity_water_Pa_sec from .Units import * diff --git a/src/hip_ra_x/hip_ra_x.py b/src/hip_ra_x/hip_ra_x.py index bbf3c50a..5a8b75a2 100644 --- a/src/hip_ra_x/hip_ra_x.py +++ b/src/hip_ra_x/hip_ra_x.py @@ -17,6 +17,7 @@ from geophires_x.GeoPHIRESUtils import entropy_water_kJ_per_kg_per_K from geophires_x.GeoPHIRESUtils import heat_capacity_water_J_per_kg_per_K from geophires_x.GeoPHIRESUtils import read_input_file +from geophires_x.GeoPHIRESUtils import static_pressure_MPa from geophires_x.Parameter import ConvertOutputUnits from geophires_x.Parameter import ConvertUnitsBack from geophires_x.Parameter import LookupUnits @@ -39,6 +40,7 @@ from geophires_x.Units import PowerPerUnitAreaUnit from geophires_x.Units import PowerPerUnitVolumeUnit from geophires_x.Units import PowerUnit +from geophires_x.Units import PressureUnit from geophires_x.Units import TemperatureUnit from geophires_x.Units import TimeUnit from geophires_x.Units import Units @@ -278,6 +280,38 @@ def parameter_dict_entry(param: Parameter) -> Parameter: ToolTipText='percent of fluid that is recoverable from the reservoir (0.5 = 50%)', ) ) + self.reservoir_depth: Parameter = parameter_dict_entry( + floatParameter( + 'Reservoir Depth', + value=-1.0, + Min=0.001, + Max=15.0, + UnitType=Units.LENGTH, + PreferredUnits=LengthUnit.KILOMETERS, + CurrentUnits=LengthUnit.KILOMETERS, + Required=False, + Provided=False, + ErrMessage='calculate based on an assumed gradient of 30 C/km and the reservoir temperature', + ToolTipText='depth to top of reservoir (km). Calculated based on an assumed gradient \ + and the reservoir temperature if no value given', + ) + ) + self.reservoir_pressure: Parameter = parameter_dict_entry( + floatParameter( + 'Reservoir Pressure', + value=-1.0, + Min=0.00, + Max=10000.000, + UnitType=Units.PRESSURE, + PreferredUnits=PressureUnit.MPASCAL, + CurrentUnits=PressureUnit.MPASCAL, + Required=False, + Provided=False, + ErrMessage='calculate assuming hydrostatic pressure and the reservoir depth & water density', + ToolTipText='pressure of the of reservoir (in mPa). Calculated assuming hydrostatic pressure and \ + reservoir depth & water density if no value given', + ) + ) self.recoverable_rock_heat: Parameter = parameter_dict_entry( floatParameter( 'Recoverable Heat from Rock', @@ -555,9 +589,8 @@ def read_parameters(self) -> None: # Before we change the parameter, let's assume that the unit preferences will match - # if they don't, the later code will fix this. ParameterToModify.CurrentUnits = ParameterToModify.PreferredUnits - ReadParameter( - ParameterReadIn, ParameterToModify, self - ) # this should handle all the non-special cases + # this should handle all the non-special cases + ReadParameter(ParameterReadIn, ParameterToModify, self) else: self.logger.info('No parameters read because no content provided') @@ -578,25 +611,42 @@ def Calculate(self): try: # Calculate the volume of rock and fluid in the reservoir. - self.reservoir_volume.value = self.reservoir_area.value * self.reservoir_thickness.value self.volume_rock.value = self.reservoir_volume.value * (1.0 - (self.reservoir_porosity.value / 100.0)) + + # Note that we can't recover all the fluid from the reservoir, so we multiply by the recoverable fluid factor self.volume_recoverable_fluid.value = ( self.reservoir_volume.value * (self.reservoir_porosity.value / 100.0) * self.recoverable_fluid_factor.value - # Note that we can't recover all the fluid from the reservoir, - # so we multiply by the recoverable fluid factor ) + if not self.reservoir_depth.Provided: + self.logger.info( + f'Deriving value of {self.reservoir_depth.Name} because provided value ' + f'({self.reservoir_depth.value}) was not provided)' + ) + # assume ambient Temperature of 15 C and 30C/km + self.reservoir_depth.value = (self.reservoir_temperature.value - 15.0) / 30.0 + + if not self.reservoir_pressure.Provided: + self.logger.info( + f'Deriving value of {self.reservoir_pressure.Name} because provided value ' + f'({self.reservoir_pressure.value}) was not provided)' + ) + # Assumes a water density of 1.0 g/cm3, which is high, since the water density decreases with depth + self.reservoir_pressure.value = static_pressure_MPa(1000.0, self.reservoir_depth.value * 1000.0) + if self.fluid_density.value < self.fluid_density.Min: self.logger.info( f'Deriving value of {self.fluid_density.Name} because provided value ' f'({self.fluid_density.value}) was less than min ({self.fluid_density.Min})' ) - density_h20_kg_per_m3 = density_water_kg_per_m3(self.reservoir_temperature.value) - + density_h20_kg_per_m3 = density_water_kg_per_m3( + self.reservoir_temperature.value, + pressure=HIP_RA_X._ureg.Quantity(self.reservoir_pressure.value, 'MPa'), + ) self.fluid_density.value = density_h20_kg_per_m3 * 1_000_000_000.0 # converted to kg/km3 self.mass_rock.value = self.volume_rock.value * self.rock_density.value @@ -609,48 +659,50 @@ def Calculate(self): f'({self.fluid_heat_capacity.value}) was less than min ({self.fluid_heat_capacity.Min})' ) + # converted to kJ/(kg·K) self.fluid_heat_capacity.value = ( - heat_capacity_water_J_per_kg_per_K(self.reservoir_temperature.value) + heat_capacity_water_J_per_kg_per_K( + self.reservoir_temperature.value, + pressure=HIP_RA_X._ureg.Quantity(self.reservoir_pressure.value, 'MPa'), + ) / 1000.0 - # converted to kJ/(kg·K) ) rejection_temperature_k = celsius_to_kelvin(self.rejection_temperature.value) reservoir_temperature_k = celsius_to_kelvin(self.reservoir_temperature.value) delta_temperature_k = reservoir_temperature_k - rejection_temperature_k - fluid_net_enthalpy = fluid_net_enthalpy = enthalpy_water_kJ_per_kg( - self.reservoir_temperature.value - ) - enthalpy_water_kJ_per_kg(self.rejection_temperature.value) + fluid_net_enthalpy = enthalpy_water_kJ_per_kg( + self.reservoir_temperature.value, pressure=HIP_RA_X._ureg.Quantity(self.reservoir_pressure.value, 'MPa') + ) - enthalpy_water_kJ_per_kg( + self.rejection_temperature.value, pressure=HIP_RA_X._ureg.Quantity(self.reservoir_pressure.value, 'MPa') + ) fluid_net_entropy = entropy_water_kJ_per_kg_per_K( - self.reservoir_temperature.value - ) - entropy_water_kJ_per_kg_per_K(self.rejection_temperature.value) + self.reservoir_temperature.value, pressure=HIP_RA_X._ureg.Quantity(self.reservoir_pressure.value, 'MPa') + ) - entropy_water_kJ_per_kg_per_K( + self.rejection_temperature.value, pressure=HIP_RA_X._ureg.Quantity(self.reservoir_pressure.value, 'MPa') + ) # fmt: off - self.enthalpy_rock.value = ( - self.rock_heat_capacity.value * delta_temperature_k * self.volume_rock.value - ) / self.mass_rock.value + self.enthalpy_rock.value = ((self.rock_heat_capacity.value * delta_temperature_k * self.volume_rock.value) / + self.mass_rock.value) # fmt: on + # result in kJ self.stored_heat_rock.value = ( - self.recoverable_rock_heat.value - * self.enthalpy_rock.value - * self.mass_rock.value - # result in kJ + self.recoverable_rock_heat.value * self.enthalpy_rock.value * self.mass_rock.value ) - self.stored_heat_fluid.value = fluid_net_enthalpy * self.mass_recoverable_fluid.value # result in kJ + self.stored_heat_fluid.value = fluid_net_enthalpy * self.mass_recoverable_fluid.value self.reservoir_stored_heat.value = self.stored_heat_rock.value + self.stored_heat_fluid.value # equation 4 in Garg and Combs(2011) amount_fluid_produced_kg = self.reservoir_stored_heat.value / fluid_net_enthalpy self.mass_recoverable_fluid.value = amount_fluid_produced_kg + # equation 7 in Garg and Combs(2011) fluid_exergy_kJ_per_kg = ( - # equation 7 in Garg and Combs(2011) - fluid_net_enthalpy - - celsius_to_kelvin(self.rejection_temperature.value) * fluid_net_entropy + fluid_net_enthalpy - celsius_to_kelvin(self.rejection_temperature.value) * fluid_net_entropy ) self.enthalpy_fluid.value = fluid_exergy_kJ_per_kg - self.reservoir_enthalpy.value = self.enthalpy_rock.value + self.enthalpy_fluid.value # (equation 8 in Garg and Combs(2011)) @@ -671,9 +723,7 @@ def Calculate(self): self.reservoir_producible_heat.value / self.reservoir_stored_heat.value ) - # Now assuming a 30-year lifetime: - plant_lifetime_years = 30 - maximum_power_kW = maximum_lifetime_electricity_kJ / (plant_lifetime_years * 365 * 24 * 3600) + maximum_power_kW = maximum_lifetime_electricity_kJ / (self.reservoir_life_cycle.value * 365 * 24 * 3600) electricity_with_actual_power_plant_kW = UtilEff_func(self.reservoir_temperature.value) * maximum_power_kW producible_power_kW = electricity_with_actual_power_plant_kW @@ -744,9 +794,7 @@ def render_scientific(p: floatParameter | OutputParameter) -> str: summary_of_inputs = {} summary_of_results = {} - for param, render in [ - # TODO: Commented parameters are defined in initialization but not calculated - either calculate or - # remove entirely + inputs = [ (self.reservoir_temperature, render_default), (self.rejection_temperature, render_default), (self.reservoir_porosity, render_default), @@ -757,63 +805,52 @@ def render_scientific(p: floatParameter | OutputParameter) -> str: (self.fluid_heat_capacity, render_default), (self.fluid_density, render_scientific), (self.rock_density, render_scientific), - # (self.rock_recoverable_heat, render_default), - # (self.fluid_recoverable_heat, render_default), (self.recoverable_fluid_factor, render_default), (self.recoverable_rock_heat, render_default), - ]: + ] + + # If depth and/or pressure are provided, report them as inputs. If not, as outputs + if self.reservoir_depth.Provided: + inputs.append((self.reservoir_depth, render_default)) + if self.reservoir_pressure.Provided: + inputs.append((self.reservoir_pressure, render_default)) + + for param, render in inputs: summary_of_inputs[param.Name] = render(param) case_data_inputs = {'SUMMARY OF INPUTS': summary_of_inputs} - for param, render in [ - # TODO: Commented parameters are defined in initialization but not calculated - either calculate or - # remove entirely + outputs = [ (self.reservoir_volume, render_default), (self.volume_rock, render_default), (self.volume_recoverable_fluid, render_default), (self.reservoir_stored_heat, render_scientific), (self.stored_heat_rock, render_scientific), (self.stored_heat_fluid, render_scientific), - # (self.reservoir_mass, render_scientific), (self.mass_rock, render_scientific), (self.mass_recoverable_fluid, render_scientific), (self.reservoir_enthalpy, render_default), (self.enthalpy_rock, render_default), (self.enthalpy_fluid, render_default), - # (self.wellhead_heat, render_scientific), - # (self.wellhead_heat_recovery_rock, render_scientific), - # (self.wellhead_heat_recovery_fluid, render_scientific), ( self.reservoir_recovery_factor, lambda rg: f'{(100 * rg.value):10.2f} {self.reservoir_recovery_factor.CurrentUnits.value}', ), - # ( - # self.recovery_factor_rock, - # lambda rg: f'{(100 * rg.value):10.2f} {self.recovery_factor_rock.CurrentUnits.value}', - # ), - # ( - # self.recovery_factor_fluid, - # lambda rg: f'{(100 * rg.value):10.2f} {self.recovery_factor_fluid.CurrentUnits.value}', - # ), (self.reservoir_available_heat, render_scientific), - # (self.available_heat_rock, render_scientific), - # (self.available_heat_fluid, render_scientific), (self.reservoir_producible_heat, render_scientific), - # (self.producible_heat_rock, render_scientific), - # (self.producible_heat_fluid, render_scientific), (self.producible_heat_per_unit_area, render_scientific), (self.heat_per_unit_volume_reservoir, render_scientific), - # (self.heat_per_unit_area_rock, render_scientific), - # (self.heat_per_unit_area_fluid, render_scientific), (self.reservoir_producible_electricity, render_default), - # (self.producible_electricity_rock, render_default), - # (self.producible_electricity_fluid, render_default), (self.producible_electricity_per_unit_area, render_default), (self.electricity_per_unit_volume_reservoir, render_default), - # (self.electricity_per_unit_area_rock, render_default), - # (self.electricity_per_unit_area_fluid, render_default), - ]: + ] + + # If depth and/or pressure are provided, report them as inputs. If not, as outputs + if not self.reservoir_depth.Provided: + outputs.insert(0, (self.reservoir_depth, render_default)) + if not self.reservoir_pressure.Provided: + outputs.insert(0, (self.reservoir_pressure, render_default)) + for param, render in outputs: summary_of_results[param.Name] = render(param) case_data_results = {'SUMMARY OF RESULTS': summary_of_results} diff --git a/tests/geophires_x_tests/test_reservoir.py b/tests/geophires_x_tests/test_reservoir.py index a5a837d4..0cedc225 100644 --- a/tests/geophires_x_tests/test_reservoir.py +++ b/tests/geophires_x_tests/test_reservoir.py @@ -5,14 +5,14 @@ from pint.facets.plain import PlainQuantity from base_test_case import BaseTestCase -from geophires_x.GeoPHIRESUtils import lithostatic_pressure_MPa +from geophires_x.GeoPHIRESUtils import static_pressure_MPa from geophires_x.Model import Model from geophires_x.Reservoir import Reservoir class ReservoirTestCase(BaseTestCase): def test_lithostatic_pressure(self): - p = lithostatic_pressure_MPa(2700, 3000) + p = static_pressure_MPa(2700, 3000) self.assertEqual(79.433865, p) def test_reservoir_lithostatic_pressure(self): diff --git a/tests/hip_ra_x_tests/examples/HIP-RA-X_example1.out b/tests/hip_ra_x_tests/examples/HIP-RA-X_example1.out index 2ee618ee..3856b409 100644 --- a/tests/hip_ra_x_tests/examples/HIP-RA-X_example1.out +++ b/tests/hip_ra_x_tests/examples/HIP-RA-X_example1.out @@ -10,29 +10,31 @@ Reservoir Thickness: 0.25 kilometer Reservoir Life Cycle: 25.00 yr Rock Heat Capacity: 2.84e+12 kJ/km**3C - Fluid Specific Heat Capacity: 4.87 kJ/kgC - Density Of Reservoir Fluid: 7.99e+11 kg/km**3 + Fluid Specific Heat Capacity: 4.34 kJ/kgC + Density Of Reservoir Fluid: 8.62e+11 kg/km**3 Density Of Reservoir Rock: 2.55e+12 kg/km**3 Recoverable Fluid Factor: 0.50 Recoverable Heat from Rock: 0.75 ***SUMMARY OF RESULTS*** + Reservoir Pressure: 76.82 mPa + Reservoir Depth: 7.83 kilometer Reservoir Volume (reservoir): 13.75 km**3 Reservoir Volume (rock): 12.38 km**3 Recoverable Volume (recoverable fluid): 0.69 km**3 - Stored Heat (reservoir): 5.47e+15 kJ + Stored Heat (reservoir): 5.48e+15 kJ Stored Heat (rock): 5.01e+15 kJ - Stored Heat (fluid): 4.58e+14 kJ + Stored Heat (fluid): 4.67e+14 kJ Mass of Reservoir (rock): 3.16e+13 kilogram - Mass of Reservoir (fluid): 6.55e+12 kilogram - Specific Enthalpy (reservoir): 392.48 kJ/kg + Mass of Reservoir (fluid): 6.95e+12 kilogram + Specific Enthalpy (reservoir): 377.60 kJ/kg Specific Enthalpy (rock): 211.61 kJ/kg - Specific Enthalpy (fluid): 180.87 kJ/kg - Recovery Factor (reservoir): 14.30 % - Available Heat (reservoir): 1.18e+15 kJ - Producible Heat (reservoir): 7.82e+14 kJ - Producible Heat/Unit Area (reservoir): 1.42e+13 kJ/km**2 - Producible Heat/Unit Volume (reservoir): 5.69e+13 kJ/km**3 - Producible Electricity (reservoir): 500.89 MW - Producible Electricity/Unit Area (reservoir): 9.11 MW/km**2 - Producible Electricity/Unit Volume (reservoir): 36.43 MW/km**3 + Specific Enthalpy (fluid): 166.00 kJ/kg + Recovery Factor (reservoir): 13.90 % + Available Heat (reservoir): 1.15e+15 kJ + Producible Heat (reservoir): 7.61e+14 kJ + Producible Heat/Unit Area (reservoir): 1.38e+13 kJ/km**2 + Producible Heat/Unit Volume (reservoir): 5.54e+13 kJ/km**3 + Producible Electricity (reservoir): 585.09 MW + Producible Electricity/Unit Area (reservoir): 10.64 MW/km**2 + Producible Electricity/Unit Volume (reservoir): 42.55 MW/km**3 From 2ed5773cdf584f0cb1e0184f67b449d0abdd9966 Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Tue, 20 Feb 2024 17:23:50 -0600 Subject: [PATCH 03/36] Update HIP-RA-X functions to include pressure in all calculations. --- src/geophires_x/CylindricalReservoir.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/geophires_x/CylindricalReservoir.py b/src/geophires_x/CylindricalReservoir.py index 93b25bbb..9402c791 100644 --- a/src/geophires_x/CylindricalReservoir.py +++ b/src/geophires_x/CylindricalReservoir.py @@ -6,7 +6,7 @@ import numpy as np from pint.facets.plain import PlainQuantity -from geophires_x.GeoPHIRESUtils import density_water_kg_per_m3, lithostatic_pressure_MPa, quantity +from geophires_x.GeoPHIRESUtils import density_water_kg_per_m3, static_pressure_MPa, quantity from geophires_x.GeoPHIRESUtils import heat_capacity_water_J_per_kg_per_K import geophires_x.Model as Model @@ -266,5 +266,5 @@ def lithostatic_pressure(self) -> PlainQuantity: Standard reservoir implementation uses depth but CylindricalReservoir sets depth to total drilled length """ - return quantity(lithostatic_pressure_MPa(self.rhorock.quantity().to('kg/m**3').magnitude, - self.InputDepth.quantity().to('m').magnitude), 'MPa') + return quantity(static_pressure_MPa(self.rhorock.quantity().to('kg/m**3').magnitude, + self.InputDepth.quantity().to('m').magnitude), 'MPa') From cb1adf81f6f67a42a24ee6de8b26927cbcef5721 Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Tue, 20 Feb 2024 18:06:38 -0600 Subject: [PATCH 04/36] Update HIP-RA-X functions to include pressure in all calculations. Update Util_eff to allow for temperatures above 373 by assuming efficiency os the same, given the plant is the same (usually flash) --- src/geophires_x/GeoPHIRESUtils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/geophires_x/GeoPHIRESUtils.py b/src/geophires_x/GeoPHIRESUtils.py index 3be12dc4..7c9843d5 100644 --- a/src/geophires_x/GeoPHIRESUtils.py +++ b/src/geophires_x/GeoPHIRESUtils.py @@ -51,6 +51,7 @@ 340.0, 360.0, 373.946, + 600.0, ] ) @@ -84,6 +85,7 @@ 0.4, 0.4, 0.4, + 0.4, ] ) From 49ff3a1213ac778ed53120626807e9a680d1ddcf Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Fri, 1 Mar 2024 17:19:14 -0600 Subject: [PATCH 05/36] WIP 2024-03-01 --- src/geophires_monte_carlo/MC_GeoPHIRES3.py | 16 +- src/geophires_x/AGSWellBores.py | 2 +- .../Border_EGS_150C_Electricity_Input.txt | 67 ++ src/geophires_x/Economics.py | 600 +++++++++++++----- src/geophires_x/EconomicsAddOns.py | 15 +- src/geophires_x/EconomicsCCUS.py | 11 - src/geophires_x/EconomicsS_DAC_GT.py | 38 +- src/geophires_x/GEOPHIRESv3.py | 4 - src/geophires_x/Model.py | 92 +-- src/geophires_x/Outputs.py | 120 +++- src/geophires_x/OutputsAddOns.py | 2 - src/geophires_x/OutputsCCUS.py | 1 - src/geophires_x/Parameter.py | 4 +- src/hip_ra/HIP.html | 31 + src/hip_ra/HIP_RA.py | 24 +- tests/examples/S-DAC-GT.txt | 4 +- ...Closed-Loop_Geothermal_Energy_Recovery.out | 108 ++-- tests/examples/example11_AC.txt | 2 + .../MC_HIP_Settings_file.txt | 13 +- 19 files changed, 810 insertions(+), 344 deletions(-) create mode 100644 src/geophires_x/Border_EGS_150C_Electricity_Input.txt create mode 100644 src/hip_ra/HIP.html diff --git a/src/geophires_monte_carlo/MC_GeoPHIRES3.py b/src/geophires_monte_carlo/MC_GeoPHIRES3.py index dffd75c7..a1f9b25a 100755 --- a/src/geophires_monte_carlo/MC_GeoPHIRES3.py +++ b/src/geophires_monte_carlo/MC_GeoPHIRES3.py @@ -130,6 +130,13 @@ def work_package(pass_list: list): HipRaInputParameters(from_file_path=Path(tmp_input_file)) ) shutil.copyfile(result.output_file_path, tmp_output_file) + elif args.Code_File.endswith('HIP_RA_x.py'): + # FIXME verify client manipulation of sys.argv is threadsafe + hip_ra_x_client: HipRaXClient = HipRaXClient() + result: HipRaResult = hip_ra_x_client.get_hip_ra_result( + HipRaInputParameters(from_file_path=Path(tmp_input_file)) + ) + shutil.copyfile(result.output_file_path, tmp_output_file) else: log.warning( f'Code file from args ({args.Code_File}) is not a known program, ' @@ -194,7 +201,10 @@ def get_output(output): result_s += '\n' with open(output_file, 'a') as f: + f.write('\n') # This creates extra lines in the output file, but is needed to make concurrency work (?!?!?!). f.write(result_s) + f.write('\n') # This creates extra lines in the output file, but is needed to make concurrency work (?!?!?!). + # the extra lines in the file are cleaned up later. def main(command_line_args=None): @@ -311,7 +321,7 @@ def main(command_line_args=None): args = [] for _ in range(iterations): - args.append(pass_list) # we need to make Iterations number of copies of this list fr the map + args.append(pass_list) # we need to make Iterations number of copies of this list for the map args = tuple(args) # convert to a tuple # Now run the executor with the map - that will run it Iterations number of times @@ -335,6 +345,7 @@ def main(command_line_args=None): if len(line) > 3: # FIXME TODO doesn't work for HIP RA results line, sep, tail = line.partition(', (') # strip off the Input Variable Values + line = line.replace('(', '').replace(')', '') # strip off the () results.append([float(y) for y in line.split(',')]) else: logger.warning(f'-9999.0 or space found in line {result_count!s}') @@ -401,10 +412,13 @@ def main(command_line_args=None): annotations = '' + # TODO remove extraneous blank lines from output file + with open(Path(output_file).with_suffix('.json'), 'w') as json_output_file: json_output_file.write(json.dumps(outputs_result)) logger.info(f'Wrote JSON results to {json_output_file.name}') + logger.info(f'Complete {__name__!s}: {sys._getframe().f_code.co_name}') diff --git a/src/geophires_x/AGSWellBores.py b/src/geophires_x/AGSWellBores.py index 3e27673b..45ab4625 100644 --- a/src/geophires_x/AGSWellBores.py +++ b/src/geophires_x/AGSWellBores.py @@ -1054,7 +1054,7 @@ def Calculate(self, model: Model) -> None: DowngoingPumpingPower, ppp2, dppw, ppwh = ProdPressureDropAndPumpingPowerUsingIndexes( model, self.productionwellpumping.value, self.usebuiltinppwellheadcorrelation, - model.reserv.Trock.value, model.reserv.depth.value, + model.reserv.Trock.value, model.reserv.InputDepth.value, self.ppwellhead.value, self.PI.value, self.prodwellflowrate.value, f3, vprod, self.injwelldiam.value, self.nprod.value, model.surfaceplant.pump_efficiency.value, diff --git a/src/geophires_x/Border_EGS_150C_Electricity_Input.txt b/src/geophires_x/Border_EGS_150C_Electricity_Input.txt new file mode 100644 index 00000000..b22141ae --- /dev/null +++ b/src/geophires_x/Border_EGS_150C_Electricity_Input.txt @@ -0,0 +1,67 @@ +Reservoir Model,1, ---Multiple, Fractures, reservoir, model +Reservoir Depth,3.7, ---[km] +Number of Segments,3, ---[-] +Gradient 1,42.69972, ---[deg.C/km] +Gradient 2,51.66667, ---[deg.C/km] +Thickness 1,0.793, ---[km] +Gradient 3,46.9697, ---[deg.C/km] +Thickness 2,1.646, ---[km] +Maximum Temperature,400, ---[deg.C] +Number of Production Wells,2, ---[-] +Number of Injection Wells,2, ---[-] +Production Well Diameter,7, ---[inch] +Injection Well Diameter,7, ---[inch] +Ramey Production Wellbore Model,1, --- +Production Wellbore Temperature Drop,.5, ---[deg.C] +Injection Wellbore Temperature Gain,0, ---[deg.C] +Production Flow Rate per Well,90, ---[kg/s] +Fracture Shape,3, ---[-] +Fracture Height,900, ---[m] +Reservoir Volume Option,3, ---[-] +Reservoir Volume,1000000000000, ---[m^3] +Number of Fractures,20, ---[-] +Water Loss Fraction,.02, ---[-] +Productivity Index,5, ---[kg/s/bar] +Injectivity Index,5, ---[kg/s/bar] +Injection Temperature,40, ---[deg.C] +Maximum Drawdown,0.3, ---[-] no redrilling considered +Reservoir Heat Capacity,975, ---[J/kg/K] +Reservoir Density,2600, ---[kg/m^3] +Reservoir Thermal Conductivity,3, ---[W/m/K] + +***SURFACE TECHNICAL PARAMETERS*** +********************************** +End-Use Option,1, ---[-] Electricity +Economic Model,1, ---[-] Fixed Charge Rate Model +Power Plant Type,2, ---[-] Supercritcal ORC +Circulation Pump Efficiency,.8, ---[-] between .1 and 1 +Utilization Factor,.9, ---[-] between .1 and 1 +Surface Temperature,20, ---[deg.C] +Ambient Temperature,20, ---[deg.C] + +***FINANCIAL PARAMETERS*** +************************** +Plant Lifetime,30, ---[years] +Fixed Charge Rate,.05, ---[-] between 0 and 1 + +Inflation Rate During Construction,0, ---[-] + +Starting Electricity Sale Price, 0.10 + +Ending Electricity Sale Price, 0.15 + +Electricity Escalation Start Year, 5 + +Electricity Escalation Rate Per Year, 0.01 + +***Simulation Parameters*** +*************************** + +Print Output to Console,1, ---[-] Should be 0 (don't print results) or 1 (print results) +Time steps per year,6, ---[1/year] + +***Output unit conversions you wish to make*** +*************************** +Units:Bottom-hole temperature, degF, ---[This is what I want the units to be for this output parameter +Units:Exploration cost,MEUR, ---[This is what I want the units to be for this output parameter +Units:O&M Make-up Water costs, MEUR/yr diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index b36bea56..5345eb98 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -40,7 +40,7 @@ def BuildPricingModel(plantlifetime: int, StartYear: int, StartPrice: float, End return Price -def CalculateRevenue(plantlifetime: int, ConstructionYears: int, CAPEX: float, OPEX: float, Energy, Price): +def CalculateTotalRevenue(plantlifetime: int, ConstructionYears: int, CAPEX: float, OPEX: float, AnnualRev, CummRev): """ CalculateRevenue calculates the revenue stream for the project. It is used to calculate the revenue stream for the project. @@ -72,8 +72,7 @@ def CalculateRevenue(plantlifetime: int, ConstructionYears: int, CAPEX: float, O CummCashFlow[i] = -1.0 * ProjectCAPEXPerConstructionYear for i in range(ConstructionYears, plantlifetime + ConstructionYears, 1): - CashFlow[i] = ((Energy[i - ConstructionYears] * Price[ - i - ConstructionYears]) / 1_000_000.0) - OPEX # Revenue/yr in MUSD + CashFlow[i] = (AnnualRev[i]) - OPEX # Calculate the cumulative revenue, skipping the first year because it is cumulative for i in range(1, plantlifetime + ConstructionYears, 1): @@ -81,6 +80,79 @@ def CalculateRevenue(plantlifetime: int, ConstructionYears: int, CAPEX: float, O return CashFlow, CummCashFlow +def CalculateRevenue(plantlifetime: int, ConstructionYears: int, Energy, Price): + """ + CalculateRevenue calculates the revenue stream for the project. It is used to calculate the revenue + stream for the project. + # note this doesn't account for OPEX + :param plantlifetime: The lifetime of the project in years in years (not including construction years) in years + :type plantlifetime: int + :param ConstructionYears: The number of years of construction for the project in years + :type ConstructionYears: int + :param Energy: The energy production array for the project in kWh + :type Energy: list + :param Price: The price model array for the project in $/kWh + :type Price: list + :return: CashFlow: The annual cash flow for the project in MUSD and CummCashFlow: The cumulative cash flow for the + project in MUSD + :rtype: list + """ + # Calculate the revenue + CashFlow = [0.0] * (plantlifetime + ConstructionYears) + CummCashFlow = [0.0] * (plantlifetime + ConstructionYears) + + # Revenue/yr in MUSD + for i in range(ConstructionYears, plantlifetime + ConstructionYears, 1): + CashFlow[i] = ((Energy[i - ConstructionYears] * Price[i - ConstructionYears]) / 1_000_000.0) + + # Calculate the cumulative revenue, skipping the first year because it is cumulative + for i in range(ConstructionYears, plantlifetime + ConstructionYears, 1): + CummCashFlow[i] = CummCashFlow[i - 1] + CashFlow[i] + return CashFlow, CummCashFlow + + +def CalculateCarbonRevenue(model, plant_lifetime: int, construction_years: int, price_dollar_lb, + grid_CO2_intensity_lb_kwh: float, natural_gas_CO2_intensity_lb_kwh: float, + NetkWhProduced, HeatkWhProduced): + # Figure out how much carbon is being produced each year, and the amount of carbon that would have been + # produced if that energy had been made using the grid average carbon production. + # That then gives us the revenue, since we have a carbon price model + # We can also get cumulative cash flow from it. + # note this doesn't account for OPEX + cash_flow_musd = [0.0] * (plant_lifetime + construction_years) + cumm_cash_flow_musd = [0.0] * (plant_lifetime + construction_years) + carbon_that_would_have_been_produced_annually_lbs = ([0.0] * (plant_lifetime + construction_years)) + carbon_that_would_have_been_produced_total_lbs = 0.0 + for i in range(construction_years, plant_lifetime + construction_years, 1): + electrical_energy_kwh = 0.0 + heat_energy_kwh = 0.0 + elec_CO2_produced_lbs = 0.0 + heat_CO2_produced_lbs = 0.0 + + # Carbon cashflow revenue (from both heat and elec) based net energy produced + if model.surfaceplant.enduse_option.value == EndUseOptions.ELECTRICITY: # This option has no heat component + electrical_energy_kwh = NetkWhProduced[i - construction_years] + elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT: # has heat component but no electricity + heat_energy_kwh = HeatkWhProduced[i - construction_years] + else: # everything else has a component of both + electrical_energy_kwh = NetkWhProduced[i - construction_years] + heat_energy_kwh = HeatkWhProduced[i - construction_years] + + elec_CO2_produced_lbs = electrical_energy_kwh * grid_CO2_intensity_lb_kwh + heat_CO2_produced_lbs = heat_energy_kwh * natural_gas_CO2_intensity_lb_kwh + + # convert lbs/year to tonnes/year + carbon_that_would_have_been_produced_annually_lbs[i] = elec_CO2_produced_lbs + heat_CO2_produced_lbs + carbon_that_would_have_been_produced_total_lbs = carbon_that_would_have_been_produced_total_lbs + \ + carbon_that_would_have_been_produced_annually_lbs[i] + + cash_flow_musd[i] = (carbon_that_would_have_been_produced_annually_lbs[i] * price_dollar_lb[i - construction_years]) / 1_000_000.0 + if i >= construction_years: + cumm_cash_flow_musd[i] = cumm_cash_flow_musd[i - 1] + cash_flow_musd[i] + + return cash_flow_musd, cumm_cash_flow_musd, carbon_that_would_have_been_produced_annually_lbs, carbon_that_would_have_been_produced_total_lbs + + def CalculateFinancialPerformance(plantlifetime: int, FixedInternalRate: float, TotalRevenue: list, @@ -127,7 +199,7 @@ def CalculateFinancialPerformance(plantlifetime: int, return NPV, IRR, VIR, MOIC -def CalculateLCOELCOH(self, model: Model) -> tuple: +def CalculateLCOELCOHLCOC(self, model: Model) -> tuple: """ CalculateLCOELCOH calculates the levelized cost of electricity and heat for the project. :param model: The model object @@ -136,7 +208,10 @@ def CalculateLCOELCOH(self, model: Model) -> tuple: :rtype: tuple """ LCOE = LCOH = LCOC = 0.0 - + CCap_elec = (self.CCap.value * self.CAPEX_heat_electricity_plant_ratio.value) + Coam_elec = (self.Coam.value * self.CAPEX_heat_electricity_plant_ratio.value) + CCap_heat = (self.CCap.value * (1.0 - self.CAPEX_heat_electricity_plant_ratio.value)) + Coam_heat = (self.Coam.value * (1.0 - self.CAPEX_heat_electricity_plant_ratio.value)) # Calculate LCOE/LCOH/LCOC if self.econmodel.value == EconomicModel.FCR: if model.surfaceplant.enduse_option.value == EndUseOptions.ELECTRICITY: @@ -148,29 +223,17 @@ def CalculateLCOELCOH(self, model: Model) -> tuple: self.averageannualpumpingcosts.value) / np.average( model.surfaceplant.HeatkWhProduced.value) * 1E8 # cents/kWh LCOH = LCOH * 2.931 # $/Million Btu + # co-gen elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # co-gen - # heat sales is additional income revenue stream - if model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, - EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT]: - averageannualheatincome = np.average( - self.HeatkWhProduced.value) * self.heat_price.value / 1E6 # M$/year ASSUMING heat_price IS IN $/KWH FOR HEAT SALES - LCOE = (self.FCR.value * ( - 1 + self.inflrateconstruction.value) * self.CCap.value + self.Coam.value - averageannualheatincome) / np.average( - model.surfaceplant.NetkWhProduced.value) * 1E8 # cents/kWh - elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, - EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # electricity sales is additional income revenue stream - averageannualelectricityincome = np.average( - model.surfaceplant.NetkWhProduced.value) * model.surfaceplant.electricity_cost_to_buy.value / 1E6 # M$/year - LCOH = (self.CCap.value + self.Coam.value - averageannualelectricityincome) / np.average( - model.surfaceplant.HeatkWhProduced.value) * 1E8 # cents/kWh - LCOH = LCOH * 2.931 # $/MMBTU + EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: + LCOE = (self.FCR.value * (1 + self.inflrateconstruction.value) * CCap_elec + Coam_elec) / np.average(model.surfaceplant.NetkWhProduced.value) * 1E8 # cents/kWh + LCOH = (self.FCR.value * (1 + self.inflrateconstruction.value) * CCap_heat + Coam_heat + self.averageannualpumpingcosts.value) / np.average(model.surfaceplant.HeatkWhProduced.value) * 1E8 # cents/kWh + LCOH = LCOH * 2.931 # $/Million Btu + elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: LCOC = (self.FCR.value * ( 1 + self.inflrateconstruction.value) * self.CCap.value + self.Coam.value + self.averageannualpumpingcosts.value) / np.average( @@ -201,27 +264,18 @@ def CalculateLCOELCOH(self, model: Model) -> tuple: self.Coam.value + model.surfaceplant.PumpingkWh.value * model.surfaceplant.electricity_cost_to_buy.value / 1E6) * discountvector)) / np.sum( model.surfaceplant.HeatkWhProduced.value * discountvector) * 1E8 # cents/kWh LCOH = LCOH * 2.931 # $/MMBTU + + # co-gen elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # co-gen - if model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, - EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT]: # heat sales is additional income revenue stream - annualheatincome = model.surfaceplant.HeatkWhProduced.value * model.surfaceplant.heat_price.value / 1E6 # M$/year ASSUMING heat_price IS IN $/KWH FOR HEAT SALES - LCOE = ((1 + self.inflrateconstruction.value) * self.CCap.value + np.sum( - (self.Coam.value - annualheatincome) * discountvector)) / np.sum( - model.surfaceplant.NetkWhProduced.value * discountvector) * 1E8 # cents/kWh - elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, - EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # electricity sales is additional income revenue stream - annualelectricityincome = model.surfaceplant.NetkWhProduced.value * model.surfaceplant.electricity_cost_to_buy.value / 1E6 # M$/year - LCOH = ((1 + self.inflrateconstruction.value) * self.CCap.value + np.sum( - (self.Coam.value - annualelectricityincome) * discountvector)) / np.sum( - model.surfaceplant.HeatkWhProduced.value * discountvector) * 1E8 # cents/kWh - LCOH = LCOH * 2.931 # $/MMBTU + EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: + LCOE = ((1 + self.inflrateconstruction.value) * CCap_elec + np.sum(Coam_elec * discountvector)) / np.sum(model.surfaceplant.NetkWhProduced.value * discountvector) * 1E8 # cents/kWh + LCOH = ((1 + self.inflrateconstruction.value) * CCap_heat + + np.sum((Coam_heat + model.surfaceplant.PumpingkWh.value * model.surfaceplant.electricity_cost_to_buy.value / 1E6) * discountvector)) / np.sum(model.surfaceplant.HeatkWhProduced.value * discountvector) * 1E8 # cents/kWh + LCOH = LCOH * 2.931 # $/MMBTU elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: LCOC = ((1 + self.inflrateconstruction.value) * self.CCap.value + np.sum(( @@ -241,58 +295,56 @@ def CalculateLCOELCOH(self, model: Model) -> tuple: model.surfaceplant.annual_heating_demand.value * discountvector) * 1E2 # cents/kWh LCOH = LCOH * 2.931 # $/Million Btu - elif self.econmodel.value == EconomicModel.BICYCLE: - iave = self.FIB.value * self.BIR.value * (1 - self.CTR.value) + ( - 1 - self.FIB.value) * self.EIR.value # average return on investment (tax and inflation adjusted) - CRF = iave / (1 - np.power(1 + iave, -model.surfaceplant.plant_lifetime.value)) # capital recovery factor - inflationvector = np.power(1 + self.RINFL.value, np.linspace(1, model.surfaceplant.plant_lifetime.value, - model.surfaceplant.plant_lifetime.value)) - discountvector = 1. / np.power(1 + iave, np.linspace(1, model.surfaceplant.plant_lifetime.value, - model.surfaceplant.plant_lifetime.value)) + else: + # must be BICYCLE + # average return on investment (tax and inflation adjusted) + iave = self.FIB.value * self.BIR.value * (1 - self.CTR.value) + (1 - self.FIB.value) * self.EIR.value + # capital recovery factor + CRF = iave / (1 - np.power(1 + iave, -model.surfaceplant.plant_lifetime.value)) + inflationvector = np.power(1 + self.RINFL.value, np.linspace(1, model.surfaceplant.plant_lifetime.value, model.surfaceplant.plant_lifetime.value)) + discountvector = 1. / np.power(1 + iave, np.linspace(1, model.surfaceplant.plant_lifetime.value, model.surfaceplant.plant_lifetime.value)) NPVcap = np.sum((1 + self.inflrateconstruction.value) * self.CCap.value * CRF * discountvector) - NPVfc = np.sum( - (1 + self.inflrateconstruction.value) * self.CCap.value * self.PTR.value * inflationvector * discountvector) - NPVit = np.sum(self.CTR.value / (1 - self.CTR.value) * (( - 1 + self.inflrateconstruction.value) * self.CCap.value * CRF - self.CCap.value / model.surfaceplant.plant_lifetime.value) * discountvector) + NPVfc = np.sum((1 + self.inflrateconstruction.value) * self.CCap.value * self.PTR.value * inflationvector * discountvector) + NPVit = np.sum(self.CTR.value / (1 - self.CTR.value) * ((1 + self.inflrateconstruction.value) * self.CCap.value * CRF - self.CCap.value / model.surfaceplant.plant_lifetime.value) * discountvector) NPVitc = (1 + self.inflrateconstruction.value) * self.CCap.value * self.RITC.value / (1 - self.CTR.value) if model.surfaceplant.enduse_option.value == EndUseOptions.ELECTRICITY: NPVoandm = np.sum(self.Coam.value * inflationvector * discountvector) NPVgrt = self.GTR.value / (1 - self.GTR.value) * (NPVcap + NPVoandm + NPVfc + NPVit - NPVitc) - LCOE = (NPVcap + NPVoandm + NPVfc + NPVit + NPVgrt - NPVitc) / np.sum( - model.surfaceplant.NetkWhProduced.value * inflationvector * discountvector) * 1E8 - elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and \ - model.surfaceplant.plant_type.value not in [PlantType.ABSORPTION_CHILLER, PlantType.HEAT_PUMP, PlantType.DISTRICT_HEATING]: + LCOE = (NPVcap + NPVoandm + NPVfc + NPVit + NPVgrt - NPVitc) / np.sum(model.surfaceplant.NetkWhProduced.value * inflationvector * discountvector) * 1E8 + elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value not in [PlantType.ABSORPTION_CHILLER, PlantType.HEAT_PUMP, PlantType.DISTRICT_HEATING]: PumpingCosts = model.surfaceplant.PumpingkWh.value * model.surfaceplant.electricity_cost_to_buy.value / 1E6 NPVoandm = np.sum((self.Coam.value + PumpingCosts) * inflationvector * discountvector) NPVgrt = self.GTR.value / (1 - self.GTR.value) * (NPVcap + NPVoandm + NPVfc + NPVit - NPVitc) - LCOH = (NPVcap + NPVoandm + NPVfc + NPVit + NPVgrt - NPVitc) / np.sum( - model.surfaceplant.HeatkWhProduced.value * inflationvector * discountvector) * 1E8 + LCOH = (NPVcap + NPVoandm + NPVfc + NPVit + NPVgrt - NPVitc) / np.sum(model.surfaceplant.HeatkWhProduced.value * inflationvector * discountvector) * 1E8 LCOH = LCOH * 2.931 # $/MMBTU + # co-gen elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # co-gen - if model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, - EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT]: # heat sales is additional income revenue stream - annualheatincome = model.surfaceplant.HeatkWhProduced.value * model.surfaceplant.heat_price.value / 1E6 # M$/year ASSUMING ELECPRICE IS IN $/KWH FOR HEAT SALES - NPVoandm = np.sum(self.Coam.value * inflationvector * discountvector) - NPVgrt = self.GTR.value / (1 - self.GTR.value) * (NPVcap + NPVoandm + NPVfc + NPVit - NPVitc) - LCOE = (NPVcap + NPVoandm + NPVfc + NPVit + NPVgrt - NPVitc - np.sum( - annualheatincome * inflationvector * discountvector)) / np.sum( - model.surfaceplant.NetkWhProduced.value * inflationvector * discountvector) * 1E8 - elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, - EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, - EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # electricity sales is additional income revenue stream - annualelectricityincome = model.surfaceplant.NetkWhProduced.value * model.surfaceplant.electricity_cost_to_buy.value / 1E6 # M$/year - NPVoandm = np.sum(self.Coam.value * inflationvector * discountvector) - NPVgrt = self.GTR.value / (1 - self.GTR.value) * (NPVcap + NPVoandm + NPVfc + NPVit - NPVitc) - LCOH = (NPVcap + NPVoandm + NPVfc + NPVit + NPVgrt - NPVitc - np.sum( - annualelectricityincome * inflationvector * discountvector)) / np.sum( - model.surfaceplant.HeatkWhProduced.value * inflationvector * discountvector) * 1E8 - LCOH = LCOH * 2.931 # $/MMBTU + EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: + + NPVcap_elec = np.sum((1 + self.inflrateconstruction.value) * CCap_elec * CRF * discountvector) + NPVfc_elec = np.sum((1 + self.inflrateconstruction.value) * CCap_elec * self.PTR.value * inflationvector * discountvector) + NPVit_elec = np.sum(self.CTR.value / (1 - self.CTR.value) * ((1 + self.inflrateconstruction.value) * CCap_elec * CRF - CCap_elec / model.surfaceplant.plant_lifetime.value) * discountvector) + NPVitc_elec = (1 + self.inflrateconstruction.value) * CCap_elec * self.RITC.value / (1 - self.CTR.value) + NPVoandm_elec = np.sum(Coam_elec * inflationvector * discountvector) + NPVgrt_elec = self.GTR.value / (1 - self.GTR.value) * (NPVcap_elec + NPVoandm_elec + NPVfc_elec + NPVit_elec - NPVitc_elec) + + LCOE = ((NPVcap_elec + NPVoandm_elec + NPVfc_elec + NPVit_elec + NPVgrt_elec - NPVitc_elec) / + np.sum(model.surfaceplant.NetkWhProduced.value * inflationvector * discountvector) * 1E8) + + NPVcap_heat = np.sum((1 + self.inflrateconstruction.value) * CCap_heat * CRF * discountvector) + NPVfc_heat = np.sum((1 + self.inflrateconstruction.value) * (self.CCap.value * (1.0 - self.CAPEX_heat_electricity_plant_ratio.value)) * self.PTR.value * inflationvector * discountvector) + NPVit_heat = np.sum(self.CTR.value / (1 - self.CTR.value) * ((1 + self.inflrateconstruction.value) * CCap_heat * CRF - CCap_heat / model.surfaceplant.plant_lifetime.value) * discountvector) + NPVitc_heat = (1 + self.inflrateconstruction.value) * CCap_heat * self.RITC.value / (1 - self.CTR.value) + NPVoandm_heat = np.sum((self.Coam.value * (1.0 - self.CAPEX_heat_electricity_plant_ratio.value)) * inflationvector * discountvector) + NPVgrt_heat = self.GTR.value / (1 - self.GTR.value) * (NPVcap_heat + NPVoandm_heat + NPVfc_heat + NPVit_heat - NPVitc_heat) + + LCOH = ((NPVcap_heat + NPVoandm_heat + NPVfc_heat + NPVit_heat + NPVgrt_heat - NPVitc_heat) / + np.sum(model.surfaceplant.HeatkWhProduced.value * inflationvector * discountvector) * 1E8) + LCOH = LCOH * 2.931 # $/MMBTU elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: PumpingCosts = model.surfaceplant.PumpingkWh.value * model.surfaceplant.electricity_cost_to_buy.value / 1E6 @@ -766,14 +818,14 @@ def __init__(self, model: Model): ErrMessage="assume default: no economics calculations", ToolTipText="Set to true if you want the add-on economics calculations to be made" ) - self.DoCCUSCalculations = self.ParameterDict[self.DoCCUSCalculations.Name] = boolParameter( - "Do CCUS Calculations", + self.DoCarbonCalculations = self.ParameterDict[self.DoCarbonCalculations.Name] = boolParameter( + "Do Carbon Price Calculations", value=False, DefaultValue=False, UnitType=Units.NONE, Required=False, - ErrMessage="assume default: no CCUS calculations", - ToolTipText="Set to true if you want the CCUS economics calculations to be made" + ErrMessage="assume default: no Carbon Credit calculations", + ToolTipText="Set to true if you want the Carbon Credit economics calculations to be made" ) self.DoSDACGTCalculations = self.ParameterDict[self.DoSDACGTCalculations.Name] = boolParameter( "Do S-DAC-GT Calculations", @@ -1055,6 +1107,116 @@ def __init__(self, model: Model): ErrMessage="assume no electricity price escalation (0.0)", ToolTipText="additional cost per year of price after escalation starts" ) + self.CoolingStartPrice = self.ParameterDict[self.CoolingStartPrice.Name] = floatParameter( + "Starting Cooling Sale Price", + value=0.025, + DefaultValue=0.025, + Min=0, + Max=100, + UnitType=Units.ENERGYCOST, + PreferredUnits=EnergyCostUnit.DOLLARSPERKWH, + CurrentUnits=EnergyCostUnit.DOLLARSPERKWH + ) + self.CoolingEndPrice = self.ParameterDict[self.CoolingEndPrice.Name] = floatParameter( + "Ending Cooling Sale Price", + value=0.025, + DefaultValue=0.025, + Min=0, + Max=100, + UnitType=Units.ENERGYCOST, + PreferredUnits=EnergyCostUnit.DOLLARSPERKWH, + CurrentUnits=EnergyCostUnit.DOLLARSPERKWH + ) + self.CoolingEscalationStart = self.ParameterDict[self.CoolingEscalationStart.Name] = intParameter( + "Cooling Escalation Start Year", + value=5, + DefaultValue=5, + AllowableRange=list(range(0, 101, 1)), + UnitType=Units.TIME, + PreferredUnits=TimeUnit.YEAR, + CurrentUnits=TimeUnit.YEAR, + ErrMessage="assume default cooling escalation delay time (5 years)", + ToolTipText="Number of years after start of project before start of escalation" + ) + self.CoolingEscalationRate = self.ParameterDict[self.CoolingEscalationRate.Name] = floatParameter( + "Cooling Escalation Rate Per Year", + value=0.0, + DefaultValue=0.0, + Min=0.0, + Max=100.0, + UnitType=Units.ENERGYCOST, + PreferredUnits=EnergyCostUnit.DOLLARSPERKWH, + CurrentUnits=EnergyCostUnit.DOLLARSPERKWH, + ErrMessage="assume no cooling price escalation (0.0)", + ToolTipText="additional cost per year of price after escalation starts" + ) + self.CarbonStartPrice = self.ParameterDict[self.CarbonStartPrice.Name] = floatParameter( + "Starting Carbon Credit Value", + value=0.0, + DefaultValue=0.0, + Min=0, + Max=1000, + UnitType=Units.COSTPERMASS, + PreferredUnits=CostPerMassUnit.DOLLARSPERLB, + CurrentUnits=CostPerMassUnit.DOLLARSPERLB + ) + self.CarbonEndPrice = self.ParameterDict[self.CarbonEndPrice.Name] = floatParameter( + "Ending Carbon Credit Value", + value=0.0, + DefaultValue=0.0, + Min=0, + Max=1000, + UnitType=Units.COSTPERMASS, + PreferredUnits=CostPerMassUnit.DOLLARSPERLB, + CurrentUnits=CostPerMassUnit.DOLLARSPERLB + ) + self.CarbonEscalationStart = self.ParameterDict[self.CarbonEscalationStart.Name] = intParameter( + "Carbon Escalation Start Year", + value=0, + DefaultValue=0, + AllowableRange=list(range(0, 101, 1)), + UnitType=Units.TIME, + PreferredUnits=TimeUnit.YEAR, + CurrentUnits=TimeUnit.YEAR, + ErrMessage="assume default Carbon escalation delay time (5 years)", + ToolTipText="Number of years after start of project before start of Carbon incentives" + ) + self.CarbonEscalationRate = self.ParameterDict[self.CarbonEscalationRate.Name] = floatParameter( + "Carbon Escalation Rate Per Year", + value=0.0, + DefaultValue=0.0, + Min=0.0, + Max=100.0, + UnitType=Units.COSTPERMASS, + PreferredUnits=CostPerMassUnit.DOLLARSPERLB, + CurrentUnits=CostPerMassUnit.DOLLARSPERLB, + ErrMessage="assume no Carbon credit escalation (0.0)", + ToolTipText="additional value per year of price after escalation starts" + ) + self.GridCO2Intensity = self.ParameterDict[self.GridCO2Intensity.Name] = floatParameter( + "Current Grid CO2 production", + value=0.93916924, + DefaultValue=0.93916924, + Min=0, + Max=50000, + UnitType=Units.CO2PRODUCTION, + PreferredUnits=CO2ProductionUnit.LBSPERKWH, + CurrentUnits=CO2ProductionUnit.LBSPERKWH, + ErrMessage="assume the grid carbon intensity of Texas ERCOT by grid (0.93916924 lbs/kWh)", #LBSPERKWH https://uh.edu/uh-energy-innovation/uh-energy/energy-research/white-papers/white-paper-files/net-zero-in-texas-electric-grid.pdf + ToolTipText="CO2 intensity of the grid (how much CO2 is produced per kWh of electricity produced (0.93916924 lbs/kWh for Texas ERCOT))" + ) + self.NaturalGasCO2Intensity = self.ParameterDict[self.NaturalGasCO2Intensity.Name] = floatParameter( + "CO2 produced by Natural Gas", + value=0.070324961, + DefaultValue=0.070324961, + Min=0, + Max=50000, + UnitType=Units.CO2PRODUCTION, + PreferredUnits=CO2ProductionUnit.LBSPERKWH, + CurrentUnits=CO2ProductionUnit.LBSPERKWH, + ErrMessage="assume the default value CO2 production for burning natural gas (0.407855 lbs/kWh)", #LBSPERKWH https://www.epa.gov/energy/greenhouse-gases-equivalencies-calculator-calculations-and-references + ToolTipText="CO2 intensity of buring natural gas (how much CO2 is produced per kWh of heat produced (0.407855 lbs/kWh))" + ) self.AnnualLicenseEtc = self.ParameterDict[self.AnnualLicenseEtc.Name] = floatParameter( "Annual License Fees Etc", @@ -1114,8 +1276,26 @@ def __init__(self, model: Model): ErrMessage="assume default for fixed internal rate (6.25%)", ToolTipText="Fixed Internal Rate (used in NPV calculation)" ) + self.CAPEX_heat_electricity_plant_ratio = self.ParameterDict[self.CAPEX_heat_electricity_plant_ratio.Name] = floatParameter( + "CHP Electrical Plant Cost Allocation Ratio", + value=-1.0, + DefaultValue=-1.0, + Min=0.0, + Max=1.0, + UnitType=Units.PERCENT, + PreferredUnits=PercentUnit.TENTH, + CurrentUnits=PercentUnit.TENTH, + Provided=False, + ErrMessage="assume calculation for CHP Electrical Plant Cost Allocation Ratio (cost electrical plant/total CAPEX)", + ToolTipText="CHP Electrical Plant Cost Allocation Ratio (cost electrical plant/total CAPEX)" + ) # local variable initialization + self.CAPEX_cost_electricity_plant = 0.0 + self.CAPEX_cost_heat_plant = 0.0 + self.OPEX_cost_electricity_plant = 0.0 + self.OPEX_cost_heat_plant = 0.0 + self.CAPEX_heat_electricity_plant_ratio.value = 0.0 self.Claborcorrelation = 0.0 self.Cpumps = 0.0 self.annualelectricityincome = 0.0 @@ -1140,6 +1320,18 @@ def __init__(self, model: Model): PreferredUnits=EnergyCostUnit.CENTSSPERKWH, CurrentUnits=EnergyCostUnit.CENTSSPERKWH ) + self.CoolingPrice = self.OutputParameterDict[self.CoolingPrice.Name] = OutputParameter( + "Heat Sale Price Model", + UnitType=Units.ENERGYCOST, + PreferredUnits=EnergyCostUnit.CENTSSPERKWH, + CurrentUnits=EnergyCostUnit.CENTSSPERKWH + ) + self.CarbonPrice = self.OutputParameterDict[self.CarbonPrice.Name] = OutputParameter( + "Carbon Price Model", + UnitType=Units.COSTPERMASS, + PreferredUnits=CostPerMassUnit.DOLLARSPERTONNE, + CurrentUnits=CostPerMassUnit.DOLLARSPERTONNE + ) self.LCOC = self.OutputParameterDict[self.LCOC.Name] = OutputParameter( Name="LCOC", @@ -1301,11 +1493,49 @@ def __init__(self, model: Model): CurrentUnits=CurrencyFrequencyUnit.MDOLLARSPERYEAR ) self.HeatCummRevenue = self.OutputParameterDict[self.HeatCummRevenue.Name] = OutputParameter( - Name="Cumulative Revenue from Electricity Production", + Name="Cumulative Revenue from Heat Production", + UnitType=Units.CURRENCY, + PreferredUnits=CurrencyUnit.MDOLLARS, + CurrentUnits=CurrencyUnit.MDOLLARS + ) + self.CoolingRevenue = self.OutputParameterDict[self.CoolingRevenue.Name] = OutputParameter( + Name="Annual Revenue from Cooling Production", + UnitType=Units.CURRENCYFREQUENCY, + PreferredUnits=CurrencyFrequencyUnit.MDOLLARSPERYEAR, + CurrentUnits=CurrencyFrequencyUnit.MDOLLARSPERYEAR + ) + self.CoolingCummRevenue = self.OutputParameterDict[self.CoolingCummRevenue.Name] = OutputParameter( + Name="Cumulative Revenue from Cooling Production", UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, CurrentUnits=CurrencyUnit.MDOLLARS ) + self.CarbonRevenue = self.OutputParameterDict[self.CarbonRevenue.Name] = OutputParameter( + Name="Annual Revenue from Carbon Pricing", + UnitType=Units.CURRENCYFREQUENCY, + PreferredUnits=CurrencyFrequencyUnit.MDOLLARSPERYEAR, + CurrentUnits=CurrencyFrequencyUnit.MDOLLARSPERYEAR + ) + self.CarbonCummCashFlow = self.OutputParameterDict[self.CarbonCummCashFlow.Name] = OutputParameter( + Name="Cumulative Revenue from Carbon Pricing", + UnitType=Units.CURRENCY, + PreferredUnits=CurrencyUnit.MDOLLARS, + CurrentUnits=CurrencyUnit.MDOLLARS + ) + self.CarbonThatWouldHaveBeenProducedAnnually = self.OutputParameterDict[ + self.CarbonThatWouldHaveBeenProducedAnnually.Name] = OutputParameter( + "Annual Saved Carbon Production", + UnitType=Units.MASS, + PreferredUnits=MassUnit.LB, + CurrentUnits=MassUnit.LB + ) + self.CarbonThatWouldHaveBeenProducedTotal = self.OutputParameterDict[ + self.CarbonThatWouldHaveBeenProducedTotal.Name] = OutputParameter( + "Total Saved Carbon Production", + UnitType=Units.MASS, + PreferredUnits=MassUnit.LB, + CurrentUnits=MassUnit.LB + ) self.TotalRevenue = self.OutputParameterDict[self.TotalRevenue.Name] = OutputParameter( Name="Annual Revenue from Project", UnitType=Units.CURRENCYFREQUENCY, @@ -1342,6 +1572,12 @@ def __init__(self, model: Model): PreferredUnits=PercentUnit.TENTH, CurrentUnits=PercentUnit.TENTH ) + self.ProjectPaybackPeriod = self.OutputParameterDict[self.ProjectPaybackPeriod.Name] = OutputParameter( + "Project Payback Period", + UnitType=Units.TIME, + PreferredUnits=TimeUnit.YEAR, + CurrentUnits=TimeUnit.YEAR + ) model.logger.info("Complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) @@ -1377,22 +1613,7 @@ def read_parameters(self, model: Model) -> None: ReadParameter(ParameterReadIn, ParameterToModify, model) # handle special cases - if ParameterToModify.Name == "Do AddOn Calculations": - if ParameterReadIn.sValue == '1': - self.DoAddOnCalculations.value = True - else: - self.DoAddOnCalculations.value = False - elif ParameterToModify.Name == "Do CCUS Calculations": - if ParameterReadIn.sValue == '1': - self.DoCCUSCalculations.value = True - else: - self.DoCCUSCalculations.value = False - elif ParameterToModify.Name == "Do S-DAC-GT Calculations": - if ParameterReadIn.sValue == '1': - self.DoSDACGTCalculations.value = True - else: - self.DoSDACGTCalculations.value = False - elif ParameterToModify.Name == "Economic Model": + if ParameterToModify.Name == "Economic Model": if ParameterReadIn.sValue == '1': self.econmodel.value = EconomicModel.FCR elif ParameterReadIn.sValue == '2': @@ -1733,10 +1954,6 @@ def read_parameters(self, model: Model) -> None: if key.startswith("AddOn"): self.DoAddOnCalculations.value = True break - for key in model.InputParameters.keys(): - if key.startswith("CCUS"): - self.DoCCUSCalculations.value = True - break for key in model.InputParameters.keys(): if key.startswith("S-DAC-GT"): self.DoSDACGTCalculations.value = True @@ -1760,11 +1977,12 @@ def Calculate(self, model: Model) -> None: :type model: :class:`~geophires_x.Model.Model` :return: Nothing, but it does make calculations and set values in the model """ - model.logger.info(f'Init {__class__!s}: {sys._getframe().f_code.co_name}') + model.logger.info("Init " + str(__class__) + ": " + sys._getframe().f_code.co_name) # capital costs # well costs (using GeoVision drilling correlations). These are calculated whether totalcapcostvalid = 1 # start with the cost of one well + # C1well is well drilling and completion cost in M$/well if self.ccwellfixed.Valid: self.C1well = self.ccwellfixed.value self.Cwell.value = self.C1well * (model.wellbores.nprod.value + model.wellbores.ninj.value) @@ -1779,33 +1997,26 @@ def Calculate(self, model: Model) -> None: model.logger.warning(msg) self.wellcorrelation.value = WellDrillingCostCorrelation.SIMPLE + # use SIMPLE approach if user has specified it if self.wellcorrelation.value == WellDrillingCostCorrelation.SIMPLE: - # use SIMPLE approach + # using the "Configuration" keywords means we are doing an AGS calculation if hasattr(model.wellbores, 'Configuration'): if model.wellbores.Configuration.value == Configuration.ULOOP: + # found out if we are using simple cylindrical model, which has an Input and Output Depth if hasattr(model.reserv, 'InputDepth'): - # must be using simple cylindrical model, which has an Input and Output Depth - self.C1well = ((self.Vertical_drilling_cost_per_m.value * - (model.reserv.InputDepth.quantity().to('m').magnitude)) + - (self.Vertical_drilling_cost_per_m.value * ( - model.reserv.OutputDepth.quantity().to('m').magnitude)) + - ( - self.Nonvertical_drilling_cost_per_m.value * model.wellbores.Nonvertical_length.value)) * 1E-6 + # cost of one closed-loop well = cost of 2 verticals + cost of horizontal section(s) + self.C1well = ((self.Vertical_drilling_cost_per_m.value * (model.reserv.InputDepth.value * 1000.0)) + + (self.Vertical_drilling_cost_per_m.value * (model.reserv.OutputDepth.value * 1000.0)) + + (model.wellboew.numnonverticalsections.value * self.Nonvertical_drilling_cost_per_m.value * model.wellbores.Nonvertical_length.value)) * 1E-6 else: if hasattr(model.wellbores, 'Nonvertical_length'): - self.C1well = ((2 * self.Vertical_drilling_cost_per_m.value * - (model.reserv.depth.quantity().to('m').magnitude)) + - ( - self.Nonvertical_drilling_cost_per_m.value * model.wellbores.Nonvertical_length.value)) * 1E-6 + self.C1well = ((2 * self.Vertical_drilling_cost_per_m.value * (model.reserv.depth.value * 1000.0)) + + (self.Nonvertical_drilling_cost_per_m.value * model.wellbores.Nonvertical_length.value)) * 1E-6 else: - self.C1well = (2 * self.Vertical_drilling_cost_per_m.value * ( - model.reserv.depth.value.quantity().to('m').magnitude)) * 1E-6 - else: - # Coaxial - self.C1well = ((self.Vertical_drilling_cost_per_m.value * (model.reserv.depth.quantity().to('m').magnitude)) + - ( - self.Nonvertical_drilling_cost_per_m.value * model.wellbores.Nonvertical_length.value)) * 1E-6 - + self.C1well = (2 * self.Vertical_drilling_cost_per_m.value * (model.reserv.depth.value * 1000.0)) * 1E-6 + else: # Coaxial + self.C1well = ((self.Vertical_drilling_cost_per_m.value * (model.reserv.depth.value * 1000.0)) + + (self.Nonvertical_drilling_cost_per_m.value * model.wellbores.Nonvertical_length.value)) * 1E-6 else: self.C1well = self.Vertical_drilling_cost_per_m.value * model.reserv.depth.quantity().to( 'm').magnitude * 1E-6 @@ -2069,25 +2280,32 @@ def Calculate(self, model: Model) -> None: if self.ccplantfixed.Valid: self.Cplant.value = self.ccplantfixed.value + self.CAPEX_cost_electricity_plant = self.Cplant.value * self.CAPEX_heat_electricity_plant_ratio.value + self.CAPEX_cost_heat_plant = self.Cplant.value * (1.0 - self.CAPEX_heat_electricity_plant_ratio.value) else: # 1.02 to convert cost from 2012 to 2016 #factor 1.15 for 15% contingency and 1.12 for 12% indirect costs. factor 1.10 to convert from 2016 to 2022 self.Cplant.value = 1.12 * 1.15 * self.ccplantadjfactor.value * self.Cplantcorrelation * 1.02 * 1.10 + self.CAPEX_cost_electricity_plant = self.Cplant.value # add direct-use plant cost of co-gen system to Cplant (only of no total Cplant was provided) if not self.ccplantfixed.Valid: # 1.15 below for contingency and 1.12 for indirect costs if model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT]: # enduse_option = 3: cogen topping cycle - self.Cplant.value = self.Cplant.value + 1.12 * 1.15 * self.ccplantadjfactor.value * 250E-6 * np.max( + self.CAPEX_cost_heat_plant = 1.12 * 1.15 * self.ccplantadjfactor.value * 250E-6 * np.max( model.surfaceplant.HeatProduced.value / model.surfaceplant.enduse_efficiency_factor.value) * 1000. elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY]: # enduse_option = 4: cogen bottoming cycle - self.Cplant.value = self.Cplant.value + 1.12 * 1.15 * self.ccplantadjfactor.value * 250E-6 * np.max( + self.CAPEX_cost_heat_plant = 1.12 * 1.15 * self.ccplantadjfactor.value * 250E-6 * np.max( model.surfaceplant.HeatProduced.value / model.surfaceplant.enduse_efficiency_factor.value) * 1000. elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT]: # cogen parallel cycle - self.Cplant.value = self.Cplant.value + 1.12 * 1.15 * self.ccplantadjfactor.value * 250E-6 * np.max( + self.CAPEX_cost_heat_plant = 1.12 * 1.15 * self.ccplantadjfactor.value * 250E-6 * np.max( model.surfaceplant.HeatProduced.value / model.surfaceplant.enduse_efficiency_factor.value) * 1000. + self.Cplant.value = self.Cplant.value + self.CAPEX_cost_heat_plant + if not self.CAPEX_heat_electricity_plant_ratio.Provided: + self.CAPEX_heat_electricity_plant_ratio.value = self.CAPEX_cost_electricity_plant/self.Cplant.value + if not self.totalcapcost.Valid: # exploration costs (same as in Geophires v1.2) (M$) if self.ccexplfixed.Valid: @@ -2134,6 +2352,9 @@ def Calculate(self, model: Model) -> None: else: self.CCap.value = self.totalcapcost.value + # Add in the FlatLicenseEtc, OtherIncentives, & TotalGrant + self.CCap.value = self.CCap.value + self.FlatLicenseEtc.value - self.OtherIncentives.value - self.TotalGrant.value + # O&M costs # calculate first O&M costs independent of whether oamtotalfixed is provided or not # additional electricity cost for heat pump as end-use @@ -2225,8 +2446,14 @@ def Calculate(self, model: Model) -> None: if model.wellbores.redrill.value > 0: # account for well redrilling self.Coam.value = self.Coam.value + \ - ( - self.Cwell.value + self.Cstim.value) * model.wellbores.redrill.value / model.surfaceplant.plant_lifetime.value + (self.Cwell.value + self.Cstim.value) * model.wellbores.redrill.value / model.surfaceplant.plant_lifetime.value + + # Add in the AnnualLicenseEtc and TaxRelief + self.Coam.value = self.Coam.value + self.AnnualLicenseEtc.value - self.TaxRelief.value + + # partition the OPEX for CHP plants based on the CAPEX ratio + self.OPEX_cost_electricity_plant = self.Coam.value * self.CAPEX_heat_electricity_plant_ratio.value + self.OPEX_cost_heat_plant = self.Coam.value * (1.0 - self.CAPEX_heat_electricity_plant_ratio.value) # The Reservoir depth measure was arbitrarily changed to meters despite being defined in the docs as kilometers. # For display consistency sake, we need to convert it back @@ -2241,24 +2468,52 @@ def Calculate(self, model: Model) -> None: self.HeatPrice.value = BuildPricingModel(model.surfaceplant.plant_lifetime.value, 0, self.HeatStartPrice.value, self.HeatEndPrice.value, self.HeatEscalationStart.value, self.HeatEscalationRate.value) - - # Add in the FlatLicenseEtc, OtherIncentives, TotalGrant, AnnualLicenseEtc, and TaxRelief - self.CCap.value = self.CCap.value + self.FlatLicenseEtc.value - self.OtherIncentives.value - self.TotalGrant.value - self.Coam.value = self.Coam.value + self.AnnualLicenseEtc.value - self.TaxRelief.value + self.CoolingPrice.value = BuildPricingModel(model.surfaceplant.plant_lifetime.value, 0, + self.CoolingStartPrice.value, self.CoolingEndPrice.value, + self.CoolingEscalationStart.value, self.CoolingEscalationRate.value) + self.CarbonPrice.value = BuildPricingModel(model.surfaceplant.plant_lifetime.value, self.CarbonEscalationStart.value, + self.CarbonStartPrice.value, self.CarbonEndPrice.value, + self.CarbonEscalationStart.value, self.CarbonEscalationRate.value) + + # do the additional economic calculations first, if needed, so the summaries below work. + if self.DoAddOnCalculations.value: + model.addeconomics.Calculate(model) + if self.DoSDACGTCalculations.value: + model.sdacgteconomics.Calculate(model) # Calculate cashflow and cumulative cash flow + total_duration = model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value + self.ElecRevenue.value = [0.0] * total_duration + self.ElecCummRevenue.value = [0.0] * total_duration + self.HeatRevenue.value = [0.0] * total_duration + self.HeatCummRevenue.value = [0.0] * total_duration + self.CoolingRevenue.value = [0.0] * total_duration + self.CoolingCummRevenue.value = [0.0] * total_duration + self.CarbonRevenue.value = [0.0] * total_duration + self.CarbonCummCashFlow.value = [0.0] * total_duration + self.TotalRevenue.value = [0.0] * total_duration + self.TotalCummRevenue.value = [0.0] * total_duration + self.CarbonThatWouldHaveBeenProducedTotal.value = 0.0 + + # Based on the style of the project, calculate the revenue & cumulative revenue if model.surfaceplant.enduse_option.value == EndUseOptions.ELECTRICITY: self.ElecRevenue.value, self.ElecCummRevenue.value = CalculateRevenue( - model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, self.CCap.value, - self.Coam.value, model.surfaceplant.NetkWhProduced.value, self.ElecPrice.value) + model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, + model.surfaceplant.NetkWhProduced.value, self.ElecPrice.value) self.TotalRevenue.value = self.ElecRevenue.value - self.TotalCummRevenue.value = self.ElecCummRevenue.value - elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT: + #self.TotalCummRevenue.value = self.ElecCummRevenue.value + elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value not in [PlantType.ABSORPTION_CHILLER]: self.HeatRevenue.value, self.HeatCummRevenue.value = CalculateRevenue( - model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, self.CCap.value, - self.Coam.value, model.surfaceplant.HeatkWhProduced.value, self.HeatPrice.value) + model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, + model.surfaceplant.HeatkWhProduced.value, self.HeatPrice.value) self.TotalRevenue.value = self.HeatRevenue.value - self.TotalCummRevenue.value = self.HeatCummRevenue.value + #self.TotalCummRevenue.value = self.HeatCummRevenue.value + elif model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value in [PlantType.ABSORPTION_CHILLER]: + self.CoolingRevenue.value, self.CoolingCummRevenue.value = CalculateRevenue( + model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, + model.surfaceplant.cooling_kWh_Produced.value, self.CoolingPrice.value) + self.TotalRevenue.value = self.CoolingRevenue.value + #self.TotalCummRevenue.value = self.CoolingCummRevenue.value elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, @@ -2266,23 +2521,47 @@ def Calculate(self, model: Model) -> None: EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # co-gen # else: - self.ElecRevenue.value, self.ElecCummRevenue.self = CalculateRevenue( - model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, self.CCap.value, - self.Coam.value, model.surfaceplant.NetkWhProduced.value, self.ElecPrice.value) - # note that CAPEX & OPEX are 0.0 because we only want them counted once, and it will be accounted - # for in the previous line - self.HeatRevenue.value, self.HeatCummRevenue.self = CalculateRevenue( - model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, 0.0, 0.0, + self.ElecRevenue.value, self.ElecCummRevenue.value = CalculateRevenue( + model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, + model.surfaceplant.NetkWhProduced.value, self.ElecPrice.value) + self.HeatRevenue.value, self.HeatCummRevenue.value = CalculateRevenue( + model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, model.surfaceplant.HeatkWhProduced.value, self.HeatPrice.value) - self.TotalRevenue.value = [0.0] * ( - model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value) - self.TotalCummRevenue.value = [0.0] * ( - model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value) + for i in range(0, model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value, 1): self.TotalRevenue.value[i] = self.ElecRevenue.value[i] + self.HeatRevenue.value[i] - self.TotalCummRevenue.value[i] = self.TotalRevenue.value[i] - if i > 0: - self.TotalCummRevenue.value[i] = self.TotalCummRevenue.value[i - 1] + self.TotalRevenue.value[i] + #if i > 0: + # self.TotalCummRevenue.value[i] = self.TotalCummRevenue.value[i - 1] + self.TotalRevenue.value[i] + + if self.DoCarbonCalculations.value: + self.CarbonRevenue.value, self.CarbonCummCashFlow.value, self.CarbonThatWouldHaveBeenProducedAnnually.value, \ + self.CarbonThatWouldHaveBeenProducedTotal.value = CalculateCarbonRevenue(model, + model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, + self.CarbonPrice.value, self.GridCO2Intensity.value, self.NaturalGasCO2Intensity.value, + model.surfaceplant.NetkWhProduced.value, model.surfaceplant.HeatkWhProduced.value) + for i in range(model.surfaceplant.construction_years.value, model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value, 1): + self.TotalRevenue.value[i] = self.TotalRevenue.value[i] + self.CarbonRevenue.value[i] + #self.TotalCummRevenue.value[i] = self.TotalCummRevenue.value[i] + self.CarbonCummCashFlow.value[i] + + # Insert the cost of construction into the front of the array that will be used to calculate NPV + # the convention is that the upfront CAPEX is negative + # This is the same for all projects + ProjectCAPEXPerConstructionYear = self.CCap.value / model.surfaceplant.construction_years.value + for i in range(0, model.surfaceplant.construction_years.value, 1): + self.TotalRevenue.value[i] = -1.0 * ProjectCAPEXPerConstructionYear + self.TotalCummRevenue.value[i] = -1.0 * ProjectCAPEXPerConstructionYear +# self.TotalRevenue.value, self.TotalCummRevenue.value = CalculateTotalRevenue( +# model.surfaceplant.plant_lifetime.value, model.surfaceplant.construction_years.value, self.CCap.value, +# self.Coam.value, self.TotalRevenue.value, self.TotalCummRevenue.value) + + # Do a one-time calculation that accounts for OPEX - no OPEX in the first year. + for i in range(model.surfaceplant.construction_years.value, + model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value, 1): + self.TotalRevenue.value[i] = self.TotalRevenue.value[i] - self.Coam.value + + # Now do a one-time calculation that calculates the cumulative cash flow after everything else has been accounted for + for i in range(1, model.surfaceplant.plant_lifetime.value + model.surfaceplant.construction_years.value, 1): + self.TotalCummRevenue.value[i] = self.TotalCummRevenue.value[i-1] + self.TotalRevenue.value[i] # Calculate more financial values using numpy financials self.ProjectNPV.value, self.ProjectIRR.value, self.ProjectVIR.value, self.ProjectMOIC.value = \ @@ -2290,10 +2569,21 @@ def Calculate(self, model: Model) -> None: self.TotalRevenue.value, self.TotalCummRevenue.value, self.CCap.value, self.Coam.value) + # Calculate the project payback period + self.ProjectPaybackPeriod.value = 0.0 # start by assuming the project never pays back + for i in range(0, len(self.TotalCummRevenue.value), 1): + # find out when the cumm cashflow goes from negative to positive + if self.TotalCummRevenue.value[i] > 0 >= self.TotalCummRevenue.value[i - 1]: + # we just crossed the threshold into positive project cummcashflow, so we can calculate payback period + dFullDiff = self.TotalCummRevenue.value[i] + math.fabs(self.TotalCummRevenue.value[(i - 1)]) + dPerc = math.fabs(self.TotalCummRevenue.value[(i - 1)]) / dFullDiff + self.ProjectPaybackPeriod.value = i + dPerc + + # Calculate LCOE/LCOH - self.LCOE.value, self.LCOH.value, self.LCOC.value = CalculateLCOELCOH(self, model) + self.LCOE.value, self.LCOH.value, self.LCOC.value = CalculateLCOELCOHLCOC(self, model) - model.logger.info(f'complete {__class__!s}: {sys._getframe().f_code.co_name}') + model.logger.info("complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) def __str__(self): return "Economics" diff --git a/src/geophires_x/EconomicsAddOns.py b/src/geophires_x/EconomicsAddOns.py index d4c2962f..91670e6d 100644 --- a/src/geophires_x/EconomicsAddOns.py +++ b/src/geophires_x/EconomicsAddOns.py @@ -128,12 +128,6 @@ def __init__(self, model: Model): PreferredUnits=CurrencyFrequencyUnit.MDOLLARSPERYEAR, CurrentUnits=CurrencyFrequencyUnit.MDOLLARSPERYEAR ) - self.ProjectPaybackPeriod = self.OutputParameterDict[self.ProjectPaybackPeriod.Name] = OutputParameter( - "Project Payback Period", - UnitType=Units.TIME, - PreferredUnits=TimeUnit.YEAR, - CurrentUnits=TimeUnit.YEAR - ) self.AddOnPaybackPeriod = self.OutputParameterDict[self.AddOnPaybackPeriod.Name] = OutputParameter( "AddOn Payback Period", UnitType=Units.TIME, @@ -348,7 +342,7 @@ def Calculate(self, model: Model) -> None: self.ProjectIRR.value = 0.0 self.ProjectVIR.value = 1.0 + (self.ProjectNPV.value / self.AdjustedProjectCAPEX.value) - # calculate Cummcashflows and paybacks + # calculate Cummcashflows and payback period self.ProjectCummCashFlow.value = [0.0] * len(self.ProjectCashFlow.value) i = 0 for val in self.ProjectCashFlow.value: @@ -356,11 +350,6 @@ def Calculate(self, model: Model) -> None: self.ProjectCummCashFlow.value[i] = val else: self.ProjectCummCashFlow.value[i] = self.ProjectCummCashFlow.value[i - 1] + val - if self.ProjectCummCashFlow.value[i] > 0 >= self.ProjectCummCashFlow.value[ - i - 1]: # we just crossed the threshold into positive project cummcashflow, so we can calculate payback period - dFullDiff = self.ProjectCummCashFlow.value[i] + math.fabs(self.ProjectCummCashFlow.value[(i - 1)]) - dPerc = math.fabs(self.ProjectCummCashFlow.value[(i - 1)]) / dFullDiff - self.ProjectPaybackPeriod.value = i + dPerc i = i + 1 i = 0 self.AddOnCummCashFlow.value = [0.0] * len(self.AddOnCashFlow.value) @@ -382,7 +371,7 @@ def Calculate(self, model: Model) -> None: self.AdjustedProjectOPEX.value * model.surfaceplant.plant_lifetime.value)) # recalculate LCOE/LCOH - self.LCOE.value, self.LCOH.value, LCOC = Economics.CalculateLCOELCOH(self, model) + self.LCOE.value, self.LCOH.value, LCOC = Economics.CalculateLCOELCOHLCOC(self, model) model.logger.info(f'complete {str(__class__)}: {sys._getframe().f_code.co_name}') diff --git a/src/geophires_x/EconomicsCCUS.py b/src/geophires_x/EconomicsCCUS.py index c3877290..9969661c 100644 --- a/src/geophires_x/EconomicsCCUS.py +++ b/src/geophires_x/EconomicsCCUS.py @@ -226,12 +226,6 @@ def __init__(self, model): PreferredUnits=PercentUnit.TENTH, CurrentUnits=PercentUnit.TENTH ) - self.ProjectPaybackPeriod = self.OutputParameterDict[self.ProjectPaybackPeriod.Name] = OutputParameter( - "Project Payback Period", - UnitType=Units.TIME, - PreferredUnits=TimeUnit.YEAR, - CurrentUnits=TimeUnit.YEAR - ) self.ProjectMOIC = self.OutputParameterDict[self.ProjectMOIC.Name] = OutputParameter( "Project Multiple of Invested Capital", UnitType=Units.PERCENT, @@ -429,11 +423,6 @@ def Calculate(self, model) -> None: self.ProjectCummCashFlow.value[0] = val else: self.ProjectCummCashFlow.value[i] = self.ProjectCummCashFlow.value[i - 1] + val - if self.ProjectCummCashFlow.value[i] > 0 >= self.ProjectCummCashFlow.value[ - i - 1]: # we just crossed the threshold into positive project cummcashflow, so we can calculate payback period - dFullDiff = self.ProjectCummCashFlow.value[i] + math.fabs(self.ProjectCummCashFlow.value[(i - 1)]) - dPerc = math.fabs(self.ProjectCummCashFlow.value[(i - 1)]) / dFullDiff - self.ProjectPaybackPeriod.value = i + dPerc i = i + 1 # Calculate more financial values using numpy financials diff --git a/src/geophires_x/EconomicsS_DAC_GT.py b/src/geophires_x/EconomicsS_DAC_GT.py index 081a6a5d..8e42b3c0 100644 --- a/src/geophires_x/EconomicsS_DAC_GT.py +++ b/src/geophires_x/EconomicsS_DAC_GT.py @@ -43,8 +43,8 @@ def __init__(self, model: Model): """ model.logger.info("Init " + str(__class__) + ": " + sys._getframe().f_code.co_name) - # These disctionaries contains a list of all the parameters set in this object, stored as "Parameter" and - # OutputParameter Objects. This will alow us later to access them in a user interface and get that list, + # These dictionaries contains a list of all the parameters set in this object, stored as "Parameter" and + # OutputParameter Objects. This will allow us later to access them in a user interface and get that list, # along with unit type, preferred units, etc. self.ParameterDict = {} self.OutputParameterDict = {} @@ -593,15 +593,18 @@ def Calculate(self, model: Model) -> None: print(err_message + " Exiting....") sys.exit() - self.CRF = self.calculate_CRF(self.wacc.value, - model.surfaceplant.plant_lifetime.value) # Calculate initial CRF value based on default inputs - CAPEX = self.CAPEX.value * self.CRF # don't change a parameters value directly - it throw off the rehydration + # Calculate initial CRF value based on default inputs + self.CRF = self.calculate_CRF(self.wacc.value, model.surfaceplant.plant_lifetime.value) + + # don't change a parameters value directly - it throw off the rehydration + CAPEX = self.CAPEX.value * self.CRF CAPEX = CAPEX * self.CAPEX_mult.value self.OPEX.value = self.OPEX.value * self.OPEX_mult.value self.therm.value = self.therm.value * self.therm_index.value power_totalcost = self.elec.value * model.surfaceplant.electricity_cost_to_buy.value elec_heat_totalcost = self.therm.value * model.surfaceplant.electricity_cost_to_buy.value - # Convert from $/McF to $/kWh_th, but don't change a parameters value directly - it will throw off the rehydration + + # Convert from $/McF to $/kWh_th, but don't change any parameters value directly - it will throw off the rehydration NG_price = self.NG_price.value / self.NG_EnergyDensity.value NG_totalcost = self.therm.value * NG_price self.LCOH.value, self.kWh_e_per_kWh_th.value = self.geo_therm_cost(model.surfaceplant.electricity_cost_to_buy.value, @@ -659,7 +662,8 @@ def Calculate(self, model: Model) -> None: # some (all) of it to do the capture, so when they get used in the final economic calculation (below), # the new values reflect the impact of S-DAC-GT for i in range(0, model.surfaceplant.plant_lifetime.value): - if model.surfaceplant.enduse_option.value != EndUseOptions.HEAT: # all these end-use options have an electricity generation component + if model.surfaceplant.enduse_option.value != EndUseOptions.HEAT: + # all these end-use options have an electricity generation component model.surfaceplant.TotalkWhProduced.value[i] = model.surfaceplant.TotalkWhProduced.value[i] - ( self.CarbonExtractedAnnually.value[i] * self.elec.value) model.surfaceplant.NetkWhProduced.value[i] = model.surfaceplant.NetkWhProduced.value[i] - ( @@ -668,8 +672,18 @@ def Calculate(self, model: Model) -> None: model.surfaceplant.HeatkWhProduced.value[i] = model.surfaceplant.HeatkWhProduced.value[i] - ( self.CarbonExtractedAnnually.value[i] * self.therm.value) else: - model.surfaceplant.HeatkWhProduced.value[i] = model.surfaceplant.HeatkWhProduced.value[i] - ( - self.CarbonExtractedAnnually.value[ - i] * self.therm.value) # all the end-use option of direct-use only component - - model.logger.info("complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) + # all the end-use option of direct-use only component + model.surfaceplant.HeatkWhProduced.value[i] = (model.surfaceplant.HeatkWhProduced.value[i] - + (self.CarbonExtractedAnnually.value[i] * self.therm.value)) + + # Build a revenue generation model for the carbon capture, assuming the capture is being sequestered and that + # there is some sort of credit involved for doing that sequestering + # note that there may already be values in the CarbonRevenue array, so we need to + # add to them, not just set them. If there isn't values, there, the array will be filed with zeros, so adding won't be a problem + #total_duration = model.surfaceplant.plant_lifetime.value + #for i in range(0, total_duration, 1): + # model.sdacgteconomics.CarbonRevenue.value[i] = (model.sdacgteconomics.CarbonRevenue.value[i] + + # (self.CarbonExtractedAnnually.value[i] * model.economics.CarbonPrice.value[i])) +# if i > 0: +# model.economics.CarbonCummCashFlow.value[i] = model.economics.CarbonCummCashFlow.value[i - 1] + model.economics.CarbonRevenue.value[i] + model.logger.info("Complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) diff --git a/src/geophires_x/GEOPHIRESv3.py b/src/geophires_x/GEOPHIRESv3.py index dd4643f9..92757fdc 100644 --- a/src/geophires_x/GEOPHIRESv3.py +++ b/src/geophires_x/GEOPHIRESv3.py @@ -53,10 +53,6 @@ def main(enable_geophires_logging_config=True): json_addons = jsons.dumps(model.addeconomics.OutputParameterDict, indent=4, sort_keys=True, supress_warnings=True) json_merged = {**json_merged, **json.loads(json_addons)} - if model.economics.DoCCUSCalculations.value: - json_ccus = jsons.dumps(model.ccuseconomics.OutputParameterDict, indent=4, sort_keys=True, - supress_warnings=True) - json_merged = {**json_merged, **json.loads(json_ccus)} if model.economics.DoSDACGTCalculations.value: json_sdacgt = jsons.dumps(model.sdacgteconomics.OutputParameterDict, indent=4, sort_keys=True, supress_warnings=True) diff --git a/src/geophires_x/Model.py b/src/geophires_x/Model.py index 479ba652..d24f79ba 100644 --- a/src/geophires_x/Model.py +++ b/src/geophires_x/Model.py @@ -1,15 +1,11 @@ -import sys from pathlib import Path import logging import time import logging.config -from geophires_x.Reservoir import Reservoir -from geophires_x.EconomicsCCUS import EconomicsCCUS from geophires_x.EconomicsS_DAC_GT import EconomicsS_DAC_GT from geophires_x.GeoPHIRESUtils import read_input_file from geophires_x.OutputsAddOns import OutputsAddOns -from geophires_x.OutputsCCUS import OutputsCCUS from geophires_x.OutputsS_DAC_GT import OutputsS_DAC_GT from geophires_x.TDPReservoir import TDPReservoir from geophires_x.WellBores import WellBores @@ -48,13 +44,17 @@ class Model(object): Model is the container class of the application, giving access to everything else, including the logger """ - def __init__(self, enable_geophires_logging_config=True, input_file=None): + def __init__(self, enable_geophires_logging_config=True): + """ + The __init__ function is called automatically every time the class is being used to create a new object. + :return: Nothing + """ # get logging started - self.logger = logging.getLogger('root') # TODO should be getting __name__ logger instead of root + self.logger = logging.getLogger('root') if enable_geophires_logging_config: - logging.config.fileConfig(Path(Path(__file__).parent, 'logging.conf')) + logging.config.fileConfig(Path(Path(__file__).parent,'logging.conf')) self.logger.setLevel(logging.INFO) self.logger.info(f'Init {__class__}: {__name__}') @@ -68,13 +68,8 @@ def __init__(self, enable_geophires_logging_config=True, input_file=None): # we do this as soon as possible because what we instantiate may depend on settings in this file self.InputParameters = {} - if input_file is None and len(sys.argv) > 1: - input_file = sys.argv[1] - - read_input_file(self.InputParameters, logger=self.logger, input_file_name=input_file) + read_input_file(self.InputParameters, logger=self.logger) - self.ccuseconomics = None - self.ccusoutputs = None self.sdacgtoutputs = None self.sdacgteconomics = None self.addoutputs = None @@ -86,41 +81,36 @@ def __init__(self, enable_geophires_logging_config=True, input_file=None): # we need to decide which reservoir to instantiate based on the user input (InputParameters), # which we just read above for the first time # Default is Thermal drawdown percentage model (GETEM) - self.reserv: Reservoir = TDPReservoir(self) + self.reserv: TDPReservoir = TDPReservoir(self) if 'Reservoir Model' in self.InputParameters: if self.InputParameters['Reservoir Model'].sValue == '0': - self.reserv: Reservoir = CylindricalReservoir(self) # Simple Cylindrical Reservoir + self.reserv: CylindricalReservoir = CylindricalReservoir(self) # Simple Cylindrical Reservoir elif self.InputParameters['Reservoir Model'].sValue == '1': - self.reserv: Reservoir = MPFReservoir(self) # Multiple parallel fractures model (LANL) + self.reserv: MPFReservoir = MPFReservoir(self) # Multiple parallel fractures model (LANL) elif self.InputParameters['Reservoir Model'].sValue == '2': - self.reserv: Reservoir = LHSReservoir(self) # Multiple parallel fractures model (LANL) + self.reserv: LHSReservoir = LHSReservoir(self) # Multiple parallel fractures model (LANL) elif self.InputParameters['Reservoir Model'].sValue == '3': - self.reserv: Reservoir = SFReservoir(self) # Drawdown parameter model (Tester) + self.reserv: SFReservoir = SFReservoir(self) # Drawdown parameter model (Tester) elif self.InputParameters['Reservoir Model'].sValue == '5': - self.reserv: Reservoir = UPPReservoir(self) # Generic user-provided temperature profile + self.reserv: UPPReservoir = UPPReservoir(self) # Generic user-provided temperature profile elif self.InputParameters['Reservoir Model'].sValue == '6': - self.reserv: Reservoir = TOUGH2Reservoir(self) # Tough2 is called + self.reserv: TOUGH2Reservoir = TOUGH2Reservoir(self) # Tough2 is called elif self.InputParameters['Reservoir Model'].sValue == '7': - self.reserv: Reservoir = SUTRAReservoir(self) # SUTRA output is created + self.reserv: SUTRAReservoir = SUTRAReservoir(self) # SUTRA output is created # initialize the default objects self.wellbores: WellBores = WellBores(self) - self.surfaceplant = SurfacePlant(self) - self.economics = Economics(self) - - output_file = 'HDR.out' - if len(sys.argv) > 2: - output_file = sys.argv[2] - - self.outputs = Outputs(self, output_file=output_file) + self.surfaceplant: SurfacePlant = SurfacePlant(self) + self.economics: Economics = Economics(self) + self.outputs: Outputs = Outputs(self) if 'Reservoir Model' in self.InputParameters: if self.InputParameters['Reservoir Model'].sValue == '7': # if we use SUTRA output for simulating reservoir thermal energy storage, we use a special wellbore object that can handle SUTRA data self.wellbores: WellBores = SUTRAWellBores(self) - self.surfaceplant = SurfacePlantSUTRA(self) - self.economics = SUTRAEconomics(self) - self.outputs = SUTRAOutputs(self, output_file=output_file) + self.surfaceplant: SurfacePlantSUTRA = SurfacePlantSUTRA(self) + self.economics: SUTRAEconomics = SUTRAEconomics(self) + self.outputs: SUTRAOutputs = SUTRAOutputs(self) if 'Is AGS' in self.InputParameters: if self.InputParameters['Is AGS'].sValue in ['True', 'true', 'TRUE', 'T', '1']: @@ -129,31 +119,25 @@ def __init__(self, enable_geophires_logging_config=True, input_file=None): # that have AGS functionality. # that means importing them, initializing them, then reading their parameters # use the simple cylindrical reservoir for all AGS systems. - self.reserv: Reservoir = CylindricalReservoir(self) + self.reserv: CylindricalReservoir = CylindricalReservoir(self) self.wellbores: WellBores = AGSWellBores(self) - self.surfaceplant = SurfacePlantAGS(self) - self.economics = AGSEconomics(self) - self.outputs = AGSOutputs(self, output_file=output_file) + self.surfaceplant: SurfacePlantAGS = SurfacePlantAGS(self) + self.economics: AGSEconomics = AGSEconomics(self) + self.outputs: AGSOutputs = AGSOutputs(self) self.wellbores.IsAGS.value = True # if we find out we have an add-ons, we need to instantiate it, then read for the parameters if 'AddOn Nickname 1' in self.InputParameters: self.logger.info("Initiate the Add-on elements") - self.addeconomics = EconomicsAddOns(self) - self.addoutputs = OutputsAddOns(self, output_file=output_file) - - # if we find out we have a ccus, we need to instantiate it, then read for the parameters - if 'Ending CCUS Credit Value' in self.InputParameters: - self.logger.info("Initiate the CCUS elements") - self.ccuseconomics = EconomicsCCUS(self) - self.ccusoutputs = OutputsCCUS(self, output_file=output_file) + self.addeconomics: EconomicsAddOns = EconomicsAddOns(self) + self.addoutputs: OutputsAddOns = OutputsAddOns(self) # if we find out we have an S-DAC-GT calculation, we need to instantiate it - if 'S-DAC-GT' in self.InputParameters: - if self.InputParameters['S-DAC-GT'].sValue == 'On': + if 'Do S-DAC-GT Calculations' in self.InputParameters: + if self.InputParameters['Do S-DAC-GT Calculations'].sValue in ['On', 'on', 'ON', 'True', 'true', 'TRUE', 'T', 't', '1']: self.logger.info("Initiate the S-DAC-GT elements") - self.sdacgteconomics = EconomicsS_DAC_GT(self) - self.sdacgtoutputs = OutputsS_DAC_GT(self, output_file=output_file) + self.sdacgteconomics: EconomicsS_DAC_GT = EconomicsS_DAC_GT(self) + self.sdacgtoutputs: OutputsS_DAC_GT = OutputsS_DAC_GT(self) self.logger.info(f'Complete {__class__}: {__name__}') @@ -180,10 +164,6 @@ def read_parameters(self) -> None: if self.economics.DoAddOnCalculations.value: self.addeconomics.read_parameters(self) self.addoutputs.read_parameters(self) - # if we find out we have a ccus, read for the parameters - if self.economics.DoCCUSCalculations.value: - self.ccuseconomics.read_parameters(self) - self.ccusoutputs.read_parameters(self) # if we find out we have an S-DAC-GT calculation, read for the parameters if self.economics.DoSDACGTCalculations.value: self.sdacgteconomics.read_parameters(self) @@ -256,12 +236,4 @@ def Calculate(self): self.economics.Calculate(self) # model the economics - # do the additional economic calculations if needed - if self.economics.DoAddOnCalculations.value: - self.addeconomics.Calculate(self) - if self.economics.DoCCUSCalculations.value: - self.ccuseconomics.Calculate(self) - if self.economics.DoSDACGTCalculations.value: - self.sdacgteconomics.Calculate(self) - self.logger.info(f'complete {__class__}: {__name__}') diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 911f7ae1..943cdc9c 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -102,7 +102,7 @@ def PrintOutputs(self, model: Model): # write results to output file and screen try: - with open(self.output_file, 'w', encoding='UTF-8') as f: + with (open(self.output_file, 'w', encoding='UTF-8') as f): f.write(' *****************\n') f.write(' ***CASE REPORT***\n') f.write(' *****************\n') @@ -119,27 +119,33 @@ def PrintOutputs(self, model: Model): f.write(' ***SUMMARY OF RESULTS***\n') f.write(NL) f.write(" End-Use Option: " + str(model.surfaceplant.enduse_option.value.value) + NL) - if model.surfaceplant.plant_type.value == PlantType.DISTRICT_HEATING: - f.write(f" Annual District Heating Demand: {np.average(model.surfaceplant.annual_heating_demand.value):10.2f} " + model.surfaceplant.annual_heating_demand.CurrentUnits.value + NL) - f.write(f" Average Annual Geothermal Heat Production: {sum(model.surfaceplant.dh_geothermal_heating.value * 24) / model.surfaceplant.plant_lifetime.value / 1e3:10.2f} " + model.surfaceplant.annual_heating_demand.CurrentUnits.value + NL) - f.write(f" Average Annual Peaking Fuel Heat Production: {sum(model.surfaceplant.dh_natural_gas_heating.value * 24) / model.surfaceplant.plant_lifetime.value / 1e3:10.2f} " + model.surfaceplant.annual_heating_demand.CurrentUnits.value + NL) if model.surfaceplant.enduse_option.value in [EndUseOptions.ELECTRICITY, EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: # there is an electricity component f.write(f" Average Net Electricity Production: {np.average(model.surfaceplant.NetElectricityProduced.value):10.2f} " + model.surfaceplant.NetElectricityProduced.CurrentUnits.value + NL) if model.surfaceplant.enduse_option.value != EndUseOptions.ELECTRICITY: # there is a direct-use component f.write(f" Average Direct-Use Heat Production: {np.average(model.surfaceplant.HeatProduced.value):10.2f} "+ model.surfaceplant.HeatProduced.CurrentUnits.value + NL) - + if model.surfaceplant.plant_type.value == PlantType.DISTRICT_HEATING: + f.write(f" Annual District Heating Demand: {np.average(model.surfaceplant.annual_heating_demand.value):10.2f} " + model.surfaceplant.annual_heating_demand.CurrentUnits.value + NL) + f.write(f" Average Annual Geothermal Heat Production: {sum(model.surfaceplant.dh_geothermal_heating.value * 24) / model.surfaceplant.plant_lifetime.value / 1e3:10.2f} " + model.surfaceplant.annual_heating_demand.CurrentUnits.value + NL) + f.write(f" Average Annual Peaking Fuel Heat Production: {sum(model.surfaceplant.dh_natural_gas_heating.value * 24) / model.surfaceplant.plant_lifetime.value / 1e3:10.2f} " + model.surfaceplant.annual_heating_demand.CurrentUnits.value + NL) if model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: f.write(f" Average Cooling Production: {np.average(model.surfaceplant.cooling_produced.value):10.2f} " + model.surfaceplant.cooling_produced.CurrentUnits.value + NL) - if model.surfaceplant.enduse_option.value in [EndUseOptions.ELECTRICITY, EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT]: #levelized cost expressed as LCOE - f.write(f" Electricity breakeven price: {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) - elif model.surfaceplant.enduse_option.value in [EndUseOptions.HEAT, EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY] \ - and model.surfaceplant.plant_type.value not in [PlantType.ABSORPTION_CHILLER]: # levelized cost expressed as LCOH - f.write(f" Direct-Use heat breakeven price: {model.economics.LCOH.value:10.2f} " + model.economics.LCOH.CurrentUnits.value + NL) - + if model.surfaceplant.enduse_option.value in [EndUseOptions.ELECTRICITY]: + f.write(f" Electricity breakeven price (LCOE): {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) + elif model.surfaceplant.enduse_option.value in [EndUseOptions.HEAT] and \ + model.surfaceplant.plant_type.value not in [PlantType.ABSORPTION_CHILLER]: + f.write(f" Direct-Use heat breakeven price (LCOH): {model.economics.LCOH.value:10.2f} " + model.economics.LCOH.CurrentUnits.value + NL) elif model.surfaceplant.enduse_option.value in [EndUseOptions.HEAT] and model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: - f.write(f" Direct-Use Cooling Breakeven Price: {model.economics.LCOC.value:10.2f} " + model.economics.LCOC.CurrentUnits.value + NL) + f.write(f" Direct-Use Cooling Breakeven Price (LCOC): {model.economics.LCOC.value:10.2f} " + model.economics.LCOC.CurrentUnits.value + NL) + elif model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, + EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, + EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, + EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, + EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, + EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: + f.write(f" Electricity breakeven price (LCOE): {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) + f.write(f" Direct-Use heat breakeven price (LCOH): {model.economics.LCOH.value:10.2f} " + model.economics.LCOH.CurrentUnits.value + NL) f.write(f" Number of production wells: {model.wellbores.nprod.value:10.0f}"+NL) f.write(f" Number of injection wells: {model.wellbores.ninj.value:10.0f}"+NL) @@ -153,6 +159,8 @@ def PrintOutputs(self, model: Model): f.write(f" Segment {str(i):s} Geothermal gradient: {model.reserv.gradient.value[i-1]:10.4f} " + model.reserv.gradient.CurrentUnits.value +NL) f.write(f" Segment {str(i):s} Thickness: {model.reserv.layerthickness.value[i-1]:10.0f} " + model.reserv.layerthickness.CurrentUnits.value + NL) f.write(f" Segment {str(i+1):s} Geothermal gradient: {model.reserv.gradient.value[i]:10.4f} " + model.reserv.gradient.CurrentUnits.value + NL) + if model.economics.DoCarbonCalculations.value: + f.write(f" Total Avoided Carbon Emissions: {model.economics.CarbonThatWouldHaveBeenProducedTotal.value*0.000453592:10.2f} metric tonnes" + NL) f.write(NL) f.write(NL) @@ -173,6 +181,14 @@ def PrintOutputs(self, model: Model): f.write(f" Project IRR: {model.economics.ProjectIRR.value:10.2f} " + model.economics.ProjectIRR.PreferredUnits.value + NL) f.write(f" Project VIR=PI=PIR: {model.economics.ProjectVIR.value:10.2f}" + NL) f.write(f" Project MOIC: {model.economics.ProjectMOIC.value:10.2f}" + NL) + f.write(f" Project Payback Period: {model.economics.ProjectPaybackPeriod.value:10.2f} " + model.economics.ProjectPaybackPeriod.PreferredUnits.value + NL) + if model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, + EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, + EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, + EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, + EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, + EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: + f.write(f" CHP: Percent cost allocation for electrical plant: {model.economics.CAPEX_heat_electricity_plant_ratio.value*100.0:10.2f}%" + NL) f.write(NL) f.write(' ***ENGINEERING PARAMETERS***\n') @@ -554,13 +570,85 @@ def PrintOutputs(self, model: Model): model.surfaceplant.RemainingReservoirHeatContent.value[i], (model.reserv.InitialReservoirHeatContent.value-model.surfaceplant.RemainingReservoirHeatContent.value[i])*100/model.reserv.InitialReservoirHeatContent.value)+NL) - - +# import rich +# from rich.console import Console +# from rich.table import Table +# from rich import print as rprint + +# ytable = Table() +# ytable.add_column('Year Since') +# etable = Table() +# etable.add_column('Price, $/kWh', width=10, justify="center") +# etable.add_column('Annual Revenue, MUSD', width=15, justify="center") +# etable.add_column('Cumulative Revenue, MUSD', width=15, justify="center") +# htable = Table() +# htable.add_column('Price, $/kWh', width=10, justify="center") +# htable.add_column('Annual Revenue, MUSD', width=15, justify="center") +# htable.add_column('Cumulative Revenue, MUSD', width=15, justify="center") +# ctable = Table() +# ctable.add_column('Price, 4$/kWh', width=10, justify="center") +# ctable.add_column('Annual Revenue, MUSD', width=15, justify="center") +# ctable.add_column('Cumulative Revenue, MUSD', width=15, justify="center") +# econ = model.economics +# for ii in range(0, (model.surfaceplant.construction_years.value + model.surfaceplant.plant_lifetime.value - 1), 1): +# ytable.add_row(str(ii)) +# etable.add_row(str(econ.ElecPrice.value[ii]), str(econ.ElecRevenue.value[ii]), str(econ.ElecCummRevenue.value[ii])) +# htable.add_row(str(econ.HeatPrice.value[ii]), str(econ.HeatRevenue.value[ii]), str(econ.HeatCummRevenue.value[ii])) +# ctable.add_row(str(econ.CoolingPrice.value[ii]), str(econ.CoolingRevenue.value[ii]), str(econ.CoolingCummRevenue.value[ii])) +# +# #with open("d:\\temp\\test_table.html", "wt") as f: +# ttable = Table(title="REVENUE & CASHFLOW PROFILE", width=350) +# ttable.add_column('', width=10, justify="center") +# ttable.add_column('Electricity', width=35, justify="center") +# ttable.add_column('Heat', width=35, justify="center") +# ttable.add_column('Cooling', width=35, justify="center") +# ttable.add_row(ytable, etable, htable, ctable) +# console = Console(file=f, style="bold white on blue", force_terminal=True, record=True) +# console.print(ttable) + + #if model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: + f.write(NL) + f.write(NL) + f.write(" *******************************" + NL) + f.write(" * REVENUE & CASHFLOW PROFILE *" + NL) + f.write(" *******************************" + NL) + f.write( + "Year Electricity | Heat | Cooling | Carbon | Project" + NL) + f.write( + "Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow" + NL) + econ = model.economics + f.write("Start (" + + econ.ElecPrice.PreferredUnits.value + + ")(" + econ.ElecRevenue.PreferredUnits.value + + ") (" + econ.ElecCummRevenue.PreferredUnits.value + + ") |(" + econ.HeatPrice.PreferredUnits.value + + ") (" + econ.HeatRevenue.PreferredUnits.value + + ") (" + econ.HeatCummRevenue.PreferredUnits.value + + ") |(" + econ.CoolingPrice.PreferredUnits.value + + ") (" + econ.CoolingRevenue.PreferredUnits.value + + ") (" + econ.CoolingCummRevenue.PreferredUnits.value + + ") |(" + econ.CarbonPrice.PreferredUnits.value + + ") (" + econ.CarbonRevenue.PreferredUnits.value + + ") (" + econ.CarbonCummCashFlow.PreferredUnits.value + + ") |(" + econ.Coam.PreferredUnits.value + + ") (" + econ.TotalRevenue.PreferredUnits.value + + ") (" + econ.TotalCummRevenue.PreferredUnits.value + ")\n") + f.write( + "________________________________________________________________________________________________________________________________________________________________________________________" + NL) + # running years... + for ii in range(0, ( + model.surfaceplant.construction_years.value + model.surfaceplant.plant_lifetime.value - 1), 1): + if ii < model.surfaceplant.construction_years.value: + OPEX = 0.0 # zero out the OPEX during construction years + else: + OPEX = econ.Coam.value + f.write( + f"{ii + 1:3.0f} {econ.ElecPrice.value[ii]:5.2f} {econ.ElecRevenue.value[ii]:5.2f} {econ.ElecCummRevenue.value[ii]:5.2f} | {econ.HeatPrice.value[ii]:5.2f} {econ.HeatRevenue.value[ii]:5.2f} {econ.HeatCummRevenue.value[ii]:5.2f} | {econ.CoolingPrice.value[ii]:5.2f} {econ.CoolingRevenue.value[ii]:5.2f} {econ.CoolingCummRevenue.value[ii]:5.2f} | {econ.CarbonPrice.value[ii]:5.2f} {econ.CarbonRevenue.value[ii]:5.2f} {econ.CarbonCummCashFlow.value[ii]:5.2f} | {OPEX:5.2f} {econ.TotalRevenue.value[ii]:5.2f} {econ.TotalCummRevenue.value[ii]:5.2f}\n") f.write(NL) if model.economics.DoAddOnCalculations.value: model.addoutputs.PrintOutputs(model) - if model.economics.DoCCUSCalculations.value: model.ccusoutputs.PrintOutputs(model) if model.economics.DoSDACGTCalculations.value: model.sdacgtoutputs.PrintOutputs(model) + except BaseException as ex: tb = sys.exc_info()[2] print (str(ex)) diff --git a/src/geophires_x/OutputsAddOns.py b/src/geophires_x/OutputsAddOns.py index cf3ea209..d00df6e7 100644 --- a/src/geophires_x/OutputsAddOns.py +++ b/src/geophires_x/OutputsAddOns.py @@ -45,8 +45,6 @@ def PrintOutputs(self, model): f" Project VIR=PI=PIR (including AddOns): {model.addeconomics.ProjectVIR.value:10.2f}" + NL) f.write( f" Project MOIC (including AddOns): {model.addeconomics.ProjectMOIC.value:10.2f}" + NL) - f.write( - f" Project Payback Period (including AddOns): {model.addeconomics.ProjectPaybackPeriod.value:10.2f} " + model.addeconomics.ProjectPaybackPeriod.PreferredUnits.value + NL) if model.addeconomics.AddOnCAPEXTotal.value + model.addeconomics.AddOnOPEXTotalPerYear.value != 0: f.write( f" Total Add-on CAPEX: {model.addeconomics.AddOnCAPEXTotal.value:10.2f} " + model.addeconomics.AddOnCAPEXTotal.PreferredUnits.value + NL) diff --git a/src/geophires_x/OutputsCCUS.py b/src/geophires_x/OutputsCCUS.py index 9d43892d..0cb2cd00 100644 --- a/src/geophires_x/OutputsCCUS.py +++ b/src/geophires_x/OutputsCCUS.py @@ -35,7 +35,6 @@ def PrintOutputs(self, model): f.write(f" Project IRR (including carbon credit): {model.ccuseconomics.ProjectIRR.value:10.2f} " + model.ccuseconomics.ProjectIRR.PreferredUnits.value + NL) f.write(f" Project VIR=IR=PIR (including carbon credit): {model.ccuseconomics.ProjectVIR.value:10.2f}" + NL) f.write(f" Project MOIC (including carbon credit): {model.ccuseconomics.ProjectMOIC.value:10.2f}" + NL) - f.write(f" Project Payback Period (including carbon credit): {model.ccuseconomics.ProjectPaybackPeriod.value:10.2f} " + model.ccuseconomics.ProjectPaybackPeriod.PreferredUnits.value + NL) f.write(NL) f.write(NL) f.write(" ******************" + NL) diff --git a/src/geophires_x/Parameter.py b/src/geophires_x/Parameter.py index 02ae833c..56d7e33f 100644 --- a/src/geophires_x/Parameter.py +++ b/src/geophires_x/Parameter.py @@ -243,9 +243,9 @@ def ReadParameter(ParameterReadIn: ParameterEntry, ParamToModify, model): # these Parameter Types don't have units so don't do anything fancy, and ignore it if the user has supplied units if isinstance(ParamToModify, boolParameter) or isinstance(ParamToModify, strParameter): if isinstance(ParamToModify, boolParameter): - if ParameterReadIn.sValue.lower() in ['0', 'false']: + if ParameterReadIn.sValue in ['0', 'false', 'False', 'f', 'F', 'no', 'No', 'n', 'N']: ParamToModify.value = False - elif ParameterReadIn.sValue.lower() in ['1', 'true']: + elif ParameterReadIn.sValue in ['1', 'true', 'True', 't', 'T', 'yes', 'Yes', 'y', 'Y']: ParamToModify.value = True else: ParamToModify.value = bool(ParameterReadIn.sValue) diff --git a/src/hip_ra/HIP.html b/src/hip_ra/HIP.html new file mode 100644 index 00000000..f201c25d --- /dev/null +++ b/src/hip_ra/HIP.html @@ -0,0 +1,31 @@ + + + + + + + +
                               *********************
+                               ***HIP CASE REPORT***
+                               *********************
+                           ***SUMMARY OF RESULTS***
+      Reservoir Temperature:       250.00 degC
+      Reservoir Volume:             13.75 km**3
+      Stored Heat:               7.42e+15 kJ
+      Fluid Produced:            1.09e+12 kilogram
+      Enthalpy:                    181.43 kJ/kg
+      Wellhead Heat:             8.19e+14 kJ
+      Recovery Factor:              11.04 %
+      Available Heat:            1.44e+13 kJ
+      Producible Heat:           5.75e+12 kJ
+      Producible Electricity:      182.47 MW
+
+ + diff --git a/src/hip_ra/HIP_RA.py b/src/hip_ra/HIP_RA.py index d8b4db7a..81600231 100755 --- a/src/hip_ra/HIP_RA.py +++ b/src/hip_ra/HIP_RA.py @@ -765,22 +765,28 @@ def render_scientific(p: floatParameter | OutputParameter) -> str: case_data = {'SUMMARY OF RESULTS': summary_of_results} - with open(outputfile, 'w', encoding='UTF-8') as f: - nl = '\n' + from rich.console import Console - f.write(f' *********************{nl}') - f.write(f' ***HIP CASE REPORT***{nl}') - f.write(f' *********************{nl}') - f.write(nl) - f.write(f' ***SUMMARY OF RESULTS***{nl}') - f.write(nl) + with open(outputfile, 'w') as f: + console = Console(file=f, style='bold white on blue', force_terminal=True, record=True) + + # with open(outputfile, 'a', encoding='UTF-8') as f: + + console.print(' *********************') + console.print(' ***HIP CASE REPORT***') + console.print(' *********************') + # console.print(nl) + console.print(' ***SUMMARY OF RESULTS***') + # console.print(nl) for k, v in case_data['SUMMARY OF RESULTS'].items(): # align space between value and units to same column kv_spaces = max(1, (24 - (len(v.split(' ')[0]) + len(k)))) * ' ' - f.write(f' {k}:{kv_spaces}{v}{nl}') + # f.write(f' {k}:{kv_spaces}{v}{nl}') + console.print(f' {k}:{kv_spaces}{v}') + console.save_html(outputfile.replace('.txt', 'html')) except BaseException as ex: tb = sys.exc_info()[2] print(str(ex)) diff --git a/tests/examples/S-DAC-GT.txt b/tests/examples/S-DAC-GT.txt index 9546ebf8..b41e9345 100644 --- a/tests/examples/S-DAC-GT.txt +++ b/tests/examples/S-DAC-GT.txt @@ -9,8 +9,10 @@ But only lists those patameters that are different than their default values ***Subsurface technical parameters*** ************************************* -S-DAC-GT, On Reservoir Model,3, ---m/A Single Fracture Thermal Drawdown +Reservoir Depth,3.1, ---[km] +Number of Segments,1, ---[-] +Maximum Temperature,400, ---[deg.C] Drawdown Parameter,.00002, ---[kg/s/m2] Gradient 1,70, ---[deg.C/km] Number of Production Wells,3, ---[-] diff --git a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out index d376d35d..f77399e1 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -4,8 +4,12 @@ Simulation Metadata ---------------------- + GEOPHIRES Version: 3.4.2 GEOPHIRES Version: 3.4.3 GEOPHIRES Build Date: 2022-06-30 + Simulation Date: 2024-02-16 + Simulation Time: 09:18 + Calculation Time: 3.788 sec Simulation Date: 2024-02-18 Simulation Time: 08:29 Calculation Time: 1.660 sec @@ -14,7 +18,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 1.10 MW - Electricity breakeven price: 44.08 cents/kWh + Electricity breakeven price: 44.02 cents/kWh Number of production wells: 1 Number of injection wells: 0 Flowrate per production well: 110.0 kg/sec @@ -28,10 +32,12 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 40 yr Capacity factor: 90.0 % - Project NPV: -45.16 MUSD + Project NPV: -45.14 MUSD Project IRR: 0.00 % Project VIR=PI=PIR: -0.02 Project MOIC: -0.72 + Project VIR=PI=PIR: -0.02 + Project Payback Period: 0.00 yr ***ENGINEERING PARAMETERS*** @@ -77,10 +83,10 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t Drilling and completion costs per well: 20.48 MUSD Stimulation costs: 0.00 MUSD Surface power plant costs: 6.74 MUSD - Field gathering system costs: 0.51 MUSD + Field gathering system costs: 0.50 MUSD Total surface equipment costs: 7.24 MUSD Exploration costs: 16.36 MUSD - Total capital costs: 44.08 MUSD + Total capital costs: 44.07 MUSD ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** @@ -98,11 +104,13 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t Average Total Electricity Generation: 1.11 MW Minimum Total Electricity Generation: 0.94 MW Initial Total Electricity Generation: 1.66 MW - Maximum Net Electricity Generation: 1.66 MW + Maximum Net Electricity Generation: 1.67 MW Average Net Electricity Generation: 1.10 MW Minimum Net Electricity Generation: 0.94 MW Initial Net Electricity Generation: 1.66 MW Average Annual Total Electricity Generation: 8.64 GWh + Average Annual Net Electricity Generation: 8.63 GWh + Initial pumping power/net installed power: 100.00 % Average Annual Net Electricity Generation: 8.62 GWh Initial pumping power/net installed power: 0.21 % Average Pumping Power: 0.00 MW @@ -113,46 +121,46 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t YEAR THERMAL GEOFLUID PUMP NET FIRST LAW DRAWDOWN TEMPERATURE POWER POWER EFFICIENCY (degC) (MW) (MW) (%) - 1 1.0000 120.00 0.0034 1.6611 6.2250 - 2 0.9302 111.62 0.0035 1.2897 5.6178 - 3 0.9187 110.24 0.0035 1.2342 5.5235 - 4 0.9121 109.45 0.0035 1.2029 5.4699 - 5 0.9074 108.89 0.0035 1.1813 5.4328 - 6 0.9039 108.46 0.0035 1.1649 5.4044 - 7 0.9010 108.12 0.0035 1.1516 5.3816 - 8 0.8985 107.83 0.0035 1.1406 5.3625 - 9 0.8965 107.58 0.0035 1.1312 5.3461 - 10 0.8946 107.36 0.0035 1.1230 5.3318 - 11 0.8930 107.16 0.0035 1.1157 5.3191 - 12 0.8915 106.98 0.0035 1.1091 5.3077 - 13 0.8902 106.82 0.0035 1.1032 5.2974 - 14 0.8890 106.68 0.0035 1.0978 5.2879 - 15 0.8879 106.54 0.0035 1.0928 5.2793 - 16 0.8868 106.42 0.0035 1.0882 5.2712 - 17 0.8858 106.30 0.0035 1.0839 5.2637 - 18 0.8849 106.19 0.0035 1.0799 5.2567 - 19 0.8841 106.09 0.0035 1.0762 5.2502 - 20 0.8833 105.99 0.0035 1.0727 5.2440 - 21 0.8825 105.90 0.0035 1.0693 5.2381 - 22 0.8818 105.81 0.0035 1.0662 5.2326 - 23 0.8811 105.73 0.0035 1.0632 5.2273 - 24 0.8804 105.65 0.0035 1.0603 5.2223 - 25 0.8798 105.58 0.0035 1.0576 5.2176 - 26 0.8792 105.50 0.0035 1.0550 5.2130 - 27 0.8786 105.43 0.0035 1.0525 5.2086 - 28 0.8781 105.37 0.0035 1.0501 5.2044 - 29 0.8775 105.30 0.0035 1.0478 5.2004 - 30 0.8770 105.24 0.0035 1.0456 5.1965 - 31 0.8765 105.18 0.0035 1.0435 5.1928 - 32 0.8761 105.13 0.0035 1.0415 5.1892 - 33 0.8756 105.07 0.0035 1.0395 5.1857 - 34 0.8751 105.02 0.0035 1.0376 5.1823 - 35 0.8747 104.97 0.0035 1.0357 5.1791 - 36 0.8743 104.91 0.0035 1.0339 5.1759 - 37 0.8739 104.87 0.0035 1.0322 5.1729 - 38 0.8735 104.82 0.0035 1.0305 5.1699 - 39 0.8731 104.77 0.0035 1.0289 5.1670 - 40 0.8727 104.73 0.0035 1.0273 5.1642 + 1 1.0000 120.00 0.0021 1.6624 6.2299 + 2 0.9302 111.62 0.0021 1.2910 5.6235 + 3 0.9187 110.24 0.0021 1.2355 5.5293 + 4 0.9121 109.45 0.0021 1.2042 5.4759 + 5 0.9074 108.89 0.0021 1.1826 5.4388 + 6 0.9039 108.46 0.0021 1.1662 5.4105 + 7 0.9010 108.12 0.0021 1.1529 5.3877 + 8 0.8985 107.83 0.0021 1.1419 5.3686 + 9 0.8965 107.58 0.0021 1.1325 5.3523 + 10 0.8946 107.36 0.0021 1.1243 5.3380 + 11 0.8930 107.16 0.0021 1.1170 5.3253 + 12 0.8915 106.98 0.0021 1.1104 5.3140 + 13 0.8902 106.82 0.0021 1.1045 5.3037 + 14 0.8890 106.68 0.0021 1.0991 5.2942 + 15 0.8879 106.54 0.0021 1.0941 5.2856 + 16 0.8868 106.42 0.0021 1.0895 5.2775 + 17 0.8858 106.30 0.0021 1.0852 5.2701 + 18 0.8849 106.19 0.0021 1.0812 5.2631 + 19 0.8841 106.09 0.0021 1.0775 5.2565 + 20 0.8833 105.99 0.0021 1.0740 5.2504 + 21 0.8825 105.90 0.0021 1.0706 5.2445 + 22 0.8818 105.81 0.0021 1.0675 5.2390 + 23 0.8811 105.73 0.0021 1.0645 5.2338 + 24 0.8804 105.65 0.0021 1.0616 5.2288 + 25 0.8798 105.58 0.0021 1.0589 5.2240 + 26 0.8792 105.50 0.0021 1.0563 5.2195 + 27 0.8786 105.43 0.0021 1.0538 5.2151 + 28 0.8781 105.37 0.0021 1.0514 5.2109 + 29 0.8775 105.30 0.0021 1.0491 5.2069 + 30 0.8770 105.24 0.0021 1.0469 5.2030 + 31 0.8765 105.18 0.0021 1.0448 5.1993 + 32 0.8761 105.13 0.0021 1.0428 5.1957 + 33 0.8756 105.07 0.0021 1.0408 5.1922 + 34 0.8751 105.02 0.0021 1.0389 5.1889 + 35 0.8747 104.97 0.0021 1.0370 5.1856 + 36 0.8743 104.91 0.0021 1.0353 5.1825 + 37 0.8739 104.87 0.0021 1.0335 5.1794 + 38 0.8735 104.82 0.0021 1.0318 5.1765 + 39 0.8731 104.77 0.0021 1.0302 5.1736 + 40 0.8727 104.73 0.0021 1.0286 5.1708 ******************************************************************* @@ -163,24 +171,24 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t (GWh/year) (GWh/year) (10^15 J) (%) 1 12.1 200.5 32.78 2.15 2 9.5 173.8 32.16 4.02 - 3 9.8 177.5 31.52 5.93 + 3 9.9 177.5 31.52 5.93 4 9.2 170.3 30.91 7.76 5 9.4 172.2 30.29 9.61 6 9.0 168.1 29.68 11.42 7 9.1 169.2 29.07 13.23 8 8.9 166.4 28.47 15.02 - 9 8.9 167.2 27.87 16.82 + 9 9.0 167.2 27.87 16.82 10 8.8 165.1 27.28 18.59 11 8.8 165.6 26.68 20.37 12 8.7 164.0 26.09 22.13 13 8.7 164.3 25.50 23.90 14 8.6 163.1 24.91 25.65 15 8.6 163.2 24.32 27.40 - 16 8.5 162.3 23.74 29.15 - 17 8.5 162.3 23.16 30.89 + 16 8.6 162.3 23.74 29.15 + 17 8.6 162.3 23.16 30.89 18 8.5 161.7 22.57 32.63 19 8.5 161.5 21.99 34.36 - 20 8.4 161.1 21.41 36.10 + 20 8.5 161.1 21.41 36.10 21 8.4 160.8 20.83 37.82 22 8.4 160.6 20.26 39.55 23 8.4 160.1 19.68 41.27 diff --git a/tests/examples/example11_AC.txt b/tests/examples/example11_AC.txt index d8e685a9..4e2398ed 100644 --- a/tests/examples/example11_AC.txt +++ b/tests/examples/example11_AC.txt @@ -69,3 +69,5 @@ Absorption Chiller O&M Cost,0.065, --- [$M/year] Print Output to Console,1, ---Should be 1 (to print) or 0 (to not print) Time steps per year,10, ---[-] +Starting Cooling Sale Price,0.0655 +Ending Cooling Sale Price,0.0655 diff --git a/tests/geophires_monte_carlo_tests/MC_HIP_Settings_file.txt b/tests/geophires_monte_carlo_tests/MC_HIP_Settings_file.txt index 3a6baae6..d26816ea 100644 --- a/tests/geophires_monte_carlo_tests/MC_HIP_Settings_file.txt +++ b/tests/geophires_monte_carlo_tests/MC_HIP_Settings_file.txt @@ -3,10 +3,11 @@ INPUT, Reservoir Area, uniform, 50.0, 120.0 INPUT, Reservoir Thickness, uniform, 0.122, 0.299 INPUT, Reservoir Temperature, uniform, 130, 170 INPUT, Rejection Temperature, uniform, 20, 33 -OUTPUT, Available Heat (fluid) -OUTPUT, Producible Heat (fluid) -OUTPUT, Producible Heat/Unit Area (fluid) -OUTPUT, Producible Electricity (fluid) -OUTPUT, Producible Electricity/Unit Area (fluid) -ITERATIONS, 250 +OUTPUT, Producible Heat (reservoir) +OUTPUT, Producible Heat/Unit Area (reservoir) +OUTPUT, Producible Heat/Unit Volume (reservoir) +OUTPUT, Producible Electricity (reservoir) +OUTPUT, Producible Electricity/Unit Area (reservoir) +OUTPUT, Producible Electricity/Unit Volume (reservoir) +ITERATIONS, 25 MC_OUTPUT_FILE, MC_HIP_Result.txt From 7882e592c0c9119a24d701317ea290233a764407 Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Sun, 3 Mar 2024 12:05:05 -0600 Subject: [PATCH 06/36] Updates all example outputs to contain new output, like cashflow table and Payoff years --- ...3_Tabulated_Database_Coaxial_sCO2_heat.out | 10 +- ..._Tabulated_Database_Coaxial_water_heat.out | 8 +- ...023_Tabulated_Database_Uloop_sCO2_elec.out | 10 +- ...023_Tabulated_Database_Uloop_sCO2_heat.out | 8 +- ...23_Tabulated_Database_Uloop_water_elec.out | 10 +- ...23_Tabulated_Database_Uloop_water_heat.out | 8 +- tests/examples/S-DAC-GT.out | 345 +++++++++--------- ...Closed-Loop_Geothermal_Energy_Recovery.out | 164 +++++---- tests/examples/example1.out | 50 ++- tests/examples/example10_HP.out | 42 ++- tests/examples/example11_AC.out | 50 ++- tests/examples/example12_DH.out | 44 ++- tests/examples/example13.out | 52 ++- tests/examples/example1_addons.out | 101 +++-- tests/examples/example2.out | 37 +- tests/examples/example3.out | 49 ++- tests/examples/example4.out | 50 ++- tests/examples/example5.out | 42 ++- tests/examples/example8.out | 42 ++- tests/examples/example9.out | 50 ++- tests/examples/example_SHR-1.out | 42 ++- tests/examples/example_multiple_gradients.out | 50 ++- 22 files changed, 900 insertions(+), 364 deletions(-) diff --git a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_sCO2_heat.out b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_sCO2_heat.out index d8a08805..b7535e36 100644 --- a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_sCO2_heat.out +++ b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_sCO2_heat.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.0 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2023-09-28 - Simulation Time: 15:39 - Calculation Time: 12.236 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:11 + Calculation Time: 1.178 sec ***AGS/CLGS STYLE OUTPUT*** @@ -19,7 +19,7 @@ Simulation Metadata Design: utube Flow rate: 40.0 kg/sec Lateral Length: 1000 meter - Vertical Depth: 3 kilometer + Vertical Depth: 3 kilometer Geothermal Gradient: 0.0600 degC/km Wellbore Diameter: 8.5000 in Injection Temperature: 60.0 degC diff --git a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_water_heat.out b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_water_heat.out index c8e136c7..709430b8 100644 --- a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_water_heat.out +++ b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Coaxial_water_heat.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.0 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2023-09-28 - Simulation Time: 17:08 - Calculation Time: 1.868 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:12 + Calculation Time: 1.004 sec ***AGS/CLGS STYLE OUTPUT*** diff --git a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_elec.out b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_elec.out index 980b2619..61aa3a02 100644 --- a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_elec.out +++ b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_elec.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.0 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2023-09-28 - Simulation Time: 17:14 - Calculation Time: 7.460 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:13 + Calculation Time: 1.085 sec ***AGS/CLGS STYLE OUTPUT*** @@ -19,7 +19,7 @@ Simulation Metadata Design: utube Flow rate: 40.0 kg/sec Lateral Length: 9000 meter - Vertical Depth: 3 kilometer + Vertical Depth: 3 kilometer Geothermal Gradient: 0.0600 degC/m Wellbore Diameter: 8.5000 in Injection Temperature: 60.0 degC diff --git a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_heat.out b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_heat.out index bdae8001..4bddef0e 100644 --- a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_heat.out +++ b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_sCO2_heat.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.0 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2023-09-28 - Simulation Time: 17:36 - Calculation Time: 2.240 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:13 + Calculation Time: 1.093 sec ***AGS/CLGS STYLE OUTPUT*** diff --git a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_elec.out b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_elec.out index 3aff7a15..7fb66bff 100644 --- a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_elec.out +++ b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_elec.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.0 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2023-09-28 - Simulation Time: 17:39 - Calculation Time: 2.234 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:14 + Calculation Time: 1.073 sec ***AGS/CLGS STYLE OUTPUT*** @@ -19,7 +19,7 @@ Simulation Metadata Design: utube Flow rate: 20.0 kg/sec Lateral Length: 9000 meter - Vertical Depth: 3 kilometer + Vertical Depth: 3 kilometer Geothermal Gradient: 0.0600 degC/m Wellbore Diameter: 8.5000 in Injection Temperature: 60.0 degC diff --git a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_heat.out b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_heat.out index 424303aa..d507a262 100644 --- a/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_heat.out +++ b/tests/examples/Beckers_et_al_2023_Tabulated_Database_Uloop_water_heat.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.0 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2023-09-28 - Simulation Time: 17:43 - Calculation Time: 1.924 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:14 + Calculation Time: 1.026 sec ***AGS/CLGS STYLE OUTPUT*** diff --git a/tests/examples/S-DAC-GT.out b/tests/examples/S-DAC-GT.out index 166fea21..cae0b130 100644 --- a/tests/examples/S-DAC-GT.out +++ b/tests/examples/S-DAC-GT.out @@ -4,22 +4,23 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.0 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2023-08-17 - Simulation Time: 21:15 - Calculation Time: 0.625 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:17 + Calculation Time: 0.409 sec ***SUMMARY OF RESULTS*** End-Use Option: Cogeneration Topping Cycle, Heat sales considered as extra income - Average Net Electricity Production: -0.36 MW - Average Direct-Use Heat Production: -39.25 MW - Electricity breakeven price: -315.96 cents/kWh + Average Net Electricity Production: 19.75 MW + Average Direct-Use Heat Production: 12.94 MW + Electricity breakeven price (LCOE): 6.38 cents/kWh + Direct-Use heat breakeven price (LCOH): 2.34 USD/MMBTU Number of production wells: 3 Number of injection wells: 3 Flowrate per production well: 70.0 kg/sec - Well depth (or total length, if not vertical): 3.0 kilometer + Well depth (or total length, if not vertical): 3.1 kilometer Geothermal gradient: 0.0700 degC/m @@ -29,21 +30,23 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -147.27 MUSD - Project IRR: 0.00 % - Project VIR=PI=PIR: -3.41 - Project MOIC: -5.76 + Project NPV: -3.25 MUSD + Project IRR: 0.06 % + Project VIR=PI=PIR: 0.97 + Project MOIC: 0.58 + Project Payback Period: 14.27 yr + CHP: Percent cost allocation for electrical plant: 92.43% ***ENGINEERING PARAMETERS*** Number of Production Wells: 3 Number of Injection Wells: 3 - Well depth (or total length, if not vertical): 3.0 kilometer + Well depth (or total length, if not vertical): 3.1 kilometer Water loss rate: 2.0 Pump efficiency: 80.0 Injection temperature: 70.0 degC - Production Wellbore heat transmission calculated with Ramey's model - Average production well temperature drop: 0.0 degC + User-provided production well temperature drop + Constant production well temperature drop: 5.0 degC Flowrate per production well: 70.0 kg/sec Injection well casing ID: 8.500 in Production well casing ID: 8.500 in @@ -62,12 +65,12 @@ Simulation Metadata Reservoir Model = Single Fracture m/A Thermal Drawdown Model m/A Drawdown Parameter: 0.00002 1/year - Bottom-hole temperature: 15.21 degC + Bottom-hole temperature: 232.00 degC Reservoir volume calculated with fracture separation and number of fractures as input Number of fractures: 12.00 Fracture separation: 80.00 meter Reservoir volume: 176000000 m**3 - Reservoir hydrostatic pressure: 29430.00 kPa + Reservoir hydrostatic pressure: 29639.68 kPa Plant outlet pressure: 100.00 kPa Injectivity Index: 5.00 kg/sec/bar Reservoir density: 2700.00 kg/m**3 @@ -77,188 +80,166 @@ Simulation Metadata ***RESERVOIR SIMULATION RESULTS*** - Maximum Production Temperature: 21.6 degC - Average Production Temperature: 17.3 degC - Minimum Production Temperature: 15.2 degC - Initial Production Temperature: 15.2 degC - Average Reservoir Heat Extraction: -46.20 MW - Production Wellbore Heat Transmission Model = Ramey Model - Average Production Well Temperature Drop: 0.0 degC - Average Injection Well Pump Pressure Drop: 1329.0 kPa + Maximum Production Temperature: 227.0 degC + Average Production Temperature: 221.2 degC + Minimum Production Temperature: 209.1 degC + Initial Production Temperature: 227.0 degC + Average Reservoir Heat Extraction: 130.23 MW + Wellbore Heat Transmission Model = Constant Temperature Drop: 5.0 degC + Average Injection Well Pump Pressure Drop: 685.6 kPa ***CAPITAL COSTS (M$)*** - Drilling and completion costs: 32.92 MUSD - Drilling and completion costs per well: 5.49 MUSD + Drilling and completion costs: 34.45 MUSD + Drilling and completion costs per well: 5.74 MUSD Stimulation costs: 4.53 MUSD - Surface power plant costs: -12.68 MUSD - Field gathering system costs: 3.29 MUSD - Total surface equipment costs: -9.39 MUSD - Exploration costs: 5.33 MUSD - Total capital costs: 33.38 MUSD + Surface power plant costs: 64.77 MUSD + Field gathering system costs: 3.16 MUSD + Total surface equipment costs: 67.93 MUSD + Exploration costs: 5.51 MUSD + Total capital costs: 112.42 MUSD ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** - Wellfield maintenance costs: 0.43 MUSD/yr - Power plant maintenance costs: 0.00 MUSD/yr + Wellfield maintenance costs: 0.83 MUSD/yr + Power plant maintenance costs: 2.32 MUSD/yr Water costs: 0.11 MUSD/yr - Total operating and maintenance costs: 0.54 MUSD/yr + Total operating and maintenance costs: 3.26 MUSD/yr ***SURFACE EQUIPMENT SIMULATION RESULTS*** - Initial geofluid availability: 0.00 MW/(kg/s) - Maximum Total Electricity Generation: 0.02 MW - Average Total Electricity Generation: 0.00 MW - Minimum Total Electricity Generation: 0.00 MW - Initial Total Electricity Generation: 0.00 MW - Maximum Net Electricity Generation: -0.35 MW - Average Net Electricity Generation: -0.36 MW - Minimum Net Electricity Generation: -0.37 MW - Initial Net Electricity Generation: -0.37 MW - Average Annual Total Electricity Generation: 24.74 GWh - Average Annual Net Electricity Generation: 21.87 GWh - Initial pumping power/net installed power: 100.00 % - Maximum Net Heat Production: -37.62 MW - Average Net Heat Production: -39.25 MW - Minimum Net Heat Production: -40.06 MW - Initial Net Heat Production: -40.06 MW - Average Annual Heat Production: -269.41 GWh - Average Pumping Power: 0.37 MW - - ****************************** - * POWER GENERATION PROFILE * - ****************************** + Initial geofluid availability: 0.23 MW/(kg/s) + Maximum Total Electricity Generation: 21.16 MW + Average Total Electricity Generation: 19.94 MW + Minimum Total Electricity Generation: 17.44 MW + Initial Total Electricity Generation: 21.16 MW + Maximum Net Electricity Generation: 20.98 MW + Average Net Electricity Generation: 19.75 MW + Minimum Net Electricity Generation: 17.26 MW + Initial Net Electricity Generation: 20.98 MW + Average Annual Total Electricity Generation: 156.66 GWh + Average Annual Net Electricity Generation: 155.23 GWh + Initial pumping power/net installed power: 0.87 % + Maximum Net Heat Production: 13.70 MW + Average Net Heat Production: 12.94 MW + Minimum Net Heat Production: 11.28 MW + Initial Net Heat Production: 13.70 MW + Average Annual Heat Production: 101.69 GWh + Average Pumping Power: 0.18 MW + + ************************************************************ + * HEATING, COOLING AND/OR ELECTRICITY PRODUCTION PROFILE * + ************************************************************ YEAR THERMAL GEOFLUID PUMP NET NET FIRST LAW DRAWDOWN TEMPERATURE POWER POWER HEAT EFFICIENCY (deg C) (MW) (MW) (MW) (%) - 0 1.0000 15.21 0.3656 -0.3655 -40.0569 10.3006 - 1 1.0000 15.21 0.3656 -0.3655 -40.0569 10.3006 - 2 1.0000 15.21 0.3656 -0.3655 -40.0569 10.3006 - 3 1.0000 15.21 0.3656 -0.3655 -40.0569 10.3007 - 4 1.0001 15.21 0.3656 -0.3655 -40.0565 10.3019 - 5 1.0005 15.22 0.3656 -0.3655 -40.0543 10.3097 - 6 1.0017 15.24 0.3656 -0.3655 -40.0470 10.3343 - 7 1.0043 15.28 0.3656 -0.3655 -40.0316 10.3874 - 8 1.0089 15.34 0.3656 -0.3655 -40.0053 10.4792 - 9 1.0155 15.45 0.3656 -0.3655 -39.9666 10.6169 - 10 1.0243 15.58 0.3656 -0.3654 -39.9151 10.8059 - 11 1.0353 15.75 0.3656 -0.3654 -39.8511 11.0500 - 12 1.0483 15.94 0.3656 -0.3652 -39.7754 11.3528 - 13 1.0631 16.17 0.3656 -0.3651 -39.6894 11.7178 - 14 1.0795 16.42 0.3656 -0.3648 -39.5941 12.1498 - 15 1.0972 16.69 0.3656 -0.3645 -39.4910 12.6548 - 16 1.1161 16.98 0.3656 -0.3642 -39.3812 13.2405 - 17 1.1360 17.28 0.3656 -0.3637 -39.2660 13.9173 - 18 1.1567 17.59 0.3656 -0.3631 -39.1463 14.6983 - 19 1.1779 17.92 0.3656 -0.3625 -39.0231 15.6011 - 20 1.1997 18.25 0.3656 -0.3618 -38.8971 16.6487 - 21 1.2219 18.58 0.3656 -0.3609 -38.7692 17.8715 - 22 1.2443 18.93 0.3656 -0.3600 -38.6399 19.3107 - 23 1.2669 19.27 0.3656 -0.3590 -38.5098 21.0226 - 24 1.2895 19.61 0.3656 -0.3579 -38.3792 23.0866 - 25 1.3122 19.96 0.3656 -0.3567 -38.2486 25.6174 - 26 1.3349 20.30 0.3656 -0.3554 -38.1184 28.7874 - 27 1.3575 20.65 0.3656 -0.3540 -37.9887 32.8672 - 28 1.3800 20.99 0.3656 -0.3526 -37.8598 38.3072 - 29 1.4023 21.33 0.3656 -0.3511 -37.7320 45.9163 - - - *************************************************************** - * HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE * - *************************************************************** + 0 1.0000 227.00 0.1816 20.9791 13.6976 17.4835 + 1 1.0000 227.00 0.1816 20.9791 13.6976 17.4835 + 2 1.0000 227.00 0.1816 20.9791 13.6976 17.4835 + 3 1.0000 227.00 0.1816 20.9791 13.6976 17.4834 + 4 1.0000 227.00 0.1816 20.9787 13.6973 17.4833 + 5 0.9999 226.98 0.1816 20.9757 13.6957 17.4823 + 6 0.9997 226.94 0.1816 20.9660 13.6902 17.4788 + 7 0.9993 226.84 0.1816 20.9444 13.6780 17.4712 + 8 0.9985 226.67 0.1816 20.9067 13.6565 17.4578 + 9 0.9974 226.41 0.1816 20.8500 13.6243 17.4378 + 10 0.9959 226.06 0.1816 20.7734 13.5804 17.4106 + 11 0.9939 225.62 0.1816 20.6771 13.5250 17.3764 + 12 0.9916 225.09 0.1816 20.5623 13.4584 17.3354 + 13 0.9889 224.48 0.1816 20.4308 13.3814 17.2883 + 14 0.9859 223.80 0.1816 20.2846 13.2950 17.2358 + 15 0.9827 223.06 0.1816 20.1258 13.2000 17.1784 + 16 0.9792 222.27 0.1816 19.9563 13.0975 17.1169 + 17 0.9755 221.43 0.1816 19.7782 12.9884 17.0519 + 18 0.9716 220.56 0.1816 19.5931 12.8736 16.9840 + 19 0.9676 219.65 0.1816 19.4026 12.7538 16.9138 + 20 0.9635 218.72 0.1816 19.2081 12.6297 16.8416 + 21 0.9594 217.77 0.1816 19.0109 12.5020 16.7680 + 22 0.9551 216.81 0.1816 18.8118 12.3713 16.6932 + 23 0.9508 215.84 0.1816 18.6119 12.2382 16.6176 + 24 0.9465 214.86 0.1816 18.4119 12.1029 16.5415 + 25 0.9422 213.87 0.1816 18.2124 11.9661 16.4651 + 26 0.9378 212.89 0.1816 18.0140 11.8279 16.3886 + 27 0.9335 211.91 0.1816 17.8171 11.6888 16.3121 + 28 0.9292 210.93 0.1816 17.6221 11.5490 16.2360 + 29 0.9249 209.95 0.1816 17.4293 11.4088 16.1601 + + + ******************************************************************* + * ANNUAL HEATING, COOLING AND/OR ELECTRICITY PRODUCTION PROFILE * + ******************************************************************* YEAR HEAT ELECTRICITY HEAT RESERVOIR PERCENTAGE OF PROVIDED PROVIDED EXTRACTED HEAT CONTENT TOTAL HEAT MINED (GWh/year) (GWh/year) (GWh/year) (10^15 J) (%) - 1 -275.1 22.9 -378.88 -24.67 5.24 - 2 -275.1 22.9 -378.88 -23.31 10.48 - 3 -275.1 22.9 -378.88 -21.94 15.72 - 4 -275.1 22.9 -378.87 -20.58 20.95 - 5 -275.1 22.9 -378.85 -19.22 26.19 - 6 -275.0 22.9 -378.77 -17.85 31.43 - 7 -275.0 22.9 -378.57 -16.49 36.66 - 8 -274.9 22.9 -378.20 -15.13 41.89 - 9 -274.7 22.8 -377.62 -13.77 47.12 - 10 -274.4 22.8 -376.80 -12.41 52.33 - 11 -274.0 22.7 -375.76 -11.06 57.52 - 12 -273.6 22.6 -374.50 -9.71 62.70 - 13 -273.1 22.5 -373.03 -8.37 67.86 - 14 -272.6 22.4 -371.39 -7.03 72.99 - 15 -272.0 22.3 -369.60 -5.70 78.10 - 16 -271.4 22.2 -367.67 -4.38 83.19 - 17 -270.7 22.0 -365.63 -3.06 88.24 - 18 -270.0 21.9 -363.49 -1.75 93.27 - 19 -269.3 21.7 -361.29 -0.45 98.26 - 20 -268.6 21.6 -359.02 0.84 103.23 - 21 -267.8 21.4 -356.71 2.12 108.16 - 22 -267.0 21.3 -354.36 3.40 113.06 - 23 -266.3 21.1 -352.00 4.67 117.93 - 24 -265.5 21.0 -349.62 5.93 122.76 - 25 -264.7 20.8 -347.23 7.18 127.56 - 26 -264.0 20.7 -344.84 8.42 132.33 - 27 -263.2 20.5 -342.46 9.65 137.06 - 28 -262.4 20.4 -340.09 10.87 141.77 - 29 -261.7 20.2 -337.73 12.09 146.44 - 30 -234.9 18.1 -301.96 13.18 150.61 - - - - ***S_DAC_GT ECONOMICS*** - - - S-DAC-GT Report: Levelized Cost of Direct Air Capture (LCOD) - Using grid-based electricity only: 387.69 USD/tonne - Using natural gas only: 312.00 USD/tonne - Using geothermal energy only: 279.51 USD/tonne - - S-DAC-GT Report: CO2 Intensity of process (percent of CO2 mitigated that is emitted by S-DAC process) - Using grid-based electricity only: 94.52% - Using natural gas only: 64.85% - Using geothermal energy only: 35.89% - - Geothermal LCOH: -0.0048 USD/kWh - Geothermal Ratio (electricty vs heat): 21.5035% - Percent Energy Devoted To Process: 50.0000% - - Total Tonnes of CO2 Captured: -809,366.27 tonne - Total Cost of Capture: -179,908,591.50 USD - - - ********************** - * S_DAC_GT PROFILE * - ********************** -Year Carbon Cumm. Carbon S_DAC_GT S_DAC_GT Cumm. Cumm. Cost -Since Captured Captured Annual Cost Cash Flow Cost Per Tonne -Start (tonne/yr) (tonne) (USD/yr) (USD) (USD/tonne) - 1 -28,151.90 -28,151.90 -6,257,696.98 -6,257,696.98 222.28 - 2 -28,151.90 -56,303.80 -6,257,696.89 -12,515,393.87 222.28 - 3 -28,151.90 -84,455.70 -6,257,695.86 -18,773,089.74 222.28 - 4 -28,151.72 -112,607.42 -6,257,657.26 -25,030,747.00 222.28 - 5 -28,150.20 -140,757.62 -6,257,318.73 -31,288,065.73 222.28 - 6 -28,144.21 -168,901.83 -6,255,987.66 -37,544,053.40 222.28 - 7 -28,129.39 -197,031.22 -6,252,692.29 -43,796,745.69 222.28 - 8 -28,101.64 -225,132.86 -6,246,525.75 -50,043,271.44 222.28 - 9 -28,058.19 -253,191.05 -6,236,867.19 -56,280,138.63 222.28 - 10 -27,997.73 -281,188.78 -6,223,426.90 -62,503,565.53 222.28 - 11 -27,920.20 -309,108.98 -6,206,192.64 -68,709,758.17 222.28 - 12 -27,826.42 -336,935.39 -6,185,347.02 -74,895,105.19 222.28 - 13 -27,717.74 -364,653.14 -6,161,191.18 -81,056,296.36 222.28 - 14 -27,595.81 -392,248.94 -6,134,086.21 -87,190,382.58 222.28 - 15 -27,462.31 -419,711.25 -6,104,412.71 -93,294,795.28 222.28 - 16 -27,318.95 -447,030.20 -6,072,544.91 -99,367,340.19 222.28 - 17 -27,167.30 -474,197.49 -6,038,835.57 -105,406,175.76 222.28 - 18 -27,008.81 -501,206.31 -6,003,608.01 -111,409,783.77 222.28 - 19 -26,844.81 -528,051.12 -5,967,152.89 -117,376,936.66 222.28 - 20 -26,676.45 -554,727.57 -5,929,727.90 -123,306,664.56 222.28 - 21 -26,504.73 -581,232.30 -5,891,559.16 -129,198,223.72 222.28 - 22 -26,330.56 -607,562.86 -5,852,843.48 -135,051,067.20 222.28 - 23 -26,154.69 -633,717.55 -5,813,751.10 -140,864,818.29 222.28 - 24 -25,977.79 -659,695.34 -5,774,428.48 -146,639,246.77 222.28 - 25 -25,800.42 -685,495.76 -5,735,001.04 -152,374,247.81 222.28 - 26 -25,623.05 -711,118.81 -5,695,575.75 -158,069,823.56 222.28 - 27 -25,446.10 -736,564.91 -5,656,243.41 -163,726,066.97 222.28 - 28 -25,269.92 -761,834.83 -5,617,080.82 -169,343,147.79 222.28 - 29 -25,094.79 -786,929.62 -5,578,152.59 -174,921,300.38 222.28 - 30 -22,436.65 -809,366.27 -4,987,291.13 -179,908,591.50 222.28 + 1 108.0 165.4 1066.02 73.14 4.99 + 2 108.0 165.4 1066.02 69.31 9.97 + 3 108.0 165.4 1066.02 65.47 14.96 + 4 108.0 165.4 1066.02 61.63 19.94 + 5 108.0 165.4 1065.98 57.79 24.93 + 6 108.0 165.3 1065.79 53.96 29.91 + 7 107.9 165.2 1065.32 50.12 34.89 + 8 107.8 165.0 1064.41 46.29 39.87 + 9 107.5 164.6 1062.95 42.46 44.84 + 10 107.2 164.1 1060.88 38.64 49.80 + 11 106.9 163.4 1058.19 34.83 54.75 + 12 106.4 162.6 1054.89 31.04 59.68 + 13 105.8 161.6 1051.03 27.25 64.60 + 14 105.2 160.5 1046.66 23.49 69.49 + 15 104.4 159.3 1041.85 19.73 74.36 + 16 103.7 158.0 1036.64 16.00 79.21 + 17 102.8 156.6 1031.09 12.29 84.03 + 18 102.0 155.2 1025.27 8.60 88.83 + 19 101.0 153.7 1019.22 4.93 93.59 + 20 100.1 152.2 1012.99 1.28 98.33 + 21 99.1 150.7 1006.61 -2.34 103.04 + 22 98.1 149.1 1000.11 -5.94 107.72 + 23 97.0 147.5 993.53 -9.52 112.36 + 24 96.0 145.9 986.90 -13.07 116.98 + 25 94.9 144.4 980.23 -16.60 121.56 + 26 93.8 142.8 973.55 -20.10 126.11 + 27 92.7 141.2 966.87 -23.58 130.64 + 28 91.6 139.7 960.20 -27.04 135.13 + 29 90.5 138.2 953.56 -30.47 139.58 + 30 80.5 123.1 852.56 -33.54 143.57 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -112.42 -112.42 + 2 0.06 9.10 9.10 | 0.03 2.70 2.70 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.54 -103.88 + 3 0.06 9.10 18.19 | 0.03 2.70 5.40 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.54 -95.34 + 4 0.06 9.10 27.29 | 0.03 2.70 8.10 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.54 -86.81 + 5 0.06 9.10 36.39 | 0.03 2.70 10.80 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.54 -78.27 + 6 0.06 9.10 45.48 | 0.03 2.70 13.50 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.54 -69.73 + 7 0.06 9.09 54.58 | 0.03 2.70 16.20 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.53 -61.20 + 8 0.06 9.09 63.66 | 0.03 2.70 18.90 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.52 -52.68 + 9 0.06 9.07 72.74 | 0.03 2.69 21.59 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.51 -44.17 + 10 0.06 9.05 81.79 | 0.03 2.69 24.28 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.48 -35.69 + 11 0.06 9.03 90.82 | 0.03 2.68 26.96 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.45 -27.24 + 12 0.06 8.99 99.81 | 0.03 2.67 29.63 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.40 -18.84 + 13 0.06 8.94 108.75 | 0.03 2.66 32.29 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.34 -10.50 + 14 0.06 8.89 117.64 | 0.03 2.65 34.93 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.27 -2.23 + 15 0.06 8.83 126.46 | 0.03 2.63 37.56 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.20 5.97 + 16 0.06 8.76 135.23 | 0.03 2.61 40.18 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.11 14.08 + 17 0.06 8.69 143.92 | 0.03 2.59 42.77 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 8.02 22.11 + 18 0.06 8.62 152.53 | 0.03 2.57 45.34 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.93 30.03 + 19 0.06 8.54 161.07 | 0.03 2.55 47.89 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.83 37.86 + 20 0.06 8.45 169.52 | 0.03 2.53 50.41 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.72 45.58 + 21 0.06 8.37 177.89 | 0.03 2.50 52.91 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.61 53.19 + 22 0.06 8.29 186.18 | 0.03 2.48 55.39 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.50 60.70 + 23 0.06 8.20 194.38 | 0.03 2.45 57.84 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.39 68.09 + 24 0.06 8.11 202.49 | 0.03 2.43 60.27 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.28 75.37 + 25 0.06 8.03 210.52 | 0.03 2.40 62.67 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.17 82.53 + 26 0.06 7.94 218.46 | 0.03 2.37 65.04 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 7.05 89.58 + 27 0.06 7.85 226.32 | 0.03 2.34 67.38 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 6.94 96.52 + 28 0.06 7.77 234.08 | 0.03 2.32 69.70 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 6.83 103.35 + 29 0.06 7.68 241.77 | 0.03 2.29 71.99 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 6.71 110.06 + 30 0.06 7.60 249.37 | 0.03 2.26 74.25 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.26 6.60 116.67 diff --git a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out index f77399e1..c4c7c6b6 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -4,21 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.2 - GEOPHIRES Version: 3.4.3 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-02-16 - Simulation Time: 09:18 - Calculation Time: 3.788 sec - Simulation Date: 2024-02-18 - Simulation Time: 08:29 - Calculation Time: 1.660 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:16 + Calculation Time: 3.737 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.10 MW - Electricity breakeven price: 44.02 cents/kWh + Electricity breakeven price (LCOE): 44.08 cents/kWh Number of production wells: 1 Number of injection wells: 0 Flowrate per production well: 110.0 kg/sec @@ -32,11 +28,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 40 yr Capacity factor: 90.0 % - Project NPV: -45.14 MUSD + Project NPV: -45.16 MUSD Project IRR: 0.00 % Project VIR=PI=PIR: -0.02 Project MOIC: -0.72 - Project VIR=PI=PIR: -0.02 Project Payback Period: 0.00 yr ***ENGINEERING PARAMETERS*** @@ -83,10 +78,10 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t Drilling and completion costs per well: 20.48 MUSD Stimulation costs: 0.00 MUSD Surface power plant costs: 6.74 MUSD - Field gathering system costs: 0.50 MUSD + Field gathering system costs: 0.51 MUSD Total surface equipment costs: 7.24 MUSD Exploration costs: 16.36 MUSD - Total capital costs: 44.07 MUSD + Total capital costs: 44.08 MUSD ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** @@ -104,13 +99,11 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t Average Total Electricity Generation: 1.11 MW Minimum Total Electricity Generation: 0.94 MW Initial Total Electricity Generation: 1.66 MW - Maximum Net Electricity Generation: 1.67 MW + Maximum Net Electricity Generation: 1.66 MW Average Net Electricity Generation: 1.10 MW Minimum Net Electricity Generation: 0.94 MW Initial Net Electricity Generation: 1.66 MW Average Annual Total Electricity Generation: 8.64 GWh - Average Annual Net Electricity Generation: 8.63 GWh - Initial pumping power/net installed power: 100.00 % Average Annual Net Electricity Generation: 8.62 GWh Initial pumping power/net installed power: 0.21 % Average Pumping Power: 0.00 MW @@ -121,46 +114,46 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t YEAR THERMAL GEOFLUID PUMP NET FIRST LAW DRAWDOWN TEMPERATURE POWER POWER EFFICIENCY (degC) (MW) (MW) (%) - 1 1.0000 120.00 0.0021 1.6624 6.2299 - 2 0.9302 111.62 0.0021 1.2910 5.6235 - 3 0.9187 110.24 0.0021 1.2355 5.5293 - 4 0.9121 109.45 0.0021 1.2042 5.4759 - 5 0.9074 108.89 0.0021 1.1826 5.4388 - 6 0.9039 108.46 0.0021 1.1662 5.4105 - 7 0.9010 108.12 0.0021 1.1529 5.3877 - 8 0.8985 107.83 0.0021 1.1419 5.3686 - 9 0.8965 107.58 0.0021 1.1325 5.3523 - 10 0.8946 107.36 0.0021 1.1243 5.3380 - 11 0.8930 107.16 0.0021 1.1170 5.3253 - 12 0.8915 106.98 0.0021 1.1104 5.3140 - 13 0.8902 106.82 0.0021 1.1045 5.3037 - 14 0.8890 106.68 0.0021 1.0991 5.2942 - 15 0.8879 106.54 0.0021 1.0941 5.2856 - 16 0.8868 106.42 0.0021 1.0895 5.2775 - 17 0.8858 106.30 0.0021 1.0852 5.2701 - 18 0.8849 106.19 0.0021 1.0812 5.2631 - 19 0.8841 106.09 0.0021 1.0775 5.2565 - 20 0.8833 105.99 0.0021 1.0740 5.2504 - 21 0.8825 105.90 0.0021 1.0706 5.2445 - 22 0.8818 105.81 0.0021 1.0675 5.2390 - 23 0.8811 105.73 0.0021 1.0645 5.2338 - 24 0.8804 105.65 0.0021 1.0616 5.2288 - 25 0.8798 105.58 0.0021 1.0589 5.2240 - 26 0.8792 105.50 0.0021 1.0563 5.2195 - 27 0.8786 105.43 0.0021 1.0538 5.2151 - 28 0.8781 105.37 0.0021 1.0514 5.2109 - 29 0.8775 105.30 0.0021 1.0491 5.2069 - 30 0.8770 105.24 0.0021 1.0469 5.2030 - 31 0.8765 105.18 0.0021 1.0448 5.1993 - 32 0.8761 105.13 0.0021 1.0428 5.1957 - 33 0.8756 105.07 0.0021 1.0408 5.1922 - 34 0.8751 105.02 0.0021 1.0389 5.1889 - 35 0.8747 104.97 0.0021 1.0370 5.1856 - 36 0.8743 104.91 0.0021 1.0353 5.1825 - 37 0.8739 104.87 0.0021 1.0335 5.1794 - 38 0.8735 104.82 0.0021 1.0318 5.1765 - 39 0.8731 104.77 0.0021 1.0302 5.1736 - 40 0.8727 104.73 0.0021 1.0286 5.1708 + 1 1.0000 120.00 0.0034 1.6611 6.2250 + 2 0.9302 111.62 0.0035 1.2897 5.6178 + 3 0.9187 110.24 0.0035 1.2342 5.5235 + 4 0.9121 109.45 0.0035 1.2029 5.4699 + 5 0.9074 108.89 0.0035 1.1813 5.4328 + 6 0.9039 108.46 0.0035 1.1649 5.4044 + 7 0.9010 108.12 0.0035 1.1516 5.3816 + 8 0.8985 107.83 0.0035 1.1406 5.3625 + 9 0.8965 107.58 0.0035 1.1312 5.3461 + 10 0.8946 107.36 0.0035 1.1230 5.3318 + 11 0.8930 107.16 0.0035 1.1157 5.3191 + 12 0.8915 106.98 0.0035 1.1091 5.3077 + 13 0.8902 106.82 0.0035 1.1032 5.2974 + 14 0.8890 106.68 0.0035 1.0978 5.2879 + 15 0.8879 106.54 0.0035 1.0928 5.2793 + 16 0.8868 106.42 0.0035 1.0882 5.2712 + 17 0.8858 106.30 0.0035 1.0839 5.2637 + 18 0.8849 106.19 0.0035 1.0799 5.2567 + 19 0.8841 106.09 0.0035 1.0762 5.2502 + 20 0.8833 105.99 0.0035 1.0727 5.2440 + 21 0.8825 105.90 0.0035 1.0693 5.2381 + 22 0.8818 105.81 0.0035 1.0662 5.2326 + 23 0.8811 105.73 0.0035 1.0632 5.2273 + 24 0.8804 105.65 0.0035 1.0603 5.2223 + 25 0.8798 105.58 0.0035 1.0576 5.2176 + 26 0.8792 105.50 0.0035 1.0550 5.2130 + 27 0.8786 105.43 0.0035 1.0525 5.2086 + 28 0.8781 105.37 0.0035 1.0501 5.2044 + 29 0.8775 105.30 0.0035 1.0478 5.2004 + 30 0.8770 105.24 0.0035 1.0456 5.1965 + 31 0.8765 105.18 0.0035 1.0435 5.1928 + 32 0.8761 105.13 0.0035 1.0415 5.1892 + 33 0.8756 105.07 0.0035 1.0395 5.1857 + 34 0.8751 105.02 0.0035 1.0376 5.1823 + 35 0.8747 104.97 0.0035 1.0357 5.1791 + 36 0.8743 104.91 0.0035 1.0339 5.1759 + 37 0.8739 104.87 0.0035 1.0322 5.1729 + 38 0.8735 104.82 0.0035 1.0305 5.1699 + 39 0.8731 104.77 0.0035 1.0289 5.1670 + 40 0.8727 104.73 0.0035 1.0273 5.1642 ******************************************************************* @@ -171,24 +164,24 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t (GWh/year) (GWh/year) (10^15 J) (%) 1 12.1 200.5 32.78 2.15 2 9.5 173.8 32.16 4.02 - 3 9.9 177.5 31.52 5.93 + 3 9.8 177.5 31.52 5.93 4 9.2 170.3 30.91 7.76 5 9.4 172.2 30.29 9.61 6 9.0 168.1 29.68 11.42 7 9.1 169.2 29.07 13.23 8 8.9 166.4 28.47 15.02 - 9 9.0 167.2 27.87 16.82 + 9 8.9 167.2 27.87 16.82 10 8.8 165.1 27.28 18.59 11 8.8 165.6 26.68 20.37 12 8.7 164.0 26.09 22.13 13 8.7 164.3 25.50 23.90 14 8.6 163.1 24.91 25.65 15 8.6 163.2 24.32 27.40 - 16 8.6 162.3 23.74 29.15 - 17 8.6 162.3 23.16 30.89 + 16 8.5 162.3 23.74 29.15 + 17 8.5 162.3 23.16 30.89 18 8.5 161.7 22.57 32.63 19 8.5 161.5 21.99 34.36 - 20 8.5 161.1 21.41 36.10 + 20 8.4 161.1 21.41 36.10 21 8.4 160.8 20.83 37.82 22 8.4 160.6 20.26 39.55 23 8.4 160.1 19.68 41.27 @@ -209,3 +202,52 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t 38 8.4 160.3 11.12 66.82 39 7.7 151.2 10.57 68.44 40 7.5 134.4 10.09 69.89 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 -44.08 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -44.08 -44.08 + 2 0.06 0.09 0.66 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 0.09 -43.98 + 3 0.06 -0.05 1.19 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.05 -44.03 + 4 0.06 -0.03 1.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.03 -44.06 + 5 0.06 -0.06 2.24 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.06 -44.12 + 6 0.06 -0.05 2.75 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.05 -44.18 + 7 0.06 -0.07 3.25 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.07 -44.25 + 8 0.06 -0.07 3.75 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.07 -44.32 + 9 0.06 -0.08 4.24 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.08 -44.40 + 10 0.06 -0.08 4.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.08 -44.48 + 11 0.06 -0.09 5.21 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.09 -44.57 + 12 0.06 -0.09 5.70 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.09 -44.65 + 13 0.06 -0.09 6.18 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.09 -44.75 + 14 0.06 -0.09 6.66 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.09 -44.84 + 15 0.06 -0.10 7.13 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.10 -44.94 + 16 0.06 -0.10 7.60 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.10 -45.03 + 17 0.06 -0.10 8.07 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.10 -45.13 + 18 0.06 -0.10 8.54 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.10 -45.23 + 19 0.06 -0.10 9.01 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.10 -45.34 + 20 0.06 -0.10 9.48 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.10 -45.44 + 21 0.06 -0.11 9.94 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -45.55 + 22 0.06 -0.11 10.40 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -45.65 + 23 0.06 -0.11 10.87 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -45.76 + 24 0.06 -0.11 11.33 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -45.87 + 25 0.06 -0.11 11.79 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -45.98 + 26 0.06 -0.11 12.24 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -46.10 + 27 0.06 -0.11 12.70 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -46.21 + 28 0.06 -0.12 13.16 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.12 -46.33 + 29 0.06 -0.11 13.61 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -46.44 + 30 0.06 -0.12 14.06 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.12 -46.56 + 31 0.06 -0.11 14.52 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -46.67 + 32 0.06 -0.12 14.97 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.12 -46.80 + 33 0.06 -0.12 15.42 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.12 -46.91 + 34 0.06 -0.12 15.87 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.12 -47.04 + 35 0.06 -0.12 16.32 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.12 -47.15 + 36 0.06 -0.13 16.77 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.13 -47.28 + 37 0.06 -0.11 17.22 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -47.39 + 38 0.06 -0.13 17.66 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.13 -47.53 + 39 0.06 -0.11 18.12 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.11 -47.64 + 40 0.06 -0.15 18.54 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.57 -0.15 -47.79 diff --git a/tests/examples/example1.out b/tests/examples/example1.out index b1e4c513..4ff98ee1 100644 --- a/tests/examples/example1.out +++ b/tests/examples/example1.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.3 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-02-18 - Simulation Time: 09:27 - Calculation Time: 0.621 sec + Simulation Date: 2024-03-02 + Simulation Time: 13:34 + Calculation Time: 17.165 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.21 MW - Electricity breakeven price: 43.69 cents/kWh + Electricity breakeven price (LCOE): 43.69 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -33,6 +33,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.22 Project MOIC: -0.84 + Project Payback Period: 0.00 yr ***ENGINEERING PARAMETERS*** @@ -200,3 +201,42 @@ Simulation Metadata 28 9.8 413.8 282.38 12.85 29 9.8 413.9 280.89 13.31 30 8.1 344.9 279.65 13.69 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 -54.96 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -54.96 -54.96 + 2 0.06 -0.94 0.47 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.94 -55.89 + 3 0.06 -0.91 0.97 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.91 -56.80 + 4 0.06 -0.90 1.48 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.90 -57.71 + 5 0.06 -0.90 2.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.90 -58.60 + 6 0.06 -0.89 2.51 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.89 -59.50 + 7 0.06 -0.89 3.03 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.89 -60.39 + 8 0.06 -0.89 3.55 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.89 -61.28 + 9 0.06 -0.89 4.08 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.89 -62.17 + 10 0.06 -0.89 4.60 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.89 -63.05 + 11 0.06 -0.88 5.13 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -63.94 + 12 0.06 -0.88 5.65 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -64.82 + 13 0.06 -0.88 6.18 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -65.70 + 14 0.06 -0.88 6.71 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -66.59 + 15 0.06 -0.88 7.24 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -67.47 + 16 0.06 -0.88 7.77 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -68.35 + 17 0.06 -0.88 8.30 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -69.23 + 18 0.06 -0.88 8.83 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -70.11 + 19 0.06 -0.88 9.37 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -70.98 + 20 0.06 -0.88 9.90 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -71.86 + 21 0.06 -0.88 10.43 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -72.74 + 22 0.06 -0.88 10.97 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -73.62 + 23 0.06 -0.88 11.50 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -74.49 + 24 0.06 -0.88 12.04 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -75.37 + 25 0.06 -0.88 12.57 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.88 -76.24 + 26 0.06 -0.87 13.11 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.87 -77.12 + 27 0.06 -0.87 13.65 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.87 -77.99 + 28 0.06 -0.87 14.18 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.87 -78.86 + 29 0.06 -0.87 14.72 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.87 -79.74 + 30 0.06 -0.87 15.26 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.41 -0.87 -80.61 diff --git a/tests/examples/example10_HP.out b/tests/examples/example10_HP.out index 3d0e3852..ad7e829a 100644 --- a/tests/examples/example10_HP.out +++ b/tests/examples/example10_HP.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 16.64 MW - Direct-Use heat breakeven price: 18.82 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 18.82 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 70.0 kg/sec @@ -33,6 +33,7 @@ Simulation Metadata Project IRR: 7.45 % Project VIR=PI=PIR: 1.13 Project MOIC: 0.92 + Project Payback Period: 12.64 yr ***ENGINEERING PARAMETERS*** @@ -195,3 +196,42 @@ Simulation Metadata 28 122.7 87.7 48.70 4.50 67.87 29 121.8 87.0 48.34 4.18 70.10 30 108.8 77.7 43.19 3.90 72.10 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 -32.21 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -32.21 -32.21 + 2 0.06 0.00 0.00 | 0.03 2.77 3.40 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -29.44 + 3 0.06 0.00 0.00 | 0.03 2.77 6.80 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -26.67 + 4 0.06 0.00 0.00 | 0.03 2.77 10.19 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -23.89 + 5 0.06 0.00 0.00 | 0.03 2.77 13.59 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -21.12 + 6 0.06 0.00 0.00 | 0.03 2.77 16.99 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -18.35 + 7 0.06 0.00 0.00 | 0.03 2.77 20.39 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -15.58 + 8 0.06 0.00 0.00 | 0.03 2.77 23.78 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -12.80 + 9 0.06 0.00 0.00 | 0.03 2.77 27.18 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -10.03 + 10 0.06 0.00 0.00 | 0.03 2.77 30.57 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.77 -7.27 + 11 0.06 0.00 0.00 | 0.03 2.76 33.95 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.76 -4.51 + 12 0.06 0.00 0.00 | 0.03 2.75 37.33 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.75 -1.75 + 13 0.06 0.00 0.00 | 0.03 2.75 40.70 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.75 0.99 + 14 0.06 0.00 0.00 | 0.03 2.73 44.06 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.73 3.73 + 15 0.06 0.00 0.00 | 0.03 2.72 47.41 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.72 6.45 + 16 0.06 0.00 0.00 | 0.03 2.71 50.74 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.71 9.16 + 17 0.06 0.00 0.00 | 0.03 2.69 54.06 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.69 11.85 + 18 0.06 0.00 0.00 | 0.03 2.68 57.36 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.68 14.52 + 19 0.06 0.00 0.00 | 0.03 2.66 60.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.66 17.18 + 20 0.06 0.00 0.00 | 0.03 2.64 63.91 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.64 19.82 + 21 0.06 0.00 0.00 | 0.03 2.62 67.15 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.62 22.44 + 22 0.06 0.00 0.00 | 0.03 2.60 70.37 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.60 25.03 + 23 0.06 0.00 0.00 | 0.03 2.58 73.57 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.58 27.61 + 24 0.06 0.00 0.00 | 0.03 2.56 76.75 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.56 30.17 + 25 0.06 0.00 0.00 | 0.03 2.53 79.91 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.53 32.70 + 26 0.06 0.00 0.00 | 0.03 2.51 83.05 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.51 35.21 + 27 0.06 0.00 0.00 | 0.03 2.49 86.16 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.49 37.70 + 28 0.06 0.00 0.00 | 0.03 2.47 89.25 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.47 40.16 + 29 0.06 0.00 0.00 | 0.03 2.44 92.32 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.44 42.61 + 30 0.06 0.00 0.00 | 0.03 2.42 95.37 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.63 2.42 45.03 diff --git a/tests/examples/example11_AC.out b/tests/examples/example11_AC.out index 1190b9da..7bc5318c 100644 --- a/tests/examples/example11_AC.out +++ b/tests/examples/example11_AC.out @@ -15,7 +15,7 @@ Simulation Metadata End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 8.49 MW Average Cooling Production: 5.50 MW - Direct-Use Cooling Breakeven Price: 27.23 USD/MMBTU + Direct-Use Cooling Breakeven Price (LCOC): 27.23 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 50.0 kg/sec @@ -30,10 +30,11 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -15.88 MUSD - Project IRR: 0.34 % - Project VIR=PI=PIR: 0.48 - Project MOIC: 0.03 + Project NPV: 0.01 MUSD + Project IRR: 0.06 % + Project VIR=PI=PIR: 1.00 + Project MOIC: 0.75 + Project Payback Period: 14.10 yr ***ENGINEERING PARAMETERS*** @@ -200,3 +201,42 @@ Simulation Metadata 28 40.6 62.6 7.21 48.48 29 40.3 62.1 6.99 50.07 30 36.0 55.5 6.79 51.50 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 -30.71 0.00 | 0.00 0.00 0.00 | 0.00 -30.71 -30.71 + 2 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 2.94 | 0.00 0.00 0.00 | 0.59 2.35 -28.36 + 3 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 5.89 | 0.00 0.00 0.00 | 0.59 2.35 -26.01 + 4 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 8.83 | 0.00 0.00 0.00 | 0.59 2.35 -23.66 + 5 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 11.77 | 0.00 0.00 0.00 | 0.59 2.35 -21.31 + 6 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 14.72 | 0.00 0.00 0.00 | 0.59 2.35 -18.96 + 7 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 17.66 | 0.00 0.00 0.00 | 0.59 2.35 -16.60 + 8 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 20.60 | 0.00 0.00 0.00 | 0.59 2.35 -14.26 + 9 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 23.54 | 0.00 0.00 0.00 | 0.59 2.35 -11.91 + 10 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.35 26.48 | 0.00 0.00 0.00 | 0.59 2.35 -9.56 + 11 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.34 29.41 | 0.00 0.00 0.00 | 0.59 2.34 -7.22 + 12 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.33 32.34 | 0.00 0.00 0.00 | 0.59 2.33 -4.89 + 13 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.33 35.26 | 0.00 0.00 0.00 | 0.59 2.33 -2.56 + 14 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.32 38.17 | 0.00 0.00 0.00 | 0.59 2.32 -0.24 + 15 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.31 41.07 | 0.00 0.00 0.00 | 0.59 2.31 2.07 + 16 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.29 43.95 | 0.00 0.00 0.00 | 0.59 2.29 4.36 + 17 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.28 46.83 | 0.00 0.00 0.00 | 0.59 2.28 6.64 + 18 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.27 49.69 | 0.00 0.00 0.00 | 0.59 2.27 8.91 + 19 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.25 52.53 | 0.00 0.00 0.00 | 0.59 2.25 11.16 + 20 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.23 55.36 | 0.00 0.00 0.00 | 0.59 2.23 13.39 + 21 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.22 58.17 | 0.00 0.00 0.00 | 0.59 2.22 15.61 + 22 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.20 60.96 | 0.00 0.00 0.00 | 0.59 2.20 17.81 + 23 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.18 63.73 | 0.00 0.00 0.00 | 0.59 2.18 19.99 + 24 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.16 66.48 | 0.00 0.00 0.00 | 0.59 2.16 22.15 + 25 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.14 69.22 | 0.00 0.00 0.00 | 0.59 2.14 24.30 + 26 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.12 71.94 | 0.00 0.00 0.00 | 0.59 2.12 26.42 + 27 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.10 74.63 | 0.00 0.00 0.00 | 0.59 2.10 28.52 + 28 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.08 77.31 | 0.00 0.00 0.00 | 0.59 2.08 30.61 + 29 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.07 79.97 | 0.00 0.00 0.00 | 0.59 2.07 32.67 + 30 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.07 2.05 82.61 | 0.00 0.00 0.00 | 0.59 2.05 34.72 diff --git a/tests/examples/example12_DH.out b/tests/examples/example12_DH.out index 0f4ac6e0..4208af16 100644 --- a/tests/examples/example12_DH.out +++ b/tests/examples/example12_DH.out @@ -13,11 +13,11 @@ Simulation Metadata ***SUMMARY OF RESULTS*** End-Use Option: Direct-Use Heat + Average Direct-Use Heat Production: 19.15 MW Annual District Heating Demand: 242.90 GWh/year Average Annual Geothermal Heat Production: 144.70 GWh/year Average Annual Peaking Fuel Heat Production: 98.20 GWh/year - Average Direct-Use Heat Production: 19.15 MW - Direct-Use heat breakeven price: 11.53 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 11.53 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 50.0 kg/sec @@ -36,6 +36,7 @@ Simulation Metadata Project IRR: 1.73 % Project VIR=PI=PIR: 0.59 Project MOIC: 0.14 + Project Payback Period: 23.71 yr ***ENGINEERING PARAMETERS*** @@ -209,3 +210,42 @@ Simulation Metadata 28 140.7 102.2 175.83 3.75 82.97 29 140.3 102.6 175.42 3.12 85.84 30 93.4 102.9 116.73 2.70 87.75 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 -47.09 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -47.09 -47.09 + 2 0.06 0.00 0.00 | 0.03 2.16 3.73 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.16 -44.93 + 3 0.06 0.00 0.00 | 0.03 2.15 7.46 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.15 -42.78 + 4 0.06 0.00 0.00 | 0.03 2.14 11.18 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.14 -40.64 + 5 0.06 0.00 0.00 | 0.03 2.14 14.89 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.14 -38.50 + 6 0.06 0.00 0.00 | 0.03 2.13 18.59 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.13 -36.37 + 7 0.06 0.00 0.00 | 0.03 2.12 22.28 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.12 -34.25 + 8 0.06 0.00 0.00 | 0.03 2.11 25.97 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.11 -32.14 + 9 0.06 0.00 0.00 | 0.03 2.10 29.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.10 -30.03 + 10 0.06 0.00 0.00 | 0.03 2.10 33.31 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.10 -27.94 + 11 0.06 0.00 0.00 | 0.03 2.09 36.98 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.09 -25.85 + 12 0.06 0.00 0.00 | 0.03 2.08 40.63 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.08 -23.77 + 13 0.06 0.00 0.00 | 0.03 2.07 44.28 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.07 -21.70 + 14 0.06 0.00 0.00 | 0.03 2.06 47.91 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.06 -19.63 + 15 0.06 0.00 0.00 | 0.03 2.06 51.54 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.06 -17.58 + 16 0.06 0.00 0.00 | 0.03 2.05 55.16 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.05 -15.53 + 17 0.06 0.00 0.00 | 0.03 2.04 58.78 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.04 -13.49 + 18 0.06 0.00 0.00 | 0.03 2.03 62.38 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.03 -11.45 + 19 0.06 0.00 0.00 | 0.03 2.02 65.98 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.02 -9.43 + 20 0.06 0.00 0.00 | 0.03 2.02 69.57 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.02 -7.41 + 21 0.06 0.00 0.00 | 0.03 2.01 73.15 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.01 -5.41 + 22 0.06 0.00 0.00 | 0.03 2.00 76.73 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 2.00 -3.40 + 23 0.06 0.00 0.00 | 0.03 1.99 80.29 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.99 -1.41 + 24 0.06 0.00 0.00 | 0.03 1.98 83.85 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.98 0.57 + 25 0.06 0.00 0.00 | 0.03 1.98 87.40 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.98 2.55 + 26 0.06 0.00 0.00 | 0.03 1.97 90.94 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.97 4.52 + 27 0.06 0.00 0.00 | 0.03 1.96 94.47 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.96 6.47 + 28 0.06 0.00 0.00 | 0.03 1.95 98.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.95 8.43 + 29 0.06 0.00 0.00 | 0.03 1.94 101.51 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.94 10.37 + 30 0.06 0.00 0.00 | 0.03 1.94 105.02 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.57 1.94 12.30 diff --git a/tests/examples/example13.out b/tests/examples/example13.out index 9713d6cd..664671c7 100644 --- a/tests/examples/example13.out +++ b/tests/examples/example13.out @@ -4,18 +4,19 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.3 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-02-18 - Simulation Time: 09:03 - Calculation Time: 0.044 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:11 + Calculation Time: 0.124 sec ***SUMMARY OF RESULTS*** End-Use Option: Cogeneration Bottoming Cycle, Electricity sales considered as extra income Average Net Electricity Production: -1.87 MW Average Direct-Use Heat Production: 15.20 MW - Direct-Use heat breakeven price: 20.56 USD/MMBTU + Electricity breakeven price (LCOE): -31.38 cents/kWh + Direct-Use heat breakeven price (LCOH): 14.00 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 50.0 kg/sec @@ -34,6 +35,8 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.26 Project MOIC: -0.62 + Project Payback Period: 0.00 yr + CHP: Percent cost allocation for electrical plant: 60.94% ***ENGINEERING PARAMETERS*** @@ -205,3 +208,42 @@ Simulation Metadata 28 88.6 -13.1 394.25 12.50 77.13 29 84.9 -13.1 389.60 11.10 79.70 30 54.5 -8.7 257.16 10.17 81.39 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -58.11 -58.11 + 2 0.06 -0.72 -0.72 | 0.03 3.30 3.30 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.56 -58.66 + 3 0.06 -0.72 -1.45 | 0.03 3.21 6.50 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.65 -59.32 + 4 0.06 -0.72 -2.17 | 0.03 3.11 9.62 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.74 -60.06 + 5 0.06 -0.72 -2.90 | 0.03 3.02 12.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.84 -60.90 + 6 0.06 -0.72 -3.62 | 0.03 2.93 15.56 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.93 -61.83 + 7 0.06 -0.72 -4.34 | 0.03 2.83 18.40 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.02 -62.85 + 8 0.06 -0.72 -5.07 | 0.03 2.74 21.14 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.11 -63.96 + 9 0.06 -0.72 -5.79 | 0.03 2.65 23.79 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.21 -65.17 + 10 0.06 -0.72 -6.51 | 0.03 2.56 26.35 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.30 -66.47 + 11 0.06 -0.72 -7.23 | 0.03 2.46 28.81 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.39 -67.86 + 12 0.06 -0.72 -7.95 | 0.03 2.37 31.18 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.48 -69.34 + 13 0.06 -0.72 -8.67 | 0.03 2.28 33.45 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.58 -70.92 + 14 0.06 -0.72 -9.39 | 0.03 2.18 35.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.67 -72.59 + 15 0.06 -0.72 -10.12 | 0.03 2.09 37.73 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.76 -74.35 + 16 0.06 -0.72 -10.83 | 0.03 2.00 39.73 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.85 -76.20 + 17 0.06 -0.72 -11.56 | 0.03 3.09 42.82 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.76 -76.97 + 18 0.06 -0.72 -12.28 | 0.03 3.24 46.06 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.62 -77.59 + 19 0.06 -0.72 -13.01 | 0.03 3.14 49.20 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.71 -78.30 + 20 0.06 -0.72 -13.73 | 0.03 3.05 52.25 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.81 -79.11 + 21 0.06 -0.72 -14.46 | 0.03 2.96 55.21 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.90 -80.01 + 22 0.06 -0.72 -15.18 | 0.03 2.87 58.08 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -0.99 -81.00 + 23 0.06 -0.72 -15.90 | 0.03 2.77 60.85 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.08 -82.08 + 24 0.06 -0.72 -16.62 | 0.03 2.68 63.53 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.18 -83.26 + 25 0.06 -0.72 -17.35 | 0.03 2.59 66.11 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.27 -84.52 + 26 0.06 -0.72 -18.07 | 0.03 2.49 68.61 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.36 -85.88 + 27 0.06 -0.72 -18.79 | 0.03 2.40 71.01 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.45 -87.34 + 28 0.06 -0.72 -19.51 | 0.03 2.31 73.32 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.55 -88.88 + 29 0.06 -0.72 -20.23 | 0.03 2.22 75.53 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.64 -90.52 + 30 0.06 -0.72 -20.95 | 0.03 2.12 77.65 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.13 -1.73 -92.25 diff --git a/tests/examples/example1_addons.out b/tests/examples/example1_addons.out index 5d1d7bb0..d531b4ec 100644 --- a/tests/examples/example1_addons.out +++ b/tests/examples/example1_addons.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 1.21 MW - Electricity breakeven price: 8.72 cents/kWh + Electricity breakeven price (LCOE): 8.70 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -29,10 +29,11 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -6.29 MUSD - Project IRR: 4.48 % + Project NPV: -6.25 MUSD + Project IRR: 4.49 % Project VIR=PI=PIR: 0.81 - Project MOIC: 3.47 + Project MOIC: 3.48 + Project Payback Period: 17.70 yr ***ENGINEERING PARAMETERS*** @@ -202,10 +203,49 @@ Simulation Metadata 30 8.2 344.9 279.65 13.69 + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.09 -32.63 0.00 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -32.63 -32.63 + 2 0.09 1.58 0.78 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.58 -31.05 + 3 0.09 1.62 1.60 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.62 -29.43 + 4 0.09 1.63 2.43 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.63 -27.80 + 5 0.09 1.64 3.27 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.64 -26.15 + 6 0.09 1.65 4.12 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.65 -24.50 + 7 0.10 1.65 4.97 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.65 -22.85 + 8 0.11 1.77 5.94 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.77 -21.08 + 9 0.13 1.89 7.03 | 0.02 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.89 -19.19 + 10 0.14 2.01 8.24 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.01 -17.19 + 11 0.15 2.12 9.56 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.12 -15.06 + 12 0.15 2.24 11.00 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.24 -12.82 + 13 0.15 2.25 12.44 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -10.57 + 14 0.15 2.25 13.89 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -8.33 + 15 0.15 2.25 15.34 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -6.08 + 16 0.15 2.25 16.79 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -3.82 + 17 0.15 2.25 18.24 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -1.57 + 18 0.15 2.26 19.70 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 0.69 + 19 0.15 2.26 21.15 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 2.94 + 20 0.15 2.26 22.61 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 5.20 + 21 0.15 2.26 24.07 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 7.46 + 22 0.15 2.26 25.53 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 9.73 + 23 0.15 2.26 26.99 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 11.99 + 24 0.15 2.26 28.46 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 14.25 + 25 0.15 2.27 29.92 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 16.52 + 26 0.15 2.27 31.39 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 18.79 + 27 0.15 2.27 32.85 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 21.06 + 28 0.15 2.27 34.32 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 23.32 + 29 0.15 2.27 35.79 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 25.59 + 30 0.15 2.27 37.26 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 27.87 + + ***EXTENDED ECONOMICS*** - Adjusted Project LCOE (after incentives, grants, AddOns,etc): 8.72 cents/kWh + Adjusted Project LCOE (after incentives, grants, AddOns,etc): 8.70 cents/kWh Adjusted Project LCOH (after incentives, grants, AddOns,etc): 0.00 USD/MMBTU Adjusted Project CAPEX (after incentives, grants, AddOns, etc): 102.63 MUSD Adjusted Project OPEX (after incentives, grants, AddOns, etc): 0.90 MUSD @@ -213,7 +253,6 @@ Simulation Metadata Project IRR (including AddOns): -0.00 % Project VIR=PI=PIR (including AddOns): 0.41 Project MOIC (including AddOns): -0.05 - Project Payback Period (including AddOns): 0.00 yr Total Add-on CAPEX: 70.00 MUSD Total Add-on OPEX: 1.70 MUSD/yr Total Add-on Net Elec: 25900.00 kW/yr @@ -258,53 +297,3 @@ Start (cents/kWh)(MUSD/yr) (cents/kWh)(MUSD/yr) (MUSD/yr) (MUSD/yr) (MUSD 28 0.150 0.0039 0.036 0.0000 1.14 1.14 -39.24 3.41 -15.91 29 0.150 0.0039 0.036 0.0000 1.14 1.14 -38.10 3.41 -12.50 30 0.150 0.0039 0.036 0.0000 1.14 1.14 -36.96 3.41 -9.09 - - - ***CCUS ECONOMICS*** - - - Total Avoided Carbon Production: 234780313.03 pound - Project NPV (including carbon credit): -0.41 MUSD - Project IRR (including carbon credit): 0.06 % - Project VIR=IR=PIR (including carbon credit): 0.99 - Project MOIC (including carbon credit): 5.47 - Project Payback Period (including carbon credit): 15.53 yr - - - ****************** - * CCUS PROFILE * - ****************** -Year Carbon CCUS CCUS Annual CCUS Cumm. Project Annual Project Cumm. -Since Avoided Price Revenue Cash Flow Cash Flow Cash Flow Cash Flow -Start (pound) (USD/lb) (MUSD/yr) (MUSD/yr) (MUSD) (MUSD/yr) (MUSD) - 1 -32.63 -32.63 - 2 7101870.358 0.015 0.11 0.11 0.11 1.69 -30.95 - 3 7470391.043 0.015 0.11 0.11 0.22 1.73 -29.21 - 4 7595168.229 0.015 0.11 0.11 0.33 1.75 -27.46 - 5 7669074.100 0.015 0.12 0.12 0.45 1.76 -25.71 - 6 7720883.286 0.015 0.12 0.12 0.56 1.76 -23.94 - 7 7760409.892 0.015 0.12 0.12 0.68 1.77 -22.17 - 8 7792164.418 0.025 0.19 0.19 0.87 1.97 -20.21 - 9 7818583.043 0.035 0.27 0.27 1.15 2.16 -18.04 - 10 7841125.517 0.045 0.35 0.35 1.50 2.36 -15.69 - 11 7860732.801 0.055 0.43 0.43 1.93 2.56 -13.13 - 12 7878045.387 0.065 0.51 0.51 2.45 2.75 -10.37 - 13 7893518.049 0.075 0.59 0.59 3.04 2.84 -7.54 - 14 7907484.797 0.085 0.67 0.67 3.71 2.92 -4.62 - 15 7920197.818 0.095 0.75 0.75 4.46 3.00 -1.61 - 16 7931851.962 0.100 0.79 0.79 5.26 3.05 1.43 - 17 7942600.746 0.100 0.79 0.79 6.05 3.05 4.48 - 18 7952567.147 0.100 0.80 0.80 6.84 3.05 7.53 - 19 7961851.088 0.100 0.80 0.80 7.64 3.05 10.58 - 20 7970534.743 0.100 0.80 0.80 8.44 3.06 13.64 - 21 7978686.355 0.100 0.80 0.80 9.24 3.06 16.70 - 22 7986363.027 0.100 0.80 0.80 10.03 3.06 19.76 - 23 7993612.777 0.100 0.80 0.80 10.83 3.06 22.82 - 24 8000476.061 0.100 0.80 0.80 11.63 3.06 25.89 - 25 8006986.902 0.100 0.80 0.80 12.43 3.07 28.95 - 26 8013173.735 0.100 0.80 0.80 13.24 3.07 32.02 - 27 8019060.033 0.100 0.80 0.80 14.04 3.07 35.09 - 28 8024664.782 0.100 0.80 0.80 14.84 3.07 38.16 - 29 8030002.830 0.100 0.80 0.80 15.64 3.07 41.24 - 30 8035085.158 0.100 0.80 0.80 16.45 3.07 44.31 - 31 6703146.945 0.100 0.67 0.67 17.12 2.70 47.01 diff --git a/tests/examples/example2.out b/tests/examples/example2.out index 7cfe3936..28b7d61a 100644 --- a/tests/examples/example2.out +++ b/tests/examples/example2.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 21.03 MW - Direct-Use heat breakeven price: 7.23 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 7.23 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 30.0 kg/sec @@ -33,6 +33,7 @@ Simulation Metadata Project IRR: 5.77 % Project VIR=PI=PIR: 0.96 Project MOIC: 0.51 + Project Payback Period: 13.48 yr ***ENGINEERING PARAMETERS*** @@ -185,3 +186,37 @@ Simulation Metadata 23 150.9 167.6 24.84 38.23 24 149.1 165.6 24.25 39.71 25 98.4 109.3 23.85 40.69 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 -40.91 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -40.91 -40.91 + 2 0.06 0.00 0.00 | 0.03 3.26 4.34 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.26 -37.65 + 3 0.06 0.00 0.00 | 0.03 3.31 8.72 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.31 -34.34 + 4 0.06 0.00 0.00 | 0.03 3.33 13.13 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.33 -31.01 + 5 0.06 0.00 0.00 | 0.03 3.34 17.55 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.34 -27.66 + 6 0.06 0.00 0.00 | 0.03 3.35 21.97 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.35 -24.31 + 7 0.06 0.00 0.00 | 0.03 3.36 26.41 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.36 -20.95 + 8 0.06 0.00 0.00 | 0.03 3.36 30.84 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.36 -17.59 + 9 0.06 0.00 0.00 | 0.03 3.37 35.29 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.37 -14.23 + 10 0.06 0.00 0.00 | 0.03 3.24 39.61 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.24 -10.98 + 11 0.06 0.00 0.00 | 0.03 3.19 43.87 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.19 -7.79 + 12 0.06 0.00 0.00 | 0.03 3.16 48.11 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.16 -4.63 + 13 0.06 0.00 0.00 | 0.03 3.13 52.32 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.13 -1.50 + 14 0.06 0.00 0.00 | 0.03 3.10 56.49 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.10 1.60 + 15 0.06 0.00 0.00 | 0.03 3.06 60.63 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.06 4.66 + 16 0.06 0.00 0.00 | 0.03 3.02 64.73 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 3.02 7.69 + 17 0.06 0.00 0.00 | 0.03 2.99 68.79 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.99 10.67 + 18 0.06 0.00 0.00 | 0.03 2.95 72.81 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.95 13.62 + 19 0.06 0.00 0.00 | 0.03 2.91 76.80 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.91 16.53 + 20 0.06 0.00 0.00 | 0.03 2.87 80.74 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.87 19.40 + 21 0.06 0.00 0.00 | 0.03 2.83 84.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.83 22.22 + 22 0.06 0.00 0.00 | 0.03 2.78 88.50 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.78 25.01 + 23 0.06 0.00 0.00 | 0.03 2.74 92.32 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.74 27.75 + 24 0.06 0.00 0.00 | 0.03 2.70 96.09 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.70 30.44 + 25 0.06 0.00 0.00 | 0.03 2.65 99.82 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.08 2.65 33.10 diff --git a/tests/examples/example3.out b/tests/examples/example3.out index 3d1e3a32..52a99de5 100644 --- a/tests/examples/example3.out +++ b/tests/examples/example3.out @@ -15,7 +15,8 @@ Simulation Metadata End-Use Option: Cogeneration Topping Cycle, Heat sales considered as extra income Average Net Electricity Production: 19.66 MW Average Direct-Use Heat Production: 10.52 MW - Electricity breakeven price: 5.74 cents/kWh + Electricity breakeven price (LCOE): 6.38 cents/kWh + Direct-Use heat breakeven price (LCOH): 2.36 USD/MMBTU Number of production wells: 3 Number of injection wells: 3 Flowrate per production well: 70.0 kg/sec @@ -33,6 +34,8 @@ Simulation Metadata Project IRR: 6.01 % Project VIR=PI=PIR: 0.97 Project MOIC: 0.65 + Project Payback Period: 14.87 yr + CHP: Percent cost allocation for electrical plant: 93.66% ***ENGINEERING PARAMETERS*** @@ -211,3 +214,47 @@ Simulation Metadata 33 71.7 137.8 928.38 -35.38 142.14 34 70.7 136.5 922.64 -38.70 146.10 35 62.8 121.7 825.50 -41.67 149.64 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -111.58 -111.58 + 2 0.06 9.09 9.09 | 0.03 2.23 2.23 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.09 -103.49 + 3 0.06 9.09 18.18 | 0.03 2.23 4.47 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.09 -95.40 + 4 0.06 9.09 27.27 | 0.03 2.23 6.70 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.09 -87.31 + 5 0.06 9.09 36.37 | 0.03 2.23 8.93 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.09 -79.21 + 6 0.06 9.09 45.46 | 0.03 2.23 11.16 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.09 -71.12 + 7 0.06 9.09 54.55 | 0.03 2.23 13.40 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.09 -63.03 + 8 0.06 9.09 63.63 | 0.03 2.23 15.63 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.09 -54.95 + 9 0.06 9.08 72.71 | 0.03 2.23 17.86 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.08 -46.87 + 10 0.06 9.07 81.78 | 0.03 2.23 20.09 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.06 -38.81 + 11 0.06 9.05 90.83 | 0.03 2.22 22.31 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.04 -30.77 + 12 0.06 9.02 99.86 | 0.03 2.22 24.52 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 8.01 -22.76 + 13 0.06 8.99 108.85 | 0.03 2.21 26.73 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.97 -14.79 + 14 0.06 8.96 117.80 | 0.03 2.20 28.93 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.92 -6.87 + 15 0.06 8.91 126.72 | 0.03 2.19 31.11 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.86 1.00 + 16 0.06 8.86 135.58 | 0.03 2.17 33.29 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.80 8.80 + 17 0.06 8.81 144.38 | 0.03 2.16 35.45 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.73 16.53 + 18 0.06 8.75 153.13 | 0.03 2.14 37.59 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.66 24.19 + 19 0.06 8.68 161.81 | 0.03 2.12 39.71 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.58 31.76 + 20 0.06 8.62 170.43 | 0.03 2.11 41.82 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.49 39.25 + 21 0.06 8.55 178.98 | 0.03 2.09 43.91 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.40 46.66 + 22 0.06 8.48 187.46 | 0.03 2.07 45.97 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.31 53.97 + 23 0.06 8.40 195.86 | 0.03 2.05 48.02 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.22 61.19 + 24 0.06 8.33 204.19 | 0.03 2.03 50.05 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.12 68.31 + 25 0.06 8.26 212.45 | 0.03 2.00 52.05 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 7.03 75.34 + 26 0.06 8.18 220.62 | 0.03 1.98 54.03 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.93 82.27 + 27 0.06 8.10 228.73 | 0.03 1.96 55.99 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.83 89.09 + 28 0.06 8.03 236.76 | 0.03 1.93 57.92 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.73 95.82 + 29 0.06 7.95 244.71 | 0.03 1.91 59.83 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.63 102.45 + 30 0.06 7.88 252.58 | 0.03 1.89 61.72 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.53 108.99 + 31 0.06 7.80 260.38 | 0.03 1.86 63.59 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.43 115.42 + 32 0.06 7.73 268.11 | 0.03 1.84 65.43 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.33 121.75 + 33 0.06 7.65 275.76 | 0.03 1.82 67.24 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.24 127.99 + 34 0.06 7.58 283.34 | 0.03 1.79 69.03 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.14 134.12 + 35 0.06 7.51 290.84 | 0.03 1.77 70.80 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 3.23 6.04 140.17 diff --git a/tests/examples/example4.out b/tests/examples/example4.out index 3670038c..dd691f87 100644 --- a/tests/examples/example4.out +++ b/tests/examples/example4.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.3 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-02-18 - Simulation Time: 09:03 - Calculation Time: 0.062 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:05 + Calculation Time: 0.187 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: -0.57 MW - Electricity breakeven price: -244.32 cents/kWh + Electricity breakeven price (LCOE): -244.32 cents/kWh Number of production wells: 3 Number of injection wells: 2 Flowrate per production well: 110.0 kg/sec @@ -32,6 +32,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.45 Project MOIC: -1.07 + Project Payback Period: 0.00 yr ***ENGINEERING PARAMETERS*** @@ -198,3 +199,42 @@ Simulation Metadata 28 -11.8 691.4 137.43 35.37 29 -12.4 687.3 134.95 36.53 30 -9.6 512.8 133.11 37.40 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 -57.71 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -57.71 -57.71 + 2 0.06 -1.59 0.23 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.59 -59.30 + 3 0.06 -1.63 0.42 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.63 -60.93 + 4 0.06 -1.66 0.58 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.66 -62.59 + 5 0.06 -1.69 0.71 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.69 -64.28 + 6 0.06 -1.73 0.80 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.73 -66.01 + 7 0.06 -1.76 0.85 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.76 -67.78 + 8 0.06 -1.80 0.87 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.80 -69.57 + 9 0.06 -1.83 0.86 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.83 -71.41 + 10 0.06 -1.87 0.82 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.87 -73.27 + 11 0.06 -1.90 0.74 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.90 -75.17 + 12 0.06 -1.93 0.62 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.93 -77.10 + 13 0.06 -1.96 0.48 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -1.96 -79.07 + 14 0.06 -2.00 0.30 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.00 -81.06 + 15 0.06 -2.03 0.09 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.03 -83.09 + 16 0.06 -2.06 -0.15 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.06 -85.16 + 17 0.06 -2.10 -0.43 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.10 -87.25 + 18 0.06 -2.13 -0.74 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.13 -89.38 + 19 0.06 -2.16 -1.08 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.16 -91.54 + 20 0.06 -2.19 -1.45 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.19 -93.73 + 21 0.06 -2.22 -1.86 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.22 -95.95 + 22 0.06 -2.25 -2.29 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.25 -98.21 + 23 0.06 -2.29 -2.76 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.29 -100.49 + 24 0.06 -2.32 -3.25 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.32 -102.81 + 25 0.06 -2.35 -3.78 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.35 -105.16 + 26 0.06 -2.38 -4.34 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.38 -107.54 + 27 0.06 -2.41 -4.93 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.41 -109.95 + 28 0.06 -2.44 -5.55 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.44 -112.39 + 29 0.06 -2.47 -6.20 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.47 -114.85 + 30 0.06 -2.50 -6.88 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.82 -2.50 -117.35 diff --git a/tests/examples/example5.out b/tests/examples/example5.out index f067e40a..8efd6ac8 100644 --- a/tests/examples/example5.out +++ b/tests/examples/example5.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 19.25 MW - Direct-Use heat breakeven price: 8.98 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 8.98 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 50.0 kg/sec @@ -32,6 +32,7 @@ Simulation Metadata Project IRR: 5.64 % Project VIR=PI=PIR: 0.95 Project MOIC: 0.47 + Project Payback Period: 13.63 yr ***ENGINEERING PARAMETERS*** @@ -191,3 +192,42 @@ Simulation Metadata 28 117.1 130.1 181.19 8.70 29 115.2 128.0 180.73 8.93 30 85.2 94.7 180.39 9.10 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 -41.38 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -41.38 -41.38 + 2 0.06 0.00 0.00 | 0.03 3.53 4.71 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.53 -37.86 + 3 0.06 0.00 0.00 | 0.03 3.57 9.46 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.57 -34.28 + 4 0.06 0.00 0.00 | 0.03 3.58 14.22 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.58 -30.70 + 5 0.06 0.00 0.00 | 0.03 3.55 18.95 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.55 -27.15 + 6 0.06 0.00 0.00 | 0.03 3.50 23.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.50 -23.65 + 7 0.06 0.00 0.00 | 0.03 3.42 28.24 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.42 -20.23 + 8 0.06 0.00 0.00 | 0.03 3.33 32.75 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.33 -16.90 + 9 0.06 0.00 0.00 | 0.03 3.23 37.16 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.23 -13.66 + 10 0.06 0.00 0.00 | 0.03 3.13 41.48 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.13 -10.53 + 11 0.06 0.00 0.00 | 0.03 3.03 45.69 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 3.03 -7.50 + 12 0.06 0.00 0.00 | 0.03 2.93 49.81 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.93 -4.56 + 13 0.06 0.00 0.00 | 0.03 2.84 53.83 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.84 -1.72 + 14 0.06 0.00 0.00 | 0.03 2.75 57.75 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.75 1.02 + 15 0.06 0.00 0.00 | 0.03 2.66 61.59 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.66 3.68 + 16 0.06 0.00 0.00 | 0.03 2.57 65.34 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.57 6.25 + 17 0.06 0.00 0.00 | 0.03 2.49 69.02 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.49 8.74 + 18 0.06 0.00 0.00 | 0.03 2.41 72.61 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.41 11.16 + 19 0.06 0.00 0.00 | 0.03 2.34 76.13 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.34 13.50 + 20 0.06 0.00 0.00 | 0.03 2.27 79.58 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.27 15.76 + 21 0.06 0.00 0.00 | 0.03 2.20 82.96 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.20 17.96 + 22 0.06 0.00 0.00 | 0.03 2.13 86.27 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.13 20.10 + 23 0.06 0.00 0.00 | 0.03 2.07 89.52 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.07 22.17 + 24 0.06 0.00 0.00 | 0.03 2.01 92.72 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 2.01 24.18 + 25 0.06 0.00 0.00 | 0.03 1.95 95.85 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 1.95 26.13 + 26 0.06 0.00 0.00 | 0.03 1.90 98.93 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 1.90 28.03 + 27 0.06 0.00 0.00 | 0.03 1.85 101.96 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 1.85 29.88 + 28 0.06 0.00 0.00 | 0.03 1.80 104.93 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 1.80 31.67 + 29 0.06 0.00 0.00 | 0.03 1.75 107.86 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 1.75 33.42 + 30 0.06 0.00 0.00 | 0.03 1.70 110.74 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.18 1.70 35.12 diff --git a/tests/examples/example8.out b/tests/examples/example8.out index 0cc53b05..6b28621b 100644 --- a/tests/examples/example8.out +++ b/tests/examples/example8.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 9.43 MW - Direct-Use heat breakeven price: 9.13 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 9.13 USD/MMBTU Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 40.0 kg/sec @@ -33,6 +33,7 @@ Simulation Metadata Project IRR: 0.86 % Project VIR=PI=PIR: 0.52 Project MOIC: 0.08 + Project Payback Period: 26.95 yr ***ENGINEERING PARAMETERS*** @@ -195,3 +196,42 @@ Simulation Metadata 28 47.5 52.8 24.62 18.46 29 47.2 52.5 24.43 19.08 30 39.1 43.5 24.28 19.60 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 0.00 0.00 | 0.03 -21.06 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -21.06 -21.06 + 2 0.06 0.00 0.00 | 0.03 0.82 1.25 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.82 -20.24 + 3 0.06 0.00 0.00 | 0.03 0.82 2.51 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.82 -19.42 + 4 0.06 0.00 0.00 | 0.03 0.83 3.78 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -18.59 + 5 0.06 0.00 0.00 | 0.03 0.83 5.04 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -17.76 + 6 0.06 0.00 0.00 | 0.03 0.83 6.31 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -16.93 + 7 0.06 0.00 0.00 | 0.03 0.83 7.57 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -16.10 + 8 0.06 0.00 0.00 | 0.03 0.83 8.84 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -15.27 + 9 0.06 0.00 0.00 | 0.03 0.83 10.11 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -14.44 + 10 0.06 0.00 0.00 | 0.03 0.83 11.37 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -13.61 + 11 0.06 0.00 0.00 | 0.03 0.83 12.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -12.78 + 12 0.06 0.00 0.00 | 0.03 0.83 13.90 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -11.95 + 13 0.06 0.00 0.00 | 0.03 0.83 15.17 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.83 -11.13 + 14 0.06 0.00 0.00 | 0.03 0.82 16.43 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.82 -10.30 + 15 0.06 0.00 0.00 | 0.03 0.82 17.69 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.82 -9.48 + 16 0.06 0.00 0.00 | 0.03 0.82 18.94 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.82 -8.66 + 17 0.06 0.00 0.00 | 0.03 0.82 20.20 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.82 -7.85 + 18 0.06 0.00 0.00 | 0.03 0.81 21.44 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.81 -7.03 + 19 0.06 0.00 0.00 | 0.03 0.81 22.69 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.81 -6.23 + 20 0.06 0.00 0.00 | 0.03 0.80 23.93 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.80 -5.43 + 21 0.06 0.00 0.00 | 0.03 0.80 25.16 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.80 -4.63 + 22 0.06 0.00 0.00 | 0.03 0.79 26.39 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.79 -3.84 + 23 0.06 0.00 0.00 | 0.03 0.79 27.61 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.79 -3.05 + 24 0.06 0.00 0.00 | 0.03 0.78 28.83 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.78 -2.27 + 25 0.06 0.00 0.00 | 0.03 0.78 30.04 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.78 -1.49 + 26 0.06 0.00 0.00 | 0.03 0.77 31.25 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.77 -0.72 + 27 0.06 0.00 0.00 | 0.03 0.76 32.45 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.76 0.04 + 28 0.06 0.00 0.00 | 0.03 0.76 33.64 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.76 0.80 + 29 0.06 0.00 0.00 | 0.03 0.75 34.83 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.75 1.55 + 30 0.06 0.00 0.00 | 0.03 0.74 36.01 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.44 0.74 2.29 diff --git a/tests/examples/example9.out b/tests/examples/example9.out index 7be3824b..8ef441fa 100644 --- a/tests/examples/example9.out +++ b/tests/examples/example9.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.3 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-02-18 - Simulation Time: 08:29 - Calculation Time: 0.606 sec + Simulation Date: 2024-03-02 + Simulation Time: 14:08 + Calculation Time: 1.658 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 0.47 MW - Electricity breakeven price: 50.18 cents/kWh + Electricity breakeven price (LCOE): 50.18 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 40.0 kg/sec @@ -33,6 +33,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.13 Project MOIC: -0.85 + Project Payback Period: 0.00 yr ***ENGINEERING PARAMETERS*** @@ -202,3 +203,42 @@ Simulation Metadata 28 3.4 74.6 21.45 26.81 29 3.3 74.2 21.19 27.72 30 2.7 61.5 20.96 28.48 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 -27.42 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -27.42 -27.42 + 2 0.06 -0.28 0.20 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.28 -27.70 + 3 0.06 -0.27 0.41 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -27.97 + 4 0.06 -0.27 0.63 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -28.24 + 5 0.06 -0.27 0.84 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -28.51 + 6 0.06 -0.27 1.05 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -28.78 + 7 0.06 -0.27 1.26 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -29.05 + 8 0.06 -0.27 1.48 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -29.32 + 9 0.06 -0.27 1.69 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -29.59 + 10 0.06 -0.27 1.91 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -29.86 + 11 0.06 -0.27 2.12 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -30.12 + 12 0.06 -0.27 2.33 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -30.39 + 13 0.06 -0.27 2.55 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -30.66 + 14 0.06 -0.27 2.76 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -30.93 + 15 0.06 -0.27 2.97 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -31.20 + 16 0.06 -0.27 3.18 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -31.47 + 17 0.06 -0.27 3.39 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -31.75 + 18 0.06 -0.27 3.60 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.27 -32.02 + 19 0.06 -0.28 3.81 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.28 -32.30 + 20 0.06 -0.28 4.01 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.28 -32.58 + 21 0.06 -0.28 4.21 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.28 -32.86 + 22 0.06 -0.28 4.41 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.28 -33.14 + 23 0.06 -0.28 4.61 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.28 -33.42 + 24 0.06 -0.29 4.81 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.29 -33.71 + 25 0.06 -0.29 5.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.29 -33.99 + 26 0.06 -0.29 5.20 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.29 -34.28 + 27 0.06 -0.29 5.39 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.29 -34.58 + 28 0.06 -0.29 5.57 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.29 -34.87 + 29 0.06 -0.30 5.76 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.30 -35.17 + 30 0.06 -0.30 5.94 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.48 -0.30 -35.46 diff --git a/tests/examples/example_SHR-1.out b/tests/examples/example_SHR-1.out index dc7cb2d8..cfa830ab 100644 --- a/tests/examples/example_SHR-1.out +++ b/tests/examples/example_SHR-1.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 30.58 MW - Electricity breakeven price: 5.89 cents/kWh + Electricity breakeven price (LCOE): 5.89 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -33,6 +33,7 @@ Simulation Metadata Project IRR: 7.14 % Project VIR=PI=PIR: 1.10 Project MOIC: 1.28 + Project Payback Period: 13.46 yr ***ENGINEERING PARAMETERS*** @@ -196,3 +197,42 @@ Simulation Metadata 28 243.8 1131.6 818.00 12.18 29 243.9 1131.8 813.93 12.62 30 203.3 943.3 810.53 12.99 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 -241.92 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -241.92 -241.92 + 2 0.06 11.70 13.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 11.70 -230.22 + 3 0.07 12.05 27.80 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 12.05 -218.17 + 4 0.08 15.01 44.84 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 15.01 -203.16 + 5 0.10 17.95 64.82 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 17.95 -185.21 + 6 0.10 20.89 87.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 20.89 -164.32 + 7 0.10 21.91 111.66 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 21.91 -142.42 + 8 0.10 21.96 135.64 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 21.96 -120.46 + 9 0.10 22.00 159.67 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.00 -98.46 + 10 0.10 22.04 183.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.04 -76.42 + 11 0.10 22.07 207.83 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.07 -54.35 + 12 0.10 22.10 231.96 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.10 -32.25 + 13 0.10 22.12 256.11 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.12 -10.12 + 14 0.10 22.15 280.28 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.15 12.02 + 15 0.10 22.17 304.48 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.17 34.19 + 16 0.10 22.19 328.69 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.19 56.38 + 17 0.10 22.21 352.92 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.21 78.59 + 18 0.10 22.22 377.17 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.22 100.81 + 19 0.10 22.24 401.43 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.24 123.05 + 20 0.10 22.25 425.71 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.25 145.30 + 21 0.10 22.27 450.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.27 167.56 + 22 0.10 22.28 474.31 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.28 189.84 + 23 0.10 22.29 498.62 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.29 212.13 + 24 0.10 22.30 522.95 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.30 234.44 + 25 0.10 22.31 547.29 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.31 256.75 + 26 0.10 22.32 571.64 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.32 279.07 + 27 0.10 22.33 596.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.33 301.40 + 28 0.10 22.34 620.37 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.34 323.75 + 29 0.10 22.35 644.74 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.35 346.10 + 30 0.10 22.36 669.13 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 2.03 22.36 368.46 diff --git a/tests/examples/example_multiple_gradients.out b/tests/examples/example_multiple_gradients.out index 9e53ae70..995f2508 100644 --- a/tests/examples/example_multiple_gradients.out +++ b/tests/examples/example_multiple_gradients.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.3 + GEOPHIRES Version: 3.4.4 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-02-18 - Simulation Time: 09:27 - Calculation Time: 0.622 sec + Simulation Date: 2024-03-02 + Simulation Time: 18:18 + Calculation Time: 1.704 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.90 MW - Electricity breakeven price: 39.29 cents/kWh + Electricity breakeven price (LCOE): 39.29 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 60.0 kg/sec @@ -39,6 +39,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.18 Project MOIC: -0.82 + Project Payback Period: 0.00 yr ***ENGINEERING PARAMETERS*** @@ -211,3 +212,42 @@ Simulation Metadata 28 10.2 498.0 325.68 13.84 29 9.6 495.6 323.89 14.31 30 7.5 411.2 322.41 14.71 + + + ******************************* + * REVENUE & CASHFLOW PROFILE * + ******************************* +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 -78.41 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -78.41 -78.41 + 2 0.06 -0.99 0.96 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -79.40 + 3 0.06 -0.99 1.92 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -80.39 + 4 0.06 -0.99 2.88 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -81.38 + 5 0.06 -0.99 3.84 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -82.37 + 6 0.06 -0.99 4.80 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -83.36 + 7 0.06 -0.99 5.76 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -84.35 + 8 0.06 -0.99 6.72 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -85.34 + 9 0.06 -0.99 7.67 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -86.33 + 10 0.06 -0.99 8.63 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -0.99 -87.33 + 11 0.06 -1.00 9.58 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.00 -88.33 + 12 0.06 -1.00 10.53 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.00 -89.33 + 13 0.06 -1.01 11.46 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.01 -90.34 + 14 0.06 -1.02 12.39 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.02 -91.36 + 15 0.06 -1.04 13.30 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.04 -92.40 + 16 0.06 -1.05 14.20 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.05 -93.45 + 17 0.06 -1.07 15.08 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.07 -94.52 + 18 0.06 -1.09 15.95 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.09 -95.61 + 19 0.06 -1.11 16.79 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.11 -96.72 + 20 0.06 -1.13 17.60 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.13 -97.85 + 21 0.06 -1.16 18.39 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.16 -99.01 + 22 0.06 -1.18 19.16 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.18 -100.19 + 23 0.06 -1.21 19.90 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.21 -101.40 + 24 0.06 -1.24 20.61 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.24 -102.64 + 25 0.06 -1.27 21.29 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.27 -103.91 + 26 0.06 -1.30 21.94 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.30 -105.20 + 27 0.06 -1.33 22.56 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.33 -106.53 + 28 0.06 -1.36 23.15 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.36 -107.89 + 29 0.06 -1.39 23.71 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.39 -109.28 + 30 0.06 -1.42 24.24 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 1.95 -1.42 -110.71 From c7e89945f3526dfde8631d505f7418be6c3a3dd9 Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Sun, 3 Mar 2024 12:06:43 -0600 Subject: [PATCH 07/36] Updates to allow testing framework to work. Also contains Rich libray code (commented out) --- src/hip_ra/HIP_RA.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/hip_ra/HIP_RA.py b/src/hip_ra/HIP_RA.py index 81600231..abead239 100755 --- a/src/hip_ra/HIP_RA.py +++ b/src/hip_ra/HIP_RA.py @@ -739,6 +739,7 @@ def PrintOutputs(self): # write results to output file and screen # --------------------------------------- try: + nl = '\n' outputfile = 'HIP.out' if len(sys.argv) <= 2 else sys.argv[2] def render_default(p: floatParameter | OutputParameter) -> str: @@ -765,28 +766,34 @@ def render_scientific(p: floatParameter | OutputParameter) -> str: case_data = {'SUMMARY OF RESULTS': summary_of_results} - from rich.console import Console + # from rich.console import Console with open(outputfile, 'w') as f: - console = Console(file=f, style='bold white on blue', force_terminal=True, record=True) + # console = Console(file=f, style='bold white on blue', force_terminal=True, record=True) # with open(outputfile, 'a', encoding='UTF-8') as f: - console.print(' *********************') - console.print(' ***HIP CASE REPORT***') - console.print(' *********************') + # console.print(' *********************') + # console.print(' ***HIP CASE REPORT***') + # console.print(' *********************') # console.print(nl) - console.print(' ***SUMMARY OF RESULTS***') + # console.print(' ***SUMMARY OF RESULTS***') # console.print(nl) + f.write(' *********************\n') + f.write(' ***HIP CASE REPORT***\n') + f.write(' *********************\n') + f.write('\n') + f.write(' ***SUMMARY OF RESULTS***\n') + f.write('\n') for k, v in case_data['SUMMARY OF RESULTS'].items(): # align space between value and units to same column kv_spaces = max(1, (24 - (len(v.split(' ')[0]) + len(k)))) * ' ' - # f.write(f' {k}:{kv_spaces}{v}{nl}') - console.print(f' {k}:{kv_spaces}{v}') + f.write(f' {k}:{kv_spaces}{v}{nl}') + # console.print(f' {k}:{kv_spaces}{v}') - console.save_html(outputfile.replace('.txt', 'html')) + # console.save_html(outputfile.replace('.txt', 'html')) except BaseException as ex: tb = sys.exc_info()[2] print(str(ex)) From e91a3c0ca744645de3e76963fb4d1e4a55e8932e Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Sun, 3 Mar 2024 12:08:26 -0600 Subject: [PATCH 08/36] updated test for higher temperature limit for UtilEff. Was 373.xxx, now 600. --- tests/test_geophires_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_geophires_utils.py b/tests/test_geophires_utils.py index dc5fd839..62e59a62 100644 --- a/tests/test_geophires_utils.py +++ b/tests/test_geophires_utils.py @@ -173,8 +173,8 @@ def test_less_than_lower_bound_temperature(self): UtilEff_func(temperature) def test_greater_than_upper_bound_temperature(self): - """Raises a ValueError if the input temperature is greater than the upper bound of the range (373.946 degrees C).""" - temperature = 400.0 + """Raises a ValueError if the input temperature is greater than the upper bound of the range (600 degrees C).""" + temperature = 650.0 with self.assertRaises(ValueError): UtilEff_func(temperature) From c0c98ee7b47c502b70e603dec3f58efb9b1f0e6d Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Sun, 3 Mar 2024 12:09:30 -0600 Subject: [PATCH 09/36] updates that allow testing famework to work with sys.argv containing specific output file --- src/geophires_x/AGSOutputs.py | 2 ++ src/geophires_x/Outputs.py | 2 ++ src/geophires_x/OutputsAddOns.py | 2 ++ src/geophires_x/OutputsCCUS.py | 2 ++ src/geophires_x/OutputsS_DAC_GT.py | 2 ++ src/geophires_x/SUTRAOutputs.py | 2 ++ 6 files changed, 12 insertions(+) diff --git a/src/geophires_x/AGSOutputs.py b/src/geophires_x/AGSOutputs.py index 87edbd7a..7b0a7f1d 100644 --- a/src/geophires_x/AGSOutputs.py +++ b/src/geophires_x/AGSOutputs.py @@ -75,6 +75,8 @@ def PrintOutputs(self, model: Model): if not model.economics.econmodel.value == EconomicModel.CLGS: super().PrintOutputs(model) else: + if len(sys.argv) > 2: + self.output_file = sys.argv[2] with open(self.output_file, 'w', encoding='UTF-8') as f: f.write(' *****************\n') f.write(' ***CASE REPORT***\n') diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 943cdc9c..a71758e2 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -102,6 +102,8 @@ def PrintOutputs(self, model: Model): # write results to output file and screen try: + if len(sys.argv) > 2: + self.output_file = sys.argv[2] with (open(self.output_file, 'w', encoding='UTF-8') as f): f.write(' *****************\n') f.write(' ***CASE REPORT***\n') diff --git a/src/geophires_x/OutputsAddOns.py b/src/geophires_x/OutputsAddOns.py index d00df6e7..a28cd5a7 100644 --- a/src/geophires_x/OutputsAddOns.py +++ b/src/geophires_x/OutputsAddOns.py @@ -22,6 +22,8 @@ def PrintOutputs(self, model): # now do AddOn output, which will append to the original output # write results to output file and screen try: + if len(sys.argv) > 2: + self.output_file = sys.argv[2] with open(self.output_file, 'a', encoding='UTF-8') as f: f.write(NL) f.write(NL) diff --git a/src/geophires_x/OutputsCCUS.py b/src/geophires_x/OutputsCCUS.py index 0cb2cd00..ac7b353b 100644 --- a/src/geophires_x/OutputsCCUS.py +++ b/src/geophires_x/OutputsCCUS.py @@ -24,6 +24,8 @@ def PrintOutputs(self, model): # now do CCUS output, which will append to the original output # write results to output file and screen try: + if len(sys.argv) > 2: + self.output_file = sys.argv[2] with open(self.output_file, 'a', encoding='UTF-8') as f: f.write(NL) f.write(NL) diff --git a/src/geophires_x/OutputsS_DAC_GT.py b/src/geophires_x/OutputsS_DAC_GT.py index a619770e..c6f5e088 100644 --- a/src/geophires_x/OutputsS_DAC_GT.py +++ b/src/geophires_x/OutputsS_DAC_GT.py @@ -20,6 +20,8 @@ def PrintOutputs(self, model): # now do S_DAC_GT output, which will append to the original output # write results to output file and screen try: + if len(sys.argv) > 2: + self.output_file = sys.argv[2] with open(self.output_file, 'a', encoding='UTF-8') as f: f.write(NL) f.write(NL) diff --git a/src/geophires_x/SUTRAOutputs.py b/src/geophires_x/SUTRAOutputs.py index b1b77056..85b6a0fe 100644 --- a/src/geophires_x/SUTRAOutputs.py +++ b/src/geophires_x/SUTRAOutputs.py @@ -109,6 +109,8 @@ def PrintOutputs(self, model: Model): # write results to output file and screen try: + if len(sys.argv) > 2: + self.output_file = sys.argv[2] with open(self.output_file,'w', encoding='UTF-8') as f: f.write(' *****************\n') f.write(' ***CASE REPORT***\n') From af3a6f8bc079104d7e54896bbdbd0579671a0601 Mon Sep 17 00:00:00 2001 From: Malcolm Ross Date: Sun, 3 Mar 2024 14:03:49 -0600 Subject: [PATCH 10/36] fixed python 3.8 syntax error --- src/geophires_x/Outputs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index a71758e2..e205afdc 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -104,7 +104,7 @@ def PrintOutputs(self, model: Model): try: if len(sys.argv) > 2: self.output_file = sys.argv[2] - with (open(self.output_file, 'w', encoding='UTF-8') as f): + with open(self.output_file, 'w', encoding='UTF-8') as f: f.write(' *****************\n') f.write(' ***CASE REPORT***\n') f.write(' *****************\n') From 468998fdb5e35a68f0dcbdc36460cb5704d4cfc9 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 07:02:17 -0800 Subject: [PATCH 11/36] Update example11_AC IRR output format --- tests/examples/example11_AC.out | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/examples/example11_AC.out b/tests/examples/example11_AC.out index 7bc5318c..4aab9067 100644 --- a/tests/examples/example11_AC.out +++ b/tests/examples/example11_AC.out @@ -31,7 +31,7 @@ Simulation Metadata Project lifetime: 30 yr Capacity factor: 90.0 % Project NPV: 0.01 MUSD - Project IRR: 0.06 % + Project IRR: 6.25 % Project VIR=PI=PIR: 1.00 Project MOIC: 0.75 Project Payback Period: 14.10 yr From fc03c4d4fffb5ff86c206b411d0a5863e9ee0325 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 07:16:35 -0800 Subject: [PATCH 12/36] Undo backwards-incompatible '(LCOE)' suffix to 'Electricity breakeven price' --- src/geophires_x/Outputs.py | 4 ++-- tests/examples/S-DAC-GT.out | 2 +- .../Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out | 2 +- tests/examples/example1.out | 2 +- tests/examples/example13.out | 2 +- tests/examples/example1_addons.out | 2 +- tests/examples/example3.out | 2 +- tests/examples/example4.out | 2 +- tests/examples/example9.out | 2 +- tests/examples/example_SHR-1.out | 2 +- tests/examples/example_multiple_gradients.out | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index e205afdc..4d822eed 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -134,7 +134,7 @@ def PrintOutputs(self, model: Model): f.write(f" Average Cooling Production: {np.average(model.surfaceplant.cooling_produced.value):10.2f} " + model.surfaceplant.cooling_produced.CurrentUnits.value + NL) if model.surfaceplant.enduse_option.value in [EndUseOptions.ELECTRICITY]: - f.write(f" Electricity breakeven price (LCOE): {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) + f.write(f" Electricity breakeven price: {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) elif model.surfaceplant.enduse_option.value in [EndUseOptions.HEAT] and \ model.surfaceplant.plant_type.value not in [PlantType.ABSORPTION_CHILLER]: f.write(f" Direct-Use heat breakeven price (LCOH): {model.economics.LCOH.value:10.2f} " + model.economics.LCOH.CurrentUnits.value + NL) @@ -146,7 +146,7 @@ def PrintOutputs(self, model: Model): EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_ELECTRICITY, EndUseOptions.COGENERATION_PARALLEL_EXTRA_ELECTRICITY]: - f.write(f" Electricity breakeven price (LCOE): {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) + f.write(f" Electricity breakeven price: {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) f.write(f" Direct-Use heat breakeven price (LCOH): {model.economics.LCOH.value:10.2f} " + model.economics.LCOH.CurrentUnits.value + NL) f.write(f" Number of production wells: {model.wellbores.nprod.value:10.0f}"+NL) diff --git a/tests/examples/S-DAC-GT.out b/tests/examples/S-DAC-GT.out index cae0b130..6c9a716f 100644 --- a/tests/examples/S-DAC-GT.out +++ b/tests/examples/S-DAC-GT.out @@ -15,7 +15,7 @@ Simulation Metadata End-Use Option: Cogeneration Topping Cycle, Heat sales considered as extra income Average Net Electricity Production: 19.75 MW Average Direct-Use Heat Production: 12.94 MW - Electricity breakeven price (LCOE): 6.38 cents/kWh + Electricity breakeven price: 6.38 cents/kWh Direct-Use heat breakeven price (LCOH): 2.34 USD/MMBTU Number of production wells: 3 Number of injection wells: 3 diff --git a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out index c4c7c6b6..1ac86349 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 1.10 MW - Electricity breakeven price (LCOE): 44.08 cents/kWh + Electricity breakeven price: 44.08 cents/kWh Number of production wells: 1 Number of injection wells: 0 Flowrate per production well: 110.0 kg/sec diff --git a/tests/examples/example1.out b/tests/examples/example1.out index 4ff98ee1..32737aec 100644 --- a/tests/examples/example1.out +++ b/tests/examples/example1.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 1.21 MW - Electricity breakeven price (LCOE): 43.69 cents/kWh + Electricity breakeven price: 43.69 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec diff --git a/tests/examples/example13.out b/tests/examples/example13.out index 664671c7..199cdf20 100644 --- a/tests/examples/example13.out +++ b/tests/examples/example13.out @@ -15,7 +15,7 @@ Simulation Metadata End-Use Option: Cogeneration Bottoming Cycle, Electricity sales considered as extra income Average Net Electricity Production: -1.87 MW Average Direct-Use Heat Production: 15.20 MW - Electricity breakeven price (LCOE): -31.38 cents/kWh + Electricity breakeven price: -31.38 cents/kWh Direct-Use heat breakeven price (LCOH): 14.00 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 diff --git a/tests/examples/example1_addons.out b/tests/examples/example1_addons.out index d531b4ec..2c792b9c 100644 --- a/tests/examples/example1_addons.out +++ b/tests/examples/example1_addons.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 1.21 MW - Electricity breakeven price (LCOE): 8.70 cents/kWh + Electricity breakeven price: 8.70 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec diff --git a/tests/examples/example3.out b/tests/examples/example3.out index 52a99de5..005cd23c 100644 --- a/tests/examples/example3.out +++ b/tests/examples/example3.out @@ -15,7 +15,7 @@ Simulation Metadata End-Use Option: Cogeneration Topping Cycle, Heat sales considered as extra income Average Net Electricity Production: 19.66 MW Average Direct-Use Heat Production: 10.52 MW - Electricity breakeven price (LCOE): 6.38 cents/kWh + Electricity breakeven price: 6.38 cents/kWh Direct-Use heat breakeven price (LCOH): 2.36 USD/MMBTU Number of production wells: 3 Number of injection wells: 3 diff --git a/tests/examples/example4.out b/tests/examples/example4.out index dd691f87..51dcb74c 100644 --- a/tests/examples/example4.out +++ b/tests/examples/example4.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: -0.57 MW - Electricity breakeven price (LCOE): -244.32 cents/kWh + Electricity breakeven price: -244.32 cents/kWh Number of production wells: 3 Number of injection wells: 2 Flowrate per production well: 110.0 kg/sec diff --git a/tests/examples/example9.out b/tests/examples/example9.out index 8ef441fa..de52f0ca 100644 --- a/tests/examples/example9.out +++ b/tests/examples/example9.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 0.47 MW - Electricity breakeven price (LCOE): 50.18 cents/kWh + Electricity breakeven price: 50.18 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 40.0 kg/sec diff --git a/tests/examples/example_SHR-1.out b/tests/examples/example_SHR-1.out index cfa830ab..c27fd02d 100644 --- a/tests/examples/example_SHR-1.out +++ b/tests/examples/example_SHR-1.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 30.58 MW - Electricity breakeven price (LCOE): 5.89 cents/kWh + Electricity breakeven price: 5.89 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec diff --git a/tests/examples/example_multiple_gradients.out b/tests/examples/example_multiple_gradients.out index 995f2508..0455984b 100644 --- a/tests/examples/example_multiple_gradients.out +++ b/tests/examples/example_multiple_gradients.out @@ -14,7 +14,7 @@ Simulation Metadata End-Use Option: Electricity Average Net Electricity Production: 1.90 MW - Electricity breakeven price (LCOE): 39.29 cents/kWh + Electricity breakeven price: 39.29 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 60.0 kg/sec From c2d00cece403d14ead43a997eae71e6a756b031a Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 07:19:36 -0800 Subject: [PATCH 13/36] Remove obsolete FIXME in MC --- src/geophires_monte_carlo/MC_GeoPHIRES3.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/geophires_monte_carlo/MC_GeoPHIRES3.py b/src/geophires_monte_carlo/MC_GeoPHIRES3.py index a1f9b25a..fa43d301 100755 --- a/src/geophires_monte_carlo/MC_GeoPHIRES3.py +++ b/src/geophires_monte_carlo/MC_GeoPHIRES3.py @@ -131,7 +131,6 @@ def work_package(pass_list: list): ) shutil.copyfile(result.output_file_path, tmp_output_file) elif args.Code_File.endswith('HIP_RA_x.py'): - # FIXME verify client manipulation of sys.argv is threadsafe hip_ra_x_client: HipRaXClient = HipRaXClient() result: HipRaResult = hip_ra_x_client.get_hip_ra_result( HipRaInputParameters(from_file_path=Path(tmp_input_file)) @@ -418,7 +417,6 @@ def main(command_line_args=None): json_output_file.write(json.dumps(outputs_result)) logger.info(f'Wrote JSON results to {json_output_file.name}') - logger.info(f'Complete {__name__!s}: {sys._getframe().f_code.co_name}') From ec6edb18fa3c5a83cf262f477569eb22c3b354e2 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 07:28:19 -0800 Subject: [PATCH 14/36] Revert erroneous rollback of output file arg centralization --- src/geophires_x/AGSOutputs.py | 2 -- src/geophires_x/Model.py | 27 ++++++++++++++++++--------- src/geophires_x/Outputs.py | 2 -- src/geophires_x/OutputsAddOns.py | 2 -- src/geophires_x/OutputsCCUS.py | 2 -- src/geophires_x/OutputsS_DAC_GT.py | 2 -- src/geophires_x/SUTRAOutputs.py | 2 -- 7 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/geophires_x/AGSOutputs.py b/src/geophires_x/AGSOutputs.py index 7b0a7f1d..87edbd7a 100644 --- a/src/geophires_x/AGSOutputs.py +++ b/src/geophires_x/AGSOutputs.py @@ -75,8 +75,6 @@ def PrintOutputs(self, model: Model): if not model.economics.econmodel.value == EconomicModel.CLGS: super().PrintOutputs(model) else: - if len(sys.argv) > 2: - self.output_file = sys.argv[2] with open(self.output_file, 'w', encoding='UTF-8') as f: f.write(' *****************\n') f.write(' ***CASE REPORT***\n') diff --git a/src/geophires_x/Model.py b/src/geophires_x/Model.py index d24f79ba..4852e1d0 100644 --- a/src/geophires_x/Model.py +++ b/src/geophires_x/Model.py @@ -1,3 +1,4 @@ +import sys from pathlib import Path import logging import time @@ -44,17 +45,17 @@ class Model(object): Model is the container class of the application, giving access to everything else, including the logger """ - def __init__(self, enable_geophires_logging_config=True): + def __init__(self, enable_geophires_logging_config=True, input_file=None): """ The __init__ function is called automatically every time the class is being used to create a new object. :return: Nothing """ # get logging started - self.logger = logging.getLogger('root') + self.logger = logging.getLogger('root') # TODO should be getting __name__ logger instead of root if enable_geophires_logging_config: - logging.config.fileConfig(Path(Path(__file__).parent,'logging.conf')) + logging.config.fileConfig(Path(Path(__file__).parent, 'logging.conf')) self.logger.setLevel(logging.INFO) self.logger.info(f'Init {__class__}: {__name__}') @@ -68,7 +69,10 @@ def __init__(self, enable_geophires_logging_config=True): # we do this as soon as possible because what we instantiate may depend on settings in this file self.InputParameters = {} - read_input_file(self.InputParameters, logger=self.logger) + if input_file is None and len(sys.argv) > 1: + input_file = sys.argv[1] + + read_input_file(self.InputParameters, logger=self.logger, input_file_name=input_file) self.sdacgtoutputs = None self.sdacgteconomics = None @@ -102,7 +106,12 @@ def __init__(self, enable_geophires_logging_config=True): self.wellbores: WellBores = WellBores(self) self.surfaceplant: SurfacePlant = SurfacePlant(self) self.economics: Economics = Economics(self) - self.outputs: Outputs = Outputs(self) + + output_file = 'HDR.out' + if len(sys.argv) > 2: + output_file = sys.argv[2] + + self.outputs = Outputs(self, output_file=output_file) if 'Reservoir Model' in self.InputParameters: if self.InputParameters['Reservoir Model'].sValue == '7': @@ -110,7 +119,7 @@ def __init__(self, enable_geophires_logging_config=True): self.wellbores: WellBores = SUTRAWellBores(self) self.surfaceplant: SurfacePlantSUTRA = SurfacePlantSUTRA(self) self.economics: SUTRAEconomics = SUTRAEconomics(self) - self.outputs: SUTRAOutputs = SUTRAOutputs(self) + self.outputs: SUTRAOutputs = SUTRAOutputs(self, output_file=output_file) if 'Is AGS' in self.InputParameters: if self.InputParameters['Is AGS'].sValue in ['True', 'true', 'TRUE', 'T', '1']: @@ -123,21 +132,21 @@ def __init__(self, enable_geophires_logging_config=True): self.wellbores: WellBores = AGSWellBores(self) self.surfaceplant: SurfacePlantAGS = SurfacePlantAGS(self) self.economics: AGSEconomics = AGSEconomics(self) - self.outputs: AGSOutputs = AGSOutputs(self) + self.outputs: AGSOutputs = AGSOutputs(self, output_file=output_file) self.wellbores.IsAGS.value = True # if we find out we have an add-ons, we need to instantiate it, then read for the parameters if 'AddOn Nickname 1' in self.InputParameters: self.logger.info("Initiate the Add-on elements") self.addeconomics: EconomicsAddOns = EconomicsAddOns(self) - self.addoutputs: OutputsAddOns = OutputsAddOns(self) + self.addoutputs: OutputsAddOns = OutputsAddOns(self, output_file=output_file) # if we find out we have an S-DAC-GT calculation, we need to instantiate it if 'Do S-DAC-GT Calculations' in self.InputParameters: if self.InputParameters['Do S-DAC-GT Calculations'].sValue in ['On', 'on', 'ON', 'True', 'true', 'TRUE', 'T', 't', '1']: self.logger.info("Initiate the S-DAC-GT elements") self.sdacgteconomics: EconomicsS_DAC_GT = EconomicsS_DAC_GT(self) - self.sdacgtoutputs: OutputsS_DAC_GT = OutputsS_DAC_GT(self) + self.sdacgtoutputs: OutputsS_DAC_GT = OutputsS_DAC_GT(self, output_file=output_file) self.logger.info(f'Complete {__class__}: {__name__}') diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 4d822eed..b84c96e4 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -102,8 +102,6 @@ def PrintOutputs(self, model: Model): # write results to output file and screen try: - if len(sys.argv) > 2: - self.output_file = sys.argv[2] with open(self.output_file, 'w', encoding='UTF-8') as f: f.write(' *****************\n') f.write(' ***CASE REPORT***\n') diff --git a/src/geophires_x/OutputsAddOns.py b/src/geophires_x/OutputsAddOns.py index a28cd5a7..d00df6e7 100644 --- a/src/geophires_x/OutputsAddOns.py +++ b/src/geophires_x/OutputsAddOns.py @@ -22,8 +22,6 @@ def PrintOutputs(self, model): # now do AddOn output, which will append to the original output # write results to output file and screen try: - if len(sys.argv) > 2: - self.output_file = sys.argv[2] with open(self.output_file, 'a', encoding='UTF-8') as f: f.write(NL) f.write(NL) diff --git a/src/geophires_x/OutputsCCUS.py b/src/geophires_x/OutputsCCUS.py index ac7b353b..0cb2cd00 100644 --- a/src/geophires_x/OutputsCCUS.py +++ b/src/geophires_x/OutputsCCUS.py @@ -24,8 +24,6 @@ def PrintOutputs(self, model): # now do CCUS output, which will append to the original output # write results to output file and screen try: - if len(sys.argv) > 2: - self.output_file = sys.argv[2] with open(self.output_file, 'a', encoding='UTF-8') as f: f.write(NL) f.write(NL) diff --git a/src/geophires_x/OutputsS_DAC_GT.py b/src/geophires_x/OutputsS_DAC_GT.py index c6f5e088..a619770e 100644 --- a/src/geophires_x/OutputsS_DAC_GT.py +++ b/src/geophires_x/OutputsS_DAC_GT.py @@ -20,8 +20,6 @@ def PrintOutputs(self, model): # now do S_DAC_GT output, which will append to the original output # write results to output file and screen try: - if len(sys.argv) > 2: - self.output_file = sys.argv[2] with open(self.output_file, 'a', encoding='UTF-8') as f: f.write(NL) f.write(NL) diff --git a/src/geophires_x/SUTRAOutputs.py b/src/geophires_x/SUTRAOutputs.py index 85b6a0fe..b1b77056 100644 --- a/src/geophires_x/SUTRAOutputs.py +++ b/src/geophires_x/SUTRAOutputs.py @@ -109,8 +109,6 @@ def PrintOutputs(self, model: Model): # write results to output file and screen try: - if len(sys.argv) > 2: - self.output_file = sys.argv[2] with open(self.output_file,'w', encoding='UTF-8') as f: f.write(' *****************\n') f.write(' ***CASE REPORT***\n') From 57ace7da28886894f62e16b01007c46567c13aa9 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 07:59:33 -0800 Subject: [PATCH 15/36] WIP - extract revenue & cashflow profile --- src/geophires_x/Outputs.py | 6 +- src/geophires_x_client/geophires_x_result.py | 44 +++- tests/example1_addons.csv | 234 +------------------ tests/examples/example1_addons.out | 16 +- tests/test_geophires_x_client.py | 11 + 5 files changed, 69 insertions(+), 242 deletions(-) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index b84c96e4..884d3b76 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -609,9 +609,9 @@ def PrintOutputs(self, model: Model): #if model.surfaceplant.enduse_option.value == EndUseOptions.HEAT and model.surfaceplant.plant_type.value == PlantType.ABSORPTION_CHILLER: f.write(NL) f.write(NL) - f.write(" *******************************" + NL) - f.write(" * REVENUE & CASHFLOW PROFILE *" + NL) - f.write(" *******************************" + NL) + f.write(' ********************************\n') + f.write(' * REVENUE & CASHFLOW PROFILE *\n') + f.write(' ********************************\n') f.write( "Year Electricity | Heat | Cooling | Carbon | Project" + NL) f.write( diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index 0b7bec6e..b5e83afc 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -315,6 +315,10 @@ def __init__(self, output_file_path, logger_name='root'): if eep is not None: self.result['EXTENDED ECONOMIC PROFILE'] = eep + revenue_and_cashflow_profile = self._get_revenue_and_cashflow_profile() + if revenue_and_cashflow_profile is not None: + self.result['REVENUE & CASHFLOW PROFILE'] = revenue_and_cashflow_profile + ccus_profile = self._get_ccus_profile() if ccus_profile is not None: self.result['CCUS PROFILE'] = ccus_profile @@ -467,6 +471,39 @@ def _get_heat_electricity_extraction_generation_profile(self): profile_lines = self._get_profile_lines('HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE') return self._get_data_from_profile_lines(profile_lines) + def _get_revenue_and_cashflow_profile(self): + def extract_table_header(lines: list) -> list: + # Tried various regexy approaches to extract this programmatically but landed on hard-coding. + return [ + 'Year Since Start', + 'Electricity Price (cents/kWh)', + 'Electricity Ann. Rev. (MUSD/yr)', + 'Electricity Cumm. Rev. (MUSD)', + 'Heat Price (cents/kWh)', + 'Heat Ann. Rev. (MUSD/yr)', + 'Heat Cumm. Rev. (MUSD)', + 'Cooling Price (cents/kWh)', + 'Cooling Ann. Rev. (MUSD/yr)', + 'Cooling Cumm. Rev. (MUSD)', + 'Carbon Price (USD/tonne)', + 'Carbon Ann. Rev. (MUSD/yr)', + 'Carbon Cumm. Rev. (MUSD)', + 'Project OPEX (MUSD/yr)', + 'Project Net Rev. (MUSD/yr)', + 'Project Net Cashflow (MUSD)', + ] + + try: + lines = self._get_profile_lines('REVENUE & CASHFLOW PROFILE') + profile = [extract_table_header(lines)] + if re.fullmatch('^_+$', lines[5]) is not None: + del lines[5] + profile.extend(self._extract_addons_style_table_data(lines)) + return profile + except BaseException as e: + self._logger.debug(f'Failed to get revenue & cashflow profile: {e}') + return None + def _get_extended_economic_profile(self): def extract_table_header(lines: list) -> list: # Tried various regexy approaches to extract this programmatically but landed on hard-coding. @@ -513,13 +550,16 @@ def extract_table_header(lines: list) -> list: return profile except BaseException as e: self._logger.debug(f'Failed to get CCUS profile: {e}') - return None + + # raise NotImplementedError('FIXME WIP - transform from REVENUE & CASHFLOW') + self._logger.error('WIP - CCUS profile not implemented yet') + # return None def _extract_addons_style_table_data(self, lines: list): """TODO consolidate with _get_data_from_profile_lines""" # Skip the lines up to the header and split the rest using whitespaces - lines_splitted = [line.split() for line in lines[5:]] + lines_splitted = [line.replace('|', '').split() for line in lines[5:]] # The number of columns is determined by the line with the most elements num_of_columns = max(len(line) for line in lines_splitted) diff --git a/tests/example1_addons.csv b/tests/example1_addons.csv index 78832297..f1d155d1 100644 --- a/tests/example1_addons.csv +++ b/tests/example1_addons.csv @@ -1,7 +1,7 @@ Category,Field,Year,Value,Units SUMMARY OF RESULTS,End-Use Option,,Electricity, SUMMARY OF RESULTS,Average Net Electricity Production,,1.21,MW -SUMMARY OF RESULTS,Electricity breakeven price,,8.72,cents/kWh +SUMMARY OF RESULTS,Electricity breakeven price,,8.7,cents/kWh SUMMARY OF RESULTS,Number of production wells,,2,count SUMMARY OF RESULTS,Number of injection wells,,2,count SUMMARY OF RESULTS,Flowrate per production well,,55.0,kg/sec @@ -10,12 +10,12 @@ ECONOMIC PARAMETERS,Economic Model,,Fixed Charge Rate (FCR), ECONOMIC PARAMETERS,Accrued financing during construction,,0.0, ECONOMIC PARAMETERS,Project lifetime,,30,yr ECONOMIC PARAMETERS,Capacity factor,,90.0,% -ECONOMIC PARAMETERS,Project NPV,,-6.29,MUSD -ECONOMIC PARAMETERS,Project IRR,,4.48,% +ECONOMIC PARAMETERS,Project NPV,,-6.25,MUSD +ECONOMIC PARAMETERS,Project IRR,,4.49,% ECONOMIC PARAMETERS,Project VIR=PI=PIR,,0.81, -ECONOMIC PARAMETERS,Project MOIC,,3.47, +ECONOMIC PARAMETERS,Project MOIC,,3.48, ECONOMIC PARAMETERS,Fixed Charge Rate (FCR),,5.0, -EXTENDED ECONOMICS,"Adjusted Project LCOE (after incentives\, grants\, AddOns\,etc)",,8.72,cents/kWh +EXTENDED ECONOMICS,"Adjusted Project LCOE (after incentives\, grants\, AddOns\,etc)",,8.7,cents/kWh EXTENDED ECONOMICS,"Adjusted Project LCOH (after incentives\, grants\, AddOns\,etc)",,0.0,USD/MMBTU EXTENDED ECONOMICS,"Adjusted Project CAPEX (after incentives\, grants\, AddOns\, etc)",,102.63,MUSD EXTENDED ECONOMICS,"Adjusted Project OPEX (after incentives\, grants\, AddOns\, etc)",,0.9,MUSD @@ -23,19 +23,12 @@ EXTENDED ECONOMICS,Project NPV (including AddOns),,-60.98,MUSD EXTENDED ECONOMICS,Project IRR (including AddOns),,-0.0,% EXTENDED ECONOMICS,Project VIR=PI=PIR (including AddOns),,0.41, EXTENDED ECONOMICS,Project MOIC (including AddOns),,-0.05, -EXTENDED ECONOMICS,Project Payback Period (including AddOns),,0.0,yr EXTENDED ECONOMICS,Total Add-on CAPEX,,70.0,MUSD EXTENDED ECONOMICS,Total Add-on OPEX,,1.7,MUSD/yr EXTENDED ECONOMICS,Total Add-on Net Elec,,25900.0,kW/yr EXTENDED ECONOMICS,Total Add-on Net Heat,,0.0,kW/yr EXTENDED ECONOMICS,Total Add-on Profit,,2.84,MUSD/yr EXTENDED ECONOMICS,AddOns Payback Period,,0.0,yr -CCUS ECONOMICS,Total Avoided Carbon Production,,234780313.03,pound -CCUS ECONOMICS,Project NPV (including carbon credit),,-0.41,MUSD -CCUS ECONOMICS,Project IRR (including carbon credit),,0.06,% -CCUS ECONOMICS,Project VIR=IR=PIR (including carbon credit),,0.99, -CCUS ECONOMICS,Project MOIC (including carbon credit),,5.47, -CCUS ECONOMICS,Project Payback Period (including carbon credit),,15.53,yr ENGINEERING PARAMETERS,Number of Production Wells,,2,count ENGINEERING PARAMETERS,Number of Injection Wells,,2,count ENGINEERING PARAMETERS,"Well depth (or total length\, if not vertical)",,3.0,kilometer @@ -640,220 +633,3 @@ EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,27,-19.32,MUSD EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,28,-15.91,MUSD EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,29,-12.5,MUSD EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,30,-9.09,MUSD -CCUS PROFILE,Carbon Avoided,1,,pound -CCUS PROFILE,Carbon Avoided,2,7101870.358,pound -CCUS PROFILE,Carbon Avoided,3,7470391.043,pound -CCUS PROFILE,Carbon Avoided,4,7595168.229,pound -CCUS PROFILE,Carbon Avoided,5,7669074.1,pound -CCUS PROFILE,Carbon Avoided,6,7720883.286,pound -CCUS PROFILE,Carbon Avoided,7,7760409.892,pound -CCUS PROFILE,Carbon Avoided,8,7792164.418,pound -CCUS PROFILE,Carbon Avoided,9,7818583.043,pound -CCUS PROFILE,Carbon Avoided,10,7841125.517,pound -CCUS PROFILE,Carbon Avoided,11,7860732.801,pound -CCUS PROFILE,Carbon Avoided,12,7878045.387,pound -CCUS PROFILE,Carbon Avoided,13,7893518.049,pound -CCUS PROFILE,Carbon Avoided,14,7907484.797,pound -CCUS PROFILE,Carbon Avoided,15,7920197.818,pound -CCUS PROFILE,Carbon Avoided,16,7931851.962,pound -CCUS PROFILE,Carbon Avoided,17,7942600.746,pound -CCUS PROFILE,Carbon Avoided,18,7952567.147,pound -CCUS PROFILE,Carbon Avoided,19,7961851.088,pound -CCUS PROFILE,Carbon Avoided,20,7970534.743,pound -CCUS PROFILE,Carbon Avoided,21,7978686.355,pound -CCUS PROFILE,Carbon Avoided,22,7986363.027,pound -CCUS PROFILE,Carbon Avoided,23,7993612.777,pound -CCUS PROFILE,Carbon Avoided,24,8000476.061,pound -CCUS PROFILE,Carbon Avoided,25,8006986.902,pound -CCUS PROFILE,Carbon Avoided,26,8013173.735,pound -CCUS PROFILE,Carbon Avoided,27,8019060.033,pound -CCUS PROFILE,Carbon Avoided,28,8024664.782,pound -CCUS PROFILE,Carbon Avoided,29,8030002.83,pound -CCUS PROFILE,Carbon Avoided,30,8035085.158,pound -CCUS PROFILE,Carbon Avoided,31,6703146.945,pound -CCUS PROFILE,CCUS Price,1,,USD/lb -CCUS PROFILE,CCUS Price,2,0.015,USD/lb -CCUS PROFILE,CCUS Price,3,0.015,USD/lb -CCUS PROFILE,CCUS Price,4,0.015,USD/lb -CCUS PROFILE,CCUS Price,5,0.015,USD/lb -CCUS PROFILE,CCUS Price,6,0.015,USD/lb -CCUS PROFILE,CCUS Price,7,0.015,USD/lb -CCUS PROFILE,CCUS Price,8,0.025,USD/lb -CCUS PROFILE,CCUS Price,9,0.035,USD/lb -CCUS PROFILE,CCUS Price,10,0.045,USD/lb -CCUS PROFILE,CCUS Price,11,0.055,USD/lb -CCUS PROFILE,CCUS Price,12,0.065,USD/lb -CCUS PROFILE,CCUS Price,13,0.075,USD/lb -CCUS PROFILE,CCUS Price,14,0.085,USD/lb -CCUS PROFILE,CCUS Price,15,0.095,USD/lb -CCUS PROFILE,CCUS Price,16,0.1,USD/lb -CCUS PROFILE,CCUS Price,17,0.1,USD/lb -CCUS PROFILE,CCUS Price,18,0.1,USD/lb -CCUS PROFILE,CCUS Price,19,0.1,USD/lb -CCUS PROFILE,CCUS Price,20,0.1,USD/lb -CCUS PROFILE,CCUS Price,21,0.1,USD/lb -CCUS PROFILE,CCUS Price,22,0.1,USD/lb -CCUS PROFILE,CCUS Price,23,0.1,USD/lb -CCUS PROFILE,CCUS Price,24,0.1,USD/lb -CCUS PROFILE,CCUS Price,25,0.1,USD/lb -CCUS PROFILE,CCUS Price,26,0.1,USD/lb -CCUS PROFILE,CCUS Price,27,0.1,USD/lb -CCUS PROFILE,CCUS Price,28,0.1,USD/lb -CCUS PROFILE,CCUS Price,29,0.1,USD/lb -CCUS PROFILE,CCUS Price,30,0.1,USD/lb -CCUS PROFILE,CCUS Price,31,0.1,USD/lb -CCUS PROFILE,CCUS Revenue,1,,MUSD/yr -CCUS PROFILE,CCUS Revenue,2,0.11,MUSD/yr -CCUS PROFILE,CCUS Revenue,3,0.11,MUSD/yr -CCUS PROFILE,CCUS Revenue,4,0.11,MUSD/yr -CCUS PROFILE,CCUS Revenue,5,0.12,MUSD/yr -CCUS PROFILE,CCUS Revenue,6,0.12,MUSD/yr -CCUS PROFILE,CCUS Revenue,7,0.12,MUSD/yr -CCUS PROFILE,CCUS Revenue,8,0.19,MUSD/yr -CCUS PROFILE,CCUS Revenue,9,0.27,MUSD/yr -CCUS PROFILE,CCUS Revenue,10,0.35,MUSD/yr -CCUS PROFILE,CCUS Revenue,11,0.43,MUSD/yr -CCUS PROFILE,CCUS Revenue,12,0.51,MUSD/yr -CCUS PROFILE,CCUS Revenue,13,0.59,MUSD/yr -CCUS PROFILE,CCUS Revenue,14,0.67,MUSD/yr -CCUS PROFILE,CCUS Revenue,15,0.75,MUSD/yr -CCUS PROFILE,CCUS Revenue,16,0.79,MUSD/yr -CCUS PROFILE,CCUS Revenue,17,0.79,MUSD/yr -CCUS PROFILE,CCUS Revenue,18,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,19,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,20,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,21,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,22,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,23,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,24,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,25,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,26,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,27,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,28,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,29,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,30,0.8,MUSD/yr -CCUS PROFILE,CCUS Revenue,31,0.67,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,1,,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,2,0.11,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,3,0.11,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,4,0.11,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,5,0.12,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,6,0.12,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,7,0.12,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,8,0.19,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,9,0.27,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,10,0.35,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,11,0.43,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,12,0.51,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,13,0.59,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,14,0.67,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,15,0.75,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,16,0.79,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,17,0.79,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,18,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,19,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,20,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,21,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,22,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,23,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,24,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,25,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,26,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,27,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,28,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,29,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,30,0.8,MUSD/yr -CCUS PROFILE,CCUS Annual Cash Flow,31,0.67,MUSD/yr -CCUS PROFILE,CCUS Cumm. Cash Flow,1,,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,2,0.11,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,3,0.22,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,4,0.33,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,5,0.45,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,6,0.56,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,7,0.68,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,8,0.87,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,9,1.15,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,10,1.5,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,11,1.93,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,12,2.45,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,13,3.04,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,14,3.71,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,15,4.46,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,16,5.26,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,17,6.05,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,18,6.84,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,19,7.64,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,20,8.44,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,21,9.24,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,22,10.03,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,23,10.83,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,24,11.63,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,25,12.43,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,26,13.24,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,27,14.04,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,28,14.84,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,29,15.64,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,30,16.45,MUSD -CCUS PROFILE,CCUS Cumm. Cash Flow,31,17.12,MUSD -CCUS PROFILE,Project Annual Cash Flow,1,-32.63,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,2,1.69,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,3,1.73,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,4,1.75,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,5,1.76,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,6,1.76,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,7,1.77,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,8,1.97,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,9,2.16,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,10,2.36,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,11,2.56,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,12,2.75,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,13,2.84,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,14,2.92,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,15,3.0,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,16,3.05,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,17,3.05,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,18,3.05,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,19,3.05,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,20,3.06,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,21,3.06,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,22,3.06,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,23,3.06,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,24,3.06,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,25,3.07,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,26,3.07,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,27,3.07,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,28,3.07,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,29,3.07,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,30,3.07,MUSD/yr -CCUS PROFILE,Project Annual Cash Flow,31,2.7,MUSD/yr -CCUS PROFILE,Project Cumm. Cash Flow,1,-32.63,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,2,-30.95,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,3,-29.21,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,4,-27.46,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,5,-25.71,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,6,-23.94,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,7,-22.17,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,8,-20.21,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,9,-18.04,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,10,-15.69,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,11,-13.13,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,12,-10.37,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,13,-7.54,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,14,-4.62,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,15,-1.61,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,16,1.43,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,17,4.48,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,18,7.53,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,19,10.58,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,20,13.64,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,21,16.7,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,22,19.76,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,23,22.82,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,24,25.89,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,25,28.95,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,26,32.02,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,27,35.09,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,28,38.16,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,29,41.24,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,30,44.31,MUSD -CCUS PROFILE,Project Cumm. Cash Flow,31,47.01,MUSD diff --git a/tests/examples/example1_addons.out b/tests/examples/example1_addons.out index 2c792b9c..e0002741 100644 --- a/tests/examples/example1_addons.out +++ b/tests/examples/example1_addons.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:31 - Calculation Time: 0.616 sec + Simulation Date: 2024-03-04 + Simulation Time: 07:46 + Calculation Time: 0.611 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.21 MW - Electricity breakeven price: 8.70 cents/kWh + Electricity breakeven price: 8.70 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -203,9 +203,9 @@ Simulation Metadata 30 8.2 344.9 279.65 13.69 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/test_geophires_x_client.py b/tests/test_geophires_x_client.py index a4273de4..2386a41f 100644 --- a/tests/test_geophires_x_client.py +++ b/tests/test_geophires_x_client.py @@ -245,6 +245,17 @@ def test_extended_economic_profile(self): eep, ) + def test_revenue_and_cashflow_profile(self): + """ + TODO make this less tedious to update when expected result values change + (https://github.com/NREL/GEOPHIRES-X/issues/107) + """ + + test_result_path = self._get_test_file_path('examples/example1_addons.out') + result = GeophiresXResult(test_result_path) + revenue_and_cashflow_profile = result.result['REVENUE & CASHFLOW PROFILE'] + self.assertIsNotNone(revenue_and_cashflow_profile) # FIXME WIP TODO + def test_ccus_profile(self): """ TODO make this less tedious to update when expected result values change From f7719231f982c6ea2478343df39d0a4f07c5760a Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 08:06:46 -0800 Subject: [PATCH 16/36] FIXME re: transforming CCUS profile from revenue & cashflow --- src/geophires_x_client/geophires_x_result.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index b5e83afc..d3ecfd83 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -530,15 +530,17 @@ def extract_table_header(lines: list) -> list: return None def _get_ccus_profile(self): + """FIXME transform from Revenue & Cashflow profile if not present in output file""" + def extract_table_header(lines: list) -> list: # Tried various regexy approaches to extract this programmatically but landed on hard-coding. return [ 'Year Since Start', 'Carbon Avoided (pound)', - 'CCUS Price (USD/lb)', - 'CCUS Revenue (MUSD/yr)', + 'CCUS Price (USD/lb)', # Carbon Price (USD/tonne) + 'CCUS Revenue (MUSD/yr)', # Carbon Ann. Rev. (MUSD/yr) 'CCUS Annual Cash Flow (MUSD/yr)', - 'CCUS Cumm. Cash Flow (MUSD)', + 'CCUS Cumm. Cash Flow (MUSD)', # Carbon Cumm. Rev. (MUSD) 'Project Annual Cash Flow (MUSD/yr)', 'Project Cumm. Cash Flow (MUSD)', ] From e5d4bd7a5ccc262d2d5c182c83536d56fe0f220c Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 08:41:08 -0800 Subject: [PATCH 17/36] REVENUE & CASHFLOW PROFILE extraction/integration --- src/geophires_x_client/geophires_x_result.py | 1 + tests/example1_addons.csv | 450 ++++++++++++++++++ tests/result_with_ccus_profile.out | 310 ++++++++++++ ...sult_with_revenue_and_cashflow_profile.out | 299 ++++++++++++ tests/test_geophires_x_client.py | 82 +++- 5 files changed, 1127 insertions(+), 15 deletions(-) create mode 100644 tests/result_with_ccus_profile.out create mode 100644 tests/result_with_revenue_and_cashflow_profile.out diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index d3ecfd83..dce5e802 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -370,6 +370,7 @@ def __init__(self, v_u): 'HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE', 'EXTENDED ECONOMIC PROFILE', 'CCUS PROFILE', + 'REVENUE & CASHFLOW PROFILE', ): raise RuntimeError('unexpected category') diff --git a/tests/example1_addons.csv b/tests/example1_addons.csv index f1d155d1..73397da1 100644 --- a/tests/example1_addons.csv +++ b/tests/example1_addons.csv @@ -633,3 +633,453 @@ EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,27,-19.32,MUSD EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,28,-15.91,MUSD EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,29,-12.5,MUSD EXTENDED ECONOMIC PROFILE,Cumm. Project Cash Flow,30,-9.09,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Price,1,0.09,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,2,0.09,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,3,0.09,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,4,0.09,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,5,0.09,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,6,0.09,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,7,0.1,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,8,0.11,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,9,0.13,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,10,0.14,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,11,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,12,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,13,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,14,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,15,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,16,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,17,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,18,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,19,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,20,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,21,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,22,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,23,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,24,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,25,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,26,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,27,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,28,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,29,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Price,30,0.15,cents/kWh +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,1,-32.63,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,2,1.58,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,3,1.62,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,4,1.63,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,5,1.64,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,6,1.65,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,7,1.65,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,8,1.77,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,9,1.89,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,10,2.01,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,11,2.12,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,12,2.24,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,13,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,14,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,15,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,16,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,17,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,18,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,19,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,20,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,21,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,22,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,23,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,24,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,25,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,26,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,27,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,28,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,29,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Ann. Rev.,30,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,1,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,2,0.78,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,3,1.6,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,4,2.43,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,5,3.27,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,6,4.12,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,7,4.97,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,8,5.94,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,9,7.03,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,10,8.24,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,11,9.56,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,12,11.0,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,13,12.44,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,14,13.89,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,15,15.34,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,16,16.79,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,17,18.24,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,18,19.7,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,19,21.15,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,20,22.61,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,21,24.07,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,22,25.53,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,23,26.99,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,24,28.46,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,25,29.92,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,26,31.39,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,27,32.85,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,28,34.32,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,29,35.79,MUSD +REVENUE & CASHFLOW PROFILE,Electricity Cumm. Rev.,30,37.26,MUSD +REVENUE & CASHFLOW PROFILE,Heat Price,1,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,2,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,3,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,4,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,5,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,6,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,7,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,8,0.01,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,9,0.02,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,10,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,11,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,12,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,13,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,14,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,15,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,16,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,17,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,18,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,19,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,20,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,21,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,22,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,23,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,24,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,25,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,26,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,27,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,28,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,29,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Price,30,0.04,cents/kWh +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,1,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,2,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,3,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,4,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,5,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,6,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,7,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,8,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,9,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,10,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,11,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,12,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,13,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,14,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,15,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,16,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,17,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,18,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,19,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,20,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,21,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,22,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,23,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,24,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,25,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,26,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,27,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,28,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,29,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Ann. Rev.,30,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,1,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,2,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,3,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,4,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,5,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,6,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,7,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,8,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,9,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,10,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,11,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,12,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,13,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,14,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,15,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,16,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,17,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,18,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,19,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,20,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,21,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,22,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,23,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,24,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,25,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,26,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,27,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,28,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,29,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Heat Cumm. Rev.,30,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Price,1,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,2,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,3,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,4,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,5,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,6,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,7,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,8,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,9,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,10,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,11,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,12,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,13,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,14,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,15,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,16,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,17,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,18,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,19,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,20,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,21,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,22,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,23,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,24,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,25,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,26,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,27,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,28,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,29,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Price,30,0.03,cents/kWh +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,1,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,2,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,3,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,4,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,5,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,6,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,7,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,8,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,9,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,10,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,11,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,12,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,13,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,14,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,15,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,16,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,17,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,18,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,19,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,20,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,21,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,22,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,23,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,24,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,25,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,26,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,27,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,28,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,29,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Ann. Rev.,30,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,1,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,2,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,3,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,4,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,5,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,6,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,7,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,8,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,9,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,10,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,11,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,12,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,13,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,14,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,15,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,16,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,17,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,18,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,19,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,20,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,21,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,22,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,23,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,24,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,25,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,26,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,27,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,28,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,29,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Cooling Cumm. Rev.,30,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Price,1,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,2,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,3,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,4,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,5,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,6,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,7,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,8,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,9,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,10,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,11,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,12,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,13,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,14,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,15,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,16,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,17,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,18,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,19,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,20,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,21,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,22,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,23,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,24,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,25,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,26,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,27,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,28,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,29,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Price,30,0.0,USD/tonne +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,1,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,2,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,3,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,4,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,5,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,6,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,7,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,8,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,9,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,10,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,11,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,12,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,13,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,14,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,15,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,16,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,17,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,18,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,19,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,20,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,21,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,22,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,23,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,24,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,25,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,26,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,27,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,28,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,29,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Ann. Rev.,30,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,1,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,2,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,3,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,4,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,5,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,6,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,7,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,8,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,9,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,10,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,11,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,12,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,13,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,14,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,15,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,16,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,17,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,18,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,19,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,20,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,21,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,22,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,23,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,24,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,25,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,26,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,27,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,28,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,29,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Carbon Cumm. Rev.,30,0.0,MUSD +REVENUE & CASHFLOW PROFILE,Project OPEX,1,0.0,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,2,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,3,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,4,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,5,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,6,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,7,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,8,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,9,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,10,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,11,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,12,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,13,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,14,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,15,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,16,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,17,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,18,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,19,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,20,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,21,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,22,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,23,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,24,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,25,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,26,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,27,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,28,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,29,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project OPEX,30,-0.8,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,1,-32.63,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,2,1.58,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,3,1.62,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,4,1.63,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,5,1.64,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,6,1.65,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,7,1.65,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,8,1.77,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,9,1.89,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,10,2.01,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,11,2.12,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,12,2.24,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,13,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,14,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,15,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,16,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,17,2.25,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,18,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,19,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,20,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,21,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,22,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,23,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,24,2.26,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,25,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,26,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,27,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,28,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,29,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Rev.,30,2.27,MUSD/yr +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,1,-32.63,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,2,-31.05,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,3,-29.43,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,4,-27.8,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,5,-26.15,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,6,-24.5,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,7,-22.85,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,8,-21.08,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,9,-19.19,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,10,-17.19,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,11,-15.06,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,12,-12.82,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,13,-10.57,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,14,-8.33,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,15,-6.08,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,16,-3.82,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,17,-1.57,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,18,0.69,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,19,2.94,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,20,5.2,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,21,7.46,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,22,9.73,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,23,11.99,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,24,14.25,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,25,16.52,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,26,18.79,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,27,21.06,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,28,23.32,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,29,25.59,MUSD +REVENUE & CASHFLOW PROFILE,Project Net Cashflow,30,27.87,MUSD diff --git a/tests/result_with_ccus_profile.out b/tests/result_with_ccus_profile.out new file mode 100644 index 00000000..5d1d7bb0 --- /dev/null +++ b/tests/result_with_ccus_profile.out @@ -0,0 +1,310 @@ + ***************** + ***CASE REPORT*** + ***************** + +Simulation Metadata +---------------------- + GEOPHIRES Version: 3.4.11 + GEOPHIRES Build Date: 2022-06-30 + Simulation Date: 2024-03-01 + Simulation Time: 12:31 + Calculation Time: 0.616 sec + + ***SUMMARY OF RESULTS*** + + End-Use Option: Electricity + Average Net Electricity Production: 1.21 MW + Electricity breakeven price: 8.72 cents/kWh + Number of production wells: 2 + Number of injection wells: 2 + Flowrate per production well: 55.0 kg/sec + Well depth (or total length, if not vertical): 3.0 kilometer + Geothermal gradient: 0.0500 degC/m + + + ***ECONOMIC PARAMETERS*** + + Economic Model = Fixed Charge Rate (FCR) + Fixed Charge Rate (FCR): 5.00 + Accrued financing during construction: 0.00 + Project lifetime: 30 yr + Capacity factor: 90.0 % + Project NPV: -6.29 MUSD + Project IRR: 4.48 % + Project VIR=PI=PIR: 0.81 + Project MOIC: 3.47 + + ***ENGINEERING PARAMETERS*** + + Number of Production Wells: 2 + Number of Injection Wells: 2 + Well depth (or total length, if not vertical): 3.0 kilometer + Water loss rate: 2.0 + Pump efficiency: 80.0 + Injection temperature: 50.0 degC + Production Wellbore heat transmission calculated with Ramey's model + Average production well temperature drop: 3.0 degC + Flowrate per production well: 55.0 kg/sec + Injection well casing ID: 7.000 in + Production well casing ID: 7.000 in + Number of times redrilling: 0 + Power plant type: Supercritical ORC + + + ***RESOURCE CHARACTERISTICS*** + + Maximum reservoir temperature: 400.0 degC + Number of segments: 1 + Geothermal gradient: 0.0500 degC/m + + + ***RESERVOIR PARAMETERS*** + + Reservoir Model = Multiple Parallel Fractures Model + Bottom-hole temperature: 170.00 degC + Fracture model = Square + Well seperation: fracture height: 900.00 meter + Fracture area: 810000.00 m**2 + Reservoir volume: 1000000000 m**3 + Reservoir hydrostatic pressure: 29430.21 kPa + Plant outlet pressure: 29705.96 kPa + Production wellhead pressure: 29774.91 kPa + Productivity Index: 5.00 kg/sec/bar + Injectivity Index: 5.00 kg/sec/bar + Reservoir density: 2700.00 kg/m**3 + Reservoir thermal conductivity: 2.70 watt/m/kelvin + Reservoir heat capacity: 1000.00 J/kg/kelvin + + + ***RESERVOIR SIMULATION RESULTS*** + + Maximum Production Temperature: 167.2 degC + Average Production Temperature: 167.0 degC + Minimum Production Temperature: 165.2 degC + Initial Production Temperature: 165.2 degC + Average Reservoir Heat Extraction: 52.38 MW + Production Wellbore Heat Transmission Model = Ramey Model + Average Production Well Temperature Drop: 3.0 degC + Average Injection Well Pump Pressure Drop: -28418.9 kPa + Average Production Well Pump Pressure Drop: 29886.2 kPa + + + ***CAPITAL COSTS (M$)*** + + Drilling and completion costs: 21.95 MUSD + Drilling and completion costs per well: 5.49 MUSD + Stimulation costs: 3.02 MUSD + Surface power plant costs: 20.78 MUSD + Field gathering system costs: 3.89 MUSD + Total surface equipment costs: 24.67 MUSD + Exploration costs: 5.33 MUSD + Total capital costs: 32.63 MUSD + Annualized capital costs: 1.63 MUSD + + + ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** + + Wellfield maintenance costs: 0.45 MUSD/yr + Power plant maintenance costs: 0.90 MUSD/yr + Water costs: 0.06 MUSD/yr + Total operating and maintenance costs: -0.80 MUSD/yr + + + ***SURFACE EQUIPMENT SIMULATION RESULTS*** + + Initial geofluid availability: 0.11 MW/(kg/s) + Maximum Total Electricity Generation: 5.61 MW + Average Total Electricity Generation: 5.58 MW + Minimum Total Electricity Generation: 5.41 MW + Initial Total Electricity Generation: 5.41 MW + Maximum Net Electricity Generation: 1.24 MW + Average Net Electricity Generation: 1.21 MW + Minimum Net Electricity Generation: 1.04 MW + Initial Net Electricity Generation: 1.04 MW + Average Annual Total Electricity Generation: 43.80 GWh + Average Annual Net Electricity Generation: 9.54 GWh + Initial pumping power/net installed power: 418.82 % + Average Pumping Power: 4.37 MW + + ************************************************************ + * 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 165.24 4.3695 1.0433 2.0217 + 2 1.0058 166.19 4.3696 1.1369 2.1851 + 3 1.0074 166.47 4.3696 1.1639 2.2318 + 4 1.0083 166.61 4.3696 1.1780 2.2561 + 5 1.0088 166.70 4.3696 1.1874 2.2722 + 6 1.0093 166.77 4.3696 1.1943 2.2840 + 7 1.0096 166.83 4.3696 1.1997 2.2933 + 8 1.0099 166.87 4.3696 1.2042 2.3010 + 9 1.0101 166.91 4.3696 1.2079 2.3074 + 10 1.0103 166.94 4.3696 1.2112 2.3129 + 11 1.0105 166.97 4.3696 1.2140 2.3178 + 12 1.0106 167.00 4.3696 1.2165 2.3221 + 13 1.0108 167.02 4.3696 1.2188 2.3260 + 14 1.0109 167.04 4.3696 1.2209 2.3295 + 15 1.0110 167.06 4.3696 1.2228 2.3327 + 16 1.0111 167.08 4.3696 1.2245 2.3357 + 17 1.0112 167.09 4.3696 1.2261 2.3384 + 18 1.0113 167.11 4.3696 1.2276 2.3409 + 19 1.0114 167.12 4.3696 1.2290 2.3433 + 20 1.0115 167.14 4.3696 1.2303 2.3455 + 21 1.0115 167.15 4.3696 1.2315 2.3476 + 22 1.0116 167.16 4.3696 1.2326 2.3496 + 23 1.0117 167.17 4.3696 1.2337 2.3514 + 24 1.0117 167.18 4.3696 1.2348 2.3532 + 25 1.0118 167.19 4.3696 1.2357 2.3549 + 26 1.0118 167.20 4.3696 1.2367 2.3565 + 27 1.0119 167.21 4.3697 1.2376 2.3580 + 28 1.0119 167.22 4.3697 1.2384 2.3594 + 29 1.0120 167.23 4.3697 1.2392 2.3608 + 30 1.0120 167.23 4.3697 1.2400 2.3621 + + + ******************************************************************* + * 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 8.7 408.7 322.53 0.45 + 2 9.1 410.7 321.05 0.91 + 3 9.3 411.4 319.57 1.37 + 4 9.4 411.8 318.09 1.83 + 5 9.4 412.1 316.60 2.28 + 6 9.5 412.3 315.12 2.74 + 7 9.5 412.5 313.63 3.20 + 8 9.5 412.7 312.15 3.66 + 9 9.6 412.8 310.66 4.12 + 10 9.6 412.9 309.17 4.58 + 11 9.6 413.0 307.69 5.03 + 12 9.6 413.1 306.20 5.49 + 13 9.6 413.2 304.71 5.95 + 14 9.7 413.2 303.23 6.41 + 15 9.7 413.3 301.74 6.87 + 16 9.7 413.3 300.25 7.33 + 17 9.7 413.4 298.76 7.79 + 18 9.7 413.5 297.27 8.25 + 19 9.7 413.5 295.78 8.71 + 20 9.7 413.5 294.30 9.17 + 21 9.7 413.6 292.81 9.63 + 22 9.7 413.6 291.32 10.09 + 23 9.8 413.7 289.83 10.55 + 24 9.8 413.7 288.34 11.01 + 25 9.8 413.7 286.85 11.47 + 26 9.8 413.8 285.36 11.93 + 27 9.8 413.8 283.87 12.39 + 28 9.8 413.8 282.38 12.85 + 29 9.8 413.9 280.89 13.31 + 30 8.2 344.9 279.65 13.69 + + + + ***EXTENDED ECONOMICS*** + + Adjusted Project LCOE (after incentives, grants, AddOns,etc): 8.72 cents/kWh + Adjusted Project LCOH (after incentives, grants, AddOns,etc): 0.00 USD/MMBTU + Adjusted Project CAPEX (after incentives, grants, AddOns, etc): 102.63 MUSD + Adjusted Project OPEX (after incentives, grants, AddOns, etc): 0.90 MUSD + Project NPV (including AddOns): -60.98 MUSD + Project IRR (including AddOns): -0.00 % + Project VIR=PI=PIR (including AddOns): 0.41 + Project MOIC (including AddOns): -0.05 + Project Payback Period (including AddOns): 0.00 yr + Total Add-on CAPEX: 70.00 MUSD + Total Add-on OPEX: 1.70 MUSD/yr + Total Add-on Net Elec: 25900.00 kW/yr + Total Add-on Net Heat: 0.00 kW/yr + Total Add-on Profit: 2.84 MUSD/yr + AddOns Payback Period: 0.00 yr + + + ******************************* + * EXTENDED ECONOMIC PROFILE * + ******************************* +Year Electricity Heat Add-on Annual AddOn Cumm. AddOn Annual Project Cumm. Project +Since Price Revenue Price Revenue Revenue Cash Flow Cash Flow Cash Flow Cash Flow +Start (cents/kWh)(MUSD/yr) (cents/kWh)(MUSD/yr) (MUSD/yr) (MUSD/yr) (MUSD) (MUSD/yr) (MUSD) + 1 0.090 0.0023 0.012 0.0000 1.14 -70.00 -70.00 -102.63 -102.63 + 2 0.090 0.0023 0.012 0.0000 1.14 1.14 -68.86 2.72 -99.91 + 3 0.090 0.0023 0.012 0.0000 1.14 1.14 -67.72 2.76 -97.15 + 4 0.090 0.0023 0.012 0.0000 1.14 1.14 -66.59 2.77 -94.38 + 5 0.090 0.0023 0.012 0.0000 1.14 1.14 -65.45 2.78 -91.60 + 6 0.090 0.0023 0.012 0.0000 1.14 1.14 -64.31 2.79 -88.81 + 7 0.102 0.0026 0.012 0.0000 1.14 1.14 -63.17 2.79 -86.02 + 8 0.114 0.0030 0.012 0.0000 1.14 1.14 -62.03 2.91 -83.11 + 9 0.126 0.0033 0.022 0.0000 1.14 1.14 -60.89 3.03 -80.08 + 10 0.138 0.0036 0.032 0.0000 1.14 1.14 -59.75 3.15 -76.94 + 11 0.150 0.0039 0.036 0.0000 1.14 1.14 -58.61 3.26 -73.68 + 12 0.150 0.0039 0.036 0.0000 1.14 1.14 -57.47 3.38 -70.29 + 13 0.150 0.0039 0.036 0.0000 1.14 1.14 -56.33 3.39 -66.91 + 14 0.150 0.0039 0.036 0.0000 1.14 1.14 -55.19 3.39 -63.52 + 15 0.150 0.0039 0.036 0.0000 1.14 1.14 -54.05 3.39 -60.13 + 16 0.150 0.0039 0.036 0.0000 1.14 1.14 -52.91 3.39 -56.74 + 17 0.150 0.0039 0.036 0.0000 1.14 1.14 -51.77 3.39 -53.34 + 18 0.150 0.0039 0.036 0.0000 1.14 1.14 -50.63 3.40 -49.95 + 19 0.150 0.0039 0.036 0.0000 1.14 1.14 -49.49 3.40 -46.55 + 20 0.150 0.0039 0.036 0.0000 1.14 1.14 -48.35 3.40 -43.15 + 21 0.150 0.0039 0.036 0.0000 1.14 1.14 -47.21 3.40 -39.75 + 22 0.150 0.0039 0.036 0.0000 1.14 1.14 -46.07 3.40 -36.35 + 23 0.150 0.0039 0.036 0.0000 1.14 1.14 -44.93 3.40 -32.95 + 24 0.150 0.0039 0.036 0.0000 1.14 1.14 -43.80 3.40 -29.54 + 25 0.150 0.0039 0.036 0.0000 1.14 1.14 -42.66 3.41 -26.14 + 26 0.150 0.0039 0.036 0.0000 1.14 1.14 -41.52 3.41 -22.73 + 27 0.150 0.0039 0.036 0.0000 1.14 1.14 -40.38 3.41 -19.32 + 28 0.150 0.0039 0.036 0.0000 1.14 1.14 -39.24 3.41 -15.91 + 29 0.150 0.0039 0.036 0.0000 1.14 1.14 -38.10 3.41 -12.50 + 30 0.150 0.0039 0.036 0.0000 1.14 1.14 -36.96 3.41 -9.09 + + + ***CCUS ECONOMICS*** + + + Total Avoided Carbon Production: 234780313.03 pound + Project NPV (including carbon credit): -0.41 MUSD + Project IRR (including carbon credit): 0.06 % + Project VIR=IR=PIR (including carbon credit): 0.99 + Project MOIC (including carbon credit): 5.47 + Project Payback Period (including carbon credit): 15.53 yr + + + ****************** + * CCUS PROFILE * + ****************** +Year Carbon CCUS CCUS Annual CCUS Cumm. Project Annual Project Cumm. +Since Avoided Price Revenue Cash Flow Cash Flow Cash Flow Cash Flow +Start (pound) (USD/lb) (MUSD/yr) (MUSD/yr) (MUSD) (MUSD/yr) (MUSD) + 1 -32.63 -32.63 + 2 7101870.358 0.015 0.11 0.11 0.11 1.69 -30.95 + 3 7470391.043 0.015 0.11 0.11 0.22 1.73 -29.21 + 4 7595168.229 0.015 0.11 0.11 0.33 1.75 -27.46 + 5 7669074.100 0.015 0.12 0.12 0.45 1.76 -25.71 + 6 7720883.286 0.015 0.12 0.12 0.56 1.76 -23.94 + 7 7760409.892 0.015 0.12 0.12 0.68 1.77 -22.17 + 8 7792164.418 0.025 0.19 0.19 0.87 1.97 -20.21 + 9 7818583.043 0.035 0.27 0.27 1.15 2.16 -18.04 + 10 7841125.517 0.045 0.35 0.35 1.50 2.36 -15.69 + 11 7860732.801 0.055 0.43 0.43 1.93 2.56 -13.13 + 12 7878045.387 0.065 0.51 0.51 2.45 2.75 -10.37 + 13 7893518.049 0.075 0.59 0.59 3.04 2.84 -7.54 + 14 7907484.797 0.085 0.67 0.67 3.71 2.92 -4.62 + 15 7920197.818 0.095 0.75 0.75 4.46 3.00 -1.61 + 16 7931851.962 0.100 0.79 0.79 5.26 3.05 1.43 + 17 7942600.746 0.100 0.79 0.79 6.05 3.05 4.48 + 18 7952567.147 0.100 0.80 0.80 6.84 3.05 7.53 + 19 7961851.088 0.100 0.80 0.80 7.64 3.05 10.58 + 20 7970534.743 0.100 0.80 0.80 8.44 3.06 13.64 + 21 7978686.355 0.100 0.80 0.80 9.24 3.06 16.70 + 22 7986363.027 0.100 0.80 0.80 10.03 3.06 19.76 + 23 7993612.777 0.100 0.80 0.80 10.83 3.06 22.82 + 24 8000476.061 0.100 0.80 0.80 11.63 3.06 25.89 + 25 8006986.902 0.100 0.80 0.80 12.43 3.07 28.95 + 26 8013173.735 0.100 0.80 0.80 13.24 3.07 32.02 + 27 8019060.033 0.100 0.80 0.80 14.04 3.07 35.09 + 28 8024664.782 0.100 0.80 0.80 14.84 3.07 38.16 + 29 8030002.830 0.100 0.80 0.80 15.64 3.07 41.24 + 30 8035085.158 0.100 0.80 0.80 16.45 3.07 44.31 + 31 6703146.945 0.100 0.67 0.67 17.12 2.70 47.01 diff --git a/tests/result_with_revenue_and_cashflow_profile.out b/tests/result_with_revenue_and_cashflow_profile.out new file mode 100644 index 00000000..e0002741 --- /dev/null +++ b/tests/result_with_revenue_and_cashflow_profile.out @@ -0,0 +1,299 @@ + ***************** + ***CASE REPORT*** + ***************** + +Simulation Metadata +---------------------- + GEOPHIRES Version: 3.4.12 + GEOPHIRES Build Date: 2022-06-30 + Simulation Date: 2024-03-04 + Simulation Time: 07:46 + Calculation Time: 0.611 sec + + ***SUMMARY OF RESULTS*** + + End-Use Option: Electricity + Average Net Electricity Production: 1.21 MW + Electricity breakeven price: 8.70 cents/kWh + Number of production wells: 2 + Number of injection wells: 2 + Flowrate per production well: 55.0 kg/sec + Well depth (or total length, if not vertical): 3.0 kilometer + Geothermal gradient: 0.0500 degC/m + + + ***ECONOMIC PARAMETERS*** + + Economic Model = Fixed Charge Rate (FCR) + Fixed Charge Rate (FCR): 5.00 + Accrued financing during construction: 0.00 + Project lifetime: 30 yr + Capacity factor: 90.0 % + Project NPV: -6.25 MUSD + Project IRR: 4.49 % + Project VIR=PI=PIR: 0.81 + Project MOIC: 3.48 + Project Payback Period: 17.70 yr + + ***ENGINEERING PARAMETERS*** + + Number of Production Wells: 2 + Number of Injection Wells: 2 + Well depth (or total length, if not vertical): 3.0 kilometer + Water loss rate: 2.0 + Pump efficiency: 80.0 + Injection temperature: 50.0 degC + Production Wellbore heat transmission calculated with Ramey's model + Average production well temperature drop: 3.0 degC + Flowrate per production well: 55.0 kg/sec + Injection well casing ID: 7.000 in + Production well casing ID: 7.000 in + Number of times redrilling: 0 + Power plant type: Supercritical ORC + + + ***RESOURCE CHARACTERISTICS*** + + Maximum reservoir temperature: 400.0 degC + Number of segments: 1 + Geothermal gradient: 0.0500 degC/m + + + ***RESERVOIR PARAMETERS*** + + Reservoir Model = Multiple Parallel Fractures Model + Bottom-hole temperature: 170.00 degC + Fracture model = Square + Well seperation: fracture height: 900.00 meter + Fracture area: 810000.00 m**2 + Reservoir volume: 1000000000 m**3 + Reservoir hydrostatic pressure: 29430.21 kPa + Plant outlet pressure: 29705.96 kPa + Production wellhead pressure: 29774.91 kPa + Productivity Index: 5.00 kg/sec/bar + Injectivity Index: 5.00 kg/sec/bar + Reservoir density: 2700.00 kg/m**3 + Reservoir thermal conductivity: 2.70 watt/m/kelvin + Reservoir heat capacity: 1000.00 J/kg/kelvin + + + ***RESERVOIR SIMULATION RESULTS*** + + Maximum Production Temperature: 167.2 degC + Average Production Temperature: 167.0 degC + Minimum Production Temperature: 165.2 degC + Initial Production Temperature: 165.2 degC + Average Reservoir Heat Extraction: 52.38 MW + Production Wellbore Heat Transmission Model = Ramey Model + Average Production Well Temperature Drop: 3.0 degC + Average Injection Well Pump Pressure Drop: -28418.9 kPa + Average Production Well Pump Pressure Drop: 29886.2 kPa + + + ***CAPITAL COSTS (M$)*** + + Drilling and completion costs: 21.95 MUSD + Drilling and completion costs per well: 5.49 MUSD + Stimulation costs: 3.02 MUSD + Surface power plant costs: 20.78 MUSD + Field gathering system costs: 3.89 MUSD + Total surface equipment costs: 24.67 MUSD + Exploration costs: 5.33 MUSD + Total capital costs: 32.63 MUSD + Annualized capital costs: 1.63 MUSD + + + ***OPERATING AND MAINTENANCE COSTS (M$/yr)*** + + Wellfield maintenance costs: 0.45 MUSD/yr + Power plant maintenance costs: 0.90 MUSD/yr + Water costs: 0.06 MUSD/yr + Total operating and maintenance costs: -0.80 MUSD/yr + + + ***SURFACE EQUIPMENT SIMULATION RESULTS*** + + Initial geofluid availability: 0.11 MW/(kg/s) + Maximum Total Electricity Generation: 5.61 MW + Average Total Electricity Generation: 5.58 MW + Minimum Total Electricity Generation: 5.41 MW + Initial Total Electricity Generation: 5.41 MW + Maximum Net Electricity Generation: 1.24 MW + Average Net Electricity Generation: 1.21 MW + Minimum Net Electricity Generation: 1.04 MW + Initial Net Electricity Generation: 1.04 MW + Average Annual Total Electricity Generation: 43.80 GWh + Average Annual Net Electricity Generation: 9.54 GWh + Initial pumping power/net installed power: 418.82 % + Average Pumping Power: 4.37 MW + + ************************************************************ + * 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 165.24 4.3695 1.0433 2.0217 + 2 1.0058 166.19 4.3696 1.1369 2.1851 + 3 1.0074 166.47 4.3696 1.1639 2.2318 + 4 1.0083 166.61 4.3696 1.1780 2.2561 + 5 1.0088 166.70 4.3696 1.1874 2.2722 + 6 1.0093 166.77 4.3696 1.1943 2.2840 + 7 1.0096 166.83 4.3696 1.1997 2.2933 + 8 1.0099 166.87 4.3696 1.2042 2.3010 + 9 1.0101 166.91 4.3696 1.2079 2.3074 + 10 1.0103 166.94 4.3696 1.2112 2.3129 + 11 1.0105 166.97 4.3696 1.2140 2.3178 + 12 1.0106 167.00 4.3696 1.2165 2.3221 + 13 1.0108 167.02 4.3696 1.2188 2.3260 + 14 1.0109 167.04 4.3696 1.2209 2.3295 + 15 1.0110 167.06 4.3696 1.2228 2.3327 + 16 1.0111 167.08 4.3696 1.2245 2.3357 + 17 1.0112 167.09 4.3696 1.2261 2.3384 + 18 1.0113 167.11 4.3696 1.2276 2.3409 + 19 1.0114 167.12 4.3696 1.2290 2.3433 + 20 1.0115 167.14 4.3696 1.2303 2.3455 + 21 1.0115 167.15 4.3696 1.2315 2.3476 + 22 1.0116 167.16 4.3696 1.2326 2.3496 + 23 1.0117 167.17 4.3696 1.2337 2.3514 + 24 1.0117 167.18 4.3696 1.2348 2.3532 + 25 1.0118 167.19 4.3696 1.2357 2.3549 + 26 1.0118 167.20 4.3696 1.2367 2.3565 + 27 1.0119 167.21 4.3697 1.2376 2.3580 + 28 1.0119 167.22 4.3697 1.2384 2.3594 + 29 1.0120 167.23 4.3697 1.2392 2.3608 + 30 1.0120 167.23 4.3697 1.2400 2.3621 + + + ******************************************************************* + * 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 8.7 408.7 322.53 0.45 + 2 9.1 410.7 321.05 0.91 + 3 9.3 411.4 319.57 1.37 + 4 9.4 411.8 318.09 1.83 + 5 9.4 412.1 316.60 2.28 + 6 9.5 412.3 315.12 2.74 + 7 9.5 412.5 313.63 3.20 + 8 9.5 412.7 312.15 3.66 + 9 9.6 412.8 310.66 4.12 + 10 9.6 412.9 309.17 4.58 + 11 9.6 413.0 307.69 5.03 + 12 9.6 413.1 306.20 5.49 + 13 9.6 413.2 304.71 5.95 + 14 9.7 413.2 303.23 6.41 + 15 9.7 413.3 301.74 6.87 + 16 9.7 413.3 300.25 7.33 + 17 9.7 413.4 298.76 7.79 + 18 9.7 413.5 297.27 8.25 + 19 9.7 413.5 295.78 8.71 + 20 9.7 413.5 294.30 9.17 + 21 9.7 413.6 292.81 9.63 + 22 9.7 413.6 291.32 10.09 + 23 9.8 413.7 289.83 10.55 + 24 9.8 413.7 288.34 11.01 + 25 9.8 413.7 286.85 11.47 + 26 9.8 413.8 285.36 11.93 + 27 9.8 413.8 283.87 12.39 + 28 9.8 413.8 282.38 12.85 + 29 9.8 413.9 280.89 13.31 + 30 8.2 344.9 279.65 13.69 + + + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.09 -32.63 0.00 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -32.63 -32.63 + 2 0.09 1.58 0.78 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.58 -31.05 + 3 0.09 1.62 1.60 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.62 -29.43 + 4 0.09 1.63 2.43 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.63 -27.80 + 5 0.09 1.64 3.27 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.64 -26.15 + 6 0.09 1.65 4.12 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.65 -24.50 + 7 0.10 1.65 4.97 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.65 -22.85 + 8 0.11 1.77 5.94 | 0.01 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.77 -21.08 + 9 0.13 1.89 7.03 | 0.02 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 1.89 -19.19 + 10 0.14 2.01 8.24 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.01 -17.19 + 11 0.15 2.12 9.56 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.12 -15.06 + 12 0.15 2.24 11.00 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.24 -12.82 + 13 0.15 2.25 12.44 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -10.57 + 14 0.15 2.25 13.89 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -8.33 + 15 0.15 2.25 15.34 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -6.08 + 16 0.15 2.25 16.79 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -3.82 + 17 0.15 2.25 18.24 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.25 -1.57 + 18 0.15 2.26 19.70 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 0.69 + 19 0.15 2.26 21.15 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 2.94 + 20 0.15 2.26 22.61 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 5.20 + 21 0.15 2.26 24.07 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 7.46 + 22 0.15 2.26 25.53 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 9.73 + 23 0.15 2.26 26.99 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 11.99 + 24 0.15 2.26 28.46 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.26 14.25 + 25 0.15 2.27 29.92 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 16.52 + 26 0.15 2.27 31.39 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 18.79 + 27 0.15 2.27 32.85 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 21.06 + 28 0.15 2.27 34.32 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 23.32 + 29 0.15 2.27 35.79 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 25.59 + 30 0.15 2.27 37.26 | 0.04 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | -0.80 2.27 27.87 + + + + ***EXTENDED ECONOMICS*** + + Adjusted Project LCOE (after incentives, grants, AddOns,etc): 8.70 cents/kWh + Adjusted Project LCOH (after incentives, grants, AddOns,etc): 0.00 USD/MMBTU + Adjusted Project CAPEX (after incentives, grants, AddOns, etc): 102.63 MUSD + Adjusted Project OPEX (after incentives, grants, AddOns, etc): 0.90 MUSD + Project NPV (including AddOns): -60.98 MUSD + Project IRR (including AddOns): -0.00 % + Project VIR=PI=PIR (including AddOns): 0.41 + Project MOIC (including AddOns): -0.05 + Total Add-on CAPEX: 70.00 MUSD + Total Add-on OPEX: 1.70 MUSD/yr + Total Add-on Net Elec: 25900.00 kW/yr + Total Add-on Net Heat: 0.00 kW/yr + Total Add-on Profit: 2.84 MUSD/yr + AddOns Payback Period: 0.00 yr + + + ******************************* + * EXTENDED ECONOMIC PROFILE * + ******************************* +Year Electricity Heat Add-on Annual AddOn Cumm. AddOn Annual Project Cumm. Project +Since Price Revenue Price Revenue Revenue Cash Flow Cash Flow Cash Flow Cash Flow +Start (cents/kWh)(MUSD/yr) (cents/kWh)(MUSD/yr) (MUSD/yr) (MUSD/yr) (MUSD) (MUSD/yr) (MUSD) + 1 0.090 0.0023 0.012 0.0000 1.14 -70.00 -70.00 -102.63 -102.63 + 2 0.090 0.0023 0.012 0.0000 1.14 1.14 -68.86 2.72 -99.91 + 3 0.090 0.0023 0.012 0.0000 1.14 1.14 -67.72 2.76 -97.15 + 4 0.090 0.0023 0.012 0.0000 1.14 1.14 -66.59 2.77 -94.38 + 5 0.090 0.0023 0.012 0.0000 1.14 1.14 -65.45 2.78 -91.60 + 6 0.090 0.0023 0.012 0.0000 1.14 1.14 -64.31 2.79 -88.81 + 7 0.102 0.0026 0.012 0.0000 1.14 1.14 -63.17 2.79 -86.02 + 8 0.114 0.0030 0.012 0.0000 1.14 1.14 -62.03 2.91 -83.11 + 9 0.126 0.0033 0.022 0.0000 1.14 1.14 -60.89 3.03 -80.08 + 10 0.138 0.0036 0.032 0.0000 1.14 1.14 -59.75 3.15 -76.94 + 11 0.150 0.0039 0.036 0.0000 1.14 1.14 -58.61 3.26 -73.68 + 12 0.150 0.0039 0.036 0.0000 1.14 1.14 -57.47 3.38 -70.29 + 13 0.150 0.0039 0.036 0.0000 1.14 1.14 -56.33 3.39 -66.91 + 14 0.150 0.0039 0.036 0.0000 1.14 1.14 -55.19 3.39 -63.52 + 15 0.150 0.0039 0.036 0.0000 1.14 1.14 -54.05 3.39 -60.13 + 16 0.150 0.0039 0.036 0.0000 1.14 1.14 -52.91 3.39 -56.74 + 17 0.150 0.0039 0.036 0.0000 1.14 1.14 -51.77 3.39 -53.34 + 18 0.150 0.0039 0.036 0.0000 1.14 1.14 -50.63 3.40 -49.95 + 19 0.150 0.0039 0.036 0.0000 1.14 1.14 -49.49 3.40 -46.55 + 20 0.150 0.0039 0.036 0.0000 1.14 1.14 -48.35 3.40 -43.15 + 21 0.150 0.0039 0.036 0.0000 1.14 1.14 -47.21 3.40 -39.75 + 22 0.150 0.0039 0.036 0.0000 1.14 1.14 -46.07 3.40 -36.35 + 23 0.150 0.0039 0.036 0.0000 1.14 1.14 -44.93 3.40 -32.95 + 24 0.150 0.0039 0.036 0.0000 1.14 1.14 -43.80 3.40 -29.54 + 25 0.150 0.0039 0.036 0.0000 1.14 1.14 -42.66 3.41 -26.14 + 26 0.150 0.0039 0.036 0.0000 1.14 1.14 -41.52 3.41 -22.73 + 27 0.150 0.0039 0.036 0.0000 1.14 1.14 -40.38 3.41 -19.32 + 28 0.150 0.0039 0.036 0.0000 1.14 1.14 -39.24 3.41 -15.91 + 29 0.150 0.0039 0.036 0.0000 1.14 1.14 -38.10 3.41 -12.50 + 30 0.150 0.0039 0.036 0.0000 1.14 1.14 -36.96 3.41 -9.09 diff --git a/tests/test_geophires_x_client.py b/tests/test_geophires_x_client.py index 2386a41f..758a8b0e 100644 --- a/tests/test_geophires_x_client.py +++ b/tests/test_geophires_x_client.py @@ -246,23 +246,76 @@ def test_extended_economic_profile(self): ) def test_revenue_and_cashflow_profile(self): - """ - TODO make this less tedious to update when expected result values change - (https://github.com/NREL/GEOPHIRES-X/issues/107) - """ + example_result_path = self._get_test_file_path('examples/example1_addons.out') + example_result = GeophiresXResult(example_result_path) + example_profile = example_result.result['REVENUE & CASHFLOW PROFILE'] + self.assertIsNotNone(example_profile) + + profile_headers = [ + 'Year Since Start', + 'Electricity Price (cents/kWh)', + 'Electricity Ann. Rev. (MUSD/yr)', + 'Electricity Cumm. Rev. (MUSD)', + 'Heat Price (cents/kWh)', + 'Heat Ann. Rev. (MUSD/yr)', + 'Heat Cumm. Rev. (MUSD)', + 'Cooling Price (cents/kWh)', + 'Cooling Ann. Rev. (MUSD/yr)', + 'Cooling Cumm. Rev. (MUSD)', + 'Carbon Price (USD/tonne)', + 'Carbon Ann. Rev. (MUSD/yr)', + 'Carbon Cumm. Rev. (MUSD)', + 'Project OPEX (MUSD/yr)', + 'Project Net Rev. (MUSD/yr)', + 'Project Net Cashflow (MUSD)', + ] + + self.assertListEqual(profile_headers, example_profile[0]) + + rcf_path = self._get_test_file_path('result_with_revenue_and_cashflow_profile.out') + rcf_result = GeophiresXResult(rcf_path) + rcf_profile = rcf_result.result['REVENUE & CASHFLOW PROFILE'] + self.assertIsNotNone(rcf_profile) - test_result_path = self._get_test_file_path('examples/example1_addons.out') - result = GeophiresXResult(test_result_path) - revenue_and_cashflow_profile = result.result['REVENUE & CASHFLOW PROFILE'] - self.assertIsNotNone(revenue_and_cashflow_profile) # FIXME WIP TODO + self.assertListEqual( + [ + profile_headers, + [1, 0.09, -32.63, 0.0, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -32.63, -32.63], + [2, 0.09, 1.58, 0.78, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.58, -31.05], + [3, 0.09, 1.62, 1.6, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.62, -29.43], + [4, 0.09, 1.63, 2.43, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.63, -27.8], + [5, 0.09, 1.64, 3.27, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.64, -26.15], + [6, 0.09, 1.65, 4.12, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.65, -24.5], + [7, 0.1, 1.65, 4.97, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.65, -22.85], + [8, 0.11, 1.77, 5.94, 0.01, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.77, -21.08], + [9, 0.13, 1.89, 7.03, 0.02, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 1.89, -19.19], + [10, 0.14, 2.01, 8.24, 0.03, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.01, -17.19], + [11, 0.15, 2.12, 9.56, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.12, -15.06], + [12, 0.15, 2.24, 11.0, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.24, -12.82], + [13, 0.15, 2.25, 12.44, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.25, -10.57], + [14, 0.15, 2.25, 13.89, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.25, -8.33], + [15, 0.15, 2.25, 15.34, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.25, -6.08], + [16, 0.15, 2.25, 16.79, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.25, -3.82], + [17, 0.15, 2.25, 18.24, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.25, -1.57], + [18, 0.15, 2.26, 19.7, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.26, 0.69], + [19, 0.15, 2.26, 21.15, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.26, 2.94], + [20, 0.15, 2.26, 22.61, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.26, 5.2], + [21, 0.15, 2.26, 24.07, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.26, 7.46], + [22, 0.15, 2.26, 25.53, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.26, 9.73], + [23, 0.15, 2.26, 26.99, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.26, 11.99], + [24, 0.15, 2.26, 28.46, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.26, 14.25], + [25, 0.15, 2.27, 29.92, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.27, 16.52], + [26, 0.15, 2.27, 31.39, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.27, 18.79], + [27, 0.15, 2.27, 32.85, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.27, 21.06], + [28, 0.15, 2.27, 34.32, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.27, 23.32], + [29, 0.15, 2.27, 35.79, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.27, 25.59], + [30, 0.15, 2.27, 37.26, 0.04, 0.0, 0.0, 0.03, 0.0, 0.0, 0.0, 0.0, 0.0, -0.8, 2.27, 27.87], + ], + rcf_profile, + ) def test_ccus_profile(self): - """ - TODO make this less tedious to update when expected result values change - (https://github.com/NREL/GEOPHIRES-X/issues/107) - """ - - test_result_path = self._get_test_file_path('examples/example1_addons.out') + test_result_path = self._get_test_file_path('result_with_ccus_profile.out') result = GeophiresXResult(test_result_path) ccus_profile = result.result['CCUS PROFILE'] @@ -367,7 +420,6 @@ def test_input_with_non_default_units(self): def test_csv(self): """ TODO make this less tedious to update when expected result values change - (https://github.com/NREL/GEOPHIRES-X/issues/107) """ def assert_csv_equal(case_report_file_path, expected_csv_file_path): From 11c70a78ed60e0311d4561759a2302033c71acd7 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 08:45:40 -0800 Subject: [PATCH 18/36] Update examples with revenue & cashflow profiles --- ...Closed-Loop_Geothermal_Energy_Recovery.out | 16 +++--- tests/examples/example1.out | 16 +++--- tests/examples/example10_HP.out | 14 +++--- tests/examples/example11_AC.out | 14 +++--- tests/examples/example12_DH.out | 12 ++--- tests/examples/example13.out | 14 +++--- tests/examples/example2.out | 14 +++--- tests/examples/example3.out | 14 +++--- tests/examples/example4.out | 16 +++--- tests/examples/example5.out | 12 ++--- tests/examples/example8.out | 14 +++--- tests/examples/example9.out | 16 +++--- tests/examples/example_SHR-1.out | 16 +++--- tests/examples/example_SHR-2.out | 50 +++++++++++++++++-- tests/examples/example_multiple_gradients.out | 16 +++--- 15 files changed, 147 insertions(+), 107 deletions(-) diff --git a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out index 1ac86349..a628e047 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.4 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-02 - Simulation Time: 14:16 - Calculation Time: 3.737 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:44 + Calculation Time: 1.673 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.10 MW - Electricity breakeven price: 44.08 cents/kWh + Electricity breakeven price: 44.08 cents/kWh Number of production wells: 1 Number of injection wells: 0 Flowrate per production well: 110.0 kg/sec @@ -204,9 +204,9 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t 40 7.5 134.4 10.09 69.89 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example1.out b/tests/examples/example1.out index 32737aec..2abae0cf 100644 --- a/tests/examples/example1.out +++ b/tests/examples/example1.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.4 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-02 - Simulation Time: 13:34 - Calculation Time: 17.165 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.617 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.21 MW - Electricity breakeven price: 43.69 cents/kWh + Electricity breakeven price: 43.69 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -203,9 +203,9 @@ Simulation Metadata 30 8.1 344.9 279.65 13.69 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example10_HP.out b/tests/examples/example10_HP.out index ad7e829a..f259ab70 100644 --- a/tests/examples/example10_HP.out +++ b/tests/examples/example10_HP.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:32 - Calculation Time: 0.142 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.147 sec ***SUMMARY OF RESULTS*** @@ -198,9 +198,9 @@ Simulation Metadata 30 108.8 77.7 43.19 3.90 72.10 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example11_AC.out b/tests/examples/example11_AC.out index 4aab9067..d4d60257 100644 --- a/tests/examples/example11_AC.out +++ b/tests/examples/example11_AC.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:33 - Calculation Time: 0.143 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.142 sec ***SUMMARY OF RESULTS*** @@ -203,9 +203,9 @@ Simulation Metadata 30 36.0 55.5 6.79 51.50 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example12_DH.out b/tests/examples/example12_DH.out index 4208af16..55224e7a 100644 --- a/tests/examples/example12_DH.out +++ b/tests/examples/example12_DH.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:33 + Simulation Date: 2024-03-04 + Simulation Time: 08:43 Calculation Time: 0.127 sec ***SUMMARY OF RESULTS*** @@ -212,9 +212,9 @@ Simulation Metadata 30 93.4 102.9 116.73 2.70 87.75 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example13.out b/tests/examples/example13.out index 199cdf20..97f4e3d2 100644 --- a/tests/examples/example13.out +++ b/tests/examples/example13.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.4 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-02 - Simulation Time: 14:11 - Calculation Time: 0.124 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.044 sec ***SUMMARY OF RESULTS*** @@ -210,9 +210,9 @@ Simulation Metadata 30 54.5 -8.7 257.16 10.17 81.39 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example2.out b/tests/examples/example2.out index 28b7d61a..46afd461 100644 --- a/tests/examples/example2.out +++ b/tests/examples/example2.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:31 - Calculation Time: 0.215 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.216 sec ***SUMMARY OF RESULTS*** @@ -188,9 +188,9 @@ Simulation Metadata 25 98.4 109.3 23.85 40.69 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example3.out b/tests/examples/example3.out index 005cd23c..21914785 100644 --- a/tests/examples/example3.out +++ b/tests/examples/example3.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:31 - Calculation Time: 0.169 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.165 sec ***SUMMARY OF RESULTS*** @@ -216,9 +216,9 @@ Simulation Metadata 35 62.8 121.7 825.50 -41.67 149.64 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example4.out b/tests/examples/example4.out index 51dcb74c..f291ea4b 100644 --- a/tests/examples/example4.out +++ b/tests/examples/example4.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.4 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-02 - Simulation Time: 14:05 - Calculation Time: 0.187 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.062 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: -0.57 MW - Electricity breakeven price: -244.32 cents/kWh + Electricity breakeven price: -244.32 cents/kWh Number of production wells: 3 Number of injection wells: 2 Flowrate per production well: 110.0 kg/sec @@ -201,9 +201,9 @@ Simulation Metadata 30 -9.6 512.8 133.11 37.40 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example5.out b/tests/examples/example5.out index 8efd6ac8..38798471 100644 --- a/tests/examples/example5.out +++ b/tests/examples/example5.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:31 + Simulation Date: 2024-03-04 + Simulation Time: 08:43 Calculation Time: 0.062 sec ***SUMMARY OF RESULTS*** @@ -194,9 +194,9 @@ Simulation Metadata 30 85.2 94.7 180.39 9.10 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example8.out b/tests/examples/example8.out index 6b28621b..d118fb93 100644 --- a/tests/examples/example8.out +++ b/tests/examples/example8.out @@ -4,11 +4,11 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:32 - Calculation Time: 0.607 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.613 sec ***SUMMARY OF RESULTS*** @@ -198,9 +198,9 @@ Simulation Metadata 30 39.1 43.5 24.28 19.60 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example9.out b/tests/examples/example9.out index de52f0ca..ee69af2f 100644 --- a/tests/examples/example9.out +++ b/tests/examples/example9.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.4 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-02 - Simulation Time: 14:08 - Calculation Time: 1.658 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.610 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 0.47 MW - Electricity breakeven price: 50.18 cents/kWh + Electricity breakeven price: 50.18 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 40.0 kg/sec @@ -205,9 +205,9 @@ Simulation Metadata 30 2.7 61.5 20.96 28.48 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example_SHR-1.out b/tests/examples/example_SHR-1.out index c27fd02d..cc2a8a1f 100644 --- a/tests/examples/example_SHR-1.out +++ b/tests/examples/example_SHR-1.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:32 - Calculation Time: 0.607 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:44 + Calculation Time: 0.613 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 30.58 MW - Electricity breakeven price: 5.89 cents/kWh + Electricity breakeven price: 5.89 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -199,9 +199,9 @@ Simulation Metadata 30 203.3 943.3 810.53 12.99 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) diff --git a/tests/examples/example_SHR-2.out b/tests/examples/example_SHR-2.out index 229c652c..f60ce3f7 100644 --- a/tests/examples/example_SHR-2.out +++ b/tests/examples/example_SHR-2.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.11 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-01 - Simulation Time: 12:32 - Calculation Time: 0.614 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:43 + Calculation Time: 0.631 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 30.58 MW - Electricity breakeven price: 2.15 cents/kWh + Electricity breakeven price: 2.15 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -33,6 +33,7 @@ Simulation Metadata Project IRR: 21.15 % Project VIR=PI=PIR: 3.22 Project MOIC: 5.24 + Project Payback Period: 6.18 yr ***ENGINEERING PARAMETERS*** @@ -196,3 +197,42 @@ Simulation Metadata 28 243.8 1131.6 818.00 12.18 29 243.9 1131.8 813.93 12.62 30 203.3 943.3 810.53 12.99 + + + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** +Year Electricity | Heat | Cooling | Carbon | Project +Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow +Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) +________________________________________________________________________________________________________________________________________________________________________________________ + 1 0.06 -88.30 0.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.00 -88.30 -88.30 + 2 0.06 12.98 13.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 12.98 -75.32 + 3 0.07 13.34 27.80 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 13.34 -61.98 + 4 0.08 16.30 44.84 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 16.30 -45.69 + 5 0.10 19.24 64.82 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 19.24 -26.45 + 6 0.10 22.17 87.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 22.17 -4.28 + 7 0.10 23.19 111.66 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.19 18.91 + 8 0.10 23.24 135.64 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.24 42.15 + 9 0.10 23.29 159.67 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.29 65.44 + 10 0.10 23.32 183.73 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.32 88.76 + 11 0.10 23.36 207.83 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.36 112.12 + 12 0.10 23.38 231.96 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.38 135.50 + 13 0.10 23.41 256.11 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.41 158.91 + 14 0.10 23.43 280.28 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.43 182.34 + 15 0.10 23.45 304.48 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.45 205.80 + 16 0.10 23.47 328.69 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.47 229.27 + 17 0.10 23.49 352.92 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.49 252.76 + 18 0.10 23.51 377.17 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.51 276.27 + 19 0.10 23.52 401.43 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.52 299.79 + 20 0.10 23.54 425.71 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.54 323.33 + 21 0.10 23.55 450.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.55 346.88 + 22 0.10 23.56 474.31 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.56 370.44 + 23 0.10 23.58 498.62 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.58 394.02 + 24 0.10 23.59 522.95 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.59 417.61 + 25 0.10 23.60 547.29 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.60 441.20 + 26 0.10 23.61 571.64 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.61 464.81 + 27 0.10 23.62 596.00 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.62 488.43 + 28 0.10 23.63 620.37 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.63 512.06 + 29 0.10 23.64 644.74 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.64 535.69 + 30 0.10 23.64 669.13 | 0.03 0.00 0.00 | 0.03 0.00 0.00 | 0.00 0.00 0.00 | 0.74 23.64 559.34 diff --git a/tests/examples/example_multiple_gradients.out b/tests/examples/example_multiple_gradients.out index 0455984b..a5b38a97 100644 --- a/tests/examples/example_multiple_gradients.out +++ b/tests/examples/example_multiple_gradients.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.4.4 + GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 - Simulation Date: 2024-03-02 - Simulation Time: 18:18 - Calculation Time: 1.704 sec + Simulation Date: 2024-03-04 + Simulation Time: 08:44 + Calculation Time: 0.614 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.90 MW - Electricity breakeven price: 39.29 cents/kWh + Electricity breakeven price: 39.29 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 60.0 kg/sec @@ -214,9 +214,9 @@ Simulation Metadata 30 7.5 411.2 322.41 14.71 - ******************************* - * REVENUE & CASHFLOW PROFILE * - ******************************* + ******************************** + * REVENUE & CASHFLOW PROFILE * + ******************************** Year Electricity | Heat | Cooling | Carbon | Project Since Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | Price Ann. Rev. Cumm. Rev. | OPEX Net Rev. Net Cashflow Start (cents/kWh)(MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(cents/kWh) (MUSD/yr) (MUSD) |(USD/tonne) (MUSD/yr) (MUSD) |(MUSD/yr) (MUSD/yr) (MUSD) From 43110be367f7ff3e3ce94d66a61fb32ca19ef1db Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 08:51:21 -0800 Subject: [PATCH 19/36] Revert probably-unnecessary addition of blank lines to MC output file (can be re-added if issue/repro/unit test are identified) --- src/geophires_monte_carlo/MC_GeoPHIRES3.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/geophires_monte_carlo/MC_GeoPHIRES3.py b/src/geophires_monte_carlo/MC_GeoPHIRES3.py index fa43d301..9bbf173f 100755 --- a/src/geophires_monte_carlo/MC_GeoPHIRES3.py +++ b/src/geophires_monte_carlo/MC_GeoPHIRES3.py @@ -200,10 +200,7 @@ def get_output(output): result_s += '\n' with open(output_file, 'a') as f: - f.write('\n') # This creates extra lines in the output file, but is needed to make concurrency work (?!?!?!). f.write(result_s) - f.write('\n') # This creates extra lines in the output file, but is needed to make concurrency work (?!?!?!). - # the extra lines in the file are cleaned up later. def main(command_line_args=None): @@ -411,8 +408,6 @@ def main(command_line_args=None): annotations = '' - # TODO remove extraneous blank lines from output file - with open(Path(output_file).with_suffix('.json'), 'w') as json_output_file: json_output_file.write(json.dumps(outputs_result)) logger.info(f'Wrote JSON results to {json_output_file.name}') From 5e37490c748e5c205a5283d7d92256adbb08dc25 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 08:52:29 -0800 Subject: [PATCH 20/36] Move Border_EGS_150C_Electricity_Input.txt to Examples --- .../{ => Examples}/Border_EGS_150C_Electricity_Input.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/geophires_x/{ => Examples}/Border_EGS_150C_Electricity_Input.txt (100%) diff --git a/src/geophires_x/Border_EGS_150C_Electricity_Input.txt b/src/geophires_x/Examples/Border_EGS_150C_Electricity_Input.txt similarity index 100% rename from src/geophires_x/Border_EGS_150C_Electricity_Input.txt rename to src/geophires_x/Examples/Border_EGS_150C_Electricity_Input.txt From 8a95526cb7da27badf7d49427cefa2be791a2ba3 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 08:56:06 -0800 Subject: [PATCH 21/36] Correct utils static pressure methoddoc --- src/geophires_x/GeoPHIRESUtils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/geophires_x/GeoPHIRESUtils.py b/src/geophires_x/GeoPHIRESUtils.py index 7c9843d5..9c604c70 100644 --- a/src/geophires_x/GeoPHIRESUtils.py +++ b/src/geophires_x/GeoPHIRESUtils.py @@ -467,13 +467,13 @@ def json_dumpse(obj) -> str: def static_pressure_MPa(rho_kg_per_m3: float, depth_m: float) -> float: """ - Calculate litho- (or hydro-) static pressure in a reservoir. + Calculate static pressure in a reservoir (i.e. lithostatic pressure or hydrostatic pressure). Args: rho_kg_per_m3 (float): Density of the fluid in kg/m^3. depth_m (float): Depth of the reservoir in meters. Returns: - pint quantity: Lithostatic pressure in megapascals (MPa). + Static pressure in megapascals (MPa). """ g = scipy.constants.g # Acceleration due to gravity (m/s^2) From 17d3b08fb3467e1a6db2f3b3b7658be85dceb081 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:04:01 -0800 Subject: [PATCH 22/36] Economics - remove redundant value declarations on new fields --- src/geophires_x/Economics.py | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index 5345eb98..5b924bb4 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -401,7 +401,7 @@ def __init__(self, model: Model): :return: None """ - model.logger.info("Init " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Init {__class__!s}: {sys._getframe().f_code.co_name}') # These dictionaries contain a list of all the parameters set in this object, stored as "Parameter" and # "OutputParameter" Objects. This will allow us later to access them in a user interface and get that list, @@ -1109,7 +1109,6 @@ def __init__(self, model: Model): ) self.CoolingStartPrice = self.ParameterDict[self.CoolingStartPrice.Name] = floatParameter( "Starting Cooling Sale Price", - value=0.025, DefaultValue=0.025, Min=0, Max=100, @@ -1119,7 +1118,6 @@ def __init__(self, model: Model): ) self.CoolingEndPrice = self.ParameterDict[self.CoolingEndPrice.Name] = floatParameter( "Ending Cooling Sale Price", - value=0.025, DefaultValue=0.025, Min=0, Max=100, @@ -1129,7 +1127,6 @@ def __init__(self, model: Model): ) self.CoolingEscalationStart = self.ParameterDict[self.CoolingEscalationStart.Name] = intParameter( "Cooling Escalation Start Year", - value=5, DefaultValue=5, AllowableRange=list(range(0, 101, 1)), UnitType=Units.TIME, @@ -1140,7 +1137,6 @@ def __init__(self, model: Model): ) self.CoolingEscalationRate = self.ParameterDict[self.CoolingEscalationRate.Name] = floatParameter( "Cooling Escalation Rate Per Year", - value=0.0, DefaultValue=0.0, Min=0.0, Max=100.0, @@ -1152,7 +1148,6 @@ def __init__(self, model: Model): ) self.CarbonStartPrice = self.ParameterDict[self.CarbonStartPrice.Name] = floatParameter( "Starting Carbon Credit Value", - value=0.0, DefaultValue=0.0, Min=0, Max=1000, @@ -1162,7 +1157,6 @@ def __init__(self, model: Model): ) self.CarbonEndPrice = self.ParameterDict[self.CarbonEndPrice.Name] = floatParameter( "Ending Carbon Credit Value", - value=0.0, DefaultValue=0.0, Min=0, Max=1000, @@ -1172,7 +1166,6 @@ def __init__(self, model: Model): ) self.CarbonEscalationStart = self.ParameterDict[self.CarbonEscalationStart.Name] = intParameter( "Carbon Escalation Start Year", - value=0, DefaultValue=0, AllowableRange=list(range(0, 101, 1)), UnitType=Units.TIME, @@ -1183,7 +1176,6 @@ def __init__(self, model: Model): ) self.CarbonEscalationRate = self.ParameterDict[self.CarbonEscalationRate.Name] = floatParameter( "Carbon Escalation Rate Per Year", - value=0.0, DefaultValue=0.0, Min=0.0, Max=100.0, @@ -1195,7 +1187,6 @@ def __init__(self, model: Model): ) self.GridCO2Intensity = self.ParameterDict[self.GridCO2Intensity.Name] = floatParameter( "Current Grid CO2 production", - value=0.93916924, DefaultValue=0.93916924, Min=0, Max=50000, @@ -1207,7 +1198,6 @@ def __init__(self, model: Model): ) self.NaturalGasCO2Intensity = self.ParameterDict[self.NaturalGasCO2Intensity.Name] = floatParameter( "CO2 produced by Natural Gas", - value=0.070324961, DefaultValue=0.070324961, Min=0, Max=50000, @@ -1278,7 +1268,6 @@ def __init__(self, model: Model): ) self.CAPEX_heat_electricity_plant_ratio = self.ParameterDict[self.CAPEX_heat_electricity_plant_ratio.Name] = floatParameter( "CHP Electrical Plant Cost Allocation Ratio", - value=-1.0, DefaultValue=-1.0, Min=0.0, Max=1.0, @@ -1579,7 +1568,7 @@ def __init__(self, model: Model): CurrentUnits=TimeUnit.YEAR ) - model.logger.info("Complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Complete {__class__!s}: {sys._getframe().f_code.co_name}') def read_parameters(self, model: Model) -> None: """ @@ -1597,7 +1586,7 @@ def read_parameters(self, model: Model) -> None: :type model: :class:`~geophires_x.Model.Model` :return: None """ - model.logger.info("Init " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Init {__class__!s}: {sys._getframe().f_code.co_name}') if len(model.InputParameters) > 0: # loop through all the parameters that the user wishes to set, looking for parameters that match this object @@ -1959,7 +1948,7 @@ def read_parameters(self, model: Model) -> None: self.DoSDACGTCalculations.value = True break - model.logger.info("complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'complete {__class__!s}: {sys._getframe().f_code.co_name}') def Calculate(self, model: Model) -> None: """ @@ -1977,7 +1966,7 @@ def Calculate(self, model: Model) -> None: :type model: :class:`~geophires_x.Model.Model` :return: Nothing, but it does make calculations and set values in the model """ - model.logger.info("Init " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'Init {__class__!s}: {sys._getframe().f_code.co_name}') # capital costs # well costs (using GeoVision drilling correlations). These are calculated whether totalcapcostvalid = 1 @@ -2583,7 +2572,7 @@ def Calculate(self, model: Model) -> None: # Calculate LCOE/LCOH self.LCOE.value, self.LCOH.value, self.LCOC.value = CalculateLCOELCOHLCOC(self, model) - model.logger.info("complete " + str(__class__) + ": " + sys._getframe().f_code.co_name) + model.logger.info(f'complete {__class__!s}: {sys._getframe().f_code.co_name}') def __str__(self): return "Economics" From a1424704b48c6d2275b7dc55074a695aac20923c Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:16:02 -0800 Subject: [PATCH 23/36] Delete stray HIP.html --- src/hip_ra/HIP.html | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 src/hip_ra/HIP.html diff --git a/src/hip_ra/HIP.html b/src/hip_ra/HIP.html deleted file mode 100644 index f201c25d..00000000 --- a/src/hip_ra/HIP.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - -
                               *********************
-                               ***HIP CASE REPORT***
-                               *********************
-                           ***SUMMARY OF RESULTS***
-      Reservoir Temperature:       250.00 degC
-      Reservoir Volume:             13.75 km**3
-      Stored Heat:               7.42e+15 kJ
-      Fluid Produced:            1.09e+12 kilogram
-      Enthalpy:                    181.43 kJ/kg
-      Wellhead Heat:             8.19e+14 kJ
-      Recovery Factor:              11.04 %
-      Available Heat:            1.44e+13 kJ
-      Producible Heat:           5.75e+12 kJ
-      Producible Electricity:      182.47 MW
-
- - From 307364214c7ddcb10ae91c1ffac91e65f3ea4e66 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:16:37 -0800 Subject: [PATCH 24/36] Tweak utils docs --- src/geophires_x/GeoPHIRESUtils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/geophires_x/GeoPHIRESUtils.py b/src/geophires_x/GeoPHIRESUtils.py index 9c604c70..33dcce1f 100644 --- a/src/geophires_x/GeoPHIRESUtils.py +++ b/src/geophires_x/GeoPHIRESUtils.py @@ -290,9 +290,9 @@ def entropy_water_kJ_per_kg_per_K(temperature_degC: float, pressure: Optional[Pl the entropy of water as a function of temperature in kJ/(kg·K) Raises: TypeError: If temperature is not a float or convertible to float. - ValueError: If temperature is not within the range of 0 to 373.946 degrees C. - + ValueError: If temperature and pressure combination are not within lookup range """ + try: temperature_degC = float(temperature_degC) except ValueError: @@ -320,8 +320,9 @@ def enthalpy_water_kJ_per_kg(temperature_degC: float, pressure: Optional[PlainQu the enthalpy of water as a function of temperature in kJ/kg Raises: TypeError: If temperature is not a float or convertible to float. - ValueError: If temperature is not within the range of 0 to 373.946 degrees C. + ValueError: If temperature and pressure combination are not within lookup range """ + try: temperature_degC = float(temperature_degC) except ValueError: From 2d5af8f54f8caa274ca6f099025fbdd30a03224d Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:16:56 -0800 Subject: [PATCH 25/36] Document commented WIP implementation for https://github.com/NREL/GEOPHIRES-X/issues/135\?title\=Colorized/enhanced+case+report in Outputs.py --- src/geophires_x/Outputs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 884d3b76..c06067f1 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -569,7 +569,7 @@ def PrintOutputs(self, model: Model): model.surfaceplant.HeatkWhExtracted.value[i]/1E6, model.surfaceplant.RemainingReservoirHeatContent.value[i], (model.reserv.InitialReservoirHeatContent.value-model.surfaceplant.RemainingReservoirHeatContent.value[i])*100/model.reserv.InitialReservoirHeatContent.value)+NL) - + # https://github.com/NREL/GEOPHIRES-X/issues/135?title=Colorized/enhanced+case+report # import rich # from rich.console import Console # from rich.table import Table From 8a9a89c94d0a8e1a3c01d77762a44fc14a427a45 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 09:59:37 -0800 Subject: [PATCH 26/36] Align LCOE output spaces --- src/geophires_x/Outputs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index c06067f1..247cd58c 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -132,7 +132,7 @@ def PrintOutputs(self, model: Model): f.write(f" Average Cooling Production: {np.average(model.surfaceplant.cooling_produced.value):10.2f} " + model.surfaceplant.cooling_produced.CurrentUnits.value + NL) if model.surfaceplant.enduse_option.value in [EndUseOptions.ELECTRICITY]: - f.write(f" Electricity breakeven price: {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) + f.write(f" Electricity breakeven price: {model.economics.LCOE.value:10.2f} " + model.economics.LCOE.CurrentUnits.value + NL) elif model.surfaceplant.enduse_option.value in [EndUseOptions.HEAT] and \ model.surfaceplant.plant_type.value not in [PlantType.ABSORPTION_CHILLER]: f.write(f" Direct-Use heat breakeven price (LCOH): {model.economics.LCOH.value:10.2f} " + model.economics.LCOH.CurrentUnits.value + NL) From 4d98df781d22f58fa83b9bb174f0f2be631fd453 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:07:10 -0800 Subject: [PATCH 27/36] Account for LCOH-suffixed direct-use heat property name change --- src/geophires_x_client/geophires_x_result.py | 14 ++++++++++---- tests/test_geophires_x_client.py | 10 ++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index dce5e802..52f38fe4 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -31,6 +31,7 @@ class GeophiresXResult: 'Electricity breakeven price', 'Average Direct-Use Heat Production', 'Direct-Use heat breakeven price', + 'Direct-Use heat breakeven price (LCOH)', 'Annual District Heating Demand', 'Average Cooling Production', 'Average Annual Geothermal Heat Production', @@ -333,10 +334,15 @@ def __init__(self, output_file_path, logger_name='root'): @property def direct_use_heat_breakeven_price_USD_per_MMBTU(self): summary = self.result['SUMMARY OF RESULTS'] - if 'Direct-Use heat breakeven price' in summary and summary['Direct-Use heat breakeven price'] is not None: - return summary['Direct-Use heat breakeven price']['value'] - else: - return None + + # LCOH suffix added in 49ff3a1213ac778ed53120626807e9a680d1ddcf, + # check for either (could be reading result generated prior to addition of suffix) + field_names = ['Direct-Use heat breakeven price', 'Direct-Use heat breakeven price (LCOH)'] + for field_name in field_names: + if field_name in summary and summary[field_name] is not None: + return summary[field_name]['value'] + + return None def as_csv(self) -> str: f = StringIO() diff --git a/tests/test_geophires_x_client.py b/tests/test_geophires_x_client.py index 758a8b0e..336e37a9 100644 --- a/tests/test_geophires_x_client.py +++ b/tests/test_geophires_x_client.py @@ -75,6 +75,16 @@ def test_geophires_x_result_4(self): == 'MUSD/yr' ) + def test_direct_use_heat_property(self): + test_result_path = self._get_test_file_path('examples/example12_DH.out') + result = GeophiresXResult(test_result_path) + + with open(test_result_path) as f: + self.assertIn('Direct-Use heat breakeven price (LCOH)', f.read()) + + # Don't care about the value in this test - just that it's being read with the (LCOH)-suffixed name + self.assertIsNotNone(result.direct_use_heat_breakeven_price_USD_per_MMBTU) + def test_example_multiple_gradients_result(self): test_result_path = self._get_test_file_path('examples/example_multiple_gradients.out') result = GeophiresXResult(test_result_path) From 490d3fe660709ba23e02eb526b89f29255837e26 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:23:12 -0800 Subject: [PATCH 28/36] Re-add erroneously removed type in method doc --- src/geophires_x/GeoPHIRESUtils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geophires_x/GeoPHIRESUtils.py b/src/geophires_x/GeoPHIRESUtils.py index 33dcce1f..d1d4b10e 100644 --- a/src/geophires_x/GeoPHIRESUtils.py +++ b/src/geophires_x/GeoPHIRESUtils.py @@ -474,7 +474,7 @@ def static_pressure_MPa(rho_kg_per_m3: float, depth_m: float) -> float: rho_kg_per_m3 (float): Density of the fluid in kg/m^3. depth_m (float): Depth of the reservoir in meters. Returns: - Static pressure in megapascals (MPa). + float: Static pressure in megapascals (MPa). """ g = scipy.constants.g # Acceleration due to gravity (m/s^2) From 469b29864f83fb3467138eb6f59923c02110fd7a Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 10:54:38 -0800 Subject: [PATCH 29/36] Render projects with no payback period as N/A instead of 0.00 yr --- src/geophires_x/Outputs.py | 7 ++++++- .../Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out | 8 ++++---- tests/examples/example1.out | 8 ++++---- tests/examples/example13.out | 4 ++-- tests/examples/example4.out | 6 +++--- tests/examples/example9.out | 8 ++++---- tests/examples/example_multiple_gradients.out | 8 ++++---- 7 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index 247cd58c..703e6c2c 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -181,7 +181,12 @@ def PrintOutputs(self, model: Model): f.write(f" Project IRR: {model.economics.ProjectIRR.value:10.2f} " + model.economics.ProjectIRR.PreferredUnits.value + NL) f.write(f" Project VIR=PI=PIR: {model.economics.ProjectVIR.value:10.2f}" + NL) f.write(f" Project MOIC: {model.economics.ProjectMOIC.value:10.2f}" + NL) - f.write(f" Project Payback Period: {model.economics.ProjectPaybackPeriod.value:10.2f} " + model.economics.ProjectPaybackPeriod.PreferredUnits.value + NL) + + payback_period_val = model.economics.ProjectPaybackPeriod.value + project_payback_period_display = f'{payback_period_val:10.2f} {model.economics.ProjectPaybackPeriod.PreferredUnits.value}' \ + if payback_period_val > 0.0 else 'N/A' + f.write(f' Project Payback Period: {project_payback_period_display}\n') + if model.surfaceplant.enduse_option.value in [EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_BOTTOMING_EXTRA_HEAT, EndUseOptions.COGENERATION_PARALLEL_EXTRA_HEAT, diff --git a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out index a628e047..a27a1c19 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -7,14 +7,14 @@ Simulation Metadata GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 Simulation Date: 2024-03-04 - Simulation Time: 08:44 - Calculation Time: 1.673 sec + Simulation Time: 10:52 + Calculation Time: 1.689 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.10 MW - Electricity breakeven price: 44.08 cents/kWh + Electricity breakeven price: 44.08 cents/kWh Number of production wells: 1 Number of injection wells: 0 Flowrate per production well: 110.0 kg/sec @@ -32,7 +32,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.02 Project MOIC: -0.72 - Project Payback Period: 0.00 yr + Project Payback Period: N/A ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example1.out b/tests/examples/example1.out index 2abae0cf..faa07b07 100644 --- a/tests/examples/example1.out +++ b/tests/examples/example1.out @@ -7,14 +7,14 @@ Simulation Metadata GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 Simulation Date: 2024-03-04 - Simulation Time: 08:43 - Calculation Time: 0.617 sec + Simulation Time: 10:53 + Calculation Time: 0.628 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.21 MW - Electricity breakeven price: 43.69 cents/kWh + Electricity breakeven price: 43.69 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -33,7 +33,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.22 Project MOIC: -0.84 - Project Payback Period: 0.00 yr + Project Payback Period: N/A ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example13.out b/tests/examples/example13.out index 97f4e3d2..84e86af9 100644 --- a/tests/examples/example13.out +++ b/tests/examples/example13.out @@ -7,7 +7,7 @@ Simulation Metadata GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 Simulation Date: 2024-03-04 - Simulation Time: 08:43 + Simulation Time: 10:53 Calculation Time: 0.044 sec ***SUMMARY OF RESULTS*** @@ -35,7 +35,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.26 Project MOIC: -0.62 - Project Payback Period: 0.00 yr + Project Payback Period: N/A CHP: Percent cost allocation for electrical plant: 60.94% ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example4.out b/tests/examples/example4.out index f291ea4b..93ac1d0a 100644 --- a/tests/examples/example4.out +++ b/tests/examples/example4.out @@ -7,14 +7,14 @@ Simulation Metadata GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 Simulation Date: 2024-03-04 - Simulation Time: 08:43 + Simulation Time: 10:53 Calculation Time: 0.062 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: -0.57 MW - Electricity breakeven price: -244.32 cents/kWh + Electricity breakeven price: -244.32 cents/kWh Number of production wells: 3 Number of injection wells: 2 Flowrate per production well: 110.0 kg/sec @@ -32,7 +32,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.45 Project MOIC: -1.07 - Project Payback Period: 0.00 yr + Project Payback Period: N/A ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example9.out b/tests/examples/example9.out index ee69af2f..8be1d31e 100644 --- a/tests/examples/example9.out +++ b/tests/examples/example9.out @@ -7,14 +7,14 @@ Simulation Metadata GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 Simulation Date: 2024-03-04 - Simulation Time: 08:43 - Calculation Time: 0.610 sec + Simulation Time: 10:53 + Calculation Time: 0.624 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 0.47 MW - Electricity breakeven price: 50.18 cents/kWh + Electricity breakeven price: 50.18 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 40.0 kg/sec @@ -33,7 +33,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.13 Project MOIC: -0.85 - Project Payback Period: 0.00 yr + Project Payback Period: N/A ***ENGINEERING PARAMETERS*** diff --git a/tests/examples/example_multiple_gradients.out b/tests/examples/example_multiple_gradients.out index a5b38a97..a7fc441d 100644 --- a/tests/examples/example_multiple_gradients.out +++ b/tests/examples/example_multiple_gradients.out @@ -7,14 +7,14 @@ Simulation Metadata GEOPHIRES Version: 3.4.12 GEOPHIRES Build Date: 2022-06-30 Simulation Date: 2024-03-04 - Simulation Time: 08:44 - Calculation Time: 0.614 sec + Simulation Time: 10:53 + Calculation Time: 0.623 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.90 MW - Electricity breakeven price: 39.29 cents/kWh + Electricity breakeven price: 39.29 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 60.0 kg/sec @@ -39,7 +39,7 @@ Simulation Metadata Project IRR: 0.00 % Project VIR=PI=PIR: -0.18 Project MOIC: -0.82 - Project Payback Period: 0.00 yr + Project Payback Period: N/A ***ENGINEERING PARAMETERS*** From 2d635a6234d5497bd614d232ca64c447a7ed89dd Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:02:34 -0800 Subject: [PATCH 30/36] Add payback period & chp cost allocation fields to client result --- src/geophires_x_client/geophires_x_result.py | 5 +++-- tests/example1_addons.csv | 1 + tests/test_geophires_x_client.py | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index 52f38fe4..19146d9f 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -65,8 +65,9 @@ class GeophiresXResult: 'Project IRR', 'Project VIR=PI=PIR', 'Project MOIC', - # SUTRA - 'Fixed Charge Rate (FCR)', + 'Fixed Charge Rate (FCR)', # SUTRA + 'Project Payback Period', + 'CHP: Percent cost allocation for electrical plant', ], 'EXTENDED ECONOMICS': [ 'Adjusted Project LCOE (after incentives, grants, AddOns,etc)', diff --git a/tests/example1_addons.csv b/tests/example1_addons.csv index 73397da1..c78a3d33 100644 --- a/tests/example1_addons.csv +++ b/tests/example1_addons.csv @@ -15,6 +15,7 @@ ECONOMIC PARAMETERS,Project IRR,,4.49,% ECONOMIC PARAMETERS,Project VIR=PI=PIR,,0.81, ECONOMIC PARAMETERS,Project MOIC,,3.48, ECONOMIC PARAMETERS,Fixed Charge Rate (FCR),,5.0, +ECONOMIC PARAMETERS,Project Payback Period,,17.7,yr EXTENDED ECONOMICS,"Adjusted Project LCOE (after incentives\, grants\, AddOns\,etc)",,8.7,cents/kWh EXTENDED ECONOMICS,"Adjusted Project LCOH (after incentives\, grants\, AddOns\,etc)",,0.0,USD/MMBTU EXTENDED ECONOMICS,"Adjusted Project CAPEX (after incentives\, grants\, AddOns\, etc)",,102.63,MUSD diff --git a/tests/test_geophires_x_client.py b/tests/test_geophires_x_client.py index 336e37a9..02130e83 100644 --- a/tests/test_geophires_x_client.py +++ b/tests/test_geophires_x_client.py @@ -445,8 +445,8 @@ def assert_csv_equal(case_report_file_path, expected_csv_file_path): self.assertFileContentsEqual(self._get_test_file_path(expected_csv_file_path), result_file) for case in [ - ('geophires-result_example-3.out', 'geophires-result_example-3.csv'), ('examples/example1_addons.out', 'example1_addons.csv'), + ('geophires-result_example-3.out', 'geophires-result_example-3.csv'), ]: with self.subTest(msg=case[0]): assert_csv_equal(case[0], case[1]) From 3acd94b9bea8dd08a7f116d36d3bf5a3d46de05d Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:08:07 -0800 Subject: [PATCH 31/36] Update schema-generated geophires-request.json --- .../geophires-request.json | 212 ++++++++++++------ 1 file changed, 139 insertions(+), 73 deletions(-) diff --git a/src/geophires_x_schema_generator/geophires-request.json b/src/geophires_x_schema_generator/geophires-request.json index 256efd7d..02c679e9 100644 --- a/src/geophires_x_schema_generator/geophires-request.json +++ b/src/geophires_x_schema_generator/geophires-request.json @@ -67,13 +67,13 @@ "Gradients": { "description": "Geothermal gradients", "type": "number", - "units": "degC/km", + "units": "degC/m", "category": "Reservoir" }, "Gradient 1": { "description": "Geothermal gradient 1 in rock segment 1", "type": "number", - "units": "degC/km", + "units": "degC/m", "category": "Reservoir" }, "Gradient 2": { @@ -227,7 +227,7 @@ "category": "Reservoir" }, "Cylindrical Reservoir Output Depth": { - "description": "Depth of the outflow end of a cyclindrical reservoir", + "description": "Depth of the outflow end of a cylindrical reservoir", "type": "number", "units": "kilometer", "category": "Reservoir" @@ -431,7 +431,7 @@ "category": "Surface Plant" }, "Power Plant Type": { - "description": "Specify the type of power plant in case of electricity generation. 1: Subcritical ORC, 2: Supercritical ORC, 3: Single-flash, 4: Double-flash", + "description": "Specify the type of physical plant. 1: Subcritical ORC, 2: Supercritical ORC, 3: Single-flash, 4: Double-flash, 5: Absorption Chiller, 6: Heat Pump 7: District Heating, 8: Reservoir Thermal Energy Storage", "type": "integer", "units": null, "category": "Surface Plant" @@ -506,73 +506,7 @@ "description": "Number of years spent in construction (assumes whole years, no fractions)", "type": "integer", "units": null, - "category": "Surface Plant" - }, - "Absorption Chiller COP": { - "description": "Specify the coefficient of performance (COP) of the absorption chiller", - "type": "number", - "units": "", - "category": "Surface Plant" - }, - "Heat Pump COP": { - "description": "Specify the coefficient of performance (COP) of the heat pump", - "type": "number", - "units": "", - "category": "Surface Plant" - }, - "District Heating Demand Option": { - "description": "Select the method to provide the district heating demand to GEOPHIRES", - "type": "integer", - "units": null, - "category": "Surface Plant" - }, - "District Heating Demand File Name": { - "description": "Provide district heating demand in csv file in MW or MWh per day (if district heating demand option is set to 1)", - "type": "string", - "units": null, - "category": "Surface Plant" - }, - "District Heating Demand Data Time Resolution": { - "description": "Provide time interval for thermal demand data: 1 = hourly (data provided as MW = MWh' 2 = daily (data provided as MWh/day) (if district heating demand option is set to 1)", - "type": "integer", - "units": null, - "category": "Surface Plant" - }, - "District Heating Demand Data Column Number": { - "description": "Select the column number of the hourly or daily data in the district heating demand csv file (if district heating demand option is set to 1)", - "type": "integer", - "units": null, - "category": "Surface Plant" - }, - "Temperature File Name": { - "description": "Provide filename of tempeature file with hourly temperature to calculate district heating demand (if district heating demand option is set to 2)", - "type": "string", - "units": null, - "category": "Surface Plant" - }, - "Temperature Data Column Number": { - "description": "Select the column number of the hourly temperature data in the temperature csv file (if district heating demand option is set to 2)", - "type": "integer", - "units": null, - "category": "Surface Plant" - }, - "Number of Housing Units": { - "description": "Specify the number of housing units to calculate district heating demand (if district heating demand option is set to 2)", - "type": "number", - "units": null, - "category": "Surface Plant" - }, - "Constant Anchor Demand": { - "description": "Specify the constant anchor demand to calculate the district heating demand (if district heating demand option is set to 2)", - "type": "number", - "units": "MW", - "category": "Surface Plant" - }, - "US Census Division": { - "description": "Select the U.S. census division to calculate district heating demand (if district heating demand option is set to 2)", - "type": "integer", - "units": null, - "category": "Surface Plant" + "category": "Economics" }, "Dead-state Pressure": { "description": "", @@ -808,8 +742,8 @@ "units": null, "category": "Economics" }, - "Do CCUS Calculations": { - "description": "Set to true if you want the CCUS economics calculations to be made", + "Do Carbon Price Calculations": { + "description": "Set to true if you want the Carbon Credit economics calculations to be made", "type": "boolean", "units": null, "category": "Economics" @@ -952,6 +886,66 @@ "units": "USD/kWh", "category": "Economics" }, + "Starting Cooling Sale Price": { + "description": "", + "type": "number", + "units": "USD/kWh", + "category": "Economics" + }, + "Ending Cooling Sale Price": { + "description": "", + "type": "number", + "units": "USD/kWh", + "category": "Economics" + }, + "Cooling Escalation Start Year": { + "description": "Number of years after start of project before start of escalation", + "type": "integer", + "units": "yr", + "category": "Economics" + }, + "Cooling Escalation Rate Per Year": { + "description": "additional cost per year of price after escalation starts", + "type": "number", + "units": "USD/kWh", + "category": "Economics" + }, + "Starting Carbon Credit Value": { + "description": "", + "type": "number", + "units": "USD/lb", + "category": "Economics" + }, + "Ending Carbon Credit Value": { + "description": "", + "type": "number", + "units": "USD/lb", + "category": "Economics" + }, + "Carbon Escalation Start Year": { + "description": "Number of years after start of project before start of Carbon incentives", + "type": "integer", + "units": "yr", + "category": "Economics" + }, + "Carbon Escalation Rate Per Year": { + "description": "additional value per year of price after escalation starts", + "type": "number", + "units": "USD/lb", + "category": "Economics" + }, + "Current Grid CO2 production": { + "description": "CO2 intensity of the grid (how much CO2 is produced per kWh of electricity produced (0.93916924 lbs/kWh for Texas ERCOT))", + "type": "number", + "units": "lbs/kWh", + "category": "Economics" + }, + "CO2 produced by Natural Gas": { + "description": "CO2 intensity of buring natural gas (how much CO2 is produced per kWh of heat produced (0.407855 lbs/kWh))", + "type": "number", + "units": "lbs/kWh", + "category": "Economics" + }, "Annual License Fees Etc": { "description": "", "type": "number", @@ -988,6 +982,12 @@ "units": "%", "category": "Economics" }, + "CHP Electrical Plant Cost Allocation Ratio": { + "description": "CHP Electrical Plant Cost Allocation Ratio (cost electrical plant/total CAPEX)", + "type": "number", + "units": "", + "category": "Economics" + }, "Operation & Maintenance Cost of Surface Plant": { "description": "", "type": "number", @@ -1005,6 +1005,72 @@ "type": "number", "units": "USD/kW", "category": "Economics" + }, + "Do CCUS Calculations": { + "description": "Set to true if you want the CCUS economics calculations to be made", + "type": "boolean", + "units": null, + "category": "Economics" + }, + "Ending CCUS Credit Value": { + "description": "", + "type": "number", + "units": "USD/lb", + "category": "Economics" + }, + "CCUS Escalation Start Year": { + "description": "Number of years after start of project before start of CCUS incentives", + "type": "integer", + "units": "yr", + "category": "Economics" + }, + "CCUS Escalation Rate Per Year": { + "description": "additional value per year of price after escalation starts", + "type": "number", + "units": "USD/mt", + "category": "Economics" + }, + "Starting CCUS Credit Value": { + "description": "", + "type": "number", + "units": "USD/mt", + "category": "Economics" + }, + "AddOn Nickname": { + "description": "", + "type": "array", + "units": null, + "category": "Economics" + }, + "AddOn CAPEX": { + "description": "", + "type": "array", + "units": "MUSD", + "category": "Economics" + }, + "AddOn OPEX": { + "description": "", + "type": "array", + "units": "MUSD/yr", + "category": "Economics" + }, + "AddOn Electricity Gained": { + "description": "", + "type": "array", + "units": "kW/yr", + "category": "Economics" + }, + "AddOn Heat Gained": { + "description": "", + "type": "array", + "units": "kW/yr", + "category": "Economics" + }, + "AddOn Profit Gained": { + "description": "", + "type": "array", + "units": "MUSD/yr", + "category": "Economics" } } } From 09390a89848c591a78854a3b76584ed58877a60c Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 11:12:30 -0800 Subject: [PATCH 32/36] Mark backwards-compatible CCUS profile transform as FIXME TODO instead of WIP --- src/geophires_x_client/geophires_x_result.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/geophires_x_client/geophires_x_result.py b/src/geophires_x_client/geophires_x_result.py index 19146d9f..c75f0479 100644 --- a/src/geophires_x_client/geophires_x_result.py +++ b/src/geophires_x_client/geophires_x_result.py @@ -538,7 +538,10 @@ def extract_table_header(lines: list) -> list: return None def _get_ccus_profile(self): - """FIXME transform from Revenue & Cashflow profile if not present in output file""" + """ + FIXME TODO - transform from revenue & cashflow if present (CCUS profile replaced by revenue & cashflow + profile in 49ff3a1213ac778ed53120626807e9a680d1ddcf) + """ def extract_table_header(lines: list) -> list: # Tried various regexy approaches to extract this programmatically but landed on hard-coding. @@ -560,10 +563,7 @@ def extract_table_header(lines: list) -> list: return profile except BaseException as e: self._logger.debug(f'Failed to get CCUS profile: {e}') - - # raise NotImplementedError('FIXME WIP - transform from REVENUE & CASHFLOW') - self._logger.error('WIP - CCUS profile not implemented yet') - # return None + return None def _extract_addons_style_table_data(self, lines: list): """TODO consolidate with _get_data_from_profile_lines""" From e90b5f419ca6eb0970ab1d04d46fc4e90cdabae3 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:28:04 -0800 Subject: [PATCH 33/36] =?UTF-8?q?Bump=20version:=203.4.12=20=E2=86=92=203.?= =?UTF-8?q?4.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- .cookiecutterrc | 2 +- README.rst | 4 ++-- docs/conf.py | 2 +- setup.py | 2 +- src/geophires_x/__init__.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index b06033c7..0dd16b1d 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.4.12 +current_version = 3.4.13 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index 13845892..bcf466cd 100644 --- a/.cookiecutterrc +++ b/.cookiecutterrc @@ -54,7 +54,7 @@ default_context: sphinx_doctest: "no" sphinx_theme: "sphinx-py3doc-enhanced-theme" test_matrix_separate_coverage: "no" - version: 3.4.12 + version: 3.4.13 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/README.rst b/README.rst index 6b6e5380..82c5cb4e 100644 --- a/README.rst +++ b/README.rst @@ -47,9 +47,9 @@ Free software: `MIT license `__ :alt: Supported implementations :target: https://pypi.org/project/geophires-x -.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.4.12.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.4.13.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.4.12...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.4.13...main .. |docs| image:: https://readthedocs.org/projects/GEOPHIRES-X/badge/?style=flat :target: https://nrel.github.io/GEOPHIRES-X diff --git a/docs/conf.py b/docs/conf.py index 2b3043cf..9df396ee 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2023' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.4.12' +version = release = '3.4.13' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index e3220038..bf3f56f8 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.4.12', + version='3.4.13', license='MIT', description='GEOPHIRES is a free and open-source geothermal techno-economic simulator.', long_description='{}\n{}'.format( diff --git a/src/geophires_x/__init__.py b/src/geophires_x/__init__.py index dd19fd88..23bdbfcc 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.4.12' +__version__ = '3.4.13' From b1203f8982b6bfbb3b35f216e3fa822a0fa66bd8 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:28:51 -0800 Subject: [PATCH 34/36] =?UTF-8?q?Bump=20version:=203.4.13=20=E2=86=92=203.?= =?UTF-8?q?4.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- .cookiecutterrc | 2 +- README.rst | 4 ++-- docs/conf.py | 2 +- setup.py | 2 +- src/geophires_x/__init__.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 0dd16b1d..cc5476aa 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.4.13 +current_version = 3.4.14 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index bcf466cd..8db3e13c 100644 --- a/.cookiecutterrc +++ b/.cookiecutterrc @@ -54,7 +54,7 @@ default_context: sphinx_doctest: "no" sphinx_theme: "sphinx-py3doc-enhanced-theme" test_matrix_separate_coverage: "no" - version: 3.4.13 + version: 3.4.14 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/README.rst b/README.rst index 82c5cb4e..9abe380c 100644 --- a/README.rst +++ b/README.rst @@ -47,9 +47,9 @@ Free software: `MIT license `__ :alt: Supported implementations :target: https://pypi.org/project/geophires-x -.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.4.13.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.4.14.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.4.13...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.4.14...main .. |docs| image:: https://readthedocs.org/projects/GEOPHIRES-X/badge/?style=flat :target: https://nrel.github.io/GEOPHIRES-X diff --git a/docs/conf.py b/docs/conf.py index 9df396ee..591a8d43 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2023' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.4.13' +version = release = '3.4.14' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index bf3f56f8..cc11d589 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.4.13', + version='3.4.14', license='MIT', description='GEOPHIRES is a free and open-source geothermal techno-economic simulator.', long_description='{}\n{}'.format( diff --git a/src/geophires_x/__init__.py b/src/geophires_x/__init__.py index 23bdbfcc..a7b95720 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.4.13' +__version__ = '3.4.14' From 4b61bef497392eab1114b90f5f2dfe9872f9179d Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:42:07 -0800 Subject: [PATCH 35/36] Add py39 windows action - there are active contributors with this platform/version --- .github/workflows/github-actions.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 23850ecc..1edbcc9d 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -50,6 +50,12 @@ jobs: python_arch: 'x64' tox_env: 'py39' os: 'macos-latest' + - name: 'py39 (windows)' + python: '3.9' + toxpython: 'python3.9' + python_arch: 'x64' + tox_env: 'py39' + os: 'windows-latest' - name: 'py310 (ubuntu)' python: '3.10' toxpython: 'python3.10' From 049ad37661f791e7acf3cda1fe3e26c98c706095 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 4 Mar 2024 12:59:06 -0800 Subject: [PATCH 36/36] Use windows over mac for python versions other than 3.11 - mac is more likely to be redundant with (still-existing) ubuntu tests, and consumes disproportionately more GH Actions credits that delay PR actions, and windows has more GEOPHIRES contributors & users than mac --- .github/workflows/github-actions.yml | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 1edbcc9d..f6122166 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -32,24 +32,12 @@ jobs: python_arch: 'x64' tox_env: 'py38' os: 'ubuntu-latest' - - name: 'py38 (macos)' - python: '3.8' - toxpython: 'python3.8' - python_arch: 'x64' - tox_env: 'py38' - os: 'macos-latest' - name: 'py39 (ubuntu)' python: '3.9' toxpython: 'python3.9' python_arch: 'x64' tox_env: 'py39' os: 'ubuntu-latest' - - name: 'py39 (macos)' - python: '3.9' - toxpython: 'python3.9' - python_arch: 'x64' - tox_env: 'py39' - os: 'macos-latest' - name: 'py39 (windows)' python: '3.9' toxpython: 'python3.9' @@ -62,12 +50,12 @@ jobs: python_arch: 'x64' tox_env: 'py310' os: 'ubuntu-latest' - - name: 'py310 (macos)' + - name: 'py310 (windows)' python: '3.10' toxpython: 'python3.10' python_arch: 'x64' tox_env: 'py310' - os: 'macos-latest' + os: 'windows-latest' - name: 'py311 (ubuntu)' python: '3.11' toxpython: 'python3.11'