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

Kynema API: /home/runner/work/kynema/kynema/kynema/src/system/beams/calculate_quadrature_point_values.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
calculate_quadrature_point_values.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Kokkos_Core.hpp>
4
12#include "update_node_state.hpp"
13
14namespace kynema::beams {
15
16template <typename DeviceType>
18 using TeamPolicy = typename Kokkos::TeamPolicy<typename DeviceType::execution_space>;
19 using member_type = typename TeamPolicy::member_type;
20 template <typename ValueType>
21 using View = Kokkos::View<ValueType, DeviceType>;
22 template <typename ValueType>
24 template <typename ValueType>
25 using LeftView = Kokkos::View<ValueType, Kokkos::LayoutLeft, DeviceType>;
26
51
54 using simd_type = Kokkos::Experimental::simd<double>;
55 using Kokkos::ALL;
56 using Kokkos::Array;
57 using Kokkos::make_pair;
58 using Kokkos::parallel_for;
59 using Kokkos::subview;
60 using Kokkos::TeamVectorRange;
61 using CopyMatrix = KokkosBatched::TeamVectorCopy<member_type>;
62 using CopyVector =
63 KokkosBatched::TeamVectorCopy<member_type, KokkosBatched::Trans::NoTranspose, 1>;
64
65 const auto element = static_cast<size_t>(member.league_rank());
66 const auto num_nodes = num_nodes_per_element(element);
67 const auto num_qps = num_qps_per_element(element);
68 constexpr auto width = simd_type::size();
69 const auto extra_component = num_nodes % width == 0U ? 0U : 1U;
70 const auto simd_nodes = (num_nodes / width) + extra_component;
71 const auto padded_num_nodes = simd_nodes * width;
72
73 const auto qp_pair = make_pair(0UL, num_qps);
74 const auto node_pair = make_pair(0UL, num_nodes);
75 const auto qp_range = TeamVectorRange(member, num_qps);
76 const auto node_range = TeamVectorRange(member, num_nodes);
77 const auto node_squared_range = TeamVectorRange(member, num_nodes * num_nodes);
79
80 const auto shape_interp =
81 LeftView<double**>(member.team_scratch(0), padded_num_nodes, num_qps);
82 const auto shape_deriv =
83 LeftView<double**>(member.team_scratch(0), padded_num_nodes, num_qps);
84
85 const auto qp_weight = View<double*>(member.team_scratch(0), num_qps);
86 const auto qp_jacobian = View<double*>(member.team_scratch(0), num_qps);
87
88 const auto node_u = View<double* [7]>(member.team_scratch(1), num_nodes);
89 const auto node_u_dot = View<double* [6]>(member.team_scratch(1), num_nodes);
90 const auto node_u_ddot = View<double* [6]>(member.team_scratch(1), num_nodes);
91 const auto node_FX = View<double* [6]>(member.team_scratch(1), num_nodes);
92 const auto qp_F_E1 = View<double* [6]>(member.team_scratch(1), num_qps);
93 const auto qp_F_E2 = View<double* [6]>(member.team_scratch(1), num_qps);
94 const auto qp_F_D1 = View<double* [6]>(member.team_scratch(1), num_qps);
95 const auto qp_F_D2 = View<double* [6]>(member.team_scratch(1), num_qps);
96 const auto qp_Fi = View<double* [6]>(member.team_scratch(1), num_qps);
97 const auto qp_Fe = View<double* [6]>(member.team_scratch(1), num_qps);
98 const auto qp_Fg = View<double* [6]>(member.team_scratch(1), num_qps);
99
100 const auto qp_K_I = View<double* [6][6]>(member.team_scratch(1), num_qps);
101 const auto qp_Puu = View<double* [6][6]>(member.team_scratch(1), num_qps);
102 const auto qp_Cuu = View<double* [6][6]>(member.team_scratch(1), num_qps);
103 const auto qp_Duu = View<double* [6][6]>(member.team_scratch(1), num_qps);
104 const auto qp_K_E1 = View<double* [6][6]>(member.team_scratch(1), num_qps);
105 const auto qp_K_E2 = View<double* [6][6]>(member.team_scratch(1), num_qps);
106 const auto qp_Muu = View<double* [6][6]>(member.team_scratch(1), num_qps);
107 const auto qp_G_I = View<double* [6][6]>(member.team_scratch(1), num_qps);
108 const auto qp_D_D1 = View<double* [6][6]>(member.team_scratch(1), num_qps);
109 const auto qp_D_D2 = View<double* [6][6]>(member.team_scratch(1), num_qps);
110 const auto qp_G_D1 = View<double* [6][6]>(member.team_scratch(1), num_qps);
111 const auto qp_G_D2 = View<double* [6][6]>(member.team_scratch(1), num_qps);
112 const auto qp_P_D2 = View<double* [6][6]>(member.team_scratch(1), num_qps);
113 const auto qp_K_D1 = View<double* [6][6]>(member.team_scratch(1), num_qps);
114 const auto qp_K_D2 = View<double* [6][6]>(member.team_scratch(1), num_qps);
115
116 const auto stiffness_matrix_terms =
117 View<double** [6][6]>(member.team_scratch(1), num_nodes, num_nodes);
118 const auto inertia_matrix_terms =
119 View<double** [6][6]>(member.team_scratch(1), num_nodes, num_nodes);
120
121 CopyMatrix::invoke(
123 subview(shape_interp, node_pair, qp_pair)
124 );
125 CopyMatrix::invoke(
127 subview(shape_deriv, node_pair, qp_pair)
128 );
129 CopyMatrix::invoke(member, subview(qp_FE_, element, qp_pair, ALL), qp_Fe);
130 CopyMatrix::invoke(member, subview(node_FX_, element, node_pair, ALL), node_FX);
131
132 CopyVector::invoke(member, subview(qp_weight_, element, qp_pair), qp_weight);
133 CopyVector::invoke(member, subview(qp_jacobian_, element, qp_pair), qp_jacobian);
134
135 auto mu_data = Array<double, 6>{};
136 const auto mu = View<double[6]>(mu_data.data());
137 CopyVector::invoke(member, subview(element_mu, element, ALL), mu);
138
140 element, node_state_indices, node_u, node_u_dot, node_u_ddot, Q, V, A
141 };
143 member.team_barrier();
144
147 element, shape_interp, gravity_, qp_r0_, qp_Mstar_, node_u, node_u_dot,
148 node_u_ddot, qp_Fi, qp_Fg, qp_Muu, qp_G_I, qp_K_I
149 };
151
154 element, qp_jacobian, shape_interp, shape_deriv, qp_r0_, qp_x0_prime_, qp_Cstar_,
155 node_u, qp_F_E1, qp_F_E2, qp_Cuu, qp_K_E1, qp_Puu, qp_K_E2
156 };
158
161 element, mu, qp_jacobian, shape_interp, shape_deriv, qp_r0_, qp_x0_prime_,
162 qp_Cstar_, node_u, node_u_dot, qp_F_D1, qp_F_D2, qp_Duu, qp_D_D1,
164 };
166
167 member.team_barrier();
168
170 element, num_qps, qp_weight, qp_jacobian, shape_interp,
171 shape_deriv, node_FX, qp_F_E1, qp_F_E2, qp_F_D1,
172 qp_F_D2, qp_Fi, qp_Fe, qp_Fg, residual_vector_terms_
173 };
175
177 element,
178 num_nodes,
179 num_qps,
180 qp_weight,
181 qp_jacobian,
182 shape_interp,
183 shape_deriv,
184 qp_K_I,
185 qp_Puu,
186 qp_Cuu,
187 qp_K_E1,
188 qp_K_E2,
189 qp_D_D1,
190 qp_K_D1,
191 qp_K_D2,
192 qp_P_D2,
193 stiffness_matrix_terms
194 };
196
198 element, num_nodes, num_qps, qp_weight,
199 qp_jacobian, shape_interp, shape_deriv, qp_Muu,
200 qp_G_I, qp_Duu, qp_G_D1, qp_G_D2,
201 qp_D_D2, beta_prime_, gamma_prime_, inertia_matrix_terms
202 };
204 member.team_barrier();
205
207 element,
208 num_nodes,
209 tangent,
211 stiffness_matrix_terms,
212 inertia_matrix_terms,
214 };
216 }
217};
218
219} // namespace kynema::beams
Definition beam_quadrature.hpp:14
Definition calculate_quadrature_point_damping_values.hpp:25
Definition calculate_quadrature_point_inertial_values.hpp:17
Definition calculate_quadrature_point_stiffness_values.hpp:19
Definition calculate_quadrature_point_values.hpp:17
Kokkos::View< ValueType, DeviceType > View
Definition calculate_quadrature_point_values.hpp:21
ConstView< double *[6]> A
Definition calculate_quadrature_point_values.hpp:31
ConstView< double *[6][6]> tangent
Definition calculate_quadrature_point_values.hpp:32
View< double ***[6][6]> system_matrix_terms_
Definition calculate_quadrature_point_values.hpp:50
ConstView< double *** > shape_deriv_
Definition calculate_quadrature_point_values.hpp:40
ConstView< double ** > qp_jacobian_
Definition calculate_quadrature_point_values.hpp:38
ConstView< double **[6]> node_FX_
Definition calculate_quadrature_point_values.hpp:42
typename Kokkos::TeamPolicy< typename DeviceType::execution_space > TeamPolicy
Definition calculate_quadrature_point_values.hpp:18
ConstView< double **[3]> qp_x0_prime_
Definition calculate_quadrature_point_values.hpp:45
typename View< ValueType >::const_type ConstView
Definition calculate_quadrature_point_values.hpp:23
ConstView< double **[6][6]> qp_Cstar_
Definition calculate_quadrature_point_values.hpp:47
Kokkos::View< ValueType, Kokkos::LayoutLeft, DeviceType > LeftView
Definition calculate_quadrature_point_values.hpp:25
View< double **[6]> residual_vector_terms_
Definition calculate_quadrature_point_values.hpp:49
ConstView< size_t * > num_nodes_per_element
Definition calculate_quadrature_point_values.hpp:34
double gamma_prime_
Definition calculate_quadrature_point_values.hpp:28
ConstView< double **[6][6]> qp_Mstar_
Definition calculate_quadrature_point_values.hpp:46
double beta_prime_
Definition calculate_quadrature_point_values.hpp:27
ConstView< size_t ** > node_state_indices
Definition calculate_quadrature_point_values.hpp:33
View< double **[6]> qp_FE_
Definition calculate_quadrature_point_values.hpp:48
ConstView< double **[4]> qp_r0_
Definition calculate_quadrature_point_values.hpp:43
ConstView< double *[6]> V
Definition calculate_quadrature_point_values.hpp:30
ConstView< double **[3]> qp_x0_
Definition calculate_quadrature_point_values.hpp:44
ConstView< size_t * > num_qps_per_element
Definition calculate_quadrature_point_values.hpp:35
ConstView< double *[6]> element_mu
Definition calculate_quadrature_point_values.hpp:36
ConstView< double *** > shape_interp_
Definition calculate_quadrature_point_values.hpp:39
KOKKOS_FUNCTION void operator()(member_type member) const
Definition calculate_quadrature_point_values.hpp:53
ConstView< double[3]> gravity_
Definition calculate_quadrature_point_values.hpp:41
ConstView< double ** > qp_weight_
Definition calculate_quadrature_point_values.hpp:37
typename TeamPolicy::member_type member_type
Definition calculate_quadrature_point_values.hpp:19
ConstView< double *[7]> Q
Definition calculate_quadrature_point_values.hpp:29
Definition calculate_system_matrix.hpp:10
Definition integrate_inertia_matrix.hpp:9
Definition integrate_residual_vector.hpp:8
Definition integrate_stiffness_matrix.hpp:10
Definition update_node_state.hpp:9