/home/runner/work/kynema/kynema/kynema/src/system/masses/calculate_gyroscopic_matrix.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/system/masses/calculate_gyroscopic_matrix.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
calculate_gyroscopic_matrix.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <KokkosBatched_Copy_Decl.hpp>
4#include <KokkosBatched_Gemm_Decl.hpp>
5#include <KokkosBlas.hpp>
6#include <KokkosBlas1_set.hpp>
7#include <Kokkos_Core.hpp>
8
10
11namespace kynema::masses {
12
13template <typename DeviceType>
15 template <typename ValueType>
16 using View = Kokkos::View<ValueType, DeviceType>;
17 template <typename ValueType>
19
21 double mass, const ConstView<double[3]>& omega, const ConstView<double[3]>& eta,
22 const ConstView<double[3][3]>& rho, const ConstView<double[3][3]>& omega_tilde,
23 const Kokkos::View<double[6][6], DeviceType>& Guu
24 ) {
25 using NoTranspose = KokkosBatched::Trans::NoTranspose;
26 using Transpose = KokkosBatched::Trans::Transpose;
27 using GemmDefault = KokkosBatched::Algo::Gemm::Default;
28 using GemvDefault = KokkosBatched::Algo::Gemv::Default;
29 using GemmNN = KokkosBatched::SerialGemm<NoTranspose, NoTranspose, GemmDefault>;
30 using GemmNT = KokkosBatched::SerialGemm<NoTranspose, Transpose, GemmDefault>;
31 using Gemv = KokkosBlas::SerialGemv<NoTranspose, GemvDefault>;
32 using CopyMatrix = KokkosBatched::SerialCopy<>;
33 using CopyMatrixTranspose = KokkosBatched::SerialCopy<Transpose>;
34 using Kokkos::Array;
35 using Kokkos::make_pair;
36 using Kokkos::subview;
37
38 auto v1 = Array<double, 3>{};
39 auto V1 = View<double[3]>(v1.data());
40 auto v2 = Array<double, 3>{};
41 auto V2 = View<double[3]>(v2.data());
42 auto m1 = Array<double, 9>{};
43 auto M1 = View<double[3][3]>(m1.data());
44
45 // omega.tilde() * m * eta.tilde().t() + (omega.tilde() * m * eta).tilde().t()
46 auto Guu_12 = subview(Guu, make_pair(0, 3), make_pair(3, 6));
47 KokkosBlas::serial_axpy(mass, eta, V1);
48 Gemv::invoke(1., omega_tilde, V1, 0., V2);
50 CopyMatrixTranspose::invoke(M1, Guu_12);
51
53 GemmNT::invoke(1., omega_tilde, M1, 1., Guu_12);
54 // Guu_22 = omega.tilde() * rho - (rho * omega).tilde()
55 Gemv::invoke(1., rho, omega, 0., V1);
57 auto Guu_22 = subview(Guu, make_pair(3, 6), make_pair(3, 6));
58 CopyMatrix::invoke(M1, Guu_22);
59 GemmNN::invoke(1., omega_tilde, rho, -1., Guu_22);
60 }
61};
62} // namespace kynema::masses
Definition calculate_gravity_force.hpp:6
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
Definition calculate_gyroscopic_matrix.hpp:14
typename View< ValueType >::const_type ConstView
Definition calculate_gyroscopic_matrix.hpp:18
static KOKKOS_FUNCTION void invoke(double mass, const ConstView< double[3]> &omega, const ConstView< double[3]> &eta, const ConstView< double[3][3]> &rho, const ConstView< double[3][3]> &omega_tilde, const Kokkos::View< double[6][6], DeviceType > &Guu)
Definition calculate_gyroscopic_matrix.hpp:20
Kokkos::View< ValueType, DeviceType > View
Definition calculate_gyroscopic_matrix.hpp:16