ryujin 2.1.1 revision 46bf70e400e423a8ffffe8300887eeb35b8dfb2c
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 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
11
12#include <deal.II/lac/la_parallel_block_vector.h>
13
14namespace ryujin
15{
16#ifndef DOXYGEN
17 /* Forward declaration */
18 template <int dim, typename Number>
19 class OfflineData;
20#endif
21
27 namespace Vectors
28 {
32 template <typename Number>
33 using ScalarVector = dealii::LinearAlgebra::distributed::Vector<Number>;
34
38 template <typename Number>
39 using BlockVector = dealii::LinearAlgebra::distributed::BlockVector<Number>;
40
49 template <typename Number, unsigned int problem_dim, unsigned int prec_dim>
50 using StateVector = std::tuple<
52 MultiComponentVector<Number, prec_dim> /*precomputed values*/,
53 BlockVector<Number> /*parabolic state vector*/>;
54
55
56 template <
57 typename Description,
58 int dim,
59 typename Number,
60 typename View =
61 typename Description::template HyperbolicSystemView<dim, Number>,
62 int problem_dimension = View::problem_dimension,
63 int prec_dimension = View::n_precomputed_values>
66 [[maybe_unused]],
67 const OfflineData<dim, Number> &offline_data [[maybe_unused]])
68 {
69#ifdef DEBUG
70 auto &[U, precomputed, V] = state_vector;
71
72 const unsigned int n_owned = offline_data.n_locally_owned();
73 const auto &partitioner = offline_data.scalar_partitioner();
74
75 for (unsigned int i = 0; i < n_owned; ++i) {
76 if (!offline_data.affine_constraints().is_constrained(
77 partitioner->local_to_global(i)))
78 continue;
79 constexpr auto nan = std::numeric_limits<Number>::signaling_NaN();
80 U.write_tensor(dealii::Tensor<1, problem_dimension, Number>() * nan, i);
81 }
82#endif
83 }
84
85
86 template <
87 typename Description,
88 int dim,
89 typename Number,
90 typename View =
91 typename Description::template HyperbolicSystemView<dim, Number>,
92 int problem_dimension = View::problem_dimension,
93 int prec_dimension = View::n_precomputed_values>
96 [[maybe_unused]],
97 const OfflineData<dim, Number> &offline_data [[maybe_unused]])
98 {
99#ifdef DEBUG
100 auto &[U, precomputed, V] = state_vector;
101
102 constexpr auto nan = std::numeric_limits<Number>::signaling_NaN();
103 const unsigned int n_owned = offline_data.n_locally_owned();
104 const auto block_size = offline_data.n_parabolic_state_vectors();
105
106 for (unsigned int i = 0; i < n_owned; ++i) {
107 precomputed.write_tensor(
108 dealii::Tensor<1, prec_dimension, Number>() * nan, i);
109 for (unsigned int b = 0; b < block_size; ++b) {
110 V.block(b).local_element(i) = nan;
111 }
112 }
113#endif
114 }
115
116
121 template <
122 typename Description,
123 int dim,
124 typename Number,
125 typename View =
126 typename Description::template HyperbolicSystemView<dim, Number>,
127 int problem_dimension = View::problem_dimension,
128 int prec_dimension = View::n_precomputed_values>
131 const OfflineData<dim, Number> &offline_data)
132 {
133 auto &[U, precomputed, V] = state_vector;
134 U.reinit(offline_data.hyperbolic_vector_partitioner());
135 precomputed.reinit(offline_data.precomputed_vector_partitioner());
136
137 const auto block_size = offline_data.n_parabolic_state_vectors();
138 V.reinit(block_size);
139 for (unsigned int i = 0; i < block_size; ++i) {
140 V.block(i).reinit(offline_data.scalar_partitioner());
141 }
142
143#ifdef DEBUG
144 /* Poison all vectors: */
145 using state_type = typename View::state_type;
146
147 constexpr auto nan = std::numeric_limits<Number>::signaling_NaN();
148
149 const unsigned int n_owned = offline_data.n_locally_owned();
150 for (unsigned int i = 0; i < n_owned; ++i) {
151 U.write_tensor(state_type{} * nan, i);
152 precomputed.write_tensor(
153 dealii::Tensor<1, prec_dimension, Number>() * nan, i);
154 for (unsigned int b = 0; b < block_size; ++b) {
155 V.block(b).local_element(i) = nan;
156 }
157 }
158#endif
159 }
160 } // namespace Vectors
161
162} // namespace ryujin
const auto & n_parabolic_state_vectors() const
Definition: offline_data.h:147
const auto & scalar_partitioner() const
Definition: offline_data.h:130
const auto & n_locally_owned() const
Definition: offline_data.h:175
const auto & hyperbolic_vector_partitioner() const
Definition: offline_data.h:136
const auto & precomputed_vector_partitioner() const
Definition: offline_data.h:142
void reinit_state_vector(StateVector< Number, problem_dimension, prec_dimension > &state_vector, const OfflineData< dim, Number > &offline_data)
Definition: state_vector.h:129
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
Definition: state_vector.h:33
void debug_poison_constrained_dofs(StateVector< Number, problem_dimension, prec_dimension > &state_vector, const OfflineData< dim, Number > &offline_data)
Definition: state_vector.h:64
dealii::LinearAlgebra::distributed::BlockVector< Number > BlockVector
Definition: state_vector.h:39
void debug_poison_precomputed_values(StateVector< Number, problem_dimension, prec_dimension > &state_vector, const OfflineData< dim, Number > &offline_data)
Definition: state_vector.h:94
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
Definition: state_vector.h:53
Euler::Description Description