CardiacSimulationArchiver.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <fstream>
00037
00038
00039 #include "CheckpointArchiveTypes.hpp"
00040 #include "CardiacSimulationArchiver.hpp"
00041
00042 #include "Exception.hpp"
00043 #include "ArchiveOpener.hpp"
00044 #include "OutputFileHandler.hpp"
00045 #include "ArchiveLocationInfo.hpp"
00046 #include "DistributedVectorFactory.hpp"
00047 #include "PetscTools.hpp"
00048 #include "FileFinder.hpp"
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #include "MonodomainProblem.hpp"
00068 #include "BidomainProblem.hpp"
00069 #include "BidomainWithBathProblem.hpp"
00070 #include "HeartConfigRelatedCellFactory.hpp"
00071
00072
00073 template<class PROBLEM_CLASS>
00074 void CardiacSimulationArchiver<PROBLEM_CLASS>::Save(PROBLEM_CLASS& rSimulationToArchive,
00075 const std::string& rDirectory,
00076 bool clearDirectory)
00077 {
00078
00079 OutputFileHandler handler(rDirectory, clearDirectory);
00080
00081
00082
00083 {
00084
00085 FileFinder dir(rDirectory, RelativeTo::ChasteTestOutput);
00086 ArchiveOpener<boost::archive::text_oarchive, std::ofstream> archive_opener(dir, "archive.arch");
00087 boost::archive::text_oarchive* p_main_archive = archive_opener.GetCommonArchive();
00088
00089
00090 PROBLEM_CLASS* const p_simulation_to_archive = &rSimulationToArchive;
00091 (*p_main_archive) & p_simulation_to_archive;
00092 }
00093
00094
00095 if (PetscTools::AmMaster())
00096 {
00097 std::string info_path = handler.GetOutputDirectoryFullPath() + "archive.info";
00098 std::ofstream info_file(info_path.c_str());
00099 if (!info_file.is_open())
00100 {
00101
00102 PetscTools::ReplicateBool(true);
00103 EXCEPTION("Unable to open archive information file: " + info_path);
00104 }
00105 PetscTools::ReplicateBool(false);
00106 unsigned archive_version = 0;
00107 info_file << PetscTools::GetNumProcs() << " " << archive_version;
00108 }
00109 else
00110 {
00111 bool master_threw = PetscTools::ReplicateBool(false);
00112 if (master_threw)
00113 {
00114 EXCEPTION("Unable to open archive information file");
00115 }
00116 }
00117
00118 PetscTools::Barrier("CardiacSimulationArchiver::Save");
00119 }
00120
00121 template<class PROBLEM_CLASS>
00122 PROBLEM_CLASS* CardiacSimulationArchiver<PROBLEM_CLASS>::Load(const std::string& rDirectory)
00123 {
00124 FileFinder directory(rDirectory, RelativeTo::ChasteTestOutput);
00125 return CardiacSimulationArchiver<PROBLEM_CLASS>::Migrate(directory);
00126 }
00127
00128 template<class PROBLEM_CLASS>
00129 PROBLEM_CLASS* CardiacSimulationArchiver<PROBLEM_CLASS>::Load(const FileFinder& rDirectory)
00130 {
00131 return CardiacSimulationArchiver<PROBLEM_CLASS>::Migrate(rDirectory);
00132 }
00133
00134
00135 template<class PROBLEM_CLASS>
00136 PROBLEM_CLASS* CardiacSimulationArchiver<PROBLEM_CLASS>::Migrate(const FileFinder& rDirectory)
00137 {
00138
00139 std::string dir_path = rDirectory.GetAbsolutePath();
00140 if (!rDirectory.IsDir() || !rDirectory.Exists())
00141 {
00142 EXCEPTION("Checkpoint directory does not exist: " + dir_path);
00143 }
00144 assert(*(dir_path.end()-1) == '/');
00145
00146
00147 std::string info_path = dir_path + "archive.info";
00148 std::ifstream info_file(info_path.c_str());
00149 if (!info_file.is_open())
00150 {
00151 EXCEPTION("Unable to open archive information file: " + info_path);
00152 }
00153 unsigned num_procs, archive_version;
00154 info_file >> num_procs >> archive_version;
00155
00156 PROBLEM_CLASS *p_unarchived_simulation;
00157
00158
00159
00160
00161 DistributedVectorFactory::SetCheckNumberOfProcessesOnLoad(false);
00162
00163 try
00164 {
00165
00166
00167
00168 unsigned initial_archive = num_procs == PetscTools::GetNumProcs() ? PetscTools::GetMyRank() : 0u;
00169
00170
00171
00172 ArchiveOpener<boost::archive::text_iarchive, std::ifstream> archive_opener(rDirectory, "archive.arch", initial_archive);
00173 boost::archive::text_iarchive* p_main_archive = archive_opener.GetCommonArchive();
00174 (*p_main_archive) >> p_unarchived_simulation;
00175
00176
00177 DistributedVectorFactory* p_factory = p_unarchived_simulation->rGetMesh().GetDistributedVectorFactory();
00178 assert(p_factory != NULL);
00179 unsigned original_num_procs = p_factory->GetOriginalFactory()->GetNumProcs();
00180 assert(original_num_procs == num_procs);
00181
00182
00183 for (unsigned archive_num=0; archive_num<original_num_procs; archive_num++)
00184 {
00185 if (archive_num != initial_archive)
00186 {
00187 std::string archive_path = ArchiveLocationInfo::GetProcessUniqueFilePath("archive.arch", archive_num);
00188 std::ifstream ifs(archive_path.c_str());
00189 boost::archive::text_iarchive archive(ifs);
00190 p_unarchived_simulation->LoadExtraArchive(archive, archive_version);
00191 }
00192 }
00193 }
00194 catch (Exception &e)
00195 {
00196 DistributedVectorFactory::SetCheckNumberOfProcessesOnLoad(true);
00197 throw e;
00198 }
00199
00200
00201 DistributedVectorFactory::SetCheckNumberOfProcessesOnLoad(true);
00202 return p_unarchived_simulation;
00203 }
00204
00205
00206
00207
00208
00209 template class CardiacSimulationArchiver<MonodomainProblem<1> >;
00210 template class CardiacSimulationArchiver<MonodomainProblem<2> >;
00211 template class CardiacSimulationArchiver<MonodomainProblem<3> >;
00212
00213 template class CardiacSimulationArchiver<BidomainProblem<1> >;
00214 template class CardiacSimulationArchiver<BidomainProblem<2> >;
00215 template class CardiacSimulationArchiver<BidomainProblem<3> >;
00216
00217 template class CardiacSimulationArchiver<BidomainWithBathProblem<1> >;
00218 template class CardiacSimulationArchiver<BidomainWithBathProblem<2> >;
00219 template class CardiacSimulationArchiver<BidomainWithBathProblem<3> >;