1 #ifndef KATOPTRON_WEIGHTSLIST_H
2 #define KATOPTRON_WEIGHTSLIST_H
10 #include <Tpetra_Map.hpp>
11 #include <Tpetra_Vector.hpp>
12 #include <Teuchos_RCP.hpp>
13 #include <Kokkos_ViewFactory.hpp>
26 template <
typename scalar>
44 WeightsList(
Problem &pbl, Teuchos::RCP<Map> map, Teuchos::RCP<ElementsList> elementsList);
130 template <
typename scalar>
134 const int ensemble_size = ET::size;
138 weights_number = pbl.
Weights.size();
141 std::vector<std::vector<global_ordinal_type>> WeightNodes = {};
143 for (
auto i = 0; i < weights_number; ++i)
145 std::vector<global_ordinal_type> tmpMyWeightNodes = {};
146 std::vector<global_ordinal_type> myWeightNodes = {};
148 for (
auto j = 0; j < pbl.
Weights[i]->nodes.size(); ++j)
149 tmpMyWeightNodes.push_back(pbl.
Weights[i]->nodes[j]->row);
151 std::sort(tmpMyWeightNodes.begin(), tmpMyWeightNodes.end());
153 if (tmpMyWeightNodes.size() >= 1)
154 myWeightNodes.push_back(tmpMyWeightNodes[0]);
156 for (
auto ii = 1; ii < tmpMyWeightNodes.size(); ++ii)
157 if (tmpMyWeightNodes[ii] != tmpMyWeightNodes[ii - 1])
158 myWeightNodes.push_back(tmpMyWeightNodes[ii]);
160 WeightNodes.push_back(myWeightNodes);
161 if (maxNumNodesPerWeight < myWeightNodes.size())
162 maxNumNodesPerWeight = myWeightNodes.size();
167 weights_nodesList = Kokkos::View<int **, Kokkos::LayoutRight>(
"R", weights_number, weights_nodes + maxNumNodesPerWeight);
169 for (
auto i = 0; i < weights_number; ++i)
171 weights_nodesList(i, weights_size) = WeightNodes[i].size();
173 for (
auto j = 0; j < WeightNodes[i].size(); ++j)
174 weights_nodesList(i, weights_nodes + j) = WeightNodes[i][j];
178 weights_values = weights_dofs + numDPN;
179 weights_values_list = Kokkos::View<scalar **, Kokkos::LayoutRight>(
"R", weights_number, 2 * numDPN);
180 for (
auto i = 0; i < weights_number; ++i)
182 for (
auto j = 0; j < numDPN; ++j)
183 if (pbl.
Weights[i]->which_dof[j])
184 weights_values_list(i, weights_dofs + j) = 1;
186 weights_values_list(i, weights_dofs + j) = 0;
188 for (
int s = 0; s < ensemble_size; ++s)
190 ET::coeff(weights_values_list(i, weights_values + 0), s) = pbl.
Weights[i]->x_values[s];
191 ET::coeff(weights_values_list(i, weights_values + 1), s) = pbl.
Weights[i]->y_values[s];
192 ET::coeff(weights_values_list(i, weights_values + 2), s) = pbl.
Weights[i]->z_values[s];
194 ET::coeff(weights_values_list(i, weights_values + 3), s) = pbl.
Weights[i]->T_values[s];
200 #endif //KATOPTRON_WEIGHTSLIST_H