ERKALE
ERKALE - DFT from Hel
 All Classes Functions Variables Friends Pages
diis.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 #ifndef ERKALE_DIIS
19 #define ERKALE_DIIS
20 
21 #include "global.h"
22 #include <armadillo>
23 #include <vector>
24 
26 typedef struct {
28  arma::mat Pa;
30  arma::mat Fa;
32  arma::mat Pb;
34  arma::mat Fb;
36  double E;
37 
39  arma::vec err;
41 
43 typedef struct {
45  arma::mat P;
47  arma::mat F;
49  double E;
50 
52  arma::vec err;
54 
56 bool operator<(const diis_pol_entry_t & lhs, const diis_pol_entry_t & rhs);
58 bool operator<(const diis_unpol_entry_t & lhs, const diis_unpol_entry_t & rhs);
59 
95 class DIIS {
96  protected:
98  arma::mat S;
100  arma::mat Sinvh;
101 
103  bool usediis;
105  bool c1diis;
107  bool useadiis;
109  bool verbose;
110 
112  double diiseps;
114  double diisthr;
116  int cooloff;
117 
119  size_t imax;
121  virtual arma::vec get_energies() const=0;
123  virtual arma::mat get_diis_error() const=0;
125  virtual void erase_last()=0;
126 
127  // Helpers for speeding up ADIIS evaluation
129  arma::vec PiF;
131  arma::mat PiFj;
132 
134  arma::vec get_w();
136  arma::vec get_w_diis() const;
138  arma::vec get_w_diis_wrk(const arma::mat & err) const;
140  arma::vec get_w_adiis() const;
141 
143  arma::vec get_c_adiis(bool verbose=false) const;
144 
145  public:
147  DIIS(const arma::mat & S, const arma::mat & Sinvh, bool usediis, bool c1diis, double diiseps, double diisthr, bool useadiis, bool verbose, size_t imax);
149  virtual ~DIIS();
150 
152  virtual void clear()=0;
153 
155  double get_E_adiis(const arma::vec & x) const;
157  arma::vec get_dEdx_adiis(const arma::vec & x) const;
158 };
159 
161 class rDIIS: protected DIIS {
163  std::vector<diis_unpol_entry_t> stack;
164 
166  arma::vec get_energies() const;
168  arma::mat get_diis_error() const;
170  void erase_last();
172  void PiF_update();
173 
174  public:
176  rDIIS(const arma::mat & S, const arma::mat & Sinvh, bool usediis, bool c1diis, double diiseps, double diisthr, bool useadiis, bool verbose, size_t imax);
178  ~rDIIS();
179 
181  void update(const arma::mat & F, const arma::mat & P, double E, double & error);
182 
184  void solve_F(arma::mat & F);
185 
187  void solve_P(arma::mat & P);
188 
190  void clear();
191 };
192 
194 class uDIIS: protected DIIS {
196  std::vector<diis_pol_entry_t> stack;
197 
199  arma::vec get_energies() const;
201  arma::mat get_diis_error() const;
203  void erase_last();
205  void PiF_update();
206 
207  public:
209  uDIIS(const arma::mat & S, const arma::mat & Sinvh, bool usediis, bool c1diis, double diiseps, double diisthr, bool useadiis, bool verbose, size_t imax);
211  ~uDIIS();
212 
214  void update(const arma::mat & Fa, const arma::mat & Fb, const arma::mat & Pa, const arma::mat & Pb, double E, double & error);
215 
217  void solve_F(arma::mat & Fa, arma::mat & Fb);
218 
220  void solve_P(arma::mat & Pa, arma::mat & Pb);
221 
223  void clear();
224 };
225 
226 #endif
arma::mat Fb
Beta Fock matrix.
Definition: diis.h:34
std::vector< diis_unpol_entry_t > stack
Fock matrices in AO basis.
Definition: diis.h:163
bool usediis
Use DIIS?
Definition: diis.h:103
arma::vec get_energies() const
Get energies.
Definition: diis.cpp:193
~rDIIS()
Destructor.
Definition: diis.cpp:66
Spin-unpolarized entry.
Definition: diis.h:43
DIIS(const arma::mat &S, const arma::mat &Sinvh, bool usediis, bool c1diis, double diiseps, double diisthr, bool useadiis, bool verbose, size_t imax)
Constructor.
Definition: diis.cpp:39
bool c1diis
C1-DIIS?
Definition: diis.h:105
void solve_F(arma::mat &Fa, arma::mat &Fb)
Compute new Fock matrix, use C1-DIIS if wanted.
Definition: diis.cpp:409
void erase_last()
Reduce size of stack by one.
Definition: diis.cpp:80
void clear()
Clear Fock matrices and errors.
Definition: diis.cpp:72
size_t imax
Maximum amount of matrices to store.
Definition: diis.h:119
bool verbose
Verbose operation?
Definition: diis.h:109
virtual void clear()=0
Clear Fock matrices and errors.
arma::vec get_dEdx_adiis(const arma::vec &x) const
Compute derivative of energy wrt contraction coefficients.
Definition: diis.cpp:653
void clear()
Clear Fock matrices and errors.
Definition: diis.cpp:76
arma::mat Pa
Alpha density matrix.
Definition: diis.h:28
void update(const arma::mat &Fa, const arma::mat &Fb, const arma::mat &Pa, const arma::mat &Pb, double E, double &error)
Add matrices to stack.
Definition: diis.cpp:131
arma::vec get_w()
Compute weights.
Definition: diis.cpp:206
virtual void erase_last()=0
Reduce size of stack by one.
double E
Energy.
Definition: diis.h:36
arma::vec get_w_diis() const
Compute DIIS weights.
Definition: diis.cpp:267
DIIS - Direct Inversion in the Iterative Subspace and ADIIS.
Definition: diis.h:95
Spin-unrestricted DIIS.
Definition: diis.h:194
double E
Energy.
Definition: diis.h:49
Spin-polarized entry.
Definition: diis.h:26
Spin-restricted DIIS.
Definition: diis.h:161
arma::vec err
DIIS error matrix.
Definition: diis.h:39
arma::vec get_c_adiis(bool verbose=false) const
Solve coefficients.
void solve_F(arma::mat &F)
Compute new Fock matrix, use C1-DIIS if wanted.
Definition: diis.cpp:391
arma::mat P
Density matrix.
Definition: diis.h:45
uDIIS(const arma::mat &S, const arma::mat &Sinvh, bool usediis, bool c1diis, double diiseps, double diisthr, bool useadiis, bool verbose, size_t imax)
Constructor.
Definition: diis.cpp:60
double get_E_adiis(const arma::vec &x) const
Compute energy with contraction coefficients .
Definition: diis.cpp:636
arma::vec get_w_diis_wrk(const arma::mat &err) const
Compute DIIS weights, worker routine.
Definition: diis.cpp:272
rDIIS(const arma::mat &S, const arma::mat &Sinvh, bool usediis, bool c1diis, double diiseps, double diisthr, bool useadiis, bool verbose, size_t imax)
Constructor.
Definition: diis.cpp:57
arma::mat Pb
Beta density matrix.
Definition: diis.h:32
virtual ~DIIS()
Destructor.
Definition: diis.cpp:63
std::vector< diis_pol_entry_t > stack
Fock matrices in AO basis - spin polarized.
Definition: diis.h:196
int cooloff
Counter for not using DIIS.
Definition: diis.h:116
arma::mat F
Fock matrix.
Definition: diis.h:47
~uDIIS()
Destructor.
Definition: diis.cpp:69
virtual arma::mat get_diis_error() const =0
Get errors.
void solve_P(arma::mat &Pa, arma::mat &Pb)
Compute new density matrix, use C1-DIIS if wanted.
Definition: diis.cpp:448
bool useadiis
Use ADIIS?
Definition: diis.h:107
arma::vec err
DIIS error matrix.
Definition: diis.h:52
void PiF_update()
ADIIS update.
Definition: diis.cpp:116
void PiF_update()
ADIIS update.
Definition: diis.cpp:162
double diisthr
When to start using DIIS exclusively.
Definition: diis.h:114
virtual arma::vec get_energies() const =0
Get energies.
void solve_P(arma::mat &P)
Compute new density matrix, use C1-DIIS if wanted.
Definition: diis.cpp:430
double diiseps
When to start using DIIS weights.
Definition: diis.h:112
void erase_last()
Reduce size of stack by one.
Definition: diis.cpp:84
void update(const arma::mat &F, const arma::mat &P, double E, double &error)
Add matrices to stack.
Definition: diis.cpp:88
arma::mat PiFj
&lt; P_i - P_n | F(D_j) - F(D_n) &gt; or &lt; Pa_i - Pa_n | Fa(P_j) - Fa(P_n) &gt; + &lt; Pb_i - Pb_n | Fb(P_j) - Fb...
Definition: diis.h:131
arma::mat Fa
Alpha Fock matrix.
Definition: diis.h:30
arma::mat S
Overlap matrix.
Definition: diis.h:98
arma::mat get_diis_error() const
Get errors.
Definition: diis.cpp:186
arma::vec get_w_adiis() const
Compute ADIIS weights.
Definition: diis.cpp:509
arma::vec get_energies() const
Get energies.
Definition: diis.cpp:179
arma::mat Sinvh
Half-inverse overlap matrix.
Definition: diis.h:100
arma::vec PiF
&lt; P_i - P_n | F(D_n) &gt; or &lt; Pa_i - Pa_n | Fa(P_n) &gt; + &lt; Pb_i - Pb_n | Fb(P_n) &gt;
Definition: diis.h:129
arma::mat get_diis_error() const
Get errors.
Definition: diis.cpp:199