00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00039 #ifndef GETDENSFROMFOCKHEADER
00040 #define GETDENSFROMFOCKHEADER
00041
00042 #include "realtype.h"
00043 #include "matrix_typedefs.h"
00044 #include "matrix_typedefs_chtml.h"
00045 #include "transform.h"
00046 #include "output.h"
00047
00048
00049
00056 class GetDensFromFock
00057 {
00058 public:
00059
00060 static const int UNDEF_VALUE;
00061 static const int UNDEF_VALUE_UINT;
00062 static const ergo_real UNDEF_VALUE_REAL;
00063 static const std::string UNDEF_VALUE_STRING;
00064
00065 static const int SET;
00066 static const int UNSET;
00067
00068 void create_checkpoint(symmMatrix& Finput,
00069 symmMatrix& F_ort_prev,
00072 generalVector *eigVecLUMO,
00073 generalVector *eigVecHOMO,
00074 std::string IDstr
00075 );
00076
00077
00078 static void restore_from_checkpoint(GetDensFromFock& DensFromFock,
00079 symmMatrix& Finput,
00080 symmMatrix& F_ort_prev,
00081 generalVector *eigVecLUMO,
00082 generalVector *eigVecHOMO,
00083 std::string checkpoint_path,
00084 std::string IDstr,
00085 int SCF_step
00086 );
00087
00088
00089
00090 GetDensFromFock()
00091 {
00092 do_output(LOG_CAT_INFO, LOG_AREA_DENSFROMF, "Create object from GetDensFromFock.");
00093
00094
00095
00096 n = UNDEF_VALUE_UINT;
00097 noOfOccupiedOrbs = UNDEF_VALUE_UINT;
00098 factor = UNDEF_VALUE_UINT;
00099 invCholFactor_euclnorm = UNDEF_VALUE_REAL;
00100 maxMul = UNDEF_VALUE_UINT;
00101 plot_puri_results = UNDEF_VALUE;
00102 SCF_step = UNDEF_VALUE_UINT;
00103
00104 use_diagonalization = UNDEF_VALUE;
00105 use_purification = UNDEF_VALUE;
00106
00107 electronicTemperature = UNDEF_VALUE_REAL;
00108 gap_expected_lower_bound = UNDEF_VALUE_REAL;
00109 eigvalueErrorLimit = UNDEF_VALUE_REAL;
00110 subspaceErrorLimit = UNDEF_VALUE_REAL;
00111 puri_eig_acc_factor_for_guess = UNDEF_VALUE;
00112 use_diag_on_error = UNDEF_VALUE;
00113 use_diag_on_error_guess = UNDEF_VALUE;
00114
00115 create_m_files = UNDEF_VALUE;
00116 output_homo_and_lumo_eigenvectors = UNDEF_VALUE;
00117 ignore_purification_failure = UNDEF_VALUE;
00118 use_rand_perturbation_for_alleigsint = UNDEF_VALUE;
00119 use_acceleration = UNDEF_VALUE;
00120 use_new_stopping_criterion = UNDEF_VALUE;
00121 store_all_eigenvalues_to_file = UNDEF_VALUE;
00122 try_eigv_on_next_iteration_if_fail = UNDEF_VALUE;
00123
00124 leavesSizeMax = UNDEF_VALUE_UINT;
00125 blocksize = UNDEF_VALUE_UINT;
00126
00127 eigenvectors_method = UNDEF_VALUE_STRING;
00128 eigenvectors_iterative_method = UNDEF_VALUE_STRING;
00129 use_prev_vector_as_initial_guess = UNDEF_VALUE;
00130 puri_compute_eigv_in_each_iteration = UNDEF_VALUE;
00131 run_shift_and_square_method_on_F = UNDEF_VALUE;
00132 save_permuted_F_matrix_in_bin = UNDEF_VALUE;
00133
00134 eigensolver_accuracy = UNDEF_VALUE_REAL;
00135 eigensolver_maxiter = UNDEF_VALUE_UINT;
00136
00137 std::string stats_prefix = "";
00138
00139 clean_eigs_intervals();
00140 clean_puri_stats();
00141
00142
00143 filenameFinput = "matrix_Finput";
00144 filenameF_ort_prev = "matrix_F_ort_prev";
00145 filenameeigVecLUMO = "vector_eigVecLUMO";
00146 filenameeigVecHOMO = "vector_eigVecHOMO";
00147 filenameOverlap = "matrix_Overlap";
00148 filenameD_ort_prev = "matrix_D_ort_prev";
00149 filenameinvCholFactor = "matrix_invCholFactor";
00150 file_for_basic_types = "basic_types";
00151 }
00152
00155 int get_dens_from_fock(symmMatrix& Finput,
00156 symmMatrix& resultDens,
00157 symmMatrix& F_ort_prev,
00160 generalVector *eigVecLUMO = 0,
00161 generalVector *eigVecHOMO = 0
00162 );
00163
00164
00165
00168 int get_dens_from_fock_sparse(symmMatrix& F,
00169 symmMatrix& resultDens,
00170 symmMatrix& F_ort_prev,
00173 generalVector *eigVecLUMO = 0,
00174 generalVector *eigVecHOMO = 0
00175 );
00176
00177
00181 inline void clean_eigs_intervals()
00182 {
00183 homoInterval_Finput = intervalType(-1e22, 1e22);
00184 lumoInterval_Finput = intervalType(-1e22, 1e22);
00185 homoInterval_Finput = intervalType(-1e22, 1e22);
00186 lumoInterval_Finput = intervalType(-1e22, 1e22);
00187
00188 homoInterval_F_ort_prev = intervalType(-1e22, 1e22);
00189 lumoInterval_F_ort_prev = intervalType(-1e22, 1e22);
00190 homoInterval_F_ort_prev = intervalType(-1e22, 1e22);
00191 lumoInterval_F_ort_prev = intervalType(-1e22, 1e22);
00192 }
00193
00194 inline void set_SCF_step(int step )
00195 { SCF_step = step; }
00196 inline void unset_SCF_step()
00197 { SCF_step = UNDEF_VALUE_UINT; }
00198
00199
00202 inline void set_generate_figures(std::string str = "" )
00203 {
00204 assert(create_m_files != UNDEF_VALUE);
00205 if (create_m_files == SET)
00206 {
00207 assert(SCF_step >= 0);
00208 plot_puri_results = SET;
00209 plot_puri_results_str = str;
00210 }
00211 }
00212
00215 inline void unset_generate_figures()
00216 {
00217 assert(create_m_files != UNDEF_VALUE);
00218 plot_puri_results = UNSET;
00219 plot_puri_results_str = "";
00220 }
00221
00222 inline void set_general_params(const int n_,
00223 mat::SizesAndBlocks const& matrixSizesAndBlocks_
00224 )
00225 {
00226 assert(n_ >= 1);
00227 n = n_;
00228 matrixSizesAndBlocks = matrixSizesAndBlocks_;
00229 }
00230
00231 inline void set_cht_matrix_params(const int leavesSizeMax_,
00232 const int blocksize_
00233 )
00234 {
00235 assert(leavesSizeMax_ >= 1);
00236 assert(blocksize_ >= 1);
00237 leavesSizeMax = leavesSizeMax_;
00238 blocksize = blocksize_;
00239 }
00240
00241 inline void get_SizesAndBlocks(mat::SizesAndBlocks& matrixSizesAndBlocks_
00242 ) const
00243 {
00244 matrixSizesAndBlocks_ = matrixSizesAndBlocks;
00245 }
00246
00250 inline void set_truncationNormPurification(mat::normType const truncationNormPurification_ )
00251 { truncationNormPurification = truncationNormPurification_; }
00252
00256 inline void set_stopCriterionNormPurification(mat::normType const stopCriterionNormPurification_ )
00257 { stopCriterionNormPurification = stopCriterionNormPurification_; }
00258
00259
00260 inline void do_restricted_calculations()
00261 { factor = 2; }
00262
00263 inline void do_unrestricted_calculations()
00264 { factor = 1; }
00265
00266 inline void set_no_occupied_orbs(int noOfOccupiedOrbs_)
00267 {
00268 assert(noOfOccupiedOrbs_ >= 0);
00269 noOfOccupiedOrbs = noOfOccupiedOrbs_;
00270 }
00271
00272 inline void clean_puri_stats()
00273 { puri_stats.clear(); }
00274
00275
00276 inline void set_invCholFactor(triangMatrix const& invCholFactor_,
00277 ergo_real invCholFactor_euclnorm_)
00278 {
00279 invCholFactor = invCholFactor_;
00280 assert(invCholFactor_euclnorm_ >= 0);
00281 invCholFactor_euclnorm = invCholFactor_euclnorm_;
00282 }
00283
00284 inline void set_gap_expected_lower_bound(ergo_real gap_expected_lower_bound_)
00285 {
00286 assert(gap_expected_lower_bound_ >= 0);
00287 gap_expected_lower_bound = gap_expected_lower_bound_;
00288 }
00289
00292 inline void set_purification_maxmul(ergo_real purification_maxmul_)
00293 {
00294 assert(purification_maxmul_ > 0);
00295 maxMul = purification_maxmul_;
00296 }
00297
00298
00299
00300 inline int get_purification_create_m_files() const
00301 { return create_m_files == SET; }
00302 inline void set_purification_create_m_files()
00303 { create_m_files = SET; }
00304 inline void unset_purification_create_m_files()
00305 { create_m_files = UNSET; }
00306
00307
00308
00309 inline int get_output_homo_and_lumo_eigenvectors() const
00310 { return output_homo_and_lumo_eigenvectors == SET; }
00311 inline void set_output_homo_and_lumo_eigenvectors()
00312 { output_homo_and_lumo_eigenvectors = SET; }
00313 inline void unset_output_homo_and_lumo_eigenvectors()
00314 { output_homo_and_lumo_eigenvectors = UNSET; }
00315
00316
00317 inline int get_purification_ignore_failure() const
00318 { return ignore_purification_failure == SET; }
00319 inline void set_purification_ignore_failure()
00320 { ignore_purification_failure = SET; }
00321 inline void unset_purification_ignore_failure()
00322 { ignore_purification_failure = UNSET; }
00323
00324
00325 inline int get_use_rand_perturbation_for_alleigsint() const
00326 { return use_rand_perturbation_for_alleigsint == SET; }
00327 inline void set_purification_use_rand_perturbation_for_alleigsint()
00328 { use_rand_perturbation_for_alleigsint = SET; }
00329 inline void unset_purification_use_rand_perturbation_for_alleigsint()
00330 { use_rand_perturbation_for_alleigsint = UNSET; }
00331
00332 inline int get_use_diagonalization() const
00333 { return use_diagonalization == SET; }
00334 inline void set_use_diagonalization()
00335 { use_diagonalization = SET; }
00336 inline void unset_use_diagonalization()
00337 { use_diagonalization = UNSET; }
00338
00339
00340 inline int get_use_purification() const
00341 { return use_purification == SET; }
00342 inline void set_use_purification()
00343 { use_purification = SET; }
00344 inline void unset_use_purification()
00345 { use_purification = UNSET; }
00346
00347
00348 inline int get_use_diag_on_error_guess() const
00349 { return use_diag_on_error_guess == SET; }
00350 inline void set_use_diag_on_error_guess()
00351 { use_diag_on_error_guess = SET; }
00352 inline void unset_use_diag_on_error_guess()
00353 { use_diag_on_error_guess = UNSET; }
00354
00355
00356 inline int get_use_diag_on_error() const
00357 { return use_diag_on_error == SET; }
00358 inline void set_use_diag_on_error()
00359 { use_diag_on_error = SET; }
00360 inline void unset_use_diag_on_error()
00361 { use_diag_on_error = UNSET; }
00362
00363
00364 inline std::string get_stats_prefix() const
00365 { return stats_prefix; }
00366 inline void set_stats_prefix(std::string stats_prefix_)
00367 { stats_prefix = stats_prefix_; }
00368 inline void unset_stats_prefix()
00369 { stats_prefix = ""; }
00370
00371
00372 inline int get_use_acceleration() const
00373 { return use_acceleration == SET; }
00374 inline void set_use_acceleration()
00375 { use_acceleration = SET; }
00376 inline void unset_use_acceleration()
00377 { use_acceleration = UNSET; }
00378
00379 inline int get_use_new_stopping_criterion() const
00380 { return use_new_stopping_criterion == SET; }
00381 inline void set_use_new_stopping_criterion()
00382 { use_new_stopping_criterion = SET; }
00383 inline void unset_use_new_stopping_criterion()
00384 { use_new_stopping_criterion = UNSET; }
00385
00386 inline int get_store_all_eigenvalues_to_file() const
00387 { return store_all_eigenvalues_to_file == SET; }
00388 inline void set_store_all_eigenvalues_to_file()
00389 { store_all_eigenvalues_to_file = SET; }
00390 inline void unset_store_all_eigenvalues_to_file()
00391 { store_all_eigenvalues_to_file = UNSET; }
00392
00393 inline int get_save_permuted_F_matrix_in_bin()
00394 { return save_permuted_F_matrix_in_bin; }
00395 inline void set_save_permuted_F_matrix_in_bin()
00396 { save_permuted_F_matrix_in_bin = SET; }
00397 inline void unset_save_permuted_F_matrix_in_bin()
00398 { save_permuted_F_matrix_in_bin = UNSET; }
00399
00400
00401
00402 inline int get_puri_compute_eigv_in_each_iteration()
00403 { return puri_compute_eigv_in_each_iteration; }
00404 inline void set_puri_compute_eigv_in_each_iteration()
00405 { puri_compute_eigv_in_each_iteration = SET; }
00406 inline void unset_puri_compute_eigv_in_each_iteration()
00407 { puri_compute_eigv_in_each_iteration = UNSET; }
00408
00409
00410 inline int get_run_shift_and_square_method_on_F()
00411 { return run_shift_and_square_method_on_F; }
00412 inline void set_run_shift_and_square_method_on_F()
00413 { run_shift_and_square_method_on_F = SET; }
00414 inline void unset_run_shift_and_square_method_on_F()
00415 { run_shift_and_square_method_on_F = UNSET; }
00416
00417
00418 inline int get_try_eigv_on_next_iteration_if_fail()
00419 { return try_eigv_on_next_iteration_if_fail; }
00420 inline void set_try_eigv_on_next_iteration_if_fail()
00421 { try_eigv_on_next_iteration_if_fail = SET; }
00422 inline void unset_try_eigv_on_next_iteration_if_fail()
00423 { try_eigv_on_next_iteration_if_fail = UNSET; }
00424
00425
00426 inline int get_use_prev_vector_as_initial_guess()
00427 { return use_prev_vector_as_initial_guess; }
00428 inline void set_use_prev_vector_as_initial_guess()
00429 { use_prev_vector_as_initial_guess = SET; }
00430 inline void unset_use_prev_vector_as_initial_guess()
00431 { use_prev_vector_as_initial_guess = UNSET; }
00432
00433
00434 inline void set_diagonalization_params(ergo_real electronicTemperature_,
00435 symmMatrix& overlapMatrix_)
00436 {
00437 set_overlapMatrix(overlapMatrix_);
00438 assert(electronicTemperature_ >= 0);
00439 electronicTemperature = electronicTemperature_;
00440 }
00441
00442 inline void set_overlapMatrix(symmMatrix& overlapMatrix_)
00443 { overlapMatrix = overlapMatrix_; }
00444
00445
00446 inline void set_purification_limits(ergo_real subspaceErrorLimit_,
00447 ergo_real eigvalueErrorLimit_ = 0,
00448 ergo_real puri_eig_acc_factor_for_guess = 0)
00449 {
00450 set_eigvalueErrorLimit(eigvalueErrorLimit_);
00451 set_subspaceErrorLimit(subspaceErrorLimit_);
00452 set_puri_eig_acc_factor_for_guess(puri_eig_acc_factor_for_guess);
00453 }
00454
00457 inline void set_eigvalueErrorLimit(ergo_real eigvalueErrorLimit_)
00458 { eigvalueErrorLimit = eigvalueErrorLimit_; }
00459
00463 inline void set_subspaceErrorLimit(ergo_real subspaceErrorLimit_)
00464 { subspaceErrorLimit = subspaceErrorLimit_; }
00465
00471 inline void set_puri_eig_acc_factor_for_guess(ergo_real puri_eig_acc_factor_for_guess_)
00472 { puri_eig_acc_factor_for_guess = puri_eig_acc_factor_for_guess_; }
00473
00474
00475
00476
00477
00478 ergo_real get_result_entropy_term() const
00479 { return resultEntropyTerm; }
00480
00481 inline void get_puri_stats(std::map<std::string, double>& puri_stats_) const
00482 { puri_stats_ = puri_stats; }
00483
00484
00485
00486
00487
00488 inline void set_eigs_Fprev(intervalType& homoInterval_Finput_,
00489 intervalType& lumoInterval_Finput_)
00490 {
00491 homoInterval_Finput = intervalType(homoInterval_Finput_);
00492 lumoInterval_Finput = intervalType(lumoInterval_Finput_);
00493 }
00494
00495 inline void get_eigs_Fprev(intervalType& homoInterval_Finput_,
00496 intervalType& lumoInterval_Finput_) const
00497 {
00498 homoInterval_Finput_ = intervalType(homoInterval_Finput);
00499 lumoInterval_Finput_ = intervalType(lumoInterval_Finput);
00500 }
00501
00502
00503
00504 inline void set_eigs_F_ort_prev(intervalType& homoInterval_F_ort_prev_,
00505 intervalType& lumoInterval_F_ort_prev_)
00506 {
00507 homoInterval_F_ort_prev = intervalType(homoInterval_F_ort_prev_);
00508 lumoInterval_F_ort_prev = intervalType(lumoInterval_F_ort_prev_);
00509 }
00510
00511 inline void get_eigs_F_ort_prev(intervalType& homoInterval_F_ort_prev_,
00512 intervalType& lumoInterval_F_ort_prev_) const
00513 {
00514 homoInterval_F_ort_prev_ = intervalType(homoInterval_F_ort_prev);
00515 lumoInterval_F_ort_prev_ = intervalType(lumoInterval_F_ort_prev);
00516 }
00517
00518 inline ergo_real get_eigvalueErrorLimit() const
00519 { return eigvalueErrorLimit; }
00520 inline ergo_real get_subspaceErrorLimit() const
00521 { return subspaceErrorLimit; }
00522 inline ergo_real get_puri_eig_acc_factor_for_guess() const
00523 { return puri_eig_acc_factor_for_guess; }
00524
00525
00526
00527 inline void compute_eigenvectors(std::string eigenvectors_method_,
00528 std::string eigenvectors_iterative_method_,
00529 ergo_real eigensolver_accuracy_,
00530 int eigensolver_maxiter_,
00531 int use_prev_vector_as_initial_guess_,
00532 int try_eigv_on_next_iteration_if_fail_)
00533 {
00534 assert(eigenvectors_method_ == "square" || eigenvectors_method_ == "projection");
00535 eigenvectors_method = eigenvectors_method_;
00536
00537 assert(eigenvectors_iterative_method_ == "power" || eigenvectors_iterative_method_ == "lanczos");
00538 eigenvectors_iterative_method = eigenvectors_iterative_method_;
00539
00540 eigensolver_accuracy = eigensolver_accuracy_;
00541 eigensolver_maxiter = eigensolver_maxiter_;
00542
00543 if (use_prev_vector_as_initial_guess_ > 0)
00544 {
00545 set_use_prev_vector_as_initial_guess();
00546 }
00547 else
00548 {
00549 unset_use_prev_vector_as_initial_guess();
00550 }
00551 if (try_eigv_on_next_iteration_if_fail_ > 0)
00552 {
00553 set_try_eigv_on_next_iteration_if_fail();
00554 }
00555 else
00556 {
00557 unset_try_eigv_on_next_iteration_if_fail();
00558 }
00559
00560 }
00561
00562 inline void compute_eigenvectors_extra(int puri_compute_eigv_in_each_iteration_, int run_shift_and_square_method_on_F_)
00563 {
00564 if (puri_compute_eigv_in_each_iteration_ > 0)
00565 {
00566 set_puri_compute_eigv_in_each_iteration();
00567 }
00568 else
00569 {
00570 unset_puri_compute_eigv_in_each_iteration();
00571 }
00572
00573 if (run_shift_and_square_method_on_F_ > 0)
00574 {
00575 set_run_shift_and_square_method_on_F();
00576 }
00577 else
00578 {
00579 unset_run_shift_and_square_method_on_F();
00580 }
00581 }
00582
00583 private:
00584
00585 int SCF_step;
00586
00587
00588
00589 int use_diagonalization;
00591 int use_purification;
00593 int store_all_eigenvalues_to_file;
00596 int try_eigv_on_next_iteration_if_fail;
00599 ergo_real electronicTemperature;
00601 ergo_real gap_expected_lower_bound;
00603 ergo_real eigvalueErrorLimit;
00605 ergo_real subspaceErrorLimit;
00607 ergo_real puri_eig_acc_factor_for_guess;
00611 int use_diag_on_error;
00612 int use_diag_on_error_guess;
00613
00614 int create_m_files;
00616 int output_homo_and_lumo_eigenvectors;
00618 int use_prev_vector_as_initial_guess;
00620 int puri_compute_eigv_in_each_iteration;
00622 int run_shift_and_square_method_on_F;
00625 int save_permuted_F_matrix_in_bin;
00627 int ignore_purification_failure;
00629 int use_rand_perturbation_for_alleigsint;
00637 std::string stats_prefix;
00639 int plot_puri_results;
00641 std::string plot_puri_results_str;
00642
00643 int use_acceleration;
00645 int use_new_stopping_criterion;
00647 std::string eigenvectors_method;
00649 std::string eigenvectors_iterative_method;
00651 ergo_real eigensolver_accuracy;
00653 int eigensolver_maxiter;
00655 int n;
00657 int noOfOccupiedOrbs;
00659 ergo_real factor;
00662 symmMatrix overlapMatrix;
00664 symmMatrix D_ort_prev;
00666 triangMatrix invCholFactor;
00668 ergo_real invCholFactor_euclnorm;
00670 mat::normType truncationNormPurification;
00672 mat::normType stopCriterionNormPurification;
00674 int maxMul;
00676 mat::SizesAndBlocks matrixSizesAndBlocks;
00678 int leavesSizeMax;
00679 int blocksize;
00681 intervalType homoInterval_Finput;
00682 intervalType lumoInterval_Finput;
00683
00684 intervalType homoInterval_F_ort_prev;
00685 intervalType lumoInterval_F_ort_prev;
00686
00687 ergo_real resultEntropyTerm;
00688 std::map<std::string, double> puri_stats;
00689
00690
00691
00692 const char *filenameFinput;
00693 const char *filenameF_ort_prev;
00694 const char *filenameeigVecLUMO;
00695 const char *filenameeigVecHOMO;
00696 const char *filenameOverlap;
00697 const char *filenameD_ort_prev;
00698 const char *filenameinvCholFactor;
00699 const char *file_for_basic_types;
00700 };
00701
00702
00703
00704 #endif // GETDENSFROMFOCKHEADER