3 #ifndef DUNE_ALBERTA_MESHPOINTER_HH
4 #define DUNE_ALBERTA_MESHPOINTER_HH
31 class HierarchyDofNumbering;
39 typedef Alberta::ElementInfo< dim > ElementInfo;
43 class BoundaryProvider;
45 template<
int dimWorld >
64 operator bool ()
const
71 return MacroIterator( *
this,
false );
74 MacroIterator
end ()
const
76 return MacroIterator( *
this,
true );
80 int size (
int codim )
const;
91 template<
class Proj,
class Impl >
99 unsigned int create (
const std::string &filename,
bool binary =
false );
110 unsigned int read (
const std::string &filename,
Real &time );
112 bool write (
const std::string &filename,
Real time )
const;
116 template<
class Functor >
120 template<
class Functor >
129 static ALBERTA NODE_PROJECTION *
130 initNodeProjection (
Mesh *mesh,
ALBERTA MACRO_EL *macroElement,
int n );
131 template<
class ProjectionProv
ider >
132 static ALBERTA NODE_PROJECTION *
133 initNodeProjection (
Mesh *mesh,
ALBERTA MACRO_EL *macroElement,
int n );
144 template<
int dimWorld >
145 struct MeshPointer< dim >::Library
149 static unsigned int boundaryCount;
150 static const void *projectionFactory;
153 create ( MeshPointer &ptr,
const MacroData< dim > ¯oData,
155 static void release ( MeshPointer &ptr );
168 friend class MeshPointer< dim >;
194 return (index_ == other.index_);
206 return static_cast< const MacroElement &
>( mesh().mesh_->macro_els[ index_ ] );
209 const MeshPointer &
mesh ()
const
220 ElementInfo operator* ()
const
222 return elementInfo();
227 return equals( other );
232 return !equals( other );
239 return ElementInfo();
241 return ElementInfo( mesh(), macroElement(), fillFlags );
257 return (mesh_ ? mesh_->n_macro_el : 0);
264 assert( (codim >= 0) && (codim <= 1) );
265 return (codim == 0 ? mesh_->n_elements : mesh_->n_vertices);
271 assert( (codim >= 0) && (codim <= 2) );
273 return mesh_->n_elements;
274 else if( codim == 2 )
275 return mesh_->n_vertices;
277 return mesh_->n_edges;
283 assert( (codim >= 0) && (codim <= 3) );
285 return mesh_->n_elements;
286 else if( codim == 3 )
287 return mesh_->n_vertices;
288 else if( codim == 1 )
289 return mesh_->n_faces;
291 return mesh_->n_edges;
301 Library< dimWorld >::boundaryCount = 0;
302 Library< dimWorld >::create( *
this, macroData, &initNodeProjection );
303 return Library< dimWorld >::boundaryCount;
308 template<
class Proj,
class Impl >
317 Library< dimWorld >::boundaryCount = 0;
318 Library< dimWorld >::projectionFactory = &projectionFactory;
319 Library< dimWorld >::create( *
this, macroData, &initNodeProjection< ProjectionFactory > );
320 Library< dimWorld >::projectionFactory = 0;
321 return Library< dimWorld >::boundaryCount;
329 ::create (
const std::string &filename,
bool binary )
332 macroData.
read( filename, binary );
333 const unsigned int boundaryCount = create( macroData );
335 return boundaryCount;
344 Library< dimWorld >::boundaryCount = 0;
345 mesh_ =
ALBERTA read_mesh_xdr( filename.c_str(), &time, NULL, NULL );
346 return Library< dimWorld >::boundaryCount;
353 int success =
ALBERTA write_mesh_xdr( mesh_, filename.c_str(), time );
354 return (success == 0);
361 Library< dimWorld >::release( *
this );
366 template<
class Functor >
381 template<
class Functor >
412 inline ALBERTA NODE_PROJECTION *
416 if( (n > 0) && macroElement.
isBoundary( n-1 ) )
424 template<
class ProjectionFactory >
425 inline ALBERTA NODE_PROJECTION *
426 MeshPointer< dim >::initNodeProjection (
Mesh *mesh,
ALBERTA MACRO_EL *macroEl,
int n )
430 const MacroElement ¯oElement =
static_cast< const MacroElement &
>( *macroEl );
432 MeshPointer< dim > meshPointer( mesh );
434 const ProjectionFactory &projectionFactory = *
static_cast< const ProjectionFactory *
>( Library< dimWorld >::projectionFactory );
435 if( (n > 0) && macroElement.isBoundary( n-1 ) )
437 const unsigned int boundaryIndex = Library< dimWorld >::boundaryCount++;
438 if( projectionFactory.hasProjection( elementInfo, n-1 ) )
440 Projection projection = projectionFactory.projection( elementInfo, n-1 );
441 return new NodeProjection< dim, Projection >( boundaryIndex, projection );
444 return new BasicNodeProjection( boundaryIndex );
446 else if( (dim <
dimWorld) && (n == 0) )
449 if( projectionFactory.hasProjection( elementInfo ) )
451 Projection projection = projectionFactory.projection( elementInfo );
452 return new NodeProjection< dim, Projection >( boundaryIndex, projection );
465 #endif // #if HAVE_ALBERTA
467 #endif // #ifndef DUNE_ALBERTA_MESHPOINTER_HH
MacroIterator begin() const
Definition: meshpointer.hh:69
ALBERTA MESH Mesh
Definition: misc.hh:50
bool write(const std::string &filename, Real time) const
Definition: meshpointer.hh:351
Alberta::ElementInfo< dim > ElementInfo
Definition: meshpointer.hh:172
MacroIterator()
Definition: meshpointer.hh:174
ALBERTA FLAGS Flags
Definition: misc.hh:229
bool coarsen(typename FillFlags::Flags fillFlags=FillFlags::nothing)
Definition: meshpointer.hh:396
MeshPointer(Mesh *mesh)
Definition: meshpointer.hh:55
Alberta::MacroElement< dimension > MacroElement
Definition: elementinfo.hh:56
#define ALBERTA
Definition: albertaheader.hh:27
int max(const DofVectorPointer< int > &dofVector)
Definition: dofvector.hh:335
Include standard header files.
Definition: agrid.hh:59
void leafTraverse(Functor &functor) const
Definition: elementinfo.hh:706
Base::Projection Projection
Definition: albertagrid/projection.hh:138
MacroIterator end() const
Definition: meshpointer.hh:74
Definition: albertagrid/projection.hh:204
static const Flags standard
Definition: misc.hh:253
Alberta::FillFlags< dimension > FillFlags
Definition: elementinfo.hh:58
bool refine(typename FillFlags::Flags fillFlags=FillFlags::nothing)
Definition: meshpointer.hh:405
static const int meshRefined
Definition: misc.hh:53
provides a wrapper for ALBERTA's macro_data structure
const MeshPointer & mesh() const
Definition: meshpointer.hh:209
Definition: albertagrid/projection.hh:77
int size(int codim) const
unsigned int create(const MacroData< dim > ¯oData)
Definition: meshpointer.hh:297
void hierarchicTraverse(Functor &functor, typename FillFlags::Flags fillFlags=FillFlags::standard) const
Definition: meshpointer.hh:368
Definition: macroelement.hh:20
Definition: dofadmin.hh:21
static const int dimWorld
Definition: misc.hh:43
void increment()
Definition: meshpointer.hh:197
void release()
release the macro data structure
Definition: macrodata.hh:125
static const int meshCoarsened
Definition: misc.hh:54
MeshPointer()
Definition: meshpointer.hh:51
int numMacroElements() const
Definition: meshpointer.hh:255
Definition: albertagrid/projection.hh:25
void release()
Definition: meshpointer.hh:359
void leafTraverse(Functor &functor, typename FillFlags::Flags fillFlags=FillFlags::standard) const
Definition: meshpointer.hh:383
Definition: elementinfo.hh:40
provides a wrapper for ALBERTA's el_info structure
Definition: grapecommon.hh:49
static const Flags nothing
Definition: misc.hh:231
void read(const std::string &filename, bool binary=false)
Definition: macrodata.hh:410
void hierarchicTraverse(Functor &functor) const
Definition: elementinfo.hh:693
ElementInfo elementInfo(typename FillFlags::Flags fillFlags=FillFlags::standard) const
Definition: meshpointer.hh:236
unsigned int read(const std::string &filename, Real &time)
Definition: meshpointer.hh:340
bool equals(const MacroIterator &other) const
Definition: meshpointer.hh:192
Definition: macrodata.hh:27
ALBERTA REAL Real
Definition: misc.hh:45
const MacroElement & macroElement() const
Definition: meshpointer.hh:203
Alberta::MeshPointer< dim > MeshPointer
Definition: meshpointer.hh:171
bool isBoundary(const int face) const
Definition: macroelement.hh:40
bool done() const
Definition: meshpointer.hh:187
Definition: meshpointer.hh:164