8#include <compile_time_options.h>
14 template <
typename Description,
int dim,
typename Number>
27 static void check(
const std::vector<std::string> &additional_names,
28 const std::vector<std::string> &selected)
30 const auto search = [&](
const auto entry,
const auto &names) {
31 const auto pos = std::find(std::begin(names), std::end(names), entry);
32 return pos != std::end(names);
35 for (
const auto &entry : selected) {
36 const auto found = search(entry, View::component_names) ||
37 search(entry, View::primitive_component_names) ||
38 search(entry, View::precomputed_names) ||
39 search(entry, View::initial_precomputed_names) ||
40 search(entry, additional_names);
44 "Invalid component name: \"" + entry +
45 "\" is not a valid conserved/primitive/precomputed/initial "
50 static std::vector<ScalarVector>
55 const std::vector<std::string> &additional_names,
56 const std::vector<std::reference_wrapper<const ScalarVector>>
58 const std::vector<std::string> &selected)
66 std::vector<std::tuple<std::size_t, std::size_t>> conserved_indices;
67 std::vector<std::tuple<std::size_t, std::size_t>> primitive_indices;
68 std::vector<std::tuple<std::size_t, std::size_t>> precomputed_indices;
69 std::vector<std::tuple<std::size_t, std::size_t>> initial_indices;
70 std::vector<std::tuple<std::size_t, std::size_t>> additional_indices;
72 for (std::size_t i = 0;
const auto &entry : selected) {
73 const auto search = [&](
const auto &names,
auto &indices) {
74 const auto pos = std::find(std::begin(names), std::end(names), entry);
75 if (pos != std::end(names)) {
76 const auto index = std::distance(std::begin(names), pos);
77 indices.push_back({i++, index});
83 if (search(View::component_names, conserved_indices))
85 else if (search(View::primitive_component_names, primitive_indices))
87 else if (search(View::precomputed_names, precomputed_indices))
89 else if (search(View::initial_precomputed_names, initial_indices))
91 else if (search(additional_names, additional_indices))
94 AssertThrow(
false, dealii::ExcInternalError());
97 std::vector<ScalarVector> extracted_components(selected.size());
99 for (
auto &it : extracted_components)
100 it.reinit(scalar_partitioner);
102 for (
const auto &[i, k] : conserved_indices) {
103 const auto &U = std::get<0>(state_vector);
104 U.extract_component(extracted_components[i], k);
107 if (!primitive_indices.empty()) {
108 const auto &U = std::get<0>(state_vector);
109 const unsigned int n_owned = scalar_partitioner->locally_owned_size();
110 const auto view = hyperbolic_system.template view<dim, Number>();
111 for (
unsigned int i = 0; i < n_owned; ++i) {
112 const auto U_i = U.get_tensor(i);
113 const auto PU_i = view.to_primitive_state(U_i);
114 for (
const auto &[j, k] : primitive_indices)
115 extracted_components[j].local_element(i) = PU_i[k];
119 for (
const auto &[i, k] : precomputed_indices) {
120 const auto &prec = std::get<1>(state_vector);
121 prec.extract_component(extracted_components[i], k);
124 for (
const auto &[i, k] : initial_indices) {
125 initial_precomputed.extract_component(extracted_components[i], k);
128 for (
const auto &[i, k] : additional_indices) {
129 extracted_components[i] = additional_vectors[k];
132 return extracted_components;
const auto & scalar_partitioner() const
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
Euler::HyperbolicSystem HyperbolicSystem