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

Kynema API: /home/runner/work/kynema/kynema/kynema/src/system/beams/calculate_quadrature_point_damping_values.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
calculate_quadrature_point_damping_values.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <ranges>
4
5#include <KokkosBatched_Copy_Decl.hpp>
6#include <KokkosBlas1_set.hpp>
7#include <Kokkos_Core.hpp>
8
9#include "calculate_D_D1.hpp"
10#include "calculate_D_D2.hpp"
11#include "calculate_G_D1.hpp"
12#include "calculate_G_D2.hpp"
13#include "calculate_K_D1.hpp"
14#include "calculate_K_D2.hpp"
15#include "calculate_P_D2.hpp"
18#include "calculate_strain.hpp"
22
23namespace kynema::beams {
24template <typename DeviceType>
26 template <typename ValueType>
27 using View = Kokkos::View<ValueType, DeviceType>;
28 template <typename ValueType>
30 template <typename ValueType>
31 using LeftView = Kokkos::View<ValueType, Kokkos::LayoutLeft, DeviceType>;
32 template <typename ValueType>
34 using Gemm = KokkosBatched::SerialGemm<
35 KokkosBatched::Trans::NoTranspose, KokkosBatched::Trans::NoTranspose,
36 KokkosBatched::Algo::Gemm::Default>;
37
38 size_t element;
48
59
61 void operator()(size_t qp) const {
62 using Kokkos::ALL;
63 using Kokkos::Array;
64 using Kokkos::make_pair;
65 using Kokkos::subview;
66 using CopyMatrix = KokkosBatched::SerialCopy<>;
67 using CopyVector = KokkosBatched::SerialCopy<KokkosBatched::Trans::NoTranspose, 1>;
68
69 // If mu is all zeros, zero the output and skip the calculation
70 if (mu(0) == 0.0 && mu(1) == 0.0 && mu(2) == 0.0 && mu(3) == 0.0 && mu(4) == 0.0 &&
71 mu(5) == 0.0) {
72 KokkosBlas::SerialSet::invoke(0., subview(qp_FD1, qp, ALL));
73 KokkosBlas::SerialSet::invoke(0., subview(qp_FD2, qp, ALL));
74 KokkosBlas::SerialSet::invoke(0., subview(qp_Duu, qp, ALL, ALL));
75 KokkosBlas::SerialSet::invoke(0., subview(qp_DD1, qp, ALL, ALL));
76 KokkosBlas::SerialSet::invoke(0., subview(qp_DD2, qp, ALL, ALL));
77 KokkosBlas::SerialSet::invoke(0., subview(qp_GD1, qp, ALL, ALL));
78 KokkosBlas::SerialSet::invoke(0., subview(qp_GD2, qp, ALL, ALL));
79 KokkosBlas::SerialSet::invoke(0., subview(qp_PD2, qp, ALL, ALL));
80 KokkosBlas::SerialSet::invoke(0., subview(qp_KD1, qp, ALL, ALL));
81 KokkosBlas::SerialSet::invoke(0., subview(qp_KD2, qp, ALL, ALL));
82 return;
83 }
84
85 const auto r0_data = Array<double, 4>{
86 qp_r0(element, qp, 0), qp_r0(element, qp, 1), qp_r0(element, qp, 2),
87 qp_r0(element, qp, 3)
88 };
89 const auto r0 = ConstView<double[4]>(r0_data.data());
90
93 };
94 const auto xr_prime = ConstView<double[3]>(xr_prime_data.data());
95
97 const auto xr = View<double[4]>(xr_data.data());
98
99 auto u_data = Array<double, 3>{};
100 const auto u = View<double[3]>(u_data.data());
102 const auto u_prime = View<double[3]>(u_prime_data.data());
103
104 auto r_data = Array<double, 4>{};
105 const auto r = View<double[4]>(r_data.data());
107 const auto r_prime = View<double[4]>(r_prime_data.data());
108
110 const auto u_dot = View<double[3]>(u_dot_data.data());
112 const auto u_dot_prime = View<double[3]>(u_dot_prime_data.data());
113
115 const auto omega = View<double[3]>(omega_data.data());
117 const auto omega_prime = View<double[3]>(omega_prime_data.data());
118
120 const auto strain = View<double[6]>(strain_data.data());
122 const auto strain_dot = View<double[6]>(strain_dot_data.data());
123
125 const auto Cstar = View<double[6][6]>(Cstar_data.data());
127 const auto Dstar = View<double[6][6]>(Dstar_data.data());
128
130 const auto mu_diag = View<double[6][6]>(mu_diag_data.data());
131
133 const auto Cuu = View<double[6][6]>(Cuu_data.data());
135 const auto Duu = View<double[6][6]>(Duu_data.data());
136
137 auto FD1_data = Array<double, 6>{};
138 const auto FD1 = View<double[6]>(FD1_data.data());
139 auto FD2_data = Array<double, 6>{};
140 const auto FD2 = View<double[6]>(FD2_data.data());
141
143 const auto DD1 = View<double[6][6]>(DD1_data.data());
145 const auto DD2 = View<double[6][6]>(DD2_data.data());
147 const auto GD1 = View<double[6][6]>(GD1_data.data());
149 const auto GD2 = View<double[6][6]>(GD2_data.data());
151 const auto PD2 = View<double[6][6]>(PD2_data.data());
153 const auto KD1 = View<double[6][6]>(KD1_data.data());
155 const auto KD2 = View<double[6][6]>(KD2_data.data());
156
157 CopyMatrix::invoke(subview(qp_Cstar, element, qp, ALL, ALL), Cstar);
158
159 // Build damping matrix Dstar from Cstar and mu_diag
160 KokkosBlas::SerialSet::invoke(0., mu_diag);
161 for (auto i = 0U; i < 6U; ++i) {
162 mu_diag(i, i) = mu(i);
163 }
164 Gemm::invoke(1., mu_diag, Cstar, 0., Dstar);
165
169 );
171
172 // Rotate stiffness and damping matrices into the global coordinate system
175
176 // Calculate strain and extract curvature (kappa)
179 const auto kappa = View<double[3]>(kappa_data.data());
180 CopyVector::invoke(subview(strain, make_pair(3UL, 6UL)), kappa);
181
182 // Calculate strain rate and extract the strain rate components
185 );
187 const auto eps_dot = View<double[3]>(eps_dot_data.data());
188 CopyVector::invoke(subview(strain_dot, make_pair(0UL, 3UL)), eps_dot);
190 const auto kappa_dot = View<double[3]>(kappa_dot_data.data());
191 CopyVector::invoke(subview(strain_dot, make_pair(3UL, 6UL)), kappa_dot);
192
193 // Calculate damping forces and copy to quadrature point values
196 CopyVector::invoke(FD1, subview(qp_FD1, qp, ALL));
197 CopyVector::invoke(FD2, subview(qp_FD2, qp, ALL));
198
199 // Calculate damping tangent matrices and copy to quadrature point values
207 CopyMatrix::invoke(Duu, subview(qp_Duu, qp, ALL, ALL));
208 CopyMatrix::invoke(DD1, subview(qp_DD1, qp, ALL, ALL));
209 CopyMatrix::invoke(DD2, subview(qp_DD2, qp, ALL, ALL));
210 CopyMatrix::invoke(GD1, subview(qp_GD1, qp, ALL, ALL));
211 CopyMatrix::invoke(GD2, subview(qp_GD2, qp, ALL, ALL));
212 CopyMatrix::invoke(PD2, subview(qp_PD2, qp, ALL, ALL));
213 CopyMatrix::invoke(KD1, subview(qp_KD1, qp, ALL, ALL));
214 CopyMatrix::invoke(KD2, subview(qp_KD2, qp, ALL, ALL));
215 }
216};
217
218} // namespace kynema::beams
Definition beam_quadrature.hpp:14
KOKKOS_INLINE_FUNCTION void QuaternionCompose(const Quaternion1 &q1, const Quaternion2 &q2, QuaternionN &qn)
Composes (i.e. multiplies) two quaternions and stores the result in a third quaternion.
Definition quaternion_operations.hpp:87
static KOKKOS_FUNCTION void invoke(const ConstView< double[3]> &omega, const ConstView< double[6][6]> &D, const View< double[6][6]> &D_D1)
Definition calculate_D_D1.hpp:19
static KOKKOS_FUNCTION void invoke(const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &u_prime, const ConstView< double[6][6]> &D, const View< double[6][6]> &D_D2)
Definition calculate_D_D2.hpp:19
static KOKKOS_FUNCTION void invoke(const ConstView< double[6][6]> &D, const ConstView< double[6]> &strain_dot, const View< double[6]> &FD1)
Definition calculate_force_FD1.hpp:15
static KOKKOS_FUNCTION void invoke(const ConstView< double[6][6]> &Duu, const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &u_prime, const ConstView< double[6]> &strain_dot, const View< double[6]> &FD2)
Definition calculate_force_FD2.hpp:19
static KOKKOS_FUNCTION void invoke(const ConstView< double[4]> &r, const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &kappa, const ConstView< double[6][6]> &D, const View< double[6][6]> &G_D1)
Definition calculate_G_D1.hpp:20
static KOKKOS_FUNCTION void invoke(const ConstView< double[4]> &r, const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &u_prime, const ConstView< double[3]> &kappa, const ConstView< double[6][6]> &D, const View< double[6][6]> &G_D2)
Definition calculate_G_D2.hpp:20
static KOKKOS_FUNCTION void invoke(const ConstView< double[4]> &r, const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &omega, const ConstView< double[3]> &kappa, const ConstView< double[3]> &eps_dot, const ConstView< double[3]> &kappa_dot, const ConstView< double[6][6]> &Duu, const View< double[6][6]> &K_D1)
Definition calculate_K_D1.hpp:21
static KOKKOS_FUNCTION void invoke(const ConstView< double[4]> &r, const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &omega, const ConstView< double[3]> &kappa, const ConstView< double[3]> &eps_dot, const ConstView< double[3]> &kappa_dot, const ConstView< double[6][6]> &D, const View< double[6][6]> &K_D2)
Definition calculate_K_D2.hpp:20
static KOKKOS_FUNCTION void invoke(const ConstView< double[3]> &xr_prime, const ConstView< double[3]> &u_prime, const ConstView< double[3]> &omega, const ConstView< double[3]> &eps_dot, const ConstView< double[3]> &kappa_dot, const ConstView< double[6][6]> &D, const View< double[6][6]> &P_D2)
Definition calculate_P_D2.hpp:19
Definition calculate_quadrature_point_damping_values.hpp:25
ConstView< double * > qp_jacobian
Definition calculate_quadrature_point_damping_values.hpp:40
Kokkos::View< ValueType, DeviceType > View
Definition calculate_quadrature_point_damping_values.hpp:27
typename View< ValueType >::const_type ConstView
Definition calculate_quadrature_point_damping_values.hpp:29
View< double *[6][6]> qp_GD2
Definition calculate_quadrature_point_damping_values.hpp:55
ConstLeftView< double ** > shape_interp
Definition calculate_quadrature_point_damping_values.hpp:41
View< double *[6][6]> qp_KD1
Definition calculate_quadrature_point_damping_values.hpp:57
View< double *[6]> qp_FD1
Definition calculate_quadrature_point_damping_values.hpp:49
KOKKOS_FUNCTION void operator()(size_t qp) const
Definition calculate_quadrature_point_damping_values.hpp:61
View< double *[6]> qp_FD2
Definition calculate_quadrature_point_damping_values.hpp:50
ConstView< double *[6]> node_u_dot
Definition calculate_quadrature_point_damping_values.hpp:47
KokkosBatched::SerialGemm< KokkosBatched::Trans::NoTranspose, KokkosBatched::Trans::NoTranspose, KokkosBatched::Algo::Gemm::Default > Gemm
Definition calculate_quadrature_point_damping_values.hpp:36
View< double *[6][6]> qp_PD2
Definition calculate_quadrature_point_damping_values.hpp:56
View< double *[6][6]> qp_DD1
Definition calculate_quadrature_point_damping_values.hpp:52
ConstLeftView< double ** > shape_deriv
Definition calculate_quadrature_point_damping_values.hpp:42
typename LeftView< ValueType >::const_type ConstLeftView
Definition calculate_quadrature_point_damping_values.hpp:33
View< double *[6][6]> qp_Duu
Definition calculate_quadrature_point_damping_values.hpp:51
View< double *[6][6]> qp_KD2
Definition calculate_quadrature_point_damping_values.hpp:58
ConstView< double[6]> mu
Definition calculate_quadrature_point_damping_values.hpp:39
ConstView< double *[7]> node_u
Definition calculate_quadrature_point_damping_values.hpp:46
Kokkos::View< ValueType, Kokkos::LayoutLeft, DeviceType > LeftView
Definition calculate_quadrature_point_damping_values.hpp:31
ConstView< double **[4]> qp_r0
Definition calculate_quadrature_point_damping_values.hpp:43
ConstView< double **[3]> qp_x0_prime
Definition calculate_quadrature_point_damping_values.hpp:44
View< double *[6][6]> qp_GD1
Definition calculate_quadrature_point_damping_values.hpp:54
size_t element
Definition calculate_quadrature_point_damping_values.hpp:38
View< double *[6][6]> qp_DD2
Definition calculate_quadrature_point_damping_values.hpp:53
ConstView< double **[6][6]> qp_Cstar
Definition calculate_quadrature_point_damping_values.hpp:45
static KOKKOS_FUNCTION void invoke(const ConstView< double[3]> &kappa, const ConstView< double[4]> &r, const ConstView< double[3]> &omega, const ConstView< double[3]> &u_dot_prime, const ConstView< double[3]> &omega_prime, const ConstView< double[3]> &xr_prime, const View< double[6]> &strain_dot)
Definition calculate_strain_dot.hpp:17
static KOKKOS_FUNCTION void invoke(const ConstView< double[3]> &x0_prime, const ConstView< double[3]> &u_prime, const ConstView< double[4]> &r, const ConstView< double[4]> &r_prime, const View< double[6]> &strain)
Definition calculate_strain.hpp:17
static KOKKOS_FUNCTION void invoke(double jacobian, const ConstLeftView< double * > &shape_interp, const ConstLeftView< double * > &shape_deriv, const ConstView< double *[7]> &node_u, const ConstView< double *[6]> &node_u_dot, const View< double[3]> &u, const View< double[4]> &r, const View< double[3]> &u_prime, const View< double[4]> &r_prime, const View< double[3]> &u_dot, const View< double[3]> &omega, const View< double[3]> &u_dot_prime, const View< double[3]> &omega_prime)
Definition interpolate_to_quadrature_point_for_damping.hpp:19
static KOKKOS_FUNCTION void invoke(const ConstView< double[4]> &xr, const ConstView< double[6][6]> &Cstar, const View< double[6][6]> &Cuu)
Definition rotate_section_matrix.hpp:17