Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 79 additions & 5 deletions ORBIT/core/defaults/common_costs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,13 @@ spar_design:
secondary_steel_CR: 7250 # USD/t

# Offshore substation component cost rates
substation_design:
mpt_cost_rate: 12500 # USD/MW
substation_design_275kV:
topside_fab_cost_rate: 14500 # USD/t
topside_design_cost: # USD
#oldHVAC: 4.5e6
HVAC: 107.3e6
HVDC-monopole: 294e6
HVDC-bipole: 476e6
shunt_cost_rate: 35000 # USD/MW
mpt_unit_cost: 2.87e6 # USD/mpt
shunt_unit_cost: 10000 # USD/cable
switchgear_cost: 4e6 # USD/cable
Expand All @@ -43,13 +41,57 @@ substation_design:
oss_substructure_cost_rate: 3000 # USD/t
oss_pile_cost_rate: 0 # USD/t

substation_design_420kV:
topside_fab_cost_rate: 16240 # USD/t
topside_design_cost: # USD
#oldHVAC: 4.5e6
HVAC: 120.1766e6
HVDC-monopole: 329.28e6
HVDC-bipole: 533.12e6
mpt_unit_cost: 3.2144e6 # USD/mpt
shunt_unit_cost: 3.8e3 # USD/cable
switchgear_cost: 4.48e6 # USD/cable
dc_breaker_cost: 11.76e6 # USD/cable
backup_gen_cost: 1.12e6 # USD
workspace_cost: 2.24e6 # USD
other_ancillary_cost: 3.36e6 # USD
topside_assembly_factor: 0.075 # %
converter_cost: # USD
HVAC: 0
HVDC-monopole: 142.24e6
HVDC-bipole: 331.52.2e6
oss_substructure_cost_rate: 3360 # USD/t
oss_pile_cost_rate: 0 # USD/t

substation_design_525kV:
topside_fab_cost_rate: 17980 # USD/t
topside_design_cost: # USD
#oldHVAC: 4.5e6
HVAC: 133.1e6
HVDC-monopole: 364.6e6
HVDC-bipole: 590.2e6
mpt_unit_cost: 3.56e6 # USD/mpt
shunt_unit_cost: 10000 # USD/cable
switchgear_cost: 4.96e6 # USD/cable
dc_breaker_cost: 13.02e6 # USD/cable
backup_gen_cost: 1.24e6 # USD
workspace_cost: 2.48e6 # USD
other_ancillary_cost: 3.72e6 # USD
topside_assembly_factor: 0.075 # %
converter_cost: # USD
HVAC: 0
HVDC-monopole: 157.5e6
HVDC-bipole: 367e6
oss_substructure_cost_rate: 3720 # USD/t
oss_pile_cost_rate: 0 # USD/t

# Onshore substation component cost rates
onshore_substation_design:
onshore_substation_design_275kV:
onshore_converter_cost: # USD
HVAC: 0
HVDC-monopole: 157e6
HVDC-bipole: 350e6
shunt_unit_cost: 13000 # USD/cable
shunt_unit_cost: 3.8e3 # USD/cable
switchgear_cost: 9.33e6 # USD/cable
compensation_rate: # USD/cable
HVAC: 31.3e6
Expand All @@ -60,6 +102,38 @@ onshore_substation_design:
HVDC-monopole: 87.3e6
HVDC-bipole: 100e6

onshore_substation_design_420kV:
onshore_converter_cost: # USD
HVAC: 0
HVDC-monopole: 175.84e6
HVDC-bipole: 392e6
shunt_unit_cost: 3.8e3 # USD/cable
switchgear_cost: 10.4496e6 # USD/cable
compensation_rate: # USD/cable
HVAC: 35.056e6
HVDC-monopole: 0
HVDC-bipole: 0
onshore_construction_rate: # USD
HVAC: 5.6e6
HVDC-monopole: 97.776e6
HVDC-bipole: 112e6

