/home/runner/work/kynema/kynema/kynema/src/constraints/calculate_rotation_control_constraint.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/constraints/calculate_rotation_control_constraint.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
calculate_rotation_control_constraint.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <KokkosBatched_Copy_Decl.hpp>
4#include <Kokkos_Core.hpp>
5
9
10namespace kynema::constraints {
11
16template <typename DeviceType>
18 template <typename ValueType>
19 using View = Kokkos::View<ValueType, DeviceType>;
20 template <typename ValueType>
22
24 const ConstView<double[3]>& X0, const ConstView<double[3][3]>& axes,
25 const ConstView<double[7]>& inputs, const ConstView<double[7]>& base_node_u,
26 const ConstView<double[7]>& target_node_u, const View<double[6]>& residual_terms,
27 const View<double[6][6]>& base_gradient_terms,
28 const View<double[6][6]>& target_gradient_terms
29 ) {
30 using Kokkos::Array;
31 using Kokkos::make_pair;
32 using Kokkos::subview;
33 using CopyVector = KokkosBatched::SerialCopy<KokkosBatched::Trans::NoTranspose, 1>;
34 using CopyMatrixTranspose = KokkosBatched::SerialCopy<KokkosBatched::Trans::Transpose>;
35 using CopyMatrix = KokkosBatched::SerialCopy<>;
36
38 const auto Rb_data =
41 const auto Rt_data =
51 auto A_data = Array<double, 9>{};
52 auto C_data = Array<double, 9>{};
54
55 const auto ub = ConstView<double[3]>{ub_data.data()};
56 const auto Rb = ConstView<double[4]>{Rb_data.data()};
57 const auto ut = ConstView<double[3]>{ut_data.data()};
58 const auto Rt = ConstView<double[4]>{Rt_data.data()};
59 const auto AX = View<double[3]>{AX_data.data()};
60 const auto RV = View<double[3]>{RV_data.data()};
61 const auto Rc = View<double[4]>{Rc_data.data()};
62 const auto RcT = View<double[4]>{RcT_data.data()};
63 const auto RbT = View<double[4]>{RbT_data.data()};
64 const auto Rb_X0 = View<double[4]>{Rb_X0_data.data()};
65 const auto Rt_RcT = View<double[4]>{Rt_RcT_data.data()};
66 const auto Rt_RcT_RbT = View<double[4]>{Rt_RcT_RbT_data.data()};
67 const auto A = View<double[3][3]>{A_data.data()};
68 const auto C = View<double[3][3]>{C_data.data()};
69 const auto V3 = View<double[3]>{V3_data.data()};
70
71 //----------------------------------------------------------------------
72 // Position residual
73 //----------------------------------------------------------------------
74
75 // Phi(0:3) = ut + X0 - ub - Rb*X0
77 for (auto i = 0; i < 3; ++i) {
78 residual_terms(i) = ut(i) + X0(i) - ub(i) - Rb_X0(i);
79 }
80
81 //----------------------------------------------------------------------
82 // Rotation residual
83 //----------------------------------------------------------------------
84
85 auto rotation_command = inputs(0);
86
87 // Copy rotation axis for this constraint
88 for (auto i = 0U; i < 3U; ++i) {
89 AX(i) = axes(0, i);
90 RV(i) = AX(i) * rotation_command;
91 }
92
93 // Convert scaled axis to quaternion and calculate inverse
96
97 // Phi(3:6) = axial(Rt*inv(Rc)*inv(Rb))
103 CopyVector::invoke(V3, subview(residual_terms, make_pair(3, 6)));
104
105 //----------------------------------------------------------------------
106 // Constraint Gradient Matrix
107 //----------------------------------------------------------------------
108
109 //---------------------------------
110 // Target Node
111 //---------------------------------
112 // B(0:3,0:3) = I
113 for (auto component = 0; component < 3; ++component) {
114 target_gradient_terms(component, component) = 1.;
115 }
116
117 // B(3:6,3:6) = AX(Rb*Rc*inv(Rt)) = transpose(AX(Rt*inv(Rc)*inv(Rb)))
118 math::AX_Matrix(C, A);
119 CopyMatrixTranspose::invoke(
120 A, subview(target_gradient_terms, make_pair(3, 6), make_pair(3, 6))
121 );
122
123 //---------------------------------
124 // Base Node
125 //---------------------------------
126 // B(0:3,0:3) = -I
127 for (auto component = 0; component < 3; ++component) {
128 base_gradient_terms(component, component) = -1.;
129 }
130
131 // B(0:3,3:6) = tilde(Rb*X0)
133 CopyMatrix::invoke(A, subview(base_gradient_terms, make_pair(0, 3), make_pair(3, 6)));
134
135 // B(3:6,3:6) = -AX(Rt*inv(Rc)*inv(Rb))
136 math::AX_Matrix(C, A);
137 for (auto component_1 = 0; component_1 < 3; ++component_1) {
138 for (auto component_2 = 0; component_2 < 3; ++component_2) {
139 base_gradient_terms(component_1 + 3, component_2 + 3) = -A(component_1, component_2);
140 }
141 }
142 }
143};
144} // namespace kynema::constraints
Definition calculate_constraint_output.hpp:8
KOKKOS_INLINE_FUNCTION void AX_Matrix(const Matrix &A, const Matrix &AX_A)
Computes AX(A) of a square matrix.
Definition matrix_operations.hpp:19
KOKKOS_INLINE_FUNCTION void QuaternionCompose(const Quaternion1 &q1, const Quaternion2 &q2, QuaternionN &qn)
Composes (i.e. multiplies) two quaternions and stores the result in a third quaternion.
Definition quaternion_operations.hpp:204
KOKKOS_INLINE_FUNCTION void VecTilde(const VectorType &vector, const MatrixType &matrix)
Converts a 3x1 vector to a 3x3 skew-symmetric matrix and returns the result.
Definition vector_operations.hpp:11
KOKKOS_INLINE_FUNCTION void RotationVectorToQuaternion(const Vector &phi, const Quaternion &quaternion)
Returns a 4-D quaternion from provided 3-D rotation vector, i.e. the exponential map.
Definition quaternion_operations.hpp:231
KOKKOS_INLINE_FUNCTION void RotateVectorByQuaternion(const Quaternion &q, const View1 &v, const View2 &v_rot)
Rotates provided vector by provided unit quaternion and returns the result.
Definition quaternion_operations.hpp:120
KOKKOS_INLINE_FUNCTION void QuaternionToRotationMatrix(const Quaternion &q, const RotationMatrix &R)
Converts a 4x1 quaternion to a 3x3 rotation matrix and returns the result.
Definition quaternion_operations.hpp:20
KOKKOS_INLINE_FUNCTION void QuaternionInverse(const QuaternionInput &q_in, const QuaternionOutput &q_out)
Computes the inverse of a quaternion.
Definition quaternion_operations.hpp:172
KOKKOS_INLINE_FUNCTION void AxialVectorOfMatrix(const Matrix &m, const Vector &v)
Computes the axial vector (also known as the vector representation) of a 3x3 skew-symmetric matrix.
Definition matrix_operations.hpp:47
A Kernel which calculates the residual and gradient contributions of a rotation control constraint.
Definition calculate_rotation_control_constraint.hpp:17
typename View< ValueType >::const_type ConstView
Definition calculate_rotation_control_constraint.hpp:21
Kokkos::View< ValueType, DeviceType > View
Definition calculate_rotation_control_constraint.hpp:19
static KOKKOS_FUNCTION void invoke(const ConstView< double[3]> &X0, const ConstView< double[3][3]> &axes, const ConstView< double[7]> &inputs, const ConstView< double[7]> &base_node_u, const ConstView< double[7]> &target_node_u, const View< double[6]> &residual_terms, const View< double[6][6]> &base_gradient_terms, const View< double[6][6]> &target_gradient_terms)
Definition calculate_rotation_control_constraint.hpp:23