From 54453a581e60ba32066077b4cacebd319428406c Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:30:08 -0700 Subject: [PATCH 01/14] include indirect costs in vertical/lateral drilling cost sub-items (WIP to regenerate affected examples & schema) --- src/geophires_x/Economics.py | 20 +++++++++++++++++++- src/geophires_x/Outputs.py | 12 +++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index 75995a32f..f5453edd7 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -2516,6 +2516,20 @@ def __init__(self, model: Model): PreferredUnits=CurrencyUnit.MDOLLARS, CurrentUnits=CurrencyUnit.MDOLLARS ) + self.cost_per_vertical_production_well = self.OutputParameterDict[self.cost_per_vertical_production_well.Name] = OutputParameter( + Name="Drilling and completion costs per vertical production well", + UnitType=Units.CURRENCY, + PreferredUnits=CurrencyUnit.MDOLLARS, + CurrentUnits=CurrencyUnit.MDOLLARS, + # TODO tooltip - includes indirect costs + ) + self.cost_per_vertical_injection_well = self.OutputParameterDict[self.cost_per_vertical_injection_well.Name] = OutputParameter( + Name="Drilling and completion costs per vertical production well", + UnitType=Units.CURRENCY, + PreferredUnits=CurrencyUnit.MDOLLARS, + CurrentUnits=CurrencyUnit.MDOLLARS, + # TODO tooltip - includes indirect costs + ) self.cost_to_junction_section = self.OutputParameterDict[self.cost_to_junction_section.Name] = OutputParameter( Name="Cost of the entire section of a well from bottom of vertical to junction with laterals", UnitType=Units.CURRENCY, @@ -4101,7 +4115,11 @@ def _calculate_derived_outputs(self, model: Model) -> None: self.cost_per_lateral_section.value = ( self.cost_lateral_section.quantity().to(self.cost_per_lateral_section.CurrentUnits).magnitude / model.wellbores.numnonverticalsections.value - ) + ) * self._wellfield_indirect_cost_factor + self.cost_per_vertical_production_well.value = self.cost_one_production_well.quantity().to( + self.cost_per_vertical_production_well.CurrentUnits).magnitude * self._wellfield_indirect_cost_factor + self.cost_per_vertical_injection_well.value = self.cost_one_injection_well.quantity().to( + self.cost_per_vertical_injection_well.CurrentUnits).magnitude * self._wellfield_indirect_cost_factor if hasattr(self, 'discountrate'): self.real_discount_rate.value = self.discountrate.quantity().to(convertible_unit( diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index fba067888..cb04f9776 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -486,9 +486,15 @@ def PrintOutputs(self, model: Model): f.write(f' {model.economics.Cwell.display_name}: {model.economics.Cwell.value:10.2f} {model.economics.Cwell.CurrentUnits.value}\n') if econ.cost_lateral_section.value > 0.0: - f.write(f' Drilling and completion costs per vertical production well: {econ.cost_one_production_well.value:10.2f} {econ.cost_one_production_well.CurrentUnits.value}\n') - f.write(f' Drilling and completion costs per vertical injection well: {econ.cost_one_injection_well.value:10.2f} {econ.cost_one_injection_well.CurrentUnits.value}\n') - f.write(f' {econ.cost_per_lateral_section.Name}: {econ.cost_per_lateral_section.value:10.2f} {econ.cost_lateral_section.CurrentUnits.value}\n') + f.write(f' {econ.cost_per_vertical_production_well.display_name}: ' + f'{econ.cost_per_vertical_production_well.value:10.2f} ' + f'{econ.cost_per_vertical_production_well.CurrentUnits.value}\n') + f.write(f' {econ.cost_per_vertical_injection_well.display_name}: ' + f'{econ.cost_per_vertical_injection_well.value:10.2f} ' + f'{econ.cost_per_vertical_injection_well.CurrentUnits.value}\n') + f.write(f' {econ.cost_per_lateral_section.display_name}: ' + f'{econ.cost_per_lateral_section.value:10.2f} ' + f'{econ.cost_lateral_section.CurrentUnits.value}\n') elif round(econ.cost_one_production_well.value, 4) != round(econ.cost_one_injection_well.value, 4) \ and model.economics.cost_one_injection_well.value != -1: f.write(f' {econ.cost_one_production_well.display_name}: {econ.cost_one_production_well.value:10.2f} {econ.cost_one_production_well.CurrentUnits.value}\n') From 3e9d48584fd5bee5f057cd840bcdd5e3d9d98df7 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:37:54 -0700 Subject: [PATCH 02/14] fix display name output issue in previous commit, regenerate select affected examples (still WIP) --- src/geophires_x/Economics.py | 2 +- tests/examples/Fervo_Norbeck_Latimer_2023.out | 17 ++++++++--------- tests/examples/Fervo_Project_Red-2026.out | 14 +++++++------- ...Closed-Loop_Geothermal_Energy_Recovery.out | 19 +++++++++---------- .../example_SAM-single-owner-PPA-3.out | 14 +++++++------- .../example_SAM-single-owner-PPA-4.out | 14 +++++++------- .../example_SAM-single-owner-PPA-4b.out | 14 +++++++------- .../examples/example_SAM-single-owner-PPA.out | 14 +++++++------- tests/examples/example_SBT_Hi_T.out | 17 ++++++++--------- tests/examples/example_SBT_Lo_T.out | 17 ++++++++--------- tests/examples/example_SBT_ULoop.out | 17 ++++++++--------- 11 files changed, 77 insertions(+), 82 deletions(-) diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index f5453edd7..879090fa7 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -2524,7 +2524,7 @@ def __init__(self, model: Model): # TODO tooltip - includes indirect costs ) self.cost_per_vertical_injection_well = self.OutputParameterDict[self.cost_per_vertical_injection_well.Name] = OutputParameter( - Name="Drilling and completion costs per vertical production well", + Name="Drilling and completion costs per vertical injection well", UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, CurrentUnits=CurrencyUnit.MDOLLARS, diff --git a/tests/examples/Fervo_Norbeck_Latimer_2023.out b/tests/examples/Fervo_Norbeck_Latimer_2023.out index f8d443af0..6d438a207 100644 --- a/tests/examples/Fervo_Norbeck_Latimer_2023.out +++ b/tests/examples/Fervo_Norbeck_Latimer_2023.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.9.47 - Simulation Date: 2025-07-31 - Simulation Time: 08:57 - Calculation Time: 0.475 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 0.527 sec ***SUMMARY OF RESULTS*** @@ -95,15 +95,15 @@ Simulation Metadata ***CAPITAL COSTS (M$)*** + Exploration costs: 3.62 MUSD Drilling and completion costs: 10.13 MUSD - Drilling and completion costs per vertical production well: 3.02 MUSD - Drilling and completion costs per vertical injection well: 3.02 MUSD - Drilling and completion costs per non-vertical section: 1.80 MUSD + Drilling and completion costs per vertical production well: 3.17 MUSD + Drilling and completion costs per vertical injection well: 3.17 MUSD + Drilling and completion costs per non-vertical section: 1.89 MUSD Stimulation costs: 1.51 MUSD Surface power plant costs: 11.34 MUSD Field gathering system costs: 1.52 MUSD Total surface equipment costs: 12.85 MUSD - Exploration costs: 3.62 MUSD Total capital costs: 28.12 MUSD @@ -116,7 +116,6 @@ Simulation Metadata ***SURFACE EQUIPMENT SIMULATION RESULTS*** - Initial geofluid availability: 0.15 MW/(kg/s) Maximum Total Electricity Generation: 2.97 MW Average Total Electricity Generation: 2.90 MW diff --git a/tests/examples/Fervo_Project_Red-2026.out b/tests/examples/Fervo_Project_Red-2026.out index 5586c832d..dbdd40b6c 100644 --- a/tests/examples/Fervo_Project_Red-2026.out +++ b/tests/examples/Fervo_Project_Red-2026.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.13.3 - Simulation Date: 2026-04-23 - Simulation Time: 09:27 - Calculation Time: 1.039 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 1.030 sec ***SUMMARY OF RESULTS*** @@ -102,9 +102,9 @@ Simulation Metadata Exploration costs: 3.62 MUSD Drilling and completion costs: 10.13 MUSD - Drilling and completion costs per vertical production well: 3.02 MUSD - Drilling and completion costs per vertical injection well: 3.02 MUSD - Drilling and completion costs per non-vertical section: 1.80 MUSD + Drilling and completion costs per vertical production well: 3.17 MUSD + Drilling and completion costs per vertical injection well: 3.17 MUSD + Drilling and completion costs per non-vertical section: 1.89 MUSD Stimulation costs: 1.51 MUSD Surface power plant costs: 10.49 MUSD Field gathering system costs: 1.61 MUSD 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 09da4f1ab..a7c3d4e16 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.9.7 - Simulation Date: 2025-05-15 - Simulation Time: 09:22 - Calculation Time: 1.580 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 1.798 sec ***SUMMARY OF RESULTS*** @@ -24,7 +24,7 @@ Simulation Metadata ***ECONOMIC PARAMETERS*** Economic Model = BICYCLE - Accrued financing during construction: 0.00 % + Accrued financing during construction: 0.00 % Project lifetime: 40 yr Capacity factor: 90.0 % Project NPV: -74.72 MUSD @@ -74,15 +74,15 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***CAPITAL COSTS (M$)*** + Exploration costs: 7.74 MUSD Drilling and completion costs: 53.82 MUSD - Drilling and completion costs per vertical production well: 8.35 MUSD - Drilling and completion costs per vertical injection well: 8.35 MUSD - Drilling and completion costs per non-vertical section: 11.52 MUSD + Drilling and completion costs per vertical production well: 8.76 MUSD + Drilling and completion costs per vertical injection well: 8.76 MUSD + Drilling and completion costs per non-vertical section: 12.10 MUSD Stimulation costs: 0.00 MUSD Surface power plant costs: 6.74 MUSD Field gathering system costs: 0.99 MUSD Total surface equipment costs: 7.72 MUSD - Exploration costs: 7.74 MUSD Total capital costs: 69.27 MUSD @@ -95,7 +95,6 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** - Initial geofluid availability: 0.06 MW/(kg/s) Maximum Total Electricity Generation: 1.67 MW Average Total Electricity Generation: 1.11 MW diff --git a/tests/examples/example_SAM-single-owner-PPA-3.out b/tests/examples/example_SAM-single-owner-PPA-3.out index 7f86a1143..2a778b053 100644 --- a/tests/examples/example_SAM-single-owner-PPA-3.out +++ b/tests/examples/example_SAM-single-owner-PPA-3.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-05 - Simulation Time: 07:35 - Calculation Time: 1.219 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 1.225 sec ***SUMMARY OF RESULTS*** @@ -100,9 +100,9 @@ Simulation Metadata Exploration costs: 3.89 MUSD Drilling and completion costs: 49.18 MUSD - Drilling and completion costs per vertical production well: 3.37 MUSD - Drilling and completion costs per vertical injection well: 3.37 MUSD - Drilling and completion costs per non-vertical section: 2.14 MUSD + Drilling and completion costs per vertical production well: 3.54 MUSD + Drilling and completion costs per vertical injection well: 3.54 MUSD + Drilling and completion costs per non-vertical section: 2.24 MUSD Stimulation costs: 9.06 MUSD Surface power plant costs: 144.44 MUSD Field gathering system costs: 5.80 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-4.out b/tests/examples/example_SAM-single-owner-PPA-4.out index f12a5bc63..336b70a92 100644 --- a/tests/examples/example_SAM-single-owner-PPA-4.out +++ b/tests/examples/example_SAM-single-owner-PPA-4.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-01 - Simulation Time: 09:30 - Calculation Time: 1.226 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 1.244 sec ***SUMMARY OF RESULTS*** @@ -101,9 +101,9 @@ Simulation Metadata Exploration costs: 3.89 MUSD Drilling and completion costs: 49.18 MUSD - Drilling and completion costs per vertical production well: 3.37 MUSD - Drilling and completion costs per vertical injection well: 3.37 MUSD - Drilling and completion costs per non-vertical section: 2.14 MUSD + Drilling and completion costs per vertical production well: 3.54 MUSD + Drilling and completion costs per vertical injection well: 3.54 MUSD + Drilling and completion costs per non-vertical section: 2.24 MUSD Stimulation costs: 9.06 MUSD Surface power plant costs: 144.44 MUSD Field gathering system costs: 8.50 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA-4b.out b/tests/examples/example_SAM-single-owner-PPA-4b.out index 08cad77e8..2e9fdf962 100644 --- a/tests/examples/example_SAM-single-owner-PPA-4b.out +++ b/tests/examples/example_SAM-single-owner-PPA-4b.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.12.1 - Simulation Date: 2026-04-01 - Simulation Time: 09:30 - Calculation Time: 1.299 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 1.221 sec ***SUMMARY OF RESULTS*** @@ -101,9 +101,9 @@ Simulation Metadata Exploration costs: 3.89 MUSD Drilling and completion costs: 49.18 MUSD - Drilling and completion costs per vertical production well: 3.37 MUSD - Drilling and completion costs per vertical injection well: 3.37 MUSD - Drilling and completion costs per non-vertical section: 2.14 MUSD + Drilling and completion costs per vertical production well: 3.54 MUSD + Drilling and completion costs per vertical injection well: 3.54 MUSD + Drilling and completion costs per non-vertical section: 2.24 MUSD Stimulation costs: 9.06 MUSD Surface power plant costs: 144.44 MUSD Field gathering system costs: 8.50 MUSD diff --git a/tests/examples/example_SAM-single-owner-PPA.out b/tests/examples/example_SAM-single-owner-PPA.out index bc773e897..aa5b525d7 100644 --- a/tests/examples/example_SAM-single-owner-PPA.out +++ b/tests/examples/example_SAM-single-owner-PPA.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.1 - Simulation Date: 2026-09-07 - Simulation Time: 07:06 - Calculation Time: 1.235 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 1.208 sec ***SUMMARY OF RESULTS*** @@ -101,9 +101,9 @@ Simulation Metadata Exploration costs: 3.89 MUSD Drilling and completion costs: 69.36 MUSD - Drilling and completion costs per vertical production well: 3.37 MUSD - Drilling and completion costs per vertical injection well: 3.37 MUSD - Drilling and completion costs per non-vertical section: 2.14 MUSD + Drilling and completion costs per vertical production well: 3.54 MUSD + Drilling and completion costs per vertical injection well: 3.54 MUSD + Drilling and completion costs per non-vertical section: 2.24 MUSD Stimulation costs: 9.06 MUSD Surface power plant costs: 144.44 MUSD Field gathering system costs: 8.50 MUSD diff --git a/tests/examples/example_SBT_Hi_T.out b/tests/examples/example_SBT_Hi_T.out index 6ede81c09..066b100b5 100644 --- a/tests/examples/example_SBT_Hi_T.out +++ b/tests/examples/example_SBT_Hi_T.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.11.13 - Simulation Date: 2026-02-22 - Simulation Time: 08:35 - Calculation Time: 5.304 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 7.044 sec ***SUMMARY OF RESULTS*** @@ -74,15 +74,15 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***CAPITAL COSTS (M$)*** + Exploration costs: 0.00 MUSD Drilling and completion costs: 104.87 MUSD - Drilling and completion costs per vertical production well: 6.19 MUSD - Drilling and completion costs per vertical injection well: 6.19 MUSD - Drilling and completion costs per non-vertical section: 7.71 MUSD + Drilling and completion costs per vertical production well: 6.50 MUSD + Drilling and completion costs per vertical injection well: 6.50 MUSD + Drilling and completion costs per non-vertical section: 8.09 MUSD Stimulation costs: 0.00 MUSD Surface power plant costs: 52.73 MUSD Field gathering system costs: 0.97 MUSD Total surface equipment costs: 53.69 MUSD - Exploration costs: 0.00 MUSD Total capital costs: 158.56 MUSD @@ -95,7 +95,6 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** - Initial geofluid availability: 0.46 MW/(kg/s) Maximum Total Electricity Generation: 17.58 MW Average Total Electricity Generation: 9.73 MW diff --git a/tests/examples/example_SBT_Lo_T.out b/tests/examples/example_SBT_Lo_T.out index dee1016fb..58b9830d3 100644 --- a/tests/examples/example_SBT_Lo_T.out +++ b/tests/examples/example_SBT_Lo_T.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.11.13 - Simulation Date: 2026-02-22 - Simulation Time: 08:35 - Calculation Time: 1.298 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 1.334 sec ***SUMMARY OF RESULTS*** @@ -74,15 +74,15 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***CAPITAL COSTS (M$)*** + Exploration costs: 0.00 MUSD Drilling and completion costs: 37.58 MUSD - Drilling and completion costs per vertical production well: 3.28 MUSD - Drilling and completion costs per vertical injection well: 3.28 MUSD - Drilling and completion costs per non-vertical section: 15.51 MUSD + Drilling and completion costs per vertical production well: 3.44 MUSD + Drilling and completion costs per vertical injection well: 3.44 MUSD + Drilling and completion costs per non-vertical section: 16.29 MUSD Stimulation costs: 0.00 MUSD Surface power plant costs: 0.03 MUSD Field gathering system costs: 0.97 MUSD Total surface equipment costs: 1.00 MUSD - Exploration costs: 0.00 MUSD Total capital costs: 38.57 MUSD @@ -95,7 +95,6 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** - Initial geofluid availability: 0.02 MW/(kg/s) Maximum Total Electricity Generation: 0.00 MW Average Total Electricity Generation: 0.00 MW diff --git a/tests/examples/example_SBT_ULoop.out b/tests/examples/example_SBT_ULoop.out index 958fea0fe..4ff1e0ba1 100644 --- a/tests/examples/example_SBT_ULoop.out +++ b/tests/examples/example_SBT_ULoop.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.11.13 - Simulation Date: 2026-02-22 - Simulation Time: 08:27 - Calculation Time: 9.252 sec + GEOPHIRES Version: 3.16.2 + Simulation Date: 2026-09-10 + Simulation Time: 08:32 + Calculation Time: 2.356 sec ***SUMMARY OF RESULTS*** @@ -73,15 +73,15 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***CAPITAL COSTS (M$)*** + Exploration costs: 0.00 MUSD Drilling and completion costs: 6.45 MUSD - Drilling and completion costs per vertical production well: 2.80 MUSD - Drilling and completion costs per vertical injection well: 2.80 MUSD - Drilling and completion costs per non-vertical section: 0.42 MUSD + Drilling and completion costs per vertical production well: 2.94 MUSD + Drilling and completion costs per vertical injection well: 2.94 MUSD + Drilling and completion costs per non-vertical section: 0.44 MUSD Stimulation costs: 0.00 MUSD Surface power plant costs: 1.62 MUSD Field gathering system costs: 0.97 MUSD Total surface equipment costs: 2.59 MUSD - Exploration costs: 0.00 MUSD Total capital costs: 9.04 MUSD @@ -95,7 +95,6 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** - Maximum Net Heat Production: 4.13 MW Average Net Heat Production: 0.90 MW Minimum Net Heat Production: 0.74 MW From b1d7097a19ffa3c6c53c945a7054d22752e715cf Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:45:30 -0700 Subject: [PATCH 03/14] add coverage to test_non_vertical_section_cost --- tests/test_geophires_x_client.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/test_geophires_x_client.py b/tests/test_geophires_x_client.py index f85f0f231..b37704334 100644 --- a/tests/test_geophires_x_client.py +++ b/tests/test_geophires_x_client.py @@ -421,10 +421,26 @@ def test_ccus_profile_legacy(self): def test_non_vertical_section_cost(self): result_path = self._get_test_file_path('examples/Fervo_Norbeck_Latimer_2023.out') result = GeophiresXResult(result_path) - entry = result.result['CAPITAL COSTS (M$)']['Drilling and completion costs per non-vertical section'] + cap_costs = result.result['CAPITAL COSTS (M$)'] + entry = cap_costs['Drilling and completion costs per non-vertical section'] self.assertIsNotNone(entry['value']) self.assertEqual(entry['unit'], 'MUSD') + total_wells = ( + result.result['SUMMARY OF RESULTS']['Number of production wells']['value'] + + result.result['SUMMARY OF RESULTS']['Number of injection wells']['value'] + ) + + self.assertAlmostEqual( + cap_costs['Drilling and completion costs']['value'], + ( + cap_costs['Drilling and completion costs per vertical production well']['value'] + + cap_costs['Drilling and completion costs per non-vertical section']['value'] + ) + * total_wells, + places=1, + ) # (test assumes Number of Multilateral Sections = total_wells) + def test_input_hashing(self): input1 = ImmutableGeophiresInputParameters( {'End-Use Option': EndUseOption.DIRECT_USE_HEAT.value, 'Gradient 1': 50, 'Maximum Temperature': 250} From 8d05fca58fed9604d267c14a498e1a353c26e941 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 10 Sep 2026 08:59:41 -0700 Subject: [PATCH 04/14] update tooltip texts and regenerate schema --- src/geophires_x/Economics.py | 17 ++++++++++++----- .../geophires-result.json | 14 +++++++++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/geophires_x/Economics.py b/src/geophires_x/Economics.py index 879090fa7..cdfbf9967 100644 --- a/src/geophires_x/Economics.py +++ b/src/geophires_x/Economics.py @@ -2042,6 +2042,9 @@ def __init__(self, model: Model): f'Provide {self.ccexplfixed.Name} to override the default correlation and set your own cost.' ) + wellfield_indirect_costs_default_note = (f'(default: ' + f'{self.wellfield_indirect_capital_cost_percentage.DefaultValue}%)') + # noinspection SpellCheckingInspection self.Cwell = self.OutputParameterDict[self.Cwell.Name] = OutputParameter( Name="Wellfield cost", @@ -2051,7 +2054,7 @@ def __init__(self, model: Model): CurrentUnits=CurrencyUnit.MDOLLARS, ToolTipText=f'Includes total drilling and completion cost of all injection and production wells and ' f'laterals, plus indirect costs ' - f'(default: {self.wellfield_indirect_capital_cost_percentage.DefaultValue}%).' + f'{wellfield_indirect_costs_default_note}.' ) self.drilling_and_completion_costs_per_well = self.OutputParameterDict[ self.drilling_and_completion_costs_per_well.Name] = OutputParameter( @@ -2060,7 +2063,7 @@ def __init__(self, model: Model): PreferredUnits=CurrencyUnit.MDOLLARS, CurrentUnits=CurrencyUnit.MDOLLARS, ToolTipText='Drilling and completion cost per well, including indirect costs ' - f'(default: {self.wellfield_indirect_capital_cost_percentage.DefaultValue}%).' + f'{wellfield_indirect_costs_default_note}.' ) # noinspection SpellCheckingInspection @@ -2514,21 +2517,25 @@ def __init__(self, model: Model): Name='Drilling and completion costs per non-vertical section', UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, - CurrentUnits=CurrencyUnit.MDOLLARS + CurrentUnits=CurrencyUnit.MDOLLARS, + ToolTipText=f'Drilling and completion costs per non-vertical section (lateral), ' + f'including indirect costs {wellfield_indirect_costs_default_note}.' ) self.cost_per_vertical_production_well = self.OutputParameterDict[self.cost_per_vertical_production_well.Name] = OutputParameter( Name="Drilling and completion costs per vertical production well", UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, CurrentUnits=CurrencyUnit.MDOLLARS, - # TODO tooltip - includes indirect costs + ToolTipText=f'Drilling and completion costs per vertical production well section, ' + f'including indirect costs {wellfield_indirect_costs_default_note}.' ) self.cost_per_vertical_injection_well = self.OutputParameterDict[self.cost_per_vertical_injection_well.Name] = OutputParameter( Name="Drilling and completion costs per vertical injection well", UnitType=Units.CURRENCY, PreferredUnits=CurrencyUnit.MDOLLARS, CurrentUnits=CurrencyUnit.MDOLLARS, - # TODO tooltip - includes indirect costs + ToolTipText=f'Drilling and completion costs per vertical production well section, ' + f'including indirect costs {wellfield_indirect_costs_default_note}.' ) self.cost_to_junction_section = self.OutputParameterDict[self.cost_to_junction_section.Name] = OutputParameter( Name="Cost of the entire section of a well from bottom of vertical to junction with laterals", diff --git a/src/geophires_x_schema_generator/geophires-result.json b/src/geophires_x_schema_generator/geophires-result.json index 5d01c1a57..06195a58f 100644 --- a/src/geophires_x_schema_generator/geophires-result.json +++ b/src/geophires_x_schema_generator/geophires-result.json @@ -435,11 +435,19 @@ "description": "Cost of One Injection Well", "units": "MUSD" }, - "Drilling and completion costs per vertical production well": {}, - "Drilling and completion costs per vertical injection well": {}, + "Drilling and completion costs per vertical production well": { + "type": "number", + "description": "Drilling and completion costs per vertical production well section, including indirect costs (default: 5%).", + "units": "MUSD" + }, + "Drilling and completion costs per vertical injection well": { + "type": "number", + "description": "Drilling and completion costs per vertical production well section, including indirect costs (default: 5%).", + "units": "MUSD" + }, "Drilling and completion costs per non-vertical section": { "type": "number", - "description": "", + "description": "Drilling and completion costs per non-vertical section (lateral), including indirect costs (default: 5%).", "units": "MUSD" }, "Drilling and completion costs (for redrilling)": {}, From c2eeaf38624f2dd75f952dd420fedecfc9c59325 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:09:39 -0700 Subject: [PATCH 05/14] =?UTF-8?q?Bump=20version:=203.16.2=20=E2=86=92=203.?= =?UTF-8?q?17.0?= 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 d881f6103..6f84a8224 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 3.16.2 +current_version = 3.17.0 commit = True tag = True diff --git a/.cookiecutterrc b/.cookiecutterrc index 07658dd8a..ecba1e12a 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.16.2 + version: 3.17.0 version_manager: "bump2version" website: "https://github.com/NREL" year_from: "2023" diff --git a/README.rst b/README.rst index 6beb43588..afc773849 100644 --- a/README.rst +++ b/README.rst @@ -58,9 +58,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.16.2.svg +.. |commits-since| image:: https://img.shields.io/github/commits-since/softwareengineerprogrammer/GEOPHIRES-X/v3.17.0.svg :alt: Commits since latest release - :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.16.2...main + :target: https://github.com/softwareengineerprogrammer/GEOPHIRES-X/compare/v3.17.0...main .. |docs| image:: https://readthedocs.org/projects/GEOPHIRES-X/badge/?style=flat :target: https://softwareengineerprogrammer.github.io/GEOPHIRES diff --git a/docs/conf.py b/docs/conf.py index 7ab53dd7f..0cc88d612 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ year = '2025' author = 'NREL' copyright = f'{year}, {author}' -version = release = '3.16.2' +version = release = '3.17.0' pygments_style = 'trac' templates_path = ['./templates'] diff --git a/setup.py b/setup.py index 4472ae987..9bf3e3d6b 100755 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def read(*names, **kwargs): setup( name='geophires-x', - version='3.16.2', + version='3.17.0', 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 a35ecdde6..5d5b52e85 100644 --- a/src/geophires_x/__init__.py +++ b/src/geophires_x/__init__.py @@ -1 +1 @@ -__version__ = '3.16.2' +__version__ = '3.17.0' From bdd4cf6442c6d37e683540d40d0db9b5bd67cf96 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:11:40 -0700 Subject: [PATCH 06/14] v3.17 CHANGELOG entry --- CHANGELOG.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 7f024c134..f73f8f08c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,11 @@ Changelog GEOPHIRES v3 (2023-2026) ------------------------ +3.17 +^^^^ + +3.17: `Warn user if ORC is used with production temperature greater than 200 degrees C `__; `Include indirect costs in vertical and lateral (non-vertical) section drilling costs `__ | `release `__ + 3.16 ^^^^ From c450ce8819b6b1a574097b17d0e926c977d0701e Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Thu, 10 Sep 2026 10:20:01 -0700 Subject: [PATCH 07/14] update v3.17 CHANGELOG entry PR link --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f73f8f08c..bc1c77d40 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,7 +8,7 @@ GEOPHIRES v3 (2023-2026) 3.17 ^^^^ -3.17: `Warn user if ORC is used with production temperature greater than 200 degrees C `__; `Include indirect costs in vertical and lateral (non-vertical) section drilling costs `__ | `release `__ +3.17: `Warn user if ORC is used with production temperature greater than 200 degrees C `__; `Include indirect costs in vertical and lateral (non-vertical) section drilling costs `__ | `release `__ 3.16 ^^^^ From 6fae1b696c74844c2b3c953a9cff19d0e4366179 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Fri, 11 Sep 2026 06:37:15 -0700 Subject: [PATCH 08/14] sort test_geophires_examples order alphabetically (except for SBT) --- tests/test_geophires_x.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_geophires_x.py b/tests/test_geophires_x.py index f90b5968c..ca9d0411e 100644 --- a/tests/test_geophires_x.py +++ b/tests/test_geophires_x.py @@ -176,7 +176,7 @@ def get_output_file_for_example(example_file: str): # fmt:off # @formatter:off - example_files = list( + example_files = sorted( filter( lambda example_file_path_: example_file_path_.startswith( ('example', 'Beckers_et_al', 'SUTRA', 'Wanju', 'Fervo', 'S-DAC-GT') @@ -187,7 +187,8 @@ def get_output_file_for_example(example_file: str): and '.json' not in example_file_path_ and '.csv' not in example_file_path_, self._list_test_files_dir(test_files_dir='examples'), - ) + ), + key=str.lower ) # @formatter:on # fmt:on From 7b2d30c500330cac7242ff35415437be2f080190 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Sat, 12 Sep 2026 07:20:16 -0700 Subject: [PATCH 09/14] include standard newline after surface equipment simulation results header --- src/geophires_x/Outputs.py | 2 +- tests/examples/Fervo_Norbeck_Latimer_2023.out | 9 +++++---- tests/examples/Fervo_Project_Red-2026.out | 9 +++++---- ...Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out | 9 +++++---- tests/examples/example_SAM-single-owner-PPA-3.out | 9 +++++---- tests/examples/example_SAM-single-owner-PPA-4.out | 9 +++++---- tests/examples/example_SAM-single-owner-PPA-4b.out | 9 +++++---- tests/examples/example_SAM-single-owner-PPA.out | 9 +++++---- tests/examples/example_SBT_Hi_T.out | 9 +++++---- tests/examples/example_SBT_Lo_T.out | 9 +++++---- tests/examples/example_SBT_ULoop.out | 9 +++++---- 11 files changed, 51 insertions(+), 41 deletions(-) diff --git a/src/geophires_x/Outputs.py b/src/geophires_x/Outputs.py index cb04f9776..7a278497a 100644 --- a/src/geophires_x/Outputs.py +++ b/src/geophires_x/Outputs.py @@ -639,7 +639,7 @@ def _render_additional_capital_cost_modifiers(additional_modifiers: list[tuple[P else: f.write(f' {econ.Coam.display_name}: {econ.Coam.value:10.2f} {econ.Coam.CurrentUnits.value}\n') - f.write('\n\n ***SURFACE EQUIPMENT SIMULATION RESULTS***\n') + f.write('\n\n ***SURFACE EQUIPMENT SIMULATION RESULTS***\n\n') if model.surfaceplant.enduse_option.value.has_electricity_component: sp = model.surfaceplant diff --git a/tests/examples/Fervo_Norbeck_Latimer_2023.out b/tests/examples/Fervo_Norbeck_Latimer_2023.out index 6d438a207..dfbb21323 100644 --- a/tests/examples/Fervo_Norbeck_Latimer_2023.out +++ b/tests/examples/Fervo_Norbeck_Latimer_2023.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 0.527 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:18 + Calculation Time: 0.536 sec ***SUMMARY OF RESULTS*** @@ -116,6 +116,7 @@ Simulation Metadata ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.15 MW/(kg/s) Maximum Total Electricity Generation: 2.97 MW Average Total Electricity Generation: 2.90 MW diff --git a/tests/examples/Fervo_Project_Red-2026.out b/tests/examples/Fervo_Project_Red-2026.out index dbdd40b6c..e27be0f00 100644 --- a/tests/examples/Fervo_Project_Red-2026.out +++ b/tests/examples/Fervo_Project_Red-2026.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 1.030 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:18 + Calculation Time: 1.201 sec ***SUMMARY OF RESULTS*** @@ -123,6 +123,7 @@ Simulation Metadata ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.15 MW/(kg/s) Maximum Total Electricity Generation: 2.75 MW Average Total Electricity Generation: 2.69 MW 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 a7c3d4e16..f914765a0 100644 --- a/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out +++ b/tests/examples/Wanju_Yuan_Closed-Loop_Geothermal_Energy_Recovery.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 1.798 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:19 + Calculation Time: 1.869 sec ***SUMMARY OF RESULTS*** @@ -95,6 +95,7 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.06 MW/(kg/s) Maximum Total Electricity Generation: 1.67 MW Average Total Electricity Generation: 1.11 MW diff --git a/tests/examples/example_SAM-single-owner-PPA-3.out b/tests/examples/example_SAM-single-owner-PPA-3.out index 2a778b053..79998acbc 100644 --- a/tests/examples/example_SAM-single-owner-PPA-3.out +++ b/tests/examples/example_SAM-single-owner-PPA-3.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 1.225 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:17 + Calculation Time: 1.247 sec ***SUMMARY OF RESULTS*** @@ -123,6 +123,7 @@ Simulation Metadata ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.19 MW/(kg/s) Maximum Total Electricity Generation: 59.02 MW Average Total Electricity Generation: 58.87 MW diff --git a/tests/examples/example_SAM-single-owner-PPA-4.out b/tests/examples/example_SAM-single-owner-PPA-4.out index 336b70a92..8848d8c72 100644 --- a/tests/examples/example_SAM-single-owner-PPA-4.out +++ b/tests/examples/example_SAM-single-owner-PPA-4.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 1.244 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:17 + Calculation Time: 1.254 sec ***SUMMARY OF RESULTS*** @@ -123,6 +123,7 @@ Simulation Metadata ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.19 MW/(kg/s) Maximum Total Electricity Generation: 59.02 MW Average Total Electricity Generation: 58.87 MW diff --git a/tests/examples/example_SAM-single-owner-PPA-4b.out b/tests/examples/example_SAM-single-owner-PPA-4b.out index 2e9fdf962..2c8d124b9 100644 --- a/tests/examples/example_SAM-single-owner-PPA-4b.out +++ b/tests/examples/example_SAM-single-owner-PPA-4b.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 1.221 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:17 + Calculation Time: 1.219 sec ***SUMMARY OF RESULTS*** @@ -125,6 +125,7 @@ Simulation Metadata ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.19 MW/(kg/s) Maximum Total Electricity Generation: 59.02 MW Average Total Electricity Generation: 58.87 MW diff --git a/tests/examples/example_SAM-single-owner-PPA.out b/tests/examples/example_SAM-single-owner-PPA.out index aa5b525d7..53d041e16 100644 --- a/tests/examples/example_SAM-single-owner-PPA.out +++ b/tests/examples/example_SAM-single-owner-PPA.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 1.208 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:17 + Calculation Time: 1.237 sec ***SUMMARY OF RESULTS*** @@ -123,6 +123,7 @@ Simulation Metadata ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.19 MW/(kg/s) Maximum Total Electricity Generation: 59.02 MW Average Total Electricity Generation: 58.87 MW diff --git a/tests/examples/example_SBT_Hi_T.out b/tests/examples/example_SBT_Hi_T.out index 066b100b5..bc550759b 100644 --- a/tests/examples/example_SBT_Hi_T.out +++ b/tests/examples/example_SBT_Hi_T.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 7.044 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:18 + Calculation Time: 5.798 sec ***SUMMARY OF RESULTS*** @@ -95,6 +95,7 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.46 MW/(kg/s) Maximum Total Electricity Generation: 17.58 MW Average Total Electricity Generation: 9.73 MW diff --git a/tests/examples/example_SBT_Lo_T.out b/tests/examples/example_SBT_Lo_T.out index 58b9830d3..976462065 100644 --- a/tests/examples/example_SBT_Lo_T.out +++ b/tests/examples/example_SBT_Lo_T.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 1.334 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:18 + Calculation Time: 2.083 sec ***SUMMARY OF RESULTS*** @@ -95,6 +95,7 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Initial geofluid availability: 0.02 MW/(kg/s) Maximum Total Electricity Generation: 0.00 MW Average Total Electricity Generation: 0.00 MW diff --git a/tests/examples/example_SBT_ULoop.out b/tests/examples/example_SBT_ULoop.out index 4ff1e0ba1..930deeca9 100644 --- a/tests/examples/example_SBT_ULoop.out +++ b/tests/examples/example_SBT_ULoop.out @@ -4,10 +4,10 @@ Simulation Metadata ---------------------- - GEOPHIRES Version: 3.16.2 - Simulation Date: 2026-09-10 - Simulation Time: 08:32 - Calculation Time: 2.356 sec + GEOPHIRES Version: 3.17.0 + Simulation Date: 2026-09-12 + Simulation Time: 07:18 + Calculation Time: 2.437 sec ***SUMMARY OF RESULTS*** @@ -95,6 +95,7 @@ The AGS models contain an intrinsic reservoir model that doesn't expose values t ***SURFACE EQUIPMENT SIMULATION RESULTS*** + Maximum Net Heat Production: 4.13 MW Average Net Heat Production: 0.90 MW Minimum Net Heat Production: 0.74 MW From f8effef3fe302b96454a73a7e1cdc0f751f85fb5 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Sat, 12 Sep 2026 08:21:18 -0700 Subject: [PATCH 10/14] GHA py313 & py314 --- .github/workflows/github-actions.yml | 6 ++++++ tox.ini | 1 + 2 files changed, 7 insertions(+) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 62f7ae53e..bc5bb3a13 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -74,6 +74,12 @@ jobs: python_arch: 'x64' tox_env: 'py312' os: 'ubuntu-latest' + - name: 'py313 (ubuntu)' + python: '3.13' + toxpython: 'python3.13' + python_arch: 'x64' + tox_env: 'py313' + os: 'ubuntu-latest' # - name: 'pypy38 (ubuntu)' # python: 'pypy-3.8' # toxpython: 'pypy3.8' diff --git a/tox.ini b/tox.ini index 320d5c6a9..0f212dc8e 100644 --- a/tox.ini +++ b/tox.ini @@ -28,6 +28,7 @@ basepython = py310: {env:TOXPYTHON:python3.10} py311: {env:TOXPYTHON:python3.11} py312: {env:TOXPYTHON:python3.12} + py313: {env:TOXPYTHON:python3.12} {bootstrap,clean,check,report,docs,coveralls}: {env:TOXPYTHON:python3} setenv = PYTHONPATH={toxinidir}/tests From 89e63fb647a39b3dcc74e337c3776438905f83e4 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Sat, 12 Sep 2026 08:21:44 -0700 Subject: [PATCH 11/14] GHA py313 & py314 --- .github/workflows/github-actions.yml | 6 ++++++ tox.ini | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index bc5bb3a13..370e578f4 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -80,6 +80,12 @@ jobs: python_arch: 'x64' tox_env: 'py313' os: 'ubuntu-latest' + - name: 'py314 (ubuntu)' + python: '3.14' + toxpython: 'python3.14' + python_arch: 'x64' + tox_env: 'py314' + os: 'ubuntu-latest' # - name: 'pypy38 (ubuntu)' # python: 'pypy-3.8' # toxpython: 'pypy3.8' diff --git a/tox.ini b/tox.ini index 0f212dc8e..9a90e84dc 100644 --- a/tox.ini +++ b/tox.ini @@ -28,7 +28,8 @@ basepython = py310: {env:TOXPYTHON:python3.10} py311: {env:TOXPYTHON:python3.11} py312: {env:TOXPYTHON:python3.12} - py313: {env:TOXPYTHON:python3.12} + py313: {env:TOXPYTHON:python3.13} + py314: {env:TOXPYTHON:python3.14} {bootstrap,clean,check,report,docs,coveralls}: {env:TOXPYTHON:python3} setenv = PYTHONPATH={toxinidir}/tests From 1ebd0452b85eb374247f2b63b9faadaa2c965a86 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Sat, 12 Sep 2026 08:21:58 -0700 Subject: [PATCH 12/14] upload-pages-artifact@v5 --- .github/workflows/github-actions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 370e578f4..0de162631 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -213,7 +213,7 @@ jobs: done - name: upload artifact - uses: actions/upload-pages-artifact@v4 + uses: actions/upload-pages-artifact@v5 - name: deploy to GitHub Pages id: deployment From 4a798c03d470e9066a02c0edb49b7e14365ad160 Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Sat, 12 Sep 2026 08:25:15 -0700 Subject: [PATCH 13/14] set enforce-pr-checklist permissions per CodeQL finding (https://github.com/softwareengineerprogrammer/GEOPHIRES/security/code-scanning/1) --- .github/workflows/enforce-pr-checklist.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/enforce-pr-checklist.yml b/.github/workflows/enforce-pr-checklist.yml index b96d15a80..37cbdbc5a 100644 --- a/.github/workflows/enforce-pr-checklist.yml +++ b/.github/workflows/enforce-pr-checklist.yml @@ -4,6 +4,9 @@ on: pull_request: types: [opened, edited, synchronize] +permissions: + pull-requests: read + jobs: verify-pr-checklist: runs-on: ubuntu-latest From 28723158acf58c36d1ec5894f5d44f141288819c Mon Sep 17 00:00:00 2001 From: softwareengineerprogrammer <4056124+softwareengineerprogrammer@users.noreply.github.com> Date: Sat, 12 Sep 2026 08:26:17 -0700 Subject: [PATCH 14/14] temporarily disable py314 --- .github/workflows/github-actions.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 0de162631..6e5d63770 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -80,12 +80,12 @@ jobs: python_arch: 'x64' tox_env: 'py313' os: 'ubuntu-latest' - - name: 'py314 (ubuntu)' - python: '3.14' - toxpython: 'python3.14' - python_arch: 'x64' - tox_env: 'py314' - os: 'ubuntu-latest' +# - name: 'py314 (ubuntu)' +# python: '3.14' +# toxpython: 'python3.14' +# python_arch: 'x64' +# tox_env: 'py314' +# os: 'ubuntu-latest' # - name: 'pypy38 (ubuntu)' # python: 'pypy-3.8' # toxpython: 'pypy3.8'