Dune Core Modules (2.4.2)

objectfactory.hh
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_ALUGRIDOBJECTFACTORY_HH
4 #define DUNE_ALUGRIDOBJECTFACTORY_HH
5 
6 #include <dune/grid/alugrid/common/memory.hh>
7 
8 #if defined USE_PTHREADS || defined _OPENMP
9 #define USE_SMP_PARALLEL
10 #endif
11 
12 #ifdef _OPENMP
13 #include <omp.h>
14 #endif
15 
16 #if HAVE_DUNE_FEM
17 #include <dune/fem/misc/threads/threadmanager.hh>
18 #endif
19 
20 namespace Dune
21 {
22  template <class InterfaceType>
23  struct MakeableInterfaceObject ;
24 
25  template <class GridImp>
26  class ALUGridObjectFactory
27  {
28  template <class OF, int codim>
29  class ALUGridEntityFactory;
30 
32  //
33  // partial specialization of method getNewEntity
34  //
36  template <class GridObjectFactory>
37  class ALUGridEntityFactory<GridObjectFactory,0>
38  {
39  public:
40  enum { codim = 0 };
41  typedef typename GridImp :: template Codim<codim> :: Entity Entity;
42  typedef MakeableInterfaceObject<Entity> EntityObject;
43  typedef typename EntityObject :: ImplementationType EntityImp;
44 
45  inline static EntityObject *
46  getNewEntity (const GridObjectFactory& factory, int level)
47  {
48  return factory.entityProvider_.getEntityObject( factory, level, (EntityImp *) 0);
49  }
50 
51  inline static void freeEntity(const GridObjectFactory& factory, EntityObject * e )
52  {
53  factory.entityProvider_.freeObject( e );
54  }
55  };
56 
57  template <class GridObjectFactory>
58  class ALUGridEntityFactory<GridObjectFactory,1>
59  {
60  public:
61  enum { codim = 1 };
62  typedef typename GridImp :: template Codim<codim> :: Entity Entity;
63  typedef MakeableInterfaceObject<Entity> EntityObject;
64  typedef typename EntityObject :: ImplementationType EntityImp;
65 
66  inline static EntityObject *
67  getNewEntity (const GridObjectFactory& factory, int level)
68  {
69  return factory.faceProvider_.getEntityObject( factory, level, (EntityImp *) 0);
70  }
71 
72  inline static void freeEntity(const GridObjectFactory& factory, EntityObject * e )
73  {
74  factory.faceProvider_.freeObject( e );
75  }
76  };
77 
78  template <class GridObjectFactory>
79  class ALUGridEntityFactory<GridObjectFactory,2>
80  {
81  public:
82  enum { codim = 2 };
83  typedef typename GridImp :: template Codim<codim> :: Entity Entity;
84  typedef MakeableInterfaceObject<Entity> EntityObject;
85  typedef typename EntityObject :: ImplementationType EntityImp;
86 
87  inline static EntityObject *
88  getNewEntity (const GridObjectFactory& factory, int level)
89  {
90  return factory.edgeProvider_.getEntityObject( factory, level, (EntityImp *) 0);
91  }
92 
93  inline static void freeEntity(const GridObjectFactory& factory, EntityObject * e )
94  {
95  factory.edgeProvider_.freeObject( e );
96  }
97  };
98 
99  template <class GridObjectFactory>
100  class ALUGridEntityFactory<GridObjectFactory,3>
101  {
102  public:
103  enum { codim = 3 };
104  typedef typename GridImp :: template Codim<codim> :: Entity Entity;
105  typedef MakeableInterfaceObject<Entity> EntityObject;
106  typedef typename EntityObject :: ImplementationType EntityImp;
107 
108  inline static EntityObject *
109  getNewEntity (const GridObjectFactory& factory, int level)
110  {
111  return factory.vertexProvider_.getEntityObject( factory, level, (EntityImp *) 0);
112  }
113 
114  inline static void freeEntity(const GridObjectFactory& factory, EntityObject * e )
115  {
116  factory.vertexProvider_.freeObject( e );
117  }
118  }; // end of ALUGridEntityFactory
119 
120  enum { vxCodim = GridImp :: dimension };
121  public:
122  typedef GridImp GridType;
123  typedef ALUGridObjectFactory FactoryType;
124 
125  typedef MakeableInterfaceObject<typename GridType :: Traits::template Codim<0>::Entity> EntityObject;
126  typedef MakeableInterfaceObject<typename GridType :: Traits::template Codim<1>::Entity> FaceObject;
127  typedef MakeableInterfaceObject<typename GridType :: Traits::template Codim<2>::Entity> EdgeObject;
128  typedef MakeableInterfaceObject<typename GridType :: Traits::template Codim< vxCodim >::Entity> VertexObject;
129 
130  typedef typename GridType :: LeafIntersectionIteratorImp LeafIntersectionIteratorImp ;
131  typedef typename GridType :: LevelIntersectionIteratorImp LevelIntersectionIteratorImp ;
132 
133  // declare friendship
134  friend class ALUGridEntityFactory<FactoryType,0>;
135  friend class ALUGridEntityFactory<FactoryType,1>;
136  friend class ALUGridEntityFactory<FactoryType,2>;
137  friend class ALUGridEntityFactory<FactoryType,3>;
138 
139  protected:
140  typedef ALUMemoryProvider< EntityObject > EntityProvider;
141  typedef ALUMemoryProvider< FaceObject > FaceProvider;
142  typedef ALUMemoryProvider< EdgeObject > EdgeProvider;
143  typedef ALUMemoryProvider< VertexObject > VertexProvider;
144 
145  mutable EntityProvider entityProvider_;
146  mutable FaceProvider faceProvider_;
147  mutable EdgeProvider edgeProvider_;
148  mutable VertexProvider vertexProvider_;
149 
150  typedef ALUMemoryProvider< LeafIntersectionIteratorImp > LeafIntersectionIteratorProviderType;
151  typedef ALUMemoryProvider< LevelIntersectionIteratorImp > LevelIntersectionIteratorProviderType;
152 
153  mutable LeafIntersectionIteratorProviderType leafInterItProvider_;
154  mutable LevelIntersectionIteratorProviderType levelInterItProvider_;
155 
156  const GridType& grid_ ;
157 
158 #ifdef USE_SMP_PARALLEL
159  public:
160 #endif
161  ALUGridObjectFactory( const ALUGridObjectFactory& other ) : grid_( other.grid_ ) {}
162 
163  public:
164  const GridType& grid() const { return grid_; }
165 
166  ALUGridObjectFactory( const GridType& grid ) : grid_( grid ) {}
167 
168  template <int codim>
169  inline MakeableInterfaceObject<typename GridType :: Traits::template Codim<codim>::Entity> *
170  getNewEntity ( int level = -1 ) const
171  {
172  return ALUGridEntityFactory<FactoryType,codim>::getNewEntity( *this, level);
173  }
174 
175  template <int codim>
176  inline void freeEntity (MakeableInterfaceObject<typename GridType :: Traits::template Codim<codim>::Entity> * en) const
177  {
178  ALUGridEntityFactory<FactoryType,codim>::freeEntity(*this, en);
179  }
180 
181  LeafIntersectionIteratorImp& getIntersection( const int wLevel, const LeafIntersectionIteratorImp* ) const
182  {
183  return * (leafInterItProvider_.getObject( *this, wLevel ));
184  }
185 
186  LevelIntersectionIteratorImp& getIntersection(const int wLevel, const LevelIntersectionIteratorImp* ) const
187  {
188  return * (levelInterItProvider_.getObject( *this, wLevel ));
189  }
190 
192  void freeIntersection(LeafIntersectionIteratorImp & it) const { leafInterItProvider_.freeObject( &it ); }
193  void freeIntersection(LevelIntersectionIteratorImp & it) const { levelInterItProvider_.freeObject( &it ); }
194 
195  // return thread number
196  static inline int threadNumber()
197  {
198 #ifdef _OPENMP
199  return omp_get_thread_num();
200 #elif HAVE_DUNE_FEM
201  return Fem :: ThreadManager :: thread() ;
202 #else
203  return 0;
204 #endif
205  }
206 
207  // return maximal possible number of threads
208  static inline int maxThreads() {
209 #ifdef _OPENMP
210  return omp_get_max_threads();
211 #elif HAVE_DUNE_FEM
212  return Fem :: ThreadManager :: maxThreads() ;
213 #else
214  return 1;
215 #endif
216  }
217  };
218 
219 } // end namespace Dune
220 #endif
Dune namespace.
Definition: alignment.hh:10
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 16, 22:29, 2024)