Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2025 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 :
|