ESyS-Particle  4.0.1
CheckPointLoader.h
00001 
00002 //                                                         //
00003 // Copyright (c) 2003-2011 by The University of Queensland //
00004 // Earth Systems Science Computational Centre (ESSCC)      //
00005 // http://www.uq.edu.au/esscc                              //
00006 //                                                         //
00007 // Primary Business: Brisbane, Queensland, Australia       //
00008 // Licensed under the Open Software License version 3.0    //
00009 // http://www.opensource.org/licenses/osl-3.0.php          //
00010 //                                                         //
00012 
00013 #ifndef ESYS_LSMCHECKPOINTLOADER_H
00014 #define ESYS_LSMCHECKPOINTLOADER_H
00015 
00016 #include "Model/BondedInteraction.h"
00017 #include "Parallel/IterativeReader.h"
00018 #include "Model/Particle.h"
00019 #include "Model/BondedInteractionCpData.h"
00020 
00021 #include <vector>
00022 #include <string>
00023 #include <fstream>
00024 
00025 namespace esys
00026 {
00027   namespace lsm
00028   {
00029     typedef std::vector<std::string> StringVector;
00030 
00036     class CheckPointLoader
00037     {
00038     public:
00039       class ParticleData : public CParticle
00040       {
00041       public:
00042         ParticleData() : CParticle()
00043         {
00044         }
00045 
00046         void read(std::istream &iStream)
00047         {
00048           loadCheckPointData(iStream);
00049         }
00050       };
00051 
00052       class ConnectionData : public BondedInteractionCpData
00053       {
00054       public:
00055         ConnectionData() : BondedInteractionCpData()
00056         {
00057         }
00058         
00059         void read(std::istream &iStream)
00060         {
00061           loadCheckPointData(iStream);
00062         }
00063       };
00064       
00065       class ParticleReader : public IterativeReader<IStreamIterator<ParticleData> >
00066       {
00067       public:
00068         typedef IterativeReader<IStreamIterator<ParticleData> >::Iterator Iterator;
00069         
00070         ParticleReader(std::istream &iStream) : IterativeReader<IStreamIterator<ParticleData> >(iStream)
00071         {
00072         }
00073         
00074         virtual void initialise()
00075         {
00076           int numParticles = 0;
00077           getIStream() >> numParticles;
00078           setNumElements(numParticles);
00079           IterativeReader<IStreamIterator<ParticleData> >::initialise();
00080         }
00081       };
00082 
00083       class ConnectionReader : public IterativeReader<IStreamIterator<ConnectionData> >
00084       {
00085       public:
00086         ConnectionReader(std::istream &iStream) : IterativeReader<IStreamIterator<ConnectionData> >(iStream)
00087         {
00088         }
00089 
00090         virtual void initialise()
00091         {
00092           int numConnections = 0;
00093           getIStream() >> numConnections;
00094           setNumElements(numConnections);
00095           IterativeReader<IStreamIterator<ConnectionData> >::initialise();
00096         }
00097       };
00098 
00099       CheckPointLoader(const StringVector &fileNames) : m_fileNames(fileNames)
00100       {
00101       }
00102 
00103       template<class TmplLsmData>
00104       void loadInto(TmplLsmData &lsmData)
00105       {
00106         for (
00107           StringVector::const_iterator it = m_fileNames.begin();
00108           it != m_fileNames.end();
00109           it++
00110         )
00111         {
00112           std::ifstream iStream(it->c_str());
00113           ParticleReader pReader(iStream);
00114           lsmData.template addParticles<ParticleReader::Iterator,CParticle>(pReader.getIterator());
00115 
00116           int numConnectionGroups = 0;
00117           iStream >> numConnectionGroups;
00118           for (int i = 0; i < numConnectionGroups; i++) {
00119             ConnectionReader cReader(iStream);
00120             lsmData.addConnections(cReader.getIterator());
00121           }
00122         }
00123       }
00124 
00125     private:
00126       StringVector m_fileNames;
00127     };
00128   };
00129 };
00130 
00131 #endif