/home/runner/work/kynema/kynema/kynema/src/elements/beams/create_beams.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/elements/beams/create_beams.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
create_beams.hpp
Go to the documentation of this file.
1#pragma once
2#include <span>
3
4#include <Kokkos_Core.hpp>
5
6#include "beams.hpp"
7#include "beams_input.hpp"
13
14namespace kynema {
15
26template <typename DeviceType>
27inline Beams<DeviceType> CreateBeams(const BeamsInput& beams_input, std::span<const Node> nodes) {
28 using Kokkos::ALL;
29 using Kokkos::create_mirror_view;
30 using Kokkos::deep_copy;
31 using Kokkos::make_pair;
32 using Kokkos::parallel_for;
33 using Kokkos::subview;
34 using Kokkos::WithoutInitializing;
35 using RangePolicy = Kokkos::RangePolicy<typename DeviceType::execution_space>;
36 using TeamPolicy = Kokkos::TeamPolicy<typename DeviceType::execution_space>;
37
39 beams_input.NumElements(), beams_input.MaxElemNodes(), beams_input.MaxElemQuadraturePoints()
40 );
41
42 auto host_gravity = create_mirror_view(WithoutInitializing, beams.gravity);
43
44 auto host_num_nodes_per_element =
45 create_mirror_view(WithoutInitializing, beams.num_nodes_per_element);
46 auto host_num_qps_per_element =
47 create_mirror_view(WithoutInitializing, beams.num_qps_per_element);
48 auto host_element_mu = create_mirror_view(WithoutInitializing, beams.element_mu);
49 auto host_node_state_indices = create_mirror_view(WithoutInitializing, beams.node_state_indices);
50 auto host_node_x0 = create_mirror_view(WithoutInitializing, beams.node_x0);
51 auto host_node_u = create_mirror_view(WithoutInitializing, beams.node_u);
52 auto host_node_u_dot = create_mirror_view(WithoutInitializing, beams.node_u_dot);
53 auto host_node_u_ddot = create_mirror_view(WithoutInitializing, beams.node_u_ddot);
54
55 auto host_qp_weight = create_mirror_view(WithoutInitializing, beams.qp_weight);
56 auto host_qp_Mstar = create_mirror_view(WithoutInitializing, beams.qp_Mstar);
57 auto host_qp_Cstar = create_mirror_view(WithoutInitializing, beams.qp_Cstar);
58
59 auto host_shape_interp = create_mirror_view(WithoutInitializing, beams.shape_interp);
60 auto host_shape_deriv = create_mirror_view(WithoutInitializing, beams.shape_deriv);
61
62 host_gravity(0) = beams_input.gravity[0];
63 host_gravity(1) = beams_input.gravity[1];
64 host_gravity(2) = beams_input.gravity[2];
65
66 for (auto element : std::views::iota(0U, beams_input.NumElements())) {
67 // Get number of nodes and quadrature points in element
68 const auto num_nodes = beams_input.elements[element].node_ids.size();
69 const auto num_qps = beams_input.elements[element].quadrature.size();
70
71 // Create element indices and set in host mirror
72 host_num_nodes_per_element(element) = num_nodes;
73 host_num_qps_per_element(element) = num_qps;
74
75 // Set element damping coefficients
76 for (auto i : std::views::iota(0U, 6U)) {
77 host_element_mu(element, i) = beams_input.elements[element].mu[i];
78 }
79
80 // Populate beam node->state indices
81 for (auto node : std::views::iota(0U, num_nodes)) {
82 host_node_state_indices(element, node) = beams_input.elements[element].node_ids[node];
83 }
84
85 // Populate views for this element
87 beams_input.elements[element], nodes,
88 subview(host_node_x0, element, make_pair(0UL, num_nodes), ALL)
89 );
91 beams_input.elements[element], subview(host_qp_weight, element, make_pair(0UL, num_qps))
92 );
94 beams_input.elements[element], nodes,
95 subview(host_shape_interp, element, make_pair(0UL, num_nodes), make_pair(0UL, num_qps))
96 );
98 beams_input.elements[element], nodes,
99 subview(host_shape_deriv, element, make_pair(0UL, num_nodes), make_pair(0UL, num_qps))
100 );
102 beams_input.elements[element],
103 subview(host_qp_Mstar, element, make_pair(0UL, num_qps), ALL, ALL)
104 );
106 beams_input.elements[element],
107 subview(host_qp_Cstar, element, make_pair(0UL, num_qps), ALL, ALL)
108 );
109 }
110
111 deep_copy(beams.num_nodes_per_element, host_num_nodes_per_element);
112 deep_copy(beams.num_qps_per_element, host_num_qps_per_element);
113 deep_copy(beams.element_mu, host_element_mu);
114 deep_copy(beams.gravity, host_gravity);
115 deep_copy(beams.node_state_indices, host_node_state_indices);
116 deep_copy(beams.node_x0, host_node_x0);
117 deep_copy(beams.node_u, host_node_u);
118 deep_copy(beams.node_u_dot, host_node_u_dot);
119 deep_copy(beams.node_u_ddot, host_node_u_ddot);
120 deep_copy(beams.qp_weight, host_qp_weight);
121 deep_copy(beams.qp_Mstar, host_qp_Mstar);
122 deep_copy(beams.qp_Cstar, host_qp_Cstar);
123 deep_copy(beams.shape_interp, host_shape_interp);
124 deep_copy(beams.shape_deriv, host_shape_deriv);
125
126 deep_copy(beams.node_FX, 0.);
127 deep_copy(beams.qp_Fe, 0.);
128
129 auto range_policy = RangePolicy(0, beams.num_elems);
130
131 parallel_for(
132 "InterpolateQPPosition", range_policy,
135 beams.node_x0, beams.qp_x0
136 }
137 );
138
139 parallel_for(
140 "InterpolateQPRotation", range_policy,
143 beams.node_x0, beams.qp_r0
144 }
145 );
146
147 parallel_for(
148 "CalculateJacobian", range_policy,
152 beams.shape_deriv,
153 beams.node_x0,
154 beams.qp_x0_prime,
155 beams.qp_jacobian,
156 }
157 );
158
159 auto team_policy = TeamPolicy(static_cast<int>(beams.num_elems), Kokkos::AUTO());
160
161 parallel_for(
162 "InterpolateToQuadraturePoints", team_policy,
165 beams.shape_deriv, beams.qp_jacobian, beams.node_u, beams.node_u_dot, beams.node_u_ddot,
166 beams.qp_x0, beams.qp_r0, beams.qp_u, beams.qp_u_prime, beams.qp_r, beams.qp_r_prime,
167 beams.qp_u_dot, beams.qp_omega, beams.qp_u_ddot, beams.qp_omega_dot, beams.qp_x
168 }
169 );
170
171 return beams;
172}
173
174} // namespace kynema
void PopulateNodeX0(const BeamElement &elem, std::span< const Node > nodes, const Kokkos::View< double *[7], Kokkos::LayoutStride, Kokkos::HostSpace > &node_x0)
Populate the node initial position and orientation.
Definition populate_element_views.hpp:14
void PopulateShapeFunctionValues(const BeamElement &elem, std::span< const Node > nodes, const Kokkos::View< double **, Kokkos::LayoutStride, Kokkos::HostSpace > &shape_interp)
Populate shape function values at each quadrature point.
Definition populate_element_views.hpp:45
void PopulateQPWeight(const BeamElement &elem, const Kokkos::View< double *, Kokkos::LayoutStride, Kokkos::HostSpace > &qp_weight)
Populate the integration weights at each quadrature point.
Definition populate_element_views.hpp:26
void PopulateShapeFunctionDerivatives(const BeamElement &elem, std::span< const Node > nodes, const Kokkos::View< double **, Kokkos::LayoutStride, Kokkos::HostSpace > &shape_deriv)
Populate shape function derivatives at each quadrature point.
Definition populate_element_views.hpp:63
void PopulateQPCstar(const BeamElement &elem, const Kokkos::View< double *[6][6], Kokkos::LayoutStride, Kokkos::HostSpace > &qp_Cstar)
Populate stiffness matrix values at each quadrature point.
Definition populate_element_views.hpp:117
void PopulateQPMstar(const BeamElement &elem, const Kokkos::View< double *[6][6], Kokkos::LayoutStride, Kokkos::HostSpace > &qp_Mstar)
Populate mass matrix values at each quadrature point.
Definition populate_element_views.hpp:90
Definition calculate_constraint_output.hpp:8
Beams< DeviceType > CreateBeams(const BeamsInput &beams_input, std::span< const Node > nodes)
Creates a beams data structure and initializes its data.
Definition create_beams.hpp:27
Represents the input data for creating flexible beams.
Definition beams_input.hpp:22
size_t NumElements() const
Returns the number of elements in the beam.
Definition beams_input.hpp:32
size_t MaxElemQuadraturePoints() const
Returns the maximum number of quadrature points in any element of the beam.
Definition beams_input.hpp:81
std::array< double, 3 > gravity
Definition beams_input.hpp:24
size_t MaxElemNodes() const
Returns the maximum number of nodes in any element of the beam.
Definition beams_input.hpp:74
std::vector< BeamElement > elements
Definition beams_input.hpp:23
Contains the field variables needed to compute the per-element contributions to the residual vector a...
Definition beams.hpp:22
View< double **[3]> qp_u_ddot
Definition beams.hpp:59
View< double ** > qp_weight
Definition beams.hpp:48
size_t num_elems
Definition beams.hpp:26
View< double *** > shape_interp
Definition beams.hpp:72
View< double **[3]> qp_omega_dot
Definition beams.hpp:63
View< double **[4]> qp_r
Definition beams.hpp:60
View< double **[4]> qp_r_prime
Definition beams.hpp:61
View< double **[7]> qp_x
Definition beams.hpp:52
View< double *** > shape_deriv
Definition beams.hpp:73
View< double **[6]> node_u_ddot
Definition beams.hpp:44
View< double **[3]> qp_x0_prime
Definition beams.hpp:54
View< double **[6][6]> qp_Cstar
Definition beams.hpp:51
View< size_t * > num_qps_per_element
Definition beams.hpp:32
View< double **[4]> qp_r0
Definition beams.hpp:55
View< double **[7]> node_x0
Definition beams.hpp:41
View< double ** > qp_jacobian
Definition beams.hpp:49
View< size_t ** > node_state_indices
Definition beams.hpp:33
View< double **[6]> node_FX
Definition beams.hpp:45
View< double **[6][6]> qp_Mstar
Definition beams.hpp:50
View< double **[3]> qp_u
Definition beams.hpp:56
View< double[3]> gravity
Definition beams.hpp:38
View< double **[3]> qp_u_dot
Definition beams.hpp:58
View< double **[3]> qp_omega
Definition beams.hpp:62
View< double **[3]> qp_x0
Definition beams.hpp:53
View< double *[6]> element_mu
Definition beams.hpp:36
View< double **[6]> qp_Fe
Definition beams.hpp:66
View< size_t * > num_nodes_per_element
Definition beams.hpp:31
View< double **[6]> node_u_dot
Definition beams.hpp:43
View< double **[3]> qp_u_prime
Definition beams.hpp:57
View< double **[7]> node_u
Definition beams.hpp:42
Functor to calculate Jacobians and unit tangent vectors at quadrature points for beam elements.
Definition calculate_jacobian.hpp:22
Interpolates quadrature point positions from nodal positions using shape functions.
Definition interpolate_QP_position.hpp:17
A Kernel which interpolates a rotation quaternion on a given element from its nodes to all of it quad...
Definition interpolate_QP_rotation.hpp:14
Interpolates various quantities from nodes to quadrature points for beam elements.
Definition interpolate_to_quadrature_points.hpp:23