diff --git a/fem/discretefunction.hh b/fem/discretefunction.hh index d3f8d975f994bc877c656f31496e2c023622b4d9..88f018da33b132ab6676d4308f66b86b70a5aba8 100644 --- a/fem/discretefunction.hh +++ b/fem/discretefunction.hh @@ -366,8 +366,10 @@ namespace Dune { else levOcu_ = 1; + // for all grid levels we have at least a vector with length 0 int numLevel = const_cast<GridType &> (functionSpace_.getGrid()).maxlevel() +1; dofVec_.resize(numLevel); + // this is done only if levOcu_ > 1 for(int i=0; i< levOcu_-1; i++) { @@ -376,15 +378,22 @@ namespace Dune { for( int j=0; j<length; j++) (dofVec_[i])[j] = 0.0; } + + // the last level is done always int length = functionSpace_.size( level_ ); (dofVec_[level_]).realloc( length ); for( int j=0; j<length; j++) (dofVec_[level_])[j] = 0.0; - // I want a special operator for (dofVec_[levOcu_-1]) = 0.0; }; void set ( DofType x, int level ) { + std::cout << "Set Level " << level << " with value " << x << std::endl; + if(!allLevels_ && level != level_) + { + std::cout << "Level not set! \n"; + return; + } GlobalDofIteratorType endit = dend ( level ); for(GlobalDofIteratorType it = dbegin ( level ); it != endit; ++it) { diff --git a/fem/lagrangebase.hh b/fem/lagrangebase.hh index ffa3cc1c9c6f925a5567b31cde4c2dff5ce79191..b96ee76ee2f3ccfd9ab60eb545dfbdc084cafbaa 100644 --- a/fem/lagrangebase.hh +++ b/fem/lagrangebase.hh @@ -97,6 +97,10 @@ namespace Dune { } }; +#if 0 + + // not in use + //***************************************************************** // //! (0,1) @@ -110,6 +114,20 @@ namespace Dune { //! (0,0) (1,0) // //***************************************************************** +#endif + //***************************************************************** + // + //! (0,1) + //! 2|\ coordinates and local node numbers + //! | \ + // //! | \ + //! | \ + // //! | \ + // //! | \ + // //! 0|______\1 + //! (0,0) (1,0) + // + //***************************************************************** template<class FunctionSpaceType> class LagrangeBaseFunction < FunctionSpaceType , triangle , 1 > : public BaseFunctionInterface<FunctionSpaceType> @@ -118,6 +136,7 @@ namespace Dune { RangeField factor[3]; public: +#if 0 LagrangeBaseFunction ( FunctionSpaceType & f , int baseNum ) : BaseFunctionInterface<FunctionSpaceType> (f) { @@ -137,19 +156,42 @@ namespace Dune { factor[i] = 0.0; } } +#endif + + // this is the version with with phi(x,y) = x as base function 1 + LagrangeBaseFunction ( FunctionSpaceType & f , int baseNum ) + : BaseFunctionInterface<FunctionSpaceType> (f) + { + if(baseNum == 0) + { // 1 - x - y + factor[0] = 1.0; + factor[1] = -1.0; + factor[2] = -1.0; + } + else + { + factor[2] = 0.0; + for(int i=1; i<3; i++) // x , y + if(baseNum == i) + factor[i] = 1.0; + else + factor[i] = 0.0; + } + } virtual void evaluate ( const Vec<0, deriType> &diffVariable, const Domain & x, Range & phi) const { - phi = factor[2]; - for(int i=0; i<2; i++) - phi += factor[i] * x.get(i); + phi = factor[0]; + for(int i=1; i<3; i++) + phi += factor[i] * x.get(i-1); } virtual void evaluate ( const Vec<1, deriType> &diffVariable, const Domain & x, Range & phi) const { - int num = diffVariable.get(0); + // x or y ==> 1 or 2 + int num = diffVariable.get(0)+1; phi = factor[num]; } @@ -254,8 +296,18 @@ namespace Dune { LagrangeBaseFunction ( FunctionSpaceType & f , int baseNum ) : BaseFunctionInterface<FunctionSpaceType>(f) { + if((baseNum < 0) || (baseNum > 3)) + { + std::cout << "Wrong baseNum given to LagrangeBase for hexahedrons \n"; + abort(); + } // looks complicated but works int fak[dim] = {0,0}; + + fak[0] = baseNum%2; // 0,2 ==> 0, 1,3 ==> 1 + fak[1] = (baseNum%4 > 1) ? 1 : 0; // 2,3,6,7 ==> 1 | 0,1,4,5 ==> 0 + +#if 0 switch(baseNum) { case 0 : { @@ -276,6 +328,7 @@ namespace Dune { abort(); } } +#endif // tensor product for(int i=0; i<dim; i++) @@ -351,12 +404,12 @@ namespace Dune { // / . / | // 4---------5 | <-- 3 (back side) // 0 --> | . | 1 | - // | 2.....|...3 + // | 2.....|...3 (1,1,0) // | . | / // | . 2 | / <-- 4 (front side) // |. |/ // 0---------1 - // + // (0,0,0) (1,0,0) // this is the DUNE local coordinate system for hexahedrons // //********************************************************************* @@ -376,8 +429,18 @@ namespace Dune { LagrangeBaseFunction ( FunctionSpaceType & f , int baseNum ) : BaseFunctionInterface<FunctionSpaceType>(f) { + if((baseNum < 0) || (baseNum > 7)) + { + std::cout << "Wrong baseNum given to LagrangeBase for hexahedrons \n"; + abort(); + } // looks complicated but works int fak[dim] = {0,0,0}; + fak[0] = baseNum%2; // 0,2 ==> 0, 1,3 ==> 1 + fak[1] = (baseNum%4 > 1) ? 1 : 0; // 2,3,6,7 ==> 1 | 0,1,4,5 ==> 0 + fak[2] = (baseNum > 3) ? 1 : 0; + +#if 0 switch(baseNum) { case 0 : { @@ -411,7 +474,7 @@ namespace Dune { } } - +#endif // tensor product for(int i=0; i<dim; i++) { @@ -576,6 +639,8 @@ namespace Dune { enum { codim = EntityType::dimension }; // return vertex number , very slow return (*en.entity<codim>( localNum )).index(); + //int num = (*en.entity<codim>( localNum )).index(); + //return num; }; };