source: molecuilder/src/bondgraph.cpp@ 2e06c4

Last change on this file since 2e06c4 was 1f2e46, checked in by Frederik Heber <heber@…>, 15 years ago

Huge change: Log() << Verbose(.) --> DoLog(.) && (Log() << Verbose(.) << ...);

Most of the files are affected, but this is necessary as if DoLog() says verbosity is not enough, all the stream operators won"t get executed which saves substantial amount of computation time.

Signed-off-by: Frederik Heber <heber@…>

  • Property mode set to 100644
File size: 5.9 KB
Line 
1/*
2 * bondgraph.cpp
3 *
4 * Created on: Oct 29, 2009
5 * Author: heber
6 */
7
8#include <iostream>
9
10#include "atom.hpp"
11#include "bond.hpp"
12#include "bondgraph.hpp"
13#include "element.hpp"
14#include "info.hpp"
15#include "log.hpp"
16#include "molecule.hpp"
17#include "parser.hpp"
18#include "periodentafel.hpp"
19#include "vector.hpp"
20
21/** Constructor of class BondGraph.
22 * This classes contains typical bond lengths and thus may be used to construct a bond graph for a given molecule.
23 */
24BondGraph::BondGraph(bool IsA) : BondLengthMatrix(NULL), max_distance(0), IsAngstroem(IsA)
25{
26};
27
28/** Destructor of class BondGraph.
29 */
30BondGraph::~BondGraph()
31{
32 if (BondLengthMatrix != NULL) {
33 delete(BondLengthMatrix);
34 }
35};
36
37/** Parses the bond lengths in a given file and puts them int a matrix form.
38 * Allocates \a MatrixContainer for BondGraph::BondLengthMatrix, using MatrixContainer::ParseMatrix(),
39 * but only if parsing is successful. Otherwise variable is left as NULL.
40 * \param *out output stream for debugging
41 * \param filename file with bond lengths to parse
42 * \return true - success in parsing file, false - failed to parse the file
43 */
44bool BondGraph::LoadBondLengthTable(const string &filename)
45{
46 Info FunctionInfo(__func__);
47 bool status = true;
48 MatrixContainer *TempContainer = NULL;
49
50 // allocate MatrixContainer
51 if (BondLengthMatrix != NULL) {
52 DoLog(1) && (Log() << Verbose(1) << "MatrixContainer for Bond length already present, removing." << endl);
53 delete(BondLengthMatrix);
54 }
55 TempContainer = new MatrixContainer;
56
57 // parse in matrix
58 if ((status = TempContainer->ParseMatrix(filename.c_str(), 0, 1, 0))) {
59 DoLog(1) && (Log() << Verbose(1) << "Parsing bond length matrix successful." << endl);
60 } else {
61 DoeLog(1) && (eLog()<< Verbose(1) << "Parsing bond length matrix failed." << endl);
62 }
63
64 // find greatest distance
65 max_distance=0;
66 if (status) {
67 for(int i=0;i<TempContainer->RowCounter[0];i++)
68 for(int j=i;j<TempContainer->ColumnCounter[0];j++)
69 if (TempContainer->Matrix[0][i][j] > max_distance)
70 max_distance = TempContainer->Matrix[0][i][j];
71 }
72
73 if (status) // set to not NULL only if matrix was parsed
74 BondLengthMatrix = TempContainer;
75 else {
76 BondLengthMatrix = NULL;
77 delete(TempContainer);
78 }
79 return status;
80};
81
82/** Parses the bond lengths in a given file and puts them int a matrix form.
83 * \param *out output stream for debugging
84 * \param *mol molecule with atoms
85 * \return true - success, false - failed to construct bond structure
86 */
87bool BondGraph::ConstructBondGraph(molecule * const mol)
88{
89 Info FunctionInfo(__func__);
90bool status = true;
91
92 if (mol->start->next == mol->end) // only construct if molecule is not empty
93 return false;
94
95 if (BondLengthMatrix == NULL) { // no bond length matrix parsed?
96 SetMaxDistanceToMaxOfCovalentRadii(mol);
97 mol->CreateAdjacencyList(max_distance, IsAngstroem, &BondGraph::CovalentMinMaxDistance, this);
98 } else
99 mol->CreateAdjacencyList(max_distance, IsAngstroem, &BondGraph::BondLengthMatrixMinMaxDistance, this);
100
101 return status;
102};
103
104/** Returns the entry for a given index pair.
105 * \param firstelement index/atom number of first element (row index)
106 * \param secondelement index/atom number of second element (column index)
107 * \note matrix is of course symmetric.
108 */
109double BondGraph::GetBondLength(int firstZ, int secondZ)
110{
111 if (BondLengthMatrix == NULL)
112 return( -1. );
113 else
114 return (BondLengthMatrix->Matrix[0][firstZ][secondZ]);
115};
116
117/** Determines the maximum of all element::CovalentRadius for elements present in \a *mol.
118 * \param *out output stream for debugging
119 * \param *mol molecule with all atoms and their respective elements.
120 */
121double BondGraph::SetMaxDistanceToMaxOfCovalentRadii(const molecule * const mol)
122{
123 Info FunctionInfo(__func__);
124 max_distance = 0.;
125
126 atom *Runner = mol->start;
127 while (Runner->next != mol->end) {
128 Runner = Runner->next;
129 if (Runner->type->CovalentRadius > max_distance)
130 max_distance = Runner->type->CovalentRadius;
131 }
132 max_distance *= 2.;
133
134 return max_distance;
135};
136
137/** Returns bond criterion for given pair based on covalent radius.
138 * \param *Walker first BondedParticle
139 * \param *OtherWalker second BondedParticle
140 * \param &MinDistance lower bond bound on return
141 * \param &MaxDistance upper bond bound on return
142 * \param IsAngstroem whether units are in angstroem or bohr radii
143 */
144void BondGraph::CovalentMinMaxDistance(BondedParticle * const Walker, BondedParticle * const OtherWalker, double &MinDistance, double &MaxDistance, bool IsAngstroem)
145{
146 MinDistance = OtherWalker->type->CovalentRadius + Walker->type->CovalentRadius;
147 MinDistance *= (IsAngstroem) ? 1. : 1. / AtomicLengthToAngstroem;
148 MaxDistance = MinDistance + BONDTHRESHOLD;
149 MinDistance -= BONDTHRESHOLD;
150};
151
152/** Returns bond criterion for given pair based on a bond length matrix.
153 * The matrix should be contained in \a this BondGraph and contain an element-
154 * to-element length.
155 * \param *Walker first BondedParticle
156 * \param *OtherWalker second BondedParticle
157 * \param &MinDistance lower bond bound on return
158 * \param &MaxDistance upper bond bound on return
159 * \param IsAngstroem whether units are in angstroem or bohr radii
160 */
161void BondGraph::BondLengthMatrixMinMaxDistance(BondedParticle * const Walker, BondedParticle * const OtherWalker, double &MinDistance, double &MaxDistance, bool IsAngstroem)
162{
163 if (BondLengthMatrix == NULL) {// safety measure if no matrix has been parsed yet
164 DoeLog(2) && (eLog()<< Verbose(2) << "BondLengthMatrixMinMaxDistance() called without having parsed the bond length matrix yet!" << endl);
165 CovalentMinMaxDistance(Walker, OtherWalker, MinDistance, MaxDistance, IsAngstroem);
166 } else {
167 MinDistance = GetBondLength(Walker->type->Z-1, OtherWalker->type->Z-1);
168 MinDistance *= (IsAngstroem) ? 1. : 1. / AtomicLengthToAngstroem;
169 MaxDistance = MinDistance + BONDTHRESHOLD;
170 MinDistance -= BONDTHRESHOLD;
171 }
172};
Note: See TracBrowser for help on using the repository browser.