Skip to content

Commit 1b24b03

Browse files
Parameterize Well Drilling and Completion Indirect Capital Cost Percentage
1 parent d03b208 commit 1b24b03

File tree

2 files changed

+77
-48
lines changed

2 files changed

+77
-48
lines changed

src/geophires_x/Economics.py

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -632,8 +632,8 @@ def __init__(self, model: Model):
632632
Valid=True,
633633
ToolTipText="Multiplier for reservoir stimulation capital cost correlation"
634634
)
635-
self.stimulation_indirect_capital_cost = \
636-
self.ParameterDict[self.stimulation_indirect_capital_cost.Name] = floatParameter(
635+
self.stimulation_indirect_capital_cost_percentage = \
636+
self.ParameterDict[self.stimulation_indirect_capital_cost_percentage.Name] = floatParameter(
637637
'Reservoir Stimulation Indirect Capital Cost Percentage',
638638
DefaultValue=5,
639639
Min=0,
@@ -670,8 +670,9 @@ def __init__(self, model: Model):
670670
Valid=True,
671671
ToolTipText="Multiplier for built-in exploration capital cost correlation"
672672
)
673-
self.per_production_well_cost = self.ParameterDict[self.per_production_well_cost.Name] = floatParameter(
674-
"Well Drilling and Completion Capital Cost",
673+
674+
self.per_injection_well_cost = self.ParameterDict[self.per_injection_well_cost.Name] = floatParameter(
675+
"Injection Well Drilling and Completion Capital Cost",
675676
DefaultValue=-1.0,
676677
Min=0,
677678
Max=200,
@@ -680,23 +681,22 @@ def __init__(self, model: Model):
680681
CurrentUnits=CurrencyUnit.MDOLLARS,
681682
Provided=False,
682683
Valid=False,
683-
ToolTipText="Well Drilling and Completion Capital Cost"
684+
ToolTipText="Injection Well Drilling and Completion Capital Cost"
684685
)
685-
self.per_injection_well_cost = self.ParameterDict[self.per_injection_well_cost.Name] = floatParameter(
686-
"Injection Well Drilling and Completion Capital Cost",
687-
DefaultValue=self.per_production_well_cost.value,
686+
self.per_production_well_cost = self.ParameterDict[self.per_production_well_cost.Name] = floatParameter(
687+
"Well Drilling and Completion Capital Cost",
688+
DefaultValue=self.per_injection_well_cost.value,
688689
Min=0,
689690
Max=200,
690691
UnitType=Units.CURRENCY,
691692
PreferredUnits=CurrencyUnit.MDOLLARS,
692693
CurrentUnits=CurrencyUnit.MDOLLARS,
693694
Provided=False,
694695
Valid=False,
695-
ToolTipText="Injection Well Drilling and Completion Capital Cost"
696+
ToolTipText=f'Well Drilling and Completion Capital Cost per well. Applied to production wells, '
697+
f'and injection wells unless {self.per_injection_well_cost.Name} is provided.'
696698
)
697699

698-
# TODO parameterize/document default 5% indirect cost factor that is applied when neither of the well
699-
# drilling/completion capital cost adjustment factors are provided
700700
injection_well_cost_adjustment_factor_name = "Injection Well Drilling and Completion Capital Cost Adjustment Factor"
701701
self.production_well_cost_adjustment_factor = self.ParameterDict[self.production_well_cost_adjustment_factor.Name] = floatParameter(
702702
"Well Drilling and Completion Capital Cost Adjustment Factor",
@@ -727,21 +727,6 @@ def __init__(self, model: Model):
727727
f"{self.production_well_cost_adjustment_factor.Name}."
728728
)
729729

730-
self.indirect_cost = self.ParameterDict[self.indirect_cost.Name] = floatParameter(
731-
'Indirect Cost Percentage',
732-
DefaultValue=12,
733-
Min=0,
734-
Max=100,
735-
UnitType=Units.PERCENT,
736-
PreferredUnits=PercentUnit.PERCENT,
737-
CurrentUnits=PercentUnit.PERCENT,
738-
ToolTipText=f'The default indirect cost percentage applied to capital costs. This value is used for all '
739-
f'cost categories unless a more specific indirect cost parameter is provided. For example, '
740-
f'reservoir stimulation costs use {self.stimulation_indirect_capital_cost.Name} '
741-
f'(default {self.stimulation_indirect_capital_cost.DefaultValue}%).'
742-
# FIXME WIP mention drilling also has 5% default indirect cost
743-
)
744-
745730
self.oamwellfixed = self.ParameterDict[self.oamwellfixed.Name] = floatParameter(
746731
"Wellfield O&M Cost",
747732
DefaultValue=-1.0,
@@ -1097,6 +1082,7 @@ def __init__(self, model: Model):
10971082
ErrMessage="assume default: no S-DAC-GT calculations",
10981083
ToolTipText="Set to true if you want the S-DAC-GT economics calculations to be made"
10991084
)
1085+
11001086
self.Vertical_drilling_cost_per_m = self.ParameterDict[self.Vertical_drilling_cost_per_m.Name] = floatParameter(
11011087
"All-in Vertical Drilling Costs",
11021088
DefaultValue=1000.0,
@@ -1122,6 +1108,35 @@ def __init__(self, model: Model):
11221108
ToolTipText="Set user specified all-in cost per meter of non-vertical drilling, including drilling, "
11231109
"casing, cement, insulated insert"
11241110
)
1111+
self.wellfield_indirect_capital_cost_percentage = self.ParameterDict[self.wellfield_indirect_capital_cost_percentage.Name] = floatParameter(
1112+
'Well Drilling and Completion Indirect Capital Cost Percentage',
1113+
DefaultValue=5,
1114+
Min=0,
1115+
Max=100,
1116+
UnitType=Units.PERCENT,
1117+
PreferredUnits=PercentUnit.PERCENT,
1118+
CurrentUnits=PercentUnit.PERCENT,
1119+
ToolTipText=f'The indirect capital cost for well drilling and completion of all wells (the wellfield), '
1120+
f'calculated as a percentage of the direct cost. '
1121+
)
1122+
1123+
self.indirect_capital_cost_percentage = \
1124+
self.ParameterDict[self.indirect_capital_cost_percentage.Name] = floatParameter(
1125+
'Indirect Capital Cost Percentage',
1126+
DefaultValue=12,
1127+
Min=0,
1128+
Max=100,
1129+
UnitType=Units.PERCENT,
1130+
PreferredUnits=PercentUnit.PERCENT,
1131+
CurrentUnits=PercentUnit.PERCENT,
1132+
ToolTipText=f'The default indirect cost percentage applied to capital costs. This value is used for all '
1133+
f'cost categories unless a more specific indirect cost parameter is defined or provided. '
1134+
f'For example, '
1135+
f'wellfield costs use {self.wellfield_indirect_capital_cost_percentage.Name} '
1136+
f'(default {self.wellfield_indirect_capital_cost_percentage.DefaultValue}%).'
1137+
f'and reservoir stimulation costs use {self.stimulation_indirect_capital_cost_percentage.Name} '
1138+
f'(default {self.stimulation_indirect_capital_cost_percentage.DefaultValue}%).'
1139+
)
11251140

11261141
# absorption chiller
11271142
self.chillercapex = self.ParameterDict[self.chillercapex.Name] = floatParameter(
@@ -1673,7 +1688,7 @@ def __init__(self, model: Model):
16731688

16741689
stimulation_contingency_and_indirect_costs_tooltip = (
16751690
f'plus 15% contingency ' # TODO https://github.com/NREL/GEOPHIRES-X/issues/383
1676-
f'plus {self.stimulation_indirect_capital_cost.quantity().to(convertible_unit("%")).magnitude}% '
1691+
f'plus {self.stimulation_indirect_capital_cost_percentage.quantity().to(convertible_unit("%")).magnitude}% '
16771692
f'indirect costs'
16781693
)
16791694

@@ -1695,7 +1710,7 @@ def __init__(self, model: Model):
16951710

16961711
contingency_and_indirect_costs_tooltip = (
16971712
f'plus 15% contingency ' # TODO https://github.com/NREL/GEOPHIRES-X/issues/383
1698-
f'plus {self.indirect_cost.quantity().to(convertible_unit("%")).magnitude}% indirect costs'
1713+
f'plus {self.indirect_capital_cost_percentage.quantity().to(convertible_unit("%")).magnitude}% indirect costs'
16991714
)
17001715

17011716
self.Cexpl = self.OutputParameterDict[self.Cexpl.Name] = OutputParameter(
@@ -2403,11 +2418,16 @@ def Calculate(self, model: Model) -> None:
24032418
self.cost_lateral_section.value = 0.0
24042419
# cost of the well field
24052420

2406-
# 1.05 for 5% indirect costs
2407-
# TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
2408-
self.Cwell.value = 1.05 * ((self.cost_one_production_well.value * model.wellbores.nprod.value) +
2409-
(self.cost_one_injection_well.value * model.wellbores.ninj.value) +
2410-
self.cost_lateral_section.value)
2421+
indirect_cost_factor = (
2422+
1 +
2423+
self.wellfield_indirect_capital_cost_percentage.quantity().to('dimensionless').magnitude
2424+
)
2425+
2426+
self.Cwell.value = indirect_cost_factor * (
2427+
self.cost_one_production_well.value * model.wellbores.nprod.value +
2428+
self.cost_one_injection_well.value * model.wellbores.ninj.value +
2429+
self.cost_lateral_section.value
2430+
)
24112431

24122432
self.Cstim.value = self.calculate_stimulation_costs(model).to(self.Cstim.CurrentUnits).magnitude
24132433

@@ -2715,7 +2735,7 @@ def Calculate(self, model: Model) -> None:
27152735

27162736
@property
27172737
def _indirect_cost_factor(self) -> float:
2718-
return 1 + self.indirect_cost.quantity().to('dimensionless').magnitude
2738+
return 1 + self.indirect_capital_cost_percentage.quantity().to('dimensionless').magnitude
27192739

27202740
def calculate_stimulation_costs(self, model: Model) -> PlainQuantity:
27212741
if self.ccstimfixed.Valid:
@@ -2726,7 +2746,7 @@ def calculate_stimulation_costs(self, model: Model) -> PlainQuantity:
27262746
stim_cost_per_production_well = self.stimulation_cost_per_production_well.quantity().to(
27272747
self.Cstim.CurrentUnits).magnitude
27282748

2729-
stimulation_indirect_cost_fraction = (self.stimulation_indirect_capital_cost.quantity()
2749+
stimulation_indirect_cost_fraction = (self.stimulation_indirect_capital_cost_percentage.quantity()
27302750
.to('dimensionless').magnitude)
27312751
stimulation_costs = (
27322752
(

src/geophires_x_schema_generator/geophires-request.json

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,17 +1449,17 @@
14491449
"minimum": 0,
14501450
"maximum": 10
14511451
},
1452-
"Well Drilling and Completion Capital Cost": {
1453-
"description": "Well Drilling and Completion Capital Cost",
1452+
"Injection Well Drilling and Completion Capital Cost": {
1453+
"description": "Injection Well Drilling and Completion Capital Cost",
14541454
"type": "number",
14551455
"units": "MUSD",
14561456
"category": "Economics",
14571457
"default": -1.0,
14581458
"minimum": 0,
14591459
"maximum": 200
14601460
},
1461-
"Injection Well Drilling and Completion Capital Cost": {
1462-
"description": "Injection Well Drilling and Completion Capital Cost",
1461+
"Well Drilling and Completion Capital Cost": {
1462+
"description": "Well Drilling and Completion Capital Cost per well. Applied to production wells, and injection wells unless Injection Well Drilling and Completion Capital Cost is provided.",
14631463
"type": "number",
14641464
"units": "MUSD",
14651465
"category": "Economics",
@@ -1485,15 +1485,6 @@
14851485
"minimum": 0,
14861486
"maximum": 10
14871487
},
1488-
"Indirect Cost Percentage": {
1489-
"description": "The default indirect cost percentage applied to capital costs. This value is used for all cost categories unless a more specific indirect cost parameter is provided. For example, reservoir stimulation costs use Reservoir Stimulation Indirect Capital Cost Percentage (default 5%).",
1490-
"type": "number",
1491-
"units": "%",
1492-
"category": "Economics",
1493-
"default": 12,
1494-
"minimum": 0,
1495-
"maximum": 100
1496-
},
14971488
"Wellfield O&M Cost": {
14981489
"description": "Total annual wellfield O&M cost",
14991490
"type": "number",
@@ -1869,6 +1860,24 @@
18691860
"minimum": 0.0,
18701861
"maximum": 15000.0
18711862
},
1863+
"Well Drilling and Completion Indirect Capital Cost Percentage": {
1864+
"description": "The indirect capital cost for well drilling and completion of all wells (the wellfield), calculated as a percentage of the direct cost. ",
1865+
"type": "number",
1866+
"units": "%",
1867+
"category": "Economics",
1868+
"default": 5,
1869+
"minimum": 0,
1870+
"maximum": 100
1871+
},
1872+
"Indirect Capital Cost Percentage": {
1873+
"description": "The default indirect cost percentage applied to capital costs. This value is used for all cost categories unless a more specific indirect cost parameter is defined or provided. For example, wellfield costs use Well Drilling and Completion Indirect Capital Cost Percentage (default 5%).and reservoir stimulation costs use Reservoir Stimulation Indirect Capital Cost Percentage (default 5%).",
1874+
"type": "number",
1875+
"units": "%",
1876+
"category": "Economics",
1877+
"default": 12,
1878+
"minimum": 0,
1879+
"maximum": 100
1880+
},
18721881
"Absorption Chiller Capital Cost": {
18731882
"description": "Absorption chiller capital cost",
18741883
"type": "number",

0 commit comments

Comments
 (0)