Skip to content
Snippets Groups Projects
Commit e06f3c34 authored by Robert Klöfkorn's avatar Robert Klöfkorn
Browse files

now localfunctions wrapper used as local function.

[[Imported from SVN: r3240]]
parent ec761b9a
No related branches found
No related tags found
No related merge requests found
......@@ -24,7 +24,8 @@ namespace Dune {
struct DiscFuncArrayTraits {
typedef DiscreteFunctionSpaceImp DiscreteFunctionSpaceType;
typedef DiscFuncArray<DiscreteFunctionSpaceImp> DiscreteFunctionType;
typedef LocalFunctionArray<DiscreteFunctionSpaceImp> LocalFunctionType;
typedef LocalFunctionArray<DiscreteFunctionSpaceImp> LocalFunctionImp;
typedef LocalFunctionWrapper<DiscreteFunctionType> LocalFunctionType;
typedef DofIteratorArray<typename DiscreteFunctionSpaceImp::RangeFieldType> DofIteratorType;
typedef ConstDofIteratorDefault<DofIteratorType> ConstDofIteratorType;
};
......@@ -45,9 +46,14 @@ namespace Dune {
typedef DiscreteFunctionDefault<DiscFuncArrayTraits <DiscreteFunctionSpaceType > >
DiscreteFunctionDefaultType;
friend class DiscreteFunctionDefault< DiscFuncArrayTraits <DiscreteFunctionSpaceType > > ;
enum { myId_ = 0};
public:
//! my type
typedef DiscFuncArray < DiscreteFunctionSpaceType > DiscreteFunctionType;
//! Type of the range field
typedef typename DiscreteFunctionSpaceType::RangeFieldType RangeFieldType;
......@@ -60,8 +66,14 @@ namespace Dune {
//! the MyType
typedef DiscFuncArray <DiscreteFunctionSpaceType> DiscreteFunctionType;
//! the local function type
typedef LocalFunctionArray<DiscreteFunctionSpaceType> LocalFunctionType;
//! the local function implementation e
typedef LocalFunctionArray<DiscreteFunctionSpaceType> LocalFunctionImp;
//! LocalFunctionType is the exported lf type
typedef LocalFunctionWrapper < DiscreteFunctionType > LocalFunctionType;
// the storage of the local functions
typedef LocalFunctionStorage< DiscreteFunctionType > LocalFunctionStorageType;
//! the dof iterator type of this function
typedef DofIteratorArray <typename DiscreteFunctionSpaceType::RangeFieldType> DofIteratorType;
......@@ -73,6 +85,9 @@ namespace Dune {
//! our traits, like DofIterator etc.
typedef DiscFuncArrayTraits <DiscreteFunctionSpaceType > Traits;
//! the type of the unknowns
typedef RangeFieldType DofType;
//! Constructor makes Discrete Function
DiscFuncArray ( const DiscreteFunctionSpaceType & f ) ;
......@@ -88,7 +103,15 @@ namespace Dune {
// *********** Interface *************************
//! return object of type LocalFunctionType
LocalFunctionArray<DiscreteFunctionSpaceType> newLocalFunction ();
LocalFunctionType newLocalFunction () DUNE_DEPRECATED;
//! return local function for given entity
template <class EntityType>
LocalFunctionType localFunction(const EntityType& en);
//! update LocalFunction to given Entity en
template <class EntityType>
void localFunction ( const EntityType &en, LocalFunctionType & lf) DUNE_DEPRECATED;
//! return reference to this
//! this methods is only to fullfill the interface as parameter classes
......@@ -102,11 +125,6 @@ namespace Dune {
//! this methods is only to fullfill the interface as parameter classes
DiscreteFunctionType & destination () { return *this; }
//! update LocalFunction to given Entity en
template <class EntityType>
void localFunction ( const EntityType &en,
LocalFunctionArray<DiscreteFunctionSpaceType> & lf);
//! we use the default implementation
DofIteratorType dbegin ();
......@@ -123,6 +141,9 @@ namespace Dune {
//! Return the name of the discrete function
const std::string& name() const {return name_;}
//! return size of this discrete function
int size() const { return dofVec_.size(); }
//! set all dofs to zero
void clear( );
......@@ -176,7 +197,15 @@ namespace Dune {
//! read function data from pgm fromat file
bool read_pgm(const char *filename);
//! return pointer to internal array for use of BLAS routines
DofType * leakPointer () { return &(dofVec_[0]); };
//! return pointer to internal array for use of BLAS routines
const DofType * leakPointer () const { return &(dofVec_[0]); };
private:
//! return object pointer of type LocalFunctionImp
LocalFunctionImp * newLocalFunctionObject ();
// get memory for discrete function
void getMemory();
......@@ -186,13 +215,8 @@ namespace Dune {
//! true if memory was allocated
bool built_;
//! pointer to next free local function object
//! if this pointer is NULL, new object is created at the class of
//! localFunction
LocalFunctionType * freeLocalFunc_;
//! hold one object for addLocal and setLocal and so on
LocalFunctionType localFunc_;
LocalFunctionImp localFunc_;
//! the dofs stored in an array
Array < RangeFieldType > dofVec_;
......@@ -222,6 +246,7 @@ namespace Dune {
typedef typename DiscreteFunctionSpaceType::JacobianRangeType JacobianRangeType;
friend class DiscFuncArray <DiscreteFunctionSpaceType>;
friend class LocalFunctionWrapper < DiscFuncArray <DiscreteFunctionSpaceType> >;
public:
//! Constructor
LocalFunctionArray ( const DiscreteFunctionSpaceType &f , Array < RangeFieldType > & dofVec );
......@@ -236,7 +261,10 @@ namespace Dune {
const RangeFieldType & operator [] (int num) const;
//! return number of degrees of freedom
int numberOfDofs () const;
int numberOfDofs () const DUNE_DEPRECATED;
//! return number of degrees of freedom
int numDofs () const;
//! sum over all local base functions
template <class EntityType>
......@@ -248,13 +276,8 @@ namespace Dune {
protected:
//! update local function for given Entity
template <class EntityType > bool init ( const EntityType &en ) const;
//! get pointer to next LocalFunction
MyType * getNext() const;
//! set pointer to next LocalFunction
void setNext (MyType * n);
template <class EntityType >
void init ( const EntityType &en ) const;
//! the corresponding function space which provides the base function set
const DiscreteFunctionSpaceType &fSpace_;
......@@ -265,9 +288,6 @@ namespace Dune {
//! Array holding pointers to the local dofs
mutable Array < RangeFieldType * > values_;
//! remember pointer to next LocalFunction
MyType * next_;
//! diffVar for evaluate, is empty
const DiffVariable<0>::Type diffVar;
......
......@@ -12,7 +12,6 @@ namespace Dune
DiscFuncArray(const DiscreteFunctionSpaceType & f)
: DiscreteFunctionDefaultType ( f )
, name_ ( "no name" )
, freeLocalFunc_ (0)
, localFunc_ ( f , dofVec_ )
{
getMemory();
......@@ -24,7 +23,6 @@ namespace Dune
DiscFuncArray(const char * name, const DiscreteFunctionSpaceType & f )
: DiscreteFunctionDefaultType ( f )
, name_ ( name )
, freeLocalFunc_ (0)
, localFunc_ ( f , dofVec_ )
{
getMemory();
......@@ -33,12 +31,12 @@ namespace Dune
template<class DiscreteFunctionSpaceType >
inline DiscFuncArray< DiscreteFunctionSpaceType >::
DiscFuncArray(const DiscFuncArray <DiscreteFunctionSpaceType> & df ) :
DiscreteFunctionDefaultType ( df.functionSpace_ ) , localFunc_ ( df.localFunc_ )
DiscreteFunctionDefaultType ( df.functionSpace_ )
, localFunc_ ( df.localFunc_ )
{
name_ = df.name_;
built_ = df.built_;
freeLocalFunc_ = 0;
dofVec_ = df.dofVec_;
}
......@@ -56,9 +54,7 @@ namespace Dune
template<class DiscreteFunctionSpaceType >
inline DiscFuncArray< DiscreteFunctionSpaceType >::
~DiscFuncArray()
{
if(freeLocalFunc_) delete freeLocalFunc_;
}
{}
template<class DiscreteFunctionSpaceType >
......@@ -91,46 +87,33 @@ namespace Dune
template<class DiscreteFunctionSpaceType > template <class EntityType>
inline void
DiscFuncArray< DiscreteFunctionSpaceType >::
localFunction ( const EntityType &en , LocalFunctionArray < DiscreteFunctionSpaceType > &lf )
localFunction ( const EntityType &en , LocalFunctionType &lf )
{
lf.init ( en );
}
template<class DiscreteFunctionSpaceType >
inline LocalFunctionArray<DiscreteFunctionSpaceType>
DiscFuncArray< DiscreteFunctionSpaceType >::
newLocalFunction ()
template<class DiscreteFunctionSpaceType > template <class EntityType>
inline typename DiscFuncArray< DiscreteFunctionSpaceType >:: LocalFunctionType
DiscFuncArray< DiscreteFunctionSpaceType >:: localFunction ( const EntityType &en )
{
LocalFunctionArray<DiscreteFunctionSpaceType> tmp ( this->functionSpace_ , dofVec_ );
return tmp;
return LocalFunctionType (en,*this);
}
#if 0
template<class DiscreteFunctionSpaceType >
inline typename DiscFuncArray<DiscreteFunctionSpaceType>::LocalFunctionType *
DiscFuncArray< DiscreteFunctionSpaceType >::getLocalFunction ()
inline typename DiscFuncArray< DiscreteFunctionSpaceType >:: LocalFunctionImp *
DiscFuncArray< DiscreteFunctionSpaceType >::
newLocalFunctionObject ()
{
if(!freeLocalFunc_)
{
LocalFunctionType *lf = new LocalFunctionType (functionSpace_,dofVec_);
return lf;
}
else
{
LocalFunctionType *lf = freeLocalFunc_;
freeLocalFunc_ = lf->getNext();
return lf;
}
return new LocalFunctionArray<DiscreteFunctionSpaceType> ( this->functionSpace_ , dofVec_ );
}
template<class DiscreteFunctionSpaceType >
inline void DiscFuncArray< DiscreteFunctionSpaceType >::
freeLocalFunction ( typename DiscFuncArray<DiscreteFunctionSpaceType>::LocalFunctionType *lf)
inline typename DiscFuncArray< DiscreteFunctionSpaceType >:: LocalFunctionType
DiscFuncArray< DiscreteFunctionSpaceType >:: newLocalFunction ()
{
lf->setNext(freeLocalFunc_);
freeLocalFunc_ = lf;
return LocalFunctionType (*this);
}
#endif
template<class DiscreteFunctionSpaceType >
inline typename DiscFuncArray<DiscreteFunctionSpaceType>::DofIteratorType
......@@ -417,14 +400,12 @@ namespace Dune
inline LocalFunctionArray < DiscreteFunctionSpaceType >::
LocalFunctionArray( const DiscreteFunctionSpaceType &f ,
Array < RangeFieldType > & dofVec )
: fSpace_ ( f ), dofVec_ ( dofVec ) , next_ (0)
: fSpace_ ( f ), dofVec_ ( dofVec )
, uniform_(true), init_(false) {}
template<class DiscreteFunctionSpaceType >
inline LocalFunctionArray < DiscreteFunctionSpaceType >::~LocalFunctionArray()
{
if(next_) delete next_;
}
{}
template<class DiscreteFunctionSpaceType >
inline typename LocalFunctionArray < DiscreteFunctionSpaceType >::RangeFieldType &
......@@ -447,6 +428,13 @@ namespace Dune
return numOfDof_;
}
template<class DiscreteFunctionSpaceType >
inline int LocalFunctionArray < DiscreteFunctionSpaceType >::
numDofs () const
{
return numOfDof_;
}
template<class DiscreteFunctionSpaceType > template <class EntityType>
inline void LocalFunctionArray < DiscreteFunctionSpaceType >::
evaluate (EntityType &en, const DomainType & x, RangeType & ret) const
......@@ -496,28 +484,14 @@ namespace Dune
}
}
template<class DiscreteFunctionSpaceType >
inline LocalFunctionArray < DiscreteFunctionSpaceType > *
LocalFunctionArray < DiscreteFunctionSpaceType >::getNext () const
{
return next_;
}
template<class DiscreteFunctionSpaceType >
inline void LocalFunctionArray < DiscreteFunctionSpaceType >::
setNext (LocalFunctionArray < DiscreteFunctionSpaceType > *n)
{
next_ = n;
}
template<class DiscreteFunctionSpaceType > template <class EntityType>
inline bool LocalFunctionArray < DiscreteFunctionSpaceType >::
inline void LocalFunctionArray < DiscreteFunctionSpaceType >::
init (const EntityType &en ) const
{
if(!uniform_ || !init_)
{
numOfDof_ =
fSpace_.getBaseFunctionSet(en).getNumberOfBaseFunctions();
fSpace_.getBaseFunctionSet(en).numBaseFunctions();
numOfDifferentDofs_ =
fSpace_.getBaseFunctionSet(en).getNumberOfDiffBaseFuncs();
......@@ -529,7 +503,7 @@ namespace Dune
for(int i=0; i<numOfDof_; i++)
values_ [i] = &(dofVec_[fSpace_.mapToGlobal ( en , i)]);
return true;
return ;
}
//**********************************************************************
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment