diff --git a/Numeric/CMakeLists.txt b/Numeric/CMakeLists.txt index 388f7259c01074e44a21f5923a6c7a702a9e5070..9a297630527eff8ada8be79df82835daa5b8e45f 100644 --- a/Numeric/CMakeLists.txt +++ b/Numeric/CMakeLists.txt @@ -8,6 +8,7 @@ set(SRC fullMatrix.cpp polynomialBasis.cpp JacobianBasis.cpp + jacobiPolynomials.cpp GaussIntegration.cpp GaussQuadratureLin.cpp GaussQuadratureTri.cpp diff --git a/Numeric/jacobiPolynomials.cpp b/Numeric/jacobiPolynomials.cpp new file mode 100644 index 0000000000000000000000000000000000000000..234876ec774f69ed8087a71684998239278d5ce3 --- /dev/null +++ b/Numeric/jacobiPolynomials.cpp @@ -0,0 +1,56 @@ +#include "jacobiPolynomials.h" + +inline double Pochhammer(double x,int n) { + double result(1.); + for (int i=0;i<n;i++) result *= (x+i); + return result; +} + + +JacobiPolynomials::JacobiPolynomials(double a, double b, int o): + alpha(a),beta(b),n(o),alphaPlusBeta(a+b),a2MinusB2(a*a-b*b) {} +JacobiPolynomials::~JacobiPolynomials() {;} + +void JacobiPolynomials::f(double u, double *val) const { + + val[0] = 1.; + if (n>=1) val[1] = 0.5*(2.*(alpha+1.) + (alphaPlusBeta + 2.)*(u-1.)); + + for (int i=1;i<n;i++) { + + double ii = (double) i; + double twoI = 2.*ii; + + double a1i = 2.*(ii+1.)*(ii+alphaPlusBeta+1.)*(twoI+alphaPlusBeta); + double a2i = (twoI+alphaPlusBeta+1.)*(a2MinusB2); + double a3i = Pochhammer(twoI+alphaPlusBeta,3); + double a4i = 2.*(ii+alpha)*(ii+beta)*(twoI+alphaPlusBeta+2.); + + val[i+1] = ((a2i + a3i * u)* val[i] - a4i * val[i-1])/a1i; + + } + +} + +void JacobiPolynomials::f(fullMatrix<double> &coord, fullMatrix<double> &val) const {} + +void JacobiPolynomials::df(double u, double *val) const { + + double tmp[n+1]; + f(u,tmp); + + val[0] = 0; + if (n>=1) val[1] = 0.5*(alphaPlusBeta + 2.); + + for (int i=2;i<=n;i++) { + double ii = (double) i; + double aa = (2.*ii + alphaPlusBeta); + double g2 = aa*(1.-u*u); + double g1 = ii*(alpha - beta - aa*u); + double g0 = 2.*(ii+alpha)*(ii+beta); + + val[i] = (g1 * tmp[i] + g0 * tmp[i-1])/g2; + } +} + +void JacobiPolynomials::df(fullMatrix<double> &coord, fullMatrix<double> &val) const {} diff --git a/Numeric/jacobiPolynomials.h b/Numeric/jacobiPolynomials.h new file mode 100644 index 0000000000000000000000000000000000000000..31f88d644aae7d348f19ef330b75929da2545a3c --- /dev/null +++ b/Numeric/jacobiPolynomials.h @@ -0,0 +1,27 @@ +#ifndef JACOBIPOLYNOMIALS_H +#define JACOBIPOLYNOMIALS_H + +#include "fullMatrix.h" + +class JacobiPolynomials { + + public: + JacobiPolynomials(double a, double b, int o); + ~JacobiPolynomials(); + + void f(double u, double *val) const; + + void df(double u, double *val) const; + + private: + double alpha; + double beta; + int n; + + double alphaPlusBeta; + double a2MinusB2; + +}; + + +#endif