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_UTILS_HEADER 00029 #define SCF_UTILS_HEADER 00030 00031 #include "molecule.h" 00032 #include "basisinfo.h" 00033 #include "integrals_2el.h" 00034 #include "matrix_typedefs.h" 00035 #include "densityfitting.h" 00036 #include "grid_stream.h" 00037 #include "SCF_statistics.h" 00038 00039 00040 void output_sparsity(int n, const normalMatrix & M, const char* matrixName); 00041 void output_sparsity_symm(int n, const symmMatrix & M, const char* matrixName); 00042 void output_sparsity_triang(int n, const triangMatrix & M, const char* matrixName); 00043 00044 int 00045 compute_h_core_matrix_sparse(const IntegralInfo& integralInfo, 00046 const Molecule& molecule, 00047 const Molecule& extraCharges, 00048 ergo_real electric_field_x, 00049 ergo_real electric_field_y, 00050 ergo_real electric_field_z, 00051 const BasisInfoStruct& basisInfo, 00052 symmMatrix & H_core_Matrix_sparse, 00053 ergo_real threshold_integrals_1el, 00054 int noOfThreadsForV, 00055 mat::SizesAndBlocks const & matrix_size_block_info, 00056 std::vector<int> const & permutationHML, 00057 int const create_dipole_mtx = 0, 00058 std::vector<int> const * const inversePermutationHML = 0, 00059 std::string const * const calculation_identifier = 0, 00060 std::string const * const method_and_basis_set = 0); 00061 00062 int 00063 compute_h_core_matrix_simple_dense(const IntegralInfo& integralInfo, 00064 const Molecule& molecule, 00065 const BasisInfoStruct& basisInfo, 00066 symmMatrix & H_core_Matrix_sparse, 00067 ergo_real threshold_integrals_1el, 00068 int noOfThreadsForV, 00069 mat::SizesAndBlocks const & matrix_size_block_info, 00070 std::vector<int> const & permutationHML); 00071 00072 int save_symmetric_matrix(symmMatrix& A, 00073 const BasisInfoStruct & basisInfo, 00074 const char *name, 00075 std::vector<int> const & inversePermutationHML); 00076 00077 int 00078 add_disturbance_to_matrix(int n, 00079 symmMatrix & A, 00080 ergo_real disturbance, 00081 int specificElementCount, 00082 const int* elementIndexVector, 00083 std::vector<int> const & permutationHML); 00084 00085 int 00086 get_simple_starting_guess_sparse(int n, 00087 int noOfElectrons, 00088 symmMatrix & densityMatrix); 00089 00090 int 00091 write_diag_elements_to_file(int n, 00092 const symmMatrix & M, 00093 const char* fileName, 00094 std::vector<int> const & permutationHML); 00095 00096 int 00097 get_diag_matrix_from_file(int n, 00098 symmMatrix & M, 00099 const char* fileName, 00100 std::vector<int> const & permutationHML); 00101 00102 int 00103 write_full_matrix(int n, 00104 const symmMatrix & M, 00105 const char* fileName, 00106 std::vector<int> const & inversePermutationHML); 00107 00108 int 00109 write_basis_func_coord_file(const BasisInfoStruct & basisInfo); 00110 00111 int 00112 get_2e_matrix_and_energy_sparse(const BasisInfoStruct & basisInfo, 00113 const BasisInfoStruct & basisInfoDensFit, 00114 const Molecule& molecule, 00115 const IntegralInfo& integralInfo, 00116 symmMatrix & twoelMatrix_sparse, 00117 symmMatrix & densityMatrix_sparse, 00118 const JK::Params& J_K_params, 00119 const JK::ExchWeights & CAM_params, 00120 const Dft::GridParams& gridParams, 00121 int do_xc, 00122 ergo_real* energy_2el, 00123 int noOfElectrons, 00124 DensfitData* df_data, 00125 mat::SizesAndBlocks const & matrix_size_block_info, 00126 00127 std::vector<int> const & permutationHML, 00128 std::vector<int> const & inversePermutationHML, 00129 int get_J_K_Fxc_matrices, 00130 symmMatrix & J_matrix, 00131 symmMatrix & K_matrix, 00132 symmMatrix & Fxc_matrix, 00133 SCF_statistics & stats); 00134 00135 int 00136 get_2e_matrices_and_energy_sparse_unrestricted(const BasisInfoStruct & basisInfo, 00137 const BasisInfoStruct & basisInfoDensFit, 00138 const Molecule& molecule, 00139 const IntegralInfo& integralInfo, 00140 const JK::ExchWeights & CAM_params, 00141 symmMatrix & twoelMatrix_sparse_alpha, 00142 symmMatrix & twoelMatrix_sparse_beta, 00143 symmMatrix & densityMatrix_sparse_alpha, 00144 symmMatrix & densityMatrix_sparse_beta, 00145 const JK::Params& J_K_params, 00146 const Dft::GridParams& gridParams, 00147 int do_xc, 00148 ergo_real* energy_2el, 00149 int noOfElectrons, 00150 DensfitData* df_data, 00151 mat::SizesAndBlocks const & matrix_size_block_info, 00152 std::vector<int> const & permutationHML, 00153 std::vector<int> const & inversePermutationHML); 00154 00155 int 00156 get_2e_matrices_and_energy_restricted_open(const BasisInfoStruct & basisInfo, 00157 const BasisInfoStruct & basisInfoDensFit, 00158 const Molecule& molecule, 00159 const IntegralInfo& integralInfo, 00160 const JK::ExchWeights & CAM_params, 00161 symmMatrix & twoelMatrix_Fc, 00162 symmMatrix & twoelMatrix_Fo, 00163 symmMatrix & densityMatrix_sparse_alpha, 00164 symmMatrix & densityMatrix_sparse_beta, 00165 const JK::Params& J_K_params, 00166 const Dft::GridParams& gridParams, 00167 int do_xc, 00168 ergo_real* energy_2el, 00169 int noOfElectrons, 00170 DensfitData* df_data, 00171 mat::SizesAndBlocks const & matrix_size_block_info, 00172 std::vector<int> const & permutationHML, 00173 std::vector<int> const & inversePermutationHML); 00174 00175 int 00176 compute_FDSminusSDF_sparse(int n, 00177 symmMatrix & F_symm, 00178 symmMatrix & D_symm, 00179 symmMatrix & S_symm, 00180 normalMatrix & result, 00181 ergo_real sparse_threshold); 00182 00183 int 00184 determine_number_of_electrons_unrestricted(int noOfElectrons, 00185 int alpha_beta_diff, 00186 int* noOfElectrons_alpha, 00187 int* noOfElectrons_beta); 00188 00189 void 00190 get_hf_weight_and_cam_params(int use_dft, 00191 ergo_real* exch_param_alpha, 00192 ergo_real* exch_param_beta, 00193 ergo_real* exch_param_mu); 00194 00195 int 00196 determine_number_of_electrons_unrestricted(int noOfElectrons, 00197 int alpha_beta_diff, 00198 int* noOfElectrons_alpha, 00199 int* noOfElectrons_beta); 00200 00201 void 00202 get_dipole_moment(const symmMatrix & densityMatrix, 00203 const BasisInfoStruct & basisInfo, 00204 mat::SizesAndBlocks const & matrix_size_block_info, 00205 std::vector<int> const & permutationHML, 00206 const Molecule& molecule); 00207 00208 void 00209 do_mulliken_atomic_charges(const symmMatrix & densityMatrix, 00210 const symmMatrix & S_symm, 00211 const BasisInfoStruct & basisInfo, 00212 mat::SizesAndBlocks const & matrix_size_block_info, 00213 std::vector<int> const & permutationHML, 00214 std::vector<int> const & inversePermutationHML, 00215 const Molecule& molecule); 00216 00217 void 00218 do_mulliken_spin_densities(const symmMatrix & spinDensityMatrix, 00219 const symmMatrix & S_symm, 00220 const BasisInfoStruct & basisInfo, 00221 mat::SizesAndBlocks const & matrix_size_block_info, 00222 std::vector<int> const & permutationHML, 00223 std::vector<int> const & inversePermutationHML, 00224 const Molecule& molecule); 00225 00226 void 00227 do_acc_scan_J(const symmMatrix & D, 00228 const IntegralInfo & integralInfo, 00229 const BasisInfoStruct & basisInfo, 00230 triangMatrix & invCholFactor, 00231 bool doInvCholFactorTransformation, 00232 const JK::Params & J_K_params, 00233 mat::SizesAndBlocks const & matrix_size_block_info, 00234 std::vector<int> const & permutationHML, 00235 int nSteps, 00236 ergo_real startThresh, 00237 ergo_real stepFactor); 00238 00239 void 00240 do_acc_scan_K(symmMatrix & D, 00241 const IntegralInfo & integralInfo, 00242 const BasisInfoStruct & basisInfo, 00243 triangMatrix & invCholFactor, 00244 bool doInvCholFactorTransformation, 00245 const JK::ExchWeights & CAM_params, 00246 const JK::Params & J_K_params, 00247 mat::SizesAndBlocks const & matrix_size_block_info, 00248 std::vector<int> const & permutationHML, 00249 std::vector<int> const & inversePermutationHML, 00250 int nSteps, 00251 ergo_real startThresh, 00252 ergo_real stepFactor); 00253 00254 void 00255 do_acc_scan_Vxc(symmMatrix & D, 00256 const IntegralInfo & integralInfo, 00257 const BasisInfoStruct & basisInfo, 00258 const Molecule & molecule, 00259 const Dft::GridParams & gridParams, 00260 int noOfElectrons, 00261 triangMatrix & invCholFactor, 00262 bool doInvCholFactorTransformation, 00263 mat::SizesAndBlocks const & matrix_size_block_info, 00264 std::vector<int> const & permutationHML, 00265 std::vector<int> const & inversePermutationHML, 00266 int nSteps, 00267 ergo_real startThresh, 00268 ergo_real stepFactor); 00269 00270 00271 #endif