Skip to content

Commit feefbf3

Browse files
Add Reservoir Stimulation Capital Cost per Production Well parameter (default value = $0)
1 parent 59b28d0 commit feefbf3

File tree

4 files changed

+76
-8
lines changed

4 files changed

+76
-8
lines changed

src/geophires_x/Economics.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -585,18 +585,38 @@ def __init__(self, model: Model):
585585
Valid=False,
586586
ToolTipText="Total reservoir stimulation capital cost"
587587
)
588+
589+
max_stimulation_cost_per_well_MUSD = 100
588590
self.stimulation_cost_per_injection_well = \
589591
self.ParameterDict[self.stimulation_cost_per_injection_well.Name] = floatParameter(
590592
'Reservoir Stimulation Capital Cost per Injection Well',
591593
DefaultValue=1.25,
592594
Min=0,
593-
Max=100,
595+
Max=max_stimulation_cost_per_well_MUSD,
594596
UnitType=Units.CURRENCY,
595597
PreferredUnits=CurrencyUnit.MDOLLARS,
596598
CurrentUnits=CurrencyUnit.MDOLLARS,
597599
Provided=False,
598600
ToolTipText='Reservoir stimulation capital cost per injection well'
599601
)
602+
603+
stimulation_cost_per_production_well_default_value_MUSD = 0
604+
stimulation_cost_per_production_well_default_value_note = \
605+
'. By default, only the injection wells are assumed to be stimulated unless this parameter is provided.' \
606+
if stimulation_cost_per_production_well_default_value_MUSD == 0 else ''
607+
self.stimulation_cost_per_production_well = \
608+
self.ParameterDict[self.stimulation_cost_per_production_well.Name] = floatParameter(
609+
'Reservoir Stimulation Capital Cost per Production Well',
610+
DefaultValue=stimulation_cost_per_production_well_default_value_MUSD,
611+
Min=0,
612+
Max=max_stimulation_cost_per_well_MUSD,
613+
UnitType=Units.CURRENCY,
614+
PreferredUnits=CurrencyUnit.MDOLLARS,
615+
CurrentUnits=CurrencyUnit.MDOLLARS,
616+
ToolTipText=f'Reservoir stimulation capital cost per production well'
617+
f'{stimulation_cost_per_production_well_default_value_note}'
618+
)
619+
600620
self.ccstimadjfactor = self.ParameterDict[self.ccstimadjfactor.Name] = floatParameter(
601621
"Reservoir Stimulation Capital Cost Adjustment Factor",
602622
DefaultValue=1.0,
@@ -607,7 +627,7 @@ def __init__(self, model: Model):
607627
CurrentUnits=PercentUnit.TENTH,
608628
Provided=False,
609629
Valid=True,
610-
ToolTipText="Multiplier for built-in reservoir stimulation capital cost correlation"
630+
ToolTipText="Multiplier for reservoir stimulation capital cost correlation"
611631
)
612632
self.ccexplfixed = self.ParameterDict[self.ccexplfixed.Name] = floatParameter(
613633
"Exploration Capital Cost",
@@ -1629,8 +1649,9 @@ def __init__(self, model: Model):
16291649
CurrentUnits=CurrencyUnit.MDOLLARS,
16301650
ToolTipText=f'Default correlation: ${self.stimulation_cost_per_injection_well.value}M '
16311651
f'per injection well {stimulation_contingency_and_indirect_costs_tooltip}. '
1632-
f'Provide {self.stimulation_cost_per_injection_well.Name} to set the correlation '
1633-
f'cost per injection well. '
1652+
f'Provide {self.stimulation_cost_per_injection_well.Name} and '
1653+
f'{self.stimulation_cost_per_production_well.Name} to set the correlation '
1654+
f'costs per well. '
16341655
f'Provide {self.ccstimadjfactor.Name} to multiply the correlation-calculated cost. '
16351656
f'Provide {self.ccstimfixed.Name} to override the correlation and set your own '
16361657
f'total stimulation cost.'
@@ -2358,11 +2379,15 @@ def Calculate(self, model: Model) -> None:
23582379
else:
23592380
stim_cost_per_injection_well = self.stimulation_cost_per_injection_well.quantity().to(
23602381
self.Cstim.CurrentUnits).magnitude
2382+
stim_cost_per_production_well = self.stimulation_cost_per_production_well.quantity().to(
2383+
self.Cstim.CurrentUnits).magnitude
23612384

23622385
# 1.15 for 15% contingency and 1.05 for 5% indirect costs
23632386
# TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
2364-
self.Cstim.value = (stim_cost_per_injection_well
2365-
* model.wellbores.ninj.value
2387+
self.Cstim.value = ((
2388+
stim_cost_per_injection_well * model.wellbores.ninj.value
2389+
+ stim_cost_per_production_well * model.wellbores.nprod.value
2390+
)
23662391
* self.ccstimadjfactor.value
23672392
* 1.05 * 1.15)
23682393

src/geophires_x_schema_generator/geophires-request.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1404,8 +1404,17 @@
14041404
"minimum": 0,
14051405
"maximum": 100
14061406
},
1407+
"Reservoir Stimulation Capital Cost per Production Well": {
1408+
"description": "Reservoir stimulation capital cost per production well. By default, only the injection wells are assumed to be stimulated unless this parameter is provided.",
1409+
"type": "number",
1410+
"units": "MUSD",
1411+
"category": "Economics",
1412+
"default": 0,
1413+
"minimum": 0,
1414+
"maximum": 100
1415+
},
14071416
"Reservoir Stimulation Capital Cost Adjustment Factor": {
1408-
"description": "Multiplier for built-in reservoir stimulation capital cost correlation",
1417+
"description": "Multiplier for reservoir stimulation capital cost correlation",
14091418
"type": "number",
14101419
"units": "",
14111420
"category": "Economics",

src/geophires_x_schema_generator/geophires-result.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@
351351
"Drilling and completion costs per redrilled well": {},
352352
"Stimulation costs": {
353353
"type": "number",
354-
"description": "Default correlation: $1.25M per injection well plus 15% contingency plus 5% indirect costs. Provide Reservoir Stimulation Capital Cost per Injection Well to set the correlation cost per injection well. Provide Reservoir Stimulation Capital Cost Adjustment Factor to multiply the correlation-calculated cost. Provide Reservoir Stimulation Capital Cost to override the correlation and set your own total stimulation cost.",
354+
"description": "Default correlation: $1.25M per injection well plus 15% contingency plus 5% indirect costs. Provide Reservoir Stimulation Capital Cost per Injection Well and Reservoir Stimulation Capital Cost per Production Well to set the correlation costs per well. Provide Reservoir Stimulation Capital Cost Adjustment Factor to multiply the correlation-calculated cost. Provide Reservoir Stimulation Capital Cost to override the correlation and set your own total stimulation cost.",
355355
"units": "MUSD"
356356
},
357357
"Stimulation costs (for redrilling)": {},

tests/test_geophires_x.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from geophires_x_client import _get_logger
1313
from geophires_x_client.geophires_input_parameters import EndUseOption
1414
from geophires_x_client.geophires_input_parameters import GeophiresInputParameters
15+
from geophires_x_client.geophires_input_parameters import ImmutableGeophiresInputParameters
1516
from geophires_x_tests.test_options_list import WellDrillingCostCorrelationTestCase
1617
from tests.base_test_case import BaseTestCase
1718

@@ -941,3 +942,36 @@ def test_sbt_coaxial_raises_error(self):
941942
)
942943
client.get_geophires_result(params)
943944
self.assertIn('SBT with coaxial configuration is not implemented', str(e.exception))
945+
946+
def test_production_well_stimulation_cost(self):
947+
def _get_result(prod_well_stim_MUSD: Optional[int] = None) -> GeophiresXResult:
948+
p = {}
949+
if prod_well_stim_MUSD is not None:
950+
p['Reservoir Stimulation Capital Cost per Production Well'] = prod_well_stim_MUSD
951+
952+
return GeophiresXClient().get_geophires_result(
953+
ImmutableGeophiresInputParameters(
954+
from_file_path=self._get_test_file_path('geophires_x_tests/generic-egs-case.txt'),
955+
params=p,
956+
)
957+
)
958+
959+
result_no_prod_stim: GeophiresXResult = _get_result()
960+
961+
result_prod_stim: GeophiresXResult = _get_result(1.25)
962+
963+
# TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
964+
indirect_and_contingency = 1.05 * 1.15
965+
966+
self.assertAlmostEqual(
967+
(
968+
2
969+
* (
970+
result_no_prod_stim.result['CAPITAL COSTS (M$)']['Stimulation costs']['value']
971+
/ (indirect_and_contingency)
972+
)
973+
)
974+
* indirect_and_contingency,
975+
result_prod_stim.result['CAPITAL COSTS (M$)']['Stimulation costs']['value'],
976+
places=1,
977+
)

0 commit comments

Comments
 (0)