dune-fem  2.8-git
registry.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_QUADRATURE_CACHING_REGISTRY_HH
2 #define DUNE_FEM_QUADRATURE_CACHING_REGISTRY_HH
3 
4 // system includes
5 #include <cstddef>
6 #include <algorithm>
7 #include <list>
8 
9 // dune-geometry includes
10 #include <dune/geometry/type.hh>
11 
12 // dune-fem includes
15 
16 namespace Dune
17 {
18 
19  namespace Fem
20  {
21 
22  // QuadratureStorageRegistry
23  // -------------------------
24 
26  {
28 
29  public:
31  {
32  virtual ~StorageInterface () {}
33  virtual void cacheQuadrature ( std::size_t id, std::size_t codim, std::size_t quadSize ) = 0;
34  virtual GeometryType type () const = 0;
35  };
36 
37  // private:
38  typedef std::list< StorageInterface * > StorageListType;
39 
41  {
42  std::size_t id;
43  std::size_t codim;
44  std::size_t size;
45  GeometryType type;
46  };
47 
48  typedef std::list< QuadratureInfo > QuadratureInfoListType;
49 
51  {
53  }
54 
56  {
58  }
59 
60  public:
62  static void initialize ()
63  {
64  storageList();
66  }
67 
68  static void registerStorage ( StorageInterface &storage )
69  {
71  storageList().push_back( &storage );
72 
73  const GeometryType type = storage.type();
74  for( QuadratureInfoListType::iterator it = quadratureInfoList().begin(); it != quadratureInfoList().end(); ++it )
75  {
76  // only cache shape functions for quadratures with same geometry type
77  if( type == it->type )
78  storage.cacheQuadrature( it->id, it->codim, it->size );
79  }
80  }
81 
82  static void unregisterStorage ( StorageInterface &storage )
83  {
85  const StorageListType::iterator pos
86  = std::find( storageList().begin(), storageList().end(), &storage );
87  if( pos != storageList().end() )
88  storageList().erase( pos );
89  }
90 
91  template< class Quadrature >
92  static void registerQuadrature ( const Quadrature &quadrature )
93  {
94  registerQuadrature( quadrature, quadrature.geometryType(), Quadrature::codimension );
95  }
96 
97  template< class Quadrature >
98  static void registerQuadrature ( const Quadrature &quadrature,
99  const GeometryType &type, std::size_t codim )
100  {
102  QuadratureInfo quadInfo = { quadrature.id(), codim, std::size_t( quadrature.nop() ), type };
103  quadratureInfoList().push_back( quadInfo );
104 
105  for( typename StorageListType::iterator it = storageList().begin(); it != storageList().end(); ++it )
106  {
107  // only cache shape functions for quadratures with same geometry type
108  if( (*it)->type() == type )
109  (*it)->cacheQuadrature( quadInfo.id, quadInfo.codim, quadInfo.size );
110  }
111  }
112  };
113 
114  } // namespace Fem
115 
116 } // namespace Dune
117 
118 #endif // #ifndef DUNE_FEM_QUADRATURE_CACHING_REGISTRY_HH
Definition: bindguard.hh:11
static bool singleThreadMode()
returns true if program is operating on one thread currently
Definition: threadmanager.hh:74
Definition: registry.hh:26
static StorageListType & storageList()
Definition: registry.hh:50
static void initialize()
initialize static variables
Definition: registry.hh:62
static void unregisterStorage(StorageInterface &storage)
Definition: registry.hh:82
static QuadratureInfoListType & quadratureInfoList()
Definition: registry.hh:55
std::list< QuadratureInfo > QuadratureInfoListType
Definition: registry.hh:48
static void registerQuadrature(const Quadrature &quadrature, const GeometryType &type, std::size_t codim)
Definition: registry.hh:98
static void registerStorage(StorageInterface &storage)
Definition: registry.hh:68
static void registerQuadrature(const Quadrature &quadrature)
Definition: registry.hh:92
std::list< StorageInterface * > StorageListType
Definition: registry.hh:38
virtual ~StorageInterface()
Definition: registry.hh:32
virtual void cacheQuadrature(std::size_t id, std::size_t codim, std::size_t quadSize)=0
std::size_t codim
Definition: registry.hh:43
GeometryType type
Definition: registry.hh:45
std::size_t id
Definition: registry.hh:42
std::size_t size
Definition: registry.hh:44
int nop() const
obtain the number of integration points
Definition: quadrature.hh:295
GeometryType geometryType() const
obtain GeometryType for this integration point list
Definition: quadrature.hh:362
size_t id() const
obtain the identifier of the integration point list
Definition: quadrature.hh:327
actual interface class for quadratures
Definition: quadrature.hh:405
@ codimension
Definition: quadrature.hh:435
static Object & instance(Args &&... args)
return singleton instance of given Object type.
Definition: singleton.hh:101