| [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; | 
|---|
|  | 91 | boost::fusion::at_key<VMGDataFused::energy_potential>(instance) = extractedData.sampled_potential.integral(); | 
|---|
|  | 92 | boost::fusion::at_key<VMGDataFused::energy_long>(instance) = extractedData.e_long; | 
|---|
| [c9f9bb] | 93 | VMGData_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 94 | } | 
|---|
|  | 95 | } | 
|---|
|  | 96 | #endif | 
|---|
|  | 97 |  | 
|---|
|  | 98 | inline void convertMPQCDatatoForceMap( | 
|---|
| [c9f9bb] | 99 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
| [0398bd] | 100 | const KeySetsContainer &ForceKeySet, | 
|---|
| [c9f9bb] | 101 | std::map<JobId_t, MPQCDataForceMap_t> &MPQCData_Force_fused) | 
|---|
| [0398bd] | 102 | { | 
|---|
|  | 103 | // forces | 
|---|
|  | 104 | ASSERT( ForceKeySet.KeySets.size() == fragmentData.size(), | 
|---|
|  | 105 | "FragmentationAutomationAction::performCall() - indices and fragmentData differ in size."); | 
|---|
|  | 106 | MPQCData_Force_fused.clear(); | 
|---|
| [c9f9bb] | 107 | std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 108 | KeySetsContainer::ArrayOfIntVectors::const_iterator arrayiter = ForceKeySet.KeySets.begin(); | 
|---|
|  | 109 | for(;dataiter != fragmentData.end(); ++dataiter, ++arrayiter) { | 
|---|
| [c9f9bb] | 110 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 111 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 112 | MPQCDataForceMap_t instance; | 
|---|
|  | 113 | // must convert int to index_t | 
|---|
|  | 114 | IndexedVectors::indices_t indices(arrayiter->begin(), arrayiter->end()); | 
|---|
|  | 115 | boost::fusion::at_key<MPQCDataFused::forces>(instance) = | 
|---|
|  | 116 | IndexedVectors(indices, extractedData.forces); | 
|---|
| [c9f9bb] | 117 | MPQCData_Force_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 118 | } | 
|---|
|  | 119 | } | 
|---|
|  | 120 |  | 
|---|
|  | 121 | template <> | 
|---|
|  | 122 | inline void convertDataTo<MPQCData, MPQCDataGridMap_t>( | 
|---|
| [c9f9bb] | 123 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
|  | 124 | std::map<JobId_t, MPQCDataGridMap_t> &MPQCData_Grid_fused) | 
|---|
| [0398bd] | 125 | { | 
|---|
|  | 126 | // sampled_grid | 
|---|
|  | 127 | MPQCData_Grid_fused.clear(); | 
|---|
| [c9f9bb] | 128 | for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 129 | dataiter != fragmentData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 130 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 131 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 132 | MPQCDataGridMap_t instance; | 
|---|
|  | 133 | boost::fusion::at_key<MPQCDataFused::sampled_grid>(instance) = extractedData.sampled_grid; | 
|---|
| [c9f9bb] | 134 | MPQCData_Grid_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 135 | } | 
|---|
|  | 136 | } | 
|---|
|  | 137 |  | 
|---|
|  | 138 | template <> | 
|---|
|  | 139 | inline void convertDataTo<MPQCData, MPQCDataFragmentMap_t>( | 
|---|
| [c9f9bb] | 140 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
|  | 141 | std::map<JobId_t, MPQCDataFragmentMap_t> &MPQCData_Fragment_fused) | 
|---|
| [0398bd] | 142 | { | 
|---|
|  | 143 | // fragment | 
|---|
|  | 144 | MPQCData_Fragment_fused.clear(); | 
|---|
| [c9f9bb] | 145 | for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 146 | dataiter != fragmentData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 147 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 148 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 149 | MPQCDataFragmentMap_t instance; | 
|---|
|  | 150 | boost::fusion::at_key<MPQCDataFused::fragment>(instance) = | 
|---|
|  | 151 | Fragment(extractedData.positions, extractedData.charges); | 
|---|
| [c9f9bb] | 152 | MPQCData_Fragment_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 153 | } | 
|---|
|  | 154 | } | 
|---|
|  | 155 |  | 
|---|
|  | 156 | template <> | 
|---|
|  | 157 | inline void convertDataTo<MPQCData, MPQCDataTimeMap_t>( | 
|---|
| [c9f9bb] | 158 | const std::map<JobId_t, MPQCData> &fragmentData, | 
|---|
|  | 159 | std::map<JobId_t, MPQCDataTimeMap_t> &MPQCData_Time_fused) | 
|---|
| [0398bd] | 160 | { | 
|---|
|  | 161 | // times | 
|---|
|  | 162 | MPQCData_Time_fused.clear(); | 
|---|
| [c9f9bb] | 163 | for(std::map<JobId_t, MPQCData>::const_iterator dataiter = fragmentData.begin(); | 
|---|
| [0398bd] | 164 | dataiter != fragmentData.end(); ++dataiter) { | 
|---|
| [c9f9bb] | 165 | const MPQCData &extractedData = dataiter->second; | 
|---|
| [0398bd] | 166 | LOG(4, "DEBUG: Current extracted Data is " << extractedData << "."); | 
|---|
|  | 167 | MPQCDataTimeMap_t instance; | 
|---|
| [4aee30] | 168 | boost::fusion::at_key<MPQCDataFused::times_total_walltime>(instance) = extractedData.times.total_walltime; | 
|---|
|  | 169 | boost::fusion::at_key<MPQCDataFused::times_total_cputime>(instance) = extractedData.times.total_cputime; | 
|---|
|  | 170 | boost::fusion::at_key<MPQCDataFused::times_total_flops>(instance) = extractedData.times.total_flops; | 
|---|
|  | 171 | boost::fusion::at_key<MPQCDataFused::times_gather_walltime>(instance) = extractedData.times.gather_walltime; | 
|---|
|  | 172 | boost::fusion::at_key<MPQCDataFused::times_gather_cputime>(instance) = extractedData.times.gather_cputime; | 
|---|
|  | 173 | boost::fusion::at_key<MPQCDataFused::times_gather_flops>(instance) = extractedData.times.gather_flops; | 
|---|
| [c9f9bb] | 174 | MPQCData_Time_fused.insert( std::make_pair(dataiter->first, instance) ); | 
|---|
| [0398bd] | 175 | } | 
|---|
|  | 176 | } | 
|---|
|  | 177 |  | 
|---|
|  | 178 |  | 
|---|
|  | 179 | #endif /* DATACONVERTER_HPP_ */ | 
|---|