16#ifndef HYPERDEAL_NDIM_FEEVALUATION_CELL
17#define HYPERDEAL_NDIM_FEEVALUATION_CELL
19#include <hyper.deal/base/config.h>
21#include <deal.II/matrix_free/fe_evaluation.h>
23#include <hyper.deal/matrix_free/fe_evaluation_base.h>
24#include <hyper.deal/matrix_free/read_write_operation.h>
25#include <hyper.deal/matrix_free/vector_access_internal.h>
40 typename VectorizedArrayType>
50 static const unsigned int dim = dim_x + dim_v;
51 static const unsigned int static_dofs_per_cell_x = dealii::Utilities::pow(degree + 1, dim_x);
52 static const unsigned int static_dofs_per_cell_v = dealii::Utilities::pow(degree + 1, dim_v);
53 static const unsigned int static_dofs_per_cell = static_dofs_per_cell_x * static_dofs_per_cell_v;
54 static const unsigned int n_q_points_x = dealii::Utilities::pow(n_points, dim_x);
55 static const unsigned int n_q_points_v = dealii::Utilities::pow(n_points, dim_v);
56 static const unsigned int n_q_points = n_q_points_x * n_q_points_v;
66 static const unsigned int n_vectors = PARENT::n_vectors;
67 static const unsigned int n_vectors_v = PARENT::n_vectors_v;
85 const unsigned int dof_no_x,
86 const unsigned int dof_no_v,
87 const unsigned int quad_no_x,
88 const unsigned int quad_no_v)
95 &phi_x.get_shape_info().
data[0].shape_gradients_collocation_eo;
107 phi_x.reinit(this->macro_cell_x);
108 phi_v.reinit(this->macro_cell_v);
117 const dealii::LinearAlgebra::distributed::Vector<Number> &src,
118 VectorizedArrayType *
data)
const
122 this->matrix_free.get_face_info(),
123 this->matrix_free.get_shape_info())
124 .template process_cell<dim, degree>(
126 VectorizedArrayType>(),
127 src.shared_vector_data(),
139 const dealii::LinearAlgebra::distributed::Vector<Number> &src)
151 dealii::LinearAlgebra::distributed::Vector<Number> &dst)
const
155 this->matrix_free.get_face_info(),
156 this->matrix_free.get_shape_info())
157 .template process_cell<dim, degree>(
159 VectorizedArrayType>(),
160 dst.shared_vector_data(),
183 inline VectorizedArrayType
196 inline VectorizedArrayType
200 unsigned int qv)
const
202 return data * phi_x.JxW(qx) *
203 phi_v.JxW(qv)[n_vectors_v == 1 ? 0 : this->lane_y];
207 inline DEAL_II_ALWAYS_INLINE
209 JxW(
unsigned int qx,
unsigned int qv)
const
211 return phi_x.JxW(qx) * phi_v.JxW(qv)[n_vectors_v == 1 ? 0 : this->lane_y];
219 inline DEAL_II_ALWAYS_INLINE
220 dealii::Tensor<1, dim_x, VectorizedArrayType>
222 const unsigned int q,
223 const unsigned int qx,
224 const unsigned int qv)
const
228 dealii::Tensor<1, dim_x, VectorizedArrayType> result;
230 const auto jacobian = phi_x.inverse_jacobian(qx);
232 for (
auto d = 0u; d < dim_x; d++)
234 result[d] = jacobian[d][0] * grad_in[q];
235 for (
auto e = 1u; e < dim_x; ++e)
237 (jacobian[d][e] * grad_in[q + e * n_q_points_x * n_q_points_v]);
248 inline DEAL_II_ALWAYS_INLINE
249 dealii::Tensor<1, dim_v, VectorizedArrayType>
251 const unsigned int q,
252 const unsigned int qx,
253 const unsigned int qv)
const
257 dealii::Tensor<1, dim_v, VectorizedArrayType> result;
259 const auto jacobian = phi_v.inverse_jacobian(qv);
261 for (
auto d = 0u; d < dim_v; d++)
264 jacobian[d][0][n_vectors_v == 1 ? 0 : this->lane_y] * grad_in[q];
265 for (
auto e = 1u; e < dim_v; ++e)
266 result[d] += (jacobian[d][e][n_vectors_v == 1 ? 0 : this->lane_y] *
267 grad_in[q + e * n_q_points_x * n_q_points_v]);
278 template <
bool do_add>
279 inline DEAL_II_ALWAYS_INLINE
282 const VectorizedArrayType values_in,
283 const unsigned int q,
284 const unsigned int qx,
285 const unsigned int qv)
const
288 phi_x.JxW(qx) * phi_v.JxW(qv)[n_vectors_v == 1 ? 0 : this->lane_y];
291 data_ptr_out[q] += values_in * jxw;
293 data_ptr_out[q] = values_in * jxw;
301 inline DEAL_II_ALWAYS_INLINE
304 const VectorizedArrayType *__restrict grad_in,
305 const unsigned int q,
306 const unsigned int qx,
307 const unsigned int qv)
const
310 phi_x.JxW(qx) * phi_v.JxW(qv)[n_vectors_v == 1 ? 0 : this->lane_y];
311 const auto jacobian = phi_x.inverse_jacobian(qx);
313 for (
auto d = 0u; d < dim_x; d++)
315 auto new_val = jacobian[0][d] * grad_in[0];
316 for (
auto e = 1u; e < dim_x; ++e)
317 new_val += (jacobian[e][d] * grad_in[e]);
318 data_ptr_out[q + d * n_q_points_x * n_q_points_v] = new_val * jxw;
327 inline DEAL_II_ALWAYS_INLINE
330 const VectorizedArrayType *__restrict grad_in,
331 const unsigned int q,
332 const unsigned int qx,
333 const unsigned int qv)
const
336 phi_x.JxW(qx) * phi_v.JxW(qv)[n_vectors_v == 1 ? 0 : this->lane_y];
337 const auto jacobian = phi_v.inverse_jacobian(qv);
339 for (
auto d = 0u; d < dim_v; d++)
342 jacobian[0][d][n_vectors_v == 1 ? 0 : this->lane_y] * grad_in[0];
343 for (
auto e = 1u; e < dim_v; ++e)
344 new_val += (jacobian[e][d][n_vectors_v == 1 ? 0 : this->lane_y] *
346 data_ptr_out[q + d * n_q_points_x * n_q_points_v] = new_val * jxw;
357 inline dealii::Point<dim, VectorizedArrayType>
360 dealii::Point<dim, VectorizedArrayType> temp;
362 auto t1 = this->phi_x.quadrature_point(q % n_q_points_x);
363 for (
int i = 0; i < dim_x; i++)
365 auto t2 = this->phi_v.quadrature_point(q / n_q_points_x);
366 for (
int i = 0; i < dim_v; i++)
367 temp[i + dim_x] = t2[i][n_vectors_v == 1 ? 0 : this->lane_y];
372 inline dealii::Point<dim, VectorizedArrayType>
375 dealii::Point<dim, VectorizedArrayType> temp;
377 auto t1 = this->phi_x.quadrature_point(qx);
378 for (
int i = 0; i < dim_x; i++)
380 auto t2 = this->phi_v.quadrature_point(qv);
381 for (
int i = 0; i < dim_v; i++)
382 temp[i + dim_x] = t2[i][n_vectors_v == 1 ? 0 : this->lane_y];
387 inline dealii::Point<dim_v, VectorizedArrayType>
388 get_quadrature_point_v(
const unsigned int qv)
const
390 dealii::Point<dim_v, VectorizedArrayType> temp;
392 auto t2 = this->phi_v.quadrature_point(qv);
393 for (
int i = 0; i < dim_v; i++)
394 temp[i] = t2[i][n_vectors_v == 1 ? 0 : this->lane_y];
401 dealii::FEEvaluation<dim_x, degree, n_points, 1, Number, typename PARENT::VectorizedArrayTypeX> phi_x;
402 dealii::FEEvaluation<dim_v, degree, n_points, 1, Number, typename PARENT::VectorizedArrayTypeV> phi_v;
Definition fe_evaluation_base.h:35
virtual void reinit(typename MatrixFree< dim_x, dim_v, Number, VectorizedArrayType >::ID cell_index)
Definition fe_evaluation_base.h:168
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 > * shape_gradients
Definition fe_evaluation_base.h:127
Definition fe_evaluation_cell.h:47
DEAL_II_ALWAYS_INLINE dealii::Tensor< 1, dim_x, VectorizedArrayType > get_gradient_x(const VectorizedArrayType *__restrict grad_in, const unsigned int q, const unsigned int qx, const unsigned int qv) const
Definition fe_evaluation_cell.h:221
void reinit(typename MatrixFree< dim_x, dim_v, Number, VectorizedArrayType >::ID cell_index) override
Definition fe_evaluation_cell.h:103
unsigned int n_vectorization_lanes_filled() const
Definition fe_evaluation_cell.h:171
DEAL_II_ALWAYS_INLINE void submit_value(VectorizedArrayType *__restrict data_ptr_out, const VectorizedArrayType values_in, const unsigned int q, const unsigned int qx, const unsigned int qv) const
Definition fe_evaluation_cell.h:281
dealii::Point< dim, VectorizedArrayType > get_quadrature_point(const unsigned int q) const
Definition fe_evaluation_cell.h:358
void read_dof_values(const dealii::LinearAlgebra::distributed::Vector< Number > &src)
Definition fe_evaluation_cell.h:138
DEAL_II_ALWAYS_INLINE void submit_gradient_x(VectorizedArrayType *__restrict data_ptr_out, const VectorizedArrayType *__restrict grad_in, const unsigned int q, const unsigned int qx, const unsigned int qv) const
Definition fe_evaluation_cell.h:303
void read_dof_values(const dealii::LinearAlgebra::distributed::Vector< Number > &src, VectorizedArrayType *data) const
Definition fe_evaluation_cell.h:116
DEAL_II_ALWAYS_INLINE dealii::Tensor< 1, dim_v, VectorizedArrayType > get_gradient_v(const VectorizedArrayType *__restrict grad_in, const unsigned int q, const unsigned int qx, const unsigned int qv) const
Definition fe_evaluation_cell.h:250
DEAL_II_ALWAYS_INLINE void submit_gradient_v(VectorizedArrayType *__restrict data_ptr_out, const VectorizedArrayType *__restrict grad_in, const unsigned int q, const unsigned int qx, const unsigned int qv) const
Definition fe_evaluation_cell.h:329
VectorizedArrayType submit_inplace(const VectorizedArrayType data, const unsigned int q) const
Definition fe_evaluation_cell.h:184
VectorizedArrayType submit_inplace(const VectorizedArrayType data, unsigned int, unsigned int qx, unsigned int qv) const
Definition fe_evaluation_cell.h:197
void set_dof_values(dealii::LinearAlgebra::distributed::Vector< Number > &dst) const
Definition fe_evaluation_cell.h:150
FEEvaluation(const MatrixFree< dim_x, dim_v, Number, VectorizedArrayType > &matrix_free, const unsigned int dof_no_x, const unsigned int dof_no_v, const unsigned int quad_no_x, const unsigned int quad_no_v)
Definition fe_evaluation_cell.h:83
Definition matrix_free.h:40
const internal::MatrixFreeFunctions::DoFInfo & get_dof_info() const
Definition matrix_free.templates.h:1872
Definition read_write_operation.h:37
Definition vector_access_internal.h:29
Definition vector_access_internal.h:74