(git:6ba6522)
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, PUBLIC :: 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, modified=.false.)
196 mixing_store%iter_method = "Broy."
197 ELSE IF (mixing_method == modified_broyden_mixing_nr) THEN
198 CALL broyden_mixing(mixing_store, charges, imin, nvec, ns, para_env, modified=.true.)
199 mixing_store%iter_method = "MBroy"
200 ELSE IF (mixing_method == multisecant_mixing_nr) THEN
201 cpabort("Multisecant_mixing method not available for Charge Mixing")
202 ELSE IF (mixing_method == new_pulay_mixing_nr) THEN
203 cpabort("New Pulay method not available for Charge Mixing")
204 END IF
205
206 ! store new 'input' charges
207 DO ia = 1, mixing_store%nat_local
208 ii = mixing_store%atlist(ia)
209 mixing_store%acharge(ia, 1:ns, inow) = charges(ii, 1:ns)
210 END DO
211
212 END IF
213
214 CALL timestop(handle)
215
216 END SUBROUTINE charge_mixing
217
218! **************************************************************************************************
219!> \brief Map a raw tblite SCC residual to CP2K's EPS_SCF reporting scale.
220!> \param raw_error raw tblite SCC residual
221!> \param eps_scf CP2K SCF convergence threshold
222!> \param pconv tblite SCC convergence reference
223!> \return residual on the CP2K convergence scale
224! **************************************************************************************************
225 PURE FUNCTION tblite_scc_error_on_cp2k_scale(raw_error, eps_scf, pconv) RESULT(scaled_error)
226 REAL(kind=dp), INTENT(IN) :: raw_error, eps_scf, pconv
227 REAL(kind=dp) :: scaled_error
228
229 IF (eps_scf > 0.0_dp .AND. pconv > 0.0_dp) THEN
230 scaled_error = eps_scf*raw_error/pconv
231 ELSE
232 scaled_error = raw_error
233 END IF
234
236
237! **************************************************************************************************
238!> \brief Return the CP2K-side tblite SCC-mixer residual on the CP2K EPS_SCF scale.
239!> \param mixing_store ...
240!> \param eps_scf ...
241!> \return ...
242! **************************************************************************************************
243 FUNCTION charge_mixing_scc_error(mixing_store, eps_scf) RESULT(mixer_error)
244 TYPE(mixing_storage_type), POINTER :: mixing_store
245 REAL(kind=dp), INTENT(IN) :: eps_scf
246 REAL(kind=dp) :: mixer_error
247
248 mixer_error = 0.0_dp
249 IF (.NOT. ASSOCIATED(mixing_store)) RETURN
250 IF (mixing_store%tb_scc_mixer_step <= 1) RETURN
251
252 mixer_error = tblite_scc_error_on_cp2k_scale(mixing_store%tb_scc_mixer_error, &
253 eps_scf, tblite_scc_pconv)
254
255 END FUNCTION charge_mixing_scc_error
256
257! **************************************************************************************************
258!> \brief TBLite modified-Broyden mixing for a complete TB SCC-variable vector.
259!> \param mixing_store ...
260!> \param charges ...
261!> \param para_env ...
262!> \param iter_count ...
263!> \param damping ...
264!> \param memory ...
265!> \param omega0 ...
266!> \param min_weight ...
267!> \param max_weight ...
268!> \param weight_factor ...
269! **************************************************************************************************
270 SUBROUTINE tblite_charge_mixing(mixing_store, charges, para_env, iter_count, damping, memory, omega0, &
271 min_weight, max_weight, weight_factor)
272 TYPE(mixing_storage_type), POINTER :: mixing_store
273 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: charges
274 TYPE(mp_para_env_type), POINTER :: para_env
275 INTEGER, INTENT(IN) :: iter_count, memory
276 REAL(kind=dp), INTENT(IN) :: damping, max_weight, min_weight, omega0, &
277 weight_factor
278
279#if defined(__TBLITE)
280 TYPE(error_type), ALLOCATABLE :: error
281#endif
282 INTEGER :: natom, ndim, ns
283 LOGICAL :: on_source, reset_mixer
284 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: qvec
285
286 natom = SIZE(charges, 1)
287 ns = SIZE(charges, 2)
288 ndim = natom*ns
289 ALLOCATE (qvec(ndim))
290 qvec(:) = reshape(charges, [ndim])
291 on_source = para_env%mepos == para_env%source
292 reset_mixer = (iter_count == 1) .OR. (mixing_store%tb_scc_mixer_step == 0) .OR. &
293 (mixing_store%tb_scc_mixer_natom /= natom) .OR. &
294 (mixing_store%tb_scc_mixer_ns /= ns) .OR. &
295 (mixing_store%tb_scc_mixer_memory /= memory)
296 mixing_store%tb_scc_mixer_error = 0.0_dp
297
298#if defined(__TBLITE)
299 IF (reset_mixer) THEN
300 IF (ALLOCATED(mixing_store%tb_scc_mixer)) DEALLOCATE (mixing_store%tb_scc_mixer)
301 IF (on_source) THEN
302 CALL new_cp2k_tblite_mixer(mixing_store%tb_scc_mixer, memory, ndim, damping, omega0, &
303 min_weight, max_weight, weight_factor)
304 CALL mixing_store%tb_scc_mixer%set(qvec)
305 END IF
306 mixing_store%tb_scc_mixer_natom = natom
307 mixing_store%tb_scc_mixer_ns = ns
308 mixing_store%tb_scc_mixer_memory = memory
309 mixing_store%tb_scc_mixer_step = 1
310 mixing_store%iter_method = "NoMix"
311 CALL para_env%bcast(qvec)
312 charges = reshape(qvec, shape(charges))
313 RETURN
314 END IF
315
316 IF (on_source) THEN
317 cpassert(ALLOCATED(mixing_store%tb_scc_mixer))
318 CALL mixing_store%tb_scc_mixer%diff(qvec)
319 mixing_store%tb_scc_mixer_error = real(mixing_store%tb_scc_mixer%get_error(), kind=dp)
320 CALL mixing_store%tb_scc_mixer%next(error)
321 IF (ALLOCATED(error)) cpabort("tblite SCC mixer failed")
322 CALL mixing_store%tb_scc_mixer%get(qvec)
323 END IF
324 CALL para_env%bcast(qvec)
325 CALL para_env%bcast(mixing_store%tb_scc_mixer_error)
326 charges = reshape(qvec, shape(charges))
327 mixing_store%tb_scc_mixer_step = mixing_store%tb_scc_mixer_step + 1
328 mixing_store%iter_method = "TBLITE"
329#else
330 mark_used(mixing_store)
331 mark_used(charges)
332 mark_used(para_env)
333 mark_used(iter_count)
334 mark_used(damping)
335 mark_used(memory)
336 mark_used(omega0)
337 mark_used(min_weight)
338 mark_used(max_weight)
339 mark_used(weight_factor)
340 cpabort("SCC_MIXER TBLITE requires CP2K to be built with tblite")
341#endif
342
343 END SUBROUTINE tblite_charge_mixing
344
345! **************************************************************************************************
346!> \brief Simple charge mixing
347!> \param mixing_store ...
348!> \param charges ...
349!> \param alpha ...
350!> \param imin ...
351!> \param ns ...
352!> \param para_env ...
353!> \author JGH
354! **************************************************************************************************
355 SUBROUTINE mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
356 TYPE(mixing_storage_type), POINTER :: mixing_store
357 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: charges
358 REAL(kind=dp), INTENT(IN) :: alpha
359 INTEGER, INTENT(IN) :: imin, ns
360 TYPE(mp_para_env_type), POINTER :: para_env
361
362 INTEGER :: ia, ii
363
364 charges = 0.0_dp
365
366 DO ia = 1, mixing_store%nat_local
367 ii = mixing_store%atlist(ia)
368 charges(ii, 1:ns) = alpha*mixing_store%dacharge(ia, 1:ns, imin) - mixing_store%acharge(ia, 1:ns, imin)
369 END DO
370
371 CALL para_env%sum(charges)
372
373 END SUBROUTINE mix_charges_only
374
375! **************************************************************************************************
376!> \brief Broyden charge mixing
377!> \param mixing_store ...
378!> \param charges ...
379!> \param inow ...
380!> \param nvec ...
381!> \param ns ...
382!> \param para_env ...
383!> \param modified use dynamic residual weights of modified Broyden
384!> \author JGH
385! **************************************************************************************************
386 SUBROUTINE broyden_mixing(mixing_store, charges, inow, nvec, ns, para_env, modified)
387 TYPE(mixing_storage_type), POINTER :: mixing_store
388 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: charges
389 INTEGER, INTENT(IN) :: inow, nvec, ns
390 TYPE(mp_para_env_type), POINTER :: para_env
391 LOGICAL, INTENT(IN) :: modified
392
393 INTEGER :: i, ia, ii, imin, j, nbuffer, nv
394 REAL(kind=dp) :: alpha, broy_w0, res_norm, rskip, wdf, &
395 wprod
396 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: cvec, gammab
397 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: amat, beta
398 REAL(kind=dp), DIMENSION(:, :), POINTER :: dq_last, dq_now, q_last, q_now
399
400 cpassert(nvec > 1)
401
402 nbuffer = mixing_store%nbuffer
403 alpha = mixing_store%alpha
404 imin = inow - 1
405 IF (imin == 0) imin = nvec
406 nv = nvec - 1
407
408 ! charge vectors
409 q_now => mixing_store%acharge(:, :, inow)
410 q_last => mixing_store%acharge(:, :, imin)
411 dq_now => mixing_store%dacharge(:, :, inow)
412 dq_last => mixing_store%dacharge(:, :, imin)
413
414 IF (nvec == nbuffer) THEN
415 ! reshuffel Broyden storage n->n-1
416 DO i = 1, nv - 1
417 mixing_store%wbroy(i) = mixing_store%wbroy(i + 1)
418 mixing_store%dfbroy(:, :, i) = mixing_store%dfbroy(:, :, i + 1)
419 mixing_store%ubroy(:, :, i) = mixing_store%ubroy(:, :, i + 1)
420 END DO
421 DO i = 1, nv - 1
422 DO j = 1, nv - 1
423 mixing_store%abroy(i, j) = mixing_store%abroy(i + 1, j + 1)
424 END DO
425 END DO
426 END IF
427
428 broy_w0 = mixing_store%broy_w0
429 IF (modified) THEN
430 res_norm = sum(dq_now(:, 1:ns)**2)
431 CALL para_env%sum(res_norm)
432 res_norm = sqrt(res_norm)
433 IF (res_norm > mixing_store%wc/mixing_store%wmax) THEN
434 mixing_store%wbroy(nv) = mixing_store%wc/res_norm
435 ELSE
436 mixing_store%wbroy(nv) = mixing_store%wmax
437 END IF
438 mixing_store%wbroy(nv) = max(1.0_dp, mixing_store%wbroy(nv))
439 ELSE
440 mixing_store%wbroy(nv) = 1.0_dp
441 END IF
442
443 ! dfbroy
444 mixing_store%dfbroy(:, :, nv) = 0.0_dp
445 mixing_store%dfbroy(:, 1:ns, nv) = dq_now(:, 1:ns) - dq_last(:, 1:ns)
446 wdf = sum(mixing_store%dfbroy(:, 1:ns, nv)**2)
447 CALL para_env%sum(wdf)
448 IF (wdf > tiny(1.0_dp) .AND. wdf < huge(1.0_dp)) THEN
449 wdf = 1.0_dp/sqrt(wdf)
450 mixing_store%dfbroy(:, 1:ns, nv) = wdf*mixing_store%dfbroy(:, 1:ns, nv)
451 ELSE
452 ! Identical consecutive residuals do not define a Broyden direction.
453 ! Keep a zero history vector so it does not enter the Broyden update.
454 wdf = 0.0_dp
455 mixing_store%dfbroy(:, 1:ns, nv) = 0.0_dp
456 END IF
457
458 ! abroy matrix
459 DO i = 1, nv
460 wprod = sum(mixing_store%dfbroy(:, 1:ns, i)*mixing_store%dfbroy(:, 1:ns, nv))
461 CALL para_env%sum(wprod)
462 mixing_store%abroy(i, nv) = wprod
463 mixing_store%abroy(nv, i) = wprod
464 END DO
465
466 ! broyden matrices
467 ALLOCATE (amat(nv, nv), beta(nv, nv), cvec(nv), gammab(nv))
468 DO i = 1, nv
469 wprod = sum(mixing_store%dfbroy(:, 1:ns, i)*dq_now(:, 1:ns))
470 CALL para_env%sum(wprod)
471 cvec(i) = mixing_store%wbroy(i)*wprod
472 END DO
473
474 DO i = 1, nv
475 DO j = 1, nv
476 beta(j, i) = mixing_store%wbroy(j)*mixing_store%wbroy(i)*mixing_store%abroy(j, i)
477 END DO
478 IF (modified) THEN
479 beta(i, i) = beta(i, i) + broy_w0*broy_w0
480 ELSE
481 beta(i, i) = beta(i, i) + broy_w0
482 END IF
483 END DO
484
485 rskip = 1.e-12_dp
486 CALL get_pseudo_inverse_svd(beta, amat, rskip)
487 gammab(1:nv) = matmul(cvec(1:nv), amat(1:nv, 1:nv))
488
489 ! build ubroy
490 mixing_store%ubroy(:, :, nv) = 0.0_dp
491 mixing_store%ubroy(:, 1:ns, nv) = alpha*mixing_store%dfbroy(:, 1:ns, nv) + &
492 wdf*(q_now(:, 1:ns) - q_last(:, 1:ns))
493
494 charges = 0.0_dp
495 DO ia = 1, mixing_store%nat_local
496 ii = mixing_store%atlist(ia)
497 charges(ii, 1:ns) = q_now(ia, 1:ns) + alpha*dq_now(ia, 1:ns)
498 END DO
499 DO i = 1, nv
500 DO ia = 1, mixing_store%nat_local
501 ii = mixing_store%atlist(ia)
502 charges(ii, 1:ns) = charges(ii, 1:ns) - mixing_store%wbroy(i)*gammab(i)*mixing_store%ubroy(ia, 1:ns, i)
503 END DO
504 END DO
505 CALL para_env%sum(charges)
506
507 DEALLOCATE (amat, beta, cvec, gammab)
508
509 END SUBROUTINE broyden_mixing
510
511END 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.
pure real(kind=dp) function, public tblite_scc_error_on_cp2k_scale(raw_error, eps_scf, pconv)
Map a raw tblite SCC residual to CP2K's EPS_SCF reporting scale.
real(kind=dp), parameter, public tblite_scc_pconv
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