Changeset a3427f for src/Actions
- Timestamp:
- Apr 15, 2013, 6:13:22 PM (12 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 55e1bc
- Parents:
- fbf143
- git-author:
- Frederik Heber <heber@…> (04/05/13 15:37:10)
- git-committer:
- Frederik Heber <heber@…> (04/15/13 18:13:22)
- Location:
- src/Actions
- Files:
-
- 3 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/FragmentationAction/FragmentationAutomationAction.cpp
rfbf143 ra3427f 39 39 #include "CodePatterns/MemDebug.hpp" 40 40 41 // include headers that implement a archive in simple text format42 #include <boost/archive/text_oarchive.hpp>43 #include <boost/archive/text_iarchive.hpp>44 45 46 #include <boost/mpl/remove.hpp>47 #include <boost/lambda/lambda.hpp>48 49 #include <iostream>41 //// include headers that implement a archive in simple text format 42 //#include <boost/archive/text_oarchive.hpp> 43 //#include <boost/archive/text_iarchive.hpp> 44 45 // 46 //#include <boost/mpl/remove.hpp> 47 //#include <boost/lambda/lambda.hpp> 48 49 //#include <iostream> 50 50 51 51 #include "CodePatterns/Assert.hpp" … … 56 56 #include "Fragmentation/Automation/FragmentJobQueue.hpp" 57 57 #include "Fragmentation/Automation/MPQCFragmentController.hpp" 58 #include "Fragmentation/Summation/Containers/FragmentationChargeDensity.hpp" 59 #include "Fragmentation/Summation/Containers/FragmentationLongRangeResults.hpp" 60 #include "Fragmentation/Summation/Containers/FragmentationResultContainer.hpp" 61 #include "Fragmentation/Summation/Containers/FragmentationShortRangeResults.hpp" 62 #include "Fragmentation/Summation/Containers/MPQCData.hpp" 63 #include "Fragmentation/KeySetsContainer.hpp" 64 #ifdef HAVE_VMG 58 65 #include "Fragmentation/Automation/VMGDebugGridFragmentController.hpp" 59 66 #include "Fragmentation/Automation/VMGFragmentController.hpp" 60 #include "Fragmentation/EnergyMatrix.hpp"61 #include "Fragmentation/ForceMatrix.hpp"62 #include "Fragmentation/Fragmentation.hpp"63 #include "Fragmentation/Homology/HomologyContainer.hpp"64 #include "Fragmentation/Homology/HomologyGraph.hpp"65 #include "Fragmentation/KeySet.hpp"66 #include "Fragmentation/KeySetsContainer.hpp"67 #include "Fragmentation/Summation/IndexSetContainer.hpp"68 #include "Fragmentation/Summation/writeTable.hpp"69 #include "Fragmentation/Summation/Containers/createMatrixNrLookup.hpp"70 #include "Fragmentation/Summation/Containers/extractJobIds.hpp"71 #include "Fragmentation/Summation/Containers/FragmentationChargeDensity.hpp"72 #include "Fragmentation/Summation/Containers/FragmentationLongRangeResults.hpp"73 #include "Fragmentation/Summation/Containers/FragmentationShortRangeResults.hpp"74 #include "Fragmentation/Summation/Containers/MPQCData.hpp"75 #include "Fragmentation/Summation/Containers/MPQCData_printKeyNames.hpp"76 #include "Fragmentation/Summation/SetValues/Fragment.hpp"77 #include "Fragmentation/Summation/SetValues/Histogram.hpp"78 #include "Fragmentation/Summation/SetValues/IndexedVectors.hpp"79 #include "Graph/DepthFirstSearchAnalysis.hpp"80 #include "Jobs/MPQCJob.hpp"81 #ifdef HAVE_VMG82 67 #include "Fragmentation/Summation/Containers/VMGData.hpp" 83 68 #include "Fragmentation/Summation/Containers/VMGDataFused.hpp" 84 69 #include "Fragmentation/Summation/Containers/VMGDataMap.hpp" 85 70 #include "Fragmentation/Summation/Containers/VMGData_printKeyNames.hpp" 86 #include "Jobs/VMGDebugGridJob.hpp"87 #include "Jobs/VMGJob.hpp"88 71 #endif 89 72 #include "World.hpp" … … 113 96 } 114 97 115 void writeToFile(const std::string &filename, const std::string contents)116 {117 std::ofstream tablefile(filename.c_str());118 tablefile << contents;119 tablefile.close();120 }121 122 /** Print (short range) energy, forces, and timings from received results.123 *124 * @param results summed up results container125 */126 void printReceivedShortResults(127 const FragmentationShortRangeResults &results)128 {129 // print tables (without eigenvalues, they go extra)130 {131 typedef boost::mpl::remove<MPQCDataEnergyVector_t, MPQCDataFused::energy_eigenvalues>::type132 MPQCDataEnergyVector_noeigenvalues_t;133 const std::string energyresult =134 writeTable<MPQCDataEnergyMap_t, MPQCDataEnergyVector_noeigenvalues_t >()(135 results.Result_Energy_fused, results.getMaxLevel());136 LOG(0, "Energy table is \n" << energyresult);137 std::string filename;138 filename += FRAGMENTPREFIX + std::string("_Energy.dat");139 writeToFile(filename, energyresult);140 }141 142 {143 const std::string eigenvalueresult;144 LOG(0, "Eigenvalue table is \n" << eigenvalueresult);145 std::string filename;146 filename += FRAGMENTPREFIX + std::string("_Eigenvalues.dat");147 writeToFile(filename, eigenvalueresult);148 }149 150 {151 const std::string forceresult =152 writeTable<MPQCDataForceMap_t, MPQCDataForceVector_t>()(153 results.Result_Force_fused, results.getMaxLevel());154 LOG(0, "Force table is \n" << forceresult);155 std::string filename;156 filename += FRAGMENTPREFIX + std::string("_Forces.dat");157 writeToFile(filename, forceresult);158 }159 // we don't want to print grid to a table160 {161 // print times (without flops for now)162 typedef boost::mpl::remove<163 boost::mpl::remove<MPQCDataTimeVector_t, MPQCDataFused::times_total_flops>::type,164 MPQCDataFused::times_gather_flops>::type165 MPQCDataTimeVector_noflops_t;166 const std::string timesresult =167 writeTable<MPQCDataTimeMap_t, MPQCDataTimeVector_noflops_t >()(168 results.Result_Time_fused, results.getMaxLevel());169 LOG(0, "Times table is \n" << timesresult);170 std::string filename;171 filename += FRAGMENTPREFIX + std::string("_Times.dat");172 writeToFile(filename, timesresult);173 }174 }175 176 177 /** Print long range energy from received results.178 *179 * @param results summed up results container180 */181 void printReceivedFullResults(182 const FragmentationLongRangeResults &results)183 {184 // print tables (without eigenvalues, they go extra)185 186 if (results.Result_LongRange_fused.size() >= (results.getMaxLevel()-2))187 {188 const std::string gridresult =189 writeTable<VMGDataMap_t, VMGDataVector_t >()(190 results.Result_LongRange_fused, results.getMaxLevel(), 2);191 LOG(0, "VMG table is \n" << gridresult);192 std::string filename;193 filename += FRAGMENTPREFIX + std::string("_VMGEnergy.dat");194 writeToFile(filename, gridresult);195 }196 197 if (results.Result_LongRangeIntegrated_fused.size() >= (results.getMaxLevel()-2))198 {199 const std::string gridresult =200 writeTable<VMGDataLongRangeMap_t, VMGDataLongRangeVector_t >()(201 results.Result_LongRangeIntegrated_fused, results.getMaxLevel(), 2);202 LOG(0, "LongRange table is \n" << gridresult);203 std::string filename;204 filename += FRAGMENTPREFIX + std::string("_LongRangeEnergy.dat");205 writeToFile(filename, gridresult);206 }207 }208 209 bool appendToHomologyFile(210 const boost::filesystem::path &homology_file,211 const FragmentationShortRangeResults &shortrangeresults,212 const FragmentationLongRangeResults &longrangeresults213 )214 {215 /// read homology container (if present)216 HomologyContainer homology_container;217 if (boost::filesystem::exists(homology_file)) {218 std::ifstream returnstream(homology_file.string().c_str());219 if (returnstream.good()) {220 boost::archive::text_iarchive ia(returnstream);221 ia >> homology_container;222 } else {223 ELOG(2, "Failed to parse from " << homology_file.string() << ".");224 }225 returnstream.close();226 } else {227 LOG(2, "Could not open " << homology_file.string()228 << ", creating empty container.");229 }230 231 /// append all fragments to a HomologyContainer232 HomologyContainer::container_t values;233 const size_t FragmentCounter = shortrangeresults.Result_perIndexSet_Energy.size();234 235 // convert KeySetContainer to IndexSetContainer236 IndexSetContainer::ptr ForceContainer(new IndexSetContainer(shortrangeresults.getForceKeySet()));237 const IndexSetContainer::Container_t &Indices = shortrangeresults.getContainer();238 const IndexSetContainer::Container_t &ForceIndices = ForceContainer->getContainer();239 IndexSetContainer::Container_t::const_iterator iter = Indices.begin();240 IndexSetContainer::Container_t::const_iterator forceiter = ForceIndices.begin();241 /// go through all fragments242 for (;iter != Indices.end(); ++iter, ++forceiter) // go through each IndexSet243 {244 /// create new graph entry in HomologyContainer which is (key,value) type245 LOG(1, "INFO: Creating new graph with " << **forceiter << ".");246 HomologyGraph graph(**forceiter);247 LOG(2, "DEBUG: Created graph " << graph << ".");248 const IndexSet::ptr &index = *iter;249 HomologyContainer::value_t value;250 251 // obtain fragment as key252 std::map<IndexSet::ptr, std::pair< MPQCDataFragmentMap_t, MPQCDataFragmentMap_t> >::const_iterator fragmentiter253 = longrangeresults.Result_perIndexSet_Fragment.find(index);254 ASSERT( fragmentiter != longrangeresults.Result_perIndexSet_Fragment.end(),255 "appendToHomologyFile() - cannot find index "+toString(*index)256 +" in FragmentResults.");257 value.first = boost::fusion::at_key<MPQCDataFused::fragment>(fragmentiter->second.first);258 259 // obtain energy as value260 std::map<IndexSet::ptr, std::pair< MPQCDataEnergyMap_t, MPQCDataEnergyMap_t> >::const_iterator energyiter261 = shortrangeresults.Result_perIndexSet_Energy.find(index);262 ASSERT( energyiter != shortrangeresults.Result_perIndexSet_Energy.end(),263 "appendToHomologyFile() - cannot find index "+toString(*index)264 +" in FragmentResults.");265 // value.second = boost::fusion::at_key<MPQCDataFused::energy_total>(energyiter->second.first); // values266 value.second = boost::fusion::at_key<MPQCDataFused::energy_total>(energyiter->second.second); // contributions267 values.insert( std::make_pair( graph, value) );268 }269 homology_container.insert(values);270 271 LOG(1, "INFO: Listing all present atomic ids ...");272 std::stringstream output;273 for (World::AtomIterator iter = World::getInstance().getAtomIter();274 iter != World::getInstance().atomEnd(); ++iter)275 output << (*iter)->getId() << " ";276 LOG(1, "INFO: { " << output.str() << "} .");277 278 // for debugging: print container279 LOG(1, "INFO: Listing all present homologies ...");280 for (HomologyContainer::container_t::const_iterator iter =281 homology_container.begin(); iter != homology_container.end(); ++iter) {282 LOG(1, "INFO: graph " << iter->first << " has Fragment "283 << iter->second.first << " and associated energy " << iter->second.second << ".");284 }285 286 /// store homology container again287 std::ofstream outputstream(homology_file.string().c_str());288 if (outputstream.good()) { // check if opened289 boost::archive::text_oarchive oa(outputstream);290 oa << homology_container;291 if (outputstream.fail()) { // check if correctly written292 LOG(1, "Failed to write to file " << homology_file.string() << ".");293 return false;294 } else295 outputstream.close();296 } else {297 LOG(1, "Failed to open file " << homology_file.string()298 << " for writing.");299 return false;300 }301 return true;302 }303 304 98 Action::state_ptr FragmentationFragmentationAutomationAction::performCall() { 305 99 boost::asio::io_service io_service; … … 307 101 // TODO: Have io_service run in second thread and merge with current again eventually 308 102 103 FragmentationResultContainer &container = 104 FragmentationResultContainer::getInstance(); 105 const KeySetsContainer& keysets = FragmentJobQueue::getInstance().getKeySets(); 106 const KeySetsContainer& forcekeysets = FragmentJobQueue::getInstance().getFullKeySets(); 107 309 108 size_t Exitflag = 0; 310 std::map<JobId_t, MPQCData> fragmentData;109 std::map<JobId_t, MPQCData> shortrangedata; 311 110 { 312 111 const size_t NumberJobs = FragmentJobQueue::getInstance().size(); … … 325 124 // Phase Three: calculate result 326 125 mpqccontroller.waitforResults(NumberJobs); 327 mpqccontroller.getResults( fragmentData);126 mpqccontroller.getResults(shortrangedata); 328 127 329 128 Exitflag += mpqccontroller.getExitflag(); 330 129 } 331 332 FragmentationShortRangeResults shortrangeresults(333 fragmentData,334 FragmentJobQueue::getInstance().getKeySets(),335 FragmentJobQueue::getInstance().getFullKeySets());336 shortrangeresults(fragmentData);337 printReceivedShortResults(shortrangeresults);338 130 339 131 #ifdef HAVE_VMG … … 346 138 // obtain combined charge density 347 139 FragmentationChargeDensity summedChargeDensity( 348 fragmentData,140 shortrangedata, 349 141 FragmentJobQueue::getInstance().getKeySets()); 350 142 const std::vector<SamplingGrid> full_sample = summedChargeDensity.getFullSampledGrid(); 351 LOG(1, "INFO: There are " << fragmentData.size() << " short-range and "143 LOG(1, "INFO: There are " << shortrangedata.size() << " short-range and " 352 144 << full_sample.size() << " level-wise long-range jobs."); 353 145 354 146 // Phase Four: obtain more ids 355 std::map<JobId_t, VMGData> longrange Data;147 std::map<JobId_t, VMGData> longrangedata; 356 148 { 357 149 VMGFragmentController vmgcontroller(io_service); 358 150 vmgcontroller.setHost(params.host.get()); 359 151 vmgcontroller.setPort(params.port.get()); 360 const size_t NoJobs = fragmentData.size()+full_sample.size();152 const size_t NoJobs = shortrangedata.size()+full_sample.size(); 361 153 vmgcontroller.requestIds(NoJobs); 362 154 … … 365 157 const size_t interpolation_degree = params.interpolation_degree.get(); 366 158 if (!vmgcontroller.createLongRangeJobs( 367 fragmentData,159 shortrangedata, 368 160 full_sample, 369 161 summedChargeDensity.getFragment(), … … 374 166 // Phase Six: calculate result 375 167 vmgcontroller.waitforResults(NoJobs); 376 vmgcontroller.getResults(longrange Data);377 ASSERT( NoJobs == longrange Data.size(),168 vmgcontroller.getResults(longrangedata); 169 ASSERT( NoJobs == longrangedata.size(), 378 170 "FragmentationFragmentationAutomationAction::performCall() - number of MPQCresults+" 379 171 +toString(full_sample.size())+"="+toString(NoJobs) 380 +" and VMGresults "+toString(longrange Data.size())+" don't match.");172 +" and VMGresults "+toString(longrangedata.size())+" don't match."); 381 173 Exitflag += vmgcontroller.getExitflag(); 382 }383 384 // remove full solution corresponding to full_sample from map (must be highest ids), has to be treated extra385 std::map<JobId_t, VMGData>::iterator iter = longrangeData.end();386 for (size_t i=0;i<full_sample.size();++i)387 --iter;388 std::map<JobId_t, VMGData>::iterator remove_iter = iter;389 std::vector<VMGData> fullsolutionData;390 for (; iter != longrangeData.end(); ++iter)391 fullsolutionData.push_back(iter->second);392 longrangeData.erase(remove_iter, longrangeData.end());393 394 // Final phase: sum up and print result395 FragmentationLongRangeResults longrangeresults(396 fragmentData,397 longrangeData,398 FragmentJobQueue::getInstance().getKeySets(),399 FragmentJobQueue::getInstance().getFullKeySets());400 longrangeresults(401 fragmentData,402 longrangeData,403 fullsolutionData,404 full_sample);405 printReceivedFullResults(longrangeresults);406 407 // append all keysets to homology file408 if ((Exitflag == 0) && (!params.homology_file.get().empty())) {409 const boost::filesystem::path &homology_file = params.homology_file.get();410 if (homology_file.string() != "") {411 LOG(1, "INFO: Appending HomologyGraphs to file " << homology_file.string() << ".");412 if (!appendToHomologyFile(homology_file, shortrangeresults, longrangeresults))413 Exitflag = 1;414 }415 174 } 416 175 … … 430 189 } 431 190 } 432 } 191 container.addFullResults(keysets, forcekeysets, shortrangedata, longrangedata); 192 } else { 193 container.addShortRangeResults(keysets, forcekeysets, shortrangedata); 194 } 195 #else 196 container.addShortRangeResults(keysets, forcekeysets, shortrangedata); 433 197 #endif 434 198 -
src/Actions/FragmentationAction/FragmentationAutomationAction.def
rfbf143 ra3427f 18 18 // ValueStorage by the token "Z" -> first column: int, Z, "Z" 19 19 // "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value 20 #define paramtypes (std::string)(std::string)(boost::filesystem::path)(unsigned int)(unsigned int)(unsigned int)(bool) (boost::filesystem::path)21 #define paramtokens ("server-address")("server-port")("fragment-executable")("grid-level")("near-field-cells")("interpolation-degree")("DoLongrange") ("homology-file")22 #define paramdescriptions ("hostname of server")("controller port of server")("executable to launch on clients")("resolution of multigrid")("number of cells used in smearing out core charge")("interpolation degree for getting the nuclei potential from the grid")("whether to calculate long-range contributions") ("path to file containing homology containerto append to")23 #define paramdefaults (PARAM_DEFAULT("127.0.0.1"))(NOPARAM_DEFAULT)(PARAM_DEFAULT("mpqc"))(PARAM_DEFAULT(5))(PARAM_DEFAULT(3))(PARAM_DEFAULT(3))(PARAM_DEFAULT("0")) (PARAM_DEFAULT(""))24 #define paramreferences (host)(port)(executable)(level)(near_field_cells)(interpolation_degree)(DoLongrange) (homology_file)20 #define paramtypes (std::string)(std::string)(boost::filesystem::path)(unsigned int)(unsigned int)(unsigned int)(bool) 21 #define paramtokens ("server-address")("server-port")("fragment-executable")("grid-level")("near-field-cells")("interpolation-degree")("DoLongrange") 22 #define paramdescriptions ("hostname of server")("controller port of server")("executable to launch on clients")("resolution of multigrid")("number of cells used in smearing out core charge")("interpolation degree for getting the nuclei potential from the grid")("whether to calculate long-range contributions") 23 #define paramdefaults (PARAM_DEFAULT("127.0.0.1"))(NOPARAM_DEFAULT)(PARAM_DEFAULT("mpqc"))(PARAM_DEFAULT(5))(PARAM_DEFAULT(3))(PARAM_DEFAULT(3))(PARAM_DEFAULT("0")) 24 #define paramreferences (host)(port)(executable)(level)(near_field_cells)(interpolation_degree)(DoLongrange) 25 25 #define paramvalids \ 26 26 (DummyValidator< std::string >()) \ … … 30 30 (RangeValidator< unsigned int >(1, 20)) \ 31 31 (RangeValidator< unsigned int >(1, 10)) \ 32 (DummyValidator< bool >()) \ 33 (DummyValidator< boost::filesystem::path >()) 32 (DummyValidator< bool >()) 34 33 35 34 #undef statetypes -
src/Actions/GlobalListOfActions.hpp
rfbf143 ra3427f 123 123 (SelectionNotShapeByName) \ 124 124 (FragmentationFragmentation) \ 125 (FragmentationAnalyseFragmentationResults) \ 125 126 (FragmentationStoreSaturatedFragment) \ 126 127 (FillRegularGrid) \ -
src/Actions/Makefile.am
rfbf143 ra3427f 212 212 FRAGMENTATIONACTIONSOURCE = \ 213 213 Actions/FragmentationAction/FragmentationAction.cpp \ 214 Actions/FragmentationAction/AnalyseFragmentationResultsAction.cpp \ 214 215 Actions/FragmentationAction/StoreSaturatedFragmentAction.cpp 215 216 FRAGMENTATIONACTIONHEADER = \ 216 217 Actions/FragmentationAction/FragmentationAction.hpp \ 218 Actions/FragmentationAction/AnalyseFragmentationResultsAction.hpp \ 217 219 Actions/FragmentationAction/StoreSaturatedFragmentAction.hpp 218 220 FRAGMENTATIONACTIONDEFS = \ 219 221 Actions/FragmentationAction/FragmentationAction.def \ 222 Actions/FragmentationAction/AnalyseFragmentationResultsAction.def \ 220 223 Actions/FragmentationAction/StoreSaturatedFragmentAction.def 221 224
Note:
See TracChangeset
for help on using the changeset viewer.