LifeV
MeshVolumeSubdivision.hpp
Go to the documentation of this file.
1 /*
2  * MeshVolumeSubdivision.hpp
3  *
4  * Created on: Apr 21, 2015
5  * Author: dalsanto
6  * Mail: niccolo.dalsanto@epfl.ch
7  */
8 
9 #ifndef _MeshVolumeSubdivision_HPP_
10 #define _MeshVolumeSubdivision_HPP_
11 
12 namespace LifeV
13 {
14 //! MeshVolumeSubdivision.
15 /*!
16  @author
17  Constructs local arrays containing the volumes ID corresponding to the Physical Entities specified by different regionflags
18 
19  */
20 template<typename MeshType>
22 {
23 public:
24  //! @name Public Types
25  //@{
26  typedef MeshType mesh_Type;
28 
30  MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm );
31  MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, bool _verbose = false );
32  MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, UInt _numSubregions = 1, bool _verbose = false );
33  MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, meshPtr_Type _mesh,
34  UInt _numSubregions = 1, bool _verbose = false );
35  MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, meshPtr_Type _mesh,
36  Epetra_IntSerialDenseVector _regionFlags, UInt _numSubregions = 1, bool _verbose = false );
37 
39 
40 private:
41 
43  UInt assignRegionFlags( Epetra_IntSerialDenseVector _regionFlags );
46 
47 public:
48 
49  void printFlags();
51  void printElementPerFlag();
53  const UInt getNumElements( UInt flag ) const;
54  const UInt * getSubmesh( UInt flag ) const;
55  const UInt getFlag( UInt flag ) const;
56 
57 private:
58 
59  bool M_verbose;
61 
66 
69 
70 };
71 
72 template<typename MeshType>
73 MeshVolumeSubdivision<MeshType>::
74 MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm )
75 :
76 M_comm( _comm )
77 {}
78 
79 template<typename MeshType>
80 MeshVolumeSubdivision<MeshType>::
81 MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, bool _verbose )
82 :
83 M_comm(_comm),
84 M_verbose( _verbose )
85 {}
86 
87 template<typename MeshType>
88 MeshVolumeSubdivision<MeshType>::
89 MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, UInt _numSubregions, bool _verbose )
90 :
91 M_comm(_comm),
92 M_verbose( _verbose ),
93 M_numSubregions( _numSubregions )
94 {
96 
97  for( UInt iRegion; iRegion < M_numSubregions; iRegion++ )
98  {
99  M_numElementPerFlag( iRegion ) = 0;
100  }
101 
102 
103 }
104 
105 template<typename MeshType>
106 MeshVolumeSubdivision<MeshType>::
107 MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, meshPtr_Type _mesh,
108  UInt _numSubregions, bool _verbose )
109 :
110 M_comm(_comm),
111 M_verbose( _verbose ),
112 M_mesh( _mesh ),
113 M_numSubregions( _numSubregions ),
116 M_readRegionFlags( false )
117 {
119 
120  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
121  {
122  M_numElementPerFlag( iRegion ) = 0;
123  }
124 
125 }
126 
127 
128 template<typename MeshType>
129 MeshVolumeSubdivision<MeshType>::
130 MeshVolumeSubdivision( std::shared_ptr< Epetra_Comm > _comm, meshPtr_Type _mesh,
131  Epetra_IntSerialDenseVector _regionFlags, UInt _numSubregions, bool _verbose )
132 :
133 M_comm(_comm),
134 M_verbose( _verbose ),
135 M_mesh( _mesh ),
136 M_numSubregions( _numSubregions ),
139 M_readRegionFlags( true )
140 {
142 }
143 
144 template<typename MeshType>
145 MeshVolumeSubdivision<MeshType>::
147 {
148  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
149  {
150  delete M_elements[iRegion];
151  }
152  delete M_elements;
153 }
154 
155 template<typename MeshType>
156 UInt
157 MeshVolumeSubdivision<MeshType>::
158 assignRegionFlags( Epetra_IntSerialDenseVector _regionFlags )
159 {
160  M_regionFlags = _regionFlags;
161  M_readRegionFlags = true;
162 }
163 
164 template<typename MeshType>
165 UInt
166 MeshVolumeSubdivision<MeshType>::
168 {
169 
170  if( M_verbose )
171  {
172  std::cout << "Counting elements per flag" << std::endl;
173  }
174 
175  if ( !M_readRegionFlags )
176  {
177  std::cout << "I HAVE NOT READ THE FLAGS" << std::endl;
178  assert(false);
179  }
180 
181  UInt nbElements ( M_mesh->numElements() );
182  UInt oldMarkerID = M_mesh->element( 0 ).markerID( ) + 1;
183  UInt numRegion = 0;
184 
185  if (M_verbose)
186  {
187  std::cout << std::endl << "TOTAL NUMBER OF ELEMENTS proc " << M_comm->MyPID() << ": " << nbElements << std::endl << std::endl;
188  }
189 
190  for (UInt iElement(0); iElement < nbElements; iElement++)
191  {
192  // Extracting the marker
193  UInt markerID = M_mesh->element( iElement ).markerID( );
194 
195  if( oldMarkerID != markerID )
196  {
197  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
198  {
199  if( M_regionFlags( iRegion ) == markerID )
200  {
201  numRegion = iRegion;
202  iRegion = M_numSubregions; // exit from internal loop
203  }
204  }
205  }
206 
207  M_numElementPerFlag( numRegion ) = M_numElementPerFlag( numRegion ) + 1;
208  oldMarkerID = markerID;
209 
210  }
211 
212  if( M_verbose )
213  {
215  }
216 
217 }
218 
219 
220 template<typename MeshType>
221 UInt
222 MeshVolumeSubdivision<MeshType>::
224 {
225 
226  if( M_verbose )
227  {
228  std::cout << "Filling elements per flag" << std::endl;
229  }
230 
231  if ( !M_readRegionFlags )
232  {
233  std::cout << "I HAVE NOT READ THE FLAGS" << std::endl;
234  assert(false);
235  }
236 
237  std::vector<int> counters(M_numSubregions, 0);
238 
239  UInt nbElements( M_mesh->numElements( ) );
240  UInt oldMarkerID = 0;
241  UInt numRegion = 0;
242 
243  for (UInt iElement(0); iElement < nbElements; iElement++)
244  {
245  // Extracting the marker
246  UInt markerID = M_mesh->element( iElement ).markerID( );
247 
248  if( oldMarkerID != markerID )
249  {
250  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
251  {
252  if( M_regionFlags( iRegion ) == markerID )
253  {
254  numRegion = iRegion;
255  iRegion = M_numSubregions;
256  }
257  }
258  }
259 
260  (M_elements[numRegion])[ counters[numRegion] ] = iElement;
261  counters[numRegion]++;
262  oldMarkerID = markerID;
263  }
264 
265 }
266 
267 template<typename MeshType>
268 void
269 MeshVolumeSubdivision<MeshType>::
271 {
272 
273  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
274  {
275  std::cout << "ID " << M_comm->MyPID() << " Region: " << iRegion
276  << " flag " << M_regionFlags( iRegion ) << std::endl;
277  }
278 
279 
280 }
281 
282 template<typename MeshType>
283 void
284 MeshVolumeSubdivision<MeshType>::
286 {
287 
288  std::cout << "Printing number of element per each flag " << std::endl;
289 
290  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
291  {
292  std::cout << "ID " << M_comm->MyPID()
293  << " Region: " << iRegion
294  << " flag " << M_regionFlags( iRegion )
295  << " numElements: " << M_numElementPerFlag( iRegion ) << std::endl;
296  }
297 
298 }
299 
300 template<typename MeshType>
301 UInt
302 MeshVolumeSubdivision<MeshType>::
304 {
305 
306  if( M_verbose )
307  {
308  std::cout << "Allocating for the elements" << std::endl;
309  }
310 
311  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
312  {
313  if( M_numElementPerFlag( iRegion ) > 0 )
314  {
315  M_elements[iRegion] = new UInt[M_numElementPerFlag( iRegion ) ];
316  }
317  else
318  {
319  M_elements[iRegion] = nullptr;
320  }
321  }
322 
323 }
324 
325 template<typename MeshType>
326 void
327 MeshVolumeSubdivision<MeshType>::
329 {
330 
331  std::cout << "Printing number of element per each flag " << std::endl;
332 
333  for( UInt iRegion(0); iRegion < M_numSubregions; iRegion++ )
334  {
335  for( UInt iElement(0); iElement < M_numElementPerFlag( iRegion ); iElement++ )
336  {
337  std::cout << "ID " << M_comm->MyPID()
338  << " Region: " << iRegion
339  << " flag " << M_regionFlags( iRegion )
340  << " numElements: " << M_numElementPerFlag( iRegion )
341  << " element " << iElement
342  << " globally in the mpi local mesh " << (M_elements[iRegion])[ iElement ]
343  << std::endl;
344  }
345  }
346 
347 }
348 
349 
350 template<typename MeshType>
351 UInt
352 MeshVolumeSubdivision<MeshType>::
354 {
358 
359 }
360 
361 template<typename MeshType>
362 const UInt
363 MeshVolumeSubdivision<MeshType>::
364 getNumElements( UInt flag ) const
365 {
366  return M_numElementPerFlag[flag];
367 }
368 
369 template<typename MeshType>
370 const UInt *
371 MeshVolumeSubdivision<MeshType>::
372 getSubmesh( UInt flag ) const
373 {
374  return M_elements[flag];
375 }
376 
377 template<typename MeshType>
378 const UInt
379 MeshVolumeSubdivision<MeshType>::
380 getFlag( UInt flag ) const
381 {
382  return M_regionFlags( flag );
383 }
384 
385 
386 
387 
388 
389 
390 
391 
392 
393 } // end LfeV namespace
394 
395 #endif /* LIFEV_REDUCED_BASIS_SOLVER_MeshVolumeSubdivision_HPP_ */
const UInt getFlag(UInt flag) const
std::shared_ptr< MeshType > meshPtr_Type
MeshVolumeSubdivision(std::shared_ptr< Epetra_Comm > _comm, meshPtr_Type _mesh, UInt _numSubregions=1, bool _verbose=false)
MeshVolumeSubdivision(std::shared_ptr< Epetra_Comm > _comm)
MeshVolumeSubdivision(std::shared_ptr< Epetra_Comm > _comm, bool _verbose=false)
UInt assignRegionFlags(Epetra_IntSerialDenseVector _regionFlags)
MeshVolumeSubdivision(std::shared_ptr< Epetra_Comm > _comm, UInt _numSubregions=1, bool _verbose=false)
MeshVolumeSubdivision(std::shared_ptr< Epetra_Comm > _comm, meshPtr_Type _mesh, Epetra_IntSerialDenseVector _regionFlags, UInt _numSubregions=1, bool _verbose=false)
const UInt getNumElements(UInt flag) const
Epetra_IntSerialDenseVector M_numElementPerFlag
std::shared_ptr< Epetra_Comm > M_comm
Epetra_IntSerialDenseVector M_regionFlags
uint32_type UInt
generic unsigned integer (used mainly for addressing)
Definition: LifeV.hpp:191
const UInt * getSubmesh(UInt flag) const