dune-grid  2.2.0
agrid.hh
Go to the documentation of this file.
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 > &macroData,
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 > &macroData,
00310                   const Alberta::ProjectionFactoryInterface< Proj, Impl > &projectionFactory );
00311 
00316     AlbertaGrid ( const std::string &macroGridFileName );
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