40 static void check(
const std::vector<std::string> ¶bolic_component_names,
41 const std::vector<std::string> &additional_names,
42 const std::vector<std::string> &selected)
44 const auto search = [&](
const auto entry,
const auto &names) {
45 const auto pos = std::find(std::begin(names), std::end(names), entry);
46 return pos != std::end(names);
49 for (
const auto &entry : selected) {
50 const auto found = search(entry, View::component_names) ||
51 search(entry, View::primitive_component_names) ||
52 search(entry, parabolic_component_names) ||
53 search(entry, View::precomputed_names) ||
54 search(entry, View::initial_precomputed_names) ||
55 search(entry, additional_names);
58 "Invalid component name: \"" + entry +
59 "\" is not a valid conserved, primitive, parabolic, "
60 "precomputed, or initial component name."));
70 const std::vector<std::string> &additional_names,
71 const std::vector<std::reference_wrapper<const ScalarVector>>
73 const std::vector<std::string> &selected)
81 std::vector<std::tuple<std::size_t, std::size_t>> conserved_indices;
82 std::vector<std::tuple<std::size_t, std::size_t>> primitive_indices;
83 std::vector<std::tuple<std::size_t, std::size_t>> precomputed_indices;
84 std::vector<std::tuple<std::size_t, std::size_t>> parabolic_indices;
85 std::vector<std::tuple<std::size_t, std::size_t>> initial_indices;
86 std::vector<std::tuple<std::size_t, std::size_t>> additional_indices;
88 for (std::size_t i = 0;
const auto &entry : selected) {
89 const auto search = [&](
const auto &names,
auto &indices) {
90 const auto pos = std::find(std::begin(names), std::end(names), entry);
91 if (pos != std::end(names)) {
92 const auto index = std::distance(std::begin(names), pos);
93 indices.push_back({i++, index});
99 if (search(View::component_names, conserved_indices))
101 else if (search(View::primitive_component_names, primitive_indices))
103 else if (search(View::precomputed_names, precomputed_indices))
105 else if (search(parabolic_system.parabolic_component_names(),
108 else if (search(View::initial_precomputed_names, initial_indices))
110 else if (search(additional_names, additional_indices))
113 AssertThrow(
false, dealii::ExcInternalError());
116 std::vector<ScalarHostVector> extracted_components(selected.size());
118 for (
auto &it : extracted_components)
119 it.reinit(scalar_partitioner);
121 for (
const auto &[i, k] : conserved_indices) {
122 const auto &U = std::get<0>(state_vector);
123 U.view().extract_component(extracted_components[i], k);
126 if (!primitive_indices.empty()) {
127 const auto &U = std::get<0>(state_vector);
128 const auto U_view = U.view();
129 const unsigned int n_owned = scalar_partitioner->locally_owned_size();
130 const auto view = hyperbolic_system.template view<dim, Number>();
131 for (
unsigned int i = 0; i < n_owned; ++i) {
132 const auto U_i = U_view.read_tensor(i);
133 const auto PU_i = view.to_primitive_state(U_i);
134 for (
const auto &[j, k] : primitive_indices)
135 extracted_components[j].local_element(i) = PU_i[k];
139 for (
const auto &[i, k] : precomputed_indices) {
140 const auto &prec = std::get<1>(state_vector);
141 prec.view().extract_component(extracted_components[i], k);
144 for (
const auto &[i, k] : parabolic_indices) {
145 const auto ¶bolic = std::get<2>(state_vector);
146 extracted_components[i] = parabolic.block(k);
149 for (
const auto &[i, k] : initial_indices) {
150 initial_precomputed.view().extract_component(extracted_components[i],
154 for (
const auto &[i, k] : additional_indices) {
155 additional_vectors[k].get().view().extract_component(
156 extracted_components[i],
160 return extracted_components;