12 USE mctc_env,
ONLY: error_type
35#include "./base/base_uses.f90"
41 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_charge_mixing'
45 REAL(KIND=
dp),
PARAMETER,
PRIVATE :: tblite_scc_pconv = 2.0e-5_dp
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)
196 mixing_store%iter_method =
"Broy."
198 cpabort(
"Modified Broyden mixing is only available for DFT density mixing")
200 cpabort(
"Multisecant_mixing method not available for Charge Mixing")
202 cpabort(
"New Pulay method not available for Charge Mixing")
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)
213 CALL timestop(handle)
225 REAL(kind=
dp),
INTENT(IN) :: eps_scf
226 REAL(kind=
dp) :: mixer_error
229 IF (.NOT.
ASSOCIATED(mixing_store))
RETURN
230 IF (mixing_store%tb_scc_mixer_step <= 1)
RETURN
232 IF (eps_scf > 0.0_dp)
THEN
233 mixer_error = eps_scf*mixing_store%tb_scc_mixer_error/tblite_scc_pconv
235 mixer_error = mixing_store%tb_scc_mixer_error
253 SUBROUTINE tblite_charge_mixing(mixing_store, charges, para_env, iter_count, damping, memory, omega0, &
254 min_weight, max_weight, weight_factor)
256 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: charges
258 INTEGER,
INTENT(IN) :: iter_count, memory
259 REAL(kind=
dp),
INTENT(IN) :: damping, max_weight, min_weight, omega0, &
263 TYPE(error_type),
ALLOCATABLE :: error
265 INTEGER :: natom, ndim, ns
266 LOGICAL :: on_source, reset_mixer
267 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: qvec
269 natom =
SIZE(charges, 1)
270 ns =
SIZE(charges, 2)
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
282 IF (reset_mixer)
THEN
283 IF (
ALLOCATED(mixing_store%tb_scc_mixer))
DEALLOCATE (mixing_store%tb_scc_mixer)
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)
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))
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)
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"
313 mark_used(mixing_store)
316 mark_used(iter_count)
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")
326 END SUBROUTINE tblite_charge_mixing
338 SUBROUTINE mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
340 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: charges
341 REAL(kind=
dp),
INTENT(IN) :: alpha
342 INTEGER,
INTENT(IN) ::
imin, ns
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)
354 CALL para_env%sum(charges)
356 END SUBROUTINE mix_charges_only
368 SUBROUTINE broyden_mixing(mixing_store, charges, inow, nvec, ns, para_env)
370 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: charges
371 INTEGER,
INTENT(IN) :: inow, nvec, ns
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
382 nbuffer = mixing_store%nbuffer
383 alpha = mixing_store%alpha
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)
394 IF (nvec == nbuffer)
THEN
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)
403 mixing_store%abroy(i, j) = mixing_store%abroy(i + 1, j + 1)
408 broy_w0 = mixing_store%broy_w0
409 mixing_store%wbroy(nv) = 1.0_dp
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)
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
428 ALLOCATE (amat(nv, nv), beta(nv, nv), cvec(nv), gammab(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
437 beta(j, i) = mixing_store%wbroy(j)*mixing_store%wbroy(i)*mixing_store%abroy(j, i)
439 beta(i, i) = beta(i, i) + broy_w0
444 gammab(1:nv) = matmul(cvec(1:nv), amat(1:nv, 1:nv))
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))
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)
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)
462 CALL para_env%sum(charges)
464 DEALLOCATE (amat, beta, cvec, gammab)
466 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.
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