///////////////////////////////////////////////////////////// // // // Copyright (c) 2003-2014 by The University of Queensland // // Centre for Geoscience Computing // // http://earth.uq.edu.au/centre-geoscience-computing // // // // Primary Business: Brisbane, Queensland, Australia // // Licensed under the Open Software License version 3.0 // // http://www.opensource.org/licenses/osl-3.0.php // // // ///////////////////////////////////////////////////////////// #ifndef ESYS_LSMCHECKPOINTLOADER_H #define ESYS_LSMCHECKPOINTLOADER_H #include "Model/BondedInteraction.h" #include "Parallel/IterativeReader.h" #include "Model/Particle.h" #include "Model/BondedInteractionCpData.h" #include #include #include namespace esys { namespace lsm { typedef std::vector StringVector; /** * Objects of this class load particle and interaction check-point * data from file and initialise a specified object via the * CheckPointLoader::loadInto method. */ class CheckPointLoader { public: class ParticleData : public CParticle { public: ParticleData() : CParticle() { } void read(std::istream &iStream) { loadCheckPointData(iStream); } }; class ConnectionData : public BondedInteractionCpData { public: ConnectionData() : BondedInteractionCpData() { } void read(std::istream &iStream) { loadCheckPointData(iStream); } }; class ParticleReader : public IterativeReader > { public: typedef IterativeReader >::Iterator Iterator; ParticleReader(std::istream &iStream) : IterativeReader >(iStream) { } virtual void initialise() { int numParticles = 0; getIStream() >> numParticles; setNumElements(numParticles); IterativeReader >::initialise(); } }; class ConnectionReader : public IterativeReader > { public: ConnectionReader(std::istream &iStream) : IterativeReader >(iStream) { } virtual void initialise() { int numConnections = 0; getIStream() >> numConnections; setNumElements(numConnections); IterativeReader >::initialise(); } }; CheckPointLoader(const StringVector &fileNames) : m_fileNames(fileNames) { } template void loadInto(TmplLsmData &lsmData) { for ( StringVector::const_iterator it = m_fileNames.begin(); it != m_fileNames.end(); it++ ) { std::ifstream iStream(it->c_str()); ParticleReader pReader(iStream); lsmData.template addParticles(pReader.getIterator()); int numConnectionGroups = 0; iStream >> numConnectionGroups; for (int i = 0; i < numConnectionGroups; i++) { ConnectionReader cReader(iStream); lsmData.addConnections(cReader.getIterator()); } } } private: StringVector m_fileNames; }; } } #endif