@@ -1111,6 +1111,18 @@ def __init__(self, model: Model):
11111111 ErrMessage = "assume default peaking boiler efficiency (85%)" ,
11121112 ToolTipText = "Peaking boiler efficiency"
11131113 )
1114+ self ._default_peaking_boiler_cost_USD_per_kw = 65
1115+ self .peaking_boiler_cost_per_kw = self .ParameterDict [self .peaking_boiler_cost_per_kw .Name ] = floatParameter (
1116+ "Peaking Boiler Cost per KW" ,
1117+ DefaultValue = self ._default_peaking_boiler_cost_USD_per_kw ,
1118+ Min = 0 ,
1119+ Max = 1000 ,
1120+ UnitType = Units .ENERGYCOST ,
1121+ PreferredUnits = EnergyCostUnit .DOLLARSPERKW ,
1122+ CurrentUnits = EnergyCostUnit .DOLLARSPERKW ,
1123+ Required = False ,
1124+ ToolTipText = "Peaking boiler cost per KW of maximum peaking boiler demand"
1125+ )
11141126 self .dhpipingcostrate = self .ParameterDict [self .dhpipingcostrate .Name ] = floatParameter (
11151127 "District Heating Piping Cost Rate" ,
11161128 DefaultValue = 1200 ,
@@ -1689,13 +1701,18 @@ def __init__(self, model: Model):
16891701 PreferredUnits = CurrencyFrequencyUnit .MDOLLARSPERYEAR ,
16901702 CurrentUnits = CurrencyFrequencyUnit .MDOLLARSPERYEAR
16911703 )
1704+
16921705 # district heating
16931706 self .peakingboilercost = self .OutputParameterDict [self .peakingboilercost .Name ] = OutputParameter (
16941707 Name = "Peaking boiler cost" ,
16951708 UnitType = Units .CURRENCY ,
16961709 PreferredUnits = CurrencyUnit .MDOLLARS ,
1697- CurrentUnits = CurrencyUnit .MDOLLARS
1710+ CurrentUnits = CurrencyUnit .MDOLLARS ,
1711+ ToolTipText = f'Default cost: ${ self ._default_peaking_boiler_cost_USD_per_kw } /KW '
1712+ f'of maximum peaking boiler demand. '
1713+ f'Provide { self .peaking_boiler_cost_per_kw .Name } override the default.'
16981714 )
1715+
16991716 self .dhdistrictcost = self .OutputParameterDict [self .dhdistrictcost .Name ] = OutputParameter (
17001717 Name = "District Heating System Cost" ,
17011718 UnitType = Units .CURRENCY ,
@@ -2381,10 +2398,18 @@ def Calculate(self, model: Model) -> None:
23812398 if self .ccplantfixed .Valid :
23822399 self .Cplant .value = self .ccplantfixed .value
23832400 else :
2401+ # 1.15 for 15% contingency and 1.12 for 12% indirect costs
2402+ # TODO https://github.com/NREL/GEOPHIRES-X/issues/383?title=Parameterize+indirect+cost+factor
23842403 self .Cplant .value = 1.12 * 1.15 * self .ccplantadjfactor .value * 250E-6 * np .max (
2385- model .surfaceplant .HeatExtracted .value ) * 1000. # 1.15 for 15% contingency and 1.12 for 12% indirect costs
2386- self .peakingboilercost .value = 65 * model .surfaceplant .max_peaking_boiler_demand .value / 1000 # add 65$/KW for peaking boiler
2387- self .Cplant .value += self .peakingboilercost .value # add peaking boiler cost to surface plant cost
2404+ model .surfaceplant .HeatExtracted .value ) * 1000.
2405+
2406+ # add 65$/KW for peaking boiler
2407+ self .peakingboilercost .value = (self .peaking_boiler_cost_per_kw .quantity ()
2408+ .to ('USD / kilowatt' ).magnitude
2409+ * model .surfaceplant .max_peaking_boiler_demand .value / 1000 )
2410+
2411+ # add peaking boiler cost to surface plant cost
2412+ self .Cplant .value += self .peakingboilercost .value
23882413
23892414
23902415 else : # all other options have power plant
0 commit comments