8#include <kernel/util/math.hpp>
9#include <kernel/lafem/dense_vector.hpp>
10#include <kernel/lafem/sparse_matrix_banded.hpp>
40 template<
typename DataType_,
typename IndexType_>
42 const std::vector<IndexType_> & num_of_subintervalls)
44 const IndexType_ *
const pnos(num_of_subintervalls.data());
47 const Index d(
Index(num_of_subintervalls.size()));
50 XASSERTM(d >= IndexType_(1),
"You need at least 1 dimension");
52 for (IndexType_ i(0); i < d; ++i)
54 XASSERTM(pnos[i] >= IndexType_(3),
"You need at least 3 subintervalls per dimension");
60 if (fe_degree >
Index(0))
62 for (
Index i(0); i < d; ++i)
64 size *= pnos[i] * IndexType_(fe_degree) + 1;
65 noo *= 2 * fe_degree + 1;
70 for (
Index i(0); i < d; ++i)
81 IndexType_ *
const poffsets(vec_offsets.
elements());
82 const Index h_off((noo - 1) / 2);
85 poffsets[h_off] = size - IndexType_(1);
87 for (
Index i(0), k(1), m(1); i < d; ++i, k *= 2 * fe_degree + 1, m *= pnos[i - 1] * fe_degree + 1)
89 Index k1((k - 1) / 2);
91 for (IndexType_ j(1); j <= fe_degree; ++j)
93 for (IndexType_ l(0); l < k; ++l)
95 poffsets[h_off - k1 + l + k * j] = poffsets[h_off - k1 + l] + IndexType_(j * m);
96 poffsets[h_off - k1 + l - k * j] = poffsets[h_off - k1 + l] - IndexType_(j * m);
124 template<
typename DataType_,
typename IndexType_>
127 const IndexType_ *
const pnos(num_of_subintervalls.data());
129 const Index d(
Index(num_of_subintervalls.size()) - 1);
133 for (
Index i(1); i <= d; ++i)
139 const Index num_of_offsets(2 * d + 1);
146 IndexType_ *
const poffsets(vec_offsets.
elements());
148 poffsets[d] = IndexType_(size - 1);
151 for (
Index i(0); i < d; ++i)
154 poffsets[d - 1 - i] = size - IndexType_(1 + tmp);
155 poffsets[d + 1 + i] = size + IndexType_(tmp - 1);
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Dense data vector class template.
DT_ * elements()
Get a pointer to the data array.
std::uint64_t Index
Index data type.
empty Finite-Differences pointstar matrix creator.
static SparseMatrixBanded< DataType_, IndexType_ > value(const std::vector< IndexType_ > &num_of_subintervalls)
Generates an empty FD-style pointstar banded matrix.
empty Finite-Elements pointstar matrix creator.
static SparseMatrixBanded< DataType_, IndexType_ > value(const Index fe_degree, const std::vector< IndexType_ > &num_of_subintervalls)
Generates an empty FE-style pointstar banded matrix.