/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_node_state_indices = create_mirror_view(WithoutInitializing, beams.node_state_indices);
49 auto host_node_x0 = create_mirror_view(WithoutInitializing, beams.node_x0);
50 auto host_node_u = create_mirror_view(WithoutInitializing, beams.node_u);
51 auto host_node_u_dot = create_mirror_view(WithoutInitializing, beams.node_u_dot);
52 auto host_node_u_ddot = create_mirror_view(WithoutInitializing, beams.node_u_ddot);
53
54 auto host_qp_weight = create_mirror_view(WithoutInitializing, beams.qp_weight);
55 auto host_qp_Mstar = create_mirror_view(WithoutInitializing, beams.qp_Mstar);
56 auto host_qp_Cstar = create_mirror_view(WithoutInitializing, beams.qp_Cstar);
57
58 auto host_shape_interp = create_mirror_view(WithoutInitializing, beams.shape_interp);
59 auto host_shape_deriv = create_mirror_view(WithoutInitializing, beams.shape_deriv);
60
61 host_gravity(0) = beams_input.gravity[0];
62 host_gravity(1) = beams_input.gravity[1];
63 host_gravity(2) = beams_input.gravity[2];
64
65 for (auto element : std::views::iota(0U, beams_input.NumElements())) {
66 // Get number of nodes and quadrature points in element
67 const auto num_nodes = beams_input.elements[element].node_ids.size();
68 const auto num_qps = beams_input.elements[element].quadrature.size();
69
70 // Create element indices and set in host mirror
71 host_num_nodes_per_element(element) = num_nodes;
72 host_num_qps_per_element(element) = num_qps;
73
74 // Populate beam node->state indices
75 for (auto node : std::views::iota(0U, num_nodes)) {
76 host_node_state_indices(element, node) = beams_input.elements[element].node_ids[node];
77 }
78
79 // Populate views for this element
81 beams_input.elements[element], nodes,
82 subview(host_node_x0, element, make_pair(0UL, num_nodes), ALL)
83 );
85 beams_input.elements[element], subview(host_qp_weight, element, make_pair(0UL, num_qps))
86 );
88 beams_input.elements[element], nodes,
89 subview(host_shape_interp, element, make_pair(0UL, num_nodes), make_pair(0UL, num_qps))
90 );
92 beams_input.elements[element], nodes,
93 subview(host_shape_deriv, element, make_pair(0UL, num_nodes), make_pair(0UL, num_qps))
94 );
96 beams_input.elements[element],
97 subview(host_qp_Mstar, element, make_pair(0UL, num_qps), ALL, ALL)
98 );
100 beams_input.elements[element],
101 subview(host_qp_Cstar, element, make_pair(0UL, num_qps), ALL, ALL)
102 );
103 }
104
105 deep_copy(beams.gravity, host_gravity);
106 deep_copy(beams.num_nodes_per_element, host_num_nodes_per_element);
107 deep_copy(beams.num_qps_per_element, host_num_qps_per_element);
108 deep_copy(beams.node_state_indices, host_node_state_indices);
109 deep_copy(beams.node_x0, host_node_x0);
110 deep_copy(beams.node_u, host_node_u);
111 deep_copy(beams.node_u_dot, host_node_u_dot);
112 deep_copy(beams.node_u_ddot, host_node_u_ddot);
113 deep_copy(beams.qp_weight, host_qp_weight);
114 deep_copy(beams.qp_Mstar, host_qp_Mstar);
115 deep_copy(beams.qp_Cstar, host_qp_Cstar);
116 deep_copy(beams.shape_interp, host_shape_interp);
117 deep_copy(beams.shape_deriv, host_shape_deriv);
118
119 deep_copy(beams.node_FX, 0.);
120 deep_copy(beams.qp_Fe, 0.);
121
122 auto range_policy = RangePolicy(0, beams.num_elems);
123
124 parallel_for(
125 "InterpolateQPPosition", range_policy,
128 beams.node_x0, beams.qp_x0
129 }
130 );
131
132 parallel_for(
133 "InterpolateQPRotation", range_policy,
136 beams.node_x0, beams.qp_r0
137 }
138 );
139
140 parallel_for(
141 "CalculateJacobian", range_policy,
145 beams.shape_deriv,
146 beams.node_x0,
147 beams.qp_x0_prime,
148 beams.qp_jacobian,
149 }
150 );
151
152 auto team_policy = TeamPolicy(static_cast<int>(beams.num_elems), Kokkos::AUTO());
153
154 parallel_for(
155 "InterpolateToQuadraturePoints", team_policy,
158 beams.shape_deriv, beams.qp_jacobian, beams.node_u, beams.node_u_dot, beams.node_u_ddot,
159 beams.qp_x0, beams.qp_r0, beams.qp_u, beams.qp_u_prime, beams.qp_r, beams.qp_r_prime,
160 beams.qp_u_dot, beams.qp_omega, beams.qp_u_ddot, beams.qp_omega_dot, beams.qp_x
161 }
162 );
163
164 return beams;
165}
166
167} // 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:57
View< double ** > qp_weight
Definition beams.hpp:46
size_t num_elems
Definition beams.hpp:26
View< double *** > shape_interp
Definition beams.hpp:70
View< double **[3]> qp_omega_dot
Definition beams.hpp:61
View< double **[4]> qp_r
Definition beams.hpp:58
View< double **[4]> qp_r_prime
Definition beams.hpp:59
View< double **[7]> qp_x
Definition beams.hpp:50
View< double *** > shape_deriv
Definition beams.hpp:71
View< double **[6]> node_u_ddot
Definition beams.hpp:42
View< double **[3]> qp_x0_prime
Definition beams.hpp:52
View< double **[6][6]> qp_Cstar
Definition beams.hpp:49
View< size_t * > num_qps_per_element
Definition beams.hpp:31
View< double **[4]> qp_r0
Definition beams.hpp:53
View< double **[7]> node_x0
Definition beams.hpp:39
View< double ** > qp_jacobian
Definition beams.hpp:47
View< size_t ** > node_state_indices
Definition beams.hpp:32
View< double **[6]> node_FX
Definition beams.hpp:43
View< double **[6][6]> qp_Mstar
Definition beams.hpp:48
View< double **[3]> qp_u
Definition beams.hpp:54
View< double[3]> gravity
Definition beams.hpp:36
View< double **[3]> qp_u_dot
Definition beams.hpp:56
View< double **[3]> qp_omega
Definition beams.hpp:60
View< double **[3]> qp_x0
Definition beams.hpp:51
View< double **[6]> qp_Fe
Definition beams.hpp:64
View< size_t * > num_nodes_per_element
Definition beams.hpp:30
View< double **[6]> node_u_dot
Definition beams.hpp:41
View< double **[3]> qp_u_prime
Definition beams.hpp:55
View< double **[7]> node_u
Definition beams.hpp:40
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