votca 2024.2-dev
Loading...
Searching...
No Matches
pmlocalization.h
Go to the documentation of this file.
1/*
2 * Copyright 2009-2022 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#pragma once
21#ifndef VOTCA_XTP_PMLOCALIZATION_H
22#define VOTCA_XTP_PMLOCALIZATION_H
23#include "logger.h"
25#include "votca/xtp/orbitals.h"
26
27namespace votca {
28namespace xtp {
29
31 public:
32 PMLocalization(Logger &log, const tools::Property &options) : log_(log) {
33 nrOfIterations_ = options.get(".max_iterations").as<Index>();
34 convergence_limit_ = options.get(".convergence_limit").as<double>();
35 method_ = options.get(".method").as<std::string>();
36 };
37 void computePML(Orbitals &orbitals);
38 void computePML_UT(Orbitals &orbitals);
39 void computePML_JS(Orbitals &orbitals);
40
41 private:
43
44 std::string method_;
45
46 // functions for unitary optimizer
47 double cost(const Eigen::MatrixXd &W,
48 const std::vector<Eigen::MatrixXd> &Sat_all,
49 const Index nat) const;
50 std::pair<double, Eigen::MatrixXd> cost_derivative(
51 const Eigen::MatrixXd &W, const std::vector<Eigen::MatrixXd> &Sat_all,
52 const Index nat) const;
53
54 Eigen::VectorXd fit_polynomial(const Eigen::VectorXd &x,
55 const Eigen::VectorXd &y) const;
56 Eigen::VectorXcd find_complex_roots(const Eigen::VectorXcd &coeff) const;
57 double find_smallest_step(const Eigen::VectorXd &coeff) const;
58 Eigen::MatrixXcd companion_matrix(const Eigen::VectorXcd &coeff) const;
59 Eigen::MatrixXd rotate_W(const double step, const Eigen::MatrixXd &W,
60 const Eigen::VectorXcd &eval,
61 const Eigen::MatrixXcd &evec) const;
62
63 std::vector<Eigen::MatrixXd> setup_pop_matrices(
64 const Eigen::MatrixXd &occ_orbitals);
65
66 double inner_prod(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B) const {
67 return (0.5 * A.transpose() * B).trace();
68 }
69
70 // functions for Jacobi sweeps
71 Eigen::MatrixX2d rotateorbitals(const Eigen::MatrixX2d &maxorbs, Index s,
72 Index t);
73
74 void initial_penalty();
75 void update_penalty(Index s, Index t);
77 Eigen::VectorXd calculate_lmo_energies(const Orbitals &orbitals);
78 std::pair<Eigen::MatrixXd, Eigen::VectorXd> sort_lmos(
79 const Eigen::VectorXd &energies);
80
81 Eigen::VectorXd pop_per_atom(const Eigen::VectorXd &orbital);
82 Eigen::Vector2d offdiag_penalty_elements(const Eigen::MatrixXd &s_overlap,
83 Index s, Index t);
84
85 Eigen::MatrixXd localized_orbitals_;
86
88 Eigen::MatrixXd overlap_;
90
91 // variables for Jacobi sweeps
92 Eigen::MatrixXd A_;
93 Eigen::MatrixXd B_;
94 Eigen::MatrixXd PM_penalty_;
96
97 // variables for unitary optimization
98 Eigen::MatrixXd W_;
99 Eigen::MatrixXd W_old_;
100 Eigen::MatrixXd H_;
101 Eigen::MatrixXd H_old_;
102 Eigen::MatrixXd G_;
103 Eigen::MatrixXd G_old_;
104 double J_;
105 double J_old_;
106 double J_threshold_ = 1e-8;
107 double G_threshold_ = 1e-5;
108
109 std::vector<Index> numfuncpatom_;
110
112 double convergence_limit_ = 0.0;
113};
114
115} // namespace xtp
116} // namespace votca
117#endif
class to manage program options with xml serialization functionality
Definition property.h:55
Property & get(const std::string &key)
get existing property
Definition property.cc:79
Container to hold Basisfunctions for all atoms.
Definition aobasis.h:42
Logger is used for thread-safe output of messages.
Definition logger.h:164
container for molecular orbitals
Definition orbitals.h:46
Eigen::VectorXcd find_complex_roots(const Eigen::VectorXcd &coeff) const
double inner_prod(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B) const
Eigen::MatrixXd MullikenPop_orb_per_atom_
void computePML(Orbitals &orbitals)
Eigen::VectorXd calculate_lmo_energies(const Orbitals &orbitals)
void computePML_UT(Orbitals &orbitals)
Eigen::Vector2d offdiag_penalty_elements(const Eigen::MatrixXd &s_overlap, Index s, Index t)
std::pair< Eigen::MatrixXd, Eigen::VectorXd > sort_lmos(const Eigen::VectorXd &energies)
void update_penalty(Index s, Index t)
double find_smallest_step(const Eigen::VectorXd &coeff) const
void computePML_JS(Orbitals &orbitals)
Eigen::MatrixXcd companion_matrix(const Eigen::VectorXcd &coeff) const
Eigen::VectorXd fit_polynomial(const Eigen::VectorXd &x, const Eigen::VectorXd &y) const
PMLocalization(Logger &log, const tools::Property &options)
Eigen::MatrixX2d rotateorbitals(const Eigen::MatrixX2d &maxorbs, Index s, Index t)
Eigen::MatrixXd localized_orbitals_
std::vector< Eigen::MatrixXd > setup_pop_matrices(const Eigen::MatrixXd &occ_orbitals)
Eigen::VectorXd pop_per_atom(const Eigen::VectorXd &orbital)
std::vector< Index > numfuncpatom_
std::pair< double, Eigen::MatrixXd > cost_derivative(const Eigen::MatrixXd &W, const std::vector< Eigen::MatrixXd > &Sat_all, const Index nat) const
Eigen::MatrixXd rotate_W(const double step, const Eigen::MatrixXd &W, const Eigen::VectorXcd &eval, const Eigen::MatrixXcd &evec) const
double cost(const Eigen::MatrixXd &W, const std::vector< Eigen::MatrixXd > &Sat_all, const Index nat) const
base class for all analysis tools
Definition basebead.h:33
Eigen::Index Index
Definition types.h:26