hyper.deal
Loading...
Searching...
No Matches
fe_evaluation_base.h
1// ---------------------------------------------------------------------
2//
3// Copyright (C) 2020 by the hyper.deal authors
4//
5// This file is part of the hyper.deal library.
6//
7// The hyper.deal library is free software; you can use it, redistribute
8// it, and/or modify it under the terms of the GNU Lesser General
9// Public License as published by the Free Software Foundation; either
10// version 3.0 of the License, or (at your option) any later version.
11// The full text of the license can be found in the file LICENSE.MD at
12// the top level directory of hyper.deal.
13//
14// ---------------------------------------------------------------------
15
16#ifndef HYPERDEAL_NDIM_FEEVALUATION_BASE
17#define HYPERDEAL_NDIM_FEEVALUATION_BASE
18
19#include <hyper.deal/base/config.h>
20
21#include <hyper.deal/matrix_free/matrix_free.h>
22
23namespace hyperdeal
24{
28 template <int dim_x,
29 int dim_v,
30 int degree,
31 int n_points,
32 typename Number,
33 typename VectorizedArrayType>
35 {
36 public:
37 static const int dim = dim_x + dim_v;
38
39 using NUMBER_ = Number;
40 using VEC_NUMBER_ = VectorizedArrayType;
42
43 static const unsigned int n_vectors = MF::VectorizedArrayTypeX::size();
44 static const unsigned int n_vectors_v = MF::VectorizedArrayTypeV::size();
45
46 static const int static_dofs =
47 dealii::Utilities::pow((degree + 1 > n_points) ? (degree + 1) : n_points,
48 dim);
49
50 using VectorizedArrayTypeX = typename MF::VectorizedArrayTypeX;
51 using VectorizedArrayTypeV = typename MF::VectorizedArrayTypeV;
52
58
62 virtual ~FEEvaluationBase() = default;
63
67 virtual void
69 cell_index);
70
74 VectorizedArrayType *
76
80 const dealii::AlignedVector<Number> *
81 get_shape_values() const;
82
86 const dealii::AlignedVector<Number> *
87 get_shape_gradients() const;
88
89 protected:
93 dealii::AlignedVector<VectorizedArrayType> data;
94
99
103 const dealii::MatrixFree<dim_x, Number, VectorizedArrayTypeX>
105
109 const dealii::MatrixFree<dim_v, Number, VectorizedArrayTypeV>
111
112 // information about the current cell/face (interpretation depends on
113 // FEEvaluation/FEFaceEvaluation)
114 unsigned int macro_cell_x;
115 unsigned int macro_cell_v;
116 unsigned int lane_y;
117 unsigned int macro;
118
122 const dealii::AlignedVector<Number> *shape_values;
123
127 const dealii::AlignedVector<Number> *shape_gradients;
128 };
129
130
131
132 template <int dim_x,
133 int dim_v,
134 int degree,
135 int n_points,
136 typename Number,
137 typename VectorizedArrayType>
138 FEEvaluationBase<dim_x,
139 dim_v,
140 degree,
141 n_points,
142 Number,
143 VectorizedArrayType>::
144 FEEvaluationBase(
146 : matrix_free(matrix_free)
147 , matrix_free_x(matrix_free.get_matrix_free_x())
148 , matrix_free_v(matrix_free.get_matrix_free_v())
149 {
150 this->data.resize(static_dofs);
151 }
152
153
154
155 template <int dim_x,
156 int dim_v,
157 int degree,
158 int n_points,
159 typename Number,
160 typename VectorizedArrayType>
161 void
162 FEEvaluationBase<dim_x,
163 dim_v,
164 degree,
165 n_points,
166 Number,
167 VectorizedArrayType>::
169 cell_index)
170 {
171 this->macro_cell_x = cell_index.x;
172 this->macro_cell_v = cell_index.v / n_vectors_v;
173 this->lane_y = cell_index.v % n_vectors_v;
174 this->macro = cell_index.macro;
175
176 Assert(this->lane_y < this->n_vectors_v,
177 dealii::ExcIndexRange(this->lane_y, 0, n_vectors_v));
178 }
179
180
181
182 template <int dim_x,
183 int dim_v,
184 int degree,
185 int n_points,
186 typename Number,
187 typename VectorizedArrayType>
188 VectorizedArrayType *
189 FEEvaluationBase<dim_x,
190 dim_v,
191 degree,
192 n_points,
193 Number,
194 VectorizedArrayType>::get_data_ptr()
195 {
196 return &data[0];
197 }
198
199
200
201 template <int dim_x,
202 int dim_v,
203 int degree,
204 int n_points,
205 typename Number,
206 typename VectorizedArrayType>
207 const dealii::AlignedVector<Number> *
208 FEEvaluationBase<dim_x,
209 dim_v,
210 degree,
211 n_points,
212 Number,
213 VectorizedArrayType>::get_shape_values() const
214 {
215 return shape_values;
216 }
217
218
219
220 template <int dim_x,
221 int dim_v,
222 int degree,
223 int n_points,
224 typename Number,
225 typename VectorizedArrayType>
226 const dealii::AlignedVector<Number> *
227 FEEvaluationBase<dim_x,
228 dim_v,
229 degree,
230 n_points,
231 Number,
232 VectorizedArrayType>::get_shape_gradients() const
233 {
234 return shape_gradients;
235 }
236
237} // namespace hyperdeal
238
239#endif
Definition fe_evaluation_base.h:35
VectorizedArrayType * get_data_ptr()
Definition fe_evaluation_base.h:194
virtual void reinit(typename MatrixFree< dim_x, dim_v, Number, VectorizedArrayType >::ID cell_index)
Definition fe_evaluation_base.h:168
const dealii::AlignedVector< Number > * get_shape_gradients() const
Definition fe_evaluation_base.h:232
FEEvaluationBase(const MatrixFree< dim_x, dim_v, Number, VectorizedArrayType > &matrix_free)
Definition fe_evaluation_base.h:144
const dealii::AlignedVector< Number > * shape_values
Definition fe_evaluation_base.h:122
dealii::AlignedVector< VectorizedArrayType > data
Definition fe_evaluation_base.h:93
const MF & matrix_free
Definition fe_evaluation_base.h:98
const dealii::MatrixFree< dim_v, Number, VectorizedArrayTypeV > & matrix_free_v
Definition fe_evaluation_base.h:110
const dealii::MatrixFree< dim_x, Number, VectorizedArrayTypeX > & matrix_free_x
Definition fe_evaluation_base.h:104
const dealii::AlignedVector< Number > * get_shape_values() const
Definition fe_evaluation_base.h:213
virtual ~FEEvaluationBase()=default
const dealii::AlignedVector< Number > * shape_gradients
Definition fe_evaluation_base.h:127
Definition matrix_free.h:40
Definition id.h:27
const unsigned int macro
Definition id.h:64
const unsigned int v
Definition id.h:59
const unsigned int x
Definition id.h:54