12#ifndef BEMBEL_SRC_SPLINE_BASIS_HPP_
13#define BEMBEL_SRC_SPLINE_BASIS_HPP_
25template <
typename Scalar>
26using funptr_voidOut_scalarptrScalarDoubleIn =
27 void (*)(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *, Scalar,
double);
28template <
typename Scalar>
29using funptr_voidOut_scalarptrScalarVec2In =
void (*)(
30 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *, Scalar, Eigen::Vector2d);
31template <
typename Scalar>
32using funptr_voidOut_scalarptrScalarVec2Vec2In =
33 void (*)(Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> *, Scalar,
34 Eigen::Vector2d, Eigen::Vector2d);
37template <
typename Scalar>
38using funptr_phi = funptr_voidOut_scalarptrScalarDoubleIn<Scalar>;
39template <
typename Scalar>
40using funptr_phidx = funptr_voidOut_scalarptrScalarDoubleIn<Scalar>;
41template <
typename Scalar>
42using funptr_phiphi = funptr_voidOut_scalarptrScalarVec2In<Scalar>;
43template <
typename Scalar>
44using funptr_phiphidx = funptr_voidOut_scalarptrScalarVec2In<Scalar>;
45template <
typename Scalar>
46using funptr_phiphidy = funptr_voidOut_scalarptrScalarVec2In<Scalar>;
47template <
typename Scalar>
48using funptr_phitimesphi = funptr_voidOut_scalarptrScalarVec2Vec2In<Scalar>;
49template <
typename Scalar>
50using funptr_divphitimesdivphi =
51 funptr_voidOut_scalarptrScalarVec2Vec2In<Scalar>;
57template <
int P,
typename Scalar>
58inline void phi_(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c, Scalar
w,
60 constexpr int I =
P + 1;
63 for (
int i = 0;
i <
I;
i++) (*
c)(
i) +=
w * base[
i];
71template <
int P,
typename Scalar>
72inline void phi_dx_(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c, Scalar
w,
74 constexpr int I =
P + 1;
77 for (
int i = 0;
i <
I;
i++) (*
c)(
i) +=
w * base[
i];
85template <
int P,
typename Scalar>
86inline void phiphi_(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c, Scalar
w,
88 constexpr int I =
P + 1;
104template <
int P,
typename Scalar>
105inline void phiphi_dx_(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c, Scalar
w,
107 constexpr int I =
P + 1;
123template <
int P,
typename Scalar>
124inline void phiphi_dy_(Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c, Scalar
w,
126 constexpr int I =
P + 1;
141template <
int P,
typename Scalar>
143 Scalar
w, Eigen::Vector2d
xi, Eigen::Vector2d
eta) {
144 constexpr int I =
P + 1;
160 for (
int i = 0;
i < (
I *
I);
i++)
161 for (
int j = 0;
j < (
I *
I);
j++) (*
c)(
i,
j) +=
a[
i] *
b[
j];
170template <
int P,
typename Scalar>
172 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> *
c, Scalar
weight,
173 Eigen::Vector2d
xi, Eigen::Vector2d
eta) {
174 constexpr int I =
P + 1;
175 constexpr int I2 =
I *
I;
176 Eigen::Matrix<Scalar, Eigen::Dynamic, 1>
a_dx(
I2);
178 Eigen::Matrix<Scalar, Eigen::Dynamic, 1>
a_dy(
I2);
190 for (
int i = 0;
i <
I2; ++
i)
192 for (
int i = 0;
i <
I2; ++
i)
194 for (
int i = 0;
i <
I2; ++
i)
196 for (
int i = 0;
i <
I2; ++
i)
208template <
int P,
typename Scalar>
212 static inline void phi(
int p, Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
213 Scalar
w,
double x) {
217 static inline void phiDx(
int p, Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
218 Scalar
w,
double x) {
222 static inline void phiPhi(
int p, Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
223 Scalar
w, Eigen::Vector2d
a) {
227 static inline void phiPhiDx(
int p,
228 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
229 Scalar
w, Eigen::Vector2d
a) {
233 static inline void phiPhiDy(
int p,
234 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
235 Scalar
w, Eigen::Vector2d
a) {
239 static inline void phiTimesPhi(
240 int p, Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> *
c, Scalar
w,
241 Eigen::Vector2d
xi, Eigen::Vector2d
eta) {
246 static inline void divPhiTimesDivPhi(
247 int p, Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> *
c,
248 Scalar
weight, Eigen::Vector2d
xi, Eigen::Vector2d
eta) {
255 static constexpr funptr_phi<Scalar> funPtrPhi(
int p) {
259 static constexpr funptr_phidx<Scalar> funPtrPhiDx(
int p) {
263 static constexpr funptr_phiphi<Scalar> funPtrPhiPhi(
int p) {
267 static constexpr funptr_phiphidx<Scalar> funPtrPhiPhiDx(
int p) {
271 static constexpr funptr_phiphidy<Scalar> funPtrPhiPhiDy(
int p) {
275 static constexpr funptr_phitimesphi<Scalar> funPtrPhiTimesPhi(
int p) {
279 static constexpr funptr_divphitimesdivphi<Scalar> funPtrDivPhiTimesDivPhi(
289template <
typename Scalar>
293 static inline void phi(
int p, Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
294 Scalar
w,
double x) {
297 static inline void phiDx(
int p, Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
298 Scalar
w,
double x) {
301 static inline void phiPhi(
int p, Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
302 Scalar
w, Eigen::Vector2d
a) {
305 static inline void phiPhiDx(
int p,
306 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
307 Scalar
w, Eigen::Vector2d
a) {
310 static inline void phiPhiDy(
int p,
311 Eigen::Matrix<Scalar, Eigen::Dynamic, 1> *
c,
312 Scalar
w, Eigen::Vector2d
a) {
315 static inline void phiTimesPhi(
316 int p, Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> *
c, Scalar
w,
317 Eigen::Vector2d
xi, Eigen::Vector2d
eta) {
320 static inline void divPhiTimesDivPhi(
321 int p, Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> *
c,
322 Scalar
weight, Eigen::Vector2d
xi, Eigen::Vector2d
eta) {
326 static constexpr funptr_phi<Scalar> funPtrPhi(
int p) {
329 static constexpr funptr_phidx<Scalar> funPtrPhiDx(
int p) {
332 static constexpr funptr_phiphi<Scalar> funPtrPhiPhi(
int p) {
335 static constexpr funptr_phiphidx<Scalar> funPtrPhiPhiDx(
int p) {
338 static constexpr funptr_phiphidy<Scalar> funPtrPhiPhiDy(
int p) {
341 static constexpr funptr_phitimesphi<Scalar> funPtrPhiTimesPhi(
int p) {
344 static constexpr funptr_divphitimesdivphi<Scalar> funPtrDivPhiTimesDivPhi(
351template <
typename Scalar>
The functions above have a fixed compile time polynomial degree. The PSpecificBasis handler is used t...
These routines implement a template recursion that allows to choose a compile time instantiation of a...
void phiphi_(Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > *c, Scalar w, Eigen::Vector2d a)
evaluates the 2D tensor product basis at a point a in [0,1]^2
void phi_dx_(Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > *c, Scalar w, double x)
evaluates the derivative of phi
void phiphi_dy_(Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > *c, Scalar w, Eigen::Vector2d a)
evaluates the y-derivative of the 2D tensor product basis at a point a in [0,1]^2
void phiphi_dx_(Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > *c, Scalar w, Eigen::Vector2d a)
evaluates the x-derivative of the 2D tensor product basis at a point a in [0,1]^2
void Phi_times_Phi_(Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > *c, Scalar w, Eigen::Vector2d xi, Eigen::Vector2d eta)
evaluates the interaction of two phiphis, one at xi and one at eta. Used for e.g. gram matrices.
void Div_Phi_times_Div_Phi_(Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > *c, Scalar weight, Eigen::Vector2d xi, Eigen::Vector2d eta)
same as above, just using the divergence
void phi_(Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > *c, Scalar w, double x)
evaluates the 1D basis at x weighted with a quadrature weight w
Routines for the evalutation of pointwise errors.
constexpr int getFunctionSpaceOutputDimension()