source: src/Fragmentation/Automation/FragmentationResults.cpp@ 19c50e

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
Last change on this file since 19c50e was 19c50e, checked in by Frederik Heber <heber@…>, 12 years ago

IndexSetContainer now treats super set specially.

  • The super set must not gather its subsets via the gatherSubsets() as by construction all other sets are its subsets! As the super set is very large the power set way is no good idea.
  • added default cstor for SortedVector
  • removed SubsetMap::getMaximumSubsetLevel() as is replaced by ::getMaximumSetLevel() which is the level to sum up to.
  • changed all uses of getMaximumSubsetLevel() to getMaximumSetLevel().
  • TESTFIX: Changed unit test function on getMaximumSubsetLevel() to check on getMaximumSetLevel()
  • removed OrthogonalFullSummator as is fully replacable by OrthogonalSummator.
  • changed IndexSetContainer::createSuperSet a bit.
  • IndexSetContainer::AllIndices is now no more static convenience entity but truely contains the super set (non-statically). ::createSuperSet() is for convenience to be called in cstor for AllIndices.
  • Property mode set to 100644
File size: 9.2 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * FragmentationResults.cpp
25 *
26 * Created on: Aug 31, 2012
27 * Author: heber
28 */
29
30
31// include config.h
32#ifdef HAVE_CONFIG_H
33#include <config.h>
34#endif
35
36#include "CodePatterns/MemDebug.hpp"
37
38#include "FragmentationResults.hpp"
39
40#include <boost/mpl/for_each.hpp>
41#include <boost/mpl/remove.hpp>
42#include <sstream>
43
44#include "CodePatterns/Assert.hpp"
45#include "CodePatterns/Log.hpp"
46
47#include "Fragmentation/Converter/DataConverter.hpp"
48#include "Fragmentation/KeySetsContainer.hpp"
49#include "Fragmentation/Automation/createMatrixNrLookup.hpp"
50#include "Fragmentation/Automation/extractJobIds.hpp"
51#include "Fragmentation/Summation/AllLevelOrthogonalSummator.hpp"
52#include "Fragmentation/Summation/IndexSetContainer.hpp"
53#include "Fragmentation/Summation/OrthogonalSumUpPerLevel.hpp"
54#include "Fragmentation/Summation/SubsetMap.hpp"
55#include "Fragmentation/Summation/SumUpPerLevel.hpp"
56
57#include "Helpers/defs.hpp"
58
59
60FragmentationResults::FragmentationResults(
61 const std::map<JobId_t,MPQCData> &fragmentData,
62 const std::map<JobId_t,VMGData> &longrangeData,
63 const std::vector<VMGData> &fullsolutionData,
64 const std::string &KeySetFilename,
65 const size_t NoAtoms,
66 const std::vector<SamplingGrid> &full_sample)
67{
68 // create lookup from job nr to fragment number
69 size_t MPQCFragmentCounter = 0;
70 const std::vector<JobId_t> mpqcjobids = extractJobIds<MPQCData>(fragmentData);
71 const std::map< JobId_t, size_t > MPQCMatrixNrLookup =
72 createMatrixNrLookup(mpqcjobids, MPQCFragmentCounter);
73
74 size_t VMGFragmentCounter = 0;
75 const std::vector<JobId_t> vmgjobids = extractJobIds<VMGData>(longrangeData);
76 const std::map< JobId_t, size_t > VMGMatrixNrLookup =
77 createMatrixNrLookup(vmgjobids, VMGFragmentCounter);
78
79 // initialise keysets
80 KeySetsContainer KeySet;
81 KeySetsContainer ForceKeySet;
82 {
83 // else needs keysets without hydrogens
84 std::stringstream filename;
85 filename << FRAGMENTPREFIX << KEYSETFILE;
86#ifndef NDEBUG
87 bool status =
88#endif
89 KeySet.ParseKeySets(KeySetFilename, filename.str(), MPQCFragmentCounter);
90 ASSERT( status,
91 "FragmentationResults::FragmentationResults() - ParseKeySets() of "
92 +toString(KEYSETFILE)+" failed.");
93 }
94
95 {
96 // forces need keysets including hydrogens
97 std::stringstream filename;
98 filename << FRAGMENTPREFIX << FORCESFILE;
99#ifndef NDEBUG
100 bool status =
101#endif
102 ForceKeySet.ParseKeySets(KeySetFilename, filename.str(), MPQCFragmentCounter);
103 ASSERT( status,
104 "FragmentationResults::FragmentationResults() - ParseKeySets() of "
105 +toString(FORCESFILE)+" failed.");
106 }
107
108 /// prepare for OrthogonalSummation
109
110 // convert KeySetContainer to IndexSetContainer
111 IndexSetContainer::ptr container(new IndexSetContainer(KeySet));
112 // create the map of all keysets
113 SubsetMap::ptr subsetmap(new SubsetMap(*container));
114
115 MaxLevel = subsetmap->getMaximumSetLevel();
116 LOG(1, "INFO: Summing up results till level " << MaxLevel << ".");
117 /// convert all MPQCData to MPQCDataMap_t
118 {
119 ASSERT( ForceKeySet.KeySets.size() == fragmentData.size(),
120 "FragmentationResults::FragmentationResults() - ForceKeySet's KeySets and fragmentData differ in size.");
121
122 typedef boost::mpl::remove<MPQCDataEnergyVector_t, MPQCDataFused::energy_eigenvalues>::type MPQCDataEnergyVector_noeigenvalues_t;
123 Result_Energy_fused =
124 OrthogonalSumUpPerLevel<MPQCDataEnergyMap_t, MPQCData, MPQCDataEnergyVector_t>(
125 fragmentData, MPQCMatrixNrLookup, container, subsetmap);
126 Result_Grid_fused =
127 OrthogonalSumUpPerLevel<MPQCDataGridMap_t, MPQCData, MPQCDataGridVector_t>(
128 fragmentData, MPQCMatrixNrLookup, container, subsetmap);
129 Result_Time_fused =
130 SumUpPerLevel<MPQCDataTimeMap_t, MPQCData, MPQCDataTimeVector_t>(
131 fragmentData, MPQCMatrixNrLookup, container, subsetmap);
132 Result_Fragment_fused =
133 OrthogonalSumUpPerLevel<MPQCDataFragmentMap_t, MPQCData, MPQCDataFragmentVector_t>(
134 fragmentData, MPQCMatrixNrLookup, container, subsetmap);
135 Result_LongRange_fused =
136 OrthogonalSumUpPerLevel<VMGDataMap_t, VMGData, VMGDataVector_t>(
137 longrangeData, VMGMatrixNrLookup, container, subsetmap);
138
139 // force has extra data converter
140 std::map<JobId_t, MPQCDataForceMap_t> MPQCData_Force_fused;
141 convertMPQCDatatoForceMap(fragmentData, ForceKeySet, MPQCData_Force_fused);
142 Result_Force_fused.resize(MaxLevel); // we need the results of correct size already
143 AllLevelOrthogonalSummator<MPQCDataForceMap_t> forceSummer(
144 subsetmap,
145 MPQCData_Force_fused,
146 container->getContainer(),
147 MPQCMatrixNrLookup,
148 Result_Force_fused);
149 boost::mpl::for_each<MPQCDataForceVector_t>(boost::ref(forceSummer));
150
151 Result_LongRangeIntegrated_fused.reserve(MaxLevel);
152 for (size_t level = 1; level <= MaxLevel; ++level) {
153 // we have to fill in the remainder values in the LongRangeMap by hand
154 // weight times correct charge density of the same level
155 // NOTE: potential for level 1 is not calculated as saturation hydrogen
156 // are not removed on this level yet
157 const size_t potentiallevel = level < 2 ? 0 : (level-2);
158 const SamplingGrid &charge_weight =
159 boost::fusion::at_key<MPQCDataFused::sampled_grid>(Result_Grid_fused[level-1]);
160 SamplingGrid full_sample_solution =
161 fullsolutionData[potentiallevel].sampled_potential;
162 const SamplingGrid &short_range_correction =
163 boost::fusion::at_key<VMGDataFused::sampled_potential>(Result_LongRange_fused[level-1]);
164 // LOG(0, "Remaining long-range energy from energy_potential is " << full_sample_solution.integral()-epotentialSummer.getFullContribution() << ".");
165 full_sample_solution -= short_range_correction;
166
167 // multiply element-wise with charge distribution
168 VMGDataLongRangeMap_t instance;
169 boost::fusion::at_key<VMGDataFused::potential_longrange>(instance) = full_sample_solution.integral();
170 LOG(0, "Remaining long-range potential integral of level " << level << " is "
171 << full_sample_solution.integral() << ".");
172 boost::fusion::at_key<VMGDataFused::potential_shortrange>(instance) = short_range_correction.integral();
173 LOG(0, "Short-range correction potential integral of level " << level << " is "
174 << short_range_correction.integral() << ".");
175 boost::fusion::at_key<VMGDataFused::energy_longrange>(instance) = full_sample_solution.integral(charge_weight);
176 LOG(0, "Remaining long-range energy from potential integral of level " << level << " is "
177 << full_sample_solution.integral(charge_weight) << ".");
178 boost::fusion::at_key<VMGDataFused::energy_shortrange>(instance) = short_range_correction.integral(charge_weight);
179 LOG(0, "Short-range correction energy from potential integral of level " << level << " is "
180 << short_range_correction.integral(charge_weight) << ".");
181 Result_LongRangeIntegrated_fused.push_back(instance);
182 }
183// {
184// // LOG(0, "Remaining long-range energy from energy_potential is " << full_sample_solution.integral()-epotentialSummer.getFullContribution() << ".");
185// SamplingGrid full_sample_solution = fullsolutionData.back().sampled_potential;
186// const SamplingGrid &short_range_correction =
187// boost::fusion::at_key<VMGDataFused::sampled_potential>(Result_LongRange_fused.back()).getFullContribution();
188// full_sample_solution -= short_range_correction;
189// // multiply element-wise with charge distribution
190// LOG(0, "Remaining long-range potential integral is " << full_sample_solution.integral() << ".");
191// LOG(0, "Short-range correction potential integral of level is " << short_range_correction.integral() << ".");
192// LOG(0, "Remaining long-range energy from potential integral is "
193// << full_sample_solution.integral(full_sample.back()) << ".");
194// LOG(0, "Short-range correction energy from potential integral is "
195// << short_range_correction.integral(full_sample.back()) << ".");
196//
197// double e_long = fullsolutionData.back().e_long;
198// e_long -= boost::fusion::at_key<VMGDataFused::energy_long>(Result_LongRange_fused.back()).getFullContribution();
199// LOG(0, "Remaining long-range energy is " << e_long << ".");
200// }
201
202 // TODO: Extract long-range corrections to forces
203 // NOTE: potential is in atomic length units, NOT IN ANGSTROEM!
204
205 }
206}
Note: See TracBrowser for help on using the repository browser.