source: src/Fragmentation/fragmentation_helpers.cpp@ 730d7a

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 Candidate_v1.7.0 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 730d7a was 730d7a, checked in by Frederik Heber <heber@…>, 14 years ago

New class AdaptivityMap and moved some functions from fragmentation_helpers into it.

  • Property mode set to 100644
File size: 5.4 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * fragmentation_helpers.cpp
10 *
11 * Created on: Oct 18, 2011
12 * Author: heber
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include "CodePatterns/MemDebug.hpp"
21
22#include "fragmentation_helpers.hpp"
23
24#include <sstream>
25
26#include "CodePatterns/Log.hpp"
27
28#include "atom.hpp"
29#include "Bond/bond.hpp"
30#include "Element/element.hpp"
31#include "Fragmentation/AdaptivityMap.hpp"
32#include "Fragmentation/Graph.hpp"
33#include "Fragmentation/KeySet.hpp"
34#include "Helpers/defs.hpp"
35#include "Helpers/helpers.hpp"
36#include "molecule.hpp"
37
38using namespace std;
39
40
41
42
43/** Marks all candidate sites for update if below adaptive threshold.
44 * Picks a given number of highest values and set *AtomMask to true.
45 * \param *out output stream for debugging
46 * \param *AtomMask defines true/false per global Atom::Nr to mask in/out each nuclear site, used to activate given number of site to increment order adaptively
47 * \param FinalRootCandidates list candidates to check
48 * \param Order desired order
49 * \param *mol molecule with atoms
50 * \return true - if update is necessary, false - not
51 */
52bool MarkUpdateCandidates(bool *AtomMask, std::map<double, std::pair<int,int> > &FinalRootCandidates, int Order, molecule *mol)
53{
54 atom *Walker = NULL;
55 int No = -1;
56 bool status = false;
57 for(map<double, pair<int,int> >::iterator runner = FinalRootCandidates.upper_bound(pow(10.,Order)); runner != FinalRootCandidates.end(); runner++) {
58 No = (*runner).second.first;
59 Walker = mol->FindAtom(No);
60 //if (Walker->AdaptiveOrder < MinimumRingSize[Walker->getNr()]) {
61 DoLog(2) && (Log() << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", setting entry " << No << " of Atom mask to true." << endl);
62 AtomMask[No] = true;
63 status = true;
64 //} else
65 //Log() << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", however MinimumRingSize of " << MinimumRingSize[Walker->getNr()] << " does not allow further adaptive increase." << endl;
66 }
67 return status;
68};
69
70/** print atom mask for debugging.
71 * \param *out output stream for debugging
72 * \param *AtomMask defines true/false per global Atom::Nr to mask in/out each nuclear site, used to activate given number of site to increment order adaptively
73 * \param AtomCount number of entries in \a *AtomMask
74 */
75void PrintAtomMask(bool *AtomMask, int AtomCount)
76{
77 DoLog(2) && (Log() << Verbose(2) << " ");
78 for(int i=0;i<AtomCount;i++)
79 DoLog(0) && (Log() << Verbose(0) << (i % 10));
80 DoLog(0) && (Log() << Verbose(0) << endl);
81 DoLog(2) && (Log() << Verbose(2) << "Atom mask is: ");
82 for(int i=0;i<AtomCount;i++)
83 DoLog(0) && (Log() << Verbose(0) << (AtomMask[i] ? "t" : "f"));
84 DoLog(0) && (Log() << Verbose(0) << endl);
85};
86
87/** Combines all KeySets from all orders into single ones (with just unique entries).
88 * \param *out output stream for debugging
89 * \param *&FragmentList list to fill
90 * \param ***FragmentLowerOrdersList
91 * \param &RootStack stack with all root candidates (unequal to each atom in complete molecule if adaptive scheme is applied)
92 * \param *mol molecule with atoms and bonds
93 */
94int CombineAllOrderListIntoOne(Graph *&FragmentList, Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol)
95{
96 int RootNr = 0;
97 int RootKeyNr = 0;
98 int StartNr = 0;
99 int counter = 0;
100 int NumLevels = 0;
101 atom *Walker = NULL;
102
103 DoLog(0) && (Log() << Verbose(0) << "Combining the lists of all orders per order and finally into a single one." << endl);
104 if (FragmentList == NULL) {
105 FragmentList = new Graph;
106 counter = 0;
107 } else {
108 counter = FragmentList->size();
109 }
110
111 StartNr = RootStack.back();
112 do {
113 RootKeyNr = RootStack.front();
114 RootStack.pop_front();
115 Walker = mol->FindAtom(RootKeyNr);
116 NumLevels = 1 << (Walker->AdaptiveOrder - 1);
117 for(int i=0;i<NumLevels;i++) {
118 if (FragmentLowerOrdersList[RootNr][i] != NULL) {
119 (*FragmentList).InsertGraph((*FragmentLowerOrdersList[RootNr][i]), &counter);
120 }
121 }
122 RootStack.push_back(Walker->getNr());
123 RootNr++;
124 } while (RootKeyNr != StartNr);
125 return counter;
126};
127
128/** Free's memory allocated for all KeySets from all orders.
129 * \param *out output stream for debugging
130 * \param ***FragmentLowerOrdersList
131 * \param &RootStack stack with all root candidates (unequal to each atom in complete molecule if adaptive scheme is applied)
132 * \param *mol molecule with atoms and bonds
133 */
134void FreeAllOrdersList(Graph ***FragmentLowerOrdersList, KeyStack &RootStack, molecule *mol)
135{
136 DoLog(1) && (Log() << Verbose(1) << "Free'ing the lists of all orders per order." << endl);
137 int RootNr = 0;
138 int RootKeyNr = 0;
139 int NumLevels = 0;
140 atom *Walker = NULL;
141 while (!RootStack.empty()) {
142 RootKeyNr = RootStack.front();
143 RootStack.pop_front();
144 Walker = mol->FindAtom(RootKeyNr);
145 NumLevels = 1 << (Walker->AdaptiveOrder - 1);
146 for(int i=0;i<NumLevels;i++) {
147 if (FragmentLowerOrdersList[RootNr][i] != NULL) {
148 delete(FragmentLowerOrdersList[RootNr][i]);
149 }
150 }
151 delete[](FragmentLowerOrdersList[RootNr]);
152 RootNr++;
153 }
154 delete[](FragmentLowerOrdersList);
155};
156
Note: See TracBrowser for help on using the repository browser.