12 USE mctc_env,
ONLY: error_type
35#include "./base/base_uses.f90"
41 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_charge_mixing'
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
73 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: charges
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
84 CHARACTER(len=*),
PARAMETER :: routinen =
'charge_mixing'
86 INTEGER :: effective_scc_mixer, handle, ia, ii, &
87 imin, inow, nbuffer, ns, nvec
90 INTEGER :: mixer_iterations, mixer_memory
91 REAL(
dp) :: mixer_damping, mixer_max_weight, &
92 mixer_min_weight, mixer_omega0, &
96 CALL timeset(routinen, handle)
99 IF (
PRESENT(scc_mixer)) effective_scc_mixer = scc_mixer
100 IF (
ASSOCIATED(mixing_store)) mixing_store%tb_scc_mixer_error = 0.0_dp
102 SELECT CASE (effective_scc_mixer)
106 cpassert(
ASSOCIATED(mixing_store))
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")
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")
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")
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")
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")
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)
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.")
153 IF (
ASSOCIATED(mixing_store)) mixing_store%iter_method =
"NoMix"
154 CALL timestop(handle)
157 cpabort(
"Unknown SCC mixer for TB charge mixing")
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")
167 alpha = mixing_store%alpha
168 nbuffer = mixing_store%nbuffer
169 inow = mod(mixing_store%ncall - 1, nbuffer) + 1
172 IF (mixing_store%ncall > nbuffer)
THEN
175 nvec = mixing_store%ncall - 1
177 IF (mixing_store%ncall > 1)
THEN
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)
184 IF ((iter_count == 1) .OR. (iter_count + 1 <= mixing_store%nskip_mixing))
THEN
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"
191 cpabort(
"Kerker method not available for Charge Mixing")
193 cpabort(
"Pulay method not available for Charge Mixing")
195 CALL broyden_mixing(mixing_store, charges,
imin, nvec, ns, para_env, modified=.false.)
196 mixing_store%iter_method =
"Broy."
198 CALL broyden_mixing(mixing_store, charges,
imin, nvec, ns, para_env, modified=.true.)
199 mixing_store%iter_method =
"MBroy"
201 cpabort(
"Multisecant_mixing method not available for Charge Mixing")
203 cpabort(
"New Pulay method not available for Charge Mixing")
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)
214 CALL timestop(handle)
226 REAL(kind=
dp),
INTENT(IN) :: raw_error, eps_scf, pconv
227 REAL(kind=
dp) :: scaled_error
229 IF (eps_scf > 0.0_dp .AND. pconv > 0.0_dp)
THEN
230 scaled_error = eps_scf*raw_error/pconv
232 scaled_error = raw_error
245 REAL(kind=
dp),
INTENT(IN) :: eps_scf
246 REAL(kind=
dp) :: mixer_error
249 IF (.NOT.
ASSOCIATED(mixing_store))
RETURN
250 IF (mixing_store%tb_scc_mixer_step <= 1)
RETURN
270 SUBROUTINE tblite_charge_mixing(mixing_store, charges, para_env, iter_count, damping, memory, omega0, &
271 min_weight, max_weight, weight_factor)
273 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: charges
275 INTEGER,
INTENT(IN) :: iter_count, memory
276 REAL(kind=
dp),
INTENT(IN) :: damping, max_weight, min_weight, omega0, &
280 TYPE(error_type),
ALLOCATABLE :: error
282 INTEGER :: natom, ndim, ns
283 LOGICAL :: on_source, reset_mixer
284 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: qvec
286 natom =
SIZE(charges, 1)
287 ns =
SIZE(charges, 2)
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
299 IF (reset_mixer)
THEN
300 IF (
ALLOCATED(mixing_store%tb_scc_mixer))
DEALLOCATE (mixing_store%tb_scc_mixer)
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)
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))
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)
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"
330 mark_used(mixing_store)
333 mark_used(iter_count)
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")
343 END SUBROUTINE tblite_charge_mixing
355 SUBROUTINE mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
357 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: charges
358 REAL(kind=
dp),
INTENT(IN) :: alpha
359 INTEGER,
INTENT(IN) ::
imin, ns
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)
371 CALL para_env%sum(charges)
373 END SUBROUTINE mix_charges_only
386 SUBROUTINE broyden_mixing(mixing_store, charges, inow, nvec, ns, para_env, modified)
388 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: charges
389 INTEGER,
INTENT(IN) :: inow, nvec, ns
391 LOGICAL,
INTENT(IN) :: modified
393 INTEGER :: i, ia, ii,
imin, j, nbuffer, nv
394 REAL(kind=
dp) :: alpha, broy_w0, res_norm, rskip, wdf, &
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
402 nbuffer = mixing_store%nbuffer
403 alpha = mixing_store%alpha
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)
414 IF (nvec == nbuffer)
THEN
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)
423 mixing_store%abroy(i, j) = mixing_store%abroy(i + 1, j + 1)
428 broy_w0 = mixing_store%broy_w0
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
436 mixing_store%wbroy(nv) = mixing_store%wmax
438 mixing_store%wbroy(nv) = max(1.0_dp, mixing_store%wbroy(nv))
440 mixing_store%wbroy(nv) = 1.0_dp
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)
455 mixing_store%dfbroy(:, 1:ns, nv) = 0.0_dp
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
467 ALLOCATE (amat(nv, nv), beta(nv, nv), cvec(nv), gammab(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
476 beta(j, i) = mixing_store%wbroy(j)*mixing_store%wbroy(i)*mixing_store%abroy(j, i)
479 beta(i, i) = beta(i, i) + broy_w0*broy_w0
481 beta(i, i) = beta(i, i) + broy_w0
487 gammab(1:nv) = matmul(cvec(1:nv), amat(1:nv, 1:nv))
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))
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)
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)
505 CALL para_env%sum(charges)
507 DEALLOCATE (amat, beta, cvec, gammab)
509 END SUBROUTINE broyden_mixing
static int imin(int x, int y)
Returns the smaller of the two integers (missing from the C standard).
Defines the basic variable types.
integer, parameter, public dp
Collection of simple mathematical functions and subroutines.
subroutine, public get_pseudo_inverse_svd(a, a_pinverse, rskip, determinant, sval)
returns the pseudoinverse of a real, square matrix using singular value decomposition
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