/home/runner/work/kynema/kynema/kynema/src/solver/copy_constraints_transpose_to_sparse_matrix.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/solver/copy_constraints_transpose_to_sparse_matrix.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
copy_constraints_transpose_to_sparse_matrix.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <KokkosSparse.hpp>
4#include <Kokkos_Core.hpp>
5
7
8namespace kynema::solver {
9
14template <typename CrsMatrixType>
16 using DeviceType = typename CrsMatrixType::device_type;
17 using RowDataType = typename CrsMatrixType::values_type::non_const_type;
18 using ColIdxType = typename CrsMatrixType::staticcrsgraph_type::entries_type::non_const_type;
19 using TeamPolicy = typename Kokkos::TeamPolicy<typename DeviceType::execution_space>;
20 using member_type = typename TeamPolicy::member_type;
21 template <typename ValueType>
22 using View = Kokkos::View<ValueType, DeviceType>;
23 template <typename ValueType>
25
34 CrsMatrixType sparse;
35
38 const auto constraint = member.league_rank();
39 constexpr bool is_sorted = true;
40 constexpr auto force_atomic =
41 !std::is_same_v<typename DeviceType::execution_space, Kokkos::Serial>;
42 const auto num_cols =
43 static_cast<int>(row_range(constraint).second - row_range(constraint).first);
44 const auto first_col = static_cast<typename CrsMatrixType::ordinal_type>(
45 row_range(constraint).first + num_system_cols
46 );
47 const auto num_base_dofs =
48 static_cast<int>(count_active_dofs(base_node_freedom_signature(constraint)));
49 const auto base_start_row = static_cast<int>(base_node_freedom_table(constraint, 0));
51 Kokkos::parallel_for(
52 Kokkos::TeamVectorRange(member, base_start_row, base_end_row),
53 [&](int i) {
54 const auto row_number = i - base_start_row;
55 const auto hint = static_cast<typename CrsMatrixType::ordinal_type>(0);
56 auto row = sparse.row(i);
57
58 auto offset = KokkosSparse::findRelOffset(
59 &(row.colidx(0)), row.length, first_col, hint, is_sorted
60 );
61 for (auto entry = 0; entry < num_cols; ++entry, ++offset) {
62 if constexpr (force_atomic) {
63 Kokkos::atomic_add(
64 &row.value(offset), base_dense(constraint, row_number, entry)
65 );
66 } else {
67 row.value(offset) = base_dense(constraint, row_number, entry);
68 }
69 }
70 }
71 );
72
73 const auto num_target_dofs =
74 static_cast<int>(count_active_dofs(target_node_freedom_signature(constraint)));
75 const auto target_start_row = static_cast<int>(target_node_freedom_table(constraint, 0));
77 Kokkos::parallel_for(
78 Kokkos::TeamVectorRange(member, target_start_row, target_end_row),
79 [&](int i) {
80 const auto row_number = i - target_start_row;
81 const auto hint = static_cast<typename CrsMatrixType::ordinal_type>(0);
82 auto row = sparse.row(i);
83
84 auto offset = KokkosSparse::findRelOffset(
85 &(row.colidx(0)), row.length, first_col, hint, is_sorted
86 );
87 for (auto entry = 0; entry < num_cols; ++entry, ++offset) {
88 if constexpr (force_atomic) {
89 Kokkos::atomic_add(
90 &row.value(offset), target_dense(constraint, row_number, entry)
91 );
92 } else {
93 row.value(offset) = target_dense(constraint, row_number, entry);
94 }
95 }
96 }
97 );
98 }
99};
100} // namespace kynema::solver
Definition calculate_error_sum_squares.hpp:5
A Kernel which copies the transpose gradient matrix contributions for the base and target node of a c...
Definition copy_constraints_transpose_to_sparse_matrix.hpp:15
CrsMatrixType sparse
Definition copy_constraints_transpose_to_sparse_matrix.hpp:34
ConstView< double *[6][6]> base_dense
Definition copy_constraints_transpose_to_sparse_matrix.hpp:32
ConstView< Kokkos::pair< size_t, size_t > * > row_range
Definition copy_constraints_transpose_to_sparse_matrix.hpp:27
ConstView< dof::FreedomSignature * > base_node_freedom_signature
Definition copy_constraints_transpose_to_sparse_matrix.hpp:28
typename CrsMatrixType::staticcrsgraph_type::entries_type::non_const_type ColIdxType
Definition copy_constraints_transpose_to_sparse_matrix.hpp:18
typename CrsMatrixType::values_type::non_const_type RowDataType
Definition copy_constraints_transpose_to_sparse_matrix.hpp:17
ConstView< size_t *[6]> target_node_freedom_table
Definition copy_constraints_transpose_to_sparse_matrix.hpp:31
ConstView< double *[6][6]> target_dense
Definition copy_constraints_transpose_to_sparse_matrix.hpp:33
Kokkos::View< ValueType, DeviceType > View
Definition copy_constraints_transpose_to_sparse_matrix.hpp:22
typename Kokkos::TeamPolicy< typename DeviceType::execution_space > TeamPolicy
Definition copy_constraints_transpose_to_sparse_matrix.hpp:19
KOKKOS_FUNCTION void operator()(member_type member) const
Definition copy_constraints_transpose_to_sparse_matrix.hpp:37
typename CrsMatrixType::device_type DeviceType
Definition copy_constraints_transpose_to_sparse_matrix.hpp:16
typename TeamPolicy::member_type member_type
Definition copy_constraints_transpose_to_sparse_matrix.hpp:20
ConstView< dof::FreedomSignature * > target_node_freedom_signature
Definition copy_constraints_transpose_to_sparse_matrix.hpp:29
typename View< ValueType >::const_type ConstView
Definition copy_constraints_transpose_to_sparse_matrix.hpp:24
size_t num_system_cols
Definition copy_constraints_transpose_to_sparse_matrix.hpp:26
ConstView< size_t *[6]> base_node_freedom_table
Definition copy_constraints_transpose_to_sparse_matrix.hpp:30