(git:d3d49ac)
Loading...
Searching...
No Matches
qs_charge_mixing.F
Go to the documentation of this file.
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! **************************************************************************************************
10
11#if defined(__TBLITE)
12 USE mctc_env, ONLY: error_type
13 USE tblite_scc_mixer, ONLY: new_cp2k_tblite_mixer
14#endif
25 USE kinds, ONLY: dp
35#include "./base/base_uses.f90"
36
37 IMPLICIT NONE
38
39 PRIVATE
40
41 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_charge_mixing'
42
44
45 REAL(KIND=dp), PARAMETER, PRIVATE :: tblite_scc_pconv = 2.0e-5_dp
46
47CONTAINS
48
49! **************************************************************************************************
50!> \brief Driver for TB SCC variable mixing, calls the requested method.
51!> \param mixing_method ...
52!> \param mixing_store ...
53!> \param charges ...
54!> \param para_env ...
55!> \param iter_count ...
56!> \param scc_mixer ...
57!> \param tblite_mixer_iterations ...
58!> \param tblite_mixer_damping ...
59!> \param tblite_mixer_memory ...
60!> \param tblite_mixer_omega0 ...
61!> \param tblite_mixer_min_weight ...
62!> \param tblite_mixer_max_weight ...
63!> \param tblite_mixer_weight_factor ...
64!> \par History
65!> \author JGH
66! **************************************************************************************************
67 SUBROUTINE charge_mixing(mixing_method, mixing_store, charges, para_env, iter_count, &
68 scc_mixer, tblite_mixer_iterations, tblite_mixer_damping, &
69 tblite_mixer_memory, tblite_mixer_omega0, tblite_mixer_min_weight, &
70 tblite_mixer_max_weight, tblite_mixer_weight_factor)
71 INTEGER, INTENT(IN) :: mixing_method
72 TYPE(mixing_storage_type), POINTER :: mixing_store
73 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: charges
74 TYPE(mp_para_env_type), POINTER :: para_env
75 INTEGER, INTENT(IN) :: iter_count
76 INTEGER, INTENT(IN), OPTIONAL :: scc_mixer, tblite_mixer_iterations
77 REAL(kind=dp), INTENT(IN), OPTIONAL :: tblite_mixer_damping
78 INTEGER, INTENT(IN), OPTIONAL :: tblite_mixer_memory
79 REAL(kind=dp), INTENT(IN), OPTIONAL :: tblite_mixer_omega0, &
80 tblite_mixer_min_weight, &
81 tblite_mixer_max_weight, &
82 tblite_mixer_weight_factor
83
84 CHARACTER(len=*), PARAMETER :: routinen = 'charge_mixing'
85
86 INTEGER :: effective_scc_mixer, handle, ia, ii, &
87 imin, inow, nbuffer, ns, nvec
88 REAL(dp) :: alpha
89#if defined(__TBLITE)
90 INTEGER :: mixer_iterations, mixer_memory
91 REAL(dp) :: mixer_damping, mixer_max_weight, &
92 mixer_min_weight, mixer_omega0, &
93 mixer_weight_factor
94#endif
95
96 CALL timeset(routinen, handle)
97
98 effective_scc_mixer = tblite_scc_mixer_cp2k
99 IF (PRESENT(scc_mixer)) effective_scc_mixer = scc_mixer
100 IF (ASSOCIATED(mixing_store)) mixing_store%tb_scc_mixer_error = 0.0_dp
101
102 SELECT CASE (effective_scc_mixer)
104 ! Use the regular CP2K SCC-variable mixing path below.
106 cpassert(ASSOCIATED(mixing_store))
107#if defined(__TBLITE)
108 mixer_damping = tblite_mixer_damping_default
109 IF (PRESENT(tblite_mixer_damping)) mixer_damping = tblite_mixer_damping
110 IF (mixer_damping <= 0.0_dp) cpabort("tblite SCC mixer DAMPING must be positive")
111 mixer_omega0 = tblite_mixer_omega0_default
112 IF (PRESENT(tblite_mixer_omega0)) mixer_omega0 = tblite_mixer_omega0
113 IF (mixer_omega0 <= 0.0_dp) cpabort("tblite SCC mixer OMEGA0 must be positive")
114 mixer_min_weight = tblite_mixer_min_weight_default
115 IF (PRESENT(tblite_mixer_min_weight)) mixer_min_weight = tblite_mixer_min_weight
116 IF (mixer_min_weight <= 0.0_dp) cpabort("tblite SCC mixer MIN_WEIGHT must be positive")
117 mixer_max_weight = tblite_mixer_max_weight_default
118 IF (PRESENT(tblite_mixer_max_weight)) mixer_max_weight = tblite_mixer_max_weight
119 IF (mixer_max_weight <= 0.0_dp) cpabort("tblite SCC mixer MAX_WEIGHT must be positive")
120 IF (mixer_max_weight < mixer_min_weight) THEN
121 cpabort("tblite SCC mixer MAX_WEIGHT must not be smaller than MIN_WEIGHT")
122 END IF
123 mixer_weight_factor = tblite_mixer_weight_factor_default
124 IF (PRESENT(tblite_mixer_weight_factor)) mixer_weight_factor = tblite_mixer_weight_factor
125 IF (mixer_weight_factor <= 0.0_dp) cpabort("tblite SCC mixer WEIGHT_FACTOR must be positive")
126 mixer_iterations = tblite_mixer_iterations_default
127 IF (PRESENT(tblite_mixer_iterations)) mixer_iterations = tblite_mixer_iterations
128 IF (mixer_iterations < 1) cpabort("tblite SCC mixer ITERATIONS must be positive")
129 IF (iter_count > mixer_iterations) cpabort("tblite SCC mixer exceeded ITERATIONS")
130 mixer_memory = max(1, mixing_store%nbuffer)
131 IF (PRESENT(tblite_mixer_memory)) mixer_memory = tblite_mixer_memory
132 IF (mixer_memory < 1) cpabort("tblite SCC mixer MEMORY must be positive")
133 CALL tblite_charge_mixing(mixing_store, charges, para_env, iter_count, &
134 mixer_damping, mixer_memory, mixer_omega0, mixer_min_weight, &
135 mixer_max_weight, mixer_weight_factor)
136 CALL timestop(handle)
137 RETURN
138#else
139 mark_used(tblite_mixer_damping)
140 mark_used(tblite_mixer_iterations)
141 mark_used(tblite_mixer_max_weight)
142 mark_used(tblite_mixer_memory)
143 mark_used(tblite_mixer_min_weight)
144 mark_used(tblite_mixer_omega0)
145 mark_used(tblite_mixer_weight_factor)
146 IF (iter_count == 1) THEN
147 CALL cp_warn(__location__, &
148 "SCC_MIXER TBLITE requested but CP2K was built without tblite; "// &
149 "falling back to the CP2K SCC mixer.")
150 END IF
151#endif
153 IF (ASSOCIATED(mixing_store)) mixing_store%iter_method = "NoMix"
154 CALL timestop(handle)
155 RETURN
156 CASE DEFAULT
157 cpabort("Unknown SCC mixer for TB charge mixing")
158 END SELECT
159
160 IF (mixing_method >= gspace_mixing_nr) THEN
161 cpassert(ASSOCIATED(mixing_store))
162 mixing_store%ncall = mixing_store%ncall + 1
163 ns = SIZE(charges, 2)
164 IF (ns > mixing_store%max_shell) THEN
165 cpabort("Mixing storage too small for TB SCC variables")
166 END IF
167 alpha = mixing_store%alpha
168 nbuffer = mixing_store%nbuffer
169 inow = mod(mixing_store%ncall - 1, nbuffer) + 1
170 imin = inow - 1
171 IF (imin == 0) imin = nbuffer
172 IF (mixing_store%ncall > nbuffer) THEN
173 nvec = nbuffer
174 ELSE
175 nvec = mixing_store%ncall - 1
176 END IF
177 IF (mixing_store%ncall > 1) THEN
178 ! store in/out charge difference
179 DO ia = 1, mixing_store%nat_local
180 ii = mixing_store%atlist(ia)
181 mixing_store%dacharge(ia, 1:ns, imin) = mixing_store%acharge(ia, 1:ns, imin) - charges(ii, 1:ns)
182 END DO
183 END IF
184 IF ((iter_count == 1) .OR. (iter_count + 1 <= mixing_store%nskip_mixing)) THEN
185 ! skip mixing
186 mixing_store%iter_method = "NoMix"
187 ELSE IF (((iter_count + 1 - mixing_store%nskip_mixing) <= mixing_store%n_simple_mix) .OR. (nvec == 1)) THEN
188 CALL mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
189 mixing_store%iter_method = "Mixing"
190 ELSE IF (mixing_method == gspace_mixing_nr) THEN
191 cpabort("Kerker method not available for Charge Mixing")
192 ELSE IF (mixing_method == pulay_mixing_nr) THEN
193 cpabort("Pulay method not available for Charge Mixing")
194 ELSE IF (mixing_method == broyden_mixing_nr) THEN
195 CALL broyden_mixing(mixing_store, charges, imin, nvec, ns, para_env)
196 mixing_store%iter_method = "Broy."
197 ELSE IF (mixing_method == modified_broyden_mixing_nr) THEN
198 cpabort("Modified Broyden mixing is only available for DFT density mixing")
199 ELSE IF (mixing_method == multisecant_mixing_nr) THEN
200 cpabort("Multisecant_mixing method not available for Charge Mixing")
201 ELSE IF (mixing_method == new_pulay_mixing_nr) THEN
202 cpabort("New Pulay method not available for Charge Mixing")
203 END IF
204
205 ! store new 'input' charges
206 DO ia = 1, mixing_store%nat_local
207 ii = mixing_store%atlist(ia)
208 mixing_store%acharge(ia, 1:ns, inow) = charges(ii, 1:ns)
209 END DO
210
211 END IF
212
213 CALL timestop(handle)
214
215 END SUBROUTINE charge_mixing
216
217! **************************************************************************************************
218!> \brief Return the CP2K-side tblite SCC-mixer residual on the CP2K EPS_SCF scale.
219!> \param mixing_store ...
220!> \param eps_scf ...
221!> \return ...
222! **************************************************************************************************
223 FUNCTION charge_mixing_scc_error(mixing_store, eps_scf) RESULT(mixer_error)
224 TYPE(mixing_storage_type), POINTER :: mixing_store
225 REAL(kind=dp), INTENT(IN) :: eps_scf
226 REAL(kind=dp) :: mixer_error
227
228 mixer_error = 0.0_dp
229 IF (.NOT. ASSOCIATED(mixing_store)) RETURN
230 IF (mixing_store%tb_scc_mixer_step <= 1) RETURN
231
232 IF (eps_scf > 0.0_dp) THEN
233 mixer_error = eps_scf*mixing_store%tb_scc_mixer_error/tblite_scc_pconv
234 ELSE
235 mixer_error = mixing_store%tb_scc_mixer_error
236 END IF
237
238 END FUNCTION charge_mixing_scc_error
239
240! **************************************************************************************************
241!> \brief TBLite modified-Broyden mixing for a complete TB SCC-variable vector.
242!> \param mixing_store ...
243!> \param charges ...
244!> \param para_env ...
245!> \param iter_count ...
246!> \param damping ...
247!> \param memory ...
248!> \param omega0 ...
249!> \param min_weight ...
250!> \param max_weight ...
251!> \param weight_factor ...
252! **************************************************************************************************
253 SUBROUTINE tblite_charge_mixing(mixing_store, charges, para_env, iter_count, damping, memory, omega0, &
254 min_weight, max_weight, weight_factor)
255 TYPE(mixing_storage_type), POINTER :: mixing_store
256 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: charges
257 TYPE(mp_para_env_type), POINTER :: para_env
258 INTEGER, INTENT(IN) :: iter_count, memory
259 REAL(kind=dp), INTENT(IN) :: damping, max_weight, min_weight, omega0, &
260 weight_factor
261
262#if defined(__TBLITE)
263 TYPE(error_type), ALLOCATABLE :: error
264#endif
265 INTEGER :: natom, ndim, ns
266 LOGICAL :: on_source, reset_mixer
267 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: qvec
268
269 natom = SIZE(charges, 1)
270 ns = SIZE(charges, 2)
271 ndim = natom*ns
272 ALLOCATE (qvec(ndim))
273 qvec(:) = reshape(charges, [ndim])
274 on_source = para_env%mepos == para_env%source
275 reset_mixer = (iter_count == 1) .OR. (mixing_store%tb_scc_mixer_step == 0) .OR. &
276 (mixing_store%tb_scc_mixer_natom /= natom) .OR. &
277 (mixing_store%tb_scc_mixer_ns /= ns) .OR. &
278 (mixing_store%tb_scc_mixer_memory /= memory)
279 mixing_store%tb_scc_mixer_error = 0.0_dp
280
281#if defined(__TBLITE)
282 IF (reset_mixer) THEN
283 IF (ALLOCATED(mixing_store%tb_scc_mixer)) DEALLOCATE (mixing_store%tb_scc_mixer)
284 IF (on_source) THEN
285 CALL new_cp2k_tblite_mixer(mixing_store%tb_scc_mixer, memory, ndim, damping, omega0, &
286 min_weight, max_weight, weight_factor)
287 CALL mixing_store%tb_scc_mixer%set(qvec)
288 END IF
289 mixing_store%tb_scc_mixer_natom = natom
290 mixing_store%tb_scc_mixer_ns = ns
291 mixing_store%tb_scc_mixer_memory = memory
292 mixing_store%tb_scc_mixer_step = 1
293 mixing_store%iter_method = "NoMix"
294 CALL para_env%bcast(qvec)
295 charges = reshape(qvec, shape(charges))
296 RETURN
297 END IF
298
299 IF (on_source) THEN
300 cpassert(ALLOCATED(mixing_store%tb_scc_mixer))
301 CALL mixing_store%tb_scc_mixer%diff(qvec)
302 mixing_store%tb_scc_mixer_error = real(mixing_store%tb_scc_mixer%get_error(), kind=dp)
303 CALL mixing_store%tb_scc_mixer%next(error)
304 IF (ALLOCATED(error)) cpabort("tblite SCC mixer failed")
305 CALL mixing_store%tb_scc_mixer%get(qvec)
306 END IF
307 CALL para_env%bcast(qvec)
308 CALL para_env%bcast(mixing_store%tb_scc_mixer_error)
309 charges = reshape(qvec, shape(charges))
310 mixing_store%tb_scc_mixer_step = mixing_store%tb_scc_mixer_step + 1
311 mixing_store%iter_method = "TBLITE"
312#else
313 mark_used(mixing_store)
314 mark_used(charges)
315 mark_used(para_env)
316 mark_used(iter_count)
317 mark_used(damping)
318 mark_used(memory)
319 mark_used(omega0)
320 mark_used(min_weight)
321 mark_used(max_weight)
322 mark_used(weight_factor)
323 cpabort("SCC_MIXER TBLITE requires CP2K to be built with tblite")
324#endif
325
326 END SUBROUTINE tblite_charge_mixing
327
328! **************************************************************************************************
329!> \brief Simple charge mixing
330!> \param mixing_store ...
331!> \param charges ...
332!> \param alpha ...
333!> \param imin ...
334!> \param ns ...
335!> \param para_env ...
336!> \author JGH
337! **************************************************************************************************
338 SUBROUTINE mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
339 TYPE(mixing_storage_type), POINTER :: mixing_store
340 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: charges
341 REAL(kind=dp), INTENT(IN) :: alpha
342 INTEGER, INTENT(IN) :: imin, ns
343 TYPE(mp_para_env_type), POINTER :: para_env
344
345 INTEGER :: ia, ii
346
347 charges = 0.0_dp
348
349 DO ia = 1, mixing_store%nat_local
350 ii = mixing_store%atlist(ia)
351 charges(ii, 1:ns) = alpha*mixing_store%dacharge(ia, 1:ns, imin) - mixing_store%acharge(ia, 1:ns, imin)
352 END DO
353
354 CALL para_env%sum(charges)
355
356 END SUBROUTINE mix_charges_only
357
358! **************************************************************************************************
359!> \brief Broyden charge mixing
360!> \param mixing_store ...
361!> \param charges ...
362!> \param inow ...
363!> \param nvec ...
364!> \param ns ...
365!> \param para_env ...
366!> \author JGH
367! **************************************************************************************************
368 SUBROUTINE broyden_mixing(mixing_store, charges, inow, nvec, ns, para_env)
369 TYPE(mixing_storage_type), POINTER :: mixing_store
370 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: charges
371 INTEGER, INTENT(IN) :: inow, nvec, ns
372 TYPE(mp_para_env_type), POINTER :: para_env
373
374 INTEGER :: i, ia, ii, imin, j, nbuffer, nv
375 REAL(kind=dp) :: alpha, broy_w0, rskip, wdf, wprod
376 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: cvec, gammab
377 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: amat, beta
378 REAL(kind=dp), DIMENSION(:, :), POINTER :: dq_last, dq_now, q_last, q_now
379
380 cpassert(nvec > 1)
381
382 nbuffer = mixing_store%nbuffer
383 alpha = mixing_store%alpha
384 imin = inow - 1
385 IF (imin == 0) imin = nvec
386 nv = nvec - 1
387
388 ! charge vectors
389 q_now => mixing_store%acharge(:, :, inow)
390 q_last => mixing_store%acharge(:, :, imin)
391 dq_now => mixing_store%dacharge(:, :, inow)
392 dq_last => mixing_store%dacharge(:, :, imin)
393
394 IF (nvec == nbuffer) THEN
395 ! reshuffel Broyden storage n->n-1
396 DO i = 1, nv - 1
397 mixing_store%wbroy(i) = mixing_store%wbroy(i + 1)
398 mixing_store%dfbroy(:, :, i) = mixing_store%dfbroy(:, :, i + 1)
399 mixing_store%ubroy(:, :, i) = mixing_store%ubroy(:, :, i + 1)
400 END DO
401 DO i = 1, nv - 1
402 DO j = 1, nv - 1
403 mixing_store%abroy(i, j) = mixing_store%abroy(i + 1, j + 1)
404 END DO
405 END DO
406 END IF
407
408 broy_w0 = mixing_store%broy_w0
409 mixing_store%wbroy(nv) = 1.0_dp
410
411 ! dfbroy
412 mixing_store%dfbroy(:, :, nv) = 0.0_dp
413 mixing_store%dfbroy(:, 1:ns, nv) = dq_now(:, 1:ns) - dq_last(:, 1:ns)
414 wdf = sum(mixing_store%dfbroy(:, 1:ns, nv)**2)
415 CALL para_env%sum(wdf)
416 wdf = 1.0_dp/sqrt(wdf)
417 mixing_store%dfbroy(:, 1:ns, nv) = wdf*mixing_store%dfbroy(:, 1:ns, nv)
418
419 ! abroy matrix
420 DO i = 1, nv
421 wprod = sum(mixing_store%dfbroy(:, 1:ns, i)*mixing_store%dfbroy(:, 1:ns, nv))
422 CALL para_env%sum(wprod)
423 mixing_store%abroy(i, nv) = wprod
424 mixing_store%abroy(nv, i) = wprod
425 END DO
426
427 ! broyden matrices
428 ALLOCATE (amat(nv, nv), beta(nv, nv), cvec(nv), gammab(nv))
429 DO i = 1, nv
430 wprod = sum(mixing_store%dfbroy(:, 1:ns, i)*dq_now(:, 1:ns))
431 CALL para_env%sum(wprod)
432 cvec(i) = mixing_store%wbroy(i)*wprod
433 END DO
434
435 DO i = 1, nv
436 DO j = 1, nv
437 beta(j, i) = mixing_store%wbroy(j)*mixing_store%wbroy(i)*mixing_store%abroy(j, i)
438 END DO
439 beta(i, i) = beta(i, i) + broy_w0
440 END DO
441
442 rskip = 1.e-12_dp
443 CALL get_pseudo_inverse_svd(beta, amat, rskip)
444 gammab(1:nv) = matmul(cvec(1:nv), amat(1:nv, 1:nv))
445
446 ! build ubroy
447 mixing_store%ubroy(:, :, nv) = 0.0_dp
448 mixing_store%ubroy(:, 1:ns, nv) = alpha*mixing_store%dfbroy(:, 1:ns, nv) + &
449 wdf*(q_now(:, 1:ns) - q_last(:, 1:ns))
450
451 charges = 0.0_dp
452 DO ia = 1, mixing_store%nat_local
453 ii = mixing_store%atlist(ia)
454 charges(ii, 1:ns) = q_now(ia, 1:ns) + alpha*dq_now(ia, 1:ns)
455 END DO
456 DO i = 1, nv
457 DO ia = 1, mixing_store%nat_local
458 ii = mixing_store%atlist(ia)
459 charges(ii, 1:ns) = charges(ii, 1:ns) - mixing_store%wbroy(i)*gammab(i)*mixing_store%ubroy(ia, 1:ns, i)
460 END DO
461 END DO
462 CALL para_env%sum(charges)
463
464 DEALLOCATE (amat, beta, cvec, gammab)
465
466 END SUBROUTINE broyden_mixing
467
468END MODULE qs_charge_mixing
static int imin(int x, int y)
Returns the smaller of the two integers (missing from the C standard).
Definition dbm_miniapp.c:36
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public tblite_scc_mixer_cp2k
integer, parameter, public tblite_scc_mixer_none
real(kind=dp), parameter, public tblite_mixer_damping_default
integer, parameter, public tblite_scc_mixer_tblite
integer, parameter, public tblite_mixer_iterations_default
real(kind=dp), parameter, public tblite_mixer_max_weight_default
real(kind=dp), parameter, public tblite_mixer_omega0_default
integer, parameter, public tblite_scc_mixer_auto
real(kind=dp), parameter, public tblite_mixer_weight_factor_default
real(kind=dp), parameter, public tblite_mixer_min_weight_default
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
subroutine, public get_pseudo_inverse_svd(a, a_pinverse, rskip, determinant, sval)
returns the pseudoinverse of a real, square matrix using singular value decomposition
Definition mathlib.F:946
Interface to the message passing library MPI.
real(kind=dp) function, public charge_mixing_scc_error(mixing_store, eps_scf)
Return the CP2K-side tblite SCC-mixer residual on the CP2K EPS_SCF scale.
subroutine, public charge_mixing(mixing_method, mixing_store, charges, para_env, iter_count, scc_mixer, tblite_mixer_iterations, tblite_mixer_damping, tblite_mixer_memory, tblite_mixer_omega0, tblite_mixer_min_weight, tblite_mixer_max_weight, tblite_mixer_weight_factor)
Driver for TB SCC variable mixing, calls the requested method.
module that contains the definitions of the scf types
integer, parameter, public new_pulay_mixing_nr
integer, parameter, public broyden_mixing_nr
integer, parameter, public modified_broyden_mixing_nr
integer, parameter, public multisecant_mixing_nr
integer, parameter, public pulay_mixing_nr
integer, parameter, public gspace_mixing_nr
CP2K-side tblite-compatible SCC Broyden mixer.
stores all the informations relevant to an mpi environment