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
56 const Eigen::Vector3d& point) const {
58 for (Index j = 0; j < Shellsize(); ++j) {
59 const AOShell::AOValuesHessian val =
60 significant_shells[j]->EvalAOspaceHessian(point);
61 result.derivatives.middleRows(aoranges[j].start, aoranges[j].size) =
62 val.derivatives;
63 result.values.segment(aoranges[j].start, aoranges[j].size) = val.values;
64 for (Index k = 0; k < aoranges[j].size; ++k) {
65 result.hessians[aoranges[j].start + k] = val.hessians[k];
66 }
67 }
68 return result;
69}
70
71void GridBox::AddtoBigMatrix(Eigen::MatrixXd& bigmatrix,
72 const Eigen::MatrixXd& smallmatrix) const {
73 for (Index i = 0; i < Index(ranges.size()); i++) {
74 for (Index j = 0; j < Index(ranges.size()); j++) {
75 bigmatrix.block(ranges[i].start, ranges[j].start, ranges[i].size,
76 ranges[j].size) +=
77 smallmatrix.block(inv_ranges[i].start, inv_ranges[j].start,
79 }
80 }
81 return;
82}
83
85 const Eigen::MatrixXd& bigmatrix) const {
86 Eigen::MatrixXd matrix = Eigen::MatrixXd(matrix_size, matrix_size);
87 for (Index i = 0; i < Index(ranges.size()); i++) {
88 for (Index j = 0; j < Index(ranges.size()); j++) {
89 matrix.block(inv_ranges[i].start, inv_ranges[j].start, inv_ranges[i].size,
90 inv_ranges[j].size) =
91 bigmatrix.block(ranges[i].start, ranges[j].start, ranges[i].size,
92 ranges[j].size);
93 }
94 }
95 return matrix;
96}
97
99 const Eigen::VectorXd& bigvector) const {
100 Eigen::VectorXd vector = Eigen::VectorXd(matrix_size);
101 for (Index i = 0; i < Index(ranges.size()); i++) {
102 vector.segment(inv_ranges[i].start, inv_ranges[i].size) =
103 bigvector.segment(ranges[i].start, ranges[i].size);
104 }
105 return vector;
106}
107
109 Index index = 0;
110 aoranges = std::vector<GridboxRange>(0);
111 ranges = std::vector<GridboxRange>(0);
112 inv_ranges = std::vector<GridboxRange>(0);
113 std::vector<Index> start;
114 std::vector<Index> end;
115
116 for (const auto shell : significant_shells) {
117 GridboxRange temp;
118 temp.size = shell->getNumFunc();
119 temp.start = index;
120 aoranges.push_back(temp);
121 index += shell->getNumFunc();
122 start.push_back(shell->getStartIndex());
123 end.push_back(shell->getStartIndex() + shell->getNumFunc());
124 }
125 std::vector<Index> startindex;
126 std::vector<Index> endindex;
127
128 if (start.size() > 1) {
129 startindex.push_back(start[0]);
130
131 for (Index i = 0; i < Index(start.size()) - 1; ++i) {
132
133 if (end[i] != start[i + 1]) {
134 startindex.push_back(start[i + 1]);
135 endindex.push_back(end[i]);
136 }
137 }
138 endindex.push_back(end[end.size() - 1]);
139 } else {
140 startindex = start;
141 endindex = end;
142 }
143 Index shellstart = 0;
144 for (Index i = 0; i < Index(startindex.size()); ++i) {
145 Index size = endindex[i] - startindex[i];
146 GridboxRange temp;
147 temp.size = size;
148 temp.start = startindex[i];
149 ranges.push_back(temp);
150 GridboxRange temp2;
151 temp2.size = size;
152 temp2.start = shellstart;
153 inv_ranges.push_back(temp2);
154 shellstart += size;
155 }
156 return;
157}
158
159} // namespace xtp
160} // namespace votca
Container to hold Basisfunctions for all atoms.
Definition aobasis.h:42
void PrepareForIntegration()
Definition gridbox.cc:108
Eigen::MatrixXd ReadFromBigMatrix(const Eigen::MatrixXd &bigmatrix) const
Definition gridbox.cc:84
void AddtoBigMatrix(Eigen::MatrixXd &bigmatrix, const Eigen::MatrixXd &smallmatrix) const
Definition gridbox.cc:71
void addShell(const AOShell *shell)
Definition gridbox.h:80
std::vector< GridboxRange > inv_ranges
Definition gridbox.h:113
std::vector< const AOShell * > significant_shells
Definition gridbox.h:115
AOShell::AOValuesHessian CalcAOValuesHessian(const Eigen::Vector3d &point) const
Definition gridbox.cc:55
std::vector< Eigen::Vector3d > grid_pos
Definition gridbox.h:114
Eigen::VectorXd ReadFromBigVector(const Eigen::VectorXd &bigvector) const
Definition gridbox.cc:98
AOShell::AOValues CalcAOValues(const Eigen::Vector3d &point) const
Definition gridbox.cc:44
Index size() const
Definition gridbox.h:60
std::vector< GridboxRange > aoranges
Definition gridbox.h:111
Index Matrixsize() const
Definition gridbox.h:64
std::vector< GridboxRange > ranges
Definition gridbox.h:112
void FindSignificantShells(const AOBasis &basis)
Definition gridbox.cc:27
Index Shellsize() const
Definition gridbox.h:62
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:169
Eigen::MatrixX3d derivatives
Definition aoshell.h:131