Skip to content

Commit

Permalink
Merge pull request #213 from WISDEM/weis_support
Browse files Browse the repository at this point in the history
Weis support
  • Loading branch information
gbarter committed Jan 11, 2021
2 parents e213ba7 + c5da375 commit f67c152
Show file tree
Hide file tree
Showing 10 changed files with 295 additions and 89 deletions.
2 changes: 2 additions & 0 deletions wisdem/floatingse/floating.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ def setup(self):
"nodes_xyz",
"nodes_r",
"transition_node",
"section_D",
"section_t",
"section_A",
"section_Asx",
"section_Asy",
Expand Down
65 changes: 49 additions & 16 deletions wisdem/floatingse/floating_frame.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@
import openmdao.api as om
import wisdem.commonse.utilities as util
import wisdem.pyframe3dd.pyframe3dd as pyframe3dd
from wisdem.commonse import gravity
from wisdem.commonse import NFREQ, gravity
from wisdem.floatingse.member import NULL, MEMMAX, Member

NNODES_MAX = 1000
NELEM_MAX = 1000
RIGID = 1e30
NFREQ = 5

# TODO:
# - Added mass, hydro stiffness?
Expand All @@ -26,6 +25,8 @@ def setup(self):
for k in range(n_member):
self.add_input("member" + str(k) + ":nodes_xyz", NULL * np.ones((MEMMAX, 3)), units="m")
self.add_input("member" + str(k) + ":nodes_r", NULL * np.ones(MEMMAX), units="m")
self.add_input("member" + str(k) + ":section_D", NULL * np.ones(MEMMAX), units="m")
self.add_input("member" + str(k) + ":section_t", NULL * np.ones(MEMMAX), units="m")
self.add_input("member" + str(k) + ":section_A", NULL * np.ones(MEMMAX), units="m**2")
self.add_input("member" + str(k) + ":section_Asx", NULL * np.ones(MEMMAX), units="m**2")
self.add_input("member" + str(k) + ":section_Asy", NULL * np.ones(MEMMAX), units="m**2")
Expand Down Expand Up @@ -53,6 +54,8 @@ def setup(self):
self.add_output("platform_Rnode", NULL * np.ones(NNODES_MAX), units="m")
self.add_output("platform_elem_n1", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_output("platform_elem_n2", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_output("platform_elem_D", NULL * np.ones(NELEM_MAX), units="m")
self.add_output("platform_elem_t", NULL * np.ones(NELEM_MAX), units="m")
self.add_output("platform_elem_A", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_output("platform_elem_Asx", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_output("platform_elem_Asy", NULL * np.ones(NELEM_MAX), units="m**2")
Expand Down Expand Up @@ -177,6 +180,8 @@ def set_element_props(self, inputs, outputs):
n_member = opt["floating"]["members"]["n_members"]

# Initialize running lists across all members
elem_D = np.array([])
elem_t = np.array([])
elem_A = np.array([])
elem_Asx = np.array([])
elem_Asy = np.array([])
Expand All @@ -199,6 +204,8 @@ def set_element_props(self, inputs, outputs):
# Append all member data
for k in range(n_member):
n = np.where(inputs["member" + str(k) + ":section_A"] == NULL)[0][0]
elem_D = np.append(elem_D, inputs["member" + str(k) + ":section_D"][:n])
elem_t = np.append(elem_t, inputs["member" + str(k) + ":section_t"][:n])
elem_A = np.append(elem_A, inputs["member" + str(k) + ":section_A"][:n])
elem_Asx = np.append(elem_Asx, inputs["member" + str(k) + ":section_Asx"][:n])
elem_Asy = np.append(elem_Asy, inputs["member" + str(k) + ":section_Asy"][:n])
Expand Down Expand Up @@ -226,6 +233,8 @@ def set_element_props(self, inputs, outputs):

# Store outputs
nelem = elem_A.size
outputs["platform_elem_D"] = NULL * np.ones(NELEM_MAX)
outputs["platform_elem_t"] = NULL * np.ones(NELEM_MAX)
outputs["platform_elem_A"] = NULL * np.ones(NELEM_MAX)
outputs["platform_elem_Asx"] = NULL * np.ones(NELEM_MAX)
outputs["platform_elem_Asy"] = NULL * np.ones(NELEM_MAX)
Expand All @@ -236,6 +245,8 @@ def set_element_props(self, inputs, outputs):
outputs["platform_elem_E"] = NULL * np.ones(NELEM_MAX)
outputs["platform_elem_G"] = NULL * np.ones(NELEM_MAX)

outputs["platform_elem_D"][:nelem] = elem_D
outputs["platform_elem_t"][:nelem] = elem_t
outputs["platform_elem_A"][:nelem] = elem_A
outputs["platform_elem_Asx"][:nelem] = elem_Asx
outputs["platform_elem_Asy"][:nelem] = elem_Asy
Expand All @@ -260,12 +271,13 @@ class TowerPreMember(om.ExplicitComponent):
def setup(self):
self.add_input("transition_node", np.zeros(3), units="m")
self.add_input("hub_height", 0.0, units="m")
self.add_input("distance_tt_hub", 0.0, units="m")
self.add_output("hub_node", np.zeros(3), units="m")

def compute(self, inputs, outputs):
transition_node = inputs["transition_node"]
hub_node = transition_node
hub_node[2] = float(inputs["hub_height"])
hub_node[2] = float(inputs["hub_height"] - inputs["distance_tt_hub"])
outputs["hub_node"] = hub_node


Expand All @@ -277,6 +289,8 @@ def setup(self):
self.add_input("platform_Rnode", NULL * np.ones(NNODES_MAX), units="m")
self.add_input("platform_elem_n1", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_input("platform_elem_n2", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_input("platform_elem_D", NULL * np.ones(NELEM_MAX), units="m")
self.add_input("platform_elem_t", NULL * np.ones(NELEM_MAX), units="m")
self.add_input("platform_elem_A", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_input("platform_elem_Asx", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_input("platform_elem_Asy", NULL * np.ones(NELEM_MAX), units="m**2")
Expand All @@ -295,6 +309,8 @@ def setup(self):
self.add_input("tower_Rnode", NULL * np.ones(MEMMAX), units="m")
self.add_output("tower_elem_n1", copy_shape="tower_elem_A")
self.add_output("tower_elem_n2", copy_shape="tower_elem_A")
self.add_input("tower_elem_D", NULL * np.ones(MEMMAX), units="m")
self.add_input("tower_elem_t", NULL * np.ones(MEMMAX), units="m")
self.add_input("tower_elem_A", NULL * np.ones(MEMMAX), units="m**2")
self.add_input("tower_elem_Asx", NULL * np.ones(MEMMAX), units="m**2")
self.add_input("tower_elem_Asy", NULL * np.ones(MEMMAX), units="m**2")
Expand All @@ -319,6 +335,8 @@ def setup(self):
self.add_output("system_Rnode", NULL * np.ones(NNODES_MAX), units="m")
self.add_output("system_elem_n1", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_output("system_elem_n2", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_output("system_elem_D", NULL * np.ones(NELEM_MAX), units="m")
self.add_output("system_elem_t", NULL * np.ones(NELEM_MAX), units="m")
self.add_output("system_elem_A", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_output("system_elem_Asx", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_output("system_elem_Asy", NULL * np.ones(NELEM_MAX), units="m**2")
Expand All @@ -331,9 +349,10 @@ def setup(self):
self.add_output("system_center_of_mass", np.zeros(3), units="m")
self.add_output("system_mass", 0.0, units="kg")
self.add_output("variable_ballast_mass", 0.0, units="kg")
self.add_output("transition_piece_I", np.zeros(6), units="kg*m**2")

def compute(self, inputs, outputs):

# Combine nodes
node_platform = inputs["platform_nodes"]
node_tower = inputs["tower_nodes"]

Expand All @@ -345,6 +364,7 @@ def compute(self, inputs, outputs):
nelem_tower = np.where(inputs["tower_elem_A"] == NULL)[0][0]
nelem_system = nelem_platform + nelem_tower

# Combine elements indices and have tower base node point to platform transition node
outputs["tower_Fnode"] = np.zeros(node_tower.shape)
outputs["tower_elem_n1"] = NULL * np.ones(MEMMAX, dtype=np.int_)
outputs["tower_elem_n2"] = NULL * np.ones(MEMMAX, dtype=np.int_)
Expand All @@ -357,6 +377,7 @@ def compute(self, inputs, outputs):
tower_n2 += nnode_platform - 1
tower_n1[0] = itrans_platform

# Store all outputs
outputs["system_nodes"] = NULL * np.ones((NNODES_MAX, 3))
outputs["system_Fnode"] = NULL * np.ones((NNODES_MAX, 3))
outputs["system_Rnode"] = NULL * np.ones(NNODES_MAX)
Expand All @@ -383,6 +404,8 @@ def compute(self, inputs, outputs):
]

for var in [
"elem_D",
"elem_t",
"elem_A",
"elem_Asx",
"elem_Asy",
Expand All @@ -398,6 +421,7 @@ def compute(self, inputs, outputs):
inputs["platform_" + var][:nelem_platform], inputs["tower_" + var][:nelem_tower]
]

# Mass summaries
outputs["system_mass"] = (
inputs["platform_mass"] + inputs["tower_mass"] + inputs["rna_mass"] + inputs["transition_piece_mass"]
)
Expand All @@ -412,6 +436,11 @@ def compute(self, inputs, outputs):
inputs["platform_displacement"] * inputs["rho_water"] - outputs["system_mass"]
)

m_trans = float(inputs["transition_piece_mass"])
r_trans = inputs["platform_Rnode"][itrans_platform]
I_trans = m_trans * r_trans ** 2.0 * np.r_[0.5, 0.5, 1.0, np.zeros(3)]
outputs["transition_piece_I"] = I_trans


class FrameAnalysis(om.ExplicitComponent):
def initialize(self):
Expand All @@ -429,6 +458,8 @@ def setup(self):
self.add_input("tower_Rnode", NULL * np.ones(MEMMAX), units="m")
self.add_input("tower_elem_n1", NULL * np.ones(MEMMAX))
self.add_input("tower_elem_n2", NULL * np.ones(MEMMAX))
self.add_input("tower_elem_D", NULL * np.ones(MEMMAX), units="m")
self.add_input("tower_elem_t", NULL * np.ones(MEMMAX), units="m")
self.add_input("tower_elem_A", NULL * np.ones(MEMMAX), units="m**2")
self.add_input("tower_elem_Asx", NULL * np.ones(MEMMAX), units="m**2")
self.add_input("tower_elem_Asy", NULL * np.ones(MEMMAX), units="m**2")
Expand All @@ -444,6 +475,8 @@ def setup(self):
self.add_input("system_Rnode", NULL * np.ones(NNODES_MAX), units="m")
self.add_input("system_elem_n1", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_input("system_elem_n2", NULL * np.ones(NELEM_MAX, dtype=np.int_))
self.add_input("system_elem_D", NULL * np.ones(NELEM_MAX), units="m")
self.add_input("system_elem_t", NULL * np.ones(NELEM_MAX), units="m")
self.add_input("system_elem_A", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_input("system_elem_Asx", NULL * np.ones(NELEM_MAX), units="m**2")
self.add_input("system_elem_Asy", NULL * np.ones(NELEM_MAX), units="m**2")
Expand All @@ -467,20 +500,20 @@ def setup(self):

NFREQ2 = int(NFREQ / 2)
self.add_output("tower_freqs", val=np.zeros(NFREQ), units="Hz")
self.add_output("tower_foreaft_mode_shapes", val=np.zeros((NFREQ2, 5)))
self.add_output("tower_sideside_mode_shapes", val=np.zeros((NFREQ2, 5)))
self.add_output("tower_foreaft_mode_freqs", val=np.zeros(NFREQ2))
self.add_output("tower_sideside_mode_freqs", val=np.zeros(NFREQ2))
self.add_output("tower_fore_aft_modes", val=np.zeros((NFREQ2, 5)))
self.add_output("tower_side_side_modes", val=np.zeros((NFREQ2, 5)))
self.add_output("tower_fore_aft_freqs", val=np.zeros(NFREQ2))
self.add_output("tower_side_side_freqs", val=np.zeros(NFREQ2))

def compute(self, inputs, outputs):

# Unpack variables
opt = self.options["options"]
n_attach = opt["mooring"]["n_attach"]
I_trans = inputs["transition_piece_I"]
m_rna = float(inputs["rna_mass"])
cg_rna = inputs["rna_cg"]
I_rna = inputs["rna_I"]
I_trans = inputs["transition_piece_I"]

fairlead_joints = inputs["mooring_fairlead_joints"]
mooringF = inputs["mooring_neutral_load"]
Expand Down Expand Up @@ -528,12 +561,12 @@ def compute(self, inputs, outputs):
myframe = pyframe3dd.Frame(node_obj, react_obj, elem_obj, opt_obj)

# Added mass
m_trans = float(inputs["transition_piece_mass"])
if frame == "tower":
# TODO: Added mass and stiffness
m_trans = float(inputs["transition_piece_mass"] + inputs["platform_mass"])
m_trans += float(inputs["platform_mass"])
cg_trans = inputs["transition_node"] - inputs["platform_center_of_mass"]
else:
m_trans = float(inputs["transition_piece_mass"])
cg_trans = np.zeros(3)
add_gravity = True
mID = np.array([itrans, ihub], dtype=np.int_).flatten()
Expand Down Expand Up @@ -592,10 +625,10 @@ def compute(self, inputs, outputs):
freq_x, freq_y, mshapes_x, mshapes_y = util.get_xy_mode_shapes(
nodes[:, 2], modal.freq, modal.xdsp, modal.ydsp, modal.zdsp, modal.xmpf, modal.ympf, modal.zmpf
)
outputs[frame + "_foreaft_mode_freqs"] = freq_x[:NFREQ2]
outputs[frame + "_sideside_mode_freqs"] = freq_y[:NFREQ2]
outputs[frame + "_foreaft_mode_shapes"] = mshapes_x[:NFREQ2, :]
outputs[frame + "_sideside_mode_shapes"] = mshapes_y[:NFREQ2, :]
outputs[frame + "_fore_aft_freqs"] = freq_x[:NFREQ2]
outputs[frame + "_side_side_freqs"] = freq_y[:NFREQ2]
outputs[frame + "_fore_aft_modes"] = mshapes_x[:NFREQ2, :]
outputs[frame + "_side_side_modes"] = mshapes_y[:NFREQ2, :]

# Determine forces
F_sum = -1.0 * np.array([reactions.Fx.sum(), reactions.Fy.sum(), reactions.Fz.sum()])
Expand Down Expand Up @@ -633,7 +666,7 @@ def setup(self):
("joint1", "transition_node"),
("joint2", "hub_node"),
]
for var in ["A", "Asx", "Asy", "rho", "Ixx", "Iyy", "Izz", "E", "G"]:
for var in ["D", "t", "A", "Asx", "Asy", "rho", "Ixx", "Iyy", "Izz", "E", "G"]:
prom += [("section_" + var, "tower_elem_" + var)]
self.add_subsystem(
"tower",
Expand Down

0 comments on commit f67c152

Please sign in to comment.