| [0398bd] | 1 | /* | 
|---|
|  | 2 | * DataConverter.hpp | 
|---|
|  | 3 | * | 
|---|
|  | 4 | *  Created on: Aug 27, 2012 | 
|---|
|  | 5 | *      Author: heber | 
|---|
|  | 6 | */ | 
|---|
|  | 7 |  | 
|---|
|  | 8 | #ifndef DATACONVERTER_HPP_ | 
|---|
|  | 9 | #define DATACONVERTER_HPP_ | 
|---|
|  | 10 |  | 
|---|
|  | 11 |  | 
|---|
|  | 12 | // include config.h | 
|---|
|  | 13 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 14 | #include <config.h> | 
|---|
|  | 15 | #endif | 
|---|
|  | 16 |  | 
|---|
| [c9f9bb] | 17 | #include <map> | 
|---|
| [0398bd] | 18 | #include <boost/fusion/sequence.hpp> | 
|---|
|  | 19 |  | 
|---|
|  | 20 | #include "CodePatterns/Assert.hpp" | 
|---|
|  | 21 |  | 
|---|
| [8e84fe] | 22 | #ifdef HAVE_JOBMARKET | 
|---|
| [0398bd] | 23 | #include "JobMarket/types.hpp" | 
|---|
| [8e84fe] | 24 | #else | 
|---|
|  | 25 | typedef size_t JobId_t; | 
|---|
|  | 26 | #endif | 
|---|
| [0398bd] | 27 |  | 
|---|
|  | 28 | #include "Fragmentation/KeySetsContainer.hpp" | 
|---|
| [5c867e] | 29 | #include "Fragmentation/Summation/SetValues/Eigenvalues.hpp" | 
|---|
| [fbf143] | 30 | #include "Fragmentation/Summation/SetValues/Histogram.hpp" | 
|---|
|  | 31 | #include "Fragmentation/Summation/SetValues/Fragment.hpp" | 
|---|
|  | 32 | #include "Fragmentation/Summation/SetValues/IndexedVectors.hpp" | 
|---|
| [0398bd] | 33 |  | 
|---|
| [fbf143] | 34 | #include "Fragmentation/Summation/Containers/MPQCData.hpp" | 
|---|
|  | 35 | #include "Fragmentation/Summation/Containers/MPQCDataFused.hpp" | 
|---|
|  | 36 | #include "Fragmentation/Summation/Containers/MPQCDataMap.hpp" | 
|---|
| [0398bd] | 37 | #ifdef HAVE_VMG | 
|---|
| [fbf143] | 38 | #include "Fragmentation/Summation/Containers/VMGData.hpp" | 
|---|
|  | 39 | #include "Fragmentation/Summation/Containers/VMGDataFused.hpp" | 
|---|
|  | 40 | #include "Fragmentation/Summation/Containers/VMGDataMap.hpp" | 
|---|
| [0398bd] | 41 | #endif | 
|---|
|  | 42 |  | 
|---|
|  | 43 | template <typename source, typename dest> | 
|---|
|  | 44 | inline void convertDataTo( | 
|---|
| [c9f9bb] | 45 | const std::map<JobId_t, source> &fragmentData, | 
|---|
|  | 46 | std::map<JobId_t, dest> &MPQCData_fused) | 
|---|
| [0398bd] | 47 | { | 
|---|
|  | 48 | MPQCData_fused.clear(); | 
|---|
|  | 49 | } | 
|---|
|  | 50 |  | 
|---|
|  | 51 | template <> | 
|---|
|  | 52 | inline void convertDataTo<MPQCData, MPQCDataEnergyMap_t>( | 
|---|
| [c9f9bb] | 53 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
|  | 54 | std::map<JobId_t, MPQCDataEnergyMap_t> &MPQCData_Energy_fused) | 
|---|
| [0398bd] | 55 | { | 
|---|
|  | 56 | // energy_t | 
|---|
|  | 57 | MPQCData_Energy_fused.clear(); | 
|---|
| [c9f9bb] | 58 | for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 59 | dataiter != fragmentData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 60 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 61 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 62 | MPQCDataEnergyMap_t instance; | 
|---|
|  | 63 | boost::fusion::at_key<MPQCDataFused::energy_total>(instance) = extractedData.energies.total; | 
|---|
|  | 64 | boost::fusion::at_key<MPQCDataFused::energy_nuclear_repulsion>(instance) = extractedData.energies.nuclear_repulsion; | 
|---|
|  | 65 | boost::fusion::at_key<MPQCDataFused::energy_electron_coulomb>(instance) = extractedData.energies.electron_coulomb; | 
|---|
|  | 66 | boost::fusion::at_key<MPQCDataFused::energy_electron_exchange>(instance) = extractedData.energies.electron_exchange; | 
|---|
|  | 67 | boost::fusion::at_key<MPQCDataFused::energy_correlation>(instance) = extractedData.energies.correlation; | 
|---|
|  | 68 | boost::fusion::at_key<MPQCDataFused::energy_overlap>(instance) = extractedData.energies.overlap; | 
|---|
|  | 69 | boost::fusion::at_key<MPQCDataFused::energy_kinetic>(instance) = extractedData.energies.kinetic; | 
|---|
|  | 70 | boost::fusion::at_key<MPQCDataFused::energy_hcore>(instance) = extractedData.energies.hcore; | 
|---|
|  | 71 | boost::fusion::at_key<MPQCDataFused::energy_eigenvalues>(instance) = extractedData.energies.eigenvalues; | 
|---|
| [5c867e] | 72 | boost::fusion::at_key<MPQCDataFused::energy_eigenhistogram>(instance) = extractedData.energies.eigenvalues; | 
|---|
| [c9f9bb] | 73 | MPQCData_Energy_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 74 | } | 
|---|
|  | 75 | } | 
|---|
|  | 76 |  | 
|---|
|  | 77 | #ifdef HAVE_VMG | 
|---|
|  | 78 | template <> | 
|---|
|  | 79 | inline void convertDataTo<VMGData, VMGDataMap_t>( | 
|---|
| [c9f9bb] | 80 | const std::map<JobId_t, VMGData> &longrangeData, | 
|---|
|  | 81 | std::map<JobId_t, VMGDataMap_t> &VMGData_fused) | 
|---|
| [0398bd] | 82 | { | 
|---|
|  | 83 | // energy_t | 
|---|
|  | 84 | VMGData_fused.clear(); | 
|---|
| [c9f9bb] | 85 | for(std::map<JobId_t, VMGData>::const_iterator dataiter = longrangeData.begin(); | 
|---|
| [0398bd] | 86 | dataiter != longrangeData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 87 | const VMGData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 88 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 89 | VMGDataMap_t instance; | 
|---|
|  | 90 | boost::fusion::at_key<VMGDataFused::sampled_potential>(instance) = extractedData.sampled_potential; | 
|---|
| [e355b31] | 91 | boost::fusion::at_key<VMGDataFused::both_sampled_potential>(instance) = extractedData.both_sampled_potential; | 
|---|
| [e2925fd] | 92 | boost::fusion::at_key<VMGDataFused::nuclei_long>(instance) = extractedData.nuclei_long; | 
|---|
|  | 93 | boost::fusion::at_key<VMGDataFused::electron_long>(instance) = extractedData.electron_long; | 
|---|
| [c9f9bb] | 94 | VMGData_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 95 | } | 
|---|
|  | 96 | } | 
|---|
|  | 97 | #endif | 
|---|
|  | 98 |  | 
|---|
|  | 99 | inline void convertMPQCDatatoForceMap( | 
|---|
| [c9f9bb] | 100 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
| [0398bd] | 101 | const KeySetsContainer &ForceKeySet, | 
|---|
| [c9f9bb] | 102 | std::map<JobId_t, MPQCDataForceMap_t> &MPQCData_Force_fused) | 
|---|
| [0398bd] | 103 | { | 
|---|
|  | 104 | // forces | 
|---|
|  | 105 | ASSERT( ForceKeySet.KeySets.size() == fragmentData.size(), | 
|---|
|  | 106 | "FragmentationAutomationAction::performCall() - indices and fragmentData differ in size."); | 
|---|
|  | 107 | MPQCData_Force_fused.clear(); | 
|---|
| [c9f9bb] | 108 | std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 109 | KeySetsContainer::ArrayOfIntVectors::const_iterator arrayiter = ForceKeySet.KeySets.begin(); | 
|---|
|  | 110 | for(;dataiter != fragmentData.end(); ++dataiter, ++arrayiter) { | 
|---|
| [c9f9bb] | 111 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 112 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 113 | MPQCDataForceMap_t instance; | 
|---|
|  | 114 | // must convert int to index_t | 
|---|
| [98a293b] | 115 | if (DoLog(5)) { | 
|---|
|  | 116 | std::stringstream output; | 
|---|
|  | 117 | for (KeySetsContainer::IntVector::const_iterator outiter = arrayiter->begin(); | 
|---|
|  | 118 | outiter != arrayiter->end(); ++outiter) { | 
|---|
|  | 119 | output << *outiter << "\t"; | 
|---|
|  | 120 | } | 
|---|
|  | 121 | LOG(5, "DEBUG: indices are " << output.str()); | 
|---|
|  | 122 | } | 
|---|
| [0398bd] | 123 | IndexedVectors::indices_t indices(arrayiter->begin(), arrayiter->end()); | 
|---|
|  | 124 | boost::fusion::at_key<MPQCDataFused::forces>(instance) = | 
|---|
|  | 125 | IndexedVectors(indices, extractedData.forces); | 
|---|
| [c9f9bb] | 126 | MPQCData_Force_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 127 | } | 
|---|
|  | 128 | } | 
|---|
|  | 129 |  | 
|---|
|  | 130 | template <> | 
|---|
|  | 131 | inline void convertDataTo<MPQCData, MPQCDataGridMap_t>( | 
|---|
| [c9f9bb] | 132 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
|  | 133 | std::map<JobId_t, MPQCDataGridMap_t> &MPQCData_Grid_fused) | 
|---|
| [0398bd] | 134 | { | 
|---|
|  | 135 | // sampled_grid | 
|---|
|  | 136 | MPQCData_Grid_fused.clear(); | 
|---|
| [c9f9bb] | 137 | for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 138 | dataiter != fragmentData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 139 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 140 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 141 | MPQCDataGridMap_t instance; | 
|---|
|  | 142 | boost::fusion::at_key<MPQCDataFused::sampled_grid>(instance) = extractedData.sampled_grid; | 
|---|
| [c9f9bb] | 143 | MPQCData_Grid_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 144 | } | 
|---|
|  | 145 | } | 
|---|
|  | 146 |  | 
|---|
|  | 147 | template <> | 
|---|
|  | 148 | inline void convertDataTo<MPQCData, MPQCDataFragmentMap_t>( | 
|---|
| [c9f9bb] | 149 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
|  | 150 | std::map<JobId_t, MPQCDataFragmentMap_t> &MPQCData_Fragment_fused) | 
|---|
| [0398bd] | 151 | { | 
|---|
|  | 152 | // fragment | 
|---|
|  | 153 | MPQCData_Fragment_fused.clear(); | 
|---|
| [c9f9bb] | 154 | for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 155 | dataiter != fragmentData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 156 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 157 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 158 | MPQCDataFragmentMap_t instance; | 
|---|
|  | 159 | boost::fusion::at_key<MPQCDataFused::fragment>(instance) = | 
|---|
|  | 160 | Fragment(extractedData.positions, extractedData.charges); | 
|---|
| [c9f9bb] | 161 | MPQCData_Fragment_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 162 | } | 
|---|
|  | 163 | } | 
|---|
|  | 164 |  | 
|---|
|  | 165 | template <> | 
|---|
|  | 166 | inline void convertDataTo<MPQCData, MPQCDataTimeMap_t>( | 
|---|
| [c9f9bb] | 167 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
|  | 168 | std::map<JobId_t, MPQCDataTimeMap_t> &MPQCData_Time_fused) | 
|---|
| [0398bd] | 169 | { | 
|---|
|  | 170 | // times | 
|---|
|  | 171 | MPQCData_Time_fused.clear(); | 
|---|
| [c9f9bb] | 172 | for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 173 | dataiter != fragmentData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 174 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 175 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 176 | MPQCDataTimeMap_t instance; | 
|---|
| [4aee30] | 177 | boost::fusion::at_key<MPQCDataFused::times_total_walltime>(instance) = extractedData.times.total_walltime; | 
|---|
|  | 178 | boost::fusion::at_key<MPQCDataFused::times_total_cputime>(instance) = extractedData.times.total_cputime; | 
|---|
|  | 179 | boost::fusion::at_key<MPQCDataFused::times_total_flops>(instance) = extractedData.times.total_flops; | 
|---|
|  | 180 | boost::fusion::at_key<MPQCDataFused::times_gather_walltime>(instance) = extractedData.times.gather_walltime; | 
|---|
|  | 181 | boost::fusion::at_key<MPQCDataFused::times_gather_cputime>(instance) = extractedData.times.gather_cputime; | 
|---|
|  | 182 | boost::fusion::at_key<MPQCDataFused::times_gather_flops>(instance) = extractedData.times.gather_flops; | 
|---|
| [c9f9bb] | 183 | MPQCData_Time_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 184 | } | 
|---|
|  | 185 | } | 
|---|
|  | 186 |  | 
|---|
|  | 187 |  | 
|---|
|  | 188 | #endif /* DATACONVERTER_HPP_ */ | 
|---|