ERKALE
ERKALE - DFT from Hel
 All Classes Functions Variables Friends Pages
pzstability.h
1 /*
2  * This source code is part of
3  *
4  * E R K A L E
5  * -
6  * HF/DFT from Hel
7  *
8  * Copyright © 2015 The Regents of the University of California
9  * All Rights Reserved
10  *
11  * Written by Susi Lehtola, Lawrence Berkeley National Laboratory
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  */
18 
19 #ifndef ERKALE_PZSTAB
20 #define ERKALE_PZSTAB
21 
22 #include "scf.h"
23 #include "dftgrid.h"
24 class Timer;
25 
26 class FDHessian {
27  protected:
29  bool verbose;
31  double ss_fd;
33  double ss_ls;
34 
36  virtual void print_status(size_t iiter, const arma::vec & g, const Timer & t) const;
37 
38  public:
40  FDHessian(bool verbose=true);
42  virtual ~FDHessian();
43 
45  virtual size_t count_params() const=0;
47  virtual double eval(const arma::vec & x)=0;
49  virtual void update(const arma::vec & x);
50 
52  virtual arma::vec gradient();
54  virtual arma::vec gradient(const arma::vec & x);
56  virtual arma::mat hessian();
57 
59  virtual double optimize(size_t maxiter=1000, double gthr=1e-4, bool max=false);
60 };
61 
63 typedef struct {
65  std::string name;
67  arma::uvec idx;
68 } pz_rot_par_t;
69 
71 typedef enum {
73  PZ_SCALE_CONSTANT,
75  PZ_SCALE_DENSITY,
77  PZ_SCALE_KINETIC
78 } pz_scaling_t;
79 
81 class PZStability: public FDHessian {
82  protected:
91 
97  double pzw;
99  pz_scaling_t scale;
101  double scaleexp;
102 
108  arma::vec ref_Eorb, ref_Eorba, ref_Eorbb;
110  std::vector<arma::cx_mat> ref_Forb, ref_Forba, ref_Forbb;
112  arma::vec ref_worb, ref_worba, ref_worbb;
113 
115  bool real;
117  bool imag;
119  bool cancheck;
121  bool oocheck;
122 
124  bool restr;
126  size_t oa, ob;
128  size_t va, vb;
129 
131  double Tmu;
132 
134  size_t count_ov_params(size_t o, size_t v) const;
136  size_t count_oo_params(size_t o) const;
138  size_t count_params(size_t o, size_t v) const;
140  size_t count_params() const;
141 
143  std::vector<pz_rot_par_t> classify() const;
144 
146  arma::cx_mat rotation(const arma::vec & x, bool spin=false) const;
148  arma::cx_mat rotation_pars(const arma::vec & x, bool spin=false) const;
150  arma::cx_mat matexp(const arma::cx_mat & X) const;
151 
153  arma::cx_mat unified_H(const arma::cx_mat & CO, const arma::cx_mat & CV, const std::vector<arma::cx_mat> & Forb, const arma::vec & worb, const arma::cx_mat & H0) const;
154 
156  arma::vec gradient();
158  arma::vec gradient(const arma::vec & x, bool ref);
160  arma::mat hessian();
161 
163  void parallel_transport(arma::vec & gold, const arma::vec & sd, double step) const;
164 
166  void update_step(const arma::vec & g);
168  void diagonalize();
169 
171  arma::vec compute_worb(const arma::cx_mat & C);
173  void scaling_gradient_oo(arma::cx_mat & gOO, const arma::cx_mat & CO, const arma::vec & Eorb);
175  void scaling_gradient_ov(arma::cx_mat & gOV, const arma::cx_mat & CO, const arma::vec & Eorb, const arma::cx_mat & CV);
176 
178  double eval(const arma::vec & x, rscf_t & sol, std::vector<arma::cx_mat> & Forb, arma::vec & Eorb, arma::vec & worb, bool ks, bool fock, bool useref);
180  double eval(const arma::vec & x, uscf_t & sol, std::vector<arma::cx_mat> & Forba, arma::vec & Eorba, arma::vec & worba, std::vector<arma::cx_mat> & Forbb, arma::vec & Eorbb, arma::vec & worbb, bool ks, bool fock, bool useref);
182  double eval(const arma::vec & x);
183 
185  void update(const arma::vec & x);
187  void update_reference(bool sort);
189  void update_grid(bool init);
190 
192  void print_status(size_t iiter, const arma::vec & g, const Timer & t) const;
193 
195  void print_info(const arma::cx_mat & CO, const arma::cx_mat & CV, const std::vector<arma::cx_mat> & Forb, const arma::cx_mat & H0, const arma::vec & Eorb, const arma::vec & worb);
196 
198  arma::cx_mat get_H(const rscf_t & sol) const;
200  arma::cx_mat get_H(const uscf_t & sol, bool spin) const;
201 
203  arma::vec precondition_unified(const arma::vec & g) const;
205  arma::vec precondition_orbital(const arma::vec & g) const;
206 
208  arma::cx_mat get_CO(const rscf_t & sol) const;
209  arma::cx_mat get_CO() const;
211  arma::cx_mat get_CO(bool spin, const uscf_t & sol) const;
212  arma::cx_mat get_CO(bool spin) const;
214  arma::cx_mat get_CV(const rscf_t & sol) const;
215  arma::cx_mat get_CV() const;
217  arma::cx_mat get_CV(bool spin, const uscf_t & sol) const;
218  arma::cx_mat get_CV(bool spin) const;
219 
220  public:
222  PZStability(SCF *solver, bool verbose=true);
224  ~PZStability();
225 
227  void set_method(const dft_t & ovmethod, const dft_t & oomethod, double pzw, pz_scaling_t scale, double scaleexp);
229  void set_params(bool real, bool imag, bool ov, bool oo);
230 
232  void set(const rscf_t & sol);
234  void set(const uscf_t & sol);
235 
237  double get_E();
238 
240  rscf_t get_rsol() const;
242  uscf_t get_usol() const;
243 
245  bool check(bool stability=false, double cutoff=-1e-3, double dEthr=-1e-7);
247  void linesearch(const std::string & fname="pz_ls.dat", int prec=1, int Np=100);
248 
250  void print_info();
251 
253  void perturb(double h=1e-6);
254 
256  virtual double optimize(size_t maxiter=1000, double gthr=1e-4, double nrthr=1e-4, double dEthr=1e-9, int preconditioning=1);
257 };
258 
259 #endif
arma::cx_mat unified_H(const arma::cx_mat &CO, const arma::cx_mat &CV, const std::vector< arma::cx_mat > &Forb, const arma::vec &worb, const arma::cx_mat &H0) const
Construct unified Hamiltonian.
Definition: pzstability.cpp:875
virtual double eval(const arma::vec &x)=0
Evaluate function.
SCF * solverp
SCF solver, used for energy calculations.
Definition: pzstability.h:84
arma::vec precondition_unified(const arma::vec &g) const
Precondition gradient vector with unified Hamiltonian.
Definition: pzstability.cpp:1548
bool oocheck
Check stability of oo block.
Definition: pzstability.h:121
void set(const rscf_t &sol)
Set reference.
Definition: pzstability.cpp:2895
A timer routine.
Definition: timer.h:43
arma::cx_mat get_CO(const rscf_t &sol) const
Get occupied orbitals (restricted)
Definition: pzstability.cpp:1488
arma::vec compute_worb(const arma::cx_mat &C)
Get orbital weights.
Definition: pzstability.cpp:1077
void update_reference(bool sort)
Update reference.
Definition: pzstability.cpp:2550
void print_status(size_t iiter, const arma::vec &g, const Timer &t) const
Print status of optimization.
Definition: pzstability.cpp:3137
DFT settings.
Definition: scf.h:59
virtual ~FDHessian()
Destructor.
Definition: pzstability.cpp:185
arma::vec gradient()
Evaluate analytic gradient.
Definition: pzstability.cpp:1452
bool real
Real part of transformations?
Definition: pzstability.h:115
Classify parameters.
Definition: pzstability.h:63
size_t count_params() const
Count amount of parameters.
Definition: pzstability.cpp:484
virtual size_t count_params() const =0
Get amount of parameters.
FDHessian(bool verbose=true)
Constructor.
Definition: pzstability.cpp:179
void parallel_transport(arma::vec &gold, const arma::vec &sd, double step) const
Parallel transport.
Definition: pzstability.cpp:2316
std::vector< arma::cx_mat > ref_Forb
Reference orbital Fock matrices.
Definition: pzstability.h:110
virtual void update(const arma::vec &x)
Update solution.
Definition: pzstability.cpp:311
void print_info()
Print information.
Definition: pzstability.cpp:963
size_t oa
Amount of occupied orbitals.
Definition: pzstability.h:126
arma::cx_mat get_H(const rscf_t &sol) const
Get the full Fock matrix.
Definition: pzstability.cpp:2529
Unrestricted solver info.
Definition: scf.h:139
uscf_t get_usol() const
Get updated solution.
Definition: pzstability.cpp:2978
void scaling_gradient_ov(arma::cx_mat &gOV, const arma::cx_mat &CO, const arma::vec &Eorb, const arma::cx_mat &CV)
Put in the scaling part of the OV gradient.
Definition: pzstability.cpp:1150
bool check(bool stability=false, double cutoff=-1e-3, double dEthr=-1e-7)
Check stability of solution.
Definition: pzstability.cpp:2982
Definition: pzstability.h:26
arma::vec ref_worb
Reference weighting factors.
Definition: pzstability.h:112
pz_scaling_t scale
or scaling method
Definition: pzstability.h:99
PZStability(SCF *solver, bool verbose=true)
Constructor.
Definition: pzstability.cpp:428
size_t count_ov_params(size_t o, size_t v) const
Count amount of parameters for rotations.
Definition: pzstability.cpp:456
void scaling_gradient_oo(arma::cx_mat &gOO, const arma::cx_mat &CO, const arma::vec &Eorb)
Put in the scaling part of the OO gradient.
Definition: pzstability.cpp:1112
void update_step(const arma::vec &g)
Update step size.
Definition: pzstability.cpp:1028
void perturb(double h=1e-6)
Add in a small random perturbation to the solution.
Definition: pzstability.cpp:1021
Restricted solver info.
Definition: scf.h:110
arma::vec ref_Eorb
Reference self-interaction energies.
Definition: pzstability.h:108
virtual arma::vec gradient()
Evaluate finite difference gradient.
Definition: pzstability.cpp:188
arma::uvec idx
Degrees of freedom in block.
Definition: pzstability.h:67
bool imag
Imaginary part of transformations?
Definition: pzstability.h:117
~PZStability()
Destructor.
Definition: pzstability.cpp:443
double ss_ls
Line search step size.
Definition: pzstability.h:33
double eval(const arma::vec &x, rscf_t &sol, std::vector< arma::cx_mat > &Forb, arma::vec &Eorb, arma::vec &worb, bool ks, bool fock, bool useref)
Evaluate function at x, and possibly orbital Fock matrices.
Definition: pzstability.cpp:1216
size_t va
Amount of virtual orbitals.
Definition: pzstability.h:128
Self-consistent field solver routines.
Definition: scf.h:205
virtual void print_status(size_t iiter, const arma::vec &g, const Timer &t) const
Print optimization status.
Definition: pzstability.cpp:316
void set_params(bool real, bool imag, bool ov, bool oo)
Set parameters. real: real rotations? imag: imaginary rotations? ov: ov rotations? oo: oo rotations?
Definition: pzstability.cpp:2862
dft_t ovmethod
OV method.
Definition: pzstability.h:93
virtual double optimize(size_t maxiter=1000, double gthr=1e-4, bool max=false)
Run optimization.
Definition: pzstability.cpp:321
arma::cx_mat matexp(const arma::cx_mat &X) const
Calculate matrix exponential.
Definition: pzstability.cpp:2789
virtual double optimize(size_t maxiter=1000, double gthr=1e-4, double nrthr=1e-4, double dEthr=1e-9, int preconditioning=1)
Run optimization.
Definition: pzstability.cpp:2056
DFT quadrature grid.
Definition: dftgrid.h:475
uscf_t usol
or unrestricted
Definition: pzstability.h:106
DFTGrid grid
DFT grid.
Definition: pzstability.h:88
arma::vec precondition_orbital(const arma::vec &g) const
Precondition gradient vector with orbital Hamiltonian.
Definition: pzstability.cpp:1672
Basis set.
Definition: basis.h:187
void update_grid(bool init)
Update (adaptive) integration grid. If init=true, initialization is done for a static grid...
Definition: pzstability.cpp:2924
std::string name
Name of the block.
Definition: pzstability.h:65
std::vector< pz_rot_par_t > classify() const
Classify parameters.
Definition: pzstability.cpp:492
bool restr
Spin-restricted?
Definition: pzstability.h:124
virtual arma::mat hessian()
Evaluate finite difference Hessian.
Definition: pzstability.cpp:239
DFTGrid nlgrid
NL grid.
Definition: pzstability.h:90
rscf_t rsol
Reference solution. Spin-restricted.
Definition: pzstability.h:104
arma::cx_mat rotation(const arma::vec &x, bool spin=false) const
Calculate rotation matrix.
Definition: pzstability.cpp:2716
rscf_t get_rsol() const
Get updated solution.
Definition: pzstability.cpp:2974
BasisSet basis
Basis set.
Definition: pzstability.h:86
bool verbose
Verbose operation?
Definition: pzstability.h:29
double pzw
Weight for PZ correction.
Definition: pzstability.h:97
arma::cx_mat rotation_pars(const arma::vec &x, bool spin=false) const
Form rotation parameter matrix.
Definition: pzstability.cpp:2734
void linesearch(const std::string &fname="pz_ls.dat", int prec=1, int Np=100)
Print out a line search.
Definition: pzstability.cpp:3151
void set_method(const dft_t &ovmethod, const dft_t &oomethod, double pzw, pz_scaling_t scale, double scaleexp)
Set method and weight.
Definition: pzstability.cpp:2828
double Tmu
Maximum step size.
Definition: pzstability.h:131
void diagonalize()
Perform quasicanonical diagonalisation.
PZ optimizer and stability analysis.
Definition: pzstability.h:81
double ss_fd
Finite difference derivative step size.
Definition: pzstability.h:31
void update(const arma::vec &x)
Update solution.
Definition: pzstability.cpp:2420
size_t count_oo_params(size_t o) const
Count amount of parameters for rotations.
Definition: pzstability.cpp:446
double get_E()
Evaluate energy.
Definition: pzstability.cpp:2050
dft_t oomethod
OO method.
Definition: pzstability.h:95
arma::cx_mat get_CV(const rscf_t &sol) const
Get virtual orbitals (restricted)
Definition: pzstability.cpp:1516
bool cancheck
Check stability of canonical orbitals?
Definition: pzstability.h:119
arma::mat hessian()
Evaluate semi-analytic Hessian.
Definition: pzstability.cpp:1991
double scaleexp
and scaling exponent
Definition: pzstability.h:101