1!--------------------------------------------------------------------------------------------------! 2! CP2K: A general program to perform molecular dynamics simulations ! 3! Copyright (C) 2000 - 2020 CP2K developers group ! 4!--------------------------------------------------------------------------------------------------! 5 6! ************************************************************************************************** 7!> \brief module that contains the definitions of the scf types 8!> \par History 9!> 02.2003 created [fawzi] 10!> \author fawzi 11! ************************************************************************************************** 12MODULE qs_scf_types 13 USE cp_dbcsr_operations, ONLY: dbcsr_deallocate_matrix_set 14 USE cp_fm_types, ONLY: cp_fm_p_type,& 15 cp_fm_release,& 16 cp_fm_type 17 USE cp_fm_vect, ONLY: cp_fm_vect_dealloc 18 USE dbcsr_api, ONLY: dbcsr_deallocate_matrix,& 19 dbcsr_p_type,& 20 dbcsr_type 21 USE input_section_types, ONLY: section_vals_get_subs_vals,& 22 section_vals_type,& 23 section_vals_val_get 24 USE kinds, ONLY: dp 25 USE outer_scf_control_types, ONLY: qs_outer_scf_type 26 USE preconditioner_types, ONLY: destroy_preconditioner,& 27 preconditioner_p_type 28 USE qs_block_davidson_types, ONLY: block_davidson_release,& 29 davidson_type 30 USE qs_density_mixing_types, ONLY: direct_mixing_nr,& 31 mixing_storage_create,& 32 mixing_storage_release,& 33 mixing_storage_type 34 USE qs_diis_types, ONLY: qs_diis_b_release,& 35 qs_diis_buffer_type 36 USE qs_fb_env_types, ONLY: fb_env_has_data,& 37 fb_env_nullify,& 38 fb_env_obj,& 39 fb_env_release 40 USE qs_ot_types, ONLY: qs_ot_destroy,& 41 qs_ot_type 42#include "./base/base_uses.f90" 43 44 IMPLICIT NONE 45 PRIVATE 46 47 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE. 48 49 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_types' 50 51 INTEGER, PARAMETER, PUBLIC :: general_diag_method_nr = 1, & 52 special_diag_method_nr = 2, & 53 ot_diag_method_nr = 3, & 54 block_krylov_diag_method_nr = 4, & 55 block_davidson_diag_method_nr = 5, & 56 ot_method_nr = 10, & 57 filter_matrix_diag_method_nr = 20 58 59 INTEGER, SAVE, PRIVATE :: last_scf_env_id = 0 60 61 PUBLIC :: qs_scf_env_type 62 PUBLIC :: scf_env_retain, scf_env_release, scf_env_create, scf_env_did_change 63 PUBLIC :: krylov_space_type, krylov_space_create, subspace_env_type 64 PUBLIC :: diag_subspace_env_create 65 66! ************************************************************************************************** 67!> \brief wrapper for temporary and cached objects used in the scf iteration 68!> \par History 69!> 02.2003 created [fawzi] 70!> \author fawzi 71! ************************************************************************************************** 72 TYPE krylov_space_type 73 INTEGER :: nkrylov, nblock, nmo_conv, nmo_nc, max_iter 74 LOGICAL :: always_check_conv 75 REAL(dp) :: eps_std_diag, eps_conv, eps_adapt, max_res_norm, min_res_norm 76 REAL(dp), DIMENSION(:), POINTER :: c_eval, t_eval 77 TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: v_mat, mo_conv, mo_refine 78 TYPE(cp_fm_type), POINTER :: tmp_mat 79 !NOTE: the following matrices are small and could be used as standard array rather than distributed fm 80 TYPE(cp_fm_type), POINTER :: block1_mat, block2_mat, block3_mat, block4_mat, block5_mat 81 TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: c_vec, chc_mat 82 END TYPE krylov_space_type 83 84 TYPE subspace_env_type 85 INTEGER :: max_iter, mixing_method 86 REAL(dp) :: eps_diag_sub, eps_ene, eps_adapt 87 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: p_matrix_store 88 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_matrix_mix 89 TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: chc_mat, c_vec, c0 90 TYPE(mixing_storage_type), POINTER :: mixing_store 91 END TYPE subspace_env_type 92 93 TYPE floating_basis_type 94 REAL(KIND=dp), DIMENSION(:, :), POINTER :: gradient 95 END TYPE floating_basis_type 96 ! ************************************************************************************************** 97 TYPE qs_scf_env_type 98 TYPE(qs_outer_scf_type) :: outer_scf 99 INTEGER :: ref_count, id_nr, print_count, iter_count 100 INTEGER :: cholesky_method, nelectron, method, mixing_method, nskip_mixing 101 REAL(KIND=dp) :: iter_param, iter_delta, p_mix_alpha, sum_zeff_corr 102 CHARACTER(len=15) :: iter_method 103 COMPLEX(KIND=dp), DIMENSION(:, :, :), POINTER :: cc_buffer 104 LOGICAL :: print_iter_line, skip_mixing, skip_diis, needs_ortho 105 TYPE(mixing_storage_type), POINTER :: mixing_store 106 TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: scf_work1 107 TYPE(cp_fm_type), POINTER :: scf_work2, ortho, ortho_m1, s_half, s_minus_one 108 TYPE(krylov_space_type), POINTER :: krylov_space 109 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_delta, p_mix_new 110 TYPE(dbcsr_type), POINTER :: ortho_dbcsr, buf1_dbcsr, buf2_dbcsr 111 TYPE(preconditioner_p_type), DIMENSION(:), POINTER :: ot_preconditioner 112 TYPE(qs_ot_type), POINTER, DIMENSION(:) :: qs_ot_env 113 TYPE(qs_diis_buffer_type), POINTER :: scf_diis_buffer 114 TYPE(subspace_env_type), POINTER :: subspace_env 115 TYPE(davidson_type), POINTER, DIMENSION(:) :: block_davidson_env 116 TYPE(fb_env_obj) :: filter_matrix_env 117 TYPE(floating_basis_type) :: floating_basis 118 !> reference molecular orbitals for the maximum overlap method 119 TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: mom_ref_mo_coeff 120 !> MOM-related work matrices 121 TYPE(cp_fm_p_type), DIMENSION(:), POINTER :: mom_overlap, mom_s_mo_coeff 122 END TYPE qs_scf_env_type 123 124CONTAINS 125 126! ************************************************************************************************** 127!> \brief allocates and initialize an scf_env 128!> \param scf_env the scf env to initialize 129!> \par History 130!> 02.2003 created [fawzi] 131!> \author fawzi 132! ************************************************************************************************** 133 SUBROUTINE scf_env_create(scf_env) 134 TYPE(qs_scf_env_type), POINTER :: scf_env 135 136 CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_create', routineP = moduleN//':'//routineN 137 138 INTEGER :: handle 139 140 CALL timeset(routineN, handle) 141 142 ALLOCATE (scf_env) 143 scf_env%ref_count = 1 144 scf_env%print_count = 0 145 last_scf_env_id = last_scf_env_id + 1 146 scf_env%id_nr = last_scf_env_id 147 scf_env%print_count = 0 148 scf_env%iter_count = 0 149 scf_env%nelectron = 0 150 scf_env%iter_param = 0.0_dp 151 scf_env%iter_delta = 0.0_dp 152 scf_env%iter_method = "" 153 scf_env%print_iter_line = .TRUE. 154 scf_env%skip_mixing = .FALSE. 155 scf_env%skip_diis = .FALSE. 156 scf_env%needs_ortho = .FALSE. 157 scf_env%method = -1 158 scf_env%mixing_method = -1 159 scf_env%p_mix_alpha = 1.0_dp 160 scf_env%cholesky_method = -1 161 scf_env%outer_scf%iter_count = 0 162 scf_env%sum_zeff_corr = 0.0_dp 163 NULLIFY (scf_env%outer_scf%variables) 164 NULLIFY (scf_env%outer_scf%gradient) 165 NULLIFY (scf_env%outer_scf%energy) 166 NULLIFY (scf_env%outer_scf%count) 167 NULLIFY (scf_env%outer_scf%inv_jacobian) 168 scf_env%outer_scf%deallocate_jacobian = .TRUE. 169 NULLIFY (scf_env%scf_work1) 170 NULLIFY (scf_env%scf_work2) 171 NULLIFY (scf_env%ortho) 172 NULLIFY (scf_env%ortho_dbcsr) 173 NULLIFY (scf_env%ortho_m1) 174 NULLIFY (scf_env%p_mix_new) 175 NULLIFY (scf_env%ot_preconditioner) 176 NULLIFY (scf_env%qs_ot_env) 177 NULLIFY (scf_env%scf_diis_buffer) 178 NULLIFY (scf_env%buf1_dbcsr) 179 NULLIFY (scf_env%buf2_dbcsr) 180 NULLIFY (scf_env%s_half) 181 NULLIFY (scf_env%p_delta) 182 NULLIFY (scf_env%s_minus_one) 183 NULLIFY (scf_env%cc_buffer) 184 NULLIFY (scf_env%mixing_store) 185 NULLIFY (scf_env%krylov_space) 186 NULLIFY (scf_env%subspace_env) 187 NULLIFY (scf_env%block_davidson_env) 188 NULLIFY (scf_env%floating_basis%gradient) 189 CALL fb_env_nullify(scf_env%filter_matrix_env) 190 NULLIFY (scf_env%mom_ref_mo_coeff) 191 NULLIFY (scf_env%mom_overlap) 192 NULLIFY (scf_env%mom_s_mo_coeff) 193 194 CALL timestop(handle) 195 196 END SUBROUTINE scf_env_create 197 198! ************************************************************************************************** 199!> \brief retains an scf_env (see doc/ReferenceCounting.html) 200!> \param scf_env the environment to retain 201!> \par History 202!> 02.2003 created [fawzi] 203!> \author fawzi 204! ************************************************************************************************** 205 SUBROUTINE scf_env_retain(scf_env) 206 207 TYPE(qs_scf_env_type), POINTER :: scf_env 208 209 CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_retain', routineP = moduleN//':'//routineN 210 211 INTEGER :: handle 212 213 CALL timeset(routineN, handle) 214 215 CPASSERT(ASSOCIATED(scf_env)) 216 CPASSERT(scf_env%ref_count > 0) 217 scf_env%ref_count = scf_env%ref_count + 1 218 219 CALL timestop(handle) 220 221 END SUBROUTINE scf_env_retain 222 223! ************************************************************************************************** 224!> \brief function to be called to inform the scf_env about changes 225!> \param scf_env the scf env to inform 226!> \par History 227!> 03.2003 created [fawzi] 228!> \author fawzi 229! ************************************************************************************************** 230 SUBROUTINE scf_env_did_change(scf_env) 231 TYPE(qs_scf_env_type), POINTER :: scf_env 232 233 CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_did_change', & 234 routineP = moduleN//':'//routineN 235 236 INTEGER :: handle, i 237 238 CALL timeset(routineN, handle) 239 240 CPASSERT(ASSOCIATED(scf_env)) 241 CPASSERT(scf_env%ref_count > 0) 242 243 IF (ASSOCIATED(scf_env%p_mix_new)) THEN 244 CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new) 245 END IF 246 IF (ASSOCIATED(scf_env%p_delta)) THEN 247 CALL dbcsr_deallocate_matrix_set(scf_env%p_delta) 248 END IF 249 IF (ASSOCIATED(scf_env%mom_ref_mo_coeff)) THEN 250 DO i = 1, SIZE(scf_env%mom_ref_mo_coeff) 251 CALL cp_fm_release(scf_env%mom_ref_mo_coeff(i)%matrix) 252 END DO 253 DEALLOCATE (scf_env%mom_ref_mo_coeff) 254 END IF 255 256 CALL timestop(handle) 257 258 END SUBROUTINE scf_env_did_change 259 260! ************************************************************************************************** 261!> \brief releases an scf_env (see doc/ReferenceCounting.html) 262!> \param scf_env the environment to release 263!> \par History 264!> 02.2003 created [fawzi] 265!> \author fawzi 266! ************************************************************************************************** 267 SUBROUTINE scf_env_release(scf_env) 268 269 TYPE(qs_scf_env_type), POINTER :: scf_env 270 271 CHARACTER(len=*), PARAMETER :: routineN = 'scf_env_release', & 272 routineP = moduleN//':'//routineN 273 274 INTEGER :: handle, i 275 276 CALL timeset(routineN, handle) 277 278 IF (ASSOCIATED(scf_env)) THEN 279 CPASSERT(scf_env%ref_count > 0) 280 scf_env%ref_count = scf_env%ref_count - 1 281 IF (scf_env%ref_count < 1) THEN 282 CALL cp_fm_vect_dealloc(scf_env%scf_work1) 283 CALL cp_fm_release(scf_env%scf_work2) 284 CALL cp_fm_release(scf_env%ortho) 285 CALL cp_fm_release(scf_env%ortho_m1) 286 IF (ASSOCIATED(scf_env%ortho_dbcsr)) THEN 287 ! we should not end up here, and give back using the pools 288 CPASSERT(.TRUE.) 289 CALL dbcsr_deallocate_matrix(scf_env%ortho_dbcsr) 290 END IF 291 IF (ASSOCIATED(scf_env%buf1_dbcsr)) THEN 292 ! we should not end up here, and give back using the pools 293 CPASSERT(.TRUE.) 294 CALL dbcsr_deallocate_matrix(scf_env%buf1_dbcsr) 295 END IF 296 IF (ASSOCIATED(scf_env%buf2_dbcsr)) THEN 297 ! we should not end up here, and give back using the pools 298 CPASSERT(.TRUE.) 299 CALL dbcsr_deallocate_matrix(scf_env%buf2_dbcsr) 300 END IF 301 CALL cp_fm_release(scf_env%s_half) 302 CALL cp_fm_release(scf_env%s_minus_one) 303 IF (ASSOCIATED(scf_env%p_mix_new)) THEN 304 ! we should not end up here, and give back using the pools 305 CPASSERT(.TRUE.) 306 CALL dbcsr_deallocate_matrix_set(scf_env%p_mix_new) 307 END IF 308 IF (ASSOCIATED(scf_env%p_delta)) THEN 309 ! we should not end up here, and give back using the pools 310 CPASSERT(.TRUE.) 311 CALL dbcsr_deallocate_matrix_set(scf_env%p_delta) 312 END IF 313 IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN 314 DO i = 1, SIZE(scf_env%ot_preconditioner) 315 CALL destroy_preconditioner(scf_env%ot_preconditioner(i)%preconditioner) 316 DEALLOCATE (scf_env%ot_preconditioner(i)%preconditioner) 317 END DO 318 DEALLOCATE (scf_env%ot_preconditioner) 319 END IF 320 IF (ASSOCIATED(scf_env%qs_ot_env)) THEN 321 DO i = 1, SIZE(scf_env%qs_ot_env) 322 CALL qs_ot_destroy(scf_env%qs_ot_env(i)) 323 END DO 324 DEALLOCATE (scf_env%qs_ot_env) 325 END IF 326 CALL qs_diis_b_release(scf_env%scf_diis_buffer) 327 IF (ASSOCIATED(scf_env%outer_scf%variables)) THEN 328 DEALLOCATE (scf_env%outer_scf%variables) 329 END IF 330 IF (ASSOCIATED(scf_env%outer_scf%count)) THEN 331 DEALLOCATE (scf_env%outer_scf%count) 332 END IF 333 IF (ASSOCIATED(scf_env%outer_scf%gradient)) THEN 334 DEALLOCATE (scf_env%outer_scf%gradient) 335 END IF 336 IF (ASSOCIATED(scf_env%outer_scf%inv_jacobian)) THEN 337 DEALLOCATE (scf_env%outer_scf%inv_jacobian) 338 END IF 339 IF (ASSOCIATED(scf_env%outer_scf%energy)) THEN 340 DEALLOCATE (scf_env%outer_scf%energy) 341 END IF 342 IF (ASSOCIATED(scf_env%cc_buffer)) THEN 343 DEALLOCATE (scf_env%cc_buffer) 344 END IF 345 IF (ASSOCIATED(scf_env%mixing_store)) THEN 346 CALL mixing_storage_release(scf_env%mixing_store) 347 END IF 348 IF (ASSOCIATED(scf_env%krylov_space)) THEN 349 CALL krylov_space_release(scf_env%krylov_space) 350 END IF 351 IF (ASSOCIATED(scf_env%subspace_env)) THEN 352 CALL diag_subspace_env_release(scf_env%subspace_env) 353 END IF 354 IF (ASSOCIATED(scf_env%block_davidson_env)) THEN 355 CALL block_davidson_release(scf_env%block_davidson_env) 356 END IF 357 IF (fb_env_has_data(scf_env%filter_matrix_env)) THEN 358 CALL fb_env_release(scf_env%filter_matrix_env) 359 END IF 360 IF (ASSOCIATED(scf_env%floating_basis%gradient)) THEN 361 DEALLOCATE (scf_env%floating_basis%gradient) 362 END IF 363 IF (ASSOCIATED(scf_env%mom_ref_mo_coeff)) THEN 364 DO i = 1, SIZE(scf_env%mom_ref_mo_coeff) 365 CALL cp_fm_release(scf_env%mom_ref_mo_coeff(i)%matrix) 366 END DO 367 DEALLOCATE (scf_env%mom_ref_mo_coeff) 368 END IF 369 IF (ASSOCIATED(scf_env%mom_overlap)) THEN 370 DO i = 1, SIZE(scf_env%mom_overlap) 371 CALL cp_fm_release(scf_env%mom_overlap(i)%matrix) 372 END DO 373 DEALLOCATE (scf_env%mom_overlap) 374 END IF 375 IF (ASSOCIATED(scf_env%mom_s_mo_coeff)) THEN 376 DO i = 1, SIZE(scf_env%mom_s_mo_coeff) 377 CALL cp_fm_release(scf_env%mom_s_mo_coeff(i)%matrix) 378 END DO 379 DEALLOCATE (scf_env%mom_s_mo_coeff) 380 END IF 381 DEALLOCATE (scf_env) 382 END IF 383 END IF 384 385 NULLIFY (scf_env) 386 387 CALL timestop(handle) 388 389 END SUBROUTINE scf_env_release 390 391! ************************************************************************************************** 392!> \brief creates krylov space 393!> \param krylov_space ... 394!> \param scf_section ... 395!> \par History 396!> 05.2009 created [MI] 397!> \author [MI] 398! ************************************************************************************************** 399 SUBROUTINE krylov_space_create(krylov_space, scf_section) 400 401 TYPE(krylov_space_type), POINTER :: krylov_space 402 TYPE(section_vals_type), POINTER :: scf_section 403 404 CHARACTER(len=*), PARAMETER :: routineN = 'krylov_space_create', & 405 routineP = moduleN//':'//routineN 406 407 CPASSERT(.NOT. ASSOCIATED(krylov_space)) 408 ALLOCATE (krylov_space) 409 410 NULLIFY (krylov_space%c_eval, krylov_space%t_eval) 411 NULLIFY (krylov_space%v_mat) 412 NULLIFY (krylov_space%mo_conv, krylov_space%mo_refine) 413 NULLIFY (krylov_space%chc_mat, krylov_space%c_vec) 414 NULLIFY (krylov_space%tmp_mat) 415 NULLIFY (krylov_space%block1_mat, krylov_space%block2_mat) 416 NULLIFY (krylov_space%block3_mat, krylov_space%block4_mat, krylov_space%block5_mat) 417 418 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%MAX_ITER", & 419 i_val=krylov_space%max_iter) 420 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NKRYLOV", & 421 i_val=krylov_space%nkrylov) 422 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%NBLOCK", & 423 i_val=krylov_space%nblock) 424 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_KRYLOV", & 425 r_val=krylov_space%eps_conv) 426 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%EPS_STD_DIAG", & 427 r_val=krylov_space%eps_std_diag) 428 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%EPS_ADAPT", & 429 r_val=krylov_space%eps_adapt) 430 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%KRYLOV%CHECK_MOS_CONV", & 431 l_val=krylov_space%always_check_conv) 432 433 END SUBROUTINE krylov_space_create 434 435! ************************************************************************************************** 436!> \brief releases krylov space 437!> \param krylov_space ... 438!> \par History 439!> 05.2009 created [MI] 440!> \author [MI] 441! ************************************************************************************************** 442 SUBROUTINE krylov_space_release(krylov_space) 443 TYPE(krylov_space_type), POINTER :: krylov_space 444 445 CHARACTER(len=*), PARAMETER :: routineN = 'krylov_space_release', & 446 routineP = moduleN//':'//routineN 447 448 INTEGER :: i 449 450 IF (ASSOCIATED(krylov_space)) THEN 451 452 DEALLOCATE (krylov_space%c_eval) 453 DEALLOCATE (krylov_space%t_eval) 454 455 DO i = 1, SIZE(krylov_space%v_mat) 456 CALL cp_fm_release(krylov_space%v_mat(i)%matrix) 457 END DO 458 DEALLOCATE (krylov_space%v_mat) 459 460 DO i = 1, SIZE(krylov_space%mo_conv) 461 CALL cp_fm_release(krylov_space%mo_conv(i)%matrix) 462 END DO 463 DEALLOCATE (krylov_space%mo_conv) 464 465 DO i = 1, SIZE(krylov_space%mo_refine) 466 CALL cp_fm_release(krylov_space%mo_refine(i)%matrix) 467 END DO 468 DEALLOCATE (krylov_space%mo_refine) 469 470 DO i = 1, SIZE(krylov_space%chc_mat) 471 CALL cp_fm_release(krylov_space%chc_mat(i)%matrix) 472 END DO 473 DEALLOCATE (krylov_space%chc_mat) 474 DO i = 1, SIZE(krylov_space%c_vec) 475 CALL cp_fm_release(krylov_space%c_vec(i)%matrix) 476 END DO 477 DEALLOCATE (krylov_space%c_vec) 478 CALL cp_fm_release(krylov_space%tmp_mat) 479 CALL cp_fm_release(krylov_space%block1_mat) 480 CALL cp_fm_release(krylov_space%block2_mat) 481 CALL cp_fm_release(krylov_space%block3_mat) 482 CALL cp_fm_release(krylov_space%block4_mat) 483 CALL cp_fm_release(krylov_space%block5_mat) 484 485 DEALLOCATE (krylov_space) 486 487 NULLIFY (krylov_space) 488 END IF 489 490 END SUBROUTINE krylov_space_release 491 492! ************************************************************************************************** 493!> \brief creates subspace-rotation environment 494!> \param subspace_env ... 495!> \param scf_section ... 496!> \param ecut ... 497!> \par History 498!> 09.2009 created [MI] 499!> \author [MI] 500! ************************************************************************************************** 501 SUBROUTINE diag_subspace_env_create(subspace_env, scf_section, ecut) 502 503 TYPE(subspace_env_type), POINTER :: subspace_env 504 TYPE(section_vals_type), POINTER :: scf_section 505 REAL(dp), INTENT(IN) :: ecut 506 507 CHARACTER(len=*), PARAMETER :: routineN = 'diag_subspace_env_create', & 508 routineP = moduleN//':'//routineN 509 510 LOGICAL :: do_mixing 511 TYPE(section_vals_type), POINTER :: mixing_section 512 513 CPASSERT(.NOT. ASSOCIATED(subspace_env)) 514 ALLOCATE (subspace_env) 515 516 NULLIFY (subspace_env%p_matrix_store) 517 NULLIFY (subspace_env%p_matrix_mix) 518 NULLIFY (subspace_env%chc_mat) 519 NULLIFY (subspace_env%c_vec) 520 NULLIFY (subspace_env%c0) 521 NULLIFY (subspace_env%mixing_store) 522 NULLIFY (mixing_section) 523 524 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MAX_ITER", & 525 i_val=subspace_env%max_iter) 526 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ENE", & 527 r_val=subspace_env%eps_ene) 528 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_SKIP_SUB_DIAG", & 529 r_val=subspace_env%eps_diag_sub) 530 CALL section_vals_val_get(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%EPS_ADAPT_SCF", & 531 r_val=subspace_env%eps_adapt) 532 subspace_env%mixing_method = 0 533 do_mixing = .FALSE. 534 mixing_section => section_vals_get_subs_vals(scf_section, "DIAGONALIZATION%DIAG_SUB_SCF%MIXING") 535 CALL section_vals_val_get(mixing_section, "_SECTION_PARAMETERS_", & 536 l_val=do_mixing) 537 IF (do_mixing) THEN 538 CALL section_vals_val_get(mixing_section, "METHOD", & 539 i_val=subspace_env%mixing_method) 540 IF (subspace_env%mixing_method >= direct_mixing_nr) & 541 CALL mixing_storage_create(subspace_env%mixing_store, mixing_section, & 542 subspace_env%mixing_method, ecut=ecut) 543 END IF 544 545 END SUBROUTINE diag_subspace_env_create 546 547! ************************************************************************************************** 548!> \brief releases subspace-rotation environment 549!> \param subspace_env ... 550!> \par History 551!> 09.2009 created [MI] 552!> \author [MI] 553! ************************************************************************************************** 554 SUBROUTINE diag_subspace_env_release(subspace_env) 555 TYPE(subspace_env_type), POINTER :: subspace_env 556 557 CHARACTER(len=*), PARAMETER :: routineN = 'diag_subspace_env_release', & 558 routineP = moduleN//':'//routineN 559 560 INTEGER :: i 561 562 IF (ASSOCIATED(subspace_env)) THEN 563 564 IF (ASSOCIATED(subspace_env%p_matrix_store)) THEN 565 566 CPASSERT(.TRUE.) 567 CALL dbcsr_deallocate_matrix_set(subspace_env%p_matrix_store) 568 ENDIF 569 DO i = 1, SIZE(subspace_env%chc_mat) 570 CALL cp_fm_release(subspace_env%chc_mat(i)%matrix) 571 END DO 572 DEALLOCATE (subspace_env%chc_mat) 573 DO i = 1, SIZE(subspace_env%c_vec) 574 CALL cp_fm_release(subspace_env%c_vec(i)%matrix) 575 END DO 576 DEALLOCATE (subspace_env%c_vec) 577 DO i = 1, SIZE(subspace_env%c0) 578 CALL cp_fm_release(subspace_env%c0(i)%matrix) 579 END DO 580 DEALLOCATE (subspace_env%c0) 581 582 IF (ASSOCIATED(subspace_env%mixing_store)) THEN 583 CALL mixing_storage_release(subspace_env%mixing_store) 584 END IF 585 586 DEALLOCATE (subspace_env) 587 END IF 588 589 END SUBROUTINE diag_subspace_env_release 590 591END MODULE qs_scf_types 592