ryujin 2.1.1 revision b04fb4aba7bd97ddfa5994a6b4b6e8586eb15db2
Loading...
Searching...
No Matches
state_vector.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 "computing_timer.h"
12
13#include <algorithm>
14#include <concepts>
15#include <limits>
16#include <vector>
17
18namespace ryujin
19{
20#ifndef DOXYGEN
21 /* Forward declaration */
22 template <int dim, typename Number>
23 class OfflineData;
24#endif
25
31 template <typename Number>
32 using ScalarHostVector = dealii::LinearAlgebra::distributed::Vector<Number>;
33
34
39 template <typename Number>
41
42
51 template <typename Number>
57
58
64 enum class StateVectorPart {
68 };
69
70
75 template <typename MemorySpace,
76 typename Number,
77 std::same_as<StateVectorPart>... Parts>
79 [[maybe_unused]],
80 Parts... parts [[maybe_unused]])
81 {
82 static_assert(sizeof...(Parts) > 0, "No state vector part selected");
83
84 if constexpr (have_separate_memory_spaces) {
85 ComputingTimer::Scope scope("time step [X] _ - memory space transfers");
86
87 const auto &[U, precomputed, parabolic] = state_vector;
88
89 const auto copy = [&](const StateVectorPart part) {
90 switch (part) {
92 U.template copy_to_memory_space<MemorySpace>();
93 break;
95 precomputed.template copy_to_memory_space<MemorySpace>();
96 break;
98 for (const auto &V : parabolic)
99 V.template copy_to_memory_space<MemorySpace>();
100 break;
101 }
102 };
103
104 (copy(parts), ...);
105 }
106 }
107
108
114 template <typename MemorySpace, typename Number>
116 [[maybe_unused]])
117 {
118 if constexpr (have_separate_memory_spaces) {
119 ComputingTimer::Scope scope("time step [X] _ - memory space transfers");
120 vector.template copy_to_memory_space<MemorySpace>();
121 }
122 }
123
124
129 template <typename MemorySpace,
130 typename Number,
131 std::same_as<StateVectorPart>... Parts>
132 void move_to_memory_space(StateVector<Number> &state_vector [[maybe_unused]],
133 Parts... parts [[maybe_unused]])
134 {
135 static_assert(sizeof...(Parts) > 0, "No state vector part selected");
136
137 if constexpr (have_separate_memory_spaces) {
138 ComputingTimer::Scope scope("time step [X] _ - memory space transfers");
139
140 auto &[U, precomputed, parabolic] = state_vector;
141
142 const auto move = [&](const StateVectorPart part) {
143 switch (part) {
145 U.template move_to_memory_space<MemorySpace>();
146 break;
148 precomputed.template move_to_memory_space<MemorySpace>();
149 break;
151 for (auto &V : parabolic)
152 V.template move_to_memory_space<MemorySpace>();
153 break;
154 }
155 };
156
157 (move(parts), ...);
158 }
159 }
160
161
167 template <typename MemorySpace, typename Number>
169 [[maybe_unused]])
170 {
171 if constexpr (have_separate_memory_spaces) {
172 ComputingTimer::Scope scope("time step [X] _ - memory space transfers");
173 vector.template move_to_memory_space<MemorySpace>();
174 }
175 }
176
177
184 template <typename MemorySpace, typename Number>
186 const Number s,
187 const Number b,
188 const StateVector<Number> &src)
189 {
190 copy_to_memory_space<MemorySpace>(
192 move_to_memory_space<MemorySpace>(
194
195 auto &dst_U = dst.U.template deal_ii_vector<MemorySpace>();
196 const auto &src_U = src.U.template deal_ii_vector<MemorySpace>();
197 dst_U.zero_out_ghost_values();
198 dst_U.sadd(s, b, src_U);
199
200 AssertDimension(dst.V.size(), src.V.size());
201
202 for (std::size_t k = 0; k < dst.V.size(); ++k) {
203 auto &dst_V_k = dst.V[k].template deal_ii_vector<MemorySpace>();
204 const auto &src_V_k = src.V[k].template deal_ii_vector<MemorySpace>();
205 dst_V_k.zero_out_ghost_values();
206 dst_V_k.sadd(s, b, src_V_k);
207 }
208 }
209
210
219 template <typename Number, typename OfflineData>
221 [[maybe_unused]],
222 const OfflineData &offline_data
223 [[maybe_unused]])
224 {
225#ifdef DEBUG
226
227 move_to_memory_space<dealii::MemorySpace::Host>(
228 state_vector,
231
232 auto &[U, prec, V] = state_vector;
233
234 constexpr auto nan = std::numeric_limits<Number>::signaling_NaN();
235
236 const unsigned int n_owned = offline_data.n_locally_owned();
237 const unsigned int n_relevant = offline_data.n_locally_relevant();
238 const auto &partitioner = offline_data.scalar_partitioner();
239
240 /*
241 * The number of components is a run time property: work on the
242 * underlying deal.II vectors with n_comp() as stride.
243 */
244 const unsigned int prob_dim = U.n_comp();
245 const unsigned int prec_dim = prec.n_comp();
246 Number *const U_data = U.deal_ii_vector().begin();
247 Number *const prec_data = prec.deal_ii_vector().begin();
248
249 for (unsigned int i = 0; i < n_owned; ++i) {
250 std::fill_n(prec_data + i * prec_dim, prec_dim, nan);
251
252 if (!offline_data.affine_constraints().is_constrained(
253 partitioner->local_to_global(i)))
254 continue;
255 std::fill_n(U_data + i * prob_dim, prob_dim, nan);
256 }
257
258 for (unsigned int i = n_owned; i < n_relevant; ++i) {
259 std::fill_n(prec_data + i * prec_dim, prec_dim, nan);
260
261 std::fill_n(U_data + i * prob_dim, prob_dim, nan);
262 }
263#endif
264 }
265} // namespace ryujin
constexpr bool have_separate_memory_spaces
Definition gpu.h:29
dealii::LinearAlgebra::distributed::Vector< Number > ScalarHostVector
void sadd(StateVector< Number > &dst, const Number s, const Number b, const StateVector< Number > &src)
void copy_to_memory_space(const StateVector< Number > &state_vector, Parts... parts)
void debug_poison_invalid_values(StateVector< Number > &state_vector, const OfflineData &offline_data)
void move_to_memory_space(StateVector< Number > &state_vector, Parts... parts)
MultiComponentVector< Number > U
std::vector< ScalarVector< Number > > V
MultiComponentVector< Number > precomputed