00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <LagrangeBasis.hpp>
00021 #include <ErrorHandler.hpp>
00022
00023 LagrangeBasis::
00024 LagrangeBasis(const LagrangeBasis& lagrangeBasis)
00025 : __nodes(lagrangeBasis.__nodes),
00026 __denominatorValues(lagrangeBasis.__denominatorValues)
00027 {
00028 ;
00029 }
00030
00031 LagrangeBasis::
00032 LagrangeBasis(const Vector<real_t>& nodes)
00033 : __nodes(nodes),
00034 __denominatorValues(__nodes.size())
00035 {
00036 __denominatorValues = 1.;
00037 for(size_t i=0; i< __nodes.size(); ++i) {
00038 for(size_t j=0; j<i; ++j) {
00039 real_t xi_xj = __nodes[i]-__nodes[j];
00040 __denominatorValues[i] *= xi_xj;
00041 __denominatorValues[j] *= -xi_xj;
00042 }
00043 }
00044 for(size_t i=0; i< __nodes.size(); ++i) {
00045 __denominatorValues[i] = 1./ __denominatorValues[i];
00046 }
00047 }
00048
00049 LagrangeBasis::
00050 ~LagrangeBasis()
00051 {
00052 ;
00053 }
00054
00055 void LagrangeBasis::
00056 getValues(const real_t& x,
00057 Vector<real_t>& values) const
00058 {
00059 values = __denominatorValues;
00060 if (__nodes.size()== 0) return ;
00061 real_t p=1;
00062 for(size_t i=1;i<__nodes.size();++i ){
00063 p *= x-__nodes[i-1];
00064 values[i] *= p;
00065 }
00066
00067 real_t q=1;
00068 for(int i=__nodes.size()-2;i>=0;--i ){
00069 q *= x-__nodes[i+1];
00070 values[i] *= q;
00071 }
00072 }
00073
00074 void LagrangeBasis::
00075 getDerivativeValues(const real_t& x,
00076 Vector<real_t>& derivateValues) const
00077 {
00078 }
00079
00080 real_t LagrangeBasis::
00081 getValue(const real_t& x,
00082 const size_t& i) const
00083 {
00084 throw ErrorHandler(__FILE__,__LINE__,
00085 "not implemented",
00086 ErrorHandler::unexpected);
00087 return 0;
00088 }
00089
00090 real_t LagrangeBasis::
00091 getDerivativeValue(const real_t& x,
00092 const size_t& i) const
00093 {
00094 throw ErrorHandler(__FILE__,__LINE__,
00095 "not implemented",
00096 ErrorHandler::unexpected);
00097 return 0;
00098 }