(git:b279b6b)
qs_mixing_utils.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
10 
11  USE cp_control_types, ONLY: dft_control_type
14  USE dbcsr_api, ONLY: dbcsr_create,&
15  dbcsr_p_type,&
16  dbcsr_set,&
17  dbcsr_type,&
18  dbcsr_type_symmetric
19  USE distribution_1d_types, ONLY: distribution_1d_type
20  USE kinds, ONLY: dp
21  USE message_passing, ONLY: mp_para_env_type
22  USE pw_types, ONLY: pw_c1d_gs_type
25  mixing_storage_type,&
28  USE qs_environment_types, ONLY: get_qs_env,&
29  qs_environment_type
30  USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type
31  USE qs_rho_atom_types, ONLY: rho_atom_type
32  USE qs_rho_types, ONLY: qs_rho_get,&
33  qs_rho_type
34  USE qs_scf_methods, ONLY: cp_sm_mix
35 #include "./base/base_uses.f90"
36 
37  IMPLICIT NONE
38 
39  PRIVATE
40 
41  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_mixing_utils'
42 
45 
46 CONTAINS
47 
48 ! **************************************************************************************************
49 !> \brief ...
50 !> \param rho_ao ...
51 !> \param p_delta ...
52 !> \param para_env ...
53 !> \param p_out ...
54 !> \param delta ...
55 ! **************************************************************************************************
56  SUBROUTINE self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
57  TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao, p_delta
58  TYPE(mp_para_env_type), POINTER :: para_env
59  TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: p_out
60  REAL(kind=dp), INTENT(INOUT) :: delta
61 
62  CHARACTER(len=*), PARAMETER :: routinen = 'self_consistency_check'
63 
64  INTEGER :: handle, ic, ispin, nimg, nspins
65  REAL(kind=dp) :: tmp
66  TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_q, p_in
67 
68  CALL timeset(routinen, handle)
69 
70  NULLIFY (matrix_q, p_in)
71 
72  cpassert(ASSOCIATED(p_out))
73  NULLIFY (matrix_q, p_in)
74  p_in => rho_ao
75  matrix_q => p_delta
76  nspins = SIZE(p_in, 1)
77  nimg = SIZE(p_in, 2)
78 
79  ! Compute the difference (p_out - p_in)and check convergence
80  delta = 0.0_dp
81  DO ispin = 1, nspins
82  DO ic = 1, nimg
83  CALL dbcsr_set(matrix_q(ispin, ic)%matrix, 0.0_dp)
84  CALL cp_sm_mix(m1=p_out(ispin, ic)%matrix, m2=p_in(ispin, ic)%matrix, &
85  p_mix=1.0_dp, delta=tmp, para_env=para_env, &
86  m3=matrix_q(ispin, ic)%matrix)
87  delta = max(tmp, delta)
88  END DO
89  END DO
90  CALL timestop(handle)
91 
92  END SUBROUTINE self_consistency_check
93 
94 ! **************************************************************************************************
95 !> \brief allocation needed when density mixing is used
96 !> \param qs_env ...
97 !> \param mixing_method ...
98 !> \param p_mix_new ...
99 !> \param p_delta ...
100 !> \param nspins ...
101 !> \param mixing_store ...
102 !> \par History
103 !> 05.2009 created [MI]
104 !> 08.2014 kpoints [JGH]
105 !> 02.2015 changed input to make g-space mixing available in linear scaling SCF [Patrick Seewald]
106 !> 02.2019 charge mixing [JGH]
107 !> \author fawzi
108 ! **************************************************************************************************
109  SUBROUTINE mixing_allocate(qs_env, mixing_method, p_mix_new, p_delta, nspins, mixing_store)
110  TYPE(qs_environment_type), POINTER :: qs_env
111  INTEGER :: mixing_method
112  TYPE(dbcsr_p_type), DIMENSION(:, :), OPTIONAL, &
113  POINTER :: p_mix_new, p_delta
114  INTEGER, INTENT(IN) :: nspins
115  TYPE(mixing_storage_type), POINTER :: mixing_store
116 
117  CHARACTER(LEN=*), PARAMETER :: routinen = 'mixing_allocate'
118 
119  INTEGER :: handle, i, ia, iat, ic, ikind, ispin, &
120  max_shell, na, natom, nbuffer, nel, &
121  nimg, nkind
122  LOGICAL :: charge_mixing
123  TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
124  TYPE(dbcsr_type), POINTER :: refmatrix
125  TYPE(dft_control_type), POINTER :: dft_control
126  TYPE(distribution_1d_type), POINTER :: distribution_1d
127  TYPE(neighbor_list_set_p_type), DIMENSION(:), &
128  POINTER :: sab_orb
129  TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom
130 
131  CALL timeset(routinen, handle)
132 
133  NULLIFY (matrix_s, dft_control, sab_orb, refmatrix, rho_atom)
134  CALL get_qs_env(qs_env, &
135  sab_orb=sab_orb, &
136  matrix_s_kp=matrix_s, &
137  dft_control=dft_control)
138 
139  charge_mixing = dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb &
140  .OR. dft_control%qs_control%semi_empirical
141  refmatrix => matrix_s(1, 1)%matrix
142  nimg = dft_control%nimages
143 
144  ! *** allocate p_mix_new ***
145  IF (PRESENT(p_mix_new)) THEN
146  IF (.NOT. ASSOCIATED(p_mix_new)) THEN
147  CALL dbcsr_allocate_matrix_set(p_mix_new, nspins, nimg)
148  DO i = 1, nspins
149  DO ic = 1, nimg
150  ALLOCATE (p_mix_new(i, ic)%matrix)
151  CALL dbcsr_create(matrix=p_mix_new(i, ic)%matrix, template=refmatrix, &
152  name="SCF DENSITY", matrix_type=dbcsr_type_symmetric, nze=0)
153  CALL cp_dbcsr_alloc_block_from_nbl(p_mix_new(i, ic)%matrix, sab_orb)
154  CALL dbcsr_set(p_mix_new(i, ic)%matrix, 0.0_dp)
155  END DO
156  END DO
157  END IF
158  END IF
159 
160  ! *** allocate p_delta ***
161  IF (PRESENT(p_delta)) THEN
162  IF (mixing_method >= gspace_mixing_nr) THEN
163  IF (.NOT. ASSOCIATED(p_delta)) THEN
164  CALL dbcsr_allocate_matrix_set(p_delta, nspins, nimg)
165  DO i = 1, nspins
166  DO ic = 1, nimg
167  ALLOCATE (p_delta(i, ic)%matrix)
168  CALL dbcsr_create(matrix=p_delta(i, ic)%matrix, template=refmatrix, &
169  name="SCF DENSITY", matrix_type=dbcsr_type_symmetric, nze=0)
170  CALL cp_dbcsr_alloc_block_from_nbl(p_delta(i, ic)%matrix, sab_orb)
171  CALL dbcsr_set(p_delta(i, ic)%matrix, 0.0_dp)
172  END DO
173  END DO
174  END IF
175  cpassert(ASSOCIATED(mixing_store))
176  END IF
177  END IF
178 
179  IF (charge_mixing) THEN
180  ! *** allocate buffer for charge mixing ***
181  IF (mixing_method >= gspace_mixing_nr) THEN
182  cpassert(.NOT. mixing_store%gmix_p)
183  IF (dft_control%qs_control%dftb) THEN
184  max_shell = 1
185  ELSEIF (dft_control%qs_control%xtb) THEN
186  max_shell = 5
187  ELSE
188  cpabort('UNKNOWN METHOD')
189  END IF
190  nbuffer = mixing_store%nbuffer
191  mixing_store%ncall = 0
192  CALL get_qs_env(qs_env, local_particles=distribution_1d)
193  nkind = SIZE(distribution_1d%n_el)
194  na = sum(distribution_1d%n_el(:))
195  IF (ASSOCIATED(mixing_store%atlist)) DEALLOCATE (mixing_store%atlist)
196  ALLOCATE (mixing_store%atlist(na))
197  mixing_store%nat_local = na
198  mixing_store%max_shell = max_shell
199  ia = 0
200  DO ikind = 1, nkind
201  nel = distribution_1d%n_el(ikind)
202  DO iat = 1, nel
203  ia = ia + 1
204  mixing_store%atlist(ia) = distribution_1d%list(ikind)%array(iat)
205  END DO
206  END DO
207  IF (ASSOCIATED(mixing_store%acharge)) DEALLOCATE (mixing_store%acharge)
208  ALLOCATE (mixing_store%acharge(na, max_shell, nbuffer))
209  IF (ASSOCIATED(mixing_store%dacharge)) DEALLOCATE (mixing_store%dacharge)
210  ALLOCATE (mixing_store%dacharge(na, max_shell, nbuffer))
211  END IF
212  IF (mixing_method == pulay_mixing_nr) THEN
213  IF (ASSOCIATED(mixing_store%pulay_matrix)) DEALLOCATE (mixing_store%pulay_matrix)
214  ALLOCATE (mixing_store%pulay_matrix(nbuffer, nbuffer, nspins))
215  mixing_store%pulay_matrix = 0.0_dp
216  ELSEIF (mixing_method == broyden_mixing_nr) THEN
217  IF (ASSOCIATED(mixing_store%abroy)) DEALLOCATE (mixing_store%abroy)
218  ALLOCATE (mixing_store%abroy(nbuffer, nbuffer))
219  mixing_store%abroy = 0.0_dp
220  IF (ASSOCIATED(mixing_store%wbroy)) DEALLOCATE (mixing_store%wbroy)
221  ALLOCATE (mixing_store%wbroy(nbuffer))
222  mixing_store%wbroy = 0.0_dp
223  IF (ASSOCIATED(mixing_store%dfbroy)) DEALLOCATE (mixing_store%dfbroy)
224  ALLOCATE (mixing_store%dfbroy(na, max_shell, nbuffer))
225  mixing_store%dfbroy = 0.0_dp
226  IF (ASSOCIATED(mixing_store%ubroy)) DEALLOCATE (mixing_store%ubroy)
227  ALLOCATE (mixing_store%ubroy(na, max_shell, nbuffer))
228  mixing_store%ubroy = 0.0_dp
229  ELSEIF (mixing_method == multisecant_mixing_nr) THEN
230  cpabort("multisecant_mixing not available")
231  END IF
232  ELSE
233  ! *** allocate buffer for gspace mixing ***
234  IF (mixing_method >= gspace_mixing_nr) THEN
235  nbuffer = mixing_store%nbuffer
236  mixing_store%ncall = 0
237  IF (.NOT. ASSOCIATED(mixing_store%rhoin)) THEN
238  ALLOCATE (mixing_store%rhoin(nspins))
239  DO ispin = 1, nspins
240  NULLIFY (mixing_store%rhoin(ispin)%cc)
241  END DO
242  END IF
243 
244  IF (mixing_store%gmix_p .AND. dft_control%qs_control%gapw) THEN
245  CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
246  natom = SIZE(rho_atom)
247  IF (.NOT. ASSOCIATED(mixing_store%paw)) THEN
248  ALLOCATE (mixing_store%paw(natom))
249  mixing_store%paw = .false.
250  ALLOCATE (mixing_store%cpc_h_in(natom, nspins))
251  ALLOCATE (mixing_store%cpc_s_in(natom, nspins))
252  DO ispin = 1, nspins
253  DO iat = 1, natom
254  NULLIFY (mixing_store%cpc_h_in(iat, ispin)%r_coef)
255  NULLIFY (mixing_store%cpc_s_in(iat, ispin)%r_coef)
256  END DO
257  END DO
258  END IF
259  END IF
260  END IF
261 
262  ! *** allocare res_buffer if needed
263  IF (mixing_method >= pulay_mixing_nr) THEN
264  IF (.NOT. ASSOCIATED(mixing_store%res_buffer)) THEN
265  ALLOCATE (mixing_store%res_buffer(nbuffer, nspins))
266  DO ispin = 1, nspins
267  DO i = 1, nbuffer
268  NULLIFY (mixing_store%res_buffer(i, ispin)%cc)
269  END DO
270  END DO
271  END IF
272  END IF
273 
274  ! *** allocate pulay
275  IF (mixing_method == pulay_mixing_nr) THEN
276  IF (.NOT. ASSOCIATED(mixing_store%pulay_matrix)) THEN
277  ALLOCATE (mixing_store%pulay_matrix(nbuffer, nbuffer, nspins))
278  END IF
279 
280  IF (.NOT. ASSOCIATED(mixing_store%rhoin_buffer)) THEN
281  ALLOCATE (mixing_store%rhoin_buffer(nbuffer, nspins))
282  DO ispin = 1, nspins
283  DO i = 1, nbuffer
284  NULLIFY (mixing_store%rhoin_buffer(i, ispin)%cc)
285  END DO
286  END DO
287  END IF
288  IF (mixing_store%gmix_p) THEN
289  IF (dft_control%qs_control%gapw) THEN
290  IF (.NOT. ASSOCIATED(mixing_store%cpc_h_in_buffer)) THEN
291  ALLOCATE (mixing_store%cpc_h_in_buffer(nbuffer, natom, nspins))
292  ALLOCATE (mixing_store%cpc_s_in_buffer(nbuffer, natom, nspins))
293  ALLOCATE (mixing_store%cpc_h_res_buffer(nbuffer, natom, nspins))
294  ALLOCATE (mixing_store%cpc_s_res_buffer(nbuffer, natom, nspins))
295  DO ispin = 1, nspins
296  DO iat = 1, natom
297  DO i = 1, nbuffer
298  NULLIFY (mixing_store%cpc_h_in_buffer(i, iat, ispin)%r_coef)
299  NULLIFY (mixing_store%cpc_s_in_buffer(i, iat, ispin)%r_coef)
300  NULLIFY (mixing_store%cpc_h_res_buffer(i, iat, ispin)%r_coef)
301  NULLIFY (mixing_store%cpc_s_res_buffer(i, iat, ispin)%r_coef)
302  END DO
303  END DO
304  END DO
305  END IF
306  END IF
307  END IF
308 
309  END IF
310  ! *** allocate broyden buffer ***
311  IF (mixing_method == broyden_mixing_nr) THEN
312  IF (.NOT. ASSOCIATED(mixing_store%rhoin_old)) THEN
313  ALLOCATE (mixing_store%rhoin_old(nspins))
314  DO ispin = 1, nspins
315  NULLIFY (mixing_store%rhoin_old(ispin)%cc)
316  END DO
317  END IF
318  IF (.NOT. ASSOCIATED(mixing_store%drho_buffer)) THEN
319  ALLOCATE (mixing_store%drho_buffer(nbuffer, nspins))
320  ALLOCATE (mixing_store%last_res(nspins))
321  DO ispin = 1, nspins
322  DO i = 1, nbuffer
323  NULLIFY (mixing_store%drho_buffer(i, ispin)%cc)
324  END DO
325  NULLIFY (mixing_store%last_res(ispin)%cc)
326  END DO
327  END IF
328  IF (mixing_store%gmix_p) THEN
329 
330  IF (dft_control%qs_control%gapw) THEN
331  IF (.NOT. ASSOCIATED(mixing_store%cpc_h_old)) THEN
332  ALLOCATE (mixing_store%cpc_h_old(natom, nspins))
333  ALLOCATE (mixing_store%cpc_s_old(natom, nspins))
334  DO ispin = 1, nspins
335  DO iat = 1, natom
336  NULLIFY (mixing_store%cpc_h_old(iat, ispin)%r_coef)
337  NULLIFY (mixing_store%cpc_s_old(iat, ispin)%r_coef)
338  END DO
339  END DO
340  END IF
341  IF (.NOT. ASSOCIATED(mixing_store%dcpc_h_in)) THEN
342  ALLOCATE (mixing_store%dcpc_h_in(nbuffer, natom, nspins))
343  ALLOCATE (mixing_store%dcpc_s_in(nbuffer, natom, nspins))
344  ALLOCATE (mixing_store%cpc_h_lastres(natom, nspins))
345  ALLOCATE (mixing_store%cpc_s_lastres(natom, nspins))
346  DO ispin = 1, nspins
347  DO iat = 1, natom
348  DO i = 1, nbuffer
349  NULLIFY (mixing_store%dcpc_h_in(i, iat, ispin)%r_coef)
350  NULLIFY (mixing_store%dcpc_s_in(i, iat, ispin)%r_coef)
351  END DO
352  NULLIFY (mixing_store%cpc_h_lastres(iat, ispin)%r_coef)
353  NULLIFY (mixing_store%cpc_s_lastres(iat, ispin)%r_coef)
354  END DO
355  END DO
356  END IF
357  END IF
358  END IF
359  END IF
360 
361  ! *** allocate multisecant buffer ***
362  IF (mixing_method == multisecant_mixing_nr) THEN
363  IF (.NOT. ASSOCIATED(mixing_store%norm_res_buffer)) THEN
364  ALLOCATE (mixing_store%norm_res_buffer(nbuffer, nspins))
365  END IF
366  END IF
367 
368  IF (mixing_method == multisecant_mixing_nr) THEN
369  IF (.NOT. ASSOCIATED(mixing_store%rhoin_buffer)) THEN
370  ALLOCATE (mixing_store%rhoin_buffer(nbuffer, nspins))
371  DO ispin = 1, nspins
372  DO i = 1, nbuffer
373  NULLIFY (mixing_store%rhoin_buffer(i, ispin)%cc)
374  END DO
375  END DO
376  END IF
377  END IF
378 
379  END IF
380 
381  CALL timestop(handle)
382 
383  END SUBROUTINE mixing_allocate
384 
385 ! **************************************************************************************************
386 !> \brief initialiation needed when gspace mixing is used
387 !> \param mixing_method ...
388 !> \param rho ...
389 !> \param mixing_store ...
390 !> \param para_env ...
391 !> \param rho_atom ...
392 !> \par History
393 !> 05.2009 created [MI]
394 !> \author MI
395 ! **************************************************************************************************
396  SUBROUTINE mixing_init(mixing_method, rho, mixing_store, para_env, rho_atom)
397  INTEGER, INTENT(IN) :: mixing_method
398  TYPE(qs_rho_type), POINTER :: rho
399  TYPE(mixing_storage_type), POINTER :: mixing_store
400  TYPE(mp_para_env_type), POINTER :: para_env
401  TYPE(rho_atom_type), DIMENSION(:), OPTIONAL, &
402  POINTER :: rho_atom
403 
404  CHARACTER(len=*), PARAMETER :: routinen = 'mixing_init'
405 
406  INTEGER :: handle, iat, ib, ig, ig1, ig_count, &
407  iproc, ispin, n1, n2, natom, nbuffer, &
408  ng, nimg, nspin
409  REAL(dp) :: bconst, beta, fdamp, g2max, g2min, kmin
410  REAL(dp), DIMENSION(:), POINTER :: g2
411  REAL(dp), DIMENSION(:, :), POINTER :: g_vec
412  TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
413  TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
414 
415  CALL timeset(routinen, handle)
416 
417  NULLIFY (g2, g_vec, rho_ao_kp, rho_g)
418  CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, rho_g=rho_g)
419 
420  nspin = SIZE(rho_g)
421  ng = SIZE(rho_g(1)%pw_grid%gsq, 1)
422  nimg = SIZE(rho_ao_kp, 2)
423  mixing_store%ig_max = ng
424  g2 => rho_g(1)%pw_grid%gsq
425  g_vec => rho_g(1)%pw_grid%g
426 
427  IF (mixing_store%max_gvec_exp > 0._dp) THEN
428  DO ig = 1, ng
429  IF (g2(ig) > mixing_store%max_g2) THEN
430  mixing_store%ig_max = ig
431  EXIT
432  END IF
433  END DO
434  END IF
435 
436  IF (.NOT. ASSOCIATED(mixing_store%kerker_factor)) THEN
437  ALLOCATE (mixing_store%kerker_factor(ng))
438  END IF
439  IF (.NOT. ASSOCIATED(mixing_store%special_metric)) THEN
440  ALLOCATE (mixing_store%special_metric(ng))
441  END IF
442  beta = mixing_store%beta
443  kmin = 0.1_dp
444  mixing_store%kerker_factor = 1.0_dp
445  mixing_store%special_metric = 1.0_dp
446  ig1 = 1
447  IF (rho_g(1)%pw_grid%have_g0) ig1 = 2
448  DO ig = ig1, mixing_store%ig_max
449  mixing_store%kerker_factor(ig) = max(g2(ig)/(g2(ig) + beta*beta), kmin)
450  mixing_store%special_metric(ig) = &
451  1.0_dp + 50.0_dp/8.0_dp*( &
452  1.0_dp + cos(g_vec(1, ig)) + cos(g_vec(2, ig)) + cos(g_vec(3, ig)) + &
453  cos(g_vec(1, ig))*cos(g_vec(2, ig)) + &
454  cos(g_vec(2, ig))*cos(g_vec(3, ig)) + &
455  cos(g_vec(1, ig))*cos(g_vec(3, ig)) + &
456  cos(g_vec(1, ig))*cos(g_vec(2, ig))*cos(g_vec(3, ig)))
457  END DO
458 
459  nbuffer = mixing_store%nbuffer
460  DO ispin = 1, nspin
461  IF (.NOT. ASSOCIATED(mixing_store%rhoin(ispin)%cc)) THEN
462  ALLOCATE (mixing_store%rhoin(ispin)%cc(ng))
463  END IF
464  mixing_store%rhoin(ispin)%cc = rho_g(ispin)%array
465 
466  IF (ASSOCIATED(mixing_store%rhoin_buffer)) THEN
467  IF (.NOT. ASSOCIATED(mixing_store%rhoin_buffer(1, ispin)%cc)) THEN
468  DO ib = 1, nbuffer
469  ALLOCATE (mixing_store%rhoin_buffer(ib, ispin)%cc(ng))
470  END DO
471  END IF
472  mixing_store%rhoin_buffer(1, ispin)%cc(1:ng) = &
473  rho_g(ispin)%array(1:ng)
474  END IF
475  IF (ASSOCIATED(mixing_store%res_buffer)) THEN
476  IF (.NOT. ASSOCIATED(mixing_store%res_buffer(1, ispin)%cc)) THEN
477  DO ib = 1, nbuffer
478  ALLOCATE (mixing_store%res_buffer(ib, ispin)%cc(ng))
479  END DO
480  END IF
481  END IF
482  END DO
483 
484  IF (nspin == 2) THEN
485  mixing_store%rhoin(1)%cc = rho_g(1)%array + rho_g(2)%array
486  mixing_store%rhoin(2)%cc = rho_g(1)%array - rho_g(2)%array
487  IF (ASSOCIATED(mixing_store%rhoin_buffer)) THEN
488  mixing_store%rhoin_buffer(1, 1)%cc = rho_g(1)%array + rho_g(2)%array
489  mixing_store%rhoin_buffer(1, 2)%cc = rho_g(1)%array - rho_g(2)%array
490  END IF
491  END IF
492 
493  IF (mixing_store%gmix_p) THEN
494  IF (PRESENT(rho_atom)) THEN
495  natom = SIZE(rho_atom)
496  DO ispin = 1, nspin
497  DO iat = 1, natom
498  IF (ASSOCIATED(rho_atom(iat)%cpc_s(ispin)%r_coef)) THEN
499  mixing_store%paw(iat) = .true.
500  n1 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 1)
501  n2 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 2)
502  IF (ASSOCIATED(mixing_store%cpc_s_in)) THEN
503  IF (.NOT. ASSOCIATED(mixing_store%cpc_s_in(iat, ispin)%r_coef)) THEN
504  ALLOCATE (mixing_store%cpc_s_in(iat, ispin)%r_coef(n1, n2))
505  ALLOCATE (mixing_store%cpc_h_in(iat, ispin)%r_coef(n1, n2))
506  END IF
507  mixing_store%cpc_h_in(iat, ispin)%r_coef = rho_atom(iat)%cpc_h(ispin)%r_coef
508  mixing_store%cpc_s_in(iat, ispin)%r_coef = rho_atom(iat)%cpc_s(ispin)%r_coef
509  END IF
510  END IF
511  END DO
512  END DO
513  END IF
514  END IF
515 
516  IF (mixing_method == gspace_mixing_nr) THEN
517  ELSEIF (mixing_method == pulay_mixing_nr) THEN
518  IF (mixing_store%gmix_p .AND. PRESENT(rho_atom)) THEN
519  DO ispin = 1, nspin
520  DO iat = 1, natom
521  IF (mixing_store%paw(iat)) THEN
522  n1 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 1)
523  n2 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 2)
524  IF (.NOT. ASSOCIATED(mixing_store%cpc_h_in_buffer(1, iat, ispin)%r_coef)) THEN
525  DO ib = 1, nbuffer
526  ALLOCATE (mixing_store%cpc_s_in_buffer(ib, iat, ispin)%r_coef(n1, n2))
527  ALLOCATE (mixing_store%cpc_h_in_buffer(ib, iat, ispin)%r_coef(n1, n2))
528  ALLOCATE (mixing_store%cpc_s_res_buffer(ib, iat, ispin)%r_coef(n1, n2))
529  ALLOCATE (mixing_store%cpc_h_res_buffer(ib, iat, ispin)%r_coef(n1, n2))
530  END DO
531  END IF
532  DO ib = 1, nbuffer
533  mixing_store%cpc_h_in_buffer(ib, iat, ispin)%r_coef = 0.0_dp
534  mixing_store%cpc_s_in_buffer(ib, iat, ispin)%r_coef = 0.0_dp
535  mixing_store%cpc_h_res_buffer(ib, iat, ispin)%r_coef = 0.0_dp
536  mixing_store%cpc_s_res_buffer(ib, iat, ispin)%r_coef = 0.0_dp
537  END DO
538  END IF
539  END DO
540  END DO
541  END IF
542  ELSEIF (mixing_method == broyden_mixing_nr) THEN
543  DO ispin = 1, nspin
544  IF (.NOT. ASSOCIATED(mixing_store%rhoin_old(ispin)%cc)) THEN
545  ALLOCATE (mixing_store%rhoin_old(ispin)%cc(ng))
546  END IF
547  IF (.NOT. ASSOCIATED(mixing_store%drho_buffer(1, ispin)%cc)) THEN
548  DO ib = 1, nbuffer
549  ALLOCATE (mixing_store%drho_buffer(ib, ispin)%cc(ng))
550  END DO
551  ALLOCATE (mixing_store%last_res(ispin)%cc(ng))
552  END IF
553  DO ib = 1, nbuffer
554  mixing_store%drho_buffer(ib, ispin)%cc = cmplx(0.0_dp, 0.0_dp, kind=dp)
555  END DO
556  mixing_store%last_res(ispin)%cc = cmplx(0.0_dp, 0.0_dp, kind=dp)
557  mixing_store%rhoin_old(ispin)%cc = cmplx(0.0_dp, 0.0_dp, kind=dp)
558  END DO
559  IF (mixing_store%gmix_p) THEN
560  IF (PRESENT(rho_atom)) THEN
561  DO ispin = 1, nspin
562  DO iat = 1, natom
563  IF (mixing_store%paw(iat)) THEN
564  n1 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 1)
565  n2 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 2)
566  IF (.NOT. ASSOCIATED(mixing_store%cpc_s_old(iat, ispin)%r_coef)) THEN
567  ALLOCATE (mixing_store%cpc_s_old(iat, ispin)%r_coef(n1, n2))
568  ALLOCATE (mixing_store%cpc_h_old(iat, ispin)%r_coef(n1, n2))
569  END IF
570  mixing_store%cpc_h_old(iat, ispin)%r_coef = 0.0_dp
571  mixing_store%cpc_s_old(iat, ispin)%r_coef = 0.0_dp
572  IF (.NOT. ASSOCIATED(mixing_store%dcpc_s_in(1, iat, ispin)%r_coef)) THEN
573  DO ib = 1, nbuffer
574  ALLOCATE (mixing_store%dcpc_h_in(ib, iat, ispin)%r_coef(n1, n2))
575  ALLOCATE (mixing_store%dcpc_s_in(ib, iat, ispin)%r_coef(n1, n2))
576  END DO
577  ALLOCATE (mixing_store%cpc_h_lastres(iat, ispin)%r_coef(n1, n2))
578  ALLOCATE (mixing_store%cpc_s_lastres(iat, ispin)%r_coef(n1, n2))
579  END IF
580  DO ib = 1, nbuffer
581  mixing_store%dcpc_h_in(ib, iat, ispin)%r_coef = 0.0_dp
582  mixing_store%dcpc_s_in(ib, iat, ispin)%r_coef = 0.0_dp
583  END DO
584  mixing_store%cpc_h_lastres(iat, ispin)%r_coef = 0.0_dp
585  mixing_store%cpc_s_lastres(iat, ispin)%r_coef = 0.0_dp
586  END IF
587  END DO
588  END DO
589  END IF
590  END IF
591 
592  IF (.NOT. ASSOCIATED(mixing_store%p_metric)) THEN
593  ALLOCATE (mixing_store%p_metric(ng))
594  bconst = mixing_store%bconst
595  g2min = 1.e30_dp
596  DO ig = 1, ng
597  IF (g2(ig) > 1.e-10_dp) g2min = min(g2min, g2(ig))
598  END DO
599  g2max = -1.e30_dp
600  DO ig = 1, ng
601  g2max = max(g2max, g2(ig))
602  END DO
603  CALL para_env%min(g2min)
604  CALL para_env%max(g2max)
605  ! fdamp/g2 varies between (bconst-1) and 0
606  ! i.e. p_metric varies between bconst and 1
607  ! fdamp = (bconst-1.0_dp)*g2min
608  fdamp = (bconst - 1.0_dp)*g2min*g2max/(g2max - g2min*bconst)
609  DO ig = 1, ng
610  mixing_store%p_metric(ig) = (g2(ig) + fdamp)/max(g2(ig), 1.e-10_dp)
611  END DO
612  IF (rho_g(1)%pw_grid%have_g0) mixing_store%p_metric(1) = bconst
613  END IF
614  ELSEIF (mixing_method == multisecant_mixing_nr) THEN
615  IF (.NOT. ASSOCIATED(mixing_store%ig_global_index)) THEN
616  ALLOCATE (mixing_store%ig_global_index(ng))
617  END IF
618  mixing_store%ig_global_index = 0
619  ig_count = 0
620  DO iproc = 0, para_env%num_pe - 1
621  IF (para_env%mepos == iproc) THEN
622  DO ig = 1, ng
623  ig_count = ig_count + 1
624  mixing_store%ig_global_index(ig) = ig_count
625  END DO
626  END IF
627  CALL para_env%bcast(ig_count, iproc)
628  END DO
629  END IF
630 
631  CALL timestop(handle)
632 
633  END SUBROUTINE mixing_init
634 
635 ! **************************************************************************************************
636 !> \brief initialiation needed when charge mixing is used
637 !> \param mixing_store ...
638 !> \par History
639 !> 02.2019 created [JGH]
640 !> \author JGH
641 ! **************************************************************************************************
642  ELEMENTAL SUBROUTINE charge_mixing_init(mixing_store)
643  TYPE(mixing_storage_type), INTENT(INOUT) :: mixing_store
644 
645  mixing_store%acharge = 0.0_dp
646 
647  END SUBROUTINE charge_mixing_init
648 
649 END MODULE qs_mixing_utils
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Interface to the message passing library MPI.
module that contains the definitions of the scf types
integer, parameter, public broyden_mixing_nr
integer, parameter, public multisecant_mixing_nr
integer, parameter, public pulay_mixing_nr
integer, parameter, public gspace_mixing_nr
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, WannierCentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Get the QUICKSTEP environment.
elemental subroutine, public charge_mixing_init(mixing_store)
initialiation needed when charge mixing is used
subroutine, public mixing_init(mixing_method, rho, mixing_store, para_env, rho_atom)
initialiation needed when gspace mixing is used
subroutine, public mixing_allocate(qs_env, mixing_method, p_mix_new, p_delta, nspins, mixing_store)
allocation needed when density mixing is used
subroutine, public self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
...
Define the neighbor list data types and the corresponding functionality.
superstucture that hold various representations of the density and keeps track of which ones are vali...
Definition: qs_rho_types.F:18
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Definition: qs_rho_types.F:229
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public cp_sm_mix(m1, m2, p_mix, delta, para_env, m3)
Perform a mixing of the given matrixes into the first matrix m1 = m2 + p_mix (m1-m2)