MoorDyn
Line.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022, Matt Hall
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice,
8  * this list of conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  *
14  * 3. Neither the name of the copyright holder nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  */
30 
35 #pragma once
36 
37 #include "Misc.hpp"
38 #include "Instance.hpp"
39 #include "Seafloor.hpp"
40 #include "Util/CFL.hpp"
41 #include "leanvtk/leanvtk.hpp"
42 #include <utility>
43 
44 using namespace std;
45 
46 namespace moordyn {
47 
48 class Waves;
49 typedef std::shared_ptr<Waves> WavesRef;
50 
68 class DECLDIR Line final
69  : public Instance
70  , public NatFreqCFL
71 {
72  public:
77  Line(moordyn::Log* log, size_t lineId);
78 
81  ~Line();
82 
83  private:
85  typedef enum
86  {
88  ELASTIC_CONSTANT = 1,
90  ELASTIC_VISCO_CTE = 2,
92  ELASTIC_VISCO_MEAN = 3,
93  } elastic_model;
94 
95 
101  real getNonlinearEA(real l_stretched, real l_unstretched) const;
102 
107  real getNonlinearBA(real ld_stretched, real l_unstretched) const;
108 
112  real getNonlinearEI(real curv) const;
113 
121  inline real getWaterDepth(real x, real y)
122  {
123  return seafloor ? seafloor->getDepthAt(x, y) : -env->WtrDpth;
124  }
125 
129  inline real avgWaterDepth()
130  {
131  return seafloor ? seafloor->getAverageDepth() : -env->WtrDpth;
132  }
133  // ENVIRONMENTAL STUFF
135  EnvCondRef env;
137  moordyn::WavesRef waves;
139  moordyn::SeafloorRef seafloor;
140 
142  unsigned int N;
144  moordyn::real UnstrLen;
146  moordyn::real UnstrLen0;
148  moordyn::real UnstrLend;
150  moordyn::real d;
152  moordyn::real rho;
154  elastic_model ElasticMod;
156  moordyn::real EA;
159  moordyn::real EA_D;
162  moordyn::real alphaMBL;
165  moordyn::real vbeta;
170  moordyn::real EA_2;
172  std::vector<moordyn::real> dl_1;
174  std::vector<moordyn::real> ld_1;
176  moordyn::real EI;
185  moordyn::real BA;
188  moordyn::real BA_D;
191  moordyn::real Can;
194  moordyn::real Cat;
197  moordyn::real Cdn;
200  moordyn::real Cdt;
203  moordyn::real Cl;
206  moordyn::real dF;
209  moordyn::real cF;
210 
212  moordyn::real BAin;
214  moordyn::real A;
216  unsigned int nEApoints;
218  std::vector<moordyn::real> stiffXs;
220  std::vector<moordyn::real> stiffYs;
222  unsigned int nEIpoints;
224  std::vector<moordyn::real> bstiffXs;
226  std::vector<moordyn::real> bstiffYs;
228  unsigned int nBApoints;
230  std::vector<moordyn::real> dampXs;
232  std::vector<moordyn::real> dampYs;
233 
234  // Externally provided data
239  bool isPb;
241  std::vector<moordyn::real> pin;
242 
243  // kinematics
245  std::vector<vec> r;
247  std::vector<vec> rd;
249  std::vector<vec> q;
251  std::vector<vec> pvec;
253  std::vector<vec> qs;
255  std::vector<moordyn::real> l;
257  std::vector<moordyn::real> lstr;
259  std::vector<moordyn::real> ldstr;
261  std::vector<moordyn::real> Kurv;
262 
264  std::vector<mat> M;
265  // line segment volumes
266  std::vector<moordyn::real> V;
267 
268  // forces
270  std::vector<vec> T;
272  std::vector<vec> Td;
274  std::vector<vec> Bs;
276  std::vector<vec> Pb;
278  std::vector<vec> W;
280  std::vector<vec> Dp;
282  std::vector<vec> Dq;
284  std::vector<vec> Ap;
286  std::vector<vec> Aq;
288  std::vector<vec> B;
290  std::vector<vec> Lf;
292  std::vector<vec> Fnet;
293 
294  // wave things
296  std::vector<moordyn::real> F;
297 
298  // time
300  moordyn::real t;
302  moordyn::real dtm0;
303 
304  // VIV stuff
305  // /// VIV amplitude updated every zero crossing of crossflow velcoity
306  // std::vector<moordyn::real> Amp;
308  const unsigned int n_m = 500;
310  real phi_yd;
312  std::vector<moordyn::real> phi;
314  std::vector<moordyn::real> phi_dot;
315 
316  // back indexing one dtm for VIV
318  moordyn::real t_old = 0.0;
319  // /// running amplitude total, from previous zero crossing of yd
320  // std::vector<moordyn::real> A_int_old;
322  std::vector<moordyn::real> yd_rms_old;
324  std::vector<moordyn::real> ydd_rms_old;
326  std::vector<vec> rdd_old;
327 
328  // end conditions
331  typedef enum
332  {
334  PINNED = 0,
336  CANTILEVERED = 1,
337  // Some aliases
338  POINT = PINNED,
339  ROD = CANTILEVERED,
340  } endTypes;
341 
344  endTypes endTypeA;
347  endTypes endTypeB;
349  vec endMomentA;
351  vec endMomentB;
352 
353  // file stuff
355  ofstream* outfile;
357  string channels;
358 
364  std::vector<std::vector<moordyn::real>> zetaTS;
366  std::vector<std::vector<moordyn::real>> FTS;
368  std::vector<std::vector<vec>> UTS;
370  std::vector<std::vector<vec>> UdTS;
372  unsigned int ntWater;
374  moordyn::real dtWater;
375 
380  public:
382  int number;
385  size_t lineId;
386 
388  bool IC_gen = false;
389 
400  void setup(int number,
401  LineProps* props,
402  real l,
403  unsigned int n,
404  EnvCondRef env_in,
405  shared_ptr<ofstream> outfile,
406  string channels,
407  real dtM0);
408 
414  inline void setWaves(moordyn::WavesRef waves_in,
415  moordyn::SeafloorRef seafloor_in)
416  {
417  waves = waves_in;
418  seafloor = seafloor_in;
419  }
420 
429  void initialize();
430 
436  inline void initialize(InstanceStateVarView state)
437  {
438  // ------ Initialize the line ------
439  initialize();
440 
441  // ------ Assign the intialized values to the state (bascially
442  // Line::setState but flipped) ------ Error check for number of columns
443  // (if VIV and Visco need row.size() = 8, if VIV xor Visco need
444  // row.size() = 7, if not VIV need row.size() = 6)
445  if ((state.row(0).size() != 8 && Cl > 0 && ElasticMod != ELASTIC_CONSTANT) ||
446  (state.row(0).size() != 7 && ((Cl > 0) ^ (ElasticMod != ELASTIC_CONSTANT))) ||
447  (state.row(0).size() != 6 && Cl == 0 && ElasticMod == ELASTIC_CONSTANT)) {
448  LOGERR << "Invalid state.row size for Line " << number << endl;
449  throw moordyn::mem_error("Invalid state.row size");
450  }
451 
452  // Error check for number of rows (if visco need N rows, if normal need
453  // N-1 rows)
454  if ((state.rows() != N && ElasticMod != ELASTIC_CONSTANT) ||
455  (state.rows() != N - 1 && ElasticMod == ELASTIC_CONSTANT)) {
456  LOGERR << "Invalid number of rows in state matrix for Line "
457  << number << endl;
458  throw moordyn::mem_error("Invalid number of rows in state matrix");
459  }
460 
461  // If using the viscoelastic model, iterate N rows, else iterate N-1
462  // rows.
463  for (unsigned int i = 0; i < (ElasticMod != ELASTIC_CONSTANT ? N : N - 1); i++) {
464  // node number is i+1
465  // segment number is i
466  state.row(i).head<3>() = r[i + 1];
467  state.row(i).segment<3>(3) = rd[i + 1];
468 
469  if (ElasticMod != ELASTIC_CONSTANT)
470  state.row(i).tail<1>()[0] =
471  dl_1[i]; // [0] needed becasue tail<1> returns a one element
472  // vector. Viscoelastic state is always the last
473  // element in the row
474 
475  if (Cl > 0) {
476  if (ElasticMod != ELASTIC_CONSTANT)
477  state.row(i).tail<2>()[0] =
478  phi[i + 1]; // if both VIV and viscoelastic second to
479  // last element in the row
480  else
481  state.row(i).tail<1>()[0] =
482  phi[i + 1]; // else last element in the row
483  }
484  }
485  }
495  inline unsigned int getN() const { return N; }
496 
500  inline moordyn::real getUnstretchedLength() const { return UnstrLen; }
501 
511  inline void setUnstretchedLength(const moordyn::real len)
512  {
513  UnstrLen = len;
514  for (unsigned int i = 0; i < N; i++) {
515  l[i] = UnstrLen / double(N);
516  V[i] = l[i] * A;
517  }
518  }
519 
525  {
526  UnstrLend = v;
527  }
528 
537  inline void updateUnstretchedLength(const moordyn::real dt = 0.0)
538  {
539  if (!UnstrLend)
540  return;
541  if (!dt) {
542  UnstrLen0 = UnstrLen;
543  return;
544  }
545  setUnstretchedLength(UnstrLen0 + dt * UnstrLend);
546  }
547 
553  inline bool isConstantEA() const { return nEApoints > 0; }
554 
561  inline moordyn::real getConstantEA() const { return EA; }
562 
569  inline void setConstantEA(moordyn::real EA_in)
570  {
571  if (ElasticMod != ELASTIC_CONSTANT) {
572  LOGERR << "Cannot set constant EA for viscoelastic model" << endl;
573  throw moordyn::invalid_value_error(
574  "Cannot set constant EA for viscoelastic model");
575  } else {
576  EA = EA_in;
577  }
578  }
579 
586  inline const vec& getNodePos(unsigned int i) const
587  {
588  if (i > N) {
589  LOGERR << "Asking node " << i << " of line " << number
590  << ", which only has " << N + 1 << " nodes" << std::endl;
591  throw moordyn::invalid_value_error("Invalid node index");
592  }
593  if (isnan(r[i].sum())) {
594  stringstream s;
595  s << "NaN detected" << endl
596  << "Line " << number << " node positions:" << endl;
597  for (unsigned int j = 0; j <= N; j++)
598  s << j << " : " << r[j] << ";" << endl;
599  throw moordyn::nan_error(s.str().c_str());
600  }
601  return r[i];
602  }
603 
610  inline const vec& getNodeVel(unsigned int i) const
611  {
612  if (i > N) {
613  LOGERR << "Asking node " << i << " of line " << number
614  << ", which only has " << N + 1 << " nodes" << std::endl;
615  throw moordyn::invalid_value_error("Invalid node index");
616  }
617  if (isnan(rd[i].sum())) {
618  stringstream s;
619  s << "NaN detected" << endl
620  << "Line " << number << " node velocities:" << endl;
621  for (unsigned int j = 0; j <= N; j++)
622  s << j << " : " << rd[j] << ";" << endl;
623  throw moordyn::nan_error(s.str().c_str());
624  }
625  return rd[i];
626  }
627 
644  inline const vec& getNodeForce(unsigned int i) const
645  {
646  if (i > N) {
647  LOGERR << "Asking node " << i << " of line " << number
648  << ", which only has " << N + 1 << " nodes" << std::endl;
649  throw moordyn::invalid_value_error("Invalid node index");
650  }
651  return Fnet[i];
652  };
653 
666  inline const vec getNodeTen(unsigned int i) const
667  {
668  if (i > N) {
669  LOGERR << "Asking node " << i << " of line " << number
670  << ", which only has " << N + 1 << " nodes" << std::endl;
671  throw moordyn::invalid_value_error("Invalid node index");
672  }
673  if (i == 0) // bottom node, return ten and damping of bottom section
674  return T[0] + Td[0];
675  else if (i == N) // top node, return ten and damping of top section
676  return T[N - 1] + Td[N - 1];
677  // internal node, take average of tension in adjacent segments.
678  return (0.5 * (T[i] + T[i - 1] + Td[i] + Td[i - 1]));
679  };
680 
691  inline const vec& getNodeBendStiff(unsigned int i) const
692  {
693  if (i > N) {
694  LOGERR << "Asking node " << i << " of line " << number
695  << ", which only has " << N + 1 << " nodes" << std::endl;
696  throw moordyn::invalid_value_error("Invalid node index");
697  }
698  return Bs[i];
699  };
700 
707  inline const vec& getNodeWeight(unsigned int i) const
708  {
709  if (i > N) {
710  LOGERR << "Asking node " << i << " of line " << number
711  << ", which only has " << N + 1 << " nodes" << std::endl;
712  throw moordyn::invalid_value_error("Invalid node index");
713  }
714  return W[i];
715  };
716 
723  inline const vec getNodeDrag(unsigned int i) const
724  {
725  if (i > N) {
726  LOGERR << "Asking node " << i << " of line " << number
727  << ", which only has " << N + 1 << " nodes" << std::endl;
728  throw moordyn::invalid_value_error("Invalid node index");
729  }
730  return Dp[i] + Dq[i];
731  };
732 
739  inline const vec getNodeFroudeKrilov(unsigned int i) const
740  {
741  if (i > N) {
742  LOGERR << "Asking node " << i << " of line " << number
743  << ", which only has " << N + 1 << " nodes" << std::endl;
744  throw moordyn::invalid_value_error("Invalid node index");
745  }
746  return Ap[i] + Aq[i];
747  };
748 
757  inline const vec getNodeSeabedForce(unsigned int i) const
758  {
759  if (i > N) {
760  LOGERR << "Asking node " << i << " of line " << number
761  << ", which only has " << N + 1 << " nodes" << std::endl;
762  throw moordyn::invalid_value_error("Invalid node index");
763  }
764  return B[i] + Bs[i];
765  };
766 
776  inline const real& getNodeCurv(unsigned int i) const
777  {
778  if (i > N) {
779  LOGERR << "Asking node " << i << " of line " << number
780  << ", which only has " << N + 1 << " nodes" << std::endl;
781  throw moordyn::invalid_value_error("Invalid node index");
782  }
783  return Kurv[i];
784  }
785 
792  inline const mat& getNodeM(unsigned int i) const
793  {
794  if (i > N) {
795  LOGERR << "Asking node " << i << " of line " << number
796  << ", which only has " << N + 1 << " nodes" << std::endl;
797  throw moordyn::invalid_value_error("Invalid node index");
798  }
799  return M[i];
800  }
801 
805  inline std::vector<vec> getNodeCoordinates() const { return r; }
806 
814  inline void getFASTtens(float* FairHTen,
815  float* FairVTen,
816  float* AnchHTen,
817  float* AnchVTen) const
818  {
819  *FairHTen = (float)(Fnet[N](Eigen::seqN(0, 2)).norm());
820  *FairVTen = (float)(Fnet[N][2] + M[N](0, 0) * (-env->g));
821  *AnchHTen = (float)(Fnet[0](Eigen::seqN(0, 2)).norm());
822  *AnchVTen = (float)(Fnet[0][2] + M[0](0, 0) * (-env->g));
823  }
824 
833  inline void getEndStuff(vec& Fnet_out,
834  vec& Moment_out,
835  mat& M_out,
836  EndPoints end_point) const
837  {
838  switch (end_point) {
839  case ENDPOINT_TOP:
840  Fnet_out = Fnet[N];
841  Moment_out = endMomentB;
842  M_out = M[N];
843  break;
844  case ENDPOINT_BOTTOM:
845  Fnet_out = Fnet[0];
846  Moment_out = endMomentA;
847  M_out = M[0];
848  break;
849  default:
850  LOGERR << "Invalid end point qualifier: " << end_point << endl;
851  throw moordyn::invalid_value_error("Invalid end point");
852  }
853  }
854 
861  real GetLineOutput(OutChanProps outChan);
862 
879  void storeWaterKin(real dt,
880  std::vector<std::vector<moordyn::real>> zeta,
881  std::vector<std::vector<moordyn::real>> f,
882  std::vector<std::vector<vec>> u,
883  std::vector<std::vector<vec>> ud);
884 
895  real calcSubSeg(unsigned int firstNodeIdx,
896  unsigned int secondNodeIdx,
897  real surfaceHeight);
898 
902  inline std::pair<real, real> getDrag() const { return make_pair(Cdn, Cdt); }
903 
908  inline void setDrag(real cdn, real cdt)
909  {
910  Cdn = cdn;
911  Cdt = cdt;
912  }
913 
917  inline void scaleDrag(real scaler)
918  {
919  Cdn = Cdn * scaler;
920  Cdt = Cdt * scaler;
921  }
922 
932  inline void enablePb() { isPb = true; }
933 
936  inline void disablePb() { isPb = false; }
937 
941  inline bool enabledPb() const { return isPb; }
942 
952  void setPin(std::vector<real> p);
953 
957  inline void setTime(real time) { t = time; }
958 
966  void setState(const InstanceStateVarView r);
967 
975  void setEndKinematics(vec r, vec rd, EndPoints end_point);
976 
987  void setEndOrientation(vec q, EndPoints end_point, EndPoints rod_end_point);
988 
1003  vec getEndSegmentMoment(EndPoints end_point, EndPoints rod_end_point) const;
1004 
1009  void getStateDeriv(InstanceStateVarView drdt);
1010 
1011  // void initiateStep(vector<double> &rFairIn, vector<double> &rdFairIn,
1012  // double time);
1013 
1014  void Output(real);
1015 
1022  inline const size_t stateN() const
1023  {
1024  if (ElasticMod != ELASTIC_CONSTANT)
1025  return getN(); // N rows for viscoelastic case
1026  else
1027  return getN() - 1; // N-1 rows for other cases
1028  }
1029 
1040  inline const size_t stateDims() const
1041  {
1042  if (Cl > 0 && ElasticMod != ELASTIC_CONSTANT)
1043  return 8; // 3 for position, 3 for velocity, 1 for VIV phase, 1 for
1044  // viscoelasticity
1045  else if ((Cl > 0) ^ (ElasticMod != ELASTIC_CONSTANT))
1046  return 7; // 3 for position, 3 for velocity, 1 for VIV phase or
1047  // viscoelasticity
1048  else
1049  return 6;
1050  }
1051 
1061  std::vector<uint64_t> Serialize(void);
1062 
1069  uint64_t* Deserialize(const uint64_t* data);
1070 
1075  void saveVTK(const char* filename);
1076 
1082  const leanvtk::VTPWriter* getVTK() const { return &vtk; }
1083 private:
1085  leanvtk::VTPWriter vtk;
1086 };
1087 
1088 } // ::moordyn
#define LOGERR
Log an error.
Definition: Log.hpp:69
#define DECLDIR
Prefix to export C functions on the compiled library.
Definition: MoorDynAPI.h:68
A generic instance.
Definition: Instance.hpp:55
A mooring line.
Definition: Line.hpp:71
const vec getNodeFroudeKrilov(unsigned int i) const
Get the Froude-Krilov force acting on the node.
Definition: Line.hpp:739
const vec & getNodeForce(unsigned int i) const
Get the net force on a node.
Definition: Line.hpp:644
bool isConstantEA() const
Get whether the line is governed by a non-linear stiffness or a constant one.
Definition: Line.hpp:553
bool enabledPb() const
Check if pressure bending forces are considered.
Definition: Line.hpp:941
void setUnstretchedLengthVel(const moordyn::real v)
Set the unstretched length rate of change of the line.
Definition: Line.hpp:524
void enablePb()
Enable the pressure bending forces (disabled by default)
Definition: Line.hpp:932
std::vector< vec > getNodeCoordinates() const
Get the array of coordinates of all nodes along the line.
Definition: Line.hpp:805
void getEndStuff(vec &Fnet_out, vec &Moment_out, mat &M_out, EndPoints end_point) const
Get the force, moment and mass at the line endpoint.
Definition: Line.hpp:833
const leanvtk::VTPWriter * getVTK() const
Get the VTK writer.
Definition: Line.hpp:1082
const vec & getNodeVel(unsigned int i) const
Get the velocity of a node.
Definition: Line.hpp:610
void scaleDrag(real scaler)
Scale the drag coefficients.
Definition: Line.hpp:917
const vec & getNodePos(unsigned int i) const
Get the position of a node.
Definition: Line.hpp:586
void setWaves(moordyn::WavesRef waves_in, moordyn::SeafloorRef seafloor_in)
Set the environmental data.
Definition: Line.hpp:414
const real & getNodeCurv(unsigned int i) const
Get the line curvature at a node position.
Definition: Line.hpp:776
const vec & getNodeWeight(unsigned int i) const
Get the weight and bouyancy force acting on the node.
Definition: Line.hpp:707
size_t lineId
Definition: Line.hpp:385
std::pair< real, real > getDrag() const
Get the drag coefficients.
Definition: Line.hpp:902
const mat & getNodeM(unsigned int i) const
Get the mass and added mass matrix.
Definition: Line.hpp:792
void getFASTtens(float *FairHTen, float *FairVTen, float *AnchHTen, float *AnchVTen) const
Get the tensions at the fairlead and anchor in a FASTv7 friendly way.
Definition: Line.hpp:814
const vec & getNodeBendStiff(unsigned int i) const
Get the tension on a node, including the internal line damping.
Definition: Line.hpp:691
void setUnstretchedLength(const moordyn::real len)
Set the unstretched length of the line.
Definition: Line.hpp:511
moordyn::real getUnstretchedLength() const
Get the unstretched length of the line.
Definition: Line.hpp:500
void updateUnstretchedLength(const moordyn::real dt=0.0)
Update the unstretched length of the line, according to the velocity.
Definition: Line.hpp:537
void setTime(real time)
Set the line simulation time.
Definition: Line.hpp:957
void setConstantEA(moordyn::real EA_in)
Set the constant stiffness of the line.
Definition: Line.hpp:569
void initialize(InstanceStateVarView state)
Sets the initial line state.
Definition: Line.hpp:436
const vec getNodeTen(unsigned int i) const
Get the tension on a node, including the internal line damping.
Definition: Line.hpp:666
const size_t stateN() const
Get the number of state variables required by this instance.
Definition: Line.hpp:1022
void disablePb()
Disable the pressure bending forces (disabled by default)
Definition: Line.hpp:936
int number
Line ID.
Definition: Line.hpp:382
unsigned int getN() const
Number of segments.
Definition: Line.hpp:495
const vec getNodeSeabedForce(unsigned int i) const
Get the sea bed reaction force acting on the node.
Definition: Line.hpp:757
void setDrag(real cdn, real cdt)
Set the drag coefficients.
Definition: Line.hpp:908
const size_t stateDims() const
Get the dimension of the state variable.
Definition: Line.hpp:1040
moordyn::real getConstantEA() const
Get the constant stiffness of the line.
Definition: Line.hpp:561
const vec getNodeDrag(unsigned int i) const
Get the drag force acting on the node.
Definition: Line.hpp:723
A Logging utility.
Definition: Log.hpp:149
MoorDyn2 C++ API namespace.
Definition: Body.cpp:27
vec3 vec
vec3 renaming
Definition: Misc.hpp:130
std::shared_ptr< Waves > WavesRef
Definition: Body.hpp:53
Eigen::Block< InstanceStateVar, Eigen::Dynamic > InstanceStateVarView
View of the State variables for a particular instance.
Definition: Misc.hpp:167
EndPoints
End point qualifiers.
Definition: Misc.hpp:570
double real
Real numbers wrapper. It is either double or float.
Definition: Misc.hpp:118
std::shared_ptr< Seafloor > SeafloorRef
Shared pointer.
Definition: Seafloor.hpp:109
mat3 mat
mat3 renaming
Definition: Misc.hpp:142
Definition: Misc.hpp:1146
Definition: Misc.hpp:1288