1 #ifndef DUNE_FEM_PERSISTENCEMANAGER_HH 2 #define DUNE_FEM_PERSISTENCEMANAGER_HH 7 #include <dune/common/typetraits.hh> 90 class PersistenceManager;
105 virtual void backup ()
const = 0;
123 template<
class ObjectType >
126 static const bool value = Dune::Conversion< ObjectType *, PersistentObject * >::exists;
139 template <
class ObjectType,
bool isPersistent>
144 #ifdef FEM_PERSISTENCEMANAGERSTREAMTRAITS 145 typedef FEM_PERSISTENCEMANAGERSTREAMTRAITS :: BackupStreamType
BackupStreamType;
146 typedef FEM_PERSISTENCEMANAGERSTREAMTRAITS :: RestoreStreamType
RestoreStreamType;
147 static const bool singleBackupRestoreFile = FEM_PERSISTENCEMANAGERSTREAMTRAITS ::
148 singleBackupRestoreFile ;
152 static const bool singleBackupRestoreFile = false ;
156 typedef std::list< std::pair< PersistentObject *, unsigned int > > PersistentType;
157 typedef PersistentType::iterator IteratorType;
159 PersistentType objects_;
160 int fileCounter_,lineNo_;
162 std::ifstream inAsciStream_;
163 std::ofstream outAsciStream_;
164 bool closed_,invalid_;
166 BackupStreamType* backupStream_;
167 RestoreStreamType* restoreStream_;
180 ThisType &operator= (
const ThisType & );
182 BackupStreamType& backupStreamObj ()
184 assert( backupStream_ );
185 return *backupStream_ ;
188 RestoreStreamType& restoreStreamObj ()
190 assert( restoreStream_ );
191 return *restoreStream_ ;
195 template<
class ObjectType >
198 IteratorType end = objects_.end();
199 for( IteratorType it = objects_.begin(); it != end; ++it )
201 if( it->first->pointer() != &object )
209 if ( closed_ && ! pushFront )
212 std::cerr <<
"WARNING: new object added to PersistenceManager " 213 <<
"although backup/restore has been called - " 214 <<
"Object will be ignored!" << std::endl;
220 WrapObject< ObjectType, IsPersistent< ObjectType > :: value >
227 objects_.push_front( std :: make_pair( obj, 1 ) );
229 objects_.push_back( std :: make_pair( obj, 1 ) );
232 template<
class ObjectType >
235 IteratorType end = objects_.end();
236 for( IteratorType it = objects_.begin(); it != end; ++it )
238 if( it->first->pointer() != &object )
242 if( it->second == 0 )
244 if (closed_) invalid_=
true;
248 objects_.erase( it );
261 std::cerr <<
"WARNING: backup called although objects " 262 <<
"have been removed from the PersistenceManager! " 263 <<
"Backup ignored!" << std::endl;
269 typedef PersistentType::iterator IteratorType;
271 for( IteratorType it = objects_.begin(); it != objects_.end(); ++it )
281 std::cerr <<
"WARNING: restore called although objects " 282 <<
"have been removed from the PersistenceManager! " 283 <<
"Restore ignored!" << std::endl;
288 startRestoreImpl( path );
289 typedef PersistentType :: iterator IteratorType;
291 for( IteratorType it = objects_.begin(); it != objects_.end(); ++it )
292 it->first->restore( );
308 void backup (
const std::string &token,
const T &value )
310 backupStreamObj() << token;
311 backupStreamObj() << value;
315 void restore (
const std::string &token, T &value )
317 std::string readToken ;
318 restoreStreamObj() >> readToken;
319 restoreStreamObj() >> value;
320 if( token != readToken )
322 DUNE_THROW(InvalidStateException,
"wrong object restored in PersistenceManager" << token <<
" " << readToken );
335 return instance ().backupStreamObj();
340 return instance ().restoreStreamObj();
345 instance().insertObject(
object, pushFront );
350 instance().removeObject(
object );
355 instance().backupObjects( path );
360 instance().restoreObjects( path );
365 instance().startRestoreImpl( path );
370 return instance().getUniqueFileName( tag );
373 static std::string
uniqueTag(
const std::string& tag =
"" )
375 return instance().getUniqueTag( tag );
379 static void backupValue (
const std::string &token,
const T &value )
381 instance().backup( token, value );
387 instance().restore( token, value );
391 const char* myTag()
const {
return "persistentobjects"; }
394 std::string createFilename(
const std::string&
path,
396 const int size )
const 399 const int number = ( singleBackupRestoreFile ) ? size : rank ;
400 s << path << myTag() <<
"." << number ;
404 void startBackup (
const std::string &path )
412 std::string filename( createFilename( path_, rank, size ) );
414 assert( backupStream_ == 0 );
419 std::ofstream paramfile( (path_ +
"parameter").c_str() );
428 std::cerr <<
"Error: Unable to create '" << path_ <<
"'" << std::endl;
431 void startRestoreImpl (
const std::string &path )
433 if( restoreStream_ == 0 )
438 std::string filename( createFilename( path_, rank, size ) );
443 std::cout <<
"Restore from " << filename << std::endl;
445 if( ! restoreStream_ )
447 std::cout <<
"Error opening global stream: " << path_+myTag()
462 backupStream_->
flush();
463 delete backupStream_;
469 delete restoreStream_;
483 template<
class ObjectType >
487 static_assert( !TypeTraits< ObjectType >::isPointer,
"Do not add pointers to PersistenceManager." );
493 template<
class ObjectType >
502 template<
class ObjectType >
503 struct PersistenceManager::WrapObject< ObjectType, true >
512 template<
class ObjectType >
513 struct PersistenceManager::WrapObject< ObjectType, false >
552 return new ThisType( obj );
589 #endif // #ifndef DUNE_FEM_PERSISTENCEMANAGER_HH virtual void removeSubData()
remove possible sub data of object
Definition: persistencemanager.hh:113
AutoPersistentObject()
Definition: persistencemanager.hh:569
void backup(const std::string &token, const T &value)
Definition: persistencemanager.hh:308
virtual ~AutoPersistentObject()
Definition: persistencemanager.hh:579
Definition: persistencemanager.hh:124
virtual void insertSubData()
insert possible sub data of object
Definition: persistencemanager.hh:111
void removeObject(ObjectType &object)
Definition: persistencemanager.hh:233
static int rank()
Definition: mpimanager.hh:116
static void restore(const std::string &path)
Definition: persistencemanager.hh:358
static std::string uniqueFileName(const std::string &tag="")
Definition: persistencemanager.hh:368
friend class PersistenceManager
Definition: persistencemanager.hh:100
static int size()
Definition: mpimanager.hh:121
WrapObject< ObjectType, false > ThisType
Definition: persistencemanager.hh:516
static void startRestore(const std::string &path)
Definition: persistencemanager.hh:363
static RestoreStreamType & restoreStream()
Definition: persistencemanager.hh:338
static void insert(PersistentObject &object, const bool pushFront=false)
Definition: persistencemanager.hh:343
InStreamInterface< StreamTraits > & operator>>(InStreamInterface< StreamTraits > &in, DiscreteFunctionInterface< Impl > &df)
read a discrete function from an input stream
Definition: discretefunction_inline.hh:395
virtual void backup() const
backup persistent object
Definition: persistencemanager.hh:533
class with singleton instance managing all persistent objects
Definition: persistencemanager.hh:136
virtual void restore()=0
restore persistent object
void flush()
flush the stream
Definition: standardstreams.hh:88
std::string token_
Definition: persistencemanager.hh:521
static StreamImpl * create(const std::string &filename, const int rank=MPIManager::rank(), const MPICommunicatorType &mpiComm=MPIHelper::getCommunicator())
return pointer to stream object created by new.
Definition: streams.hh:369
bool createDirectory(const std::string &inName)
create a directory
Definition: io.cc:19
Fem::BinaryFileInStream RestoreStreamType
Definition: persistencemanager.hh:151
std::string getUniqueFileName(const std::string &tag)
Definition: persistencemanager.hh:297
static void append(int &argc, char **argv)
add parameters from the command line RangeType gRight;
Definition: io/parameter.hh:215
virtual void backup() const =0
backup persistent object
std::string getUniqueTag(const std::string &tag)
Definition: persistencemanager.hh:302
constructor
Definition: binarystreams.hh:15
std::string generateFilename(const std::string &fn, int ntime, int precision=6)
Definition: iointerface.hh:47
virtual void restore()
restore persistent object
Definition: persistencemanager.hh:538
void restore(const std::string &token, T &value)
Definition: persistencemanager.hh:315
void restoreObjects(const std::string &path)
Definition: persistencemanager.hh:277
static BackupStreamType & backupStream()
Definition: persistencemanager.hh:333
static PersistentObject * apply(ObjectType &obj)
Definition: persistencemanager.hh:550
Definition: coordinate.hh:4
static PersistentObject * apply(ObjectType &obj)
Definition: persistencemanager.hh:505
static ParameterContainer & container()
Definition: io/parameter.hh:190
static void write(const std::string &filename, const std::string &fileextension="", bool writeAll=true)
write the parameter database to a file
Definition: io/parameter.hh:515
static void backup(const std::string &path)
Definition: persistencemanager.hh:353
std::string path
Definition: readioparams.cc:155
AutoPersistentObject(const ThisType &)
Definition: persistencemanager.hh:574
void insertObject(ObjectType &object, const bool pushFront=false)
Definition: persistencemanager.hh:196
static void restoreValue(const std::string &token, T &value)
Definition: persistencemanager.hh:385
static void remove(PersistentObject &object)
Definition: persistencemanager.hh:348
base class for auto persistent objects
Definition: persistencemanager.hh:562
base class for persistent objects
Definition: persistencemanager.hh:96
static bool verbose()
obtain the cached value for fem.verbose
Definition: io/parameter.hh:444
void backupObjects(const std::string &path)
Definition: persistencemanager.hh:256
virtual ~WrapObject()
Definition: persistencemanager.hh:530
Fem::BinaryFileOutStream BackupStreamType
Definition: persistencemanager.hh:140
virtual void * pointer()
Definition: persistencemanager.hh:115
constructor
Definition: binarystreams.hh:56
WrapObject(ObjectType &obj)
Definition: persistencemanager.hh:523
PersistentObject BaseType
Definition: persistencemanager.hh:517
ObjectType & obj_
Definition: persistencemanager.hh:520
virtual void * pointer()
Definition: persistencemanager.hh:544
virtual ~PersistentObject()
Definition: persistencemanager.hh:103
OutStreamInterface< StreamTraits > & operator<<(OutStreamInterface< StreamTraits > &out, const DiscreteFunctionInterface< Impl > &df)
write a discrete function into an output stream
Definition: discretefunction_inline.hh:375
Definition: persistencemanager.hh:513
static void backupValue(const std::string &token, const T &value)
Definition: persistencemanager.hh:379
void clear()
clear all parameters
Definition: container.hh:149
static std::string uniqueTag(const std::string &tag="")
Definition: persistencemanager.hh:373
static PersistenceManager & instance()
Definition: persistencemanager.hh:327