diff --git a/grid/albertagrid/agrid.hh b/grid/albertagrid/agrid.hh index 8edaf43db25901e558f7b3a9c15cf4093630afde..a1bda331a3540a97153a9f0cee6758d2016f4e52 100644 --- a/grid/albertagrid/agrid.hh +++ b/grid/albertagrid/agrid.hh @@ -49,7 +49,7 @@ #include "albertaheader.hh" // grape data io -#include <dune/io/file/grapedataio.hh> +#include <dune/grid/utility/grapedataioformattypes.hh> // IndexManager defined in indexstack.hh // 10000 is the size of the finite stack used by IndexStack diff --git a/grid/albertagrid/albertaextra.hh b/grid/albertagrid/albertaextra.hh index 9b4b64da87977c6228890b72b80409de27659a6e..b7393395cfbce88e5a587dc771eb6f5b1a580cb8 100644 --- a/grid/albertagrid/albertaextra.hh +++ b/grid/albertagrid/albertaextra.hh @@ -105,7 +105,7 @@ public: { stack_ = 0; refCount_ = 0; - if(copy.stack_ != 0) + if(copy.stackExists()) { stack_ = copy.stack_; refCount_ = copy.refCount_; @@ -119,6 +119,9 @@ public: //! get_traverse_stack, which get an new or free stack void create () { + // remove existing stack, does nothing if no stack exists + remove(); + assert( stack_ == 0 ); assert( refCount_ == 0 ); stack_ = getTraverseStack(); @@ -129,24 +132,12 @@ public: //! set Stack free, if no more refences exist ~ManageTravStack() { - if(refCount_ && stack_) - { - (*refCount_)--; - if((*refCount_) <= 0) - { - // in free_traverse_stack stack != 0 is checked - if(stack_) - { - stack_ = freeTraverseStack(stack_); - owner_ = false; - } - if(refCount_) - { - delete refCount_; - refCount_ = 0; - } - } - } + remove(); + } + + bool stackExists() const + { + return stack_ != 0; } //! return the TRAVERSE_STACK pointer for use @@ -163,18 +154,43 @@ private: //! if copy is made than one more Reference exists ManageTravStack & operator = (const ManageTravStack & copy) { + remove(); // do not use this method if(copy.stack_ != 0) { stack_ = copy.stack_; refCount_ = copy.refCount_; - (*refCount_)++; + ++(*refCount_); copy.owner_ = false; owner_ = true; } assert(false); return (*this); } + + void remove() + { + if(refCount_ && stack_) + { + (*refCount_)--; + if((*refCount_) <= 0) + { + // in free_traverse_stack stack != 0 is checked + if(stack_) + { + stack_ = freeTraverseStack(stack_); + owner_ = false; + } + if(refCount_) + { + delete refCount_; + refCount_ = 0; + } + } + } + stack_ = 0; + refCount_ = 0; + } }; diff --git a/grid/albertagrid/albertagrid.cc b/grid/albertagrid/albertagrid.cc index f809b2d702cb9bd45ecbd2aedb06b4b1abebf5c3..8e9ba3e4755d6fe81ed4cb4de3034ca43e2c37ab 100644 --- a/grid/albertagrid/albertagrid.cc +++ b/grid/albertagrid/albertagrid.cc @@ -1651,9 +1651,18 @@ namespace Dune operator = (const AlbertaGridHierarchicIterator<GridImp> & org) { const_cast<int &> (startLevel_) = org.startLevel_; - level_ = ( org.level_ ); - maxlevel_ = ( org.maxlevel_ ); - manageStack_ = ( org.manageStack_ ); + level_ = org.level_; + maxlevel_ = org.maxlevel_; + + if(org.manageStack_.stackExists()) + { + // full copy of stack + manageStack_.create(); + ALBERTA TRAVERSE_STACK * stack = manageStack_.getStack(); + const ALBERTA TRAVERSE_STACK * orgStack = org.manageStack_.getStack(); + ALBERTA copyTraverseStack( stack , orgStack ); + } + if( org.virtualEntity_.getElInfo() ) virtualEntity_.setEntity( org.virtualEntity_ ); else @@ -3557,9 +3566,7 @@ namespace Dune } else { - double time = 0.0; - GrapeDataIO < AlbertaGrid <dim,dimworld> > dataIO; - dataIO.readGrid ( *this, MacroTriangFilename,time,0); + DUNE_THROW(NotImplemented,"Constructor reading backup file not implemented!"); } std::cout << "AlbertaGrid<"<<dim<<","<<dimworld<<"> created from macro grid file '" << macroTriangFilename << "'. \n\n"; }