ESyS-Particle
4.0.1
|
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