28 std::array<double, 7>
x0;
29 std::array<double, 7>
u;
30 std::array<double, 6>
v;
31 std::array<double, 6>
vd;
35 explicit Node(
size_t node_id)
37 x0(std::array<double, 7>{0., 0., 0., 1., 0., 0., 0.}),
38 u(std::array<double, 7>{0., 0., 0., 1., 0., 0., 0.}),
39 v(std::array<double, 6>{0., 0., 0., 0., 0., 0.}),
40 vd(std::array<double, 6>{0., 0., 0., 0., 0., 0.}),
46 size_t node_id, std::array<double, 7> position,
47 std::array<double, 7> displacement = std::array<double, 7>{0., 0., 0., 1., 0., 0., 0.},
48 std::array<double, 6> velocity = std::array<double, 6>{0., 0., 0., 0., 0., 0.},
49 std::array<double, 6> acceleration = std::array<double, 6>{0., 0., 0., 0., 0., 0.}
51 :
id(node_id),
x0(position),
u(displacement),
v(velocity),
vd(acceleration),
s(0.) {}
62 auto displaced_position = std::array{0., 0., 0., 1., 0., 0., 0.};
65 displaced_position[0] = this->x0[0] + this->u[0];
66 displaced_position[1] = this->x0[1] + this->u[1];
67 displaced_position[2] = this->x0[2] + this->u[2];
70 const auto q_displaced = Eigen::Quaternion<double>(
x0[3],
x0[4],
x0[5],
x0[6]) *
71 Eigen::Quaternion<double>(
u[3],
u[4],
u[5],
u[6]);
72 displaced_position[3] = q_displaced.w();
73 displaced_position[4] = q_displaced.x();
74 displaced_position[5] = q_displaced.y();
75 displaced_position[6] = q_displaced.z();
77 return displaced_position;
89 this->x0[0] += displacement[0];
90 this->x0[1] += displacement[1];
91 this->x0[2] += displacement[2];
99 const auto quaternion = Eigen::Quaternion<double>(q[0], q[1], q[2], q[3]);
100 const auto location = Eigen::Matrix<double, 3, 1>(
x0.data());
101 const auto point_location = Eigen::Matrix<double, 3, 1>(point.data());
107 const auto r = location - point_location;
110 const auto rotated_r = quaternion._transformVector(r);
113 const auto x0_new = rotated_r + point_location;
114 this->x0[0] = x0_new(0);
115 this->x0[1] = x0_new(1);
116 this->x0[2] = x0_new(2);
122 auto q_new = quaternion * Eigen::Quaternion<double>(
x0[3],
x0[4],
x0[5],
x0[6]);
125 this->x0[3] = q_new.w();
126 this->x0[4] = q_new.x();
127 this->x0[5] = q_new.y();
128 this->x0[6] = q_new.z();
139 this->u[0] += displacement[0];
140 this->u[1] += displacement[1];
141 this->u[2] += displacement[2];
147 std::span<const double, 4> q, std::span<const double, 3> point
149 const auto quaternion = Eigen::Quaternion<double>(q[0], q[1], q[2], q[3]);
150 const auto point_location = Eigen::Matrix<double, 3, 1>(point.data());
152 const auto displaced_position = Eigen::Matrix<double, 3, 1>(dp.data());
153 const auto location = Eigen::Matrix<double, 3, 1>(
x0.data());
159 const auto r = displaced_position - point_location;
162 const auto rotated_r = quaternion._transformVector(r);
166 const auto u_new = rotated_r + point_location - location;
167 this->u[0] = u_new(0);
168 this->u[1] = u_new(1);
169 this->u[2] = u_new(2);
175 const auto q_new = quaternion * Eigen::Quaternion<double>(
u[3],
u[4],
u[5],
u[6]);
178 this->u[3] = q_new.w();
179 this->u[4] = q_new.x();
180 this->u[5] = q_new.y();
181 this->u[6] = q_new.z();
192 std::span<const double, 6> velocity, std::span<const double, 3> point
196 const auto dp = Eigen::Matrix<double, 3, 1>(displaced_position.data());
197 const auto p = Eigen::Matrix<double, 3, 1>(point.data());
198 const auto r = dp - p;
201 const auto omega = Eigen::Matrix<double, 3, 1>(&velocity[3]);
202 const auto omega_cross_r = omega.cross(r);
205 this->v[0] = velocity[0] + omega_cross_r(0);
206 this->v[1] = velocity[1] + omega_cross_r(1);
207 this->v[2] = velocity[2] + omega_cross_r(2);
210 this->v[3] = velocity[3];
211 this->v[4] = velocity[4];
212 this->v[5] = velocity[5];
221 std::span<const double, 6> acceleration, std::span<const double, 3> omega,
222 std::span<const double, 3> point
224 const auto omega_vec = Eigen::Matrix<double, 3, 1>(omega.data());
227 const auto dp = Eigen::Matrix<double, 3, 1>(displaced_position.data());
228 const auto p = Eigen::Matrix<double, 3, 1>(point.data());
229 const auto r = dp - p;
232 const auto alpha = Eigen::Matrix<double, 3, 1>(&acceleration[3]);
233 const auto alpha_cross_r = alpha.cross(r);
234 const auto omega_cross_omega_cross_r = omega_vec.cross(omega_vec.cross(r));
235 const auto angular_contribution = alpha_cross_r + omega_cross_omega_cross_r;
238 this->vd[0] = acceleration[0] + angular_contribution(0);
239 this->vd[1] = acceleration[1] + angular_contribution(1);
240 this->vd[2] = acceleration[2] + angular_contribution(2);
243 this->vd[3] = alpha[0];
244 this->vd[4] = alpha[1];
245 this->vd[5] = alpha[2];
287 std::ranges::copy(p, std::begin(node.
x0));
302 return this->
SetPosition(std::array{x, y, z, w, i, j, k});
314 std::ranges::copy(p, std::begin(node.
u));
329 double x,
double y,
double z,
double w,
double i,
double j,
double k
357 std::ranges::copy(v, std::begin(node.
v));
384 std::ranges::copy(v, std::begin(node.
vd));
397 this->node.
s = location;
406 [[nodiscard]]
size_t Build()
const {
return this->node.
id; }
Builder class for constructing and configuring Node objects.
Definition node.hpp:269
NodeBuilder & SetPosition(std::span< const double, 7 > p)
Definition node.hpp:286
NodeBuilder & SetVelocity(std::span< const double, 6 > v)
Definition node.hpp:356
NodeBuilder(NodeBuilder &&)=delete
NodeBuilder & operator=(const NodeBuilder &)=delete
NodeBuilder(const NodeBuilder &)=delete
NodeBuilder & SetDisplacement(double x, double y, double z, double w, double i, double j, double k)
Definition node.hpp:328
NodeBuilder & SetAcceleration(std::span< const double, 6 > v)
Definition node.hpp:383
NodeBuilder & SetVelocity(double x, double y, double z, double rx, double ry, double rz)
Definition node.hpp:347
NodeBuilder & SetPosition(double x, double y, double z, double w, double i, double j, double k)
Definition node.hpp:301
NodeBuilder & SetElemLocation(double location)
Definition node.hpp:396
NodeBuilder & SetDisplacement(std::span< const double, 7 > p)
Definition node.hpp:313
NodeBuilder(Node &n)
Definition node.hpp:271
NodeBuilder & operator=(NodeBuilder &&)=delete
NodeBuilder & SetAcceleration(double x, double y, double z, double rx, double ry, double rz)
Definition node.hpp:374
size_t Build() const
Build finalizes construction of node and returns the node's ID.
Definition node.hpp:406
Definition calculate_constraint_output.hpp:8
Represents a node in the finite element model.
Definition node.hpp:26
Node & Translate(std::span< const double, 3 > displacement)
Translate node by a displacement vector.
Definition node.hpp:85
size_t id
Definition node.hpp:27
Node & RotateDisplacementAboutPoint(std::span< const double, 4 > q, std::span< const double, 3 > point)
Rotate node displacement by a quaternion about the given point.
Definition node.hpp:146
std::array< double, 6 > v
Definition node.hpp:30
Node & RotateAboutPoint(std::span< const double, 4 > q, std::span< const double, 3 > point)
Rotate node by a quaternion about the given point.
Definition node.hpp:98
std::array< double, 7 > x0
Definition node.hpp:28
Node(size_t node_id, std::array< double, 7 > position, std::array< double, 7 > displacement=std::array< double, 7 >{0., 0., 0., 1., 0., 0., 0.}, std::array< double, 6 > velocity=std::array< double, 6 >{0., 0., 0., 0., 0., 0.}, std::array< double, 6 > acceleration=std::array< double, 6 >{0., 0., 0., 0., 0., 0.})
Construct a node with an ID, position, displacement, velocity, and acceleration vectors.
Definition node.hpp:45
void SetVelocityAboutPoint(std::span< const double, 6 > velocity, std::span< const double, 3 > point)
Set node velocity based on rigid body motion about a reference point.
Definition node.hpp:191
void SetAccelerationAboutPoint(std::span< const double, 6 > acceleration, std::span< const double, 3 > omega, std::span< const double, 3 > point)
Set node acceleration based on rigid body motion about a reference point.
Definition node.hpp:220
std::array< double, 7 > u
Definition node.hpp:29
Node(size_t node_id)
Construct a node with an ID.
Definition node.hpp:35
Node & TranslateDisplacement(std::span< const double, 3 > displacement)
Add translational displacement to node displacement vector.
Definition node.hpp:138
double s
Definition node.hpp:32
std::array< double, 6 > vd
Definition node.hpp:31
std::array< double, 7 > DisplacedPosition() const
Definition node.hpp:61