Line data Source code
1 : !--------------------------------------------------------------------------------------------------! 2 : ! CP2K: A general program to perform molecular dynamics simulations ! 3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> ! 4 : ! ! 5 : ! SPDX-License-Identifier: GPL-2.0-or-later ! 6 : !--------------------------------------------------------------------------------------------------! 7 : 8 : ! ************************************************************************************************** 9 : !> \brief Types and set/get functions for auxiliary density matrix methods 10 : !> \par History 11 : !> 11.2014 created [Ole Schuett] 12 : !> \author Ole Schuett 13 : ! ************************************************************************************************** 14 : MODULE admm_dm_types 15 : USE cp_control_types, ONLY: admm_control_type 16 : USE cp_dbcsr_api, ONLY: dbcsr_release,& 17 : dbcsr_type 18 : USE input_constants, ONLY: do_admm_basis_projection,& 19 : do_admm_purify_mcweeny 20 : USE kinds, ONLY: dp 21 : #include "./base/base_uses.f90" 22 : 23 : IMPLICIT NONE 24 : PRIVATE 25 : 26 : PUBLIC :: admm_dm_type, mcweeny_history_type 27 : PUBLIC :: admm_dm_create, admm_dm_release 28 : 29 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'admm_dm_types' 30 : 31 : TYPE mcweeny_history_type 32 : TYPE(dbcsr_type) :: m 33 : INTEGER :: count = -1 34 : TYPE(mcweeny_history_type), POINTER :: next => Null() 35 : END TYPE mcweeny_history_type 36 : 37 : TYPE mcweeny_history_p_type 38 : TYPE(mcweeny_history_type), POINTER :: p => Null() 39 : END TYPE mcweeny_history_p_type 40 : 41 : TYPE admm_dm_type 42 : LOGICAL :: purify = .FALSE. 43 : INTEGER :: method = -1 44 : TYPE(dbcsr_type), POINTER :: matrix_a => Null() 45 : REAL(KIND=dp) :: eps_filter = 1e-20_dp 46 : INTEGER :: mcweeny_max_steps = 100 47 : INTEGER, DIMENSION(:, :), POINTER :: block_map => Null() 48 : TYPE(mcweeny_history_p_type), & 49 : DIMENSION(:), POINTER :: mcweeny_history => Null() 50 : END TYPE 51 : 52 : CONTAINS 53 : 54 : ! ************************************************************************************************** 55 : !> \brief Create a new admm_dm type 56 : !> \param admm_dm ... 57 : !> \param admm_control ... 58 : !> \param nspins ... 59 : !> \param natoms ... 60 : !> \author Ole Schuett 61 : ! ************************************************************************************************** 62 14 : SUBROUTINE admm_dm_create(admm_dm, admm_control, nspins, natoms) 63 : TYPE(admm_dm_type), POINTER :: admm_dm 64 : TYPE(admm_control_type), POINTER :: admm_control 65 : INTEGER, INTENT(IN) :: nspins, natoms 66 : 67 : INTEGER :: i, iatom, iblock, j, jatom 68 : 69 14 : ALLOCATE (admm_dm) 70 : ! copy settings from admm_control 71 14 : admm_dm%purify = (admm_control%purification_method == do_admm_purify_mcweeny) 72 14 : admm_dm%method = admm_control%method 73 14 : admm_dm%eps_filter = admm_control%eps_filter 74 : 75 64 : ALLOCATE (admm_dm%mcweeny_history(nspins)) 76 : 77 14 : IF (admm_dm%method /= do_admm_basis_projection) THEN 78 : ! create block map 79 16 : ALLOCATE (admm_dm%block_map(natoms, natoms)) 80 100 : admm_dm%block_map(:, :) = 0 81 12 : DO iblock = 1, SIZE(admm_control%blocks) 82 28 : DO i = 1, SIZE(admm_control%blocks(iblock)%list) 83 16 : iatom = admm_control%blocks(iblock)%list(i) 84 64 : DO j = 1, SIZE(admm_control%blocks(iblock)%list) 85 40 : jatom = admm_control%blocks(iblock)%list(j) 86 56 : admm_dm%block_map(iatom, jatom) = 1 87 : END DO 88 : END DO 89 : END DO 90 : END IF 91 14 : END SUBROUTINE admm_dm_create 92 : 93 : ! ************************************************************************************************** 94 : !> \brief Release a admm_dm type 95 : !> \param admm_dm ... 96 : !> \author Ole Schuett 97 : ! ************************************************************************************************** 98 14 : SUBROUTINE admm_dm_release(admm_dm) 99 : TYPE(admm_dm_type), POINTER :: admm_dm 100 : 101 14 : IF (.NOT. ASSOCIATED(admm_dm)) RETURN 102 : 103 14 : IF (ASSOCIATED(admm_dm%matrix_a)) THEN 104 10 : CALL dbcsr_release(admm_dm%matrix_a) 105 10 : DEALLOCATE (admm_dm%matrix_a) 106 : END IF 107 : 108 14 : IF (ASSOCIATED(admm_dm%block_map)) & 109 4 : DEALLOCATE (admm_dm%block_map) 110 : 111 14 : DEALLOCATE (admm_dm%mcweeny_history) 112 14 : DEALLOCATE (admm_dm) 113 : 114 : END SUBROUTINE admm_dm_release 115 : 116 0 : END MODULE admm_dm_types 117 :