/home/runner/work/kynema/kynema/kynema/src/system/beams/calculate_K_D1.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/system/beams/calculate_K_D1.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
calculate_K_D1.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <KokkosBatched_Gemm_Decl.hpp>
4#include <KokkosBlas.hpp>
5#include <KokkosBlas1_axpby.hpp>
6#include <KokkosBlas1_set.hpp>
7#include <Kokkos_Core.hpp>
8
11
12namespace kynema::beams {
13
14template <typename DeviceType>
16 template <typename ValueType>
17 using View = Kokkos::View<ValueType, DeviceType>;
18 template <typename ValueType>
20
22 const ConstView<double[4]>& r, const ConstView<double[3]>& xr_prime,
23 const ConstView<double[3]>& omega, const ConstView<double[3]>& kappa,
24 const ConstView<double[3]>& eps_dot, const ConstView<double[3]>& kappa_dot,
25 const ConstView<double[6][6]>& Duu, const View<double[6][6]>& K_D1
26 ) {
27 using NoTranspose = KokkosBatched::Trans::NoTranspose;
28 // using Transpose = KokkosBatched::Trans::Transpose;
29 using Default = KokkosBatched::Algo::Gemm::Default;
30 using GemmNN = KokkosBatched::SerialGemm<NoTranspose, NoTranspose, Default>;
31 // using GemmTN = KokkosBatched::SerialGemm<Transpose, NoTranspose, Default>;
32 using Gemv =
33 KokkosBlas::SerialGemv<KokkosBlas::Trans::NoTranspose, KokkosBlas::Algo::Gemv::Default>;
34 using Kokkos::make_pair;
35 using Kokkos::subview;
36
37 KokkosBlas::SerialSet::invoke(0., K_D1);
38
39 auto K_D1_12 = subview(K_D1, make_pair(0, 3), make_pair(3, 6));
40 auto K_D1_22 = subview(K_D1, make_pair(3, 6), make_pair(3, 6));
41 const auto D11 = subview(Duu, make_pair(0, 3), make_pair(0, 3));
42 const auto D12 = subview(Duu, make_pair(0, 3), make_pair(3, 6));
43 const auto D21 = subview(Duu, make_pair(3, 6), make_pair(0, 3));
44 const auto D22 = subview(Duu, make_pair(3, 6), make_pair(3, 6));
45
46 auto omega_tilde_data = Kokkos::Array<double, 9>{};
49
50 auto kappa_tilde_data = Kokkos::Array<double, 9>{};
53
54 auto eps_dot_tilde_data = Kokkos::Array<double, 9>{};
57
58 auto kappa_dot_tilde_data = Kokkos::Array<double, 9>{};
61
62 //---------------------------------------------------------------------
63 // K_D1_12
64 //---------------------------------------------------------------------
65
66 auto D11_eps_dot_data = Kokkos::Array<double, 3>{};
68 Gemv::invoke(1., D11, eps_dot, 0., D11_eps_dot);
69 auto D11_eps_dot_tilde_data = Kokkos::Array<double, 9>{};
72
73 auto D11_times_eps_dot_tilde_data = Kokkos::Array<double, 9>{};
75 GemmNN::invoke(1., D11, eps_dot_tilde, 0., D11_times_eps_dot_tilde);
76
77 auto D12_kappa_dot_data = Kokkos::Array<double, 3>{};
79 Gemv::invoke(1., D12, kappa_dot, 0., D12_kappa_dot);
80 auto D12_kappa_dot_tilde_data = Kokkos::Array<double, 9>{};
83
84 auto D12_times_kappa_dot_tilde_data = Kokkos::Array<double, 9>{};
86 GemmNN::invoke(1., D12, kappa_dot_tilde, 0., D12_times_kappa_dot_tilde);
87
88 auto D11_omega_tilde_data = Kokkos::Array<double, 9>{};
90 GemmNN::invoke(1., D11, omega_tilde, 0., D11_omega_tilde);
91
92 auto D12_omega_tilde_data = Kokkos::Array<double, 9>{};
94 GemmNN::invoke(1., D12, omega_tilde, 0., D12_omega_tilde);
95
96 auto r_xr_prime_data = Kokkos::Array<double, 3>{};
99
100 auto r_xr_prime_tilde_data = Kokkos::Array<double, 9>{};
103
104 GemmNN::invoke(1., D11_omega_tilde, r_xr_prime_tilde, 0., K_D1_12);
105 GemmNN::invoke(-1., D12_omega_tilde, kappa_tilde, 1., K_D1_12);
106 KokkosBlas::serial_axpy(-1., D11_eps_dot_tilde, K_D1_12);
107 KokkosBlas::serial_axpy(1., D11_times_eps_dot_tilde, K_D1_12);
108 KokkosBlas::serial_axpy(-1., D12_kappa_dot_tilde, K_D1_12);
109 KokkosBlas::serial_axpy(1., D12_times_kappa_dot_tilde, K_D1_12);
110
111 //---------------------------------------------------------------------
112 // K_D1_22
113 //---------------------------------------------------------------------
114
115 auto D21_eps_dot_data = Kokkos::Array<double, 3>{};
117 Gemv::invoke(1., D21, eps_dot, 0., D21_eps_dot);
118 auto D21_eps_dot_tilde_data = Kokkos::Array<double, 9>{};
121
122 auto D21_times_eps_dot_tilde_data = Kokkos::Array<double, 9>{};
124 GemmNN::invoke(1., D21, eps_dot_tilde, 0., D21_times_eps_dot_tilde);
125
126 auto D22_kappa_dot_data = Kokkos::Array<double, 3>{};
128 Gemv::invoke(1., D22, kappa_dot, 0., D22_kappa_dot);
129 auto D22_kappa_dot_tilde_data = Kokkos::Array<double, 9>{};
132
133 auto D22_times_kappa_dot_tilde_data = Kokkos::Array<double, 9>{};
135 GemmNN::invoke(1., D22, kappa_dot_tilde, 0., D22_times_kappa_dot_tilde);
136
137 auto D21_omega_tilde_data = Kokkos::Array<double, 9>{};
139 GemmNN::invoke(1., D21, omega_tilde, 0., D21_omega_tilde);
140
141 auto D22_omega_tilde_data = Kokkos::Array<double, 9>{};
143 GemmNN::invoke(1., D22, omega_tilde, 0., D22_omega_tilde);
144
145 GemmNN::invoke(1., D21_omega_tilde, r_xr_prime_tilde, 0., K_D1_22);
146 GemmNN::invoke(-1., D22_omega_tilde, kappa_tilde, 1., K_D1_22);
147 KokkosBlas::serial_axpy(-1., D21_eps_dot_tilde, K_D1_22);
148 KokkosBlas::serial_axpy(1., D21_times_eps_dot_tilde, K_D1_22);
149 KokkosBlas::serial_axpy(-1., D22_kappa_dot_tilde, K_D1_22);
150 KokkosBlas::serial_axpy(1., D22_times_kappa_dot_tilde, K_D1_22);
151 }
152};
153} // namespace kynema::beams
Definition beam_quadrature.hpp:14
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:10
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:34
Definition calculate_K_D1.hpp:15
Kokkos::View< ValueType, DeviceType > View
Definition calculate_K_D1.hpp:17
typename View< ValueType >::const_type ConstView
Definition calculate_K_D1.hpp:19
static KOKKOS_FUNCTION void invoke(const ConstView< double[4]> &r, const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &omega, const ConstView< double[3]> &kappa, const ConstView< double[3]> &eps_dot, const ConstView< double[3]> &kappa_dot, const ConstView< double[6][6]> &Duu, const View< double[6][6]> &K_D1)
Definition calculate_K_D1.hpp:21