1 /* Ergo, version 3.8, a program for linear scaling electronic structure 2 * calculations. 3 * Copyright (C) 2019 Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, 4 * and Anastasia Kruchinina. 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 * 19 * Primary academic reference: 20 * Ergo: An open-source program for linear-scaling electronic structure 21 * calculations, 22 * Elias Rudberg, Emanuel H. Rubensson, Pawel Salek, and Anastasia 23 * Kruchinina, 24 * SoftwareX 7, 107 (2018), 25 * <http://dx.doi.org/10.1016/j.softx.2018.03.005> 26 * 27 * For further information about Ergo, see <http://www.ergoscf.org>. 28 */ 29 30 /** @file scf_utils.h 31 32 @brief Various utilities used by self-consistent field (SCF) 33 code. For example, interface routines converting between HML 34 matrix format used in main SCF code and elementwise format used by 35 integral code. 36 37 @author: Elias Rudberg <em>responsible</em> 38 */ 39 40 #ifndef SCF_UTILS_HEADER 41 #define SCF_UTILS_HEADER 42 43 #include "molecule.h" 44 #include "basisinfo.h" 45 #include "integrals_2el.h" 46 #include "matrix_typedefs.h" 47 #include "grid_stream.h" 48 #include "SCF_statistics.h" 49 50 51 void output_sparsity(int n, const normalMatrix & M, const char* matrixName); 52 void output_sparsity_symm(int n, const symmMatrix & M, const char* matrixName); 53 void output_sparsity_triang(int n, const triangMatrix & M, const char* matrixName); 54 55 int 56 compute_h_core_matrix_sparse(const IntegralInfo& integralInfo, 57 const Molecule& molecule, 58 const Molecule& extraCharges, 59 ergo_real electric_field_x, 60 ergo_real electric_field_y, 61 ergo_real electric_field_z, 62 const BasisInfoStruct& basisInfo, 63 symmMatrix & H_core_Matrix_sparse, 64 ergo_real threshold_integrals_1el, 65 int noOfThreadsForV, 66 ergo_real boxSizeForVT, 67 ergo_real & result_nuclearRepulsionEnergy, 68 mat::SizesAndBlocks const & matrix_size_block_info, 69 std::vector<int> const & permutationHML, 70 int const create_dipole_mtx = 0, 71 std::vector<int> const * const inversePermutationHML = 0, 72 std::string const * const calculation_identifier = 0, 73 std::string const * const method_and_basis_set = 0); 74 75 int 76 compute_h_core_matrix_simple_dense(const IntegralInfo& integralInfo, 77 const Molecule& molecule, 78 const BasisInfoStruct& basisInfo, 79 symmMatrix & H_core_Matrix_sparse, 80 ergo_real threshold_integrals_1el, 81 int noOfThreadsForV, 82 mat::SizesAndBlocks const & matrix_size_block_info, 83 std::vector<int> const & permutationHML, 84 ergo_real & result_nuclearRepulsionEnergy); 85 86 int 87 get_gradient_for_given_mol_and_dens(const IntegralInfo& integralInfo, 88 const Molecule& molecule, 89 const BasisInfoStruct& basisInfo, 90 const symmMatrix & D, 91 ergo_real threshold_integrals_1el, 92 mat::SizesAndBlocks const & matrix_size_block_info, 93 std::vector<int> const & permutationHML, 94 ergo_real* result_gradient_list); 95 96 int save_symmetric_matrix(symmMatrix& A, 97 const BasisInfoStruct & basisInfo, 98 const char *name, 99 std::vector<int> const & inversePermutationHML); 100 101 int 102 add_disturbance_to_matrix(int n, 103 symmMatrix & A, 104 ergo_real disturbance, 105 int specificElementCount, 106 const int* elementIndexVector, 107 std::vector<int> const & permutationHML); 108 109 int 110 get_simple_starting_guess_sparse(int n, 111 int noOfElectrons, 112 symmMatrix & densityMatrix); 113 114 int 115 write_diag_elements_to_file(int n, 116 const symmMatrix & M, 117 const char* fileName, 118 std::vector<int> const & permutationHML); 119 120 int 121 get_diag_matrix_from_file(int n, 122 symmMatrix & M, 123 const char* fileName, 124 std::vector<int> const & permutationHML); 125 126 int 127 write_full_matrix(int n, 128 const symmMatrix & M, 129 const char* fileName, 130 std::vector<int> const & inversePermutationHML); 131 132 int 133 write_basis_func_coord_file(const BasisInfoStruct & basisInfo); 134 135 int 136 write_2el_integral_m_file(const BasisInfoStruct & basisInfo, const IntegralInfo & integralInfo); 137 138 int 139 get_2e_matrix_and_energy_sparse(const BasisInfoStruct & basisInfo, 140 const Molecule& molecule, 141 const IntegralInfo& integralInfo, 142 symmMatrix & twoelMatrix_sparse, 143 symmMatrix & densityMatrix_sparse, 144 const JK::Params& J_K_params, 145 const JK::ExchWeights & CAM_params, 146 const Dft::GridParams& gridParams, 147 int do_xc, 148 ergo_real* energy_2el, 149 int noOfElectrons, 150 mat::SizesAndBlocks const & matrix_size_block_info, 151 std::vector<int> const & permutationHML, 152 std::vector<int> const & inversePermutationHML, 153 int get_J_K_Fxc_matrices, 154 symmMatrix & J_matrix, 155 symmMatrix & K_matrix, 156 symmMatrix & Fxc_matrix, 157 SCF_statistics & stats); 158 159 int 160 get_2e_matrices_and_energy_sparse_unrestricted(const BasisInfoStruct & basisInfo, 161 const Molecule& molecule, 162 const IntegralInfo& integralInfo, 163 const JK::ExchWeights & CAM_params, 164 symmMatrix & twoelMatrix_sparse_alpha, 165 symmMatrix & twoelMatrix_sparse_beta, 166 symmMatrix & densityMatrix_sparse_alpha, 167 symmMatrix & densityMatrix_sparse_beta, 168 const JK::Params& J_K_params, 169 const Dft::GridParams& gridParams, 170 int do_xc, 171 ergo_real* energy_2el, 172 int noOfElectrons, 173 mat::SizesAndBlocks const & matrix_size_block_info, 174 std::vector<int> const & permutationHML, 175 std::vector<int> const & inversePermutationHML); 176 177 int 178 get_2e_matrices_and_energy_restricted_open(const BasisInfoStruct & basisInfo, 179 const Molecule& molecule, 180 const IntegralInfo& integralInfo, 181 const JK::ExchWeights & CAM_params, 182 symmMatrix & twoelMatrix_Fc, 183 symmMatrix & twoelMatrix_Fo, 184 symmMatrix & densityMatrix_sparse_alpha, 185 symmMatrix & densityMatrix_sparse_beta, 186 const JK::Params& J_K_params, 187 const Dft::GridParams& gridParams, 188 int do_xc, 189 ergo_real* energy_2el, 190 int noOfElectrons, 191 mat::SizesAndBlocks const & matrix_size_block_info, 192 std::vector<int> const & permutationHML, 193 std::vector<int> const & inversePermutationHML); 194 195 int 196 compute_FDSminusSDF_sparse(int n, 197 symmMatrix & F_symm, 198 symmMatrix & D_symm, 199 symmMatrix & S_symm, 200 normalMatrix & result, 201 ergo_real sparse_threshold); 202 203 int 204 determine_number_of_electrons_unrestricted(int noOfElectrons, 205 int alpha_beta_diff, 206 int* noOfElectrons_alpha, 207 int* noOfElectrons_beta); 208 209 void 210 get_hf_weight_and_cam_params(int use_dft, 211 ergo_real* exch_param_alpha, 212 ergo_real* exch_param_beta, 213 ergo_real* exch_param_mu); 214 215 int 216 determine_number_of_electrons_unrestricted(int noOfElectrons, 217 int alpha_beta_diff, 218 int* noOfElectrons_alpha, 219 int* noOfElectrons_beta); 220 221 void 222 do_mulliken_atomic_charges(const symmMatrix & densityMatrix, 223 const symmMatrix & S_symm, 224 const BasisInfoStruct & basisInfo, 225 mat::SizesAndBlocks const & matrix_size_block_info, 226 std::vector<int> const & permutationHML, 227 std::vector<int> const & inversePermutationHML, 228 const Molecule& molecule); 229 230 void 231 do_mulliken_spin_densities(const symmMatrix & spinDensityMatrix, 232 const symmMatrix & S_symm, 233 const BasisInfoStruct & basisInfo, 234 mat::SizesAndBlocks const & matrix_size_block_info, 235 std::vector<int> const & permutationHML, 236 std::vector<int> const & inversePermutationHML, 237 const Molecule& molecule); 238 239 void get_exp_value_pos_operator(const BasisInfoStruct & basisInfo, 240 const Molecule& molecule, 241 const symmMatrix & densityMatrix, 242 mat::SizesAndBlocks const & matrix_size_block_info, 243 std::vector<int> const & permutationHML, 244 std::vector<ergo_real> &mean, 245 std::vector<ergo_real> &std); 246 247 248 void 249 do_density_images(const BasisInfoStruct & basisInfo, 250 const Molecule& molecule, 251 const ergo_real* densityMatrixFull_tot, 252 const ergo_real* densityMatrixFull_spin, 253 double output_density_images_boxwidth, 254 const std::string &filename_id = ""); 255 256 void 257 do_acc_scan_J(const symmMatrix & D, 258 const IntegralInfo & integralInfo, 259 const BasisInfoStruct & basisInfo, 260 triangMatrix & invCholFactor, 261 bool doInvCholFactorTransformation, 262 const JK::Params & J_K_params, 263 mat::SizesAndBlocks const & matrix_size_block_info, 264 std::vector<int> const & permutationHML, 265 int nSteps, 266 ergo_real startThresh, 267 ergo_real stepFactor); 268 269 void 270 do_acc_scan_K(symmMatrix & D, 271 const IntegralInfo & integralInfo, 272 const BasisInfoStruct & basisInfo, 273 triangMatrix & invCholFactor, 274 bool doInvCholFactorTransformation, 275 const JK::ExchWeights & CAM_params, 276 const JK::Params & J_K_params, 277 mat::SizesAndBlocks const & matrix_size_block_info, 278 std::vector<int> const & permutationHML, 279 std::vector<int> const & inversePermutationHML, 280 int nSteps, 281 ergo_real startThresh, 282 ergo_real stepFactor); 283 284 void 285 do_acc_scan_Vxc(symmMatrix & D, 286 const IntegralInfo & integralInfo, 287 const BasisInfoStruct & basisInfo, 288 const Molecule & molecule, 289 const Dft::GridParams & gridParams, 290 int noOfElectrons, 291 triangMatrix & invCholFactor, 292 bool doInvCholFactorTransformation, 293 mat::SizesAndBlocks const & matrix_size_block_info, 294 std::vector<int> const & permutationHML, 295 std::vector<int> const & inversePermutationHML, 296 int nSteps, 297 ergo_real startThresh, 298 ergo_real stepFactor); 299 300 void 301 create_mtx_files_with_different_orderings(const symmMatrix & A, 302 const std::string & calculation_identifier, 303 const std::string & method_and_basis_set, 304 const std::vector<int> & inversePermutationHML, 305 const BasisInfoStruct & basisInfo); 306 307 #endif 308