4#include <Kokkos_Core.hpp>
26template <
typename DeviceType>
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>;
42 auto host_gravity = create_mirror_view(WithoutInitializing, beams.
gravity);
44 auto host_num_nodes_per_element =
46 auto host_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);
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);
59 auto host_shape_interp = create_mirror_view(WithoutInitializing, beams.
shape_interp);
60 auto host_shape_deriv = create_mirror_view(WithoutInitializing, beams.
shape_deriv);
62 host_gravity(0) = beams_input.
gravity[0];
63 host_gravity(1) = beams_input.
gravity[1];
64 host_gravity(2) = beams_input.
gravity[2];
66 for (
auto element : std::views::iota(0U, beams_input.
NumElements())) {
68 const auto num_nodes = beams_input.
elements[element].node_ids.size();
69 const auto num_qps = beams_input.
elements[element].quadrature.size();
72 host_num_nodes_per_element(element) = num_nodes;
73 host_num_qps_per_element(element) = num_qps;
76 for (
auto i : std::views::iota(0U, 6U)) {
77 host_element_mu(element, i) = beams_input.
elements[element].mu[i];
81 for (
auto node : std::views::iota(0U, num_nodes)) {
82 host_node_state_indices(element, node) = beams_input.
elements[element].node_ids[node];
87 beams_input.
elements[element], nodes,
88 subview(host_node_x0, element, make_pair(0UL, num_nodes), ALL)
91 beams_input.
elements[element], subview(host_qp_weight, element, make_pair(0UL, num_qps))
94 beams_input.
elements[element], nodes,
95 subview(host_shape_interp, element, make_pair(0UL, num_nodes), make_pair(0UL, num_qps))
98 beams_input.
elements[element], nodes,
99 subview(host_shape_deriv, element, make_pair(0UL, num_nodes), make_pair(0UL, num_qps))
103 subview(host_qp_Mstar, element, make_pair(0UL, num_qps), ALL, ALL)
107 subview(host_qp_Cstar, element, make_pair(0UL, num_qps), ALL, ALL)
114 deep_copy(beams.
gravity, host_gravity);
116 deep_copy(beams.
node_x0, host_node_x0);
117 deep_copy(beams.
node_u, host_node_u);
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);
127 deep_copy(beams.
qp_Fe, 0.);
129 auto range_policy = RangePolicy(0, beams.
num_elems);
132 "InterpolateQPPosition", range_policy,
140 "InterpolateQPRotation", range_policy,
148 "CalculateJacobian", range_policy,
159 auto team_policy = TeamPolicy(
static_cast<int>(beams.
num_elems), Kokkos::AUTO());
162 "InterpolateToQuadraturePoints", team_policy,
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
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