diff --git a/ORBIT/core/defaults/common_costs.yaml b/ORBIT/core/defaults/common_costs.yaml index 1e8e9867..c3d77ea2 100644 --- a/ORBIT/core/defaults/common_costs.yaml +++ b/ORBIT/core/defaults/common_costs.yaml @@ -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 @@ -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 @@ -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 diff --git a/ORBIT/phases/design/electrical_export.py b/ORBIT/phases/design/electrical_export.py index db06635b..0bf5b048 100644 --- a/ORBIT/phases/design/electrical_export.py +++ b/ORBIT/phases/design/electrical_export.py @@ -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): @@ -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 @@ -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: @@ -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 = ( @@ -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 = ( @@ -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 = ( @@ -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: @@ -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 ), ) @@ -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 @@ -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 @@ -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 ), ) @@ -599,12 +627,13 @@ 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 ), ) @@ -612,7 +641,7 @@ def calc_onshore_cost(self): _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 @@ -621,7 +650,7 @@ 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 ), ) @@ -629,7 +658,7 @@ def calc_onshore_cost(self): _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 = ( @@ -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 ), ) diff --git a/library/cables/HVDC_2500mm_525kV.yaml b/library/cables/HVDC_2500mm_525kV.yaml index ffeb6330..dff09c86 100644 --- a/library/cables/HVDC_2500mm_525kV.yaml +++ b/library/cables/HVDC_2500mm_525kV.yaml @@ -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 diff --git a/library/cables/XLPE_2500mm_420kV.yaml b/library/cables/XLPE_2500mm_420kV.yaml new file mode 100644 index 00000000..fe9b5eea --- /dev/null +++ b/library/cables/XLPE_2500mm_420kV.yaml @@ -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 \ No newline at end of file