ryujin 2.1.1 revision 350e54cc11f3d21282bddcf3e6517944dbc508bf
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#include <deal.II/base/smartpointer.h>
16
17namespace ryujin
18{
29 template <typename Description, int dim, typename Number = double>
30 class SolutionTransfer : public dealii::ParameterAcceptor
31 {
32 public:
37
40
41 using View =
42 typename Description::template HyperbolicSystemView<dim, Number>;
43
44 static constexpr auto problem_dimension = View::problem_dimension;
45
46 using state_type = typename View::state_type;
47
49 using HyperbolicVector = typename View::HyperbolicVector;
50
52
56 static constexpr unsigned int n_bounds =
57 Description::template Limiter<dim, Number>::n_bounds;
58
62 using Bounds = Description::template Limiter<dim, Number>::Bounds;
63
65
69
73 SolutionTransfer(const MPIEnsemble &mpi_ensemble,
74 const OfflineData<dim, Number> &offline_data,
75 const HyperbolicSystem &hyperbolic_system,
76 const ParabolicSystem &parabolic_system,
77 const std::string &subsection = "/SolutionTransfer");
78
82 ~SolutionTransfer() override = default;
83
85
90
97 void prepare_projection(const StateVector &old_state_vector);
98
104 unsigned int get_handle() const
105 {
106 Assert(
107 handle_ != dealii::numbers::invalid_unsigned_int,
108 dealii::ExcMessage("Invalid handle: Cannot retrieve a valid "
109 "handle. get_handle() can only be called after a "
110 "call to prepare_projection(), or set_handle()."));
111 return handle_;
112 }
113
119 void set_handle(unsigned int handle)
120 {
121 Assert(
122 handle_ == dealii::numbers::invalid_unsigned_int,
123 dealii::ExcMessage("Invalid state: Cannot set handle because we "
124 "already have a valid handle due to a prior call "
125 "to prepare_projection(), or set_handle()."));
126 handle_ = handle;
127 }
128
135 {
136 handle_ = dealii::numbers::invalid_unsigned_int;
137 }
138
151 void project(StateVector &new_state_vector);
152
153 private:
155
159
160 typename Description::template Limiter<dim, Number>::Parameters
161 limiter_parameters_;
162
164
168
169 const MPIEnsemble &mpi_ensemble_;
170
171 dealii::SmartPointer<const OfflineData<dim, Number>> offline_data_;
172 dealii::SmartPointer<const HyperbolicSystem> hyperbolic_system_;
173 dealii::SmartPointer<const ParabolicSystem> parabolic_system_;
174
175 unsigned int handle_;
176
187 state_type get_tensor(const HyperbolicVector &U,
188 const dealii::types::global_dof_index global_i);
189
195 void add_tensor(HyperbolicVector &U,
196 const state_type &U_i,
197 const dealii::types::global_dof_index global_i);
198 };
199} // namespace ryujin
std::array< Number, n_bounds > Bounds
Definition: limiter.h:90
typename View::HyperbolicVector HyperbolicVector
SolutionTransfer(const MPIEnsemble &mpi_ensemble, const OfflineData< dim, Number > &offline_data, const HyperbolicSystem &hyperbolic_system, const ParabolicSystem &parabolic_system, const std::string &subsection="/SolutionTransfer")
unsigned int get_handle() const
Vectors::ScalarVector< Number > ScalarVector
Description::template Limiter< dim, Number >::Bounds Bounds
typename View::state_type state_type
typename Description::ParabolicSystem ParabolicSystem
~SolutionTransfer() override=default
typename Description::template HyperbolicSystemView< dim, Number > View
static constexpr unsigned int n_bounds
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