3#ifndef DUNE_ALBERTA_MACRODATA_HH
4#define DUNE_ALBERTA_MACRODATA_HH
14#include <dune/grid/albertagrid/misc.hh>
15#include <dune/grid/albertagrid/algebra.hh>
16#include <dune/grid/albertagrid/albertaheader.hh>
29 typedef MacroData< dim > This;
31 typedef ALBERTA MACRO_DATA Data;
33 static const int dimension = dim;
34 static const int numVertices = NumSubEntities< dimension, dimension >::value;
35 static const int numEdges = NumSubEntities< dimension, dimension-1 >::value;
37 static const int initialSize = 4096;
43 template<
int >
friend struct InstantiateMacroDataLibrary;
46 typedef int ElementId[ numVertices ];
48 static const int supportPeriodicity = (DUNE_ALBERTA_VERSION >= 0x300);
56 operator Data * ()
const
61 int vertexCount ()
const
63 return (vertexCount_ < 0 ? data_->n_total_vertices : vertexCount_);
66 int elementCount ()
const
68 return (elementCount_ < 0 ? data_->n_macro_elements : elementCount_);
71 ElementId &element (
int i )
const;
72 GlobalVector &vertex (
int i )
const;
73 int &neighbor (
int element,
int i )
const;
74 BoundaryId &boundaryId (
int element,
int i )
const;
100 void markLongestEdge ();
110 void setOrientation (
const Real orientation );
122 bool checkNeighbors ()
const;
129 ALBERTA free_macro_data( data_ );
132 vertexCount_ = elementCount_ = -1;
140 int insertElement (
const ElementId &
id );
147 int insertVertex (
const GlobalVector &coords )
149 assert( vertexCount_ >= 0 );
150 if( vertexCount_ >= data_->n_total_vertices )
151 resizeVertices( 2*vertexCount_ );
152 copy( coords, vertex( vertexCount_ ) );
153 return vertexCount_++;
161 int insertVertex (
const FieldVector< Real, dimWorld > &coords )
163 assert( vertexCount_ >= 0 );
164 if( vertexCount_ >= data_->n_total_vertices )
165 resizeVertices( 2*vertexCount_ );
166 copy( coords, vertex( vertexCount_ ) );
167 return vertexCount_++;
170 void insertWallTrafo (
const GlobalMatrix &m,
const GlobalVector &t );
171 void insertWallTrafo (
const FieldMatrix< Real, dimWorld, dimWorld > &matrix,
172 const FieldVector< Real, dimWorld > &shift );
176 void read (
const std::string &filename,
bool binary =
false );
178 bool write (
const std::string &filename,
bool binary =
false )
const
181 return ALBERTA write_macro_data_xdr( data_, filename.c_str() );
183 return ALBERTA write_macro_data( data_, filename.c_str() );
187 template<
class Vector >
188 void copy (
const Vector &x, GlobalVector &y )
190 for(
int i = 0; i < dimWorld; ++i )
194 void resizeElements (
const int newSize );
196 void resizeVertices (
const int newSize )
198 const int oldSize = data_->n_total_vertices;
199 data_->n_total_vertices = newSize;
200 data_->coords = memReAlloc< GlobalVector >( data_->coords, oldSize, newSize );
201 assert( (data_->coords != NULL) || (newSize == 0) );
217 struct MacroData< dim >::Library
219 typedef Alberta::MacroData< dim > MacroData;
221 static bool checkNeighbors (
const MacroData ¯oData );
222 static void markLongestEdge ( MacroData ¯oData );
223 static void setOrientation ( MacroData ¯oData,
const Real orientation );
226 static Real edgeLength (
const MacroData ¯oData,
const ElementId &e,
int edge );
227 static int longestEdge (
const MacroData ¯oData,
const ElementId &e );
229 template<
class Type >
230 static void rotate ( Type *array,
int i,
int shift );
232 static void rotate ( MacroData ¯oData,
int i,
int shift );
233 static void swap ( MacroData ¯oData,
int el,
int v1,
int v2 );
242 inline typename MacroData< dim >::ElementId &
243 MacroData< dim >::element (
int i )
const
245 assert( (i >= 0) && (i < data_->n_macro_elements) );
246 const int offset = i * numVertices;
247 return *
reinterpret_cast< ElementId *
>( data_->mel_vertices + offset );
252 inline GlobalVector &MacroData< dim >::vertex (
int i )
const
254 assert( (i >= 0) && (i < data_->n_total_vertices) );
255 return data_->coords[ i ];
260 inline int &MacroData< dim >::neighbor (
int element,
int i )
const
262 assert( (element >= 0) && (element < data_->n_macro_elements) );
263 assert( (i >= 0) && (i < numVertices) );
264 return data_->neigh[ element*numVertices + i ];
269 inline BoundaryId &MacroData< dim >::boundaryId (
int element,
int i )
const
271 assert( (element >= 0) && (element < data_->n_macro_elements) );
272 assert( (i >= 0) && (i < numVertices) );
273 return data_->boundary[ element*numVertices + i ];
277#if DUNE_ALBERTA_VERSION >= 0x300
279 inline void MacroData< dim >::create ()
282 data_ = ALBERTA alloc_macro_data( dim, initialSize, initialSize );
283 data_->boundary = memAlloc< BoundaryId >( initialSize*numVertices );
285 data_->el_type = memAlloc< ElementType >( initialSize );
286 vertexCount_ = elementCount_ = 0;
291#if DUNE_ALBERTA_VERSION == 0x200
293 inline void MacroData< dim >::create ()
296 data_ = ALBERTA alloc_macro_data( dim, initialSize, initialSize, 0 );
297 data_->boundary = memAlloc< BoundaryId >( initialSize*numVertices );
299 data_->el_type = memAlloc< ElementType >( initialSize );
300 vertexCount_ = elementCount_ = 0;
307 inline void MacroData< dim >::finalize ()
309 if( (vertexCount_ >= 0) && (elementCount_ >= 0) )
311 resizeVertices( vertexCount_ );
312 resizeElements( elementCount_ );
313 ALBERTA compute_neigh_fast( data_ );
316 for(
int element = 0; element < elementCount_; ++element )
318 for(
int i = 0; i < numVertices; ++i )
320 BoundaryId &
id = boundaryId( element, i );
321 if( neighbor( element, i ) >= 0 )
323 assert(
id == InteriorBoundary );
324 id = InteriorBoundary;
327 id = (
id == InteriorBoundary ? DirichletBoundary : id);
331 vertexCount_ = elementCount_ = -1;
333 assert( (vertexCount_ < 0) && (elementCount_ < 0) );
338 inline void MacroData< dim >::markLongestEdge ()
340 Library< dimWorld >::markLongestEdge( *
this );
345 inline void MacroData< dim >::setOrientation (
const Real orientation )
347 Library< dimWorld >::setOrientation( *
this, orientation );
352 inline bool MacroData< dim >::checkNeighbors ()
const
354 return Library< dimWorld >::checkNeighbors( *
this );
359 inline int MacroData< dim >::insertElement (
const ElementId &
id )
361 assert( elementCount_ >= 0 );
362 if( elementCount_ >= data_->n_macro_elements )
363 resizeElements( 2*elementCount_ );
365 ElementId &e = element( elementCount_ );
366 for(
int i = 0; i < numVertices; ++i )
369 boundaryId( elementCount_, i ) = InteriorBoundary;
372 data_->el_type[ elementCount_ ] = 0;
374 return elementCount_++;
378#if DUNE_ALBERTA_VERSION >= 0x300
380 inline void MacroData< dim >
381 ::insertWallTrafo (
const GlobalMatrix &matrix,
const GlobalVector &shift )
383 int &count = data_->n_wall_trafos;
384 AffineTransformation *&array = data_->wall_trafos;
387 array = memReAlloc< AffineTransformation >( array, count, count+1 );
388 assert( data_->wall_trafos != NULL );
391 for(
int i = 0; i < dimWorld; ++i )
392 copy( matrix[ i ], array[ count ].M[ i ] );
393 copy( shift, array[ count ].t );
398 inline void MacroData< dim >
399 ::insertWallTrafo (
const FieldMatrix< Real, dimWorld, dimWorld > &matrix,
400 const FieldVector< Real, dimWorld > &shift )
402 int &count = data_->n_wall_trafos;
403 AffineTransformation *&array = data_->wall_trafos;
406 array = memReAlloc< AffineTransformation >( array, count, count+1 );
407 assert( data_->wall_trafos != NULL );
410 for(
int i = 0; i < dimWorld; ++i )
411 copy( matrix[ i ], array[ count ].M[ i ] );
412 copy( shift, array[ count ].t );
417#if DUNE_ALBERTA_VERSION <= 0x200
419 inline void MacroData< dim >
420 ::insertWallTrafo (
const GlobalMatrix &m,
const GlobalVector &t )
423 "Periodic grids are only supported in ALBERTA 3.0 or higher." );
427 inline void MacroData< dim >
428 ::insertWallTrafo (
const FieldMatrix< Real, dimWorld, dimWorld > &matrix,
429 const FieldVector< Real, dimWorld > &shift )
432 "Periodic grids are only supported in ALBERTA 3.0 or higher." );
438 inline void MacroData< dim >::checkCycles ()
442 ALBERTA macro_test( data_, NULL );
447 inline void MacroData< dim >::read (
const std::string &filename,
bool binary )
451 data_ = ALBERTA read_macro_xdr( filename.c_str() );
453 data_ = ALBERTA read_macro( filename.c_str() );
458 inline void MacroData< dim >::resizeElements (
const int newSize )
460 const int oldSize = data_->n_macro_elements;
461 data_->n_macro_elements = newSize;
462 data_->mel_vertices = memReAlloc( data_->mel_vertices, oldSize*numVertices, newSize*numVertices );
463 data_->boundary = memReAlloc( data_->boundary, oldSize*numVertices, newSize*numVertices );
465 data_->el_type = memReAlloc( data_->el_type, oldSize, newSize );
466 assert( (newSize == 0) || (data_->mel_vertices != NULL) );
Implements a matrix constructed from a given type representing a field and compile-time given number ...
Implements a vector constructed from a given type representing a field and a compile-time given size.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:244
Dune namespace.
Definition: alignment.hh:14