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

Kynema API: /home/runner/work/kynema/kynema/kynema/src/elements/elements.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
elements.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Kokkos_Core.hpp>
4
8
9namespace kynema {
10
19template <typename DeviceType>
20struct Elements {
24
25 Elements() : beams(0U, 0U, 0U), masses(0U), springs(0U) {}
26
28 : beams(std::move(b)), masses(std::move(m)), springs(std::move(s)) {}
29
31 [[nodiscard]] size_t NumElementsInSystem() const {
32 return beams.num_elems + masses.num_elems + springs.num_elems;
33 }
34
41 [[nodiscard]] Kokkos::View<size_t*, DeviceType> NumberOfNodesPerElement() const {
42 using RangePolicy = Kokkos::RangePolicy<typename DeviceType::execution_space>;
43 const auto result = Kokkos::View<size_t*, DeviceType>(
44 Kokkos::view_alloc("num_nodes_per_element", Kokkos::WithoutInitializing),
46 );
47
48 // Beams
49 auto beams_num_nodes_per_element = beams.num_nodes_per_element;
50 auto beams_range = RangePolicy(0, beams.num_elems);
51 Kokkos::parallel_for(
52 beams_range,
53 KOKKOS_LAMBDA(size_t element) { result(element) = beams_num_nodes_per_element(element); }
54 );
55
56 // Masses
57 auto beams_offset = beams.num_elems;
58 auto masses_num_nodes_per_element = masses.num_nodes_per_element;
59 auto masses_range = RangePolicy(0, masses.num_elems);
60 Kokkos::parallel_for(
61 masses_range,
62 KOKKOS_LAMBDA(size_t element) {
63 result(element + beams_offset) = masses_num_nodes_per_element(element);
64 }
65 );
66
67 // Springs
68 auto beams_and_masses_offset = beams_offset + masses.num_elems;
69 auto springs_num_nodes_per_element = springs.num_nodes_per_element;
70 auto springs_range = RangePolicy(0, springs.num_elems);
71 Kokkos::parallel_for(
72 springs_range,
73 KOKKOS_LAMBDA(size_t element) {
74 result(element + beams_and_masses_offset) = springs_num_nodes_per_element(element);
75 }
76 );
77
78 return result;
79 }
80
87 [[nodiscard]] Kokkos::View<size_t**, DeviceType> NodeStateIndices() const {
88 using RangePolicy = Kokkos::RangePolicy<typename DeviceType::execution_space>;
89 const auto max_nodes = std::max(beams.max_elem_nodes, springs.num_elems > 0 ? 2UL : 1UL);
90 const auto result = Kokkos::View<size_t**, DeviceType>(
91 Kokkos::view_alloc("node_state_indices", Kokkos::WithoutInitializing),
92 NumElementsInSystem(), max_nodes
93 );
94
95 // Beams
96 auto beams_num_nodes_per_element = beams.num_nodes_per_element;
97 auto beams_node_state_indices = beams.node_state_indices;
98 auto beams_range = RangePolicy(0, beams.num_elems);
99 Kokkos::parallel_for(
100 beams_range,
101 KOKKOS_LAMBDA(size_t element) {
102 const auto num_nodes = beams_num_nodes_per_element(element);
103 for (auto node = 0U; node < num_nodes; ++node) {
104 result(element, node) = beams_node_state_indices(element, node);
105 }
106 }
107 );
108
109 // Masses
110 const auto beams_offset = beams.num_elems;
111 auto masses_state_indices = masses.state_indices;
112 auto masses_range = RangePolicy(0, masses.num_elems);
113 Kokkos::parallel_for(
114 masses_range,
115 KOKKOS_LAMBDA(size_t element) {
116 // Masses always have one node per element
117 result(element + beams_offset, 0) = masses_state_indices(element);
118 }
119 );
120
121 // Springs
122 auto beams_and_masses_offset = beams_offset + masses.num_elems;
123 auto springs_node_state_indices = springs.node_state_indices;
124 auto springs_range = RangePolicy(0, springs.num_elems);
125 Kokkos::parallel_for(
126 springs_range,
127 KOKKOS_LAMBDA(size_t element) {
128 // Springs always have two nodes per element
129 result(element + beams_and_masses_offset, 0) =
130 springs_node_state_indices(element, 0);
131 result(element + beams_and_masses_offset, 1) =
132 springs_node_state_indices(element, 1);
133 }
134 );
135
136 return result;
137 }
138};
139
140} // namespace kynema
Definition calculate_constraint_output.hpp:8
Contains the field variables needed to compute the per-element contributions to the residual vector a...
Definition beams.hpp:22
A container providing handle to all structural elements present in the model.
Definition elements.hpp:20
size_t NumElementsInSystem() const
Returns the total number of elements across all types in the system.
Definition elements.hpp:31
Kokkos::View< size_t *, DeviceType > NumberOfNodesPerElement() const
Returns the number of nodes per element for each element in the system.
Definition elements.hpp:41
Masses< DeviceType > masses
Definition elements.hpp:22
Springs< DeviceType > springs
Definition elements.hpp:23
Elements(Beams< DeviceType > b, Masses< DeviceType > m, Springs< DeviceType > s)
Definition elements.hpp:27
Elements()
Definition elements.hpp:25
Beams< DeviceType > beams
Definition elements.hpp:21
Kokkos::View< size_t **, DeviceType > NodeStateIndices() const
Returns the state indices for each node of each element in the system.
Definition elements.hpp:87
Contains field variables for mass elements (aka, rigid bodies) to compute per-element contributions t...
Definition masses.hpp:17
Contains field variables for spring elements to compute per-element contributions to the residual vec...
Definition springs.hpp:14