Skip to content

Commit d3d3ea8

Browse files
committed
Overdue, General, and OMAE paper Updates
COMMENTED OUT CODE IN IRMA.PY - Many updates revolve around 1) getting the load anchor action to work with the existing example and 2) getting the RM3 ontology example to run. There's still some bugs to catch/verify, but now things should run (where they didn't previously) OntologySample_RM3.yaml = NEW Irma.py - display inputs, optional yaml inputs - new visualize actions function - adding the load anchor actions to the task creation function - organizing a lot of the run code at the bottom of Irma.py (adding anchor mass calculations - actions.yaml: added a load_anchor action, which has a new requirements called "anchor_onboarding" (station_keeping is still unused as of now) - requirements.yaml: right now, only a crane capability can perform the anchor_onboarding requirements (could use a windlass later) - - (added the windlass to the capabilities yaml just in case) - action.py - added the anchor_onboarding requirements update; as well as the duration to onboard the anchor that is just hard-coded for right now - - updated the bollard pull requirements for DEAs to be 200 (to match the current AHTS vessel capabilities), since this wasn't working whenever a DEA was specified
1 parent 43bca4a commit d3d3ea8

File tree

7 files changed

+368
-142
lines changed

7 files changed

+368
-142
lines changed

examples/OntologySample_RM3.yaml

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
type: RM3 WEC example
2+
name:
3+
comments:
4+
# Site condition information
5+
site:
6+
general:
7+
water_depth : 70 # [m] uniform water depth
8+
rho_water : 1025.0 # [kg/m^3] water density
9+
rho_air : 1.225 # [kg/m^3] air density
10+
mu_air : 1.81e-05 # air dynamic viscosity
11+
12+
# ----- Array-level inputs -----
13+
14+
# Wind turbine array layout
15+
array:
16+
keys : [ID, topsideID, platformID, mooringID, x_location, y_location, heading_adjust]
17+
data : # ID# ID# ID# [m] [m] [deg]
18+
- [RM3, 1, 1, ms1, 0, 0, 00 ] # 2 array, shared moorings
19+
20+
# ----- topsides and platforms -----
21+
22+
topsides:
23+
24+
- type: WEC
25+
26+
27+
28+
platform:
29+
30+
type : WEC
31+
potModMaster : 1 # [int] master switch for potMod variables; 0=keeps all member potMod vars the same, 1=turns all potMod vars to False (no HAMS), 2=turns all potMod vars to True (no strip)
32+
rFair : 0
33+
zFair : -10
34+
35+
members: # list all members here
36+
37+
- name : top # [-] an identifier (no longer has to be number)
38+
type : rigid # [-]
39+
rA : [ 0, 0, -2.7] # [m] end A coordinates
40+
rB : [ 0, 0, 2.5] # [m] and B coordinates
41+
# --- outer shell including hydro---
42+
stations : [ -2.7, -1.5, 2.5] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB
43+
d : [ 6, 20, 20] # [m] diameters if circular or side lengths if rectangular (can be pairs)
44+
t : 0.025 # [m] wall thicknesses (scalar or list of same length as stations)
45+
rho_shell : 7850 # [kg/m3]
46+
# --- handling of end caps or any internal structures if we need them ---
47+
cap_stations : [ 2.5 ] # [m] location along member of any inner structures (in same scaling as set by 'stations')
48+
cap_t : [ 0.025 ] # [m] thickness of any internal structures
49+
cap_d_in : [ 6 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape)
50+
51+
- name : center_column # [-] an identifier (no longer has to be number)
52+
type : rigid # [-]
53+
rA : [ 0, 0, -35.0] # [m] end A coordinates
54+
rB : [ 0, 0, 7.0] # [m] and B coordinates
55+
# --- outer shell including hydro---
56+
stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB
57+
d : 6.0 # [m] diameters if circular or side lengths if rectangular (can be pairs)
58+
t : 0.025 # [m] wall thicknesses (scalar or list of same length as stations)
59+
rho_shell : 7850 # [kg/m3]
60+
# --- handling of end caps or any internal structures if we need them ---
61+
cap_stations : [ 1 ] # [m] location along member of any inner structures (in same scaling as set by 'stations')
62+
cap_t : [ 0.025 ] # [m] thickness of any internal structures
63+
cap_d_in : [ 0 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape)
64+
65+
- name : heave_plate # [-] an identifier (no longer has to be number)
66+
type : rigid # [-]
67+
rA : [ 0, 0, -35.0] # [m] end A coordinates
68+
rB : [ 0, 0, -34.5] # [m] and B coordinates
69+
# --- outer shell including hydro---
70+
stations : [0, 1] # [-] location of stations along axis. Will be normalized such that start value maps to rA and end value to rB
71+
d : 30 # [m] diameters if circular or side lengths if rectangular (can be pairs)
72+
t : 0.025 # [m] wall thicknesses (scalar or list of same length as stations)
73+
rho_shell : 7850 # [kg/m3]
74+
# --- handling of end caps or any internal structures if we need them ---
75+
cap_stations : [ 0, 1 ] # [m] location along member of any inner structures (in same scaling as set by 'stations')
76+
cap_t : [ 0.025, 0.025 ] # [m] thickness of any internal structures
77+
cap_d_in : [ 0, 6 ] # [m] inner diameter of internal structures (0 for full cap/bulkhead, >0 for a ring shape)
78+
79+
80+
81+
# ----- Mooring system -----
82+
83+
# Mooring system descriptions (each for an individual FOWT with no sharing)
84+
mooring_systems:
85+
86+
ms1:
87+
name: RM3
88+
89+
keys: [MooringConfigID, heading, anchorType, lengthAdjust]
90+
data:
91+
- [ rm3-nylon, 60 , dea1, 0 ]
92+
- [ rm3-nylon, 180 , dea1, 0 ]
93+
- [ rm3-nylon, 300 , dea1, 0 ]
94+
95+
96+
# Mooring line configurations
97+
mooring_line_configs:
98+
99+
rm3-nylon: # mooring line configuration identifier
100+
101+
name: rm3-nylon # descriptive name
102+
103+
span: 300
104+
105+
sections: # in order from anchor to fairlead
106+
#- connectorType: shackle
107+
#- mooringFamily: chain # ID of a mooring line section type
108+
# d_nom: .089
109+
# length: 30 # [m] usntretched length of line section
110+
#- connectorType: clump_weight_10_t
111+
- mooringFamily: nylon # ID of a mooring line section type
112+
d_nom: .146
113+
length: 267 # [m] usntretched length of line section
114+
#- connectorType: buoy_55_kN
115+
#- mooringFamily: wire
116+
# d_nom: 0.1
117+
# length: 25
118+
119+
mooring_connector_types:
120+
121+
h_link_shackle:
122+
m : 140 # [kg] component mass
123+
v : 0.13 # [m^3] component volumetric displacement
124+
125+
clump_weight_10_t:
126+
m : 10000 # [kg] component mass
127+
v : 0.0 # [m^3] component volumetric displacement
128+
129+
buoy_55_kN:
130+
m : 100 # [kg] component mass
131+
v : 5.6 # [m^3] component volumetric displacement
132+
133+
shackle:
134+
m : 200 # [kg] component mass
135+
v : .2 # [m^3] component volumetric displacement
136+
137+
anchor_types:
138+
139+
dea1:
140+
type : DEA # type of anchor
141+
A : 5.46 # net area of anchor's fluke [m^2] - taken as 0.5*D*F - C*D
142+
zlug : 10 # embedded depth of padeye [m]
143+
mass : 9000 # [kg]
144+
L : 5.46
145+
D : 5.46

famodel/irma/action.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class Action():
9393
subclasses.
9494
'''
9595

96-
def __init__(self, actionType, name, **kwargs): # allReq, **kwargs):
96+
def __init__(self, actionType, name, display=0, **kwargs): # allReq, **kwargs):
9797
'''Create an action object...
9898
It must be given a name.
9999
The remaining parameters should correspond to items in the actionType dict...
@@ -138,6 +138,8 @@ def __init__(self, actionType, name, **kwargs): # allReq, **kwargs):
138138
self.tf = 0 # action end time [h?]
139139

140140
self.supported_objects = [] # list of FAModel object types supported by the action
141+
142+
self.display = display
141143

142144
'''
143145
# Create a dictionary of supported object types (with empty entries)
@@ -316,9 +318,29 @@ def printNotSupported(st):
316318
A = (obj.dd['design']['L']+(10/3.28084)) * (obj.dd['design']['D']+(10/3.28084))
317319
# if the suction piles are to be standing up # <<<<<< how to implement this? Depends on the asset assignment
318320
# A = (obj.dd['design']['D']+(10/3.28084))**2
321+
elif 'dea' in obj.dd['type'].lower() or 'drag' in obj.dd['type'].lower():
322+
A = obj.dd['design']['A']
319323

320324
req['deck_space']['area'] += A
321325

326+
327+
elif reqname == 'anchor_onboarding':
328+
329+
for obj in self.objectList:
330+
if isinstance(obj, Anchor):
331+
332+
if obj.mass:
333+
mass = obj.mass # [kg]
334+
else: # rough estimate based on size
335+
wall_thickness = (6.35 + obj.dd['design']['D']*20)/1e3 # Suction pile wall thickness (m), API RP2A-WSD. It changes for different anchor concepts
336+
mass = (np.pi * ((obj.dd['design']['D']/2)**2 - (obj.dd['design']['D']/2 - wall_thickness)**2) * obj.dd['design']['L'] * 7850) # rough mass estimate [kg]
337+
338+
req['crane']['capacity'] = mass * 1.2
339+
req['crane']['hook_height'] = obj.dd['design']['L'] * 1.2 # <<< replace with proper estimate
340+
341+
#req['windlass']['capacity'] = mass * 1.2
342+
#req['windlass']['speed'] = 0.3
343+
322344
elif reqname == 'anchor_overboarding' or reqname == 'anchor_lowering':
323345
for obj in self.objectList:
324346
if isinstance(obj, Anchor):
@@ -351,7 +373,7 @@ def printNotSupported(st):
351373

352374
if obj.dd['type'] == 'DEA':
353375

354-
req['bollard_pull']['max_force'] = 270*t2N # <<< replace with proper estimate
376+
req['bollard_pull']['max_force'] = 200*t2N # <<< replace with proper estimate
355377

356378
elif obj.dd['type'] == 'suction':
357379

@@ -376,7 +398,10 @@ def printNotSupported(st):
376398
req['divers']['max_depth'] = depth #
377399

378400
else:
379-
printNotSupported(f"Requirement {reqname}")
401+
if self.display > 0:
402+
printNotSupported(f"Requirement {reqname}")
403+
else:
404+
pass
380405

381406
# Make a copy of the requirements dict that only keeps entries > 0
382407
new_reqs = {}
@@ -1603,7 +1628,18 @@ def calcDurationAndCost(self):
16031628
# temporarily estimate 1h per crane loading <<<
16041629
self.durations['load mooring by crane'] = 1.0 * len(moorings)
16051630

1631+
1632+
elif self.type == 'load_anchor':
1633+
1634+
req = self.requirements['anchor_onboarding']
1635+
1636+
if 'crane' in req['selected_capability']:
1637+
self.durations['load anchor by crane'] = 0.25
1638+
1639+
#elif 'windlass' in req['selected_capability']:
1640+
#self.durations['load anchor by windlass'] = 2.0
16061641

1642+
16071643
elif self.type == 'install_anchor':
16081644
# YAML override (no model if present)
16091645
default_duration = None

famodel/irma/actions.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,17 @@ retrieve_anchor:
143143
description: "Anchor retrieval, including break-out and recovery to deck."
144144

145145

146+
load_anchor:
147+
objects: [anchor, component]
148+
requirements:
149+
- storage-in
150+
- anchor_onboarding
151+
- station_keeping
152+
duration_h:
153+
Hs_m:
154+
description: "Load-out of anchors from port or vessel onto vessel."
155+
156+
146157
load_mooring:
147158
objects: [mooring, component]
148159
requirements:

famodel/irma/capabilities.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ crane:
6666
hook_height: normal # max hook height [m]
6767
speed: normal # crane speed [m/s]
6868

69+
windlass:
70+
# description: another way an anchor can be loaded onto a vessel?
71+
# fields:
72+
capacity: normal # take the maximum capacity windlass
73+
speed: normal # take the maximum winding speed
74+
6975
station_keeping_by_dynamic_positioning:
7076
# description: DP vessel capability for station keeping
7177
# fields:

0 commit comments

Comments
 (0)