Skip to content

Commit a471792

Browse files
Parameterize Reservoir Stimulation Indirect Capital Cost Percentage
1 parent 2fb0d58 commit a471792

File tree

3 files changed

+67
-10
lines changed

3 files changed

+67
-10
lines changed

src/geophires_x/Economics.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,20 @@ def __init__(self, model: Model):
629629
Valid=True,
630630
ToolTipText="Multiplier for reservoir stimulation capital cost correlation"
631631
)
632+
self.stimulation_indirect_capital_cost = \
633+
self.ParameterDict[self.stimulation_indirect_capital_cost.Name] = floatParameter(
634+
'Reservoir Stimulation Indirect Capital Cost Percentage',
635+
DefaultValue=5,
636+
Min=0,
637+
Max=100,
638+
UnitType=Units.PERCENT,
639+
PreferredUnits=PercentUnit.PERCENT,
640+
CurrentUnits=PercentUnit.PERCENT,
641+
ToolTipText=f'The indirect capital cost for reservoir stimulation, '
642+
f'calculated as a percentage of the direct cost. '
643+
f'(Not applied if {self.ccstimfixed.Name} is provided.)'
644+
)
645+
632646
self.ccexplfixed = self.ParameterDict[self.ccexplfixed.Name] = floatParameter(
633647
"Exploration Capital Cost",
634648
DefaultValue=-1.0,
@@ -1638,8 +1652,11 @@ def __init__(self, model: Model):
16381652
CurrentUnits=EnergyCostUnit.DOLLARSPERMMBTU
16391653
)
16401654

1641-
# TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
1642-
stimulation_contingency_and_indirect_costs_tooltip = 'plus 15% contingency plus 5% indirect costs'
1655+
stimulation_contingency_and_indirect_costs_tooltip = (
1656+
f'plus 15% contingency ' # TODO https://github.com/NREL/GEOPHIRES-X/issues/383
1657+
f'plus {self.stimulation_indirect_capital_cost.quantity().to(convertible_unit("%")).magnitude}% '
1658+
f'indirect costs'
1659+
)
16431660

16441661
# noinspection SpellCheckingInspection
16451662
self.Cstim = self.OutputParameterDict[self.Cstim.Name] = OutputParameter(
@@ -2382,14 +2399,17 @@ def Calculate(self, model: Model) -> None:
23822399
stim_cost_per_production_well = self.stimulation_cost_per_production_well.quantity().to(
23832400
self.Cstim.CurrentUnits).magnitude
23842401

2385-
# 1.15 for 15% contingency and 1.05 for 5% indirect costs
2386-
# TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
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-
)
2391-
* self.ccstimadjfactor.value
2392-
* 1.05 * 1.15)
2402+
stimulation_indirect_cost_fraction = (self.stimulation_indirect_capital_cost.quantity()
2403+
.to('dimensionless').magnitude)
2404+
self.Cstim.value = (
2405+
(
2406+
stim_cost_per_injection_well * model.wellbores.ninj.value
2407+
+ stim_cost_per_production_well * model.wellbores.nprod.value
2408+
)
2409+
* self.ccstimadjfactor.value
2410+
* (1 + stimulation_indirect_cost_fraction)
2411+
* 1.15 # 15% contingency TODO https://github.com/NREL/GEOPHIRES-X/issues/383
2412+
)
23932413

23942414
# field gathering system costs (M$)
23952415
if self.ccgathfixed.Valid:

src/geophires_x_schema_generator/geophires-request.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,15 @@
14221422
"minimum": 0,
14231423
"maximum": 10
14241424
},
1425+
"Reservoir Stimulation Indirect Capital Cost Percentage": {
1426+
"description": "The indirect capital cost for reservoir stimulation, calculated as a percentage of the direct cost. (Not applied if Reservoir Stimulation Capital Cost is provided.)",
1427+
"type": "number",
1428+
"units": "%",
1429+
"category": "Economics",
1430+
"default": 5,
1431+
"minimum": 0,
1432+
"maximum": 100
1433+
},
14251434
"Exploration Capital Cost": {
14261435
"description": "Total exploration capital cost",
14271436
"type": "number",

tests/test_geophires_x.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,3 +975,31 @@ def _get_result(prod_well_stim_MUSD: Optional[int] = None) -> GeophiresXResult:
975975
result_prod_stim.result['CAPITAL COSTS (M$)']['Stimulation costs']['value'],
976976
places=1,
977977
)
978+
979+
def test_stimulation_indirect_cost(self):
980+
def _get_result(indirect_cost_percent: Optional[int] = None) -> float:
981+
p = {}
982+
if indirect_cost_percent is not None:
983+
p['Reservoir Stimulation Indirect Capital Cost Percentage'] = indirect_cost_percent
984+
985+
return (
986+
GeophiresXClient()
987+
.get_geophires_result(
988+
ImmutableGeophiresInputParameters(
989+
from_file_path=self._get_test_file_path('geophires_x_tests/generic-egs-case.txt'),
990+
params=p,
991+
)
992+
)
993+
.result['CAPITAL COSTS (M$)']['Stimulation costs']['value']
994+
)
995+
996+
result_default_indirect_cost: GeophiresXResult = _get_result()
997+
998+
higher_indirect = 12
999+
result_higher_indirect_cost: GeophiresXResult = _get_result(higher_indirect)
1000+
1001+
self.assertAlmostEqual(
1002+
result_default_indirect_cost / 1.05,
1003+
result_higher_indirect_cost / (1 + (higher_indirect / 100)),
1004+
places=1,
1005+
)

0 commit comments

Comments
 (0)