Skip to content

Commit 0f926a0

Browse files
committed
Added capability for lumped inertia properties in the platform
The user can now specify points with inertial properties (mass and moments of inertia) that are added to the total inertia of the floating platform. This is particularly useful for cases where we only have the total mass and moments of inertia of the platform. Added the relevant section (commented out) in `examples/VolturnUS-S _example.yaml` to exemplify the usage of this new capability. New test case `VolturnUS-S-pointInertia.yaml`, which is run in`test_fowt.py` and in `test_model.py`
1 parent 0bcc3ae commit 0f926a0

10 files changed

+1413
-68
lines changed

examples/VolturnUS-S_example.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,14 @@ platform:
10921092
dlsMax : 5.0 # maximum node splitting section amount for platform members; can't be 0
10931093
qtfPath : 'IEA-15-240-RWT-UMaineSemi.12d' # path to the qtf file for the platform
10941094

1095+
# # `pointInertias` in as optional input that allows the user to specify lumped inertial properties
1096+
# # of the platform in addition (or instead of) the distributed inertia properties of each member.
1097+
# pointInertias: # List of lumped inertial properties
1098+
# - name : point1
1099+
# mass : 1.7754e+7 # [kg]
1100+
# moments_of_inertia: [1.251E+10, 1.251E+10, 2.367E+10, 0, 0, 0] # Jxx, Jyy, Jzz, Jxy, Jxz, Jyz [kg*m^2]
1101+
# location : [0, 0, -14.94] #
1102+
10951103
members: # list all members here
10961104

10971105
- name : center_column # [-] an identifier (no longer has to be number)

raft/raft_fowt.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,24 @@ def __init__(self, design, w, mpb, depth=600, x_ref=0, y_ref=0, heading_adjust=0
5656
self.x_ref = x_ref # reference x position of the FOWT in the array [m]
5757
self.y_ref = y_ref # reference y position of the FOWT in the array [m]
5858
self.r6 = np.zeros(6) # mean position/orientation in absolute/array coordinates [m,rad]
59-
59+
60+
# Platform lumped inertias
61+
self.pointInertias = []
62+
if 'pointInertias' in design['platform']:
63+
nPoints = len(design['platform']['pointInertias'])
64+
for ip, pointInertia in enumerate(design['platform']['pointInertias']):
65+
self.pointInertias.append({'m': 0, 'inertia': np.zeros([6, 6]), 'r': np.zeros([3,])}) # mass, inertia, and position of each point mass to be added to the platform
66+
pointMass = getFromDict(pointInertia, 'mass', shape=0, default=0) # mass of the substructure [kg]
67+
self.pointInertias[-1]['m'] = pointMass
68+
auxInertia = getFromDict(pointInertia, 'moments_of_inertia', shape=6, default=[0,0,0]) # moments of inertia of the substructure [kg*m^2] - specified in the order Jxx, Jyy, Jzz, Jxy, Jxz, Jyz
69+
self.pointInertias[-1]['inertia'] = np.array([[pointMass, 0, 0, 0, 0, 0],
70+
[0, pointMass, 0, 0, 0, 0],
71+
[0, 0, pointMass, 0, 0, 0],
72+
[0, 0, 0, auxInertia[0], auxInertia[3], auxInertia[4]],
73+
[0, 0, 0, auxInertia[3], auxInertia[1], auxInertia[5]],
74+
[0, 0, 0, auxInertia[4], auxInertia[5], auxInertia[2]]])
75+
self.pointInertias[-1]['r'] = getFromDict(pointInertia, 'location', shape=3, default=[0,0,0])
76+
6077
# count number of platform members
6178
self.nplatmems = 0
6279
for platmem in design['platform']['members']:
@@ -479,6 +496,18 @@ def calcStatics(self):
479496
self.M_struc += translateMatrix6to6DOF(Mmat, rotor.r_CG_rel) # mass/inertia matrix
480497
m_center_sum += rotor.r_CG_rel*rotor.mRNA
481498

499+
500+
# ------------------------- include point inertia properties -----------------------------
501+
for ip, pointInertia in enumerate(self.pointInertias):
502+
self.M_struc += translateMatrix6to6DOF(pointInertia['inertia'], pointInertia['r'])
503+
self.W_struc += translateForce3to6DOF( np.array([0,0, -g*pointInertia['m']]), pointInertia['r'] )
504+
m_center_sum += pointInertia['r']*pointInertia['m']
505+
506+
self.m_sub += pointInertia['m']
507+
self.M_struc_sub += translateMatrix6to6DOF(pointInertia['inertia'], pointInertia['r']) # mass matrix of the substructure about the PRP
508+
m_sub_sum += pointInertia['r']*pointInertia['m'] # product sum of the substructure members and their centers of mass [kg-m]
509+
510+
482511
# ----------- process inertia-related totals ----------------
483512

484513
m_all = self.M_struc[0,0] # total mass of all the members

raft/raft_member.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def __init__(self, mi, nw, BEM=[], heading=0):
103103
self.MCF = False
104104

105105

106-
self.t = getFromDict(mi, 't', shape=n) # shell thickness at each station [m]
106+
self.t = getFromDict(mi, 't', shape=n, default=0) # shell thickness at each station [m]
107107
self.rho_shell = getFromDict(mi, 'rho_shell', shape=0, default=8500.) # shell mass density [kg/m^3]
108108

109109

@@ -707,7 +707,7 @@ def RectangularFrustumMOI(La, Wa, Lb, Wb, H, p):
707707
self.mshell = mshell
708708
self.mfill = mfill
709709
mass = self.M_struc[0,0] # total mass of the entire member [kg]
710-
center = mass_center/mass # total center of mass of the entire member from the PRP [m]
710+
center = mass_center/mass if mass!=0 else np.array([0,0,0]) # total center of mass of the entire member from the PRP [m]
711711

712712

713713
return mass, center, mshell, mfill, pfill

0 commit comments

Comments
 (0)