ryujin 2.1.1 revision ef0fcd4010d109b860652ece4a7b8963fb7d46b1
tensor_product_point_kernels.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 Maximilian Bergbauer
4// Copyright (C) 2020 - 2023 by the ryujin authors
5//
6
7#pragma once
8
9#include <compile_time_options.h>
10
11#include <deal.II/base/config.h>
12
13#include <deal.II/base/ndarray.h>
14#include <deal.II/base/polynomial.h>
15#include <deal.II/base/utilities.h>
16#include <deal.II/matrix_free/tensor_product_point_kernels.h>
17
18#include <deal.II/matrix_free/shape_info.h>
19
20namespace ryujin
21{
22
23 namespace internal
24 {
32 template <int dim, typename Number, typename Number2, bool add>
34 const Number2 &value,
35 Number2 *values,
36 const dealii::Point<dim, Number> &p)
37 {
38 static_assert(dim >= 0 && dim <= 3, "Only dim=0,1,2,3 implemented");
39
40 if (dim == 0) {
41 if (add)
42 values[0] += value;
43 else
44 values[0] = value;
45 } else if (dim == 1) {
46 const auto x0 = Number(1.) - p[0], x1 = p[0];
47
48 if (add) {
49 values[0] += value * x0;
50 values[1] += value * x1;
51 } else {
52 values[0] = value * x0;
53 values[1] = value * x1;
54 }
55 } else if (dim == 2) {
56 const auto x0 = Number(1.) - p[0], x1 = p[0], y0 = Number(1.) - p[1],
57 y1 = p[1];
58
59 const auto test_value_y0 = value * y0;
60 const auto test_value_y1 = value * y1;
61
62 if (add) {
63 values[0] += x0 * test_value_y0;
64 values[1] += x1 * test_value_y0;
65 values[2] += x0 * test_value_y1;
66 values[3] += x1 * test_value_y1;
67 } else {
68 values[0] = x0 * test_value_y0;
69 values[1] = x1 * test_value_y0;
70 values[2] = x0 * test_value_y1;
71 values[3] = x1 * test_value_y1;
72 }
73 } else if (dim == 3) {
74 const auto x0 = Number(1.) - p[0], x1 = p[0], y0 = Number(1.) - p[1],
75 y1 = p[1], z0 = Number(1.) - p[2], z1 = p[2];
76
77 const auto test_value_z0 = value * z0;
78 const auto test_value_z1 = value * z1;
79
80 const auto test_value_y00 = test_value_z0 * y0;
81 const auto test_value_y01 = test_value_z0 * y1;
82 const auto test_value_y10 = test_value_z1 * y0;
83 const auto test_value_y11 = test_value_z1 * y1;
84
85 if (add) {
86 values[0] += x0 * test_value_y00;
87 values[1] += x1 * test_value_y00;
88 values[2] += x0 * test_value_y01;
89 values[3] += x1 * test_value_y01;
90 values[4] += x0 * test_value_y10;
91 values[5] += x1 * test_value_y10;
92 values[6] += x0 * test_value_y11;
93 values[7] += x1 * test_value_y11;
94 } else {
95 values[0] = x0 * test_value_y00;
96 values[1] = x1 * test_value_y00;
97 values[2] = x0 * test_value_y01;
98 values[3] = x1 * test_value_y01;
99 values[4] = x0 * test_value_y10;
100 values[5] = x1 * test_value_y10;
101 values[6] = x0 * test_value_y11;
102 values[7] = x1 * test_value_y11;
103 }
104 }
105 }
106
107 template <bool is_linear, int dim, typename Number, typename Number2>
109 const dealii::ndarray<Number, 2, dim> *shapes,
110 const unsigned int n_shapes,
111 const Number2 &value,
112 Number2 *values,
113 const dealii::Point<dim, Number> &p,
114 const bool do_add)
115 {
116 if (do_add) {
117 if (is_linear)
118 integrate_add_tensor_product_value_linear<dim, Number, Number2, true>(
119 value, values, p);
120 else
121 dealii::internal::integrate_add_tensor_product_value_shapes<dim,
122 Number,
123 Number2,
124 true>(
125 shapes, n_shapes, value, values);
126 } else {
127 if (is_linear)
129 Number,
130 Number2,
131 false>(value, values, p);
132 else
133 dealii::internal::integrate_add_tensor_product_value_shapes<dim,
134 Number,
135 Number2,
136 false>(
137 shapes, n_shapes, value, values);
138 }
139 }
140 } // end of namespace internal
141
142} // namespace ryujin
void integrate_add_tensor_product_value_linear(const Number2 &value, Number2 *values, const dealii::Point< dim, Number > &p)
void integrate_tensor_product_value(const dealii::ndarray< Number, 2, dim > *shapes, const unsigned int n_shapes, const Number2 &value, Number2 *values, const dealii::Point< dim, Number > &p, const bool do_add)
DEAL_II_ALWAYS_INLINE FT add(const FT &flux_left_ij, const FT &flux_right_ij)