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

Kynema API: /home/runner/work/kynema/kynema/kynema/src/system/beams/integrate_stiffness_matrix.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
integrate_stiffness_matrix.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <KokkosBatched_Copy_Decl.hpp>
4#include <Kokkos_Core.hpp>
5#include <Kokkos_SIMD.hpp>
6
7namespace kynema::beams {
8
9template <typename DeviceType>
11 template <typename ValueType>
12 using View = Kokkos::View<ValueType, DeviceType>;
13 template <typename ValueType>
15 template <typename ValueType>
16 using LeftView = Kokkos::View<ValueType, Kokkos::LayoutLeft, DeviceType>;
17 template <typename ValueType>
19
20 size_t element;
21 size_t num_nodes;
22 size_t num_qps;
37
39 void operator()(size_t node_simd_node) const {
40 using simd_type = Kokkos::Experimental::simd<double>;
41 using tag_type = Kokkos::Experimental::vector_aligned_tag;
42 using Kokkos::ALL;
43 using Kokkos::Array;
44 using Kokkos::make_pair;
45 using Kokkos::subview;
46
47 constexpr auto width = simd_type::size();
48 const auto extra_component = num_nodes % width == 0U ? 0U : 1U;
49 const auto simd_nodes = (num_nodes / width) + extra_component;
50 const auto node = node_simd_node / simd_nodes;
51 const auto simd_node = (node_simd_node % simd_nodes) * width;
52
54
55 const auto qp_Kuu = ConstView<double* [36]>(qp_Kuu_.data(), num_qps);
56 const auto qp_Cuu = ConstView<double* [36]>(qp_Cuu_.data(), num_qps);
57 const auto qp_Puu = ConstView<double* [36]>(qp_Puu_.data(), num_qps);
58 const auto qp_Ouu = ConstView<double* [36]>(qp_Ouu_.data(), num_qps);
59 const auto qp_Quu = ConstView<double* [36]>(qp_Quu_.data(), num_qps);
60
61 const auto qp_DD1 = ConstView<double* [36]>(qp_DD1_.data(), num_qps);
62 const auto qp_KD1 = ConstView<double* [36]>(qp_KD1_.data(), num_qps);
63 const auto qp_KD2 = ConstView<double* [36]>(qp_KD2_.data(), num_qps);
64 const auto qp_PD2 = ConstView<double* [36]>(qp_PD2_.data(), num_qps);
65
66 for (auto qp = 0U; qp < num_qps; ++qp) {
67 const auto w = simd_type(qp_weight_(qp));
68 const auto jacobian = simd_type(qp_jacobian_(qp));
69 const auto phi_1 = simd_type(shape_interp_(node, qp));
70 auto phi_2 = simd_type{};
71 phi_2.copy_from(&shape_interp_(simd_node, qp), tag_type());
72 const auto phi_prime_1 = simd_type(shape_deriv_(node, qp));
73 auto phi_prime_2 = simd_type{};
75 const auto A = (phi_1 * phi_2) * (w * jacobian);
76 const auto B = (phi_1 * phi_prime_2) * w;
77 const auto C = (phi_prime_1 * phi_prime_2) * (w / jacobian);
78 const auto D = (phi_prime_1 * phi_2) * w;
79 const auto Kuu_local = subview(qp_Kuu, qp, ALL);
80 const auto Cuu_local = subview(qp_Cuu, qp, ALL);
81 const auto Quu_local = subview(qp_Quu, qp, ALL);
82 const auto Puu_local = subview(qp_Puu, qp, ALL);
83 const auto Ouu_local = subview(qp_Ouu, qp, ALL);
84 const auto DD1_local = subview(qp_DD1, qp, ALL);
85 const auto KD1_local = subview(qp_KD1, qp, ALL);
86 const auto KD2_local = subview(qp_KD2, qp, ALL);
87 const auto PD2_local = subview(qp_PD2, qp, ALL);
88 for (auto component = 0; component < 36; ++component) {
89 const auto Kuu = simd_type(Kuu_local(component));
90 const auto Cuu = simd_type(Cuu_local(component));
91 const auto Quu = simd_type(Quu_local(component));
92 const auto Puu = simd_type(Puu_local(component));
93 const auto Ouu = simd_type(Ouu_local(component));
94 const auto DD1 = simd_type(DD1_local(component));
95 const auto KD1 = simd_type(KD1_local(component));
96 const auto KD2 = simd_type(KD2_local(component));
97 const auto PD2 = simd_type(PD2_local(component));
98 local_M[component] = local_M[component] + C * (Cuu + DD1) + D * (Ouu + KD1) +
99 B * (Puu + PD2) + A * (Kuu + Quu + KD2);
100 }
101 }
102
103 const auto num_lanes = Kokkos::min(width, num_nodes - simd_node);
105 const auto M_slice =
107
108 for (auto lane = 0U; lane < num_lanes; ++lane) {
109 for (auto component = 0; component < 36; ++component) {
111 }
112 }
113 }
114};
115
116} // namespace kynema::beams
Definition beam_quadrature.hpp:14
Definition integrate_stiffness_matrix.hpp:10
ConstView< double *[6][6]> qp_Puu_
Definition integrate_stiffness_matrix.hpp:28
ConstView< double *[6][6]> qp_Quu_
Definition integrate_stiffness_matrix.hpp:31
ConstView< double * > qp_weight_
Definition integrate_stiffness_matrix.hpp:23
ConstView< double *[6][6]> qp_DD1_
Definition integrate_stiffness_matrix.hpp:32
View< double **[6][6]> gbl_M_
Definition integrate_stiffness_matrix.hpp:36
size_t element
Definition integrate_stiffness_matrix.hpp:20
ConstView< double * > qp_jacobian_
Definition integrate_stiffness_matrix.hpp:24
size_t num_nodes
Definition integrate_stiffness_matrix.hpp:21
ConstView< double *[6][6]> qp_KD1_
Definition integrate_stiffness_matrix.hpp:33
typename View< ValueType >::const_type ConstView
Definition integrate_stiffness_matrix.hpp:14
ConstView< double *[6][6]> qp_KD2_
Definition integrate_stiffness_matrix.hpp:34
ConstView< double *[6][6]> qp_Ouu_
Definition integrate_stiffness_matrix.hpp:30
typename LeftView< ValueType >::const_type ConstLeftView
Definition integrate_stiffness_matrix.hpp:18
size_t num_qps
Definition integrate_stiffness_matrix.hpp:22
ConstView< double *[6][6]> qp_Kuu_
Definition integrate_stiffness_matrix.hpp:27
ConstView< double *[6][6]> qp_Cuu_
Definition integrate_stiffness_matrix.hpp:29
Kokkos::View< ValueType, DeviceType > View
Definition integrate_stiffness_matrix.hpp:12
ConstView< double *[6][6]> qp_PD2_
Definition integrate_stiffness_matrix.hpp:35
ConstLeftView< double ** > shape_deriv_
Definition integrate_stiffness_matrix.hpp:26
ConstLeftView< double ** > shape_interp_
Definition integrate_stiffness_matrix.hpp:25
KOKKOS_FUNCTION void operator()(size_t node_simd_node) const
Definition integrate_stiffness_matrix.hpp:39
Kokkos::View< ValueType, Kokkos::LayoutLeft, DeviceType > LeftView
Definition integrate_stiffness_matrix.hpp:16