Skip to content

Commit

Permalink
Prototyped "step builder" approach to the interface builder for feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
ddement committed Feb 28, 2025
1 parent acf0afd commit 1447cbc
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 25 deletions.
97 changes: 90 additions & 7 deletions src/interfaces/cfd/interface_builder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,82 @@
#include "mooring_line_input.hpp"

namespace openturbine::cfd {

struct InterfaceBuilder {
struct FloatingPlatformBuilder {
FloatingPlatformBuilder& SetPosition(const std::array<double, 7>& p) {
i_builder->interface_input.turbine.floating_platform.position = p;
return *this;
}

FloatingPlatformBuilder& SetVelocity(const std::array<double, 6>& v) {
i_builder->interface_input.turbine.floating_platform.velocity = v;
return *this;
}

FloatingPlatformBuilder& SetAcceleration(const std::array<double, 6>& a) {
i_builder->interface_input.turbine.floating_platform.acceleration = a;
return *this;
}

FloatingPlatformBuilder& SetMassMatrix(
const std::array<std::array<double, 6>, 6>& mass_matrix
) {
i_builder->interface_input.turbine.floating_platform.mass_matrix = mass_matrix;
return *this;
}

[[nodiscard]] InterfaceBuilder& EndFloatingPlatform() const {
i_builder->interface_input.turbine.floating_platform.enable = true;
return *i_builder;
}

InterfaceBuilder* i_builder;
};

struct MooringLineBuilder {
MooringLineBuilder& SetStiffness(double stiffness) {
i_builder->interface_input.turbine.floating_platform.mooring_lines.back().stiffness =
stiffness;
return *this;
}

MooringLineBuilder& SetUndeformedLength(double length) {
i_builder->interface_input.turbine.floating_platform.mooring_lines.back()
.undeformed_length = length;
return *this;
}

MooringLineBuilder& SetFairleadPosition(const std::array<double, 3>& p) {
i_builder->interface_input.turbine.floating_platform.mooring_lines.back()
.fairlead_position = p;
return *this;
}

MooringLineBuilder& SetAnchorPosition(const std::array<double, 3>& p) {
i_builder->interface_input.turbine.floating_platform.mooring_lines.back()
.anchor_position = p;
return *this;
}

MooringLineBuilder& SetAnchorVelocity(const std::array<double, 3>& v) {
i_builder->interface_input.turbine.floating_platform.mooring_lines.back()
.anchor_velocity = v;
return *this;
}

MooringLineBuilder& SetAnchorAcceleration(const std::array<double, 3>& a) {
i_builder->interface_input.turbine.floating_platform.mooring_lines.back()
.anchor_acceleration = a;
return *this;
}

[[nodiscard]] InterfaceBuilder& EndMooringLine() const { return *i_builder; }

InterfaceBuilder* i_builder;
};

InterfaceBuilder() : interface_input{}, fp_builder{this}, ml_builder{this} {}

InterfaceBuilder& SetGravity(const std::array<double, 3>& gravity) {
interface_input.gravity = gravity;
return *this;
Expand All @@ -23,6 +97,13 @@ struct InterfaceBuilder {
return *this;
}

FloatingPlatformBuilder& StartFloatingPlatform() { return fp_builder; }

MooringLineBuilder& AddMooringLine() {
interface_input.turbine.floating_platform.mooring_lines.push_back({});
return ml_builder;
}

InterfaceBuilder& SetDampingFactor(double rho_inf) {
interface_input.rho_inf = rho_inf;
return *this;
Expand Down Expand Up @@ -90,15 +171,17 @@ struct InterfaceBuilder {
return *this;
}

InterfaceBuilder& SetTurbine(const TurbineInput& turbine_in) {
interface_input.turbine = turbine_in;
return *this;
}

[[nodiscard]] Interface Build() const { return Interface(interface_input); }

private:
friend FloatingPlatformBuilder;
friend MooringLineBuilder;

protected:
InterfaceInput interface_input;

private:
FloatingPlatformBuilder fp_builder;
MooringLineBuilder ml_builder;
};

} // namespace openturbine::cfd
65 changes: 47 additions & 18 deletions tests/regression_tests/interfaces/test_cfd_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,30 +151,59 @@ TEST(CFDInterfaceTest, FloatingPlatform) {
constexpr auto mooring_line_stiffness{48.9e3}; // N
constexpr auto mooring_line_initial_length{55.432}; // m

// Create cfd interface
auto interface = InterfaceBuilder{}
.SetGravity(gravity)
.SetTimeStep(time_step)
.SetDampingFactor(rho_inf)
.SetMaximumNonlinearIterations(max_iter)
.EnableFloatingPlatform(true)
.SetFloatingPlatformPosition({0., 0., -7.53, 1., 0., 0., 0.})
.SetFloatingPlatformMassMatrix(platform_mass_matrix)
.SetNumberOfMooringLines(3)
.SetMooringLineStiffness(0, mooring_line_stiffness)
.SetMooringLineUndeformedLength(0, mooring_line_initial_length)
.SetMooringLineFairleadPosition(0, {-40.87, 0.0, -14.})
.SetMooringLineAnchorPosition(0, {-105.47, 0.0, -58.4})
.SetMooringLineStiffness(1, mooring_line_stiffness)
.SetMooringLineUndeformedLength(1, mooring_line_initial_length)
.SetMooringLineFairleadPosition(1, {20.43, -35.39, -14.})
.SetMooringLineAnchorPosition(1, {52.73, -91.34, -58.4})
.SetMooringLineStiffness(2, mooring_line_stiffness)
.SetMooringLineUndeformedLength(2, mooring_line_initial_length)
.SetMooringLineFairleadPosition(2, {20.43, 35.39, -14.})
.SetMooringLineAnchorPosition(2, {52.73, 91.34, -58.4})
.StartFloatingPlatform()
.SetPosition({0., 0., -7.53, 1., 0., 0., 0.})
.SetMassMatrix(platform_mass_matrix)
.EndFloatingPlatform()
.AddMooringLine()
.SetStiffness(mooring_line_stiffness)
.SetUndeformedLength(mooring_line_initial_length)
.SetFairleadPosition({-40.87, 0.0, -14.})
.SetAnchorPosition({-105.47, 0.0, -58.4})
.EndMooringLine()
.AddMooringLine()
.SetStiffness(mooring_line_stiffness)
.SetUndeformedLength(mooring_line_initial_length)
.SetFairleadPosition({20.43, -35.39, -14.})
.SetAnchorPosition({52.73, -91.34, -58.4})
.EndMooringLine()
.AddMooringLine()
.SetStiffness(mooring_line_stiffness)
.SetUndeformedLength(mooring_line_initial_length)
.SetFairleadPosition({20.43, 35.39, -14.})
.SetAnchorPosition({52.73, 91.34, -58.4})
.EndMooringLine()
.Build();

/*
// Create cfd interface
auto interface = InterfaceBuilder{}
.SetGravity(gravity)
.SetTimeStep(time_step)
.SetDampingFactor(rho_inf)
.SetMaximumNonlinearIterations(max_iter)
.EnableFloatingPlatform(true)
.SetFloatingPlatformPosition({0., 0., -7.53, 1., 0., 0., 0.})
.SetFloatingPlatformMassMatrix(platform_mass_matrix)
.SetNumberOfMooringLines(3)
.SetMooringLineStiffness(0, mooring_line_stiffness)
.SetMooringLineUndeformedLength(0, mooring_line_initial_length)
.SetMooringLineFairleadPosition(0, {-40.87, 0.0, -14.})
.SetMooringLineAnchorPosition(0, {-105.47, 0.0, -58.4})
.SetMooringLineStiffness(1, mooring_line_stiffness)
.SetMooringLineUndeformedLength(1, mooring_line_initial_length)
.SetMooringLineFairleadPosition(1, {20.43, -35.39, -14.})
.SetMooringLineAnchorPosition(1, {52.73, -91.34, -58.4})
.SetMooringLineStiffness(2, mooring_line_stiffness)
.SetMooringLineUndeformedLength(2, mooring_line_initial_length)
.SetMooringLineFairleadPosition(2, {20.43, 35.39, -14.})
.SetMooringLineAnchorPosition(2, {52.73, 91.34, -58.4})
.Build();
*/
// Calculate buoyancy force as percentage of gravitational force plus spring forces times
const auto initial_spring_force = 1907514.4912628897;
const auto platform_gravity_force = -gravity[2] * platform_mass;
Expand Down

0 comments on commit 1447cbc

Please sign in to comment.