@@ -572,6 +572,7 @@ def __init__(self, model: Model):
572
572
ToolTipText = "Specify the economic model to calculate the levelized cost of energy. " +
573
573
'; ' .join ([f'{ it .int_value } : { it .value } ' for it in EconomicModel ])
574
574
)
575
+
575
576
self .ccstimfixed = self .ParameterDict [self .ccstimfixed .Name ] = floatParameter (
576
577
"Reservoir Stimulation Capital Cost" ,
577
578
DefaultValue = - 1.0 ,
@@ -584,6 +585,38 @@ def __init__(self, model: Model):
584
585
Valid = False ,
585
586
ToolTipText = "Total reservoir stimulation capital cost"
586
587
)
588
+
589
+ max_stimulation_cost_per_well_MUSD = 100
590
+ self .stimulation_cost_per_injection_well = \
591
+ self .ParameterDict [self .stimulation_cost_per_injection_well .Name ] = floatParameter (
592
+ 'Reservoir Stimulation Capital Cost per Injection Well' ,
593
+ DefaultValue = 1.25 ,
594
+ Min = 0 ,
595
+ Max = max_stimulation_cost_per_well_MUSD ,
596
+ UnitType = Units .CURRENCY ,
597
+ PreferredUnits = CurrencyUnit .MDOLLARS ,
598
+ CurrentUnits = CurrencyUnit .MDOLLARS ,
599
+ Provided = False ,
600
+ ToolTipText = 'Reservoir stimulation capital cost per injection well'
601
+ )
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
+
587
620
self .ccstimadjfactor = self .ParameterDict [self .ccstimadjfactor .Name ] = floatParameter (
588
621
"Reservoir Stimulation Capital Cost Adjustment Factor" ,
589
622
DefaultValue = 1.0 ,
@@ -594,7 +627,7 @@ def __init__(self, model: Model):
594
627
CurrentUnits = PercentUnit .TENTH ,
595
628
Provided = False ,
596
629
Valid = True ,
597
- ToolTipText = "Multiplier for built-in reservoir stimulation capital cost correlation"
630
+ ToolTipText = "Multiplier for reservoir stimulation capital cost correlation"
598
631
)
599
632
self .ccexplfixed = self .ParameterDict [self .ccexplfixed .Name ] = floatParameter (
600
633
"Exploration Capital Cost" ,
@@ -1606,19 +1639,27 @@ def __init__(self, model: Model):
1606
1639
)
1607
1640
1608
1641
# TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
1609
- contingency_and_indirect_costs_tooltip = 'plus 15% contingency plus 12 % indirect costs'
1642
+ stimulation_contingency_and_indirect_costs_tooltip = 'plus 15% contingency plus 5 % indirect costs'
1610
1643
1611
1644
# noinspection SpellCheckingInspection
1612
1645
self .Cstim = self .OutputParameterDict [self .Cstim .Name ] = OutputParameter (
1613
1646
Name = "Stimulation costs" ,
1614
1647
UnitType = Units .CURRENCY ,
1615
1648
PreferredUnits = CurrencyUnit .MDOLLARS ,
1616
1649
CurrentUnits = CurrencyUnit .MDOLLARS ,
1617
- ToolTipText = f'Default correlation: $1.25M per injection well { contingency_and_indirect_costs_tooltip } . '
1618
- f'Provide { self .ccstimadjfactor .Name } to multiply the default correlation. '
1619
- f'Provide { self .ccstimfixed .Name } to override the default correlation and set your own cost.'
1650
+ ToolTipText = f'Default correlation: ${ self .stimulation_cost_per_injection_well .value } M '
1651
+ f'per injection well { stimulation_contingency_and_indirect_costs_tooltip } . '
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. '
1655
+ f'Provide { self .ccstimadjfactor .Name } to multiply the correlation-calculated cost. '
1656
+ f'Provide { self .ccstimfixed .Name } to override the correlation and set your own '
1657
+ f'total stimulation cost.'
1620
1658
)
1621
1659
1660
+ # TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
1661
+ contingency_and_indirect_costs_tooltip = 'plus 15% contingency plus 12% indirect costs'
1662
+
1622
1663
# See TODO re:parameterizing indirect costs at src/geophires_x/Economics.py:652
1623
1664
# (https://github.com/NREL/GEOPHIRES-X/issues/383)
1624
1665
self .Cexpl = self .OutputParameterDict [self .Cexpl .Name ] = OutputParameter (
@@ -2336,12 +2377,18 @@ def Calculate(self, model: Model) -> None:
2336
2377
if self .ccstimfixed .Valid :
2337
2378
self .Cstim .value = self .ccstimfixed .value
2338
2379
else :
2339
- base_stimulation_cost_MUSD_per_injection_well = 1.25 # TODO parameterize
2380
+ stim_cost_per_injection_well = self .stimulation_cost_per_injection_well .quantity ().to (
2381
+ self .Cstim .CurrentUnits ).magnitude
2382
+ stim_cost_per_production_well = self .stimulation_cost_per_production_well .quantity ().to (
2383
+ self .Cstim .CurrentUnits ).magnitude
2340
2384
2341
2385
# 1.15 for 15% contingency and 1.05 for 5% indirect costs
2342
2386
# TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
2343
- self .Cstim .value = (base_stimulation_cost_MUSD_per_injection_well * self .ccstimadjfactor .value
2344
- * 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
+ )
2391
+ * self .ccstimadjfactor .value
2345
2392
* 1.05 * 1.15 )
2346
2393
2347
2394
# field gathering system costs (M$)
0 commit comments