onshore_substation_design_525kV:
onshore_converter_cost: # USD
HVAC: 0
HVDC-monopole: 194.7e6
HVDC-bipole: 434e6
shunt_unit_cost: 4.71e3 # USD/cable
switchgear_cost: 11.57e6 # USD/cable
compensation_rate: # USD/cable
HVAC: 31.3e6
HVDC-monopole: 0
HVDC-bipole: 0
onshore_construction_rate: # USD
HVAC: 6.2e6
HVDC-monopole: 108.3e6
HVDC-bipole: 124e6

# Semisubmersible component cost rates
semisubmersible_design:
stiffened_column_CR: 3120 # USD/t
Expand Down
73 changes: 51 additions & 22 deletions ORBIT/phases/design/electrical_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,29 @@ def calc_crossing_cost(self):
)

"""SUBSTATION"""
def get_substation_design(self):
voltage = self.cable.rated_voltage
substation_design = f"substation_design_{voltage}kV"

#default to using the 275 kV substation costs if there is no corresponding section in common_costs
try:
self.get_default_cost(substation_design, "mpt_unit_cost")
except KeyError:
voltage = "275kV"
substation_design = f"substation_design_{voltage}"
return substation_design

def get_onshore_substation_design(self):
voltage = self.cable.rated_voltage
onshore_substation_design = f"onshore_substation_design_{voltage}kV"

#default to using the 275 kV onshore substation costs if there is no corresponding section in common_costs
try:
self.get_default_cost(onshore_substation_design, "shunt_unit_cost")
except KeyError:
voltage = "275kV"
onshore_substation_design = f"onshore_substation_design_{voltage}"
return onshore_substation_design

@property
def total_substation_cost(self):
Expand Down Expand Up @@ -397,10 +420,10 @@ def calc_mpt_cost(self):
"""Computes HVAC main power transformer (MPT). MPT cost is 0 for
HVDC.
"""

substation_design =self.get_substation_design()
_key = "mpt_unit_cost"
_mpt_cost = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

self.num_mpt = self.num_cables
Expand All @@ -417,13 +440,13 @@ def calc_shunt_reactor_cost(self):
"""Computes HVAC shunt reactor cost. Shunt reactor cost is 0 for
HVDC.
"""

substation_design =self.get_substation_design()
touchdown = self.config["site"]["distance_to_landfall"]

_key = "shunt_unit_cost"

shunt_unit_cost = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

if "HVDC" in self.cable.cable_type:
Expand All @@ -438,10 +461,10 @@ def calc_shunt_reactor_cost(self):

def calc_switchgear_costs(self):
"""Computes HVAC switchgear cost. Switchgear cost is 0 for HVDC."""

substation_design =self.get_substation_design()
_key = "switchgear_cost"
switchgear_cost = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

