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

Kynema API: /home/runner/work/kynema/kynema/kynema/src/system/masses/calculate_inertial_force.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
calculate_inertial_force.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <KokkosBatched_Gemm_Decl.hpp>
4#include <KokkosBlas.hpp>
5#include <Kokkos_Core.hpp>
6
7namespace kynema::masses {
8
9template <typename DeviceType>
11 template <typename ValueType>
12 using View = Kokkos::View<ValueType, DeviceType>;
13 template <typename ValueType>
15
17 double mass, const ConstView<double[3]>& u_ddot, const ConstView<double[3]>& omega,
18 const ConstView<double[3]>& omega_dot, const ConstView<double[3]>& eta,
19 const ConstView<double[3][3]>& eta_tilde, const ConstView<double[3][3]>& rho,
20 const ConstView<double[3][3]>& omega_tilde, const ConstView<double[3][3]>& omega_dot_tilde,
21 const View<double[6]>& FI
22 ) {
23 using NoTranspose = KokkosBatched::Trans::NoTranspose;
24 using GemmDefault = KokkosBatched::Algo::Gemm::Default;
25 using GemvDefault = KokkosBlas::Algo::Gemv::Default;
26 using Gemm = KokkosBatched::SerialGemm<NoTranspose, NoTranspose, GemmDefault>;
27 using Gemv = KokkosBlas::SerialGemv<NoTranspose, GemvDefault>;
28 using Kokkos::Array;
29 using Kokkos::make_pair;
30 using Kokkos::subview;
31
32 auto v1 = Array<double, 3>{};
33 auto V1 = View<double[3]>(v1.data());
34 auto m1 = Array<double, 9>{};
35 auto M1 = View<double[3][3]>(m1.data());
36
37 // Compute first 3 components of FI
38 // FI_1 = m * u_ddot + (omega_dot_tilde + omega_tilde * omega_tilde) * m * eta
39 auto FI_1 = subview(FI, make_pair(0, 3));
40 Gemm::invoke(mass, omega_tilde, omega_tilde, 0., M1);
41 KokkosBlas::serial_axpy(mass, omega_dot_tilde, M1);
42 Gemv::invoke(1., M1, eta, 0., FI_1);
43 KokkosBlas::serial_axpy(mass, u_ddot, FI_1);
44
45 // Compute last 3 components of FI
46 // FI_2 = m * eta_tilde * u_ddot + rho * omega_dot + omega_tilde * rho * omega
47 auto FI_2 = subview(FI, make_pair(3, 6));
48 KokkosBlas::serial_axpy(mass, u_ddot, V1);
49 Gemv::invoke(1., eta_tilde, V1, 0., FI_2);
50 Gemv::invoke(1., rho, omega_dot, 1., FI_2);
51 Gemm::invoke(1., omega_tilde, rho, 0., M1);
52 Gemv::invoke(1., M1, omega, 1., FI_2);
53 }
54};
55} // namespace kynema::masses
Definition calculate_gravity_force.hpp:6
Definition calculate_inertial_force.hpp:10
static KOKKOS_FUNCTION void invoke(double mass, const ConstView< double[3]> &u_ddot, const ConstView< double[3]> &omega, const ConstView< double[3]> &omega_dot, const ConstView< double[3]> &eta, const ConstView< double[3][3]> &eta_tilde, const ConstView< double[3][3]> &rho, const ConstView< double[3][3]> &omega_tilde, const ConstView< double[3][3]> &omega_dot_tilde, const View< double[6]> &FI)
Definition calculate_inertial_force.hpp:16
Kokkos::View< ValueType, DeviceType > View
Definition calculate_inertial_force.hpp:12
typename View< ValueType >::const_type ConstView
Definition calculate_inertial_force.hpp:14