diff --git a/fem/common/cachingbase.cc b/fem/common/cachingbase.cc index 39d7b8773ac14b921c63d8b583b366f045ddb9bc..11fab7fde7780adf2c0147a2d0bde216c987a3ed 100644 --- a/fem/common/cachingbase.cc +++ b/fem/common/cachingbase.cc @@ -82,6 +82,10 @@ CachingBaseFunctionSet<FunctionSpaceType >:: values(int baseFunct, const QuadratureType& quad) const { ConstRangeMapIterator it = vals_.find(quad.getIdentifier()); + if (it == vals_.end()) { + registerQuadrature(quad); + it = vals_.find(quad.getIdentifier()); + } assert(it != vals_.end()); // Forgot to initialise with quadrature, eh? assert(baseFunct < numOfBaseFct_); @@ -95,6 +99,10 @@ CachingBaseFunctionSet<FunctionSpaceType >:: gradients(int baseFunct, const QuadratureType& quad) const { ConstJacobianMapIterator it = grads_.find(quad.getIdentifier()); + if (it == grads_.end()) { + registerQuadrature(quad); + it = grads_.find(quad.getIdentifier()); + } assert(it != grads_.end()); assert(baseFunct < numOfBaseFct_); @@ -118,7 +126,7 @@ faces(int faceIdx, int baseFct, const QuadratureType& quad) const { template <class FunctionSpaceType> template <class QuadratureType> void CachingBaseFunctionSet<FunctionSpaceType>:: -registerQuadrature( const QuadratureType &quad ) +registerQuadrature( const QuadratureType &quad ) const { // check if quadrature is already registered int identifier = quad.getIdentifier(); @@ -156,7 +164,7 @@ registerQuadrature( const QuadratureType &quad ) template <class FunctionSpaceType> template <class QuadratureType, class EntityType> void CachingBaseFunctionSet<FunctionSpaceType>:: -registerQuadrature(const QuadratureType &quad, const EntityType& en) { +registerQuadrature(const QuadratureType &quad, const EntityType& en) const { //- Local typedefs typedef typename EntityType::IntersectionIterator IntersectionIterator; diff --git a/fem/common/cachingbase.hh b/fem/common/cachingbase.hh index aef48367348a8bd06dd703e03bd01afcb58f3071..9e08060a3d64207b4ffef7c0acffd3d23e50aaf7 100644 --- a/fem/common/cachingbase.hh +++ b/fem/common/cachingbase.hh @@ -118,12 +118,12 @@ namespace Dune { //! The base function set will only work for quadratures which were //! registered template <class QuadratureType> - void registerQuadrature(const QuadratureType & quad); + void registerQuadrature(const QuadratureType & quad) const; //! Register face quadrature template <class QuadratureType, class EntityType> void registerQuadrature(const QuadratureType& quad, - const EntityType& en); + const EntityType& en) const; private: //- Local typedefs @@ -151,13 +151,13 @@ namespace Dune { std::vector<BaseFunctionInterfaceType *> baseFunctionList_ ; //! map with cached values for base functions - RangeMap vals_; + mutable RangeMap vals_; //! map with cached values for base function gradients - JacobianMap grads_; + mutable JacobianMap grads_; //! map with cached values for face values of base functions - FaceMap faces_; + mutable FaceMap faces_; }; // end class CachingBaseFunctionSet