self.num_switchgear = (
Expand All @@ -452,10 +475,10 @@ def calc_switchgear_costs(self):

def calc_dc_breaker_cost(self):
"""Computes HVDC circuit breaker cost. Breaker cost is 0 for HVAC."""

substation_design =self.get_substation_design()
_key = "dc_breaker_cost"
dc_breaker_cost = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

num_dc_breakers = (
Expand All @@ -467,19 +490,20 @@ def calc_dc_breaker_cost(self):
def calc_ancillary_system_cost(self):
"""Calculates cost of ancillary systems."""

substation_design =self.get_substation_design()
_key = "backup_gen_cost"
backup_gen_cost = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

_key = "workspace_cost"
workspace_cost = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

_key = "other_ancillary_cost"
other_ancillary_cost = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

self.ancillary_system_costs = (
Expand All @@ -489,9 +513,10 @@ def calc_ancillary_system_cost(self):
def calc_assembly_cost(self):
"""Calculates the cost of assembly on land."""

substation_design =self.get_substation_design()
_key = "topside_assembly_factor"
topside_assembly_factor = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

if topside_assembly_factor > 1.0:
Expand All @@ -506,11 +531,12 @@ def calc_assembly_cost(self):
def calc_converter_cost(self):
"""Computes converter cost."""

substation_design =self.get_substation_design()
_key = "converter_cost"
converter_cost = self._oss_design.get(
_key,
self.get_default_cost(
"substation_design", _key, subkey=self.cable.cable_type
substation_design, _key, subkey=self.cable.cable_type
),
)

Expand All @@ -521,15 +547,15 @@ def calc_substructure_mass_and_cost(self):
Calculates the mass and associated cost of the substation substructure
based on equations 81-84 [1].
"""

substation_design =self.get_substation_design()
_key = "oss_substructure_cost_rate"
oss_substructure_cost_rate = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

_key = "oss_pile_cost_rate"
oss_pile_cost_rate = self._oss_design.get(
_key, self.get_default_cost("substation_design", _key)
_key, self.get_default_cost(substation_design, _key)
)

# Substructure mass components
Expand Down Expand Up @@ -580,6 +606,8 @@ def calc_topside_deck_space(self):
def calc_topside_mass_and_cost(self):
"""Calculates the mass and cost of the substation topsides."""

substation_design =self.get_substation_design()

self.topside_mass = (
3.85 * (self.mpt_rating * self.num_mpt) / self.num_substations
+ 285
Expand All @@ -589,7 +617,7 @@ def calc_topside_mass_and_cost(self):
topside_design_cost = self._oss_design.get(
_key,
self.get_default_cost(
"substation_design", _key, subkey=self.cable.cable_type
substation_design, _key, subkey=self.cable.cable_type
),
)

Expand All @@ -599,20 +627,21 @@ def calc_onshore_cost(self):
"""Minimum Cost of Onshore Substation Connection."""

_design = self.config.get("onshore_substation_design", {})
onshore_substation_design = self.get_onshore_substation_design()

_key = "onshore_converter_cost"
_converter_cost = _design.get(
_key,
self.get_default_cost(
"onshore_substation_design", _key, subkey=self.cable.cable_type
onshore_substation_design, _key, subkey=self.cable.cable_type
),
)

self.onshore_converter_cost = self.num_substations * _converter_cost

_key = "switchgear_cost"
_switchgear_cost = _design.get(
_key, self.get_default_cost("onshore_substation_design", _key)
_key, self.get_default_cost(onshore_substation_design, _key)
)

self.onshore_switchgear_cost = self.num_switchgear * _switchgear_cost
Expand All @@ -621,15 +650,15 @@ def calc_onshore_cost(self):
_construction_rate = _design.get(
_key,
self.get_default_cost(
"onshore_substation_design", _key, subkey=self.cable.cable_type
onshore_substation_design, _key, subkey=self.cable.cable_type
),
)

self.onshore_construction = self.num_substations * _construction_rate

_key = "shunt_unit_cost"
_shunt_unit_cost = _design.get(
_key, self.get_default_cost("onshore_substation_design", _key)
_key, self.get_default_cost(onshore_substation_design, _key)
)

self.onshore_shunt_reactor_cost = (
Expand All @@ -640,7 +669,7 @@ def calc_onshore_cost(self):
_compensation_rate = _design.get(
_key,
self.get_default_cost(
"onshore_substation_design", _key, subkey=self.cable.cable_type
onshore_substation_design, _key, subkey=self.cable.cable_type
),
)

Expand Down
2 changes: 1 addition & 1 deletion library/cables/HVDC_2500mm_525kV.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
ac_resistance: 0 # ohm/km
capacitance: 227000 # nF/km
conductor_size: 2500 # mm^2
cost_per_km: 1420000 # $
cost_per_km: 1855000 # $
current_capacity: 1905 # A
inductance: 0.149 # mH/km
linear_density: 74 # t/km
Expand Down
11 changes: 11 additions & 0 deletions library/cables/XLPE_2500mm_420kV.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# from TFKabel
ac_resistance: 0.014 # ohm/km
capacitance: 225 # nF/km
conductor_size: 2500 # mm^2
cost_per_km: 2450000 # $/km Based on the 220kV costs that are in ORBIT/electrical-refactor right now and the Xiang et al. (2016)
current_capacity: 688 # A # trefoil config in earth, 90C
inductance: 0.115 # mH/km
linear_density: 156 # t/km # ESTIMATE
cable_type: HVAC # HVDC vs HVAC
name: XLPE_2500mm_420kV_dynamic
rated_voltage: 420