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

Kynema API: /home/runner/work/kynema/kynema/kynema/src/system/beams/integrate_inertia_matrix.hpp Source File
Kynema 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::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;
34 Kokkos::View<double** [6][6], DeviceType> gbl_M_;
35
37 void operator()(size_t node_simd_node) const {
38 using simd_type = Kokkos::Experimental::simd<double>;
39 using tag_type = Kokkos::Experimental::vector_aligned_tag;
40 using Kokkos::ALL;
41 using Kokkos::Array;
42 using Kokkos::make_pair;
43 using Kokkos::subview;
44
45 constexpr auto width = simd_type::size();
46 const auto extra_component = num_nodes % width == 0U ? 0U : 1U;
48 const auto node = node_simd_node / num_simd_nodes;
50
52
53 const auto qp_Muu = ConstView<double* [36]>(qp_Muu_.data(), num_qps);
54 const auto qp_G_I = ConstView<double* [36]>(qp_G_I_.data(), num_qps);
55 const auto qp_Duu = ConstView<double* [36]>(qp_Duu_.data(), num_qps);
56 const auto qp_GD1 = ConstView<double* [36]>(qp_GD1_.data(), num_qps);
57 const auto qp_GD2 = ConstView<double* [36]>(qp_GD2_.data(), num_qps);
58 const auto qp_DD2 = ConstView<double* [36]>(qp_DD2_.data(), num_qps);
59
60 for (auto qp = 0U; qp < num_qps; ++qp) {
61 const auto w = simd_type(qp_weight_(qp));
62 const auto jacobian = simd_type(qp_jacobian_(qp));
63 const auto phi_1 = simd_type(shape_interp_(node, qp));
64 auto phi_2 = simd_type{};
65 phi_2.copy_from(&shape_interp_(simd_node, qp), tag_type());
66 const auto phi_prime_1 = simd_type(shape_deriv_(node, qp));
67 auto phi_prime_2 = simd_type{};
69 const auto c1 = (phi_prime_1 * phi_prime_2) * (w / jacobian);
70 const auto c2 = (phi_prime_1 * phi_2) * w;
71 const auto c3 = (phi_1 * phi_prime_2) * w;
72 const auto c4 = (phi_1 * phi_2) * (w * jacobian);
73 const auto Muu_local = subview(qp_Muu, qp, ALL);
74 const auto G_I_local = subview(qp_G_I, qp, ALL);
75 const auto Duu_local = subview(qp_Duu, qp, ALL);
76 const auto GD1_local = subview(qp_GD1, qp, ALL);
77 const auto GD2_local = subview(qp_GD2, qp, ALL);
78 const auto DD2_local = subview(qp_DD2, qp, ALL);
79 for (auto i = 0; i < 36; ++i) {
80 const auto Muu = simd_type(Muu_local(i));
81 const auto G_I = simd_type(G_I_local(i));
82 const auto Duu = simd_type(Duu_local(i));
83 const auto GD1 = simd_type(GD1_local(i));
84 const auto GD2 = simd_type(GD2_local(i));
85 const auto DD2 = simd_type(DD2_local(i));
86 const auto Mij = c4 * Muu;
87 const auto Gij = c1 * Duu + c2 * GD1 + c3 * DD2 + c4 * (G_I + GD2);
88 local_M[i] = local_M[i] + (beta_prime_ * Mij) + (gamma_prime_ * Gij);
89 }
90 }
91
92 const auto num_lanes = Kokkos::min(width, num_nodes - simd_node);
94 const auto M_slice =
96
97 for (auto lane = 0U; lane < num_lanes; ++lane) {
98 for (auto component = 0; component < 36; ++component) {
100 }
101 }
102 }
103};
104} // namespace kynema::beams
Definition beam_quadrature.hpp:14
Definition integrate_inertia_matrix.hpp:9
Kokkos::View< ValueType, DeviceType > View
Definition integrate_inertia_matrix.hpp:11
size_t element
Definition integrate_inertia_matrix.hpp:19
Kokkos::View< ValueType, Kokkos::LayoutLeft, DeviceType > LeftView
Definition integrate_inertia_matrix.hpp:15
ConstView< double *[6][6]> qp_Muu_
Definition integrate_inertia_matrix.hpp:26
ConstView< double *[6][6]> qp_GD1_
Definition integrate_inertia_matrix.hpp:29
size_t num_nodes
Definition integrate_inertia_matrix.hpp:20
ConstView< double *[6][6]> qp_Duu_
Definition integrate_inertia_matrix.hpp:28
ConstLeftView< double ** > shape_deriv_
Definition integrate_inertia_matrix.hpp:25
typename View< ValueType >::const_type ConstView
Definition integrate_inertia_matrix.hpp:13
ConstLeftView< double ** > shape_interp_
Definition integrate_inertia_matrix.hpp:24
ConstView< double * > qp_weight_
Definition integrate_inertia_matrix.hpp:22
typename LeftView< ValueType >::const_type ConstLeftView
Definition integrate_inertia_matrix.hpp:17
ConstView< double *[6][6]> qp_DD2_
Definition integrate_inertia_matrix.hpp:31
double gamma_prime_
Definition integrate_inertia_matrix.hpp:33
ConstView< double *[6][6]> qp_GD2_
Definition integrate_inertia_matrix.hpp:30
ConstView< double * > qp_jacobian_
Definition integrate_inertia_matrix.hpp:23
ConstView< double *[6][6]> qp_G_I_
Definition integrate_inertia_matrix.hpp:27
double beta_prime_
Definition integrate_inertia_matrix.hpp:32
size_t num_qps
Definition integrate_inertia_matrix.hpp:21
Kokkos::View< double **[6][6], DeviceType > gbl_M_
Definition integrate_inertia_matrix.hpp:34
KOKKOS_FUNCTION void operator()(size_t node_simd_node) const
Definition integrate_inertia_matrix.hpp:37