/home/runner/work/kynema-fmb/kynema-fmb/kynema-fmb/src/system/beams/integrate_inertia_matrix.hpp Source File

Kynema-FMB API: /home/runner/work/kynema-fmb/kynema-fmb/kynema-fmb/src/system/beams/integrate_inertia_matrix.hpp Source File
Kynema-FMB API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
integrate_inertia_matrix.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Kokkos_Core.hpp>
4#include <Kokkos_SIMD.hpp>
5
6namespace kynema_fmb::beams {
7
8template <typename DeviceType>
10 template <typename ValueType>
11 using View = Kokkos::View<ValueType, DeviceType>;
12 template <typename ValueType>
14 template <typename ValueType>
15 using LeftView = Kokkos::View<ValueType, Kokkos::LayoutLeft, DeviceType>;
16 template <typename ValueType>
18
19 size_t element;
20 size_t num_nodes;
21 size_t num_qps;
35
37 void operator()(size_t node_simd_node) const {
38 using simd_type = Kokkos::Experimental::simd<double>;
39 using tag_type =
40 Kokkos::Experimental::simd_flags<Kokkos::Experimental::simd_alignment_vector_aligned>;
41 using Kokkos::ALL;
42 using Kokkos::Array;
43 using Kokkos::make_pair;
44 using Kokkos::subview;
45
46 constexpr auto width = simd_type::size();
47 const auto extra_component = num_nodes % width == 0U ? 0U : 1U;
49 const auto node = node_simd_node / num_simd_nodes;
51
53
54 const auto qp_Muu = ConstView<double* [36]>(qp_Muu_.data(), num_qps);
55 const auto qp_G_I = ConstView<double* [36]>(qp_G_I_.data(), num_qps);
56 const auto qp_Duu = ConstView<double* [36]>(qp_Duu_.data(), num_qps);
57 const auto qp_GD1 = ConstView<double* [36]>(qp_GD1_.data(), num_qps);
58 const auto qp_GD2 = ConstView<double* [36]>(qp_GD2_.data(), num_qps);
59 const auto qp_DD2 = ConstView<double* [36]>(qp_DD2_.data(), num_qps);
60
61 const auto beta_prime = simd_type(beta_prime_);
62 const auto gamma_prime = simd_type(gamma_prime_);
63
64 for (auto qp = 0U; qp < num_qps; ++qp) {
65 const auto w = simd_type(qp_weight_(qp));
66 const auto jacobian = simd_type(qp_jacobian_(qp));
67 const auto phi_1 = simd_type(shape_interp_(node, qp));
68 const auto phi_2 =
70 const auto phi_prime_1 = simd_type(shape_deriv_(node, qp));
71 const auto phi_prime_2 =
73 const auto c1 = (phi_prime_1 * phi_prime_2) * (w / jacobian);
74 const auto c2 = (phi_prime_1 * phi_2) * w;
75 const auto c3 = (phi_1 * phi_prime_2) * w;
76 const auto c4 = (phi_1 * phi_2) * (w * jacobian);
77 const auto Muu_local = subview(qp_Muu, qp, ALL);
78 const auto G_I_local = subview(qp_G_I, qp, ALL);
79 const auto Duu_local = subview(qp_Duu, qp, ALL);
80 const auto GD1_local = subview(qp_GD1, qp, ALL);
81 const auto GD2_local = subview(qp_GD2, qp, ALL);
82 const auto DD2_local = subview(qp_DD2, qp, ALL);
83 for (auto i = 0U; i < 36; ++i) {
84 const auto Muu = simd_type(Muu_local(i));
85 const auto G_I = simd_type(G_I_local(i));
86 const auto Duu = simd_type(Duu_local(i));
87 const auto GD1 = simd_type(GD1_local(i));
88 const auto GD2 = simd_type(GD2_local(i));
89 const auto DD2 = simd_type(DD2_local(i));
90 const auto Mij = c4 * Muu;
91 const auto Gij = c1 * Duu + c2 * GD1 + c3 * DD2 + c4 * (G_I + GD2);
92 local_M[i] = local_M[i] + (beta_prime * Mij) + (gamma_prime * Gij);
93 }
94 }
95
96 const auto num_lanes =
97 Kokkos::min(width, static_cast<decltype(width)>(num_nodes - simd_node));
99 const auto M_slice = subview(
100 global_M, node, make_pair(simd_node, simd_node + static_cast<std::size_t>(num_lanes)),
101 ALL
102 );
103
104 for (auto lane = 0; lane < num_lanes; ++lane) {
105 for (auto component = 0U; component < 36; ++component) {
107 }
108 }
109 }
110};
111} // namespace kynema_fmb::beams
Definition beam_quadrature.hpp:14
Definition integrate_inertia_matrix.hpp:9
ConstView< double *[6][6]> qp_Muu_
Definition integrate_inertia_matrix.hpp:26
ConstLeftView< double ** > shape_deriv_
Definition integrate_inertia_matrix.hpp:25
typename View< ValueType >::const_type ConstView
Definition integrate_inertia_matrix.hpp:13
View< double **[6][6]> gbl_M_
Definition integrate_inertia_matrix.hpp:34
ConstLeftView< double ** > shape_interp_
Definition integrate_inertia_matrix.hpp:24
ConstView< double *[6][6]> qp_G_I_
Definition integrate_inertia_matrix.hpp:27
size_t num_qps
Definition integrate_inertia_matrix.hpp:21
typename LeftView< ValueType >::const_type ConstLeftView
Definition integrate_inertia_matrix.hpp:17
ConstView< double * > qp_weight_
Definition integrate_inertia_matrix.hpp:22
ConstView< double *[6][6]> qp_Duu_
Definition integrate_inertia_matrix.hpp:28
size_t num_nodes
Definition integrate_inertia_matrix.hpp:20
size_t element
Definition integrate_inertia_matrix.hpp:19
ConstView< double *[6][6]> qp_GD2_
Definition integrate_inertia_matrix.hpp:30
ConstView< double *[6][6]> qp_DD2_
Definition integrate_inertia_matrix.hpp:31
KOKKOS_FUNCTION void operator()(size_t node_simd_node) const
Definition integrate_inertia_matrix.hpp:37
Kokkos::View< ValueType, Kokkos::LayoutLeft, DeviceType > LeftView
Definition integrate_inertia_matrix.hpp:15
ConstView< double * > qp_jacobian_
Definition integrate_inertia_matrix.hpp:23
ConstView< double *[6][6]> qp_GD1_
Definition integrate_inertia_matrix.hpp:29
double beta_prime_
Definition integrate_inertia_matrix.hpp:32
double gamma_prime_
Definition integrate_inertia_matrix.hpp:33
Kokkos::View< ValueType, DeviceType > View
Definition integrate_inertia_matrix.hpp:11