From 66c9fe5550e6a17426468b4ff1210819d80603e7 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:51:40 -0800 Subject: [PATCH 01/15] Adjust dx passed to trapz if last slice has fewer timesteps in heat kWh integration (WIP) --- src/geophires_x/SurfacePlant.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index 149bd0d79..76c737f96 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -177,8 +177,9 @@ def annual_electricity_pumping_power(self, plant_lifetime: int, enduse_option: E HeatkWhProduced = np.zeros(plant_lifetime) for i in range(0, plant_lifetime): - HeatkWhExtracted[i] = np.trapz(HeatExtracted[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1], - dx = 1. / timestepsperyear * 365. * 24.) * 1000. * utilization_factor + heat_extracted_slice = HeatExtracted[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1] + HeatkWhExtracted[i] = np.trapz(heat_extracted_slice, + dx = 1. / (len(heat_extracted_slice)-1) * 365. * 24.) * 1000. * utilization_factor PumpingkWh[i] = np.trapz(PumpingPower[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1], dx = 1. / timestepsperyear * 365. * 24.) * 1000. * utilization_factor From fa14f39cad33d036383ff40c8e000630c58cec22 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 11:14:57 -0800 Subject: [PATCH 02/15] Adjust dx for slice size for all integrations in SurfacePlant.annual_electricity_pumping_power. FIXME TODO WIP marked for remaining integrations to adjust. --- src/geophires_x/SurfacePlant.py | 34 +++++++++++-------- src/geophires_x/SurfacePlantAGS.py | 2 ++ .../SurfacePlantAbsorptionChiller.py | 3 ++ .../SurfacePlantDistrictHeating.py | 2 ++ src/geophires_x/SurfacePlantHeatPump.py | 3 ++ src/geophires_x/SurfacePlantIndustrialHeat.py | 2 ++ 6 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index 76c737f96..a0089694e 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -152,15 +152,15 @@ def electricity_heat_production(self, enduse_option: EndUseOptions, availability return ElectricityProduced, HeatExtracted, HeatProduced, HeatExtractedTowardsElectricity - def annual_electricity_pumping_power(self, plant_lifetime: int, enduse_option: EndUseOptions, HeatExtracted: np.ndarray, - timestepsperyear: np.ndarray, utilization_factor: float, PumpingPower: np.ndarray, + def annual_electricity_pumping_power(self, plant_lifetime: int,enduse_option: EndUseOptions, HeatExtracted: np.ndarray, + time_steps_per_year: int, utilization_factor: float, PumpingPower: np.ndarray, ElectricityProduced: np.ndarray, NetElectricityProduced: np.ndarray, HeatProduced: np.ndarray) -> tuple: """ Calculate annual electricity/heat production :param plant_lifetime: plant lifetime :param enduse_option: end-use option :param HeatExtracted: heat extracted - :param timestepsperyear: timesteps per year + :param time_steps_per_year: time steps per year :param utilization_factor: utilization factor :param PumpingPower: pumping power :param ElectricityProduced: electricity produced @@ -176,12 +176,20 @@ def annual_electricity_pumping_power(self, plant_lifetime: int, enduse_option: E NetkWhProduced = np.zeros(plant_lifetime) HeatkWhProduced = np.zeros(plant_lifetime) + def integrate_slice(series: np.ndarray, _i: int) -> np.float64: + _slice = series[(0 + _i * time_steps_per_year):((_i + 1) * time_steps_per_year) + 1] + + # Note that len(_slice) - 1 may be less than time_steps_per_year for the last slice. + + return np.trapz( + _slice, + dx=1. / (len(_slice) - 1) * 365. * 24. + ) * 1000. * utilization_factor + for i in range(0, plant_lifetime): - heat_extracted_slice = HeatExtracted[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1] - HeatkWhExtracted[i] = np.trapz(heat_extracted_slice, - dx = 1. / (len(heat_extracted_slice)-1) * 365. * 24.) * 1000. * utilization_factor - PumpingkWh[i] = np.trapz(PumpingPower[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1], - dx = 1. / timestepsperyear * 365. * 24.) * 1000. * utilization_factor + HeatkWhExtracted[i] = integrate_slice(HeatExtracted, i) + PumpingkWh[i] = integrate_slice(PumpingPower, i) + if enduse_option in [EndUseOptions.ELECTRICITY, EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, EndUseOptions.COGENERATION_TOPPING_EXTRA_ELECTRICITY, @@ -193,16 +201,14 @@ def annual_electricity_pumping_power(self, plant_lifetime: int, enduse_option: E TotalkWhProduced = np.zeros(plant_lifetime) NetkWhProduced = np.zeros(plant_lifetime) for i in range(0, plant_lifetime): - TotalkWhProduced[i] = np.trapz(ElectricityProduced[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1], - dx=1. / timestepsperyear * 365. * 24.) * 1000. * utilization_factor - NetkWhProduced[i] = np.trapz(NetElectricityProduced[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1], - dx=1. / timestepsperyear * 365. * 24.) * 1000. * utilization_factor + TotalkWhProduced[i] = integrate_slice(ElectricityProduced, i) + NetkWhProduced[i] = integrate_slice(NetElectricityProduced, i) + if enduse_option is not EndUseOptions.ELECTRICITY: # all those end-use options have a direct-use component HeatkWhProduced = np.zeros(plant_lifetime) for i in range(0, plant_lifetime): - HeatkWhProduced[i] = np.trapz(HeatProduced[(0 + i * timestepsperyear):((i + 1) * timestepsperyear) + 1], - dx=1. / timestepsperyear * 365. * 24.) * 1000. * utilization_factor + HeatkWhProduced[i] = integrate_slice(HeatProduced, i) return HeatkWhExtracted, PumpingkWh, TotalkWhProduced, NetkWhProduced, HeatkWhProduced diff --git a/src/geophires_x/SurfacePlantAGS.py b/src/geophires_x/SurfacePlantAGS.py index ee666e015..95bd50ffc 100644 --- a/src/geophires_x/SurfacePlantAGS.py +++ b/src/geophires_x/SurfacePlantAGS.py @@ -739,6 +739,7 @@ def Calculate(self, model: Model) -> None: # useful direct-use heat provided to application [MWth] self.HeatProduced.value = self.HeatExtracted.value * self.enduseefficiencyfactor.value for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ (i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], @@ -754,6 +755,7 @@ def Calculate(self, model: Model) -> None: if self.End_use is not EndUseOptions.ELECTRICITY: self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], diff --git a/src/geophires_x/SurfacePlantAbsorptionChiller.py b/src/geophires_x/SurfacePlantAbsorptionChiller.py index faf17757c..b0a557b93 100644 --- a/src/geophires_x/SurfacePlantAbsorptionChiller.py +++ b/src/geophires_x/SurfacePlantAbsorptionChiller.py @@ -115,6 +115,7 @@ def Calculate(self, model: Model) -> None: self.PumpingkWh.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], @@ -126,6 +127,7 @@ def Calculate(self, model: Model) -> None: self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], @@ -133,6 +135,7 @@ def Calculate(self, model: Model) -> None: self.cooling_kWh_Produced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.cooling_kWh_Produced.value[i] = np.trapz(self.cooling_produced.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], diff --git a/src/geophires_x/SurfacePlantDistrictHeating.py b/src/geophires_x/SurfacePlantDistrictHeating.py index a4a9e8b4d..57fbabd31 100644 --- a/src/geophires_x/SurfacePlantDistrictHeating.py +++ b/src/geophires_x/SurfacePlantDistrictHeating.py @@ -217,6 +217,7 @@ def Calculate(self, model: Model) -> None: for i in range(0, self.plant_lifetime.value): if self.plant_type.value == PlantType.DISTRICT_HEATING: # for district heating, we have a util_factor_array + # FIXME TODO WIP adjust dx for slice size self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], @@ -228,6 +229,7 @@ def Calculate(self, model: Model) -> None: dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * \ self.util_factor_array.value[i] else: + # FIXME TODO WIP adjust dx for slice size self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], diff --git a/src/geophires_x/SurfacePlantHeatPump.py b/src/geophires_x/SurfacePlantHeatPump.py index 35741df81..2fbd5da6f 100644 --- a/src/geophires_x/SurfacePlantHeatPump.py +++ b/src/geophires_x/SurfacePlantHeatPump.py @@ -116,15 +116,18 @@ def Calculate(self, model: Model) -> None: self.PumpingkWh.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[(0 + i * model.economics.timestepsperyear.value):((i + 1) * model.economics.timestepsperyear.value) + 1],dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value self.PumpingkWh.value[i] = np.trapz(model.wellbores.PumpingPower.value[(0 + i * model.economics.timestepsperyear.value):((i + 1) * model.economics.timestepsperyear.value) + 1],dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[(0+i*model.economics.timestepsperyear.value):((i+1)*model.economics.timestepsperyear.value)+1],dx = 1./model.economics.timestepsperyear.value*365.*24.)*1000.*self.utilization_factor.value self.heat_pump_electricity_kwh_used.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.heat_pump_electricity_kwh_used.value[i] = np.trapz(self.heat_pump_electricity_used.value[(0 + i * model.economics.timestepsperyear.value):((i + 1) * model.economics.timestepsperyear.value) + 1], dx =1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value # calculate reservoir heat content diff --git a/src/geophires_x/SurfacePlantIndustrialHeat.py b/src/geophires_x/SurfacePlantIndustrialHeat.py index d8a12a9e4..8c2086260 100644 --- a/src/geophires_x/SurfacePlantIndustrialHeat.py +++ b/src/geophires_x/SurfacePlantIndustrialHeat.py @@ -78,6 +78,7 @@ def Calculate(self, model: Model) -> None: self.PumpingkWh.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], @@ -89,6 +90,7 @@ def Calculate(self, model: Model) -> None: self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): + # FIXME TODO WIP adjust dx for slice size self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[ (0 + i * model.economics.timestepsperyear.value):(( i + 1) * model.economics.timestepsperyear.value) + 1], From 2e1a5761870163ffde15b75635c705bfa1277ff5 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 11:42:23 -0800 Subject: [PATCH 03/15] SurfacePlant.integrate_time_series_slice utility method; incorporated into SurfacePlant, SurfacePlantAGS, and SurfacePlantIndustrialHeat (other plant types remain WIP/TODO to fix still; unit tests not yet updated) --- src/geophires_x/SurfacePlant.py | 46 +++++++++++-------- src/geophires_x/SurfacePlantAGS.py | 23 ++++------ src/geophires_x/SurfacePlantIndustrialHeat.py | 35 ++++++-------- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index a0089694e..21b4be902 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -1,16 +1,33 @@ -import sys -import os import numpy as np from .GeoPHIRESUtils import quantity from .OptionList import EndUseOptions, PlantType -from .Parameter import floatParameter, intParameter, strParameter, OutputParameter, ReadParameter, \ +from .Parameter import floatParameter, intParameter, OutputParameter, ReadParameter, \ coerce_int_params_to_enum_values from .Units import * import geophires_x.Model as Model -import pandas as pd + class SurfacePlant: + @staticmethod + def integrate_time_series_slice( + series: np.ndarray, + _i: int, + time_steps_per_year: int, + utilization_factor: float + ) -> np.float64: + _slice = series[(0 + _i * time_steps_per_year):((_i + 1) * time_steps_per_year) + 1] + + # Note that len(_slice) - 1 may be less than time_steps_per_year for the last slice. + + if len(_slice) == 1: + return _slice[0] + + return np.trapz( + _slice, + dx=1. / (len(_slice) - 1) * 365. * 24. + ) * 1000. * utilization_factor + def remaining_reservoir_heat_content(self, InitialReservoirHeatContent: np.ndarray, HeatkWhExtracted: np.ndarray) -> np.ndarray: """ Calculate reservoir heat content @@ -176,19 +193,12 @@ def annual_electricity_pumping_power(self, plant_lifetime: int,enduse_option: En NetkWhProduced = np.zeros(plant_lifetime) HeatkWhProduced = np.zeros(plant_lifetime) - def integrate_slice(series: np.ndarray, _i: int) -> np.float64: - _slice = series[(0 + _i * time_steps_per_year):((_i + 1) * time_steps_per_year) + 1] - - # Note that len(_slice) - 1 may be less than time_steps_per_year for the last slice. - - return np.trapz( - _slice, - dx=1. / (len(_slice) - 1) * 365. * 24. - ) * 1000. * utilization_factor + def _integrate_slice(series: np.ndarray, _i: int) -> np.float64: + return SurfacePlant.integrate_time_series_slice(series, _i, time_steps_per_year, utilization_factor) for i in range(0, plant_lifetime): - HeatkWhExtracted[i] = integrate_slice(HeatExtracted, i) - PumpingkWh[i] = integrate_slice(PumpingPower, i) + HeatkWhExtracted[i] = _integrate_slice(HeatExtracted, i) + PumpingkWh[i] = _integrate_slice(PumpingPower, i) if enduse_option in [EndUseOptions.ELECTRICITY, EndUseOptions.COGENERATION_TOPPING_EXTRA_HEAT, @@ -201,14 +211,14 @@ def integrate_slice(series: np.ndarray, _i: int) -> np.float64: TotalkWhProduced = np.zeros(plant_lifetime) NetkWhProduced = np.zeros(plant_lifetime) for i in range(0, plant_lifetime): - TotalkWhProduced[i] = integrate_slice(ElectricityProduced, i) - NetkWhProduced[i] = integrate_slice(NetElectricityProduced, i) + TotalkWhProduced[i] = _integrate_slice(ElectricityProduced, i) + NetkWhProduced[i] = _integrate_slice(NetElectricityProduced, i) if enduse_option is not EndUseOptions.ELECTRICITY: # all those end-use options have a direct-use component HeatkWhProduced = np.zeros(plant_lifetime) for i in range(0, plant_lifetime): - HeatkWhProduced[i] = integrate_slice(HeatProduced, i) + HeatkWhProduced[i] = _integrate_slice(HeatProduced, i) return HeatkWhExtracted, PumpingkWh, TotalkWhProduced, NetkWhProduced, HeatkWhProduced diff --git a/src/geophires_x/SurfacePlantAGS.py b/src/geophires_x/SurfacePlantAGS.py index 95bd50ffc..036a03837 100644 --- a/src/geophires_x/SurfacePlantAGS.py +++ b/src/geophires_x/SurfacePlantAGS.py @@ -738,16 +738,15 @@ def Calculate(self, model: Model) -> None: self.HeatExtracted.value = self.HeatExtracted.value / 1000.0 # useful direct-use heat provided to application [MWth] self.HeatProduced.value = self.HeatExtracted.value * self.enduseefficiencyfactor.value + + def _integrate_slice(series: np.ndarray, _i: int) -> np.float64: + return SurfacePlant.integrate_time_series_slice( + series, _i, model.economics.timestepsperyear.value, self.utilization_factor.value + ) + for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ - (i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value - self.PumpingkWh.value[i] = np.trapz(model.wellbores.PumpingPower.value[ - (i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhExtracted.value[i] = _integrate_slice(self.HeatExtracted.value, i) + self.PumpingkWh.value[i] = _integrate_slice(model.wellbores.PumpingPower.value, i) self.RemainingReservoirHeatContent.value = model.reserv.InitialReservoirHeatContent.value - np.cumsum( self.HeatkWhExtracted.value) * 3600 * 1E3 / 1E15 @@ -755,11 +754,7 @@ def Calculate(self, model: Model) -> None: if self.End_use is not EndUseOptions.ELECTRICITY: self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhProduced.value[i] = _integrate_slice(self.HeatProduced.value, i) else: # copy some arrays so we have a GEOPHIRES equivalent self.TotalkWhProduced.value = self.Annual_electricity_production.copy() diff --git a/src/geophires_x/SurfacePlantIndustrialHeat.py b/src/geophires_x/SurfacePlantIndustrialHeat.py index 8c2086260..78e32549c 100644 --- a/src/geophires_x/SurfacePlantIndustrialHeat.py +++ b/src/geophires_x/SurfacePlantIndustrialHeat.py @@ -16,7 +16,7 @@ def __init__(self, model: Model): :return: None """ - model.logger.info("Init " + self.__class__.__name__ + ": " + __name__) + model.logger.info(f'Init {self.__class__.__name__}: {__name__}') super().__init__(model) # Initialize all the parameters in the superclass # There are no parameters unique to this class, so we don't need to set any up here. @@ -26,7 +26,7 @@ def __init__(self, model: Model): self.MyClass = sclass self.MyPath = os.path.abspath(__file__) - model.logger.info("Complete " + self.__class__.__name__ + ": " + __name__) + model.logger.info(f'Complete {self.__class__.__name__}: {__name__}') def __str__(self): return "SurfacePlantIndustrialHeat" @@ -39,12 +39,12 @@ def read_parameters(self, model: Model) -> None: :param model: The container class of the application, giving access to everything else, including the logger :return: None """ - model.logger.info("Init " + self.__class__.__name__ + ": " + __name__) + model.logger.info(f'Init {self.__class__.__name__}: {__name__}') super().read_parameters(model) # Read in all the parameters from the superclass # Since there are no parameters unique to this class, we don't need to read any in here. - model.logger.info("complete " + self.__class__.__name__ + ": " + __name__) + model.logger.info(f'complete {self.__class__.__name__}: {__name__}') def Calculate(self, model: Model) -> None: """ @@ -54,7 +54,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 " + self.__class__.__name__ + ": " + __name__) + model.logger.info(f'Init {self.__class__.__name__}: {__name__}') # This is where all the calculations are made using all the values that have been set. # If you subclass this class, you can choose to run these calculations before (or after) your calculations, @@ -73,28 +73,23 @@ def Calculate(self, model: Model) -> None: # useful direct-use heat provided to application [MWth] self.HeatProduced.value = self.HeatExtracted.value * self.enduse_efficiency_factor.value - # Calculate annual electricity/heat production because all end-use options have "heat extracted from reservoir" and pumping kWs + # Calculate annual electricity/heat production because all end-use options have "heat extracted from reservoir" + # and pumping kWs self.HeatkWhExtracted.value = np.zeros(self.plant_lifetime.value) self.PumpingkWh.value = np.zeros(self.plant_lifetime.value) + def _integrate_slice(series, _i): + return SurfacePlant.integrate_time_series_slice( + series, _i, model.economics.timestepsperyear.value, self.utilization_factor.value + ) + for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value - self.PumpingkWh.value[i] = np.trapz(model.wellbores.PumpingPower.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhExtracted.value[i] = _integrate_slice(self.HeatExtracted.value, i) + self.PumpingkWh.value[i] = _integrate_slice(model.wellbores.PumpingPower.value, i) self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhProduced.value[i] = _integrate_slice(self.HeatProduced.value, i) # calculate reservoir heat content self.RemainingReservoirHeatContent.value = SurfacePlant.remaining_reservoir_heat_content( From d6df4858de81cb7947e7bff733427ec6a5d2b810 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 12:08:23 -0800 Subject: [PATCH 04/15] SurfacePlantAbsorptionChiller fix --- .../SurfacePlantAbsorptionChiller.py | 28 ++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/src/geophires_x/SurfacePlantAbsorptionChiller.py b/src/geophires_x/SurfacePlantAbsorptionChiller.py index b0a557b93..671a3de5c 100644 --- a/src/geophires_x/SurfacePlantAbsorptionChiller.py +++ b/src/geophires_x/SurfacePlantAbsorptionChiller.py @@ -114,32 +114,22 @@ def Calculate(self, model: Model) -> None: self.HeatkWhExtracted.value = np.zeros(self.plant_lifetime.value) self.PumpingkWh.value = np.zeros(self.plant_lifetime.value) + def _integrate_slice(series, _i): + return SurfacePlant.integrate_time_series_slice( + series, _i, model.economics.timestepsperyear.value, self.utilization_factor.value + ) + for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value - self.PumpingkWh.value[i] = np.trapz(model.wellbores.PumpingPower.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhExtracted.value[i] = _integrate_slice(self.HeatExtracted.value, i) + self.PumpingkWh.value[i] = _integrate_slice(model.wellbores.PumpingPower.value, i) self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhProduced.value[i] = _integrate_slice(self.HeatProduced.value, i) self.cooling_kWh_Produced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.cooling_kWh_Produced.value[i] = np.trapz(self.cooling_produced.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.cooling_kWh_Produced.value[i] = _integrate_slice(self.cooling_produced.value, i) # calculate reservoir heat content self.RemainingReservoirHeatContent.value = SurfacePlant.remaining_reservoir_heat_content( From d309db062d91a9695fb60a1e8c8ac3fcce9e6609 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:51:15 -0800 Subject: [PATCH 05/15] fix trapz/slice integration in AC & HP surface plants (unit tests still pending) --- .../SurfacePlantDistrictHeating.py | 52 +++++++++---------- src/geophires_x/SurfacePlantHeatPump.py | 28 +++++----- 2 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/geophires_x/SurfacePlantDistrictHeating.py b/src/geophires_x/SurfacePlantDistrictHeating.py index 57fbabd31..5baa87d16 100644 --- a/src/geophires_x/SurfacePlantDistrictHeating.py +++ b/src/geophires_x/SurfacePlantDistrictHeating.py @@ -215,37 +215,37 @@ def Calculate(self, model: Model) -> None: self.HeatkWhExtracted.value = np.zeros(self.plant_lifetime.value) self.PumpingkWh.value = np.zeros(self.plant_lifetime.value) + def _integrate_slice(series, _i, util_factor): + return SurfacePlant.integrate_time_series_slice( + series, _i, model.economics.timestepsperyear.value, util_factor + ) + + for i in range(0, self.plant_lifetime.value): - if self.plant_type.value == PlantType.DISTRICT_HEATING: # for district heating, we have a util_factor_array - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * \ - self.util_factor_array.value[i] - self.PumpingkWh.value[i] = np.trapz(model.wellbores.PumpingPower.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * \ - self.util_factor_array.value[i] + if self.plant_type.value == PlantType.DISTRICT_HEATING: + self.HeatkWhExtracted.value[i] = _integrate_slice( + self.HeatExtracted.value, + i, + self.util_factor_array.value[i] + ) + + self.PumpingkWh.value[i] = _integrate_slice( + model.wellbores.PumpingPower.value, + i, + # for district heating, we have a util_factor_array + self.util_factor_array.value[i] + ) else: - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value - self.PumpingkWh.value[i] = np.trapz(model.wellbores.PumpingPower.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhExtracted.value[i] = _integrate_slice(self.HeatExtracted.value, i, self.utilization_factor.value) + self.PumpingkWh.value[i] = _integrate_slice(model.wellbores.PumpingPower.value, i, self.utilization_factor.value) self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): - self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[ - (0 + i * model.economics.timestepsperyear.value):(( - i + 1) * model.economics.timestepsperyear.value) + 1], - dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * \ - self.util_factor_array.value[i] + self.HeatkWhProduced.value[i] = _integrate_slice( + self.HeatProduced.value, + i, + self.util_factor_array.value[i] + ) # calculate reservoir heat content self.RemainingReservoirHeatContent.value = SurfacePlant.remaining_reservoir_heat_content( diff --git a/src/geophires_x/SurfacePlantHeatPump.py b/src/geophires_x/SurfacePlantHeatPump.py index 2fbd5da6f..5cde60315 100644 --- a/src/geophires_x/SurfacePlantHeatPump.py +++ b/src/geophires_x/SurfacePlantHeatPump.py @@ -19,7 +19,7 @@ def __init__(self, model: Model): :return: None """ - model.logger.info("Init " + str(__class__) + ": " + inspect.currentframe().f_code.co_name) + model.logger.info(f'Init {str(__class__)}: {inspect.currentframe().f_code.co_name}') super().__init__(model) # Initialize all the parameters in the superclass # Set up all the Parameters that will be predefined by this class using the different types of parameter classes. @@ -65,7 +65,7 @@ def __init__(self, model: Model): CurrentUnits=EnergyFrequencyUnit.KWhPERYEAR ) - model.logger.info("Complete " + str(__class__) + ": " + inspect.currentframe().f_code.co_name) + model.logger.info(f'Complete {str(__class__)}: {inspect.currentframe().f_code.co_name}') def __str__(self): return "SurfacePlantHeatPump" @@ -78,12 +78,12 @@ def read_parameters(self, model:Model) -> None: :param model: The container class of the application, giving access to everything else, including the logger :return: None """ - model.logger.info("Init " + str(__class__) + ": " + inspect.currentframe().f_code.co_name) + model.logger.info(f'Init {str(__class__)}: {inspect.currentframe().f_code.co_name}') super().read_parameters(model) # Read in all the parameters from the superclass # Since there are no parameters unique to this class, we don't need to read any in here. - model.logger.info("complete "+ str(__class__) + ": " + inspect.currentframe().f_code.co_name) + model.logger.info(f'complete {str(__class__)}: {inspect.currentframe().f_code.co_name}') def Calculate(self, model: Model) -> None: """ @@ -93,7 +93,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__) + ": " + inspect.currentframe().f_code.co_name) + model.logger.info(f'Init {str(__class__)}: {inspect.currentframe().f_code.co_name}') # This is where all the calculations are made using all the values that have been set. # If you subclass this class, you can choose to run these calculations before (or after) your calculations, @@ -115,24 +115,26 @@ def Calculate(self, model: Model) -> None: self.HeatkWhExtracted.value = np.zeros(self.plant_lifetime.value) self.PumpingkWh.value = np.zeros(self.plant_lifetime.value) + def _integrate_slice(series, _i): + return SurfacePlant.integrate_time_series_slice( + series, _i, model.economics.timestepsperyear.value, self.utilization_factor.value + ) + for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhExtracted.value[i] = np.trapz(self.HeatExtracted.value[(0 + i * model.economics.timestepsperyear.value):((i + 1) * model.economics.timestepsperyear.value) + 1],dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value - self.PumpingkWh.value[i] = np.trapz(model.wellbores.PumpingPower.value[(0 + i * model.economics.timestepsperyear.value):((i + 1) * model.economics.timestepsperyear.value) + 1],dx=1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.HeatkWhExtracted.value[i] = _integrate_slice(self.HeatExtracted.value, i) + self.PumpingkWh.value[i] = _integrate_slice(model.wellbores.PumpingPower.value, i) self.HeatkWhProduced.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.HeatkWhProduced.value[i] = np.trapz(self.HeatProduced.value[(0+i*model.economics.timestepsperyear.value):((i+1)*model.economics.timestepsperyear.value)+1],dx = 1./model.economics.timestepsperyear.value*365.*24.)*1000.*self.utilization_factor.value + self.HeatkWhProduced.value[i] = _integrate_slice(self.HeatProduced.value, i) self.heat_pump_electricity_kwh_used.value = np.zeros(self.plant_lifetime.value) for i in range(0, self.plant_lifetime.value): - # FIXME TODO WIP adjust dx for slice size - self.heat_pump_electricity_kwh_used.value[i] = np.trapz(self.heat_pump_electricity_used.value[(0 + i * model.economics.timestepsperyear.value):((i + 1) * model.economics.timestepsperyear.value) + 1], dx =1. / model.economics.timestepsperyear.value * 365. * 24.) * 1000. * self.utilization_factor.value + self.heat_pump_electricity_kwh_used.value[i] = _integrate_slice(self.heat_pump_electricity_used.value, i) # calculate reservoir heat content self.RemainingReservoirHeatContent.value = SurfacePlant.remaining_reservoir_heat_content( self, model.reserv.InitialReservoirHeatContent.value, self.HeatkWhExtracted.value) self._calculate_derived_outputs(model) - model.logger.info(f"complete {str(__class__)}: {inspect.currentframe().f_code.co_name}") + model.logger.info(f'complete {str(__class__)}: {inspect.currentframe().f_code.co_name}') From bf405360edaee227233263b7fef37d8586b28504 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:53:15 -0800 Subject: [PATCH 06/15] Temporarily revert slice integration behavior to original and thus allow this commit to serve as a checkpoint that ensures unit tests are passing and results are not affected by any structural issues in refactoring. --- src/geophires_x/SurfacePlant.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index 21b4be902..f860c10a3 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -23,9 +23,13 @@ def integrate_time_series_slice( if len(_slice) == 1: return _slice[0] + # FIXME TEMP - WIP to ensure unit tests are unchanged by refactoring but with original behavior retained + # dx_steps = (len(_slice) - 1) # correct behavior + dx_steps = time_steps_per_year # original behavior + return np.trapz( _slice, - dx=1. / (len(_slice) - 1) * 365. * 24. + dx=1. / dx_steps * 365. * 24. ) * 1000. * utilization_factor def remaining_reservoir_heat_content(self, InitialReservoirHeatContent: np.ndarray, HeatkWhExtracted: np.ndarray) -> np.ndarray: From d6faa4c4d98bb8ddaf7e75e4575585f43bc0fe9c Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:06:41 -0800 Subject: [PATCH 07/15] Use correct slice integration behavior and update unit tests. --- src/geophires_x/SurfacePlant.py | 4 +-- tests/example1_addons.csv | 32 +++++++++---------- tests/examples/Fervo_Norbeck_Latimer_2023.out | 24 +++++++------- tests/examples/Fervo_Project_Cape-2.out | 24 +++++++------- tests/examples/Fervo_Project_Cape-3.out | 24 +++++++------- tests/examples/Fervo_Project_Cape.out | 24 +++++++------- tests/examples/S-DAC-GT.out | 32 +++++++++---------- ...Closed-Loop_Geothermal_Energy_Recovery.out | 16 +++++----- tests/examples/example1.out | 22 ++++++------- tests/examples/example10_HP.out | 24 +++++++------- tests/examples/example11_AC.out | 18 +++++------ tests/examples/example12_DH.out | 24 +++++++------- tests/examples/example13.out | 24 +++++++------- tests/examples/example1_addons.out | 32 +++++++++---------- tests/examples/example1_outputunits.out | 22 ++++++------- tests/examples/example2.out | 22 ++++++------- tests/examples/example3.out | 24 +++++++------- tests/examples/example4.out | 18 +++++------ tests/examples/example5.out | 26 +++++++-------- tests/examples/example8.out | 18 +++++------ tests/examples/example9.out | 18 +++++------ tests/examples/example_ITC.out | 22 ++++++------- tests/examples/example_PTC.out | 20 ++++++------ tests/examples/example_SBT_Hi_T.out | 22 ++++++------- tests/examples/example_SBT_Lo_T.out | 12 +++---- tests/examples/example_SHR-1.out | 26 +++++++-------- tests/examples/example_SHR-2.out | 26 +++++++-------- .../examples/example_multiple_gradients-2.out | 22 ++++++------- tests/examples/example_multiple_gradients.out | 22 ++++++------- tests/examples/example_overpressure.out | 22 ++++++------- tests/examples/example_overpressure2.out | 22 ++++++------- tests/test_geophires_x.py | 2 +- 32 files changed, 344 insertions(+), 346 deletions(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index f860c10a3..4d248114d 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -23,9 +23,7 @@ def integrate_time_series_slice( if len(_slice) == 1: return _slice[0] - # FIXME TEMP - WIP to ensure unit tests are unchanged by refactoring but with original behavior retained - # dx_steps = (len(_slice) - 1) # correct behavior - dx_steps = time_steps_per_year # original behavior + dx_steps = (len(_slice) - 1) return np.trapz( _slice, diff --git a/tests/example1_addons.csv b/tests/example1_addons.csv index bcc177806..0ad4ec079 100644 --- a/tests/example1_addons.csv +++ b/tests/example1_addons.csv @@ -1,32 +1,32 @@ Category,Field,Year,Value,Units SUMMARY OF RESULTS,End-Use Option,,Electricity, SUMMARY OF RESULTS,Average Net Electricity Production,,5.39,MW -SUMMARY OF RESULTS,Electricity breakeven price,,1.74,cents/kWh +SUMMARY OF RESULTS,Electricity breakeven price,,1.73,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 SUMMARY OF RESULTS,Well depth,,3.0,kilometer SUMMARY OF RESULTS,Geothermal gradient,,50,degC/km -SUMMARY OF RESULTS,Total Avoided Carbon Emissions,,472.02,kilotonne +SUMMARY OF RESULTS,Total Avoided Carbon Emissions,,474.67,kilotonne 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,,65.9,MUSD -ECONOMIC PARAMETERS,Project IRR,,20.11,% -ECONOMIC PARAMETERS,Project VIR=PI=PIR,,3.12, -ECONOMIC PARAMETERS,Project MOIC,,36.27, +ECONOMIC PARAMETERS,Project NPV,,66.12,MUSD +ECONOMIC PARAMETERS,Project IRR,,20.12,% +ECONOMIC PARAMETERS,Project VIR=PI=PIR,,3.13, +ECONOMIC PARAMETERS,Project MOIC,,36.52, ECONOMIC PARAMETERS,Fixed Charge Rate (FCR),,5.0, ECONOMIC PARAMETERS,Project Payback Period,,7.05,yr ECONOMIC PARAMETERS,Estimated Jobs Created,,12, -EXTENDED ECONOMICS,"Adjusted Project LCOE (after incentives\, grants\, AddOns\,etc)",,1.74,cents/kWh +EXTENDED ECONOMICS,"Adjusted Project LCOE (after incentives\, grants\, AddOns\,etc)",,1.73,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)",,101.07,MUSD EXTENDED ECONOMICS,"Adjusted Project OPEX (after incentives\, grants\, AddOns\, etc)",,0.88,MUSD -EXTENDED ECONOMICS,Project NPV (including AddOns),,-13.02,MUSD +EXTENDED ECONOMICS,Project NPV (including AddOns),,-12.88,MUSD EXTENDED ECONOMICS,Project IRR (including AddOns),,0.06,% EXTENDED ECONOMICS,Project VIR=PI=PIR (including AddOns),,0.87, -EXTENDED ECONOMICS,Project MOIC (including AddOns),,1.0, +EXTENDED ECONOMICS,Project MOIC (including AddOns),,1.01, 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 @@ -94,12 +94,12 @@ SURFACE EQUIPMENT SIMULATION RESULTS,Maximum Net Electricity Generation,,5.42,MW SURFACE EQUIPMENT SIMULATION RESULTS,Average Net Electricity Generation,,5.39,MW SURFACE EQUIPMENT SIMULATION RESULTS,Minimum Net Electricity Generation,,5.22,MW SURFACE EQUIPMENT SIMULATION RESULTS,Initial Net Electricity Generation,,5.22,MW -SURFACE EQUIPMENT SIMULATION RESULTS,Average Annual Total Electricity Generation,,43.85,GWh -SURFACE EQUIPMENT SIMULATION RESULTS,Average Annual Net Electricity Generation,,42.3,GWh +SURFACE EQUIPMENT SIMULATION RESULTS,Average Annual Total Electricity Generation,,44.1,GWh +SURFACE EQUIPMENT SIMULATION RESULTS,Average Annual Net Electricity Generation,,42.54,GWh SURFACE EQUIPMENT SIMULATION RESULTS,Average Pumping Power,,0.2,MW SURFACE EQUIPMENT SIMULATION RESULTS,Initial pumping power/net installed power,,3.82,% SURFACE EQUIPMENT SIMULATION RESULTS,Heat to Power Conversion Efficiency,,10.07,% -Simulation Metadata,GEOPHIRES Version,,3.7.20, +Simulation Metadata,GEOPHIRES Version,,3.7.21, POWER GENERATION PROFILE,THERMAL DRAWDOWN,1,1.0, POWER GENERATION PROFILE,THERMAL DRAWDOWN,2,1.0056, POWER GENERATION PROFILE,THERMAL DRAWDOWN,3,1.0073, @@ -279,7 +279,7 @@ HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,ELECTRICITY PROVIDED,2 HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,ELECTRICITY PROVIDED,27,42.7,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,ELECTRICITY PROVIDED,28,42.7,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,ELECTRICITY PROVIDED,29,42.7,GWh/year -HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,ELECTRICITY PROVIDED,30,35.6,GWh/year +HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,ELECTRICITY PROVIDED,30,42.7,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,1,417.7,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,2,419.8,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,3,420.5,GWh/year @@ -309,7 +309,7 @@ HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,26,422. HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,27,422.8,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,28,422.8,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,29,422.9,GWh/year -HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,30,352.4,GWh/year +HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,HEAT EXTRACTED,30,422.9,GWh/year HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,1,322.5,10^15 J HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,2,320.99,10^15 J HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,3,319.47,10^15 J @@ -339,7 +339,7 @@ HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,27,282.99,10^15 J HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,28,281.47,10^15 J HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,29,279.95,10^15 J -HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,30,278.68,10^15 J +HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,RESERVOIR HEAT CONTENT,30,278.43,10^15 J HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,1,0.46,% HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,2,0.93,% HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,3,1.4,% @@ -369,7 +369,7 @@ HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HE HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,27,12.66,% HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,28,13.13,% HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,29,13.6,% -HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,30,13.99,% +HEAT AND/OR ELECTRICITY EXTRACTION AND GENERATION PROFILE,PERCENTAGE OF TOTAL HEAT MINED,30,14.07,% EXTENDED ECONOMIC PROFILE,Electricity Price,1,0.0,cents/kWh EXTENDED ECONOMIC PROFILE,Electricity Price,2,0.09,cents/kWh EXTENDED ECONOMIC PROFILE,Electricity Price,3,0.09,cents/kWh diff --git a/tests/examples/Fervo_Norbeck_Latimer_2023.out b/tests/examples/Fervo_Norbeck_Latimer_2023.out index ca8c5d701..29b384b1f 100644 --- a/tests/examples/Fervo_Norbeck_Latimer_2023.out +++ b/tests/examples/Fervo_Norbeck_Latimer_2023.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.447 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.461 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 2.26 MW - Electricity breakeven price: 26.95 cents/kWh + Electricity breakeven price: 26.75 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 41.0 kg/sec @@ -27,10 +27,10 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 10 yr Capacity factor: 90.0 % - Project NPV: -13.17 MUSD - Project IRR: -4.65 % - Project VIR=PI=PIR: 0.53 - Project MOIC: -0.19 + Project NPV: -13.03 MUSD + Project IRR: -4.40 % + Project VIR=PI=PIR: 0.54 + Project MOIC: -0.18 Project Payback Period: N/A Estimated Jobs Created: 6 @@ -125,8 +125,8 @@ Simulation Metadata Average Net Electricity Generation: 2.26 MW Minimum Net Electricity Generation: 1.74 MW Initial Net Electricity Generation: 2.24 MW - Average Annual Total Electricity Generation: 22.63 GWh - Average Annual Net Electricity Generation: 17.70 GWh + Average Annual Total Electricity Generation: 22.83 GWh + Average Annual Net Electricity Generation: 17.85 GWh Initial pumping power/net installed power: 28.16 % Average Pumping Power: 0.63 MW Heat to Power Conversion Efficiency: 9.95 % @@ -164,7 +164,7 @@ Simulation Metadata 7 18.4 181.3 5.26 46.44 8 18.1 180.2 4.61 53.05 9 17.1 176.6 3.98 59.52 - 10 13.6 151.9 3.43 65.09 + 10 15.1 168.8 3.37 65.70 ******************************** diff --git a/tests/examples/Fervo_Project_Cape-2.out b/tests/examples/Fervo_Project_Cape-2.out index 54f9d02f3..8b8e6357c 100644 --- a/tests/examples/Fervo_Project_Cape-2.out +++ b/tests/examples/Fervo_Project_Cape-2.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.670 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.678 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 8.90 MW - Electricity breakeven price: 10.19 cents/kWh + Electricity breakeven price: 10.14 cents/kWh Number of production wells: 1 Number of injection wells: 2 Flowrate per production well: 93.0 kg/sec @@ -27,10 +27,10 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 15 yr Capacity factor: 90.0 % - Project NPV: 41.82 MUSD - Project IRR: 17.54 % - Project VIR=PI=PIR: 1.82 - Project MOIC: 1.40 + Project NPV: 42.33 MUSD + Project IRR: 17.60 % + Project VIR=PI=PIR: 1.83 + Project MOIC: 1.42 Project Payback Period: 6.50 yr Estimated Jobs Created: 19 @@ -123,8 +123,8 @@ Simulation Metadata Average Net Electricity Generation: 8.90 MW Minimum Net Electricity Generation: 8.75 MW Initial Net Electricity Generation: 8.75 MW - Average Annual Total Electricity Generation: 70.80 GWh - Average Annual Net Electricity Generation: 69.67 GWh + Average Annual Total Electricity Generation: 71.28 GWh + Average Annual Net Electricity Generation: 70.14 GWh Initial pumping power/net installed power: 1.68 % Average Pumping Power: 0.15 MW Heat to Power Conversion Efficiency: 16.00 % @@ -172,7 +172,7 @@ Simulation Metadata 12 70.3 438.9 99.26 16.02 13 70.3 439.0 97.68 17.36 14 70.3 439.0 96.10 18.69 - 15 63.3 395.1 94.68 19.90 + 15 70.3 439.0 94.52 20.03 ******************************** diff --git a/tests/examples/Fervo_Project_Cape-3.out b/tests/examples/Fervo_Project_Cape-3.out index d43fd33bf..1827a5f65 100644 --- a/tests/examples/Fervo_Project_Cape-3.out +++ b/tests/examples/Fervo_Project_Cape-3.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.891 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.945 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 404.31 MW - Electricity breakeven price: 2.78 cents/kWh + Electricity breakeven price: 2.77 cents/kWh Number of production wells: 39 Number of injection wells: 39 Flowrate per production well: 120.0 kg/sec @@ -27,10 +27,10 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 20 yr Capacity factor: 90.0 % - Project NPV: 4561.96 MUSD - Project IRR: 43.74 % - Project VIR=PI=PIR: 5.25 - Project MOIC: 6.26 + Project NPV: 4580.36 MUSD + Project IRR: 43.75 % + Project VIR=PI=PIR: 5.27 + Project MOIC: 6.30 Project Payback Period: 3.38 yr Estimated Jobs Created: 976 @@ -124,8 +124,8 @@ Simulation Metadata Average Net Electricity Generation: 404.31 MW Minimum Net Electricity Generation: 398.45 MW Initial Net Electricity Generation: 398.45 MW - Average Annual Total Electricity Generation: 3593.27 GWh - Average Annual Net Electricity Generation: 3171.75 GWh + Average Annual Total Electricity Generation: 3611.36 GWh + Average Annual Net Electricity Generation: 3187.72 GWh Initial pumping power/net installed power: 13.50 % Average Pumping Power: 53.73 MW Heat to Power Conversion Efficiency: 14.39 % @@ -183,7 +183,7 @@ Simulation Metadata 17 3193.5 22165.4 25892.94 4.97 18 3193.8 22166.6 25813.14 5.27 19 3194.1 22167.7 25733.34 5.56 - 20 2875.0 19951.8 25661.51 5.82 + 20 3194.4 22168.7 25653.53 5.85 ******************************** diff --git a/tests/examples/Fervo_Project_Cape.out b/tests/examples/Fervo_Project_Cape.out index 57f667653..a7a7cf1ff 100644 --- a/tests/examples/Fervo_Project_Cape.out +++ b/tests/examples/Fervo_Project_Cape.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:32 - Calculation Time: 0.666 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.692 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 88.50 MW - Electricity breakeven price: 8.75 cents/kWh + Electricity breakeven price: 8.72 cents/kWh Number of production wells: 12 Number of injection wells: 12 Flowrate per production well: 98.0 kg/sec @@ -27,10 +27,10 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 15 yr Capacity factor: 90.0 % - Project NPV: 516.24 MUSD - Project IRR: 20.97 % - Project VIR=PI=PIR: 2.07 - Project MOIC: 1.87 + Project NPV: 520.01 MUSD + Project IRR: 21.00 % + Project VIR=PI=PIR: 2.08 + Project MOIC: 1.88 Project Payback Period: 5.67 yr Estimated Jobs Created: 226 @@ -123,8 +123,8 @@ Simulation Metadata Average Net Electricity Generation: 88.50 MW Minimum Net Electricity Generation: 60.25 MW Initial Net Electricity Generation: 91.64 MW - Average Annual Total Electricity Generation: 833.28 GWh - Average Annual Net Electricity Generation: 693.77 GWh + Average Annual Total Electricity Generation: 837.66 GWh + Average Annual Net Electricity Generation: 697.19 GWh Initial pumping power/net installed power: 19.31 % Average Pumping Power: 17.82 MW Heat to Power Conversion Efficiency: 13.05 % @@ -172,7 +172,7 @@ Simulation Metadata 12 681.8 5283.6 172.55 57.66 13 640.0 5136.7 154.06 62.20 14 581.8 4928.0 136.32 66.55 - 15 460.8 4203.2 121.18 70.26 + 15 512.0 4670.3 119.50 70.68 ******************************** diff --git a/tests/examples/S-DAC-GT.out b/tests/examples/S-DAC-GT.out index 3ce7041ea..1b4dd0a5a 100644 --- a/tests/examples/S-DAC-GT.out +++ b/tests/examples/S-DAC-GT.out @@ -4,18 +4,18 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.19 - Simulation Date: 2025-02-28 - Simulation Time: 11:35 - Calculation Time: 0.102 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.107 sec ***SUMMARY OF RESULTS*** End-Use Option: Cogeneration Topping Cycle, Heat sales considered as extra income Average Net Electricity Production: 19.62 MW Average Direct-Use Heat Production: 13.19 MW - Electricity breakeven price: 10.69 cents/kWh - Direct-Use heat breakeven price (LCOH): -56.33 USD/MMBTU + Electricity breakeven price: 10.68 cents/kWh + Direct-Use heat breakeven price (LCOH): -56.08 USD/MMBTU Number of production wells: 3 Number of injection wells: 3 Flowrate per production well: 70.0 kg/sec @@ -29,10 +29,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -82.22 MUSD - Project IRR: -5.99 % + Project NPV: -82.17 MUSD + Project IRR: -5.86 % Project VIR=PI=PIR: 0.20 - Project MOIC: -0.31 + Project MOIC: -0.30 Project Payback Period: N/A CHP: Percent cost allocation for electrical plant: 92.25 % @@ -119,14 +119,14 @@ Simulation Metadata Average Net Electricity Generation: 19.62 MW Minimum Net Electricity Generation: 16.96 MW Initial Net Electricity Generation: 20.98 MW - Average Annual Total Electricity Generation: 87.03 GWh - Average Annual Net Electricity Generation: 85.57 GWh + Average Annual Total Electricity Generation: 87.28 GWh + Average Annual Net Electricity Generation: 85.81 GWh Initial pumping power/net installed power: 0.89 % Maximum Net Heat Production: 14.05 MW Average Net Heat Production: 13.19 MW Minimum Net Heat Production: 11.35 MW Initial Net Heat Production: 14.05 MW - Average Annual Heat Production: -4.73 GWh + Average Annual Heat Production: -4.76 GWh Average Pumping Power: 0.19 MW Heat to Power Conversion Efficiency: 16.55 % @@ -203,7 +203,7 @@ Simulation Metadata 27 -8.3 74.6 982.47 -25.82 133.54 28 -8.7 73.5 975.32 -29.33 138.10 29 -9.2 72.4 968.21 -32.82 142.63 - 30 -8.7 64.2 865.37 -35.93 146.68 + 30 -9.6 71.3 961.52 -36.28 147.13 ******************************** @@ -263,8 +263,8 @@ ________________________________________________________________________________ Geothermal Ratio (electricity vs heat): 20.7259 % Percent Energy Devoted To Process: 50.0000 % - Total Tonnes of CO2 Captured: 2,246,284.10 tonne - Total Cost of Capture: 499,311,405.59 USD + Total Tonnes of CO2 Captured: 2,253,170.17 tonne + Total Cost of Capture: 500,842,063.38 USD ********************** @@ -302,4 +302,4 @@ Start (tonne/yr) (tonne) (USD/yr) (USD) ( 27 70,361.40 2,045,120.04 15,640,162.58 454,595,997.86 222.28 28 69,849.14 2,114,969.18 15,526,295.96 470,122,293.82 222.28 29 69,340.31 2,184,309.49 15,413,191.67 485,535,485.49 222.28 - 30 61,974.61 2,246,284.10 13,775,920.11 499,311,405.59 222.28 + 30 68,860.68 2,253,170.17 15,306,577.89 500,842,063.38 222.28 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 085c3fbec..36cd54f7e 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 1.612 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 1.655 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 1.10 MW - Electricity breakeven price: 82.16 cents/kWh + Electricity breakeven price: 81.93 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 110.0 kg/sec @@ -105,8 +105,8 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t 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 + Average Annual Total Electricity Generation: 8.71 GWh + Average Annual Net Electricity Generation: 8.69 GWh Initial pumping power/net installed power: 0.13 % Average Pumping Power: 0.00 MW Heat to Power Conversion Efficiency: 5.16 % @@ -204,7 +204,7 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t 37 8.0 159.3 11.09 66.90 38 8.4 164.8 10.50 68.67 39 7.7 155.4 9.94 70.34 - 40 7.5 138.1 9.44 71.82 + 40 10.1 184.1 9.28 72.32 ******************************** diff --git a/tests/examples/example1.out b/tests/examples/example1.out index 916c28d0b..57e467bdb 100644 --- a/tests/examples/example1.out +++ b/tests/examples/example1.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.806 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.803 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 5.39 MW - Electricity breakeven price: 9.62 cents/kWh + Electricity breakeven price: 9.56 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -28,10 +28,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -41.83 MUSD - Project IRR: -3.80 % + Project NPV: -41.78 MUSD + Project IRR: -3.68 % Project VIR=PI=PIR: 0.22 - Project MOIC: -0.27 + Project MOIC: -0.26 Project Payback Period: N/A Estimated Jobs Created: 12 @@ -122,8 +122,8 @@ Simulation Metadata Average Net Electricity Generation: 5.39 MW Minimum Net Electricity Generation: 5.22 MW Initial Net Electricity Generation: 5.22 MW - Average Annual Total Electricity Generation: 43.83 GWh - Average Annual Net Electricity Generation: 42.28 GWh + Average Annual Total Electricity Generation: 44.07 GWh + Average Annual Net Electricity Generation: 42.51 GWh Initial pumping power/net installed power: 3.82 % Average Pumping Power: 0.20 MW Heat to Power Conversion Efficiency: 10.07 % @@ -201,7 +201,7 @@ Simulation Metadata 27 42.7 422.8 282.99 12.66 28 42.7 422.8 281.47 13.13 29 42.7 422.9 279.95 13.60 - 30 35.6 352.4 278.68 13.99 + 30 42.7 422.9 278.43 14.07 ******************************** diff --git a/tests/examples/example10_HP.out b/tests/examples/example10_HP.out index f4a3d0722..c6147e31a 100644 --- a/tests/examples/example10_HP.out +++ b/tests/examples/example10_HP.out @@ -4,17 +4,17 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.102 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.101 sec ***SUMMARY OF RESULTS*** End-Use Option: Direct-Use Heat Surface Application: Heat Pump Average Direct-Use Heat Production: 16.89 MW - Direct-Use heat breakeven price (LCOH): 14.42 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 14.41 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 70.0 kg/sec @@ -29,8 +29,8 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: 11.28 MUSD - Project IRR: 8.07 % + Project NPV: 11.35 MUSD + Project IRR: 8.08 % Project VIR=PI=PIR: 1.36 Project MOIC: 1.01 Project Payback Period: 11.96 yr @@ -108,8 +108,8 @@ Simulation Metadata Power plant maintenance costs: 0.31 MUSD/yr Water costs: 0.07 MUSD/yr Average Reservoir Pumping Cost: 0.25 MUSD/yr - Average Heat Pump Electricity Cost: 3.69 MUSD/yr - Total operating and maintenance costs: 4.55 MUSD/yr + Average Heat Pump Electricity Cost: 3.70 MUSD/yr + Total operating and maintenance costs: 4.56 MUSD/yr ***SURFACE EQUIPMENT SIMULATION RESULTS*** @@ -118,8 +118,8 @@ Simulation Metadata Average Net Heat Production: 16.89 MW Minimum Net Heat Production: 15.44 MW Initial Net Heat Production: 17.55 MW - Average Annual Heat Production: 132.75 GWh - Average Annual Heat Pump Electricity Use: 52.68 GWh/year + Average Annual Heat Production: 133.16 GWh + Average Annual Heat Pump Electricity Use: 52.84 GWh/year Average Pumping Power: 0.45 MW ************************************************************ @@ -195,7 +195,7 @@ Simulation Metadata 27 125.0 89.3 49.59 4.67 66.63 28 124.0 88.6 49.21 4.35 68.91 29 123.0 87.9 48.83 4.03 71.17 - 30 109.9 78.5 43.62 3.75 73.19 + 30 122.1 87.2 48.47 3.72 73.41 ******************************** diff --git a/tests/examples/example11_AC.out b/tests/examples/example11_AC.out index a02931ed0..209f11679 100644 --- a/tests/examples/example11_AC.out +++ b/tests/examples/example11_AC.out @@ -4,9 +4,9 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 Calculation Time: 0.102 sec ***SUMMARY OF RESULTS*** @@ -15,7 +15,7 @@ Simulation Metadata Surface Application: Absorption Chiller Average Direct-Use Heat Production: 8.62 MW Average Cooling Production: 5.58 MW - Direct-Use Cooling Breakeven Price (LCOC): 17.28 USD/MMBTU + Direct-Use Cooling Breakeven Price (LCOC): 17.26 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 50.0 kg/sec @@ -30,8 +30,8 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: 6.22 MUSD - Project IRR: 6.82 % + Project NPV: 6.28 MUSD + Project IRR: 6.83 % Project VIR=PI=PIR: 1.21 Project MOIC: 0.83 Project Payback Period: 13.36 yr @@ -119,12 +119,12 @@ Simulation Metadata Average Net Heat Production: 8.62 MW Minimum Net Heat Production: 7.88 MW Initial Net Heat Production: 8.95 MW - Average Annual Heat Production: 67.73 GWh + Average Annual Heat Production: 67.94 GWh Maximum Cooling Production: 5.80 MW Average Cooling Production: 5.58 MW Minimum Cooling Production: 5.10 MW Initial Cooling Production: 5.80 MW - Average Annual Cooling Production: 43.89 GWh/year + Average Annual Cooling Production: 44.02 GWh/year Average Pumping Power: 0.20 MW ************************************************************ @@ -200,7 +200,7 @@ Simulation Metadata 27 41.3 63.8 7.33 47.59 28 41.0 63.3 7.11 49.22 29 40.7 62.8 6.88 50.84 - 30 36.3 56.1 6.68 52.28 + 30 40.4 62.3 6.65 52.44 ******************************** diff --git a/tests/examples/example12_DH.out b/tests/examples/example12_DH.out index 21c3d9993..c4b46dae1 100644 --- a/tests/examples/example12_DH.out +++ b/tests/examples/example12_DH.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.590 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.616 sec ***SUMMARY OF RESULTS*** @@ -32,10 +32,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 20 yr Capacity factor: 96.3 % - Project NPV: -20.81 MUSD - Project IRR: 2.18 % - Project VIR=PI=PIR: 0.67 - Project MOIC: 0.16 + Project NPV: -20.39 MUSD + Project IRR: 2.36 % + Project VIR=PI=PIR: 0.68 + Project MOIC: 0.18 Project Payback Period: 16.46 yr ***ENGINEERING PARAMETERS*** @@ -113,10 +113,10 @@ Simulation Metadata Wellfield maintenance costs: 0.62 MUSD/yr Power plant maintenance costs: 0.50 MUSD/yr Water costs: 0.00 MUSD/yr - Average Reservoir Pumping Cost: 0.25 MUSD/yr + Average Reservoir Pumping Cost: 0.26 MUSD/yr Annual District Heating O&M Cost: 0.34 MUSD/yr Average Annual Peaking Fuel Cost: 4.30 MUSD/yr - Total operating and maintenance costs: 1.71 MUSD/yr + Total operating and maintenance costs: 1.72 MUSD/yr ***SURFACE EQUIPMENT SIMULATION RESULTS*** @@ -125,7 +125,7 @@ Simulation Metadata Average Net Heat Production: 12.95 MW Minimum Net Heat Production: 11.29 MW Initial Net Heat Production: 13.45 MW - Average Annual Heat Production: 107.53 GWh + Average Annual Heat Production: 109.17 GWh Annual District Heating Demand: 242.90 GWh/year Maximum Daily District Heating Demand: 1683.32 MWh/day Average Daily District Heating Demand: 665.47 MWh/day @@ -191,7 +191,7 @@ Simulation Metadata 17 103.2 139.7 128.98 6.34 57.21 18 101.6 141.3 126.97 5.88 60.29 19 99.9 143.0 124.84 5.43 63.32 - 20 65.6 144.7 82.02 5.14 65.32 + 20 98.4 144.7 123.03 4.99 66.31 ******************************** diff --git a/tests/examples/example13.out b/tests/examples/example13.out index a85f3d2fe..1e5660751 100644 --- a/tests/examples/example13.out +++ b/tests/examples/example13.out @@ -4,9 +4,9 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.19 - Simulation Date: 2025-02-28 - Simulation Time: 11:32 + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 Calculation Time: 0.036 sec ***SUMMARY OF RESULTS*** @@ -14,8 +14,8 @@ Simulation Metadata End-Use Option: Cogeneration Bottoming Cycle, Electricity sales considered as extra income Average Net Electricity Production: 3.15 MW Average Direct-Use Heat Production: 15.63 MW - Electricity breakeven price: 18.16 cents/kWh - Direct-Use heat breakeven price (LCOH): 7.20 USD/MMBTU + Electricity breakeven price: 18.07 cents/kWh + Direct-Use heat breakeven price (LCOH): 7.18 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 50.0 kg/sec @@ -30,10 +30,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 80.0 % - Project NPV: -43.00 MUSD - Project IRR: -5.99 % + Project NPV: -42.75 MUSD + Project IRR: -5.36 % Project VIR=PI=PIR: 0.24 - Project MOIC: -0.22 + Project MOIC: -0.21 Project Payback Period: N/A CHP: Percent cost allocation for electrical plant: 60.28 % @@ -123,14 +123,14 @@ Simulation Metadata Average Net Electricity Generation: 3.15 MW Minimum Net Electricity Generation: 3.09 MW Initial Net Electricity Generation: 3.22 MW - Average Annual Total Electricity Generation: 23.57 GWh - Average Annual Net Electricity Generation: 21.85 GWh + Average Annual Total Electricity Generation: 23.84 GWh + Average Annual Net Electricity Generation: 22.09 GWh Initial pumping power/net installed power: 5.80 % Maximum Net Heat Production: 19.63 MW Average Net Heat Production: 15.63 MW Minimum Net Heat Production: 11.45 MW Initial Net Heat Production: 19.63 MW - Average Annual Heat Production: 108.31 GWh + Average Annual Heat Production: 109.25 GWh Average Pumping Power: 0.25 MW Heat to Power Conversion Efficiency: 7.58 % @@ -207,7 +207,7 @@ Simulation Metadata 27 94.9 21.9 410.08 12.78 76.63 28 91.1 21.8 405.31 11.32 79.30 29 87.3 21.8 400.53 9.88 81.93 - 30 56.1 14.5 264.37 8.93 83.67 + 30 84.1 21.7 396.55 8.45 84.54 ******************************** diff --git a/tests/examples/example1_addons.out b/tests/examples/example1_addons.out index dbbbf8aa5..7f7fb7aa3 100644 --- a/tests/examples/example1_addons.out +++ b/tests/examples/example1_addons.out @@ -4,22 +4,22 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.797 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.808 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 5.39 MW - Electricity breakeven price: 1.74 cents/kWh + Electricity breakeven price: 1.73 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec Well depth: 3.0 kilometer Geothermal gradient: 50 degC/km - Total Avoided Carbon Emissions: 472.02 kilotonne + Total Avoided Carbon Emissions: 474.67 kilotonne ***ECONOMIC PARAMETERS*** @@ -29,10 +29,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: 65.90 MUSD - Project IRR: 20.11 % - Project VIR=PI=PIR: 3.12 - Project MOIC: 36.27 + Project NPV: 66.12 MUSD + Project IRR: 20.12 % + Project VIR=PI=PIR: 3.13 + Project MOIC: 36.52 Project Payback Period: 7.05 yr Estimated Jobs Created: 12 @@ -123,8 +123,8 @@ Simulation Metadata Average Net Electricity Generation: 5.39 MW Minimum Net Electricity Generation: 5.22 MW Initial Net Electricity Generation: 5.22 MW - Average Annual Total Electricity Generation: 43.85 GWh - Average Annual Net Electricity Generation: 42.30 GWh + Average Annual Total Electricity Generation: 44.10 GWh + Average Annual Net Electricity Generation: 42.54 GWh Initial pumping power/net installed power: 3.82 % Average Pumping Power: 0.20 MW Heat to Power Conversion Efficiency: 10.07 % @@ -202,7 +202,7 @@ Simulation Metadata 27 42.7 422.8 282.99 12.66 28 42.7 422.8 281.47 13.13 29 42.7 422.9 279.95 13.60 - 30 35.6 352.4 278.68 13.99 + 30 42.7 422.9 278.43 14.07 ******************************** @@ -247,14 +247,14 @@ ________________________________________________________________________________ ***EXTENDED ECONOMICS*** - Adjusted Project LCOE (after incentives, grants, AddOns,etc): 1.74 cents/kWh + Adjusted Project LCOE (after incentives, grants, AddOns,etc): 1.73 cents/kWh Adjusted Project LCOH (after incentives, grants, AddOns,etc): 0.00 USD/MMBTU Adjusted Project CAPEX (after incentives, grants, AddOns, etc): 101.07 MUSD Adjusted Project OPEX (after incentives, grants, AddOns, etc): 0.88 MUSD - Project NPV (including AddOns): -13.02 MUSD + Project NPV (including AddOns): -12.88 MUSD Project IRR (including AddOns): 0.06 % Project VIR=PI=PIR (including AddOns): 0.87 - Project MOIC (including AddOns): 1.00 + Project MOIC (including AddOns): 1.01 Total Add-on CAPEX: 70.00 MUSD Total Add-on OPEX: 1.70 MUSD/yr Total Add-on Net Elec: 25900.00 kW/yr diff --git a/tests/examples/example1_outputunits.out b/tests/examples/example1_outputunits.out index 461b4917f..916b81578 100644 --- a/tests/examples/example1_outputunits.out +++ b/tests/examples/example1_outputunits.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.801 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.803 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 5.39 MW - Electricity breakeven price: 8.71 cents/kWh + Electricity breakeven price: 8.66 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -28,10 +28,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -34.61 MUSD - Project IRR: -2.77 % + Project NPV: -34.56 MUSD + Project IRR: -2.67 % Project VIR=PI=PIR: 0.26 - Project MOIC: -0.20 + Project MOIC: -0.19 Project Payback Period: N/A Estimated Jobs Created: 12 @@ -122,8 +122,8 @@ Simulation Metadata Average Net Electricity Generation: 5.39 MW Minimum Net Electricity Generation: 5.22 MW Initial Net Electricity Generation: 5.22 MW - Average Annual Total Electricity Generation: 43.83 GWh - Average Annual Net Electricity Generation: 42.28 GWh + Average Annual Total Electricity Generation: 44.07 GWh + Average Annual Net Electricity Generation: 42.51 GWh Initial pumping power/net installed power: 3.82 % Average Pumping Power: 0.20 MW Heat to Power Conversion Efficiency: 10.07 % @@ -201,7 +201,7 @@ Simulation Metadata 27 42.7 422.8 282.99 12.66 28 42.7 422.8 281.47 13.13 29 42.7 422.9 279.95 13.60 - 30 35.6 352.4 278.68 13.99 + 30 42.7 422.9 278.43 14.07 ******************************** diff --git a/tests/examples/example2.out b/tests/examples/example2.out index fb9102634..830419b56 100644 --- a/tests/examples/example2.out +++ b/tests/examples/example2.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.214 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.216 sec ***SUMMARY OF RESULTS*** End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 21.47 MW - Direct-Use heat breakeven price (LCOH): 7.16 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 7.12 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 30.0 kg/sec @@ -28,10 +28,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 25 yr Capacity factor: 90.0 % - Project NPV: 3.83 MUSD - Project IRR: 5.97 % - Project VIR=PI=PIR: 1.09 - Project MOIC: 0.52 + Project NPV: 4.20 MUSD + Project IRR: 6.05 % + Project VIR=PI=PIR: 1.10 + Project MOIC: 0.54 Project Payback Period: 13.21 yr ***ENGINEERING PARAMETERS*** @@ -118,7 +118,7 @@ Simulation Metadata Average Net Heat Production: 21.47 MW Minimum Net Heat Production: 18.88 MW Initial Net Heat Production: 22.52 MW - Average Annual Heat Production: 167.12 GWh + Average Annual Heat Production: 169.11 GWh Average Pumping Power: 0.80 MW ************************************************************ @@ -184,7 +184,7 @@ Simulation Metadata 22 154.9 172.1 25.12 37.54 23 153.0 170.1 24.51 39.06 24 151.1 167.9 23.91 40.56 - 25 99.7 110.8 23.51 41.55 + 25 149.5 166.1 23.31 42.05 ******************************** diff --git a/tests/examples/example3.out b/tests/examples/example3.out index db81c6031..ebf023a9b 100644 --- a/tests/examples/example3.out +++ b/tests/examples/example3.out @@ -4,18 +4,18 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.19 - Simulation Date: 2025-02-28 - Simulation Time: 11:33 - Calculation Time: 0.117 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.119 sec ***SUMMARY OF RESULTS*** End-Use Option: Cogeneration Topping Cycle, Heat sales considered as extra income Average Net Electricity Production: 19.50 MW Average Direct-Use Heat Production: 10.73 MW - Electricity breakeven price: 6.42 cents/kWh - Direct-Use heat breakeven price (LCOH): 2.38 USD/MMBTU + Electricity breakeven price: 6.41 cents/kWh + Direct-Use heat breakeven price (LCOH): 2.37 USD/MMBTU Number of production wells: 3 Number of injection wells: 3 Flowrate per production well: 70.0 kg/sec @@ -29,8 +29,8 @@ Simulation Metadata Accrued financing during construction: 5.00 Project lifetime: 35 yr Capacity factor: 90.0 % - Project NPV: -11.42 MUSD - Project IRR: 5.99 % + Project NPV: -11.33 MUSD + Project IRR: 6.00 % Project VIR=PI=PIR: 0.90 Project MOIC: 0.64 Project Payback Period: 14.84 yr @@ -119,14 +119,14 @@ Simulation Metadata Average Net Electricity Generation: 19.50 MW Minimum Net Electricity Generation: 16.73 MW Initial Net Electricity Generation: 20.96 MW - Average Annual Total Electricity Generation: 154.85 GWh - Average Annual Net Electricity Generation: 153.28 GWh + Average Annual Total Electricity Generation: 155.24 GWh + Average Annual Net Electricity Generation: 153.66 GWh Initial pumping power/net installed power: 0.95 % Maximum Net Heat Production: 11.67 MW Average Net Heat Production: 10.73 MW Minimum Net Heat Production: 8.80 MW Initial Net Heat Production: 11.67 MW - Average Annual Heat Production: 84.33 GWh + Average Annual Heat Production: 84.53 GWh Average Pumping Power: 0.20 MW Heat to Power Conversion Efficiency: 16.50 % @@ -213,7 +213,7 @@ Simulation Metadata 32 72.9 136.5 950.78 -34.96 141.64 33 71.9 135.2 944.54 -38.36 145.69 34 70.8 133.8 938.36 -41.74 149.72 - 35 62.8 119.3 839.28 -44.76 153.32 + 35 69.8 132.5 932.53 -45.10 153.72 ******************************** diff --git a/tests/examples/example4.out b/tests/examples/example4.out index 417952b5f..c7318930d 100644 --- a/tests/examples/example4.out +++ b/tests/examples/example4.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 Calculation Time: 0.049 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 7.00 MW - Electricity breakeven price: 11.27 cents/kWh + Electricity breakeven price: 11.23 cents/kWh Number of production wells: 3 Number of injection wells: 2 Flowrate per production well: 110.0 kg/sec @@ -27,8 +27,8 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -38.19 MUSD - Project IRR: -2.92 % + Project NPV: -38.10 MUSD + Project IRR: -2.75 % Project VIR=PI=PIR: 0.31 Project MOIC: -0.17 Project Payback Period: N/A @@ -120,8 +120,8 @@ Simulation Metadata Average Net Electricity Generation: 7.00 MW Minimum Net Electricity Generation: 5.87 MW Initial Net Electricity Generation: 8.18 MW - Average Annual Total Electricity Generation: 64.97 GWh - Average Annual Net Electricity Generation: 54.69 GWh + Average Annual Total Electricity Generation: 65.44 GWh + Average Annual Net Electricity Generation: 55.08 GWh Initial pumping power/net installed power: 15.60 % Average Pumping Power: 1.31 MW Heat to Power Conversion Efficiency: 7.30 % @@ -199,7 +199,7 @@ Simulation Metadata 27 48.2 706.2 138.79 34.72 28 47.6 702.0 136.27 35.91 29 47.0 697.9 133.75 37.09 - 30 34.9 520.8 131.88 37.98 + 30 46.5 694.3 131.25 38.27 ******************************** diff --git a/tests/examples/example5.out b/tests/examples/example5.out index 1aefdbbe5..0edfea174 100644 --- a/tests/examples/example5.out +++ b/tests/examples/example5.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.049 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.048 sec ***SUMMARY OF RESULTS*** End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 19.69 MW - Direct-Use heat breakeven price (LCOH): 8.86 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 8.84 USD/MMBTU Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 50.0 kg/sec @@ -27,10 +27,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -3.98 MUSD - Project IRR: 5.86 % - Project VIR=PI=PIR: 0.90 - Project MOIC: 0.49 + Project NPV: -3.88 MUSD + Project IRR: 5.90 % + Project VIR=PI=PIR: 0.91 + Project MOIC: 0.50 Project Payback Period: 13.32 yr ***ENGINEERING PARAMETERS*** @@ -104,8 +104,8 @@ Simulation Metadata Wellfield maintenance costs: 0.44 MUSD/yr Power plant maintenance costs: 0.71 MUSD/yr Water costs: 0.05 MUSD/yr - Average Reservoir Pumping Cost: 0.30 MUSD/yr - Total operating and maintenance costs: 1.50 MUSD/yr + Average Reservoir Pumping Cost: 0.31 MUSD/yr + Total operating and maintenance costs: 1.51 MUSD/yr ***SURFACE EQUIPMENT SIMULATION RESULTS*** @@ -114,7 +114,7 @@ Simulation Metadata Average Net Heat Production: 19.69 MW Minimum Net Heat Production: 14.65 MW Initial Net Heat Production: 24.29 MW - Average Annual Heat Production: 153.95 GWh + Average Annual Heat Production: 154.92 GWh Average Pumping Power: 0.55 MW ************************************************************ @@ -190,7 +190,7 @@ Simulation Metadata 27 121.8 135.3 181.27 8.65 28 119.8 133.1 180.80 8.90 29 117.8 130.9 180.32 9.13 - 30 87.2 96.9 179.98 9.31 + 30 116.2 129.1 179.86 9.37 ******************************** diff --git a/tests/examples/example8.out b/tests/examples/example8.out index 57c048d3c..b5439ffd2 100644 --- a/tests/examples/example8.out +++ b/tests/examples/example8.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:32 - Calculation Time: 0.801 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.938 sec ***SUMMARY OF RESULTS*** End-Use Option: Direct-Use Heat Average Direct-Use Heat Production: 9.60 MW - Direct-Use heat breakeven price (LCOH): 9.01 USD/MMBTU + Direct-Use heat breakeven price (LCOH): 8.96 USD/MMBTU Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 40.0 kg/sec @@ -28,8 +28,8 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 60.0 % - Project NPV: -10.75 MUSD - Project IRR: 1.02 % + Project NPV: -10.73 MUSD + Project IRR: 1.06 % Project VIR=PI=PIR: 0.49 Project MOIC: 0.10 Project Payback Period: 26.31 yr @@ -118,7 +118,7 @@ Simulation Metadata Average Net Heat Production: 9.60 MW Minimum Net Heat Production: 9.04 MW Initial Net Heat Production: 9.67 MW - Average Annual Heat Production: 50.20 GWh + Average Annual Heat Production: 50.46 GWh Average Pumping Power: 0.09 MW ************************************************************ @@ -194,7 +194,7 @@ Simulation Metadata 27 48.4 53.8 24.71 18.15 28 48.2 53.5 24.52 18.79 29 47.9 53.2 24.33 19.42 - 30 39.7 44.1 24.17 19.95 + 30 47.6 52.9 24.14 20.06 ******************************** diff --git a/tests/examples/example9.out b/tests/examples/example9.out index 6456f4f69..9c860220e 100644 --- a/tests/examples/example9.out +++ b/tests/examples/example9.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:32 - Calculation Time: 0.797 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.967 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 0.47 MW - Electricity breakeven price: 50.47 cents/kWh + Electricity breakeven price: 50.22 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 40.0 kg/sec @@ -31,7 +31,7 @@ Simulation Metadata Project NPV: -30.84 MUSD Project IRR: 0.00 % Project VIR=PI=PIR: -0.12 - Project MOIC: -0.86 + Project MOIC: -0.85 Project Payback Period: N/A Estimated Jobs Created: 1 @@ -124,8 +124,8 @@ Simulation Metadata Average Net Electricity Generation: 0.47 MW Minimum Net Electricity Generation: 0.41 MW Initial Net Electricity Generation: 0.46 MW - Average Annual Total Electricity Generation: 4.29 GWh - Average Annual Net Electricity Generation: 3.67 GWh + Average Annual Total Electricity Generation: 4.31 GWh + Average Annual Net Electricity Generation: 3.69 GWh Initial pumping power/net installed power: 16.55 % Average Pumping Power: 0.08 MW Heat to Power Conversion Efficiency: 4.64 % @@ -203,7 +203,7 @@ Simulation Metadata 27 3.4 76.4 21.54 26.51 28 3.3 76.0 21.27 27.44 29 3.3 75.5 21.00 28.37 - 30 2.7 62.6 20.77 29.14 + 30 3.2 75.1 20.73 29.29 ******************************** diff --git a/tests/examples/example_ITC.out b/tests/examples/example_ITC.out index 4444c3f82..9a7cff281 100644 --- a/tests/examples/example_ITC.out +++ b/tests/examples/example_ITC.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.797 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.819 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 18.84 MW - Electricity breakeven price: 3.41 cents/kWh + Electricity breakeven price: 3.40 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -27,10 +27,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: 3.40 MUSD - Project IRR: 7.56 % + Project NPV: 3.58 MUSD + Project IRR: 7.59 % Project VIR=PI=PIR: 1.06 - Project MOIC: 0.61 + Project MOIC: 0.62 Project Payback Period: 12.74 yr Estimated Jobs Created: 41 @@ -121,8 +121,8 @@ Simulation Metadata Average Net Electricity Generation: 18.84 MW Minimum Net Electricity Generation: 18.33 MW Initial Net Electricity Generation: 18.33 MW - Average Annual Total Electricity Generation: 152.71 GWh - Average Annual Net Electricity Generation: 147.70 GWh + Average Annual Total Electricity Generation: 153.57 GWh + Average Annual Net Electricity Generation: 148.53 GWh Initial pumping power/net installed power: 3.56 % Average Pumping Power: 0.64 MW Heat to Power Conversion Efficiency: 17.30 % @@ -200,7 +200,7 @@ Simulation Metadata 27 149.1 861.3 578.06 12.61 28 149.1 861.4 574.96 13.08 29 149.1 861.4 571.86 13.55 - 30 124.3 717.9 569.27 13.94 + 30 149.1 861.5 568.76 14.02 ******************************** diff --git a/tests/examples/example_PTC.out b/tests/examples/example_PTC.out index e7008fac6..38ec41af3 100644 --- a/tests/examples/example_PTC.out +++ b/tests/examples/example_PTC.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.804 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.810 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 18.84 MW - Electricity breakeven price: 8.78 cents/kWh + Electricity breakeven price: 8.75 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec @@ -27,8 +27,8 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: 0.96 MUSD - Project IRR: 7.11 % + Project NPV: 1.14 MUSD + Project IRR: 7.13 % Project VIR=PI=PIR: 1.01 Project MOIC: 0.55 Project Payback Period: 10.02 yr @@ -120,8 +120,8 @@ Simulation Metadata Average Net Electricity Generation: 18.84 MW Minimum Net Electricity Generation: 18.33 MW Initial Net Electricity Generation: 18.33 MW - Average Annual Total Electricity Generation: 152.71 GWh - Average Annual Net Electricity Generation: 147.70 GWh + Average Annual Total Electricity Generation: 153.57 GWh + Average Annual Net Electricity Generation: 148.53 GWh Initial pumping power/net installed power: 3.56 % Average Pumping Power: 0.64 MW Heat to Power Conversion Efficiency: 17.30 % @@ -199,7 +199,7 @@ Simulation Metadata 27 149.1 861.3 578.06 12.61 28 149.1 861.4 574.96 13.08 29 149.1 861.4 571.86 13.55 - 30 124.3 717.9 569.27 13.94 + 30 149.1 861.5 568.76 14.02 ******************************** diff --git a/tests/examples/example_SBT_Hi_T.out b/tests/examples/example_SBT_Hi_T.out index 5505f1ef2..3d94a9e68 100644 --- a/tests/examples/example_SBT_Hi_T.out +++ b/tests/examples/example_SBT_Hi_T.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:38 - Calculation Time: 51.588 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 33.323 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 9.62 MW - Electricity breakeven price: 18.23 cents/kWh + Electricity breakeven price: 18.18 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 80.0 kg/sec @@ -27,10 +27,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -9.40 MUSD - Project IRR: 6.32 % + Project NPV: -8.98 MUSD + Project IRR: 6.35 % Project VIR=PI=PIR: 0.94 - Project MOIC: 0.65 + Project MOIC: 0.66 Project Payback Period: 13.59 yr Estimated Jobs Created: 0 @@ -105,8 +105,8 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t Average Net Electricity Generation: 9.62 MW Minimum Net Electricity Generation: 8.40 MW Initial Net Electricity Generation: 17.60 MW - Average Annual Total Electricity Generation: 75.03 GWh - Average Annual Net Electricity Generation: 75.03 GWh + Average Annual Total Electricity Generation: 75.58 GWh + Average Annual Net Electricity Generation: 75.58 GWh Average Pumping Power: 0.00 MW Heat to Power Conversion Efficiency: 17.15 % @@ -183,7 +183,7 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t 27 67.3 409.0 42.18 50.49 28 67.0 407.9 40.71 52.22 29 66.6 406.8 39.25 53.94 - 30 49.8 304.4 38.15 55.22 + 30 66.4 405.8 37.79 55.65 ******************************** diff --git a/tests/examples/example_SBT_Lo_T.out b/tests/examples/example_SBT_Lo_T.out index ad01e7221..2a7757c62 100644 --- a/tests/examples/example_SBT_Lo_T.out +++ b/tests/examples/example_SBT_Lo_T.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:37 - Calculation Time: 22.627 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 12.779 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 0.00 MW - Electricity breakeven price: 18339.44 cents/kWh + Electricity breakeven price: 18276.64 cents/kWh Number of production wells: 1 Number of injection wells: 1 Flowrate per production well: 6.0 kg/sec @@ -183,7 +183,7 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t 27 0.0 6.8 0.22 75.29 28 0.0 6.8 0.19 78.07 29 0.0 6.8 0.17 80.85 - 30 0.0 5.1 0.15 82.94 + 30 0.0 6.8 0.14 83.63 ******************************** diff --git a/tests/examples/example_SHR-1.out b/tests/examples/example_SHR-1.out index 50942e527..3d283ecf4 100644 --- a/tests/examples/example_SHR-1.out +++ b/tests/examples/example_SHR-1.out @@ -4,22 +4,22 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.795 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.835 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 30.81 MW - Electricity breakeven price: 5.86 cents/kWh + Electricity breakeven price: 5.82 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 55.0 kg/sec Well depth: 7.5 kilometer Geothermal gradient: 50 degC/km - Total Avoided Carbon Emissions: 3087.50 kilotonne + Total Avoided Carbon Emissions: 3104.93 kilotonne ***ECONOMIC PARAMETERS*** @@ -29,10 +29,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: 5.52 MUSD - Project IRR: 7.21 % - Project VIR=PI=PIR: 1.02 - Project MOIC: 1.29 + Project NPV: 6.06 MUSD + Project IRR: 7.23 % + Project VIR=PI=PIR: 1.03 + Project MOIC: 1.30 Project Payback Period: 13.38 yr Estimated Jobs Created: 66 @@ -120,8 +120,8 @@ Simulation Metadata Average Net Electricity Generation: 30.81 MW Minimum Net Electricity Generation: 28.68 MW Initial Net Electricity Generation: 28.68 MW - Average Annual Total Electricity Generation: 241.59 GWh - Average Annual Net Electricity Generation: 241.59 GWh + Average Annual Total Electricity Generation: 242.95 GWh + Average Annual Net Electricity Generation: 242.95 GWh Average Pumping Power: 0.00 MW Heat to Power Conversion Efficiency: 20.28 % @@ -198,7 +198,7 @@ Simulation Metadata 27 245.4 1203.2 815.11 12.50 28 245.4 1203.3 810.77 12.96 29 245.5 1203.5 806.44 13.43 - 30 204.7 1003.0 802.83 13.81 + 30 245.6 1203.7 802.11 13.89 ******************************** diff --git a/tests/examples/example_SHR-2.out b/tests/examples/example_SHR-2.out index 68df85975..66d8ef4e8 100644 --- a/tests/examples/example_SHR-2.out +++ b/tests/examples/example_SHR-2.out @@ -4,22 +4,22 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.537 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.551 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 103.74 MW - Electricity breakeven price: 3.12 cents/kWh + Electricity breakeven price: 3.10 cents/kWh Number of production wells: 2 Number of injection wells: 1 Flowrate per production well: 60.0 kg/sec Well depth: 5.0 kilometer Geothermal gradient: 112 degC/km - Total Avoided Carbon Emissions: 7295.77 kilotonne + Total Avoided Carbon Emissions: 7357.58 kilotonne ***ECONOMIC PARAMETERS*** @@ -29,10 +29,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 20 yr Capacity factor: 95.0 % - Project NPV: 402.91 MUSD - Project IRR: 15.06 % - Project VIR=PI=PIR: 1.97 - Project MOIC: 2.00 + Project NPV: 407.43 MUSD + Project IRR: 15.09 % + Project VIR=PI=PIR: 1.98 + Project MOIC: 2.02 Project Payback Period: 7.61 yr Estimated Jobs Created: 221 @@ -120,8 +120,8 @@ Simulation Metadata Average Net Electricity Generation: 103.74 MW Minimum Net Electricity Generation: 98.77 MW Initial Net Electricity Generation: 98.77 MW - Average Annual Total Electricity Generation: 856.31 GWh - Average Annual Net Electricity Generation: 856.31 GWh + Average Annual Total Electricity Generation: 863.57 GWh + Average Annual Net Electricity Generation: 863.57 GWh Average Pumping Power: 0.00 MW Heat to Power Conversion Efficiency: 35.83 % @@ -178,7 +178,7 @@ Simulation Metadata 17 869.6 2416.4 1283.59 10.30 18 870.0 2416.8 1274.89 10.91 19 870.3 2417.1 1266.19 11.52 - 20 725.5 2014.5 1258.93 12.02 + 20 870.6 2417.4 1257.48 12.13 ******************************** diff --git a/tests/examples/example_multiple_gradients-2.out b/tests/examples/example_multiple_gradients-2.out index fc8180437..8fbb26c45 100644 --- a/tests/examples/example_multiple_gradients-2.out +++ b/tests/examples/example_multiple_gradients-2.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:32 - Calculation Time: 0.800 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.817 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 8.00 MW - Electricity breakeven price: 9.15 cents/kWh + Electricity breakeven price: 9.11 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 60.0 kg/sec @@ -34,10 +34,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -56.19 MUSD - Project IRR: -3.25 % + Project NPV: -56.12 MUSD + Project IRR: -3.14 % Project VIR=PI=PIR: 0.26 - Project MOIC: -0.23 + Project MOIC: -0.22 Project Payback Period: N/A Estimated Jobs Created: 17 @@ -133,8 +133,8 @@ Simulation Metadata Average Net Electricity Generation: 8.00 MW Minimum Net Electricity Generation: 7.09 MW Initial Net Electricity Generation: 8.37 MW - Average Annual Total Electricity Generation: 64.20 GWh - Average Annual Net Electricity Generation: 62.72 GWh + Average Annual Total Electricity Generation: 64.52 GWh + Average Annual Net Electricity Generation: 63.03 GWh Initial pumping power/net installed power: 2.05 % Average Pumping Power: 0.19 MW Heat to Power Conversion Efficiency: 11.89 % @@ -212,7 +212,7 @@ Simulation Metadata 27 58.0 510.3 326.22 13.70 28 57.4 507.8 324.39 14.18 29 56.7 505.1 322.57 14.66 - 30 46.8 419.0 321.07 15.06 + 30 56.1 502.7 320.76 15.14 ******************************** diff --git a/tests/examples/example_multiple_gradients.out b/tests/examples/example_multiple_gradients.out index da351f723..18bf8676b 100644 --- a/tests/examples/example_multiple_gradients.out +++ b/tests/examples/example_multiple_gradients.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.807 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:05 + Calculation Time: 0.803 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 8.00 MW - Electricity breakeven price: 9.15 cents/kWh + Electricity breakeven price: 9.11 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 60.0 kg/sec @@ -34,10 +34,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -56.19 MUSD - Project IRR: -3.25 % + Project NPV: -56.12 MUSD + Project IRR: -3.14 % Project VIR=PI=PIR: 0.26 - Project MOIC: -0.23 + Project MOIC: -0.22 Project Payback Period: N/A Estimated Jobs Created: 17 @@ -133,8 +133,8 @@ Simulation Metadata Average Net Electricity Generation: 8.00 MW Minimum Net Electricity Generation: 7.09 MW Initial Net Electricity Generation: 8.37 MW - Average Annual Total Electricity Generation: 64.20 GWh - Average Annual Net Electricity Generation: 62.72 GWh + Average Annual Total Electricity Generation: 64.52 GWh + Average Annual Net Electricity Generation: 63.03 GWh Initial pumping power/net installed power: 2.05 % Average Pumping Power: 0.19 MW Heat to Power Conversion Efficiency: 11.89 % @@ -212,7 +212,7 @@ Simulation Metadata 27 58.0 510.3 326.22 13.70 28 57.4 507.8 324.39 14.18 29 56.7 505.1 322.57 14.66 - 30 46.8 419.0 321.07 15.06 + 30 56.1 502.7 320.76 15.14 ******************************** diff --git a/tests/examples/example_overpressure.out b/tests/examples/example_overpressure.out index 2d4c7e5b3..e297cb8ed 100644 --- a/tests/examples/example_overpressure.out +++ b/tests/examples/example_overpressure.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.796 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.799 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 5.22 MW - Electricity breakeven price: 9.41 cents/kWh + Electricity breakeven price: 9.37 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 70.0 kg/sec @@ -28,10 +28,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -2.88 MUSD - Project IRR: 6.47 % + Project NPV: -2.76 MUSD + Project IRR: 6.49 % Project VIR=PI=PIR: 0.94 - Project MOIC: 0.78 + Project MOIC: 0.79 Project Payback Period: 14.60 yr Estimated Jobs Created: 13 @@ -123,8 +123,8 @@ Simulation Metadata Average Net Electricity Generation: 5.22 MW Minimum Net Electricity Generation: 4.64 MW Initial Net Electricity Generation: 5.71 MW - Average Annual Total Electricity Generation: 47.76 GWh - Average Annual Net Electricity Generation: 40.92 GWh + Average Annual Total Electricity Generation: 48.03 GWh + Average Annual Net Electricity Generation: 41.13 GWh Initial pumping power/net installed power: 3.71 % Average Pumping Power: 0.87 MW Heat to Power Conversion Efficiency: 8.26 % @@ -202,7 +202,7 @@ Simulation Metadata 27 37.6 499.1 251.27 16.16 28 37.3 499.1 249.48 16.76 29 37.0 499.1 247.68 17.36 - 30 30.6 415.9 246.18 17.86 + 30 36.7 499.0 245.88 17.96 ******************************** diff --git a/tests/examples/example_overpressure2.out b/tests/examples/example_overpressure2.out index 60c5d1bd8..66d49069e 100644 --- a/tests/examples/example_overpressure2.out +++ b/tests/examples/example_overpressure2.out @@ -4,16 +4,16 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.7.20 - Simulation Date: 2025-03-04 - Simulation Time: 08:31 - Calculation Time: 0.795 sec + GEOPHIRES Version: 3.7.21 + Simulation Date: 2025-03-05 + Simulation Time: 15:04 + Calculation Time: 0.799 sec ***SUMMARY OF RESULTS*** End-Use Option: Electricity Average Net Electricity Production: 5.34 MW - Electricity breakeven price: 9.16 cents/kWh + Electricity breakeven price: 9.12 cents/kWh Number of production wells: 2 Number of injection wells: 2 Flowrate per production well: 70.0 kg/sec @@ -28,10 +28,10 @@ Simulation Metadata Accrued financing during construction: 0.00 Project lifetime: 30 yr Capacity factor: 90.0 % - Project NPV: -1.42 MUSD - Project IRR: 6.74 % + Project NPV: -1.29 MUSD + Project IRR: 6.77 % Project VIR=PI=PIR: 0.97 - Project MOIC: 0.83 + Project MOIC: 0.84 Project Payback Period: 14.38 yr Estimated Jobs Created: 13 @@ -123,8 +123,8 @@ Simulation Metadata Average Net Electricity Generation: 5.34 MW Minimum Net Electricity Generation: 4.82 MW Initial Net Electricity Generation: 5.71 MW - Average Annual Total Electricity Generation: 47.76 GWh - Average Annual Net Electricity Generation: 41.88 GWh + Average Annual Total Electricity Generation: 48.03 GWh + Average Annual Net Electricity Generation: 42.09 GWh Initial pumping power/net installed power: 3.71 % Average Pumping Power: 0.75 MW Heat to Power Conversion Efficiency: 8.45 % @@ -202,7 +202,7 @@ Simulation Metadata 27 39.0 499.1 251.27 16.16 28 38.7 499.1 249.48 16.76 29 38.4 499.1 247.68 17.36 - 30 31.8 415.9 246.18 17.86 + 30 38.1 499.0 245.88 17.96 ******************************** diff --git a/tests/test_geophires_x.py b/tests/test_geophires_x.py index f36638ac0..0b664e0f7 100644 --- a/tests/test_geophires_x.py +++ b/tests/test_geophires_x.py @@ -379,7 +379,7 @@ def get_fcr_lcoe(fcr: float) -> float: self.assertAlmostEqual(9.61, get_fcr_lcoe(0.05), places=1) self.assertAlmostEqual(3.33, get_fcr_lcoe(0.0001), places=1) - self.assertAlmostEqual(104.34, get_fcr_lcoe(0.8), places=0) + self.assertAlmostEqual(103.76, get_fcr_lcoe(0.8), places=0) def test_vapor_pressure_above_critical_temperature(self): """https://github.com/NREL/GEOPHIRES-X/issues/214""" From dafee5b0c7db57fcc229a3f45bd74386eb491fdb Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:20:04 -0800 Subject: [PATCH 08/15] fix/update s-dac profile parsing test --- tests/test_geophires_x_client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_geophires_x_client.py b/tests/test_geophires_x_client.py index 1286af608..d135fca9e 100644 --- a/tests/test_geophires_x_client.py +++ b/tests/test_geophires_x_client.py @@ -573,11 +573,11 @@ def test_parse_sdacgt_profile(self): ) # Values below need to be synchronized if S-DAC-GT example output values change. - self.assertEqual(sdacgt_profile[1], [1, 78330.8, 78330.8, 17411627.98, 17411627.98, 222.28]) + self.assertEqual([1, 78330.8, 78330.8, 17411627.98, 17411627.98, 222.28], sdacgt_profile[1]) self.assertEqual( - sdacgt_profile[15], [15, 76263.89, 1167207.48, 16952186.81, 259450710.33, 222.28], + sdacgt_profile[15], ) - self.assertEqual(sdacgt_profile[30], [30, 61974.61, 2246284.1, 13775920.11, 499311405.59, 222.28]) + self.assertEqual([30, 68860.68, 2253170.17, 15306577.89, 500842063.38, 222.28], sdacgt_profile[30]) From ee636dc67abc197b71799d05a36ce3a2f103af69 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:45:56 -0800 Subject: [PATCH 09/15] Don't wrap dx_steps as single-member tuple --- src/geophires_x/SurfacePlant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index 4d248114d..03938b86e 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -23,7 +23,7 @@ def integrate_time_series_slice( if len(_slice) == 1: return _slice[0] - dx_steps = (len(_slice) - 1) + dx_steps = len(_slice) - 1 return np.trapz( _slice, From c7e597fa50f3057b4adf5f91b59983e10a31706b Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:46:26 -0800 Subject: [PATCH 10/15] Run SBT example tests last to reduce wait time under some development circumstances --- tests/test_geophires_x.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_geophires_x.py b/tests/test_geophires_x.py index 0b664e0f7..6e74fa8fd 100644 --- a/tests/test_geophires_x.py +++ b/tests/test_geophires_x.py @@ -168,6 +168,12 @@ def get_output_file_for_example(example_file: str): ) ) + # Run SBT examples last because they take an inordinately long time (tens of seconds even on a fast machine). + # This reduces time spent waiting for tests to run if you are iterating on changes that affect non-SBT examples. + for ef in [_ef for _ef in example_files if _ef.startswith('example_SBT')]: + example_files.remove(ef) + example_files.append(ef) + assert len(example_files) > 0 # test integrity check - no files means something is misconfigured regenerate_cmds = [] for example_file_path in example_files: From a9eb0438fc29d5b46470780965d2521d5cfbb124 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 6 Mar 2025 09:22:42 -0800 Subject: [PATCH 11/15] unit test time series integration --- tests/geophires_x_tests/test_surface_plant.py | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 tests/geophires_x_tests/test_surface_plant.py diff --git a/tests/geophires_x_tests/test_surface_plant.py b/tests/geophires_x_tests/test_surface_plant.py new file mode 100644 index 000000000..7c5c73658 --- /dev/null +++ b/tests/geophires_x_tests/test_surface_plant.py @@ -0,0 +1,89 @@ +import os +import sys +from pathlib import Path + +import numpy as np + +from geophires_x.Model import Model +from tests.base_test_case import BaseTestCase + + +class SurfacePlantTestCase(BaseTestCase): + + def test_integrate_time_series_slice_1_time_step_per_year(self): + self._workaround_module_initialization_order_dependency() + from geophires_x.SurfacePlant import SurfacePlant + + time_steps_per_year = 1 + utilization_factor = 0.9 + + def _integrate_slice(series: np.ndarray, _i: int) -> np.float64: + return SurfacePlant.integrate_time_series_slice(series, _i, time_steps_per_year, utilization_factor) + + plant_lifetime = 20 + ElectricityProduced = [ + 456.1403991563267, + 456.1403991563267, + 456.9435504549861, + 457.36358815671883, + 457.6422257879382, + 457.8482065397373, + 458.01033644148254, + 458.1433031993208, + 458.2555647922617, + 458.35241646970593, + 458.4373827710431, + 458.51292228292505, + 458.58081486894883, + 458.6423884476247, + 458.69865878571187, + 458.7504193786508, + 458.7983013143066, + 458.84281435825204, + 458.8843758887934, + 458.9233317382275, + ] + + NetElectricityProduced = [ + 402.39393233698496, + 402.39393233698496, + 403.2023017770401, + 403.6250678276089, + 403.9055150923539, + 404.11283347253067, + 404.2760161602529, + 404.40984628330665, + 404.52283676542146, + 404.6203172528295, + 404.70583517837395, + 404.78186509759365, + 404.8501984341015, + 404.9121717307827, + 404.9688073512418, + 405.020903944086, + 405.0690966955198, + 405.11389868149865, + 405.15572999069246, + 405.19493870111074, + ] + + TotalkWhProduced = np.zeros(plant_lifetime) + NetkWhProduced = np.zeros(plant_lifetime) + for i in range(plant_lifetime): + TotalkWhProduced[i] = _integrate_slice(ElectricityProduced, i) + NetkWhProduced[i] = _integrate_slice(NetElectricityProduced, i) + + self.assertEqual(TotalkWhProduced[-1], ElectricityProduced[-1]) + + def _workaround_module_initialization_order_dependency(self) -> Model: + stash_cwd = Path.cwd() + stash_sys_argv = sys.argv + + sys.argv = [''] + + m = Model(enable_geophires_logging_config=False) + + sys.argv = stash_sys_argv + os.chdir(stash_cwd) + + return m From f7e5aabfd5d0991888a1072fa717187dc2d9d611 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 10 Mar 2025 06:46:40 -0700 Subject: [PATCH 12/15] =?UTF-8?q?Bump=20version:=203.7.21=20=E2=86=92=203.?= =?UTF-8?q?7.22?= 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 999dbcb50..5cecb4be6 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.7.21 +current_version = 3.7.22 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index acbfd9b3d..15f79932c 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.7.21 + version: 3.7.22 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/README.rst b/README.rst index 822677c1c..85fd1a96a 100644 --- a/README.rst +++ b/README.rst @@ -56,9 +56,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.7.21.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.7.22.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.7.21...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.7.22...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 0fd15de85..a5e359a26 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2025' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.7.21' +version = release = '3.7.22' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index 84a64d828..e9a7e6a8a 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.7.21', + version='3.7.22', 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 7eac7d0ca..883e5acec 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.7.21' +__version__ = '3.7.22' From b53d3fcea56831cb26d027496fdb037790ad8043 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 10 Mar 2025 08:29:34 -0700 Subject: [PATCH 13/15] Apply conversion & utilization factor when slice length = 1 --- src/geophires_x/SurfacePlant.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index 03938b86e..1d118ef8d 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -21,14 +21,16 @@ def integrate_time_series_slice( # Note that len(_slice) - 1 may be less than time_steps_per_year for the last slice. if len(_slice) == 1: - return _slice[0] + integral = _slice[0] + else: + dx_steps = len(_slice) - 1 - dx_steps = len(_slice) - 1 + integral = np.trapz( + _slice, + dx=1. / dx_steps * 365. * 24. + ) - return np.trapz( - _slice, - dx=1. / dx_steps * 365. * 24. - ) * 1000. * utilization_factor + return integral * 1000. * utilization_factor def remaining_reservoir_heat_content(self, InitialReservoirHeatContent: np.ndarray, HeatkWhExtracted: np.ndarray) -> np.ndarray: """ From d40a516c7c67769e32387b69fe185a3f2b3b6451 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 10 Mar 2025 09:07:44 -0700 Subject: [PATCH 14/15] fix single-time-step-per-year integration logic, with additional full unit test --- src/geophires_x/SurfacePlant.py | 22 +++++++----- src/geophires_x/WellBores.py | 2 +- tests/geophires_x_tests/test_surface_plant.py | 3 +- tests/test_geophires_x.py | 34 +++++++++++++++++++ 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/geophires_x/SurfacePlant.py b/src/geophires_x/SurfacePlant.py index 1d118ef8d..8a1efd5a0 100644 --- a/src/geophires_x/SurfacePlant.py +++ b/src/geophires_x/SurfacePlant.py @@ -16,19 +16,25 @@ def integrate_time_series_slice( time_steps_per_year: int, utilization_factor: float ) -> np.float64: - _slice = series[(0 + _i * time_steps_per_year):((_i + 1) * time_steps_per_year) + 1] + slice_start_index = _i * time_steps_per_year + slice_end_index = ((_i + 1) * time_steps_per_year) + 1 + _slice = list(series[slice_start_index:slice_end_index]) # Note that len(_slice) - 1 may be less than time_steps_per_year for the last slice. if len(_slice) == 1: - integral = _slice[0] - else: - dx_steps = len(_slice) - 1 + extrapolated_future_datapoint = _slice[0] + if slice_start_index - 1 > 0: + delta = series[slice_start_index] - series[slice_start_index - 1] + extrapolated_future_datapoint = _slice[0] + delta + _slice.append(extrapolated_future_datapoint) + + dx_steps = len(_slice) - 1 - integral = np.trapz( - _slice, - dx=1. / dx_steps * 365. * 24. - ) + integral = np.trapz( + _slice, + dx=1. / dx_steps * 365. * 24. + ) return integral * 1000. * utilization_factor diff --git a/src/geophires_x/WellBores.py b/src/geophires_x/WellBores.py index 89d957dc0..7c8fbd87a 100644 --- a/src/geophires_x/WellBores.py +++ b/src/geophires_x/WellBores.py @@ -196,7 +196,7 @@ def RameyCalc(krock: float, rhorock: float, cprock: float, welldiam: float, tv, framey = np.zeros(alen) framey[1:] = -np.log( 1.1 * (welldiam / 2.0) / np.sqrt(4. * alpharock * tv[1:] * 365.0 * 24.0 * 3600.0 * utilfactor)) - 0.29 - framey[0] = framey[1] # fource the first value to be the same as the second to get away from near surface effects + framey[0] = framey[1] # force the first value to be the same as the second to get away from near surface effects rameyA = flowrate * cpwater * framey / 2 / math.pi / krock TempDrop = -((Trock - Tresoutput) - averagegradient * (depth - rameyA) + ( Tresoutput - averagegradient * rameyA - Trock) * np.exp(-depth / rameyA)) diff --git a/tests/geophires_x_tests/test_surface_plant.py b/tests/geophires_x_tests/test_surface_plant.py index 7c5c73658..bf18d0694 100644 --- a/tests/geophires_x_tests/test_surface_plant.py +++ b/tests/geophires_x_tests/test_surface_plant.py @@ -73,7 +73,8 @@ def _integrate_slice(series: np.ndarray, _i: int) -> np.float64: TotalkWhProduced[i] = _integrate_slice(ElectricityProduced, i) NetkWhProduced[i] = _integrate_slice(NetElectricityProduced, i) - self.assertEqual(TotalkWhProduced[-1], ElectricityProduced[-1]) + self.assertAlmostEqual(3194711457.45603, NetkWhProduced[-1], places=3) + self.assertAlmostEqual(TotalkWhProduced[-2], TotalkWhProduced[-1], delta=308_000) def _workaround_module_initialization_order_dependency(self) -> Model: stash_cwd = Path.cwd() diff --git a/tests/test_geophires_x.py b/tests/test_geophires_x.py index 6e74fa8fd..82574bc8f 100644 --- a/tests/test_geophires_x.py +++ b/tests/test_geophires_x.py @@ -676,3 +676,37 @@ def _c_non_vert(r: GeophiresXResult) -> dict: self.assertIsNotNone(_c_non_vert(r_1)['value']) self.assertEqual(_c_non_vert(r_1)['value'], _c_non_vert(_get_result(2))['value']) + + def test_single_time_step_per_year(self): + result_1 = GeophiresXClient().get_geophires_result( + GeophiresInputParameters( + from_file_path=self._get_test_file_path('geophires_x_tests/generic-egs-case.txt'), + params={'Time steps per year': 1}, + ) + ) + + result_1_final_val = result_1.heat_electricity_extraction_generation_profile[-1][1] + self.assertGreater(result_1_final_val, 0) + + result_2 = GeophiresXClient().get_geophires_result( + GeophiresInputParameters( + from_file_path=self._get_test_file_path('geophires_x_tests/generic-egs-case.txt'), + params={'Time steps per year': 2}, + ) + ) + + result_2_final_val = result_2.heat_electricity_extraction_generation_profile[-1][1] + self.assertAlmostEqual(result_2_final_val, result_1_final_val, delta=1.5) + + # TODO enable once https://github.com/NREL/GEOPHIRES-X/issues/352 is resolved + # result_1_1 = GeophiresXClient().get_geophires_result( + # GeophiresInputParameters( + # from_file_path=self._get_test_file_path('geophires_x_tests/generic-egs-case.txt'), + # params={ + # 'Time steps per year': 1, + # 'Plant Lifetime': 1 + # }, + # ) + # ) + # + # self.assertIsNotNone(result_1_1) From 6ecc3969cb9a21fd69e6282b8b7eb693221d2855 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Mon, 10 Mar 2025 09:07:53 -0700 Subject: [PATCH 15/15] =?UTF-8?q?Bump=20version:=203.7.22=20=E2=86=92=203.?= =?UTF-8?q?7.23?= 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 5cecb4be6..28f00cbc7 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.7.22 +current_version = 3.7.23 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index 15f79932c..8f877388b 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.7.22 + version: 3.7.23 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/README.rst b/README.rst index 85fd1a96a..bebf3efb9 100644 --- a/README.rst +++ b/README.rst @@ -56,9 +56,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.7.22.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.7.23.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.7.22...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.7.23...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 a5e359a26..07ec78477 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2025' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.7.22' +version = release = '3.7.23' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index e9a7e6a8a..30ffceeeb 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.7.22', + version='3.7.23', 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 883e5acec..3a6e80112 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.7.22' +__version__ = '3.7.23'