Line data Source code
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 : ! **************************************************************************************************
9 : MODULE qs_mixing_utils
10 :
11 : USE cp_control_types, ONLY: dft_control_type
12 : USE cp_dbcsr_api, ONLY: dbcsr_create,&
13 : dbcsr_p_type,&
14 : dbcsr_set,&
15 : dbcsr_type,&
16 : dbcsr_type_symmetric
17 : USE cp_dbcsr_cp2k_link, ONLY: cp_dbcsr_alloc_block_from_nbl
18 : USE cp_dbcsr_operations, ONLY: dbcsr_allocate_matrix_set
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
23 : USE qs_density_mixing_types, ONLY: broyden_mixing_nr,&
24 : gspace_mixing_nr,&
25 : mixing_storage_type,&
26 : multisecant_mixing_nr,&
27 : pulay_mixing_nr
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 :
43 : PUBLIC :: mixing_allocate, mixing_init, charge_mixing_init, &
44 : self_consistency_check
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 1884 : 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 1884 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_q, p_in
67 :
68 1884 : CALL timeset(routineN, handle)
69 :
70 1884 : NULLIFY (matrix_q, p_in)
71 :
72 1884 : CPASSERT(ASSOCIATED(p_out))
73 1884 : NULLIFY (matrix_q, p_in)
74 1884 : p_in => rho_ao
75 1884 : matrix_q => p_delta
76 1884 : nspins = SIZE(p_in, 1)
77 1884 : nimg = SIZE(p_in, 2)
78 :
79 : ! Compute the difference (p_out - p_in)and check convergence
80 1884 : delta = 0.0_dp
81 3954 : DO ispin = 1, nspins
82 145990 : DO ic = 1, nimg
83 142036 : 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 142036 : m3=matrix_q(ispin, ic)%matrix)
87 144106 : delta = MAX(tmp, delta)
88 : END DO
89 : END DO
90 1884 : CALL timestop(handle)
91 :
92 1884 : 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 13530 : 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 13530 : 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 13530 : POINTER :: sab_orb
129 13530 : TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom
130 :
131 13530 : CALL timeset(routineN, handle)
132 :
133 13530 : 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 13530 : dft_control=dft_control)
138 :
139 : charge_mixing = dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb &
140 13530 : .OR. dft_control%qs_control%semi_empirical
141 13530 : refmatrix => matrix_s(1, 1)%matrix
142 13530 : nimg = dft_control%nimages
143 :
144 : ! *** allocate p_mix_new ***
145 13530 : IF (PRESENT(p_mix_new)) THEN
146 13524 : IF (.NOT. ASSOCIATED(p_mix_new)) THEN
147 13488 : CALL dbcsr_allocate_matrix_set(p_mix_new, nspins, nimg)
148 28508 : DO i = 1, nspins
149 139536 : DO ic = 1, nimg
150 111028 : ALLOCATE (p_mix_new(i, ic)%matrix)
151 : CALL dbcsr_create(matrix=p_mix_new(i, ic)%matrix, template=refmatrix, &
152 111028 : name="SCF DENSITY", matrix_type=dbcsr_type_symmetric, nze=0)
153 111028 : CALL cp_dbcsr_alloc_block_from_nbl(p_mix_new(i, ic)%matrix, sab_orb)
154 126048 : 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 13530 : IF (PRESENT(p_delta)) THEN
162 13524 : IF (mixing_method >= gspace_mixing_nr) THEN
163 246 : IF (.NOT. ASSOCIATED(p_delta)) THEN
164 242 : CALL dbcsr_allocate_matrix_set(p_delta, nspins, nimg)
165 516 : DO i = 1, nspins
166 15062 : DO ic = 1, nimg
167 14546 : ALLOCATE (p_delta(i, ic)%matrix)
168 : CALL dbcsr_create(matrix=p_delta(i, ic)%matrix, template=refmatrix, &
169 14546 : name="SCF DENSITY", matrix_type=dbcsr_type_symmetric, nze=0)
170 14546 : CALL cp_dbcsr_alloc_block_from_nbl(p_delta(i, ic)%matrix, sab_orb)
171 14820 : CALL dbcsr_set(p_delta(i, ic)%matrix, 0.0_dp)
172 : END DO
173 : END DO
174 : END IF
175 246 : CPASSERT(ASSOCIATED(mixing_store))
176 : END IF
177 : END IF
178 :
179 13530 : IF (charge_mixing) THEN
180 : ! *** allocate buffer for charge mixing ***
181 7748 : IF (mixing_method >= gspace_mixing_nr) THEN
182 36 : CPASSERT(.NOT. mixing_store%gmix_p)
183 36 : IF (dft_control%qs_control%dftb) THEN
184 : max_shell = 1
185 36 : ELSEIF (dft_control%qs_control%xtb) THEN
186 : max_shell = 5
187 : ELSE
188 0 : CPABORT('UNKNOWN METHOD')
189 : END IF
190 36 : nbuffer = mixing_store%nbuffer
191 36 : mixing_store%ncall = 0
192 36 : CALL get_qs_env(qs_env, local_particles=distribution_1d)
193 36 : nkind = SIZE(distribution_1d%n_el)
194 72 : na = SUM(distribution_1d%n_el(:))
195 36 : IF (ASSOCIATED(mixing_store%atlist)) DEALLOCATE (mixing_store%atlist)
196 108 : ALLOCATE (mixing_store%atlist(na))
197 36 : mixing_store%nat_local = na
198 36 : mixing_store%max_shell = max_shell
199 36 : ia = 0
200 72 : DO ikind = 1, nkind
201 36 : nel = distribution_1d%n_el(ikind)
202 166 : DO iat = 1, nel
203 94 : ia = ia + 1
204 130 : mixing_store%atlist(ia) = distribution_1d%list(ikind)%array(iat)
205 : END DO
206 : END DO
207 36 : IF (ASSOCIATED(mixing_store%acharge)) DEALLOCATE (mixing_store%acharge)
208 180 : ALLOCATE (mixing_store%acharge(na, max_shell, nbuffer))
209 36 : IF (ASSOCIATED(mixing_store%dacharge)) DEALLOCATE (mixing_store%dacharge)
210 108 : ALLOCATE (mixing_store%dacharge(na, max_shell, nbuffer))
211 : END IF
212 7748 : IF (mixing_method == pulay_mixing_nr) THEN
213 0 : IF (ASSOCIATED(mixing_store%pulay_matrix)) DEALLOCATE (mixing_store%pulay_matrix)
214 0 : ALLOCATE (mixing_store%pulay_matrix(nbuffer, nbuffer, nspins))
215 0 : mixing_store%pulay_matrix = 0.0_dp
216 7748 : ELSEIF (mixing_method == broyden_mixing_nr) THEN
217 36 : IF (ASSOCIATED(mixing_store%abroy)) DEALLOCATE (mixing_store%abroy)
218 144 : ALLOCATE (mixing_store%abroy(nbuffer, nbuffer))
219 21636 : mixing_store%abroy = 0.0_dp
220 36 : IF (ASSOCIATED(mixing_store%wbroy)) DEALLOCATE (mixing_store%wbroy)
221 108 : ALLOCATE (mixing_store%wbroy(nbuffer))
222 420 : mixing_store%wbroy = 0.0_dp
223 36 : IF (ASSOCIATED(mixing_store%dfbroy)) DEALLOCATE (mixing_store%dfbroy)
224 180 : ALLOCATE (mixing_store%dfbroy(na, max_shell, nbuffer))
225 9020 : mixing_store%dfbroy = 0.0_dp
226 36 : IF (ASSOCIATED(mixing_store%ubroy)) DEALLOCATE (mixing_store%ubroy)
227 108 : ALLOCATE (mixing_store%ubroy(na, max_shell, nbuffer))
228 9020 : mixing_store%ubroy = 0.0_dp
229 7712 : ELSEIF (mixing_method == multisecant_mixing_nr) THEN
230 0 : CPABORT("multisecant_mixing not available")
231 : END IF
232 : ELSE
233 : ! *** allocate buffer for gspace mixing ***
234 5782 : IF (mixing_method >= gspace_mixing_nr) THEN
235 216 : nbuffer = mixing_store%nbuffer
236 216 : mixing_store%ncall = 0
237 216 : IF (.NOT. ASSOCIATED(mixing_store%rhoin)) THEN
238 774 : ALLOCATE (mixing_store%rhoin(nspins))
239 402 : DO ispin = 1, nspins
240 402 : NULLIFY (mixing_store%rhoin(ispin)%cc)
241 : END DO
242 : END IF
243 :
244 216 : IF (mixing_store%gmix_p .AND. dft_control%qs_control%gapw) THEN
245 20 : CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
246 20 : natom = SIZE(rho_atom)
247 20 : IF (.NOT. ASSOCIATED(mixing_store%paw)) THEN
248 48 : ALLOCATE (mixing_store%paw(natom))
249 144 : mixing_store%paw = .FALSE.
250 262 : ALLOCATE (mixing_store%cpc_h_in(natom, nspins))
251 246 : ALLOCATE (mixing_store%cpc_s_in(natom, nspins))
252 38 : DO ispin = 1, nspins
253 214 : DO iat = 1, natom
254 176 : NULLIFY (mixing_store%cpc_h_in(iat, ispin)%r_coef)
255 198 : 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 5782 : IF (mixing_method >= pulay_mixing_nr) THEN
264 206 : IF (.NOT. ASSOCIATED(mixing_store%res_buffer)) THEN
265 2670 : ALLOCATE (mixing_store%res_buffer(nbuffer, nspins))
266 382 : DO ispin = 1, nspins
267 2142 : DO i = 1, nbuffer
268 1966 : 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 5782 : IF (mixing_method == pulay_mixing_nr) THEN
276 38 : IF (.NOT. ASSOCIATED(mixing_store%pulay_matrix)) THEN
277 170 : ALLOCATE (mixing_store%pulay_matrix(nbuffer, nbuffer, nspins))
278 : END IF
279 :
280 38 : IF (.NOT. ASSOCIATED(mixing_store%rhoin_buffer)) THEN
281 394 : ALLOCATE (mixing_store%rhoin_buffer(nbuffer, nspins))
282 72 : DO ispin = 1, nspins
283 292 : DO i = 1, nbuffer
284 258 : NULLIFY (mixing_store%rhoin_buffer(i, ispin)%cc)
285 : END DO
286 : END DO
287 : END IF
288 38 : IF (mixing_store%gmix_p) THEN
289 2 : IF (dft_control%qs_control%gapw) THEN
290 2 : IF (.NOT. ASSOCIATED(mixing_store%cpc_h_in_buffer)) THEN
291 108 : ALLOCATE (mixing_store%cpc_h_in_buffer(nbuffer, natom, nspins))
292 106 : ALLOCATE (mixing_store%cpc_s_in_buffer(nbuffer, natom, nspins))
293 106 : ALLOCATE (mixing_store%cpc_h_res_buffer(nbuffer, natom, nspins))
294 106 : ALLOCATE (mixing_store%cpc_s_res_buffer(nbuffer, natom, nspins))
295 4 : DO ispin = 1, nspins
296 20 : DO iat = 1, natom
297 98 : DO i = 1, nbuffer
298 80 : NULLIFY (mixing_store%cpc_h_in_buffer(i, iat, ispin)%r_coef)
299 80 : NULLIFY (mixing_store%cpc_s_in_buffer(i, iat, ispin)%r_coef)
300 80 : NULLIFY (mixing_store%cpc_h_res_buffer(i, iat, ispin)%r_coef)
301 96 : 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 5782 : IF (mixing_method == broyden_mixing_nr) THEN
312 168 : IF (.NOT. ASSOCIATED(mixing_store%rhoin_old)) THEN
313 594 : ALLOCATE (mixing_store%rhoin_old(nspins))
314 310 : DO ispin = 1, nspins
315 310 : NULLIFY (mixing_store%rhoin_old(ispin)%cc)
316 : END DO
317 : END IF
318 168 : IF (.NOT. ASSOCIATED(mixing_store%drho_buffer)) THEN
319 2276 : ALLOCATE (mixing_store%drho_buffer(nbuffer, nspins))
320 594 : ALLOCATE (mixing_store%last_res(nspins))
321 310 : DO ispin = 1, nspins
322 1708 : DO i = 1, nbuffer
323 1708 : NULLIFY (mixing_store%drho_buffer(i, ispin)%cc)
324 : END DO
325 310 : NULLIFY (mixing_store%last_res(ispin)%cc)
326 : END DO
327 : END IF
328 168 : IF (mixing_store%gmix_p) THEN
329 :
330 16 : IF (dft_control%qs_control%gapw) THEN
331 16 : IF (.NOT. ASSOCIATED(mixing_store%cpc_h_old)) THEN
332 210 : ALLOCATE (mixing_store%cpc_h_old(natom, nspins))
333 198 : ALLOCATE (mixing_store%cpc_s_old(natom, nspins))
334 30 : DO ispin = 1, nspins
335 174 : DO iat = 1, natom
336 144 : NULLIFY (mixing_store%cpc_h_old(iat, ispin)%r_coef)
337 162 : NULLIFY (mixing_store%cpc_s_old(iat, ispin)%r_coef)
338 : END DO
339 : END DO
340 : END IF
341 16 : IF (.NOT. ASSOCIATED(mixing_store%dcpc_h_in)) THEN
342 1326 : ALLOCATE (mixing_store%dcpc_h_in(nbuffer, natom, nspins))
343 1314 : ALLOCATE (mixing_store%dcpc_s_in(nbuffer, natom, nspins))
344 210 : ALLOCATE (mixing_store%cpc_h_lastres(natom, nspins))
345 198 : ALLOCATE (mixing_store%cpc_s_lastres(natom, nspins))
346 30 : DO ispin = 1, nspins
347 174 : DO iat = 1, natom
348 1248 : DO i = 1, nbuffer
349 1104 : NULLIFY (mixing_store%dcpc_h_in(i, iat, ispin)%r_coef)
350 1248 : NULLIFY (mixing_store%dcpc_s_in(i, iat, ispin)%r_coef)
351 : END DO
352 144 : NULLIFY (mixing_store%cpc_h_lastres(iat, ispin)%r_coef)
353 162 : 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 5782 : IF (mixing_method == multisecant_mixing_nr) THEN
363 0 : IF (.NOT. ASSOCIATED(mixing_store%norm_res_buffer)) THEN
364 0 : ALLOCATE (mixing_store%norm_res_buffer(nbuffer, nspins))
365 : END IF
366 : END IF
367 :
368 5782 : IF (mixing_method == multisecant_mixing_nr) THEN
369 0 : IF (.NOT. ASSOCIATED(mixing_store%rhoin_buffer)) THEN
370 0 : ALLOCATE (mixing_store%rhoin_buffer(nbuffer, nspins))
371 0 : DO ispin = 1, nspins
372 0 : DO i = 1, nbuffer
373 0 : 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 13530 : CALL timestop(handle)
382 :
383 13530 : 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 216 : 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 216 : REAL(dp), DIMENSION(:), POINTER :: g2
411 216 : REAL(dp), DIMENSION(:, :), POINTER :: g_vec
412 216 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
413 216 : TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
414 :
415 216 : CALL timeset(routineN, handle)
416 :
417 216 : NULLIFY (g2, g_vec, rho_ao_kp, rho_g)
418 216 : CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, rho_g=rho_g)
419 :
420 216 : nspin = SIZE(rho_g)
421 216 : ng = SIZE(rho_g(1)%pw_grid%gsq, 1)
422 216 : nimg = SIZE(rho_ao_kp, 2)
423 216 : mixing_store%ig_max = ng
424 216 : g2 => rho_g(1)%pw_grid%gsq
425 216 : g_vec => rho_g(1)%pw_grid%g
426 :
427 216 : IF (mixing_store%max_gvec_exp > 0._dp) THEN
428 0 : DO ig = 1, ng
429 0 : IF (g2(ig) > mixing_store%max_g2) THEN
430 0 : mixing_store%ig_max = ig
431 0 : EXIT
432 : END IF
433 : END DO
434 : END IF
435 :
436 216 : IF (.NOT. ASSOCIATED(mixing_store%kerker_factor)) THEN
437 558 : ALLOCATE (mixing_store%kerker_factor(ng))
438 : END IF
439 216 : IF (.NOT. ASSOCIATED(mixing_store%special_metric)) THEN
440 558 : ALLOCATE (mixing_store%special_metric(ng))
441 : END IF
442 216 : beta = mixing_store%beta
443 216 : kmin = 0.1_dp
444 10576476 : mixing_store%kerker_factor = 1.0_dp
445 10576476 : mixing_store%special_metric = 1.0_dp
446 216 : ig1 = 1
447 216 : IF (rho_g(1)%pw_grid%have_g0) ig1 = 2
448 10576368 : DO ig = ig1, mixing_store%ig_max
449 10576152 : 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 10576368 : COS(g_vec(1, ig))*COS(g_vec(2, ig))*COS(g_vec(3, ig)))
457 : END DO
458 :
459 216 : nbuffer = mixing_store%nbuffer
460 466 : DO ispin = 1, nspin
461 250 : IF (.NOT. ASSOCIATED(mixing_store%rhoin(ispin)%cc)) THEN
462 648 : ALLOCATE (mixing_store%rhoin(ispin)%cc(ng))
463 : END IF
464 24767746 : mixing_store%rhoin(ispin)%cc = rho_g(ispin)%array
465 :
466 250 : IF (ASSOCIATED(mixing_store%rhoin_buffer)) THEN
467 42 : IF (.NOT. ASSOCIATED(mixing_store%rhoin_buffer(1, ispin)%cc)) THEN
468 258 : DO ib = 1, nbuffer
469 698 : 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 2668074 : rho_g(ispin)%array(1:ng)
474 : END IF
475 466 : IF (ASSOCIATED(mixing_store%res_buffer)) THEN
476 240 : IF (.NOT. ASSOCIATED(mixing_store%res_buffer(1, ispin)%cc)) THEN
477 1966 : DO ib = 1, nbuffer
478 5486 : ALLOCATE (mixing_store%res_buffer(ib, ispin)%cc(ng))
479 : END DO
480 : END IF
481 : END IF
482 : END DO
483 :
484 216 : IF (nspin == 2) THEN
485 3615010 : mixing_store%rhoin(1)%cc = rho_g(1)%array + rho_g(2)%array
486 3615010 : mixing_store%rhoin(2)%cc = rho_g(1)%array - rho_g(2)%array
487 34 : IF (ASSOCIATED(mixing_store%rhoin_buffer)) THEN
488 55300 : mixing_store%rhoin_buffer(1, 1)%cc = rho_g(1)%array + rho_g(2)%array
489 55300 : mixing_store%rhoin_buffer(1, 2)%cc = rho_g(1)%array - rho_g(2)%array
490 : END IF
491 : END IF
492 :
493 216 : IF (mixing_store%gmix_p) THEN
494 20 : IF (PRESENT(rho_atom)) THEN
495 20 : natom = SIZE(rho_atom)
496 50 : DO ispin = 1, nspin
497 290 : DO iat = 1, natom
498 270 : IF (ASSOCIATED(rho_atom(iat)%cpc_s(ispin)%r_coef)) THEN
499 170 : mixing_store%paw(iat) = .TRUE.
500 170 : n1 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 1)
501 170 : n2 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 2)
502 170 : IF (ASSOCIATED(mixing_store%cpc_s_in)) THEN
503 170 : IF (.NOT. ASSOCIATED(mixing_store%cpc_s_in(iat, ispin)%r_coef)) THEN
504 424 : ALLOCATE (mixing_store%cpc_s_in(iat, ispin)%r_coef(n1, n2))
505 318 : ALLOCATE (mixing_store%cpc_h_in(iat, ispin)%r_coef(n1, n2))
506 : END IF
507 251330 : mixing_store%cpc_h_in(iat, ispin)%r_coef = rho_atom(iat)%cpc_h(ispin)%r_coef
508 251330 : 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 216 : IF (mixing_method == gspace_mixing_nr) THEN
517 206 : ELSEIF (mixing_method == pulay_mixing_nr) THEN
518 38 : IF (mixing_store%gmix_p .AND. PRESENT(rho_atom)) THEN
519 4 : DO ispin = 1, nspin
520 20 : DO iat = 1, natom
521 18 : IF (mixing_store%paw(iat)) THEN
522 2 : n1 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 1)
523 2 : n2 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 2)
524 2 : IF (.NOT. ASSOCIATED(mixing_store%cpc_h_in_buffer(1, iat, ispin)%r_coef)) THEN
525 12 : DO ib = 1, nbuffer
526 40 : ALLOCATE (mixing_store%cpc_s_in_buffer(ib, iat, ispin)%r_coef(n1, n2))
527 30 : ALLOCATE (mixing_store%cpc_h_in_buffer(ib, iat, ispin)%r_coef(n1, n2))
528 30 : ALLOCATE (mixing_store%cpc_s_res_buffer(ib, iat, ispin)%r_coef(n1, n2))
529 32 : ALLOCATE (mixing_store%cpc_h_res_buffer(ib, iat, ispin)%r_coef(n1, n2))
530 : END DO
531 : END IF
532 12 : DO ib = 1, nbuffer
533 4630 : mixing_store%cpc_h_in_buffer(ib, iat, ispin)%r_coef = 0.0_dp
534 4630 : mixing_store%cpc_s_in_buffer(ib, iat, ispin)%r_coef = 0.0_dp
535 4630 : mixing_store%cpc_h_res_buffer(ib, iat, ispin)%r_coef = 0.0_dp
536 4632 : 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 168 : ELSEIF (mixing_method == broyden_mixing_nr) THEN
543 366 : DO ispin = 1, nspin
544 198 : IF (.NOT. ASSOCIATED(mixing_store%rhoin_old(ispin)%cc)) THEN
545 504 : ALLOCATE (mixing_store%rhoin_old(ispin)%cc(ng))
546 : END IF
547 198 : IF (.NOT. ASSOCIATED(mixing_store%drho_buffer(1, ispin)%cc)) THEN
548 1708 : DO ib = 1, nbuffer
549 4788 : ALLOCATE (mixing_store%drho_buffer(ib, ispin)%cc(ng))
550 : END DO
551 504 : ALLOCATE (mixing_store%last_res(ispin)%cc(ng))
552 : END IF
553 2032 : DO ib = 1, nbuffer
554 84109704 : mixing_store%drho_buffer(ib, ispin)%cc = CMPLX(0.0_dp, 0.0_dp, kind=dp)
555 : END DO
556 10915146 : mixing_store%last_res(ispin)%cc = CMPLX(0.0_dp, 0.0_dp, kind=dp)
557 10915314 : mixing_store%rhoin_old(ispin)%cc = CMPLX(0.0_dp, 0.0_dp, kind=dp)
558 : END DO
559 168 : IF (mixing_store%gmix_p) THEN
560 16 : IF (PRESENT(rho_atom)) THEN
561 42 : DO ispin = 1, nspin
562 250 : DO iat = 1, natom
563 234 : IF (mixing_store%paw(iat)) THEN
564 166 : n1 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 1)
565 166 : n2 = SIZE(rho_atom(iat)%cpc_s(ispin)%r_coef, 2)
566 166 : IF (.NOT. ASSOCIATED(mixing_store%cpc_s_old(iat, ispin)%r_coef)) THEN
567 408 : ALLOCATE (mixing_store%cpc_s_old(iat, ispin)%r_coef(n1, n2))
568 306 : ALLOCATE (mixing_store%cpc_h_old(iat, ispin)%r_coef(n1, n2))
569 : END IF
570 123898 : mixing_store%cpc_h_old(iat, ispin)%r_coef = 0.0_dp
571 123898 : mixing_store%cpc_s_old(iat, ispin)%r_coef = 0.0_dp
572 166 : IF (.NOT. ASSOCIATED(mixing_store%dcpc_s_in(1, iat, ispin)%r_coef)) THEN
573 912 : DO ib = 1, nbuffer
574 3240 : ALLOCATE (mixing_store%dcpc_h_in(ib, iat, ispin)%r_coef(n1, n2))
575 2532 : ALLOCATE (mixing_store%dcpc_s_in(ib, iat, ispin)%r_coef(n1, n2))
576 : END DO
577 408 : ALLOCATE (mixing_store%cpc_h_lastres(iat, ispin)%r_coef(n1, n2))
578 306 : ALLOCATE (mixing_store%cpc_s_lastres(iat, ispin)%r_coef(n1, n2))
579 : END IF
580 1488 : DO ib = 1, nbuffer
581 988406 : mixing_store%dcpc_h_in(ib, iat, ispin)%r_coef = 0.0_dp
582 988572 : mixing_store%dcpc_s_in(ib, iat, ispin)%r_coef = 0.0_dp
583 : END DO
584 123898 : mixing_store%cpc_h_lastres(iat, ispin)%r_coef = 0.0_dp
585 123898 : 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 168 : IF (.NOT. ASSOCIATED(mixing_store%p_metric)) THEN
593 426 : ALLOCATE (mixing_store%p_metric(ng))
594 142 : bconst = mixing_store%bconst
595 142 : g2min = 1.E30_dp
596 8889874 : DO ig = 1, ng
597 8889874 : IF (g2(ig) > 1.E-10_dp) g2min = MIN(g2min, g2(ig))
598 : END DO
599 142 : g2max = -1.E30_dp
600 8889874 : DO ig = 1, ng
601 8889874 : g2max = MAX(g2max, g2(ig))
602 : END DO
603 142 : CALL para_env%min(g2min)
604 142 : 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 142 : fdamp = (bconst - 1.0_dp)*g2min*g2max/(g2max - g2min*bconst)
609 8889874 : DO ig = 1, ng
610 8889874 : mixing_store%p_metric(ig) = (g2(ig) + fdamp)/MAX(g2(ig), 1.E-10_dp)
611 : END DO
612 142 : IF (rho_g(1)%pw_grid%have_g0) mixing_store%p_metric(1) = bconst
613 : END IF
614 0 : ELSEIF (mixing_method == multisecant_mixing_nr) THEN
615 0 : IF (.NOT. ASSOCIATED(mixing_store%ig_global_index)) THEN
616 0 : ALLOCATE (mixing_store%ig_global_index(ng))
617 : END IF
618 0 : mixing_store%ig_global_index = 0
619 0 : ig_count = 0
620 0 : DO iproc = 0, para_env%num_pe - 1
621 0 : IF (para_env%mepos == iproc) THEN
622 0 : DO ig = 1, ng
623 0 : ig_count = ig_count + 1
624 0 : mixing_store%ig_global_index(ig) = ig_count
625 : END DO
626 : END IF
627 0 : CALL para_env%bcast(ig_count, iproc)
628 : END DO
629 : END IF
630 :
631 216 : CALL timestop(handle)
632 :
633 216 : 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 36 : ELEMENTAL SUBROUTINE charge_mixing_init(mixing_store)
643 : TYPE(mixing_storage_type), INTENT(INOUT) :: mixing_store
644 :
645 9020 : mixing_store%acharge = 0.0_dp
646 :
647 36 : END SUBROUTINE charge_mixing_init
648 :
649 : END MODULE qs_mixing_utils
|