Skip to content

Commit

Permalink
Updated mooring system and common_cost.
Browse files Browse the repository at this point in the history
  • Loading branch information
nRiccobo committed Jul 9, 2024
1 parent a64980f commit 6902f39
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 11 deletions.
4 changes: 4 additions & 0 deletions ORBIT/core/defaults/common_costs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,7 @@ semisubmersible_design:
truss_CR: 6250 # USD/t
heave_plate_CR: 6250 # USD/t
secondary_steel_CR: 7250 # USD/t

# Mooring system component cost rates
mooring_system_design: # USD/m
mooring_line_cost_rate: [399.0, 721.0, 1088.0]
40 changes: 29 additions & 11 deletions ORBIT/phases/design/mooring_system_design.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,22 @@

from scipy.interpolate import interp1d

from ORBIT.core.defaults import common_costs
from ORBIT.phases.design import DesignPhase

"""
[1] Maness et al. 2017, NREL Offshore Balance-of-System Model.
https://www.nrel.gov/docs/fy17osti/66874.pdf
[2] Cooperman et al. (2022), Assessment of Offshore Wind Energy Leasing Areas
for Humboldt and Morry Bay. https://www.nrel.gov/docs/fy22osti/82341.pdf
"""

if (
mooring_design_cost := common_costs.get("mooring_system_design", None)
) is None:
raise KeyError("No mooring design in common costs.")


class MooringSystemDesign(DesignPhase):
"""Mooring System and Anchor Design."""
Expand Down Expand Up @@ -68,8 +82,7 @@ def __init__(self, config, **kwargs):
self.anchor_type = self._design.get("anchor_type", "Suction Pile")
self.mooring_type = self._design.get("mooring_type", "Catenary")

# Semi-Taut mooring system design parameters based on depth
# Cooperman et al. (2022), https://www.nrel.gov/docs/fy22osti/82341.pdf
# Semi-Taut mooring system design parameters based on depth [2].
self._semitaut_params = {
"depths": [500.0, 750.0, 1000.0, 1250.0, 1500.0],
"rope_lengths": [478.41, 830.34, 1229.98, 1183.93, 1079.62],
Expand Down Expand Up @@ -108,26 +121,31 @@ def determine_mooring_line(self):
tr = self.config["turbine"]["turbine_rating"]
fit = -0.0004 * (tr**2) + 0.0132 * tr + 0.0536

_key = "mooring_line_cost_rate"
if (
mooring_line_cost_rate := self._design.get(
_key, mooring_design_cost.get(_key, None)
)
) is None:
raise KeyError(f"{_key} not found in common_costs.")

if isinstance(mooring_line_cost_rate, (int, float)):
mooring_line_cost_rate = [mooring_line_cost_rate] * 3

if fit <= 0.09:
self.line_diam = 0.09
self.line_mass_per_m = 0.161
self.line_cost_rate = self._design.get(
"mooring_line_cost_rate", 399.0
)
self.line_cost_rate = mooring_line_cost_rate[0]

elif fit <= 0.12:
self.line_diam = 0.12
self.line_mass_per_m = 0.288
self.line_cost_rate = self._design.get(
"mooring_line_cost_rate", 721.0
)
self.line_cost_rate = mooring_line_cost_rate[1]

else:
self.line_diam = 0.15
self.line_mass_per_m = 0.450
self.line_cost_rate = self._design.get(
"mooring_line_cost_rate", 1088.0
)
self.line_cost_rate = mooring_line_cost_rate[2]

def calculate_breaking_load(self):
"""Returns the mooring line breaking load."""
Expand Down

0 comments on commit 6902f39

Please sign in to comment.