ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
Loading...
Searching...
No Matches
selected_components_extractor.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2024 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "state_vector.h"
11
12namespace ryujin
13{
25 template <typename Description, int dim, typename Number>
29
30 using View = typename HyperbolicSystem::template View<dim, Number>;
31
32 using StateVector = typename View::StateVector;
33 using InitialPrecomputedVector = typename View::InitialPrecomputedVector;
34
37
39
40 static void check(const std::vector<std::string> &parabolic_component_names,
41 const std::vector<std::string> &additional_names,
42 const std::vector<std::string> &selected)
43 {
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);
47 };
48
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);
56 AssertThrow(found,
57 dealii::ExcMessage(
58 "Invalid component name: \"" + entry +
59 "\" is not a valid conserved, primitive, parabolic, "
60 "precomputed, or initial component name."));
61 }
62 }
63
64 static std::vector<ScalarHostVector>
65 extract(const OfflineData<dim, Number> &offline_data,
66 const HyperbolicSystem &hyperbolic_system,
67 const ParabolicSystem &parabolic_system,
68 const StateVector &state_vector,
69 const InitialPrecomputedVector &initial_precomputed,
70 const std::vector<std::string> &additional_names,
71 const std::vector<std::reference_wrapper<const ScalarVector>>
72 &additional_vectors,
73 const std::vector<std::string> &selected)
74 {
75 /*
76 * Match the selected_components strings against conserved,
77 * primitive, and initial component names and record an index pair
78 * matching return vector position and component index:
79 */
80
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;
87
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});
94 return true;
95 }
96 return false;
97 };
98
99 if (search(View::component_names, conserved_indices))
100 ;
101 else if (search(View::primitive_component_names, primitive_indices))
102 ;
103 else if (search(View::precomputed_names, precomputed_indices))
104 ;
105 else if (search(parabolic_system.parabolic_component_names(),
106 parabolic_indices))
107 ;
108 else if (search(View::initial_precomputed_names, initial_indices))
109 ;
110 else if (search(additional_names, additional_indices))
111 ;
112 else
113 AssertThrow(false, dealii::ExcInternalError());
114 }
115
116 std::vector<ScalarHostVector> extracted_components(selected.size());
117 const auto &scalar_partitioner = offline_data.scalar_partitioner();
118 for (auto &it : extracted_components)
119 it.reinit(scalar_partitioner);
120
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);
124 }
125
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];
136 }
137 }
138
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);
142 }
143
144 for (const auto &[i, k] : parabolic_indices) {
145 const auto &parabolic = std::get<2>(state_vector);
146 extracted_components[i] = parabolic.block(k);
147 }
148
149 for (const auto &[i, k] : initial_indices) {
150 initial_precomputed.view().extract_component(extracted_components[i],
151 k);
152 }
153
154 for (const auto &[i, k] : additional_indices) {
155 additional_vectors[k].get().view().extract_component( //
156 extracted_components[i],
157 0);
158 }
159
160 return extracted_components;
161 }
162 };
163} // namespace ryujin
const auto & scalar_partitioner() const
dealii::LinearAlgebra::distributed::Vector< Number > ScalarHostVector
Euler::HyperbolicSystem HyperbolicSystem
Definition description.h:34
ryujin::StubParabolicSystem ParabolicSystem
Definition description.h:36
typename Description::ParabolicSystem ParabolicSystem
typename Description::HyperbolicSystem HyperbolicSystem
typename HyperbolicSystem::template View< dim, Number > View
typename View::InitialPrecomputedVector InitialPrecomputedVector
static void check(const std::vector< std::string > &parabolic_component_names, const std::vector< std::string > &additional_names, const std::vector< std::string > &selected)
Vectors::ScalarHostVector< Number > ScalarHostVector
static std::vector< ScalarHostVector > extract(const OfflineData< dim, Number > &offline_data, const HyperbolicSystem &hyperbolic_system, const ParabolicSystem &parabolic_system, const StateVector &state_vector, const InitialPrecomputedVector &initial_precomputed, const std::vector< std::string > &additional_names, const std::vector< std::reference_wrapper< const ScalarVector > > &additional_vectors, const std::vector< std::string > &selected)