FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
NetWakePanels.h
1#pragma once
2
16#include <fhsim/simobject/ISimObjectCreator.h>
17#include <fhsim_environment/EnvironmentProvider.h>
18#include <fhsim_environment/PanelSourceSet.h>
19#include <string>
20
25template<class Net>
26class NetWakePanels final : public environment::wake::WakePanelSource
27{
28public:
30 explicit NetWakePanels(const Net& net)
31 : m_net(net)
32 {
33 }
34
35 int NumNodes() const override { return m_net.m_numNodesCalc; }
36 int NumPanels() const override { return m_net.m_numPanelsCalc; }
37
38 void PanelNodes(int panel, int nodes[3]) const override
39 {
40 for (int k = 0; k < 3; k++)
41 nodes[k] = m_net.m_netConn[panel * 3 + k];
42 }
43
44 void NodePosition(const double* X, int node, double pos[3]) const override
45 {
46 const double* state = m_net.NodePositionState(X, node);
47 for (int k = 0; k < 3; k++)
48 pos[k] = state[k];
49 }
50
51 void NodeVelocity(const double* X, int node, double vel[3]) const override
52 {
53 const double* state = m_net.NodeVelocityState(X, node);
54 for (int k = 0; k < 3; k++)
55 vel[k] = state[k];
56 }
57
58 int NumCables() const override { return m_net.m_numCablesCalc; }
59
60 void CableNodes(int cable, int nodes[2]) const override
61 {
62 for (int k = 0; k < 2; k++)
63 nodes[k] = m_net.m_VpCableElements[cable]->m_conn[k];
64 }
65
66 environment::wake::PanelEvaluation EvaluatePanel(const double* X, int panel, const double elementVel[3], const double waterVel[3]) const override
67 {
68 int nodes[3];
69 PanelNodes(panel, nodes);
70 const double* posA = m_net.NodePositionState(X, nodes[0]);
71 const double* posB = m_net.NodePositionState(X, nodes[1]);
72 const double* posC = m_net.NodePositionState(X, nodes[2]);
73 const auto& element = *m_net.m_VpNetElements[panel];
74 environment::wake::PanelEvaluation evaluation;
75 evaluation.load = element.EvaluatePanelLoad(m_net.m_panelHydrodynamics.law, m_net.m_panelHydrodynamics.fluid, posA, posB, posC, elementVel, waterVel, evaluation.area);
76 evaluation.solidity = element.WakeSolidity(posA, posB, posC);
77 return evaluation;
78 }
79
80 void CableHydrodynamicForce(double T, const double* X, double force[3]) const override { m_net.CableHydrodynamicForce(T, X, force); }
81
82private:
83 const Net& m_net;
84};
85
86namespace net_wake_panels
87{
88
97inline environment::EnvironmentProvider* FindEnvironment(ISimObjectCreator* creator, const std::string& className)
98{
99 auto* environment = static_cast<environment::EnvironmentProvider*>(creator->GetSharedResource("Environment"));
100 if (!environment)
101 creator->ReportError("No Environment shared resource found: " + className + " cannot continue without its current, waves and wakes");
102 return environment;
103}
104
105} // namespace net_wake_panels
Definition NetWakePanels.h:27
NetWakePanels(const Net &net)
Definition NetWakePanels.h:30