dune-grid
2.2.0
|
00001 #ifndef DUNE_ALBERTAGRID_IMP_HH 00002 #define DUNE_ALBERTAGRID_IMP_HH 00003 00009 #if HAVE_ALBERTA 00010 00011 #include <iostream> 00012 #include <fstream> 00013 #include <dune/common/deprecated.hh> 00014 00015 #include <algorithm> 00016 #include <cassert> 00017 #include <vector> 00018 00019 // Dune includes 00020 #include <dune/common/misc.hh> 00021 #include <dune/common/fvector.hh> 00022 #include <dune/common/fmatrix.hh> 00023 #include <dune/common/stdstreams.hh> 00024 #include <dune/common/collectivecommunication.hh> 00025 00026 #include <dune/grid/common/grid.hh> 00027 #include <dune/grid/common/gridfactory.hh> 00028 #include <dune/grid/common/adaptcallback.hh> 00029 #include <dune/grid/common/sizecache.hh> 00030 00031 //- Local includes 00032 // some cpp defines and include of alberta.h 00033 #include "albertaheader.hh" 00034 00035 // grape data io 00036 #include <dune/grid/utility/grapedataioformattypes.hh> 00037 00038 #include <dune/grid/albertagrid/misc.hh> 00039 #include <dune/grid/albertagrid/capabilities.hh> 00040 #include <dune/grid/albertagrid/backuprestore.hh> 00041 00042 #include <dune/grid/albertagrid/coordcache.hh> 00043 #include <dune/grid/albertagrid/gridfamily.hh> 00044 #include <dune/grid/albertagrid/level.hh> 00045 #include <dune/grid/albertagrid/intersection.hh> 00046 #include <dune/grid/albertagrid/intersectioniterator.hh> 00047 #include <dune/grid/albertagrid/datahandle.hh> 00048 #include <dune/grid/albertagrid/entityseed.hh> 00049 00050 #include "indexsets.hh" 00051 #include "geometry.hh" 00052 #include "entity.hh" 00053 #include "entitypointer.hh" 00054 #include "hierarchiciterator.hh" 00055 #include "treeiterator.hh" 00056 #include "leveliterator.hh" 00057 #include "leafiterator.hh" 00058 00059 namespace Dune 00060 { 00061 00062 // External Forward Declarations 00063 // ----------------------------- 00064 00065 template< class Grid > 00066 class DGFGridFactory; 00067 00068 00069 00070 // AlbertaGrid 00071 // ----------- 00072 00136 template< int dim, int dimworld = Alberta::dimWorld > 00137 class AlbertaGrid 00138 : public GridDefaultImplementation 00139 < dim, dimworld, Alberta::Real, AlbertaGridFamily< dim, dimworld > > 00140 { 00141 typedef AlbertaGrid< dim, dimworld > This; 00142 typedef GridDefaultImplementation 00143 < dim, dimworld, Alberta::Real, AlbertaGridFamily< dim, dimworld > > 00144 Base; 00145 00146 template< int, int, class > friend class AlbertaGridEntity; 00147 template< int, class > friend class AlbertaGridEntityPointer; 00148 template< class, PartitionIteratorType > friend class AlbertaLevelGridView; 00149 template< class, PartitionIteratorType > friend class AlbertaLeafGridView; 00150 00151 friend class GridFactory< This >; 00152 friend class DGFGridFactory< This >; 00153 00154 friend class AlbertaGridHierarchicIterator< This >; 00155 00156 friend class AlbertaGridIntersectionBase< const This >; 00157 friend class AlbertaGridLeafIntersection< const This >; 00158 00159 friend class AlbertaMarkerVector< dim, dimworld >; 00160 #if (__GNUC__ < 4) && !(defined __ICC) 00161 // add additional friend decls for gcc 3.4 00162 friend struct AlbertaMarkerVector< dim, dimworld >::MarkSubEntities<true>; 00163 friend struct AlbertaMarkerVector< dim, dimworld >::MarkSubEntities<false>; 00164 #endif 00165 friend class AlbertaGridIndexSet< dim, dimworld >; 00166 friend class AlbertaGridHierarchicIndexSet< dim, dimworld >; 00167 00168 template< class, class > 00169 friend class Alberta::AdaptRestrictProlongHandler; 00170 00171 public: 00173 typedef AlbertaGridFamily< dim, dimworld > GridFamily; 00174 00175 typedef typename GridFamily::ctype ctype; 00176 00177 static const int dimension = GridFamily::dimension; 00178 static const int dimensionworld = GridFamily::dimensionworld; 00179 00180 // the Traits 00181 typedef typename AlbertaGridFamily< dim, dimworld >::Traits Traits; 00182 00184 typedef typename Traits::LeafIndexSet LeafIndexSet; 00186 typedef typename Traits::LevelIndexSet LevelIndexSet; 00187 00189 typedef typename Traits::HierarchicIndexSet HierarchicIndexSet; 00190 00192 typedef typename Traits::GlobalIdSet GlobalIdSet; 00194 typedef typename Traits::LocalIdSet LocalIdSet; 00195 00197 typedef typename Traits::CollectiveCommunication CollectiveCommunication; 00198 00199 private: 00201 typedef typename Traits::template Codim<0>::LeafIterator LeafIterator; 00202 00204 typedef AlbertaGridIdSet<dim,dimworld> IdSetImp; 00205 00207 struct AdaptationState 00208 { 00209 enum Phase { ComputationPhase, PreAdaptationPhase, PostAdaptationPhase }; 00210 00211 private: 00212 Phase phase_; 00213 int coarsenMarked_; 00214 int refineMarked_; 00215 00216 public: 00217 AdaptationState () 00218 : phase_( ComputationPhase ), 00219 coarsenMarked_( 0 ), 00220 refineMarked_( 0 ) 00221 {} 00222 00223 void mark ( int count ) 00224 { 00225 if( count < 0 ) 00226 ++coarsenMarked_; 00227 if( count > 0 ) 00228 refineMarked_ += (2 << count); 00229 } 00230 00231 void unmark ( int count ) 00232 { 00233 if( count < 0 ) 00234 --coarsenMarked_; 00235 if( count > 0 ) 00236 refineMarked_ -= (2 << count); 00237 } 00238 00239 bool coarsen () const 00240 { 00241 return (coarsenMarked_ > 0); 00242 } 00243 00244 int refineMarked () const 00245 { 00246 return refineMarked_; 00247 } 00248 00249 void preAdapt () 00250 { 00251 if( phase_ != ComputationPhase ) 00252 error( "preAdapt may only be called in computation phase." ); 00253 phase_ = PreAdaptationPhase; 00254 } 00255 00256 void adapt () 00257 { 00258 if( phase_ != PreAdaptationPhase ) 00259 error( "adapt may only be called in preadapdation phase." ); 00260 phase_ = PostAdaptationPhase; 00261 } 00262 00263 void postAdapt () 00264 { 00265 if( phase_ != PostAdaptationPhase ) 00266 error( "postAdapt may only be called in postadaptation phase." ); 00267 phase_ = ComputationPhase; 00268 00269 coarsenMarked_ = 0; 00270 refineMarked_ = 0; 00271 } 00272 00273 private: 00274 void error ( const std::string &message ) 00275 { 00276 DUNE_THROW( InvalidStateException, message ); 00277 } 00278 }; 00279 00280 template< class DataHandler > 00281 struct AdaptationCallback; 00282 00283 // max number of allowed levels is 64 00284 static const int MAXL = 64; 00285 00286 typedef Alberta::ElementInfo< dimension > ElementInfo; 00287 typedef Alberta::MeshPointer< dimension > MeshPointer; 00288 typedef Alberta::HierarchyDofNumbering< dimension > DofNumbering; 00289 typedef AlbertaGridLevelProvider< dimension > LevelProvider; 00290 00291 // forbid copying and assignment 00292 AlbertaGrid ( const This & ); 00293 This &operator= ( const This & ); 00294 00295 public: 00297 AlbertaGrid (); 00298 00304 AlbertaGrid ( const Alberta::MacroData< dimension > ¯oData, 00305 const Dune::shared_ptr< DuneBoundaryProjection< dimensionworld > > &projection 00306 = Dune::shared_ptr< DuneBoundaryProjection< dimensionworld > >() ); 00307 00308 template< class Proj, class Impl > 00309 AlbertaGrid ( const Alberta::MacroData< dimension > ¯oData, 00310 const Alberta::ProjectionFactoryInterface< Proj, Impl > &projectionFactory ); 00311 00316 AlbertaGrid ( const std::string ¯oGridFileName ); 00317 00319 ~AlbertaGrid (); 00320 00323 int maxLevel () const; 00324 00326 template<int cd, PartitionIteratorType pitype> 00327 typename Traits::template Codim<cd>::template Partition<pitype>::LevelIterator 00328 lbegin (int level) const; 00329 00331 template<int cd, PartitionIteratorType pitype> 00332 typename Traits::template Codim<cd>::template Partition<pitype>::LevelIterator 00333 lend (int level) const; 00334 00336 template< int codim > 00337 typename Traits::template Codim< codim >::LevelIterator 00338 lbegin ( int level ) const; 00339 00341 template< int codim > 00342 typename Traits::template Codim< codim >::LevelIterator 00343 lend ( int level ) const; 00344 00346 template< int codim, PartitionIteratorType pitype > 00347 typename Traits 00348 ::template Codim< codim >::template Partition< pitype >::LeafIterator 00349 leafbegin () const; 00350 00352 template< int codim, PartitionIteratorType pitype > 00353 typename Traits 00354 ::template Codim< codim >::template Partition< pitype >::LeafIterator 00355 leafend () const; 00356 00358 template< int codim > 00359 typename Traits::template Codim< codim >::LeafIterator 00360 leafbegin () const; 00361 00363 template< int codim > 00364 typename Traits::template Codim< codim >::LeafIterator 00365 leafend () const; 00366 00371 int size (int level, int codim) const; 00372 00374 int size (int level, GeometryType type) const; 00375 00377 int size (int codim) const; 00378 00380 int size (GeometryType type) const; 00381 00383 size_t numBoundarySegments () const 00384 { 00385 return numBoundarySegments_; 00386 } 00387 00389 template< PartitionIteratorType pitype > 00390 typename Traits::template Partition< pitype >::LevelGridView 00391 levelView ( int level ) const 00392 { 00393 typedef typename Traits::template Partition< pitype >::LevelGridView View; 00394 typedef typename View::GridViewImp ViewImp; 00395 return View( ViewImp( *this, level ) ); 00396 } 00397 00399 template< PartitionIteratorType pitype > 00400 typename Traits::template Partition< pitype >::LeafGridView leafView () const 00401 { 00402 typedef typename Traits::template Partition< pitype >::LeafGridView View; 00403 typedef typename View::GridViewImp ViewImp; 00404 return View( ViewImp( *this ) ); 00405 } 00406 00408 typename Traits::template Partition< All_Partition >::LevelGridView 00409 levelView ( int level ) const 00410 { 00411 typedef typename Traits::template Partition< All_Partition >::LevelGridView View; 00412 typedef typename View::GridViewImp ViewImp; 00413 return View( ViewImp( *this, level ) ); 00414 } 00415 00417 typename Traits::template Partition< All_Partition >::LeafGridView leafView () const 00418 { 00419 typedef typename Traits::template Partition< All_Partition >::LeafGridView View; 00420 typedef typename View::GridViewImp ViewImp; 00421 return View( ViewImp( *this ) ); 00422 } 00423 00424 public: 00425 //*************************************************************** 00426 // Interface for Adaptation 00427 //*************************************************************** 00428 using Base::getMark; 00429 using Base::mark; 00430 00432 int getMark ( const typename Traits::template Codim< 0 >::Entity &e ) const; 00433 00435 bool mark ( int refCount, const typename Traits::template Codim< 0 >::Entity &e ); 00436 00438 void globalRefine ( int refCount ); 00439 00440 template< class DataHandle > 00441 void globalRefine ( int refCount, AdaptDataHandleInterface< This, DataHandle > &handle ); 00442 00444 bool adapt (); 00445 00447 template< class DataHandle > 00448 bool adapt ( AdaptDataHandleInterface< This, DataHandle > &handle ); 00449 00451 bool preAdapt (); 00452 00454 void postAdapt(); 00455 00458 const CollectiveCommunication &comm () const 00459 { 00460 return comm_; 00461 } 00462 00463 static std::string typeName () 00464 { 00465 std::ostringstream s; 00466 s << "AlbertaGrid< " << dim << ", " << dimworld << " >"; 00467 return s.str(); 00468 } 00469 00471 template< class EntitySeed > 00472 typename Traits::template Codim< EntitySeed::codimension >::EntityPointer 00473 entityPointer ( const EntitySeed &seed ) const 00474 { 00475 typedef typename Traits::template Codim< EntitySeed::codimension >::EntityPointerImpl EntityPointerImpl; 00476 return EntityPointerImpl( *this, seed.elementInfo( meshPointer() ), seed.subEntity() ); 00477 } 00478 00479 //********************************************************** 00480 // End of Interface Methods 00481 //********************************************************** 00483 template< GrapeIOFileFormatType ftype > 00484 bool writeGrid( const std::string &filename, ctype time ) const; 00485 00487 template< GrapeIOFileFormatType ftype > 00488 bool readGrid( const std::string &filename, ctype &time ); 00489 00490 // return hierarchic index set 00491 const HierarchicIndexSet & hierarchicIndexSet () const { return hIndexSet_; } 00492 00494 const typename Traits :: LevelIndexSet & levelIndexSet (int level) const; 00495 00497 const typename Traits :: LeafIndexSet & leafIndexSet () const; 00498 00500 const GlobalIdSet &globalIdSet () const 00501 { 00502 return idSet_; 00503 } 00504 00506 const LocalIdSet &localIdSet () const 00507 { 00508 return idSet_; 00509 } 00510 00511 // access to mesh pointer, needed by some methods 00512 ALBERTA MESH* getMesh () const 00513 { 00514 return mesh_; 00515 }; 00516 00517 const MeshPointer &meshPointer () const 00518 { 00519 return mesh_; 00520 } 00521 00522 const DofNumbering &dofNumbering () const 00523 { 00524 return dofNumbering_; 00525 } 00526 00527 const LevelProvider &levelProvider () const 00528 { 00529 return levelProvider_; 00530 } 00531 00532 int dune2alberta ( int codim, int i ) const 00533 { 00534 return numberingMap_.dune2alberta( codim, i ); 00535 } 00536 00537 int alberta2dune ( int codim, int i ) const 00538 { 00539 return numberingMap_.alberta2dune( codim, i ); 00540 } 00541 00542 int generic2alberta ( int codim, int i ) const 00543 { 00544 return genericNumberingMap_.dune2alberta( codim, i ); 00545 } 00546 00547 int alberta2generic ( int codim, int i ) const 00548 { 00549 return genericNumberingMap_.alberta2dune( codim, i ); 00550 } 00551 00552 private: 00553 using Base::getRealImplementation; 00554 00555 typedef std::vector<int> ArrayType; 00556 00557 void setup (); 00558 00559 // make the calculation of indexOnLevel and so on. 00560 // extra method because of Reihenfolge 00561 void calcExtras(); 00562 00563 // write ALBERTA mesh file 00564 bool writeGridXdr ( const std::string &filename, ctype time ) const; 00565 00567 bool readGridXdr ( const std::string &filename, ctype &time ); 00568 00569 #if 0 00570 00571 bool readGridAscii ( const std::string &filename, ctype &time ); 00572 #endif 00573 00574 // delete mesh and all vectors 00575 void removeMesh(); 00576 00577 //*********************************************************************** 00578 // MemoryManagement for Entitys and Geometrys 00579 //********************************************************************** 00580 typedef MakeableInterfaceObject< typename Traits::template Codim< 0 >::Entity > 00581 EntityObject; 00582 00583 public: 00584 friend class AlbertaGridLeafIntersectionIterator< const This >; 00585 00586 template< int codim > 00587 static int 00588 getTwist ( const typename Traits::template Codim< codim >::Entity &entity ) 00589 { 00590 return getRealImplementation( entity ).twist(); 00591 } 00592 00593 template< int codim > 00594 static int 00595 getTwist ( const typename Traits::template Codim< 0 >::Entity &entity, int subEntity ) 00596 { 00597 return getRealImplementation( entity ).template twist< codim >( subEntity ); 00598 } 00599 00600 static int 00601 getTwistInInside ( const typename Traits::LeafIntersection &intersection ) 00602 { 00603 return getRealImplementation( intersection ).twistInInside(); 00604 } 00605 00606 static int 00607 getTwistInOutside ( const typename Traits::LeafIntersection &intersection ) 00608 { 00609 return getRealImplementation( intersection ).twistInOutside(); 00610 } 00611 00612 const AlbertaGridLeafIntersection< const This > & 00613 getRealIntersection ( const typename Traits::LeafIntersection &intersection ) const 00614 { 00615 return getRealImplementation( intersection ); 00616 } 00617 00618 public: 00619 // read global element number from elNumbers_ 00620 const Alberta::GlobalVector & 00621 getCoord ( const ElementInfo &elementInfo, int vertex ) const; 00622 00623 private: 00624 // pointer to an Albert Mesh, which contains the data 00625 MeshPointer mesh_; 00626 00627 // collective communication 00628 CollectiveCommunication comm_; 00629 00630 // maximum level of the mesh 00631 int maxlevel_; 00632 00633 // number of boundary segments within the macro grid 00634 size_t numBoundarySegments_; 00635 00636 // map between ALBERTA and DUNE numbering 00637 Alberta::NumberingMap< dimension, Alberta::Dune2AlbertaNumbering > numberingMap_; 00638 Alberta::NumberingMap< dimension, Alberta::Generic2AlbertaNumbering > genericNumberingMap_; 00639 00640 DofNumbering dofNumbering_; 00641 00642 LevelProvider levelProvider_; 00643 00644 // hierarchical numbering of AlbertaGrid, unique per codim 00645 HierarchicIndexSet hIndexSet_; 00646 00647 // the id set of this grid 00648 IdSetImp idSet_; 00649 00650 // the level index set, is generated from the HierarchicIndexSet 00651 // is generated, when accessed 00652 mutable std::vector< typename GridFamily::LevelIndexSetImp * > levelIndexVec_; 00653 00654 // the leaf index set, is generated from the HierarchicIndexSet 00655 // is generated, when accessed 00656 mutable typename GridFamily::LeafIndexSetImp* leafIndexSet_; 00657 00658 SizeCache< This > sizeCache_; 00659 00660 typedef AlbertaMarkerVector< dim, dimworld > MarkerVector; 00661 00662 // needed for VertexIterator, mark on which element a vertex is treated 00663 mutable MarkerVector leafMarkerVector_; 00664 00665 // needed for VertexIterator, mark on which element a vertex is treated 00666 mutable std::vector< MarkerVector > levelMarkerVector_; 00667 00668 #if DUNE_ALBERTA_CACHE_COORDINATES 00669 Alberta::CoordCache< dimension > coordCache_; 00670 #endif 00671 00672 // current state of adaptation 00673 AdaptationState adaptationState_; 00674 }; 00675 00676 } // namespace Dune 00677 00678 #include "albertagrid.cc" 00679 00680 // undef all dangerous defines 00681 #undef DIM 00682 #undef DIM_OF_WORLD 00683 00684 #ifdef _ABS_NOT_DEFINED_ 00685 #undef ABS 00686 #endif 00687 00688 #ifdef _MIN_NOT_DEFINED_ 00689 #undef MIN 00690 #endif 00691 00692 #ifdef _MAX_NOT_DEFINED_ 00693 #undef MAX 00694 #endif 00695 00696 #if DUNE_ALBERTA_VERSION >= 0x300 00697 #ifdef obstack_chunk_alloc 00698 #undef obstack_chunk_alloc 00699 #endif 00700 #ifdef obstack_chunk_free 00701 #undef obstack_chunk_free 00702 #endif 00703 #include <dune/grid/albertagrid/undefine-3.0.hh> 00704 #else 00705 #include <dune/grid/albertagrid/undefine-2.0.hh> 00706 #endif 00707 00708 // We use MEM_ALLOC, so undefine it here. 00709 #undef MEM_ALLOC 00710 00711 // We use MEM_REALLOC, so undefine it here. 00712 #undef MEM_REALLOC 00713 00714 // We use MEM_CALLOC, so undefine it here. 00715 #undef MEM_CALLOC 00716 00717 // We use MEM_FREE, so undefine it here. 00718 #undef MEM_FREE 00719 00720 // Macro ERROR may be defined by alberta_util.h. If so, undefine it. 00721 #ifdef ERROR 00722 #undef ERROR 00723 #endif // #ifdef ERROR 00724 00725 // Macro ERROR_EXIT may be defined by alberta_util.h. If so, undefine it. 00726 #ifdef ERROR_EXIT 00727 #undef ERROR_EXIT 00728 #endif // #ifdef ERROR_EXIT 00729 00730 // Macro WARNING may be defined by alberta_util.h. If so, undefine it. 00731 #ifdef WARNING 00732 #undef WARNING 00733 #endif // #ifdef WARNING 00734 00735 // Macro TEST may be defined by alberta_util.h. If so, undefine it. 00736 #ifdef TEST 00737 #undef TEST 00738 #endif // #ifdef TEST 00739 00740 // Macro TEST_EXIT may be defined by alberta_util.h. If so, undefine it. 00741 #ifdef TEST_EXIT 00742 #undef TEST_EXIT 00743 #endif // #ifdef TEST_EXIT 00744 00745 // Macro DEBUG_TEST may be defined by alberta_util.h. If so, undefine it. 00746 #ifdef DEBUG_TEST 00747 #undef DEBUG_TEST 00748 #endif // #ifdef DEBUG_TEST 00749 00750 // Macro DEBUG_TEST_EXIT may be defined by alberta_util.h. If so, undefine it. 00751 #ifdef DEBUG_TEST_EXIT 00752 #undef DEBUG_TEST_EXIT 00753 #endif // #ifdef DEBUG_TEST_EXIT 00754 00755 // Macro INFO may be defined by alberta_util.h. If so, undefine it. 00756 #ifdef INFO 00757 #undef INFO 00758 #endif // #ifdef INFO 00759 00760 // Macro PRINT_INFO may be defined by alberta_util.h. If so, undefine it. 00761 #ifdef PRINT_INFO 00762 #undef PRINT_INFO 00763 #endif // #ifdef PRINT_INFO 00764 00765 // Macro PRINT_INT_VEC may be defined by alberta_util.h. If so, undefine it. 00766 #ifdef PRINT_INT_VEC 00767 #undef PRINT_INT_VEC 00768 #endif // #ifdef PRINT_INT_VEC 00769 00770 // Macro PRINT_REAL_VEC may be defined by alberta_util.h. If so, undefine it. 00771 #ifdef PRINT_REAL_VEC 00772 #undef PRINT_REAL_VEC 00773 #endif // #ifdef PRINT_REAL_VEC 00774 00775 // Macro WAIT may be defined by alberta_util.h. If so, undefine it. 00776 #ifdef WAIT 00777 #undef WAIT 00778 #endif // #ifdef WAIT 00779 00780 // Macro WAIT_REALLY may be defined by alberta_util.h. If so, undefine it. 00781 #ifdef WAIT_REALLY 00782 #undef WAIT_REALLY 00783 #endif // #ifdef WAIT_REALLY 00784 00785 // Macro GET_WORKSPACE may be defined by alberta_util.h. If so, undefine it. 00786 #ifdef GET_WORKSPACE 00787 #undef GET_WORKSPACE 00788 #endif // #ifdef GET_WORKSPACE 00789 00790 // Macro FREE_WORKSPACE may be defined by alberta_util.h. If so, undefine it. 00791 #ifdef FREE_WORKSPACE 00792 #undef FREE_WORKSPACE 00793 #endif // #ifdef FREE_WORKSPACE 00794 00795 // Macro MAT_ALLOC may be defined by alberta_util.h. If so, undefine it. 00796 #ifdef MAT_ALLOC 00797 #undef MAT_ALLOC 00798 #endif // #ifdef MAT_ALLOC 00799 00800 // Macro MAT_FREE may be defined by alberta_util.h. If so, undefine it. 00801 #ifdef MAT_FREE 00802 #undef MAT_FREE 00803 #endif // #ifdef MAT_FREE 00804 00805 // Macro NAME may be defined by alberta_util.h. If so, undefine it. 00806 #ifdef NAME 00807 #undef NAME 00808 #endif // #ifdef NAME 00809 00810 // Macro GET_STRUCT may be defined by alberta_util.h. If so, undefine it. 00811 #ifdef GET_STRUCT 00812 #undef GET_STRUCT 00813 #endif // #ifdef GET_STRUCT 00814 00815 // Macro ADD_PARAMETER may be defined by alberta_util.h. If so, undefine it. 00816 #ifdef ADD_PARAMETER 00817 #undef ADD_PARAMETER 00818 #endif // #ifdef ADD_PARAMETER 00819 00820 // Macro GET_PARAMETER may be defined by alberta_util.h. If so, undefine it. 00821 #ifdef GET_PARAMETER 00822 #undef GET_PARAMETER 00823 #endif // #ifdef GET_PARAMETER 00824 00825 #define _ALBERTA_H_ 00826 00827 #endif // HAVE_ALBERTA 00828 00829 #endif