Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Data types for the ADIIS SCF subspace accelerator.
10 : ! **************************************************************************************************
11 : MODULE qs_scf_subspace_types
12 :
13 : USE cp_dbcsr_api, ONLY: dbcsr_deallocate_matrix,&
14 : dbcsr_p_type
15 : USE kinds, ONLY: dp
16 : #include "./base/base_uses.f90"
17 :
18 : IMPLICIT NONE
19 :
20 : PRIVATE
21 :
22 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_subspace_types'
23 :
24 : PUBLIC :: qs_scf_subspace_buffer_type, &
25 : qs_scf_subspace_buffer_clear, &
26 : qs_scf_subspace_buffer_create, &
27 : qs_scf_subspace_buffer_release
28 :
29 : ! **************************************************************************************************
30 : !> \brief History buffer holding strictly paired P and F[P] SCF states.
31 : !>
32 : !> Matrix history is stored in the real-space cell representation. This is
33 : !> the representation of the density that actually built the current KS
34 : !> matrix, and therefore applies to both Gamma-point and k-point runs.
35 : ! **************************************************************************************************
36 : TYPE qs_scf_subspace_buffer_type
37 : INTEGER :: nbuffer = 0
38 : INTEGER :: ncall = 0
39 : INTEGER :: nstored = 0
40 : INTEGER :: last_status = 0
41 : LOGICAL :: last_restart = .FALSE.
42 : LOGICAL :: use_combined_fock = .FALSE.
43 : REAL(KIND=dp) :: last_objective = 0.0_dp
44 : ! Total coefficient weight assigned to all entries older than the current raw Fock.
45 : REAL(KIND=dp) :: last_old_fock_weight = 0.0_dp
46 : REAL(KIND=dp) :: diis_weight = 0.0_dp
47 : TYPE(dbcsr_p_type), DIMENSION(:, :, :), POINTER :: density => NULL()
48 : TYPE(dbcsr_p_type), DIMENSION(:, :, :), POINTER :: fock => NULL()
49 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: combined_fock => NULL()
50 : INTEGER, DIMENSION(:), ALLOCATABLE :: generation
51 : REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE :: pf_metric
52 : REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: coefficients, state_energy
53 : ! Replicated conjugate variables for a separately represented operator term.
54 : REAL(dp), ALLOCATABLE :: density_aux(:, :, :), fock_aux(:, :, :), combined_aux(:, :)
55 : END TYPE qs_scf_subspace_buffer_type
56 :
57 : CONTAINS
58 :
59 : ! **************************************************************************************************
60 : !> \brief Initialize SCF subspace history metadata.
61 : !> \param buffer Buffer to initialize.
62 : !> \param nbuffer Maximum number of paired history entries.
63 : ! **************************************************************************************************
64 24 : PURE SUBROUTINE qs_scf_subspace_buffer_create(buffer, nbuffer)
65 :
66 : TYPE(qs_scf_subspace_buffer_type), INTENT(OUT) :: buffer
67 : INTEGER, INTENT(IN) :: nbuffer
68 :
69 24 : buffer%nbuffer = MAX(nbuffer, 0)
70 : buffer%ncall = 0
71 : buffer%nstored = 0
72 : buffer%last_status = 0
73 : buffer%last_restart = .FALSE.
74 : buffer%use_combined_fock = .FALSE.
75 : buffer%last_objective = 0.0_dp
76 : buffer%last_old_fock_weight = 0.0_dp
77 : buffer%diis_weight = 0.0_dp
78 : NULLIFY (buffer%density, buffer%fock, buffer%combined_fock)
79 :
80 24 : END SUBROUTINE qs_scf_subspace_buffer_create
81 :
82 : ! **************************************************************************************************
83 : !> \brief Clear logical history while retaining allocated matrix storage.
84 : !> \param buffer Buffer to clear.
85 : ! **************************************************************************************************
86 12 : PURE SUBROUTINE qs_scf_subspace_buffer_clear(buffer)
87 :
88 : TYPE(qs_scf_subspace_buffer_type), INTENT(INOUT) :: buffer
89 :
90 12 : buffer%ncall = 0
91 12 : buffer%nstored = 0
92 12 : buffer%last_status = 0
93 12 : buffer%last_restart = .FALSE.
94 12 : buffer%use_combined_fock = .FALSE.
95 12 : buffer%last_objective = 0.0_dp
96 12 : buffer%last_old_fock_weight = 0.0_dp
97 12 : buffer%diis_weight = 0.0_dp
98 12 : IF (ALLOCATED(buffer%generation)) buffer%generation = 0
99 12 : IF (ALLOCATED(buffer%pf_metric)) buffer%pf_metric = 0.0_dp
100 12 : IF (ALLOCATED(buffer%coefficients)) buffer%coefficients = 0.0_dp
101 12 : IF (ALLOCATED(buffer%state_energy)) buffer%state_energy = HUGE(1.0_dp)
102 :
103 12 : END SUBROUTINE qs_scf_subspace_buffer_clear
104 :
105 : ! **************************************************************************************************
106 : !> \brief Release all matrices and scalar storage owned by a subspace buffer.
107 : !> \param buffer Buffer to release.
108 : ! **************************************************************************************************
109 12 : SUBROUTINE qs_scf_subspace_buffer_release(buffer)
110 :
111 : TYPE(qs_scf_subspace_buffer_type), INTENT(INOUT) :: buffer
112 :
113 : INTEGER :: icell, islot, ispin
114 :
115 12 : IF (ASSOCIATED(buffer%density)) THEN
116 566 : DO icell = 1, SIZE(buffer%density, 3)
117 1602 : DO ispin = 1, SIZE(buffer%density, 2)
118 18166 : DO islot = 1, SIZE(buffer%density, 1)
119 17612 : IF (ASSOCIATED(buffer%density(islot, ispin, icell)%matrix)) THEN
120 16576 : CALL dbcsr_deallocate_matrix(buffer%density(islot, ispin, icell)%matrix)
121 : END IF
122 : END DO
123 : END DO
124 : END DO
125 12 : DEALLOCATE (buffer%density)
126 : END IF
127 :
128 12 : IF (ASSOCIATED(buffer%fock)) THEN
129 566 : DO icell = 1, SIZE(buffer%fock, 3)
130 1602 : DO ispin = 1, SIZE(buffer%fock, 2)
131 18166 : DO islot = 1, SIZE(buffer%fock, 1)
132 17612 : IF (ASSOCIATED(buffer%fock(islot, ispin, icell)%matrix)) THEN
133 16576 : CALL dbcsr_deallocate_matrix(buffer%fock(islot, ispin, icell)%matrix)
134 : END IF
135 : END DO
136 : END DO
137 : END DO
138 12 : DEALLOCATE (buffer%fock)
139 : END IF
140 :
141 12 : IF (ASSOCIATED(buffer%combined_fock)) THEN
142 566 : DO icell = 1, SIZE(buffer%combined_fock, 2)
143 1602 : DO ispin = 1, SIZE(buffer%combined_fock, 1)
144 1590 : IF (ASSOCIATED(buffer%combined_fock(ispin, icell)%matrix)) THEN
145 1036 : CALL dbcsr_deallocate_matrix(buffer%combined_fock(ispin, icell)%matrix)
146 : END IF
147 : END DO
148 : END DO
149 12 : DEALLOCATE (buffer%combined_fock)
150 : END IF
151 :
152 12 : IF (ALLOCATED(buffer%generation)) DEALLOCATE (buffer%generation)
153 12 : IF (ALLOCATED(buffer%pf_metric)) DEALLOCATE (buffer%pf_metric)
154 12 : IF (ALLOCATED(buffer%coefficients)) DEALLOCATE (buffer%coefficients)
155 12 : IF (ALLOCATED(buffer%state_energy)) DEALLOCATE (buffer%state_energy)
156 12 : IF (ALLOCATED(buffer%density_aux)) DEALLOCATE (buffer%density_aux, buffer%fock_aux, buffer%combined_aux)
157 12 : CALL qs_scf_subspace_buffer_create(buffer, 0)
158 :
159 12 : END SUBROUTINE qs_scf_subspace_buffer_release
160 :
161 0 : END MODULE qs_scf_subspace_types
|