ergo
|
00001 /* Ergo, version 3.2, a program for linear scaling electronic structure 00002 * calculations. 00003 * Copyright (C) 2012 Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek. 00004 * 00005 * This program is free software: you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License as published by 00007 * the Free Software Foundation, either version 3 of the License, or 00008 * (at your option) any later version. 00009 * 00010 * This program is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 * GNU General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU General Public License 00016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00017 * 00018 * Primary academic reference: 00019 * KohnâSham Density Functional Theory Electronic Structure Calculations 00020 * with Linearly Scaling Computational Time and Memory Usage, 00021 * Elias Rudberg, Emanuel H. Rubensson, and Pawel Salek, 00022 * J. Chem. Theory Comput. 7, 340 (2011), 00023 * <http://dx.doi.org/10.1021/ct100611z> 00024 * 00025 * For further information about Ergo, see <http://www.ergoscf.org>. 00026 */ 00027 00028 #ifndef SCF_UNRESTRICTED_HEADER 00029 #define SCF_UNRESTRICTED_HEADER 00030 00031 #include "SCF_general.h" 00032 00033 00034 class SCF_unrestricted : public SCF_general 00035 { 00036 public: 00037 00038 // Constructor 00039 SCF_unrestricted(const Molecule& molecule_, 00040 const Molecule& extraCharges_, 00041 const BasisInfoStruct & basisInfo_, 00042 const BasisInfoStruct & basisInfoDensFit_, 00043 const IntegralInfo & integralInfo_, 00044 const char* guessDmatFileName_, 00045 const JK::Params& J_K_params_, 00046 const Dft::GridParams& gridParams_, 00047 const SCF::Options& scfopts, 00048 const SCF::MatOptions& matOpts, 00049 ergo_real threshold_integrals_1el_input, 00050 int alpha_beta_diff_input); 00051 00052 // Destructor 00053 ~SCF_unrestricted(); 00054 00055 void get_Fock_matrices(symmMatrix & FockMatrix_a, symmMatrix & FockMatrix_b); 00056 void get_no_of_electrons(int & noOfElectrons_a, int & noOfElectrons_b); 00057 00058 private: 00059 void initialize_matrices(); 00060 void check_params(); 00061 void get_starting_guess_density(); 00062 void initialize_homo_lumo_limits(); 00063 void write_matrices_to_file(); 00064 void get_2e_part_and_energy(); 00065 void output_sparsity_S_F_D(SCF_statistics & stats); 00066 void calculate_energy(); 00067 void get_FDSminusSDF(); 00068 void get_error_measure(); 00069 void add_to_DIIS_list(); 00070 void update_best_fock_so_far(); 00071 void combine_old_fock_matrices(ergo_real stepLength); 00072 void use_diis_to_get_new_fock_matrix(); 00073 void clear_diis_list(); 00074 void clear_error_matrices(); 00075 void save_current_fock_as_fprev(); 00076 void get_new_density_matrix(); 00077 void write_density_to_file(); 00078 void save_final_potential(); 00079 void add_random_disturbance_to_starting_guess(); 00080 void output_density_images(); 00081 void output_csr_matrices_for_gao(); 00082 void do_electron_dynamics(); 00083 void write_diag_dens_to_file(); 00084 void report_final_results(); 00085 void save_density_as_prevdens(); 00086 void update_subspace_diff(); 00087 void disturb_fock_matrix(ergo_real subspaceError); 00088 void disturb_dens_matrix(ergo_real subspaceError); 00089 void do_spin_flip(int atomCount); 00090 void disturb_dens_matrix_exact(ergo_real subspaceError); 00091 void save_full_matrices_for_matlab(); 00092 void report_density_difference(); 00093 void create_mtx_files_F(int const scfIter); 00094 void create_mtx_files_D(int const scfIter); 00095 void create_homo_eigvec_file() const; 00096 void create_lumo_eigvec_file() const; 00097 void create_gabedit_file() const; 00098 void compute_dipole_moment(); 00099 void do_mulliken_pop_stuff(); 00100 00101 void get_S2(ergo_real & S2_exact, ergo_real & S2); 00102 00103 symmMatrix densityMatrix_alpha; 00104 symmMatrix densityMatrix_beta; 00105 symmMatrix FockMatrix_alpha; 00106 symmMatrix FockMatrix_beta; 00107 symmMatrix Fprev_alpha; 00108 symmMatrix Fprev_beta; 00109 symmMatrix Dprev_alpha; 00110 symmMatrix Dprev_beta; 00111 symmMatrix F_ort_prev_alpha; // Used by purification 00112 symmMatrix F_ort_prev_beta; // Used by purification 00113 symmMatrix bestFockMatrixSoFar_alpha; 00114 symmMatrix bestFockMatrixSoFar_beta; 00115 symmMatrix bestFockMatrixSoFar2_alpha; 00116 symmMatrix bestFockMatrixSoFar2_beta; 00117 normalMatrix ErrorMatrix_alpha; 00118 normalMatrix ErrorMatrix_beta; 00119 symmMatrix G_alpha; 00120 symmMatrix G_beta; 00121 00122 // HOMO/LUMO info 00123 intervalType homoInterval_F_ort_prev_alpha; 00124 intervalType lumoInterval_F_ort_prev_alpha; 00125 intervalType homoInterval_F_ort_prev_beta; 00126 intervalType lumoInterval_F_ort_prev_beta; 00127 intervalType homoInterval_Fprev_alpha; 00128 intervalType lumoInterval_Fprev_alpha; 00129 intervalType homoInterval_Fprev_beta; 00130 intervalType lumoInterval_Fprev_beta; 00131 00132 int alpha_beta_diff; 00133 int noOfElectrons_alpha; 00134 int noOfElectrons_beta; 00135 }; 00136 00137 00138 00139 00140 00141 #endif