dune-pdelab  2.0.0
localbasiscache.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil -*-
2 #ifndef DUNE_PDELAB_LOCALBASISCACHE_HH
3 #define DUNE_PDELAB_LOCALBASISCACHE_HH
4 
5 #include<vector>
6 #include<map>
7 
8 #include<dune/common/exceptions.hh>
9 #include<dune/common/static_assert.hh>
10 
11 namespace Dune {
12  namespace PDELab {
13 
15  template<class LocalBasisType>
17  {
18  typedef typename LocalBasisType::Traits::DomainFieldType DomainFieldType;
19  typedef typename LocalBasisType::Traits::DomainType DomainType;
20  typedef typename LocalBasisType::Traits::RangeType RangeType;
21  typedef typename LocalBasisType::Traits::JacobianType JacobianType;
22 
23  struct less_than
24  {
25  bool operator() (const DomainType& v1, const DomainType& v2) const
26  {
27  for (typename DomainType::size_type i=0; i<DomainType::dimension; i++)
28  {
29  if ( v1[i] < v2[i]-1e-5 ) return true; // is less than
30  if ( v1[i] > v2[i]+1e-5 ) return false; // is greater than
31  }
32  return false; // is equal
33  }
34  };
35 
36  typedef std::map<DomainType,std::vector<RangeType>,less_than> FunctionCache;
37  typedef std::map<DomainType,std::vector<JacobianType>,less_than> JacobianCache;
38 
39  public:
40 
43 
45  const std::vector<RangeType>&
46  evaluateFunction (const DomainType& position, const LocalBasisType& localbasis) const
47  {
48  typename FunctionCache::iterator it = functioncache.find(position);
49  if (it!=functioncache.end()) return it->second;
50  std::vector<RangeType> values;
51  localbasis.evaluateFunction(position,values);
52  it = functioncache.insert(functioncache.begin(),std::pair<DomainType,std::vector<RangeType> >(position,values));
53  return it->second;
54  }
55 
57  const std::vector<JacobianType>&
58  evaluateJacobian (const DomainType& position, const LocalBasisType& localbasis) const
59  {
60  typename JacobianCache::iterator it = jacobiancache.find(position);
61  if (it!=jacobiancache.end()) return it->second;
62  std::vector<JacobianType> values;
63  localbasis.evaluateJacobian(position,values);
64  it = jacobiancache.insert(jacobiancache.begin(),std::pair<DomainType,std::vector<JacobianType> >(position,values));
65  return it->second;
66  }
67 
68  private:
69  mutable FunctionCache functioncache;
70  mutable JacobianCache jacobiancache;
71  };
72 
73  }
74 }
75 
76 #endif
const std::vector< JacobianType > & evaluateJacobian(const DomainType &position, const LocalBasisType &localbasis) const
evaluate Jacobians at a point
Definition: localbasiscache.hh:58
store values of basis functions and gradients in a cache
Definition: localbasiscache.hh:16
const std::vector< RangeType > & evaluateFunction(const DomainType &position, const LocalBasisType &localbasis) const
evaluate basis functions at a point
Definition: localbasiscache.hh:46
LocalBasisCache()
constructor
Definition: localbasiscache.hh:42
const E & e
Definition: interpolate.hh:172