ryujin 2.1.1 revision 955e869188d49b3c97ca7b1cf4fd9ceb0e6f46ef
solution_transfer.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception or LGPL-2.1-or-later
3// Copyright (C) 2024 - 2024 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "mpi_ensemble.h"
11#include "offline_data.h"
12#include "state_vector.h"
13
14#include <deal.II/base/parameter_acceptor.h>
15
16namespace ryujin
17{
28 template <typename Description, int dim, typename Number = double>
30 {
31 public:
36
39
40 using View =
41 typename Description::template HyperbolicSystemView<dim, Number>;
42
43 static constexpr auto problem_dimension = View::problem_dimension;
44
45 using state_type = typename View::state_type;
46
48 using HyperbolicVector = typename View::HyperbolicVector;
49
51
53
57
61 SolutionTransfer(const MPIEnsemble &mpi_ensemble,
62 const OfflineData<dim, Number> &offline_data,
63 const HyperbolicSystem &hyperbolic_system,
64 const ParabolicSystem &parabolic_system);
65
69 ~SolutionTransfer() = default;
70
72
77
84 void prepare_projection(const StateVector &old_state_vector);
85
91 unsigned int get_handle() const
92 {
93 Assert(
94 handle_ != dealii::numbers::invalid_unsigned_int,
95 dealii::ExcMessage("Invalid handle: Cannot retrieve a valid "
96 "handle. get_handle() can only be called after a "
97 "call to prepare_projection(), or set_handle()."));
98 return handle_;
99 }
100
106 void set_handle(unsigned int handle)
107 {
108 Assert(
109 handle_ == dealii::numbers::invalid_unsigned_int,
110 dealii::ExcMessage("Invalid state: Cannot set handle because we "
111 "already have a valid handle due to a prior call "
112 "to prepare_projection(), or set_handle()."));
113 handle_ = handle;
114 }
115
122 {
123 handle_ = dealii::numbers::invalid_unsigned_int;
124 }
125
138 void project(StateVector &new_state_vector);
139
140 private:
142
146
147 const MPIEnsemble &mpi_ensemble_;
148
149 dealii::SmartPointer<const OfflineData<dim, Number>> offline_data_;
150 dealii::SmartPointer<const HyperbolicSystem> hyperbolic_system_;
151 dealii::SmartPointer<const ParabolicSystem> parabolic_system_;
152
153 unsigned int handle_;
154
165 state_type get_tensor(const HyperbolicVector &U,
166 const dealii::types::global_dof_index global_i);
167
173 void add_tensor(HyperbolicVector &U,
174 const state_type &U_i,
175 const dealii::types::global_dof_index global_i);
176 };
177} // namespace ryujin
typename View::HyperbolicVector HyperbolicVector
unsigned int get_handle() const
Vectors::ScalarVector< Number > ScalarVector
typename View::state_type state_type
typename Description::ParabolicSystem ParabolicSystem
SolutionTransfer(const MPIEnsemble &mpi_ensemble, const OfflineData< dim, Number > &offline_data, const HyperbolicSystem &hyperbolic_system, const ParabolicSystem &parabolic_system)
typename Description::template HyperbolicSystemView< dim, Number > View
void prepare_projection(const StateVector &old_state_vector)
static constexpr auto problem_dimension
void set_handle(unsigned int handle)
typename Description::HyperbolicSystem HyperbolicSystem
void project(StateVector &new_state_vector)
typename View::StateVector StateVector
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
Definition: state_vector.h:31
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
Definition: state_vector.h:51
Euler::HyperbolicSystem HyperbolicSystem
Definition: description.h:32
ryujin::StubParabolicSystem ParabolicSystem
Definition: description.h:37