DiFfRG
Loading...
Searching...
No Matches
data.hh
Go to the documentation of this file.
1#pragma once
2
3// external libraries
4#include <deal.II/base/function.h>
5#include <deal.II/dofs/dof_handler.h>
6#include <deal.II/lac/vector.h>
7#include <deal.II/numerics/vector_tools.h>
8
9// DiFfRG
12
13namespace DiFfRG
14{
15 using namespace dealii;
16
17 namespace internal
18 {
19 template <uint dim, typename NumberType> class FunctionFromLambda : public Function<dim, NumberType>
20 {
21 using FUN = std::function<void(const Point<dim> &, Vector<NumberType> &)>;
22
23 public:
24 FunctionFromLambda(FUN &&fun_, uint components) : Function<dim, NumberType>(components), fun(std::move(fun_)) {}
25 virtual void vector_value(const Point<dim> &p, Vector<NumberType> &values) const override { fun(p, values); }
26
27 private:
29 };
30 } // namespace internal
31
39 template <typename NT = double> class FlowingVariables : public AbstractFlowingVariables<NT>
40 {
41 public:
42 using NumberType = NT;
43
48
55 template <typename Model> void interpolate(const Model &model)
56 {
57 std::vector<uint> block_structure{0};
58 block_structure.push_back(Model::Components::count_variables());
59 m_data = (block_structure);
60 if (m_data.n_blocks() > 1) model.initial_condition_variables(m_data.block(1));
61 }
62
68 virtual BlockVector<NumberType> &data() override { return m_data; }
69 virtual const BlockVector<NumberType> &data() const override { return m_data; }
70
76 virtual Vector<NumberType> &spatial_data() override { return m_data.block(0); }
77 virtual const Vector<NumberType> &spatial_data() const override { return m_data.block(0); }
78
84 virtual Vector<NumberType> &variable_data() override { return m_data.block(1); }
85 virtual const Vector<NumberType> &variable_data() const override { return m_data.block(1); }
86
87 private:
88 BlockVector<NumberType> m_data;
89 };
90
91 namespace FE
92 {
100 template <typename Discretization>
101 class FlowingVariables : public AbstractFlowingVariables<typename Discretization::NumberType>
102 {
103 public:
104 using NumberType = typename Discretization::NumberType;
105 using Components = typename Discretization::Components;
106 static constexpr uint dim = Discretization::dim;
107
113 FlowingVariables(const Discretization &discretization)
115 {
116 }
117
124 template <typename Model> void interpolate(const Model &model)
125 {
126 auto block_structure = discretization.get_block_structure();
127 m_data = (block_structure);
128
129 if constexpr (Model::Components::count_fe_functions() > 0) {
130 auto interpolating_function = [&model](const auto &p, auto &values) { model.initial_condition(p, values); };
131 internal::FunctionFromLambda<dim, NumberType> initial_condition_function(std::move(interpolating_function),
132 dof_handler.get_fe().n_components());
133 VectorTools::interpolate(dof_handler, initial_condition_function, m_data.block(0));
134 }
135 if (m_data.n_blocks() > 1) model.initial_condition_variables(m_data.block(1));
136 }
137
143 virtual BlockVector<NumberType> &data() override { return m_data; }
144 virtual const BlockVector<NumberType> &data() const override { return m_data; }
145
151 virtual Vector<NumberType> &spatial_data() override { return m_data.block(0); }
152 virtual const Vector<NumberType> &spatial_data() const override { return m_data.block(0); }
153
159 virtual Vector<NumberType> &variable_data() override { return m_data.block(1); }
160 virtual const Vector<NumberType> &variable_data() const override { return m_data.block(1); }
161
162 private:
163 const Discretization &discretization;
164 const DoFHandler<dim> &dof_handler;
165 BlockVector<NumberType> m_data;
166 };
167 } // namespace FE
168
169 namespace FV
170 {
171 template <typename Discretization>
173 } // namespace FV
174
175} // namespace DiFfRG
A class to set up initial data for whatever discretization we have chosen. Also used to switch/manage...
Definition abstract_data.hh:18
A class to set up initial data for whatever discretization we have chosen. Also used to switch/manage...
Definition data.hh:102
void interpolate(const Model &model)
Interpolates the initial condition from a numerical model.
Definition data.hh:124
virtual BlockVector< NumberType > & data() override
Obtain the data vector holding both spatial (block 0) and variable (block 1) data.
Definition data.hh:143
virtual Vector< NumberType > & spatial_data() override
Obtain the spatial data vector.
Definition data.hh:151
virtual const BlockVector< NumberType > & data() const override
Definition data.hh:144
virtual const Vector< NumberType > & spatial_data() const override
Definition data.hh:152
typename Discretization::Components Components
Definition data.hh:105
typename Discretization::NumberType NumberType
Definition data.hh:104
const DoFHandler< dim > & dof_handler
Definition data.hh:164
static constexpr uint dim
Definition data.hh:106
const Discretization & discretization
Definition data.hh:163
virtual Vector< NumberType > & variable_data() override
Obtain the variable data vector.
Definition data.hh:159
virtual const Vector< NumberType > & variable_data() const override
Definition data.hh:160
FlowingVariables(const Discretization &discretization)
Construct a new Flowing Variables object.
Definition data.hh:113
BlockVector< NumberType > m_data
Definition data.hh:165
A class to set up initial data for whatever discretization we have chosen. Also used to switch/manage...
Definition data.hh:40
void interpolate(const Model &model)
Interpolates the initial condition from a numerical model.
Definition data.hh:55
virtual Vector< NumberType > & variable_data() override
Obtain the variable data vector.
Definition data.hh:84
virtual const Vector< NumberType > & spatial_data() const override
Definition data.hh:77
virtual Vector< NumberType > & spatial_data() override
Obtain the spatial data vector.
Definition data.hh:76
BlockVector< NumberType > m_data
Definition data.hh:88
virtual const BlockVector< NumberType > & data() const override
Definition data.hh:69
virtual const Vector< NumberType > & variable_data() const override
Definition data.hh:85
FlowingVariables()
Construct a new Flowing Variables object.
Definition data.hh:47
virtual BlockVector< NumberType > & data() override
Obtain the data vector holding both spatial (block 0) and variable (block 1) data.
Definition data.hh:68
NT NumberType
Definition data.hh:42
FUN fun
Definition data.hh:28
virtual void vector_value(const Point< dim > &p, Vector< NumberType > &values) const override
Definition data.hh:25
std::function< void(const Point< dim > &, Vector< NumberType > &)> FUN
Definition data.hh:21
FunctionFromLambda(FUN &&fun_, uint components)
Definition data.hh:24
Definition complex_math.hh:14
unsigned int uint
Definition utils.hh:22
Definition tuples.hh:117