votca 2026-dev
Loading...
Searching...
No Matches
gridbox.cc
Go to the documentation of this file.
1/*
2 * Copyright 2009-2020 The VOTCA Development Team
3 * (http://www.votca.org)
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License")
6 *
7 * You may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20// Local VOTCA includes
21#include "votca/xtp/gridbox.h"
22#include "votca/xtp/aobasis.h"
23
24namespace votca {
25namespace xtp {
26
28
29 for (const AOShell& store : basis) {
30 const double decay = store.getMinDecay();
31 const Eigen::Vector3d& shellpos = store.getPos();
32 for (const auto& point : grid_pos) {
33 Eigen::Vector3d dist = shellpos - point;
34 double distsq = dist.squaredNorm();
35 // if contribution is smaller than -ln(1e-10), add shell to list
36 if ((decay * distsq) < 20.7) {
37 addShell(&store);
38 break;
39 }
40 }
41 }
42}
43
44AOShell::AOValues GridBox::CalcAOValues(const Eigen::Vector3d& point) const {
46 for (Index j = 0; j < Shellsize(); ++j) {
47 const AOShell::AOValues val = significant_shells[j]->EvalAOspace(point);
48 result.derivatives.middleRows(aoranges[j].start, aoranges[j].size) =
49 val.derivatives;
50 result.values.segment(aoranges[j].start, aoranges[j].size) = val.values;
51 }
52 return result;
53}
54
55void GridBox::CalcAOValues(const Eigen::Vector3d& point,
56 Eigen::MatrixXd& values,
57 Eigen::MatrixXd& derivatives, Index col) const {
58 values.col(col).setZero();
59 derivatives.middleCols(3 * col, 3).setZero();
60 for (Index j = 0; j < Shellsize(); ++j) {
61 const GridboxRange& r = aoranges[j];
62 significant_shells[j]->EvalAOspace(
63 point, values.col(col).segment(r.start, r.size),
64 derivatives.block(r.start, 3 * col, r.size, 3));
65 }
66}
67
69 const Eigen::Vector3d& point) const {
71 for (Index j = 0; j < Shellsize(); ++j) {
72 const AOShell::AOValuesHessian val =
73 significant_shells[j]->EvalAOspaceHessian(point);
74 result.derivatives.middleRows(aoranges[j].start, aoranges[j].size) =
75 val.derivatives;
76 result.values.segment(aoranges[j].start, aoranges[j].size) = val.values;
77 for (Index k = 0; k < aoranges[j].size; ++k) {
78 result.hessians[aoranges[j].start + k] = val.hessians[k];
79 }
80 }
81 return result;
82}
83
84void GridBox::AddtoBigMatrix(Eigen::MatrixXd& bigmatrix,
85 const Eigen::MatrixXd& smallmatrix) const {
86 for (Index i = 0; i < Index(ranges.size()); i++) {
87 for (Index j = 0; j < Index(ranges.size()); j++) {
88 bigmatrix.block(ranges[i].start, ranges[j].start, ranges[i].size,
89 ranges[j].size) +=
90 smallmatrix.block(inv_ranges[i].start, inv_ranges[j].start,
92 }
93 }
94 return;
95}
96
98 const Eigen::MatrixXd& bigmatrix) const {
99 Eigen::MatrixXd matrix = Eigen::MatrixXd(matrix_size, matrix_size);
100 for (Index i = 0; i < Index(ranges.size()); i++) {
101 for (Index j = 0; j < Index(ranges.size()); j++) {
102 matrix.block(inv_ranges[i].start, inv_ranges[j].start, inv_ranges[i].size,
103 inv_ranges[j].size) =
104 bigmatrix.block(ranges[i].start, ranges[j].start, ranges[i].size,
105 ranges[j].size);
106 }
107 }
108 return matrix;
109}
110
112 const Eigen::VectorXd& bigvector) const {
113 Eigen::VectorXd vector = Eigen::VectorXd(matrix_size);
114 for (Index i = 0; i < Index(ranges.size()); i++) {
115 vector.segment(inv_ranges[i].start, inv_ranges[i].size) =
116 bigvector.segment(ranges[i].start, ranges[i].size);
117 }
118 return vector;
119}
120
122 Index index = 0;
123 aoranges = std::vector<GridboxRange>(0);
124 ranges = std::vector<GridboxRange>(0);
125 inv_ranges = std::vector<GridboxRange>(0);
126 std::vector<Index> start;
127 std::vector<Index> end;
128
129 for (const auto shell : significant_shells) {
130 GridboxRange temp;
131 temp.size = shell->getNumFunc();
132 temp.start = index;
133 aoranges.push_back(temp);
134 index += shell->getNumFunc();
135 start.push_back(shell->getStartIndex());
136 end.push_back(shell->getStartIndex() + shell->getNumFunc());
137 }
138 std::vector<Index> startindex;
139 std::vector<Index> endindex;
140
141 if (start.size() > 1) {
142 startindex.push_back(start[0]);
143
144 for (Index i = 0; i < Index(start.size()) - 1; ++i) {
145
146 if (end[i] != start[i + 1]) {
147 startindex.push_back(start[i + 1]);
148 endindex.push_back(end[i]);
149 }
150 }
151 endindex.push_back(end[end.size() - 1]);
152 } else {
153 startindex = start;
154 endindex = end;
155 }
156 Index shellstart = 0;
157 for (Index i = 0; i < Index(startindex.size()); ++i) {
158 Index size = endindex[i] - startindex[i];
159 GridboxRange temp;
160 temp.size = size;
161 temp.start = startindex[i];
162 ranges.push_back(temp);
163 GridboxRange temp2;
164 temp2.size = size;
165 temp2.start = shellstart;
166 inv_ranges.push_back(temp2);
167 shellstart += size;
168 }
169 return;
170}
171
172} // namespace xtp
173} // namespace votca
Container to hold Basisfunctions for all atoms.
Definition aobasis.h:42
void PrepareForIntegration()
Definition gridbox.cc:121
Eigen::MatrixXd ReadFromBigMatrix(const Eigen::MatrixXd &bigmatrix) const
Definition gridbox.cc:97
void AddtoBigMatrix(Eigen::MatrixXd &bigmatrix, const Eigen::MatrixXd &smallmatrix) const
Definition gridbox.cc:84
void addShell(const AOShell *shell)
Definition gridbox.h:95
std::vector< GridboxRange > inv_ranges
Definition gridbox.h:128
std::vector< const AOShell * > significant_shells
Definition gridbox.h:130
AOShell::AOValuesHessian CalcAOValuesHessian(const Eigen::Vector3d &point) const
Definition gridbox.cc:68
std::vector< Eigen::Vector3d > grid_pos
Definition gridbox.h:129
Eigen::VectorXd ReadFromBigVector(const Eigen::VectorXd &bigvector) const
Definition gridbox.cc:111
AOShell::AOValues CalcAOValues(const Eigen::Vector3d &point) const
Definition gridbox.cc:44
Index size() const
Definition gridbox.h:71
std::vector< GridboxRange > aoranges
Definition gridbox.h:126
Index Matrixsize() const
Definition gridbox.h:75
std::vector< GridboxRange > ranges
Definition gridbox.h:127
void FindSignificantShells(const AOBasis &basis)
Definition gridbox.cc:27
Index Shellsize() const
Definition gridbox.h:73
Charge transport classes.
Definition ERIs.h:28
Provides a means for comparing floating point numbers.
Definition basebead.h:33
Eigen::Index Index
Definition types.h:26
std::vector< Eigen::Matrix3d > hessians
Definition aoshell.h:180
Eigen::MatrixX3d derivatives
Definition aoshell.h:131