dune-fem  2.4.1-rc
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
14 
15 namespace Dune
16 {
17 
18  namespace Fem
19  {
20 
21  // QuadratureStorageRegistry
22  // -------------------------
23 
25  {
27 
28  public:
30  {
31  virtual ~StorageInterface () {}
32  virtual void cacheQuadrature ( std::size_t id, std::size_t codim, std::size_t quadSize ) = 0;
33  virtual GeometryType type () const = 0;
34  };
35 
36  private:
37  typedef std::list< StorageInterface * > StorageListType;
38 
39  struct QuadratureInfo
40  {
41  std::size_t id;
42  std::size_t codim;
43  std::size_t size;
44  GeometryType type;
45  };
46 
47  typedef std::list< QuadratureInfo > QuadratureInfoListType;
48 
49  static StorageListType &storageList ()
50  {
51  static StorageListType storageList;
52  return storageList;
53  }
54 
55  static QuadratureInfoListType &quadratureInfoList ()
56  {
57  static QuadratureInfoListType quadratureInfoList;
58  return quadratureInfoList;
59  }
60 
61  public:
63  static void initialize ()
64  {
65  storageList();
66  quadratureInfoList();
67  }
68 
69  static void registerStorage ( StorageInterface &storage )
70  {
72  storageList().push_back( &storage );
73 
74  const GeometryType type = storage.type();
75  for( QuadratureInfoListType::iterator it = quadratureInfoList().begin(); it != quadratureInfoList().end(); ++it )
76  {
77  // only cache shape functions for quadratures with same geometry type
78  if( type == it->type )
79  storage.cacheQuadrature( it->id, it->codim, it->size );
80  }
81  }
82 
83  static void unregisterStorage ( StorageInterface &storage )
84  {
86  const StorageListType::iterator pos
87  = std::find( storageList().begin(), storageList().end(), &storage );
88  if( pos != storageList().end() )
89  storageList().erase( pos );
90  }
91 
92  template< class Quadrature >
93  static void registerQuadrature ( const Quadrature &quadrature )
94  {
95  registerQuadrature( quadrature, quadrature.geometryType(), Quadrature::codimension );
96  }
97 
98  template< class Quadrature >
99  static void registerQuadrature ( const Quadrature &quadrature,
100  const GeometryType &type, std::size_t codim )
101  {
103  QuadratureInfo quadInfo = { quadrature.id(), codim, std::size_t( quadrature.nop() ), type };
104  quadratureInfoList().push_back( quadInfo );
105 
106  for( typename StorageListType::iterator it = storageList().begin(); it != storageList().end(); ++it )
107  {
108  // only cache shape functions for quadratures with same geometry type
109  if( (*it)->type() == type )
110  (*it)->cacheQuadrature( quadInfo.id, quadInfo.codim, quadInfo.size );
111  }
112  }
113  };
114 
115  } // namespace Fem
116 
117 } // namespace Dune
118 
119 #endif // #ifndef DUNE_FEM_QUADRATURE_CACHING_REGISTRY_HH
GeometryType geometryType() const
obtain GeometryType for this integration point list
Definition: quadrature.hh:293
Definition: quadrature.hh:347
int nop() const
obtain the number of integration points
Definition: quadrature.hh:226
static void initialize()
initialize static variables
Definition: registry.hh:63
static void registerStorage(StorageInterface &storage)
Definition: registry.hh:69
virtual void cacheQuadrature(std::size_t id, std::size_t codim, std::size_t quadSize)=0
Definition: coordinate.hh:4
Definition: registry.hh:24
size_t id() const
obtain the identifier of the integration point list
Definition: quadrature.hh:258
static void registerQuadrature(const Quadrature &quadrature)
Definition: registry.hh:93
static void unregisterStorage(StorageInterface &storage)
Definition: registry.hh:83
static bool singleThreadMode()
returns true if program is operating on one thread currently
Definition: threadmanager.hh:217
static void registerQuadrature(const Quadrature &quadrature, const GeometryType &type, std::size_t codim)
Definition: registry.hh:99
virtual ~StorageInterface()
Definition: registry.hh:31
actual interface class for quadratures
Definition: quadrature.hh:320