source: src/Fragmentation/Summation/Containers/MPQCData.cpp@ c79d7a

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since c79d7a was 6829d2, checked in by Frederik Heber <heber@…>, 8 years ago

MPQCData additionally stores the atomic number per nuclei.

  • in case of DoSampleValenceOnly the charge does not represent the atomic number and moreover it is no longer unique. However, we need this unique association for fitting potentials to the fragment results.
  • TESTFIX: set all tests to XFAIL that parse either fragmentation results or homologies.
  • TESTFIX: needed to adapt HomologyContainerUnitTest which uses FragmentStub.
  • TESTFIX: needed to adapt FragmentUnitTest.
  • Property mode set to 100644
File size: 5.2 KB
RevLine 
[cc276e]1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2012 University of Bonn. All rights reserved.
[5aaa43]5 * Copyright (C) 2013 Frederik Heber. All rights reserved.
[94d5ac6]6 *
7 *
8 * This file is part of MoleCuilder.
9 *
10 * MoleCuilder is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * MoleCuilder is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
[cc276e]22 */
23
24/*
25 * MPQCCommandJob_MPQCData.cpp
26 *
27 * Created on: Feb 08, 2012
28 * Author: heber
29 */
30
31// include config.h
32#ifdef HAVE_CONFIG_H
33#include <config.h>
34#endif
35
36#include "CodePatterns/MemDebug.hpp"
37
[4bc75d]38#include "MPQCData.hpp"
[cc276e]39
[509014]40#include <iostream>
[cc276e]41#include <limits>
42
43#include "CodePatterns/Log.hpp"
[004d5c]44#include "LinearAlgebra/defs.hpp"
45
[28c025]46MPQCData::MPQCData(const SamplingGridProperties &_props) :
[503acc1]47 DoLongrange(DontSampleDensity),
[6ff62c]48 DoValenceOnly(DoSampleValenceOnly),
[9ff818]49 sampled_grid(_props),
50 accuracy(0.),
51 desired_accuracy(0.)
[28c025]52{}
53
[503acc1]54MPQCData::MPQCData() :
[6ff62c]55 DoLongrange(DontSampleDensity),
[9ff818]56 DoValenceOnly(DoSampleValenceOnly),
57 accuracy(0.),
58 desired_accuracy(0.)
[28c025]59{}
60
[a9558f]61MPQCData::energy_t::energy_t() :
62 total(0.),
63 nuclear_repulsion(0.),
[adccae]64 electron_coulomb(0.),
65 electron_exchange(0.),
[a9558f]66 correlation(0.),
67 overlap(0.),
68 kinetic(0.),
69 hcore(0.)
[cc276e]70{}
71
[a9558f]72MPQCData::times_t::times_t() :
[4aee30]73 total_walltime(0.),
74 total_cputime(0.),
75 total_flops(0.),
76 gather_walltime(0.),
77 gather_cputime(0.),
78 gather_flops(0.)
[cc276e]79{}
80
81/** Comparator for class MPQCData.
82 *
83 */
84bool MPQCData::operator==(const MPQCData &other) const
85{
[a9558f]86 if (fabs(energies.total - other.energies.total) > std::numeric_limits<double>::epsilon()) {
[cc276e]87 LOG(1, "INFO: Energy's in MPQCData differ: "
[a9558f]88 << energies.total << " != " << other.energies.total << ".");
[cc276e]89 return false;
90 }
91 if (forces.size() != other.forces.size()) {
92 LOG(1, "INFO: Forces's in MPQCData differ in size: "
93 << forces.size() << " != " << other.forces.size() << ".");
94 return false;
95 }
96 for (size_t i = 0; i < forces.size(); ++i)
97 for (size_t index = 0; index < NDIM; ++index)
98 if (fabs(forces[i][index] - other.forces[i][index]) > std::numeric_limits<double>::epsilon()) {
99 LOG(1, "INFO: " << index << "th component of force of particle "
100 << i << " in MPQCData differ: " << forces[i][index]
101 << " != " << other.forces[i][index] << ".");
102 return false;
103 }
104 return true;
105}
[509014]106
[2ebfd7]107void MPQCData::assignWithDownsampledGrid(
108 MPQCData &instance,
109 const MPQCData &other)
110{
111 if (&instance != &other) {
112 instance.energies = other.energies;
113 instance.forces = other.forces;
114 instance.DoLongrange = other.DoLongrange;
115 instance.DoValenceOnly = other.DoValenceOnly;
116 /** We need to return from the local grid of the fragment to the global
117 * grid and change the level in such a way that the gridpoints remain exactly
118 * the same.
119 */
120 SamplingGridProperties domain(instance.sampled_grid);
121 //!> we need to downsample by the difference in levels and by the smaller grid size
122 const double surplus_level = instance.sampled_grid.getSurplusLevel(other.sampled_grid);
123 ASSERT( fabs(surplus_level - round(surplus_level)) < std::numeric_limits<double>::epsilon()*1e4,
124 "MPQCData::assignWithDownsampledGrid() - surplus level is not integer: "
125 +toString(surplus_level));
126 const int downsample_level =
127 (other.sampled_grid.level - instance.sampled_grid.level) + round(surplus_level);
128 // downsample the stored grid values to the coarser grid
129 SamplingGrid::downsample(
130 instance.sampled_grid, other.sampled_grid,
131 other.sampled_grid.level - downsample_level);
132 // then we can simply take over
133#ifndef NDEBUG
134 const size_t window_gridpoints = instance.sampled_grid.getWindowGridPoints();
135#endif
136 static_cast<SamplingGridProperties &>(instance.sampled_grid) = domain;
137 ASSERT(instance.sampled_grid.getWindowGridPoints() == window_gridpoints,
138 "MPQCData::assignWithDownsampledGrid() - number of window gridpoints is "
139 +toString(instance.sampled_grid.getWindowGridPoints())+" and was "+toString(window_gridpoints));
140 instance.positions = other.positions;
[6829d2]141 instance.atomicnumbers = other.atomicnumbers;
[2ebfd7]142 instance.charges = other.charges;
143 instance.times = other.times;
144 instance.accuracy = other.accuracy;
145 instance.desired_accuracy = other.desired_accuracy;
146 }
147}
148
[509014]149std::ostream & operator<<(std::ostream &ost, const MPQCData &data)
150{
[a9558f]151 ost << "Energy: " << data.energies.total << "\t";
152 ost << "Forces: " << data.forces << "\t";
[4aee30]153 ost << "Times: " << data.times.total_walltime << ", "
154 << data.times.total_cputime << ", "
[9ff818]155 << data.times.total_flops << ", ";
156 ost << "Accuracy: " << data.accuracy << "\t";
157 ost << "Desired accuracy: " << data.desired_accuracy << "\t";
[509014]158 return ost;
159}
Note: See TracBrowser for help on using the repository browser.