ERKALE
ERKALE - DFT from Hel
 All Classes Functions Variables Friends Pages
localization.h
1 /*
2  * This source code is part of
3  *
4  * E R K A L E
5  * -
6  * DFT from Hel
7  *
8  * Written by Susi Lehtola, 2010-2011
9  * Copyright (c) 2010-2011, Susi Lehtola
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  */
16 
17 
18 
19 #ifndef ERKALE_LOCALIZATION
20 #define ERKALE_LOCALIZATION
21 
22 #include "basis.h"
23 #include "scf.h"
24 #include "unitary.h"
25 #include "hirshfeld.h"
26 #include "badergrid.h"
27 
29 enum locmet {
31  BOYS,
33  BOYS_2,
35  BOYS_3,
37  BOYS_4,
39  FM_1,
41  FM_2,
43  FM_3,
45  FM_4,
47  PIPEK_MULLIKENH,
49  PIPEK_MULLIKEN2,
51  PIPEK_MULLIKEN4,
53  PIPEK_LOWDINH,
55  PIPEK_LOWDIN2,
57  PIPEK_LOWDIN4,
59  PIPEK_BADERH,
61  PIPEK_BADER2,
63  PIPEK_BADER4,
65  PIPEK_BECKEH,
67  PIPEK_BECKE2,
69  PIPEK_BECKE4,
71  PIPEK_HIRSHFELDH,
73  PIPEK_HIRSHFELD2,
75  PIPEK_HIRSHFELD4,
77  PIPEK_ITERHIRSHH,
79  PIPEK_ITERHIRSH2,
81  PIPEK_ITERHIRSH4,
83  PIPEK_IAOH,
85  PIPEK_IAO2,
87  PIPEK_IAO4,
89  PIPEK_STOCKHOLDERH,
91  PIPEK_STOCKHOLDER2,
93  PIPEK_STOCKHOLDER4,
95  PIPEK_VORONOIH,
97  PIPEK_VORONOI2,
99  PIPEK_VORONOI4,
101  EDMISTON
102 };
103 
105 enum locmet parse_locmet(const std::string & met);
106 
108 enum chgmet {
110  MULLIKEN,
112  LOWDIN,
114  BADER,
116  BECKE,
118  HIRSHFELD,
120  ITERHIRSH,
122  IAO,
124  STOCKHOLDER,
126  VORONOI
127 };
128 
130 class Boys : public UnitaryFunction {
132  int n;
133 
135  arma::mat rsq;
137  arma::mat rx;
139  arma::mat ry;
141  arma::mat rz;
142 
143  public:
145  Boys(const BasisSet & basis, const arma::mat & C, int n, bool verbose=true, bool delocalize=false);
147  ~Boys();
149  Boys * copy() const;
150 
152  void set_n(int n);
153 
155  double cost_func(const arma::cx_mat & W);
157  arma::cx_mat cost_der(const arma::cx_mat & W);
159  void cost_func_der(const arma::cx_mat & W, double & f, arma::cx_mat & der);
160 };
161 
163 class FMLoc : public UnitaryFunction {
165  int n;
166 
168  arma::mat rfour;
170  std::vector<arma::mat> rrsq;
172  std::vector< std::vector<arma::mat> > rr;
174  arma::mat rsq;
176  std::vector<arma::mat> rmat;
177 
178  public:
180  FMLoc(const BasisSet & basis, const arma::mat & C, int n, bool verbose=true, bool delocalize=false);
182  ~FMLoc();
184  FMLoc * copy() const;
185 
187  void set_n(int n);
188 
190  double cost_func(const arma::cx_mat & W);
192  arma::cx_mat cost_der(const arma::cx_mat & W);
194  void cost_func_der(const arma::cx_mat & W, double & f, arma::cx_mat & der);
195 };
196 
200 #define PIPEK_FILEMODE arma::arma_binary
201 
203 class Pipek : public UnitaryFunction {
204  // The localization is based on partial charches on atoms, so the
205  // memory requirement would be Nat * Nocc^2, limiting the routine to
206  // small systems. Instead, we calculate everything on-the-fly, so
207  // the memory requirement is only Nocc^2
208 
210  enum chgmet chg;
212  size_t N;
213 
215  double p;
216 
218  arma::mat C;
220  arma::mat S;
222  arma::mat Sh;
224  std::vector< std::vector<GaussianShell> > shells;
225 
227  arma::mat C_iao;
229  std::vector< std::vector<size_t> > idx_iao;
230 
232  arma::mat get_charge(size_t i);
233 
234  public:
236  Pipek(enum chgmet chg, const BasisSet & basis, const arma::mat & C, const arma::mat & P, double p=2.0, bool verbose=true, bool delocalize=false);
238  ~Pipek();
240  Pipek * copy() const;
241 
243  void cleanup_disk();
244 
246  double cost_func(const arma::cx_mat & W);
248  arma::cx_mat cost_der(const arma::cx_mat & W);
250  void cost_func_der(const arma::cx_mat & W, double & f, arma::cx_mat & der);
251 };
252 
254 class Edmiston : public UnitaryFunction {
259 
261  bool use_chol;
262 
264  arma::mat C;
266  std::vector<arma::mat> Jorb;
267 
268  public:
270  Edmiston(const BasisSet & basis, const BasisSet & fitbas, const arma::mat & C, bool delocalize=false);
272  Edmiston(const BasisSet & basis, const arma::mat & C, bool delocalize=false, double thr=1e-5);
274  ~Edmiston();
276  Edmiston * copy() const;
278  void setW(const arma::cx_mat & W);
279 
281  double cost_func(const arma::cx_mat & W);
283  arma::cx_mat cost_der(const arma::cx_mat & W);
285  void cost_func_der(const arma::cx_mat & W, double & f, arma::cx_mat & der);
286 };
287 
289 void analyze_orbitals(const BasisSet & basis, const arma::cx_mat & C);
290 
292 double analyze_orbital(const arma::mat & S, const arma::cx_vec & C);
293 
295 void orbital_localization(enum locmet method, const BasisSet & basis, const arma::mat & C, const arma::mat & P, double & measure, arma::cx_mat & U, bool verbose=true, bool real=true, int maxiter=50000, double Gthr=1e-6, double Fthr=1e-7, enum unitmethod met=POLY_DF, enum unitacc acc=CGPR, bool delocalize=false, std::string logfile="", bool debug=false);
296 
297 #endif
arma::mat ry
r_y matrix
Definition: localization.h:139
int n
Penalty.
Definition: localization.h:132
bool use_chol
Use Cholesky?
Definition: localization.h:261
Boys * copy() const
Copy.
Definition: localization.cpp:464
double p
Penalty exponent, p=2 for conventional Pipek-Mezey.
Definition: localization.h:215
FMLoc(const BasisSet &basis, const arma::mat &C, int n, bool verbose=true, bool delocalize=false)
Constructor. n gives the penalty power to use.
Definition: localization.cpp:576
arma::cx_mat cost_der(const arma::cx_mat &W)
Evaluate derivative of cost function.
Definition: localization.cpp:739
Density fitting routines.
Definition: density_fitting.h:56
arma::cx_mat cost_der(const arma::cx_mat &W)
Evaluate derivative of cost function.
Definition: localization.cpp:1136
Edmiston * copy() const
Copy.
Definition: localization.cpp:1276
Cholesky decomposition of ERIs.
Definition: erichol.h:26
arma::cx_mat cost_der(const arma::cx_mat &W)
Evaluate derivative of cost function.
Definition: localization.cpp:522
DensityFit dfit
Density fitting object.
Definition: localization.h:256
Unitary function optimizer, used to hold values during the optimization.
Definition: unitary.h:62
void cost_func_der(const arma::cx_mat &W, double &f, arma::cx_mat &der)
Evaluate cost function and its derivative.
Definition: localization.cpp:570
std::vector< std::vector< size_t > > idx_iao
Indices of centers for IAO localization.
Definition: localization.h:229
Pipek * copy() const
Copy.
Definition: localization.cpp:1031
std::vector< arma::mat > Jorb
Orbital Coulomb matrices.
Definition: localization.h:266
Boys(const BasisSet &basis, const arma::mat &C, int n, bool verbose=true, bool delocalize=false)
Constructor. n gives the penalty power to use.
Definition: localization.cpp:432
arma::mat S
Overlap matrix for Mulliken.
Definition: localization.h:220
void set_n(int n)
Reset penalty.
Definition: localization.cpp:468
~Pipek()
Destructor.
Definition: localization.cpp:1028
arma::mat rsq
and the r^2 matrix
Definition: localization.h:174
std::vector< arma::mat > rrsq
rr^2 matrices
Definition: localization.h:170
Boys localization.
Definition: localization.h:130
enum chgmet chg
Method.
Definition: localization.h:210
~Edmiston()
Destructor.
Definition: localization.cpp:1273
std::vector< std::vector< GaussianShell > > shells
Shell list for Löwdin and Mulliken.
Definition: localization.h:224
arma::mat rx
r_x matrix
Definition: localization.h:137
void set_n(int n)
Reset penalty.
Definition: localization.cpp:656
Edmiston(const BasisSet &basis, const BasisSet &fitbas, const arma::mat &C, bool delocalize=false)
Constructor: density fitting.
Definition: localization.cpp:1250
Fourth moment localization.
Definition: localization.h:163
ERIchol chol
ERI Cholesky.
Definition: localization.h:258
Edmiston-Ruedenberg localization.
Definition: localization.h:254
double cost_func(const arma::cx_mat &W)
Evaluate cost function.
Definition: localization.cpp:476
void cost_func_der(const arma::cx_mat &W, double &f, arma::cx_mat &der)
Evaluate cost function and its derivative.
Definition: localization.cpp:1192
Basis set.
Definition: basis.h:187
arma::mat rz
r_z matrix
Definition: localization.h:141
arma::mat Sh
Half-overlap matrix for Löwdin.
Definition: localization.h:222
arma::mat get_charge(size_t i)
Get the charge matrix for the i:th region.
Definition: localization.cpp:1043
void cleanup_disk()
Clean up files on disk.
Definition: localization.cpp:1035
~FMLoc()
Destructor.
Definition: localization.cpp:649
Pipek-Mezey localization.
Definition: localization.h:203
std::vector< arma::mat > rmat
r matrices
Definition: localization.h:176
void cost_func_der(const arma::cx_mat &W, double &f, arma::cx_mat &der)
Evaluate cost function and its derivative.
Definition: localization.cpp:845
Pipek(enum chgmet chg, const BasisSet &basis, const arma::mat &C, const arma::mat &P, double p=2.0, bool verbose=true, bool delocalize=false)
Constructor.
Definition: localization.cpp:856
size_t N
Amount of charges.
Definition: localization.h:212
std::vector< std::vector< arma::mat > > rr
rr matrices
Definition: localization.h:172
arma::mat C_iao
Free-atom AOs for IAO localization.
Definition: localization.h:227
FMLoc * copy() const
Copy.
Definition: localization.cpp:652
arma::mat C
Orbitals.
Definition: localization.h:218
arma::mat rfour
r^4 contributions
Definition: localization.h:168
int n
Penalty.
Definition: localization.h:165
double cost_func(const arma::cx_mat &W)
Evaluate cost function.
Definition: localization.cpp:663
~Boys()
Destructor.
Definition: localization.cpp:461
double cost_func(const arma::cx_mat &W)
Evaluate cost function.
Definition: localization.cpp:1286
arma::cx_mat W
Present matrix.
Definition: unitary.h:65
arma::mat rsq
R^2 matrix.
Definition: localization.h:135
arma::cx_mat cost_der(const arma::cx_mat &W)
Evaluate derivative of cost function.
Definition: localization.cpp:1292
double f
Present value.
Definition: unitary.h:67
void setW(const arma::cx_mat &W)
Set transformation matrix.
Definition: localization.cpp:1280
void cost_func_der(const arma::cx_mat &W, double &f, arma::cx_mat &der)
Evaluate cost function and its derivative.
Definition: localization.cpp:1298
arma::mat C
Orbitals.
Definition: localization.h:264
double cost_func(const arma::cx_mat &W)
Evaluate cost function.
Definition: localization.cpp:1102