(git:1155b05)
Loading...
Searching...
No Matches
qs_wf_history_methods.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! **************************************************************************************************
9!> \brief Storage of past states of the qs_env.
10!> Methods to interpolate (or actually normally extrapolate) the
11!> new guess for density and wavefunctions.
12!> \note
13!> Most of the last snapshot should actually be in qs_env, but taking
14!> advantage of it would make the programming much convoluted
15!> \par History
16!> 02.2003 created [fawzi]
17!> 11.2003 Joost VandeVondele : Implemented Nth order PS extrapolation
18!> 02.2005 modified for KG_GPW [MI]
19!> \author fawzi
20! **************************************************************************************************
22 USE bibliography, ONLY: kolafa2004,&
23 kuhne2007,&
25 cite_reference
32 USE cp_cfm_diag, ONLY: cp_cfm_heevd
33 USE cp_cfm_types, ONLY: cp_cfm_create,&
41 USE cp_dbcsr_api, ONLY: &
43 dbcsr_p_type, dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric, dbcsr_type_no_symmetry, &
44 dbcsr_type_symmetric
61 USE cp_fm_types, ONLY: &
70 USE input_constants, ONLY: &
74 USE kinds, ONLY: dp
79 USE kpoint_types, ONLY: get_kpoint_info,&
82 USE mathconstants, ONLY: gaussi,&
83 z_one,&
84 z_zero
85 USE mathlib, ONLY: binomial
88 USE pw_env_types, ONLY: pw_env_get,&
90 USE pw_methods, ONLY: pw_copy
92 USE pw_types, ONLY: pw_c1d_gs_type,&
99 USE qs_matrix_pools, ONLY: mpools_get,&
105 USE qs_mo_types, ONLY: get_mo_set,&
109 USE qs_rho_types, ONLY: qs_rho_get,&
110 qs_rho_set,&
112 USE qs_scf_types, ONLY: ot_method_nr,&
119#include "./base/base_uses.f90"
120
121 IMPLICIT NONE
122 PRIVATE
123
124 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
125 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_wf_history_methods'
126
130
131CONTAINS
132
133! **************************************************************************************************
134!> \brief allocates and initialize a wavefunction snapshot
135!> \param snapshot the snapshot to create
136!> \par History
137!> 02.2003 created [fawzi]
138!> 02.2005 added wf_mol [MI]
139!> \author fawzi
140! **************************************************************************************************
141 SUBROUTINE wfs_create(snapshot)
142 TYPE(qs_wf_snapshot_type), INTENT(OUT) :: snapshot
143
144 NULLIFY (snapshot%wf, snapshot%rho_r, &
145 snapshot%rho_g, snapshot%rho_ao, snapshot%rho_ao_kp, &
146 snapshot%overlap, snapshot%wf_kp, snapshot%overlap_cfm_kp, &
147 snapshot%rho_frozen)
148 snapshot%dt = 1.0_dp
149 END SUBROUTINE wfs_create
150
151! **************************************************************************************************
152!> \brief updates the given snapshot
153!> \param snapshot the snapshot to be updated
154!> \param wf_history the history
155!> \param qs_env the qs_env that should be snapshotted
156!> \param dt the time of the snapshot (wrt. to the previous snapshot)
157!> \par History
158!> 02.2003 created [fawzi]
159!> 02.2005 added kg_fm_mol_set for KG_GPW [MI]
160!> \author fawzi
161! **************************************************************************************************
162 SUBROUTINE wfs_update(snapshot, wf_history, qs_env, dt)
163 TYPE(qs_wf_snapshot_type), POINTER :: snapshot
164 TYPE(qs_wf_history_type), POINTER :: wf_history
165 TYPE(qs_environment_type), POINTER :: qs_env
166 REAL(KIND=dp), INTENT(in), OPTIONAL :: dt
167
168 CHARACTER(len=*), PARAMETER :: routineN = 'wfs_update'
169
170 INTEGER :: handle, ic, igroup, ik, ikp, img, &
171 indx_ft, ispin, kplocal, nc, nimg, &
172 nkp_all, nkp_grps, nspin_kp, nspins
173 INTEGER, DIMENSION(2) :: kp_range
174 INTEGER, DIMENSION(:, :), POINTER :: kp_dist
175 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
176 LOGICAL :: my_kpgrp
177 REAL(KIND=dp), DIMENSION(:, :), POINTER :: xkp
178 TYPE(copy_info_type), ALLOCATABLE, DIMENSION(:, :) :: info_ft
179 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_ao_fm_pools, ao_mo_pools
180 TYPE(cp_fm_struct_type), POINTER :: ao_ao_struct_ft
181 TYPE(cp_fm_type) :: fmdummy_ft, fmlocal_ft
182 TYPE(cp_fm_type), POINTER :: mo_coeff
183 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, rho_ao
184 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp, rho_ao_kp
185 TYPE(dbcsr_type), POINTER :: cmat_ft, rmat_ft, tmpmat_ft
186 TYPE(dft_control_type), POINTER :: dft_control
187 TYPE(kpoint_env_type), POINTER :: kp
188 TYPE(kpoint_type), POINTER :: kpoints
189 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
190 TYPE(mp_para_env_type), POINTER :: para_env_ft
191 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
192 POINTER :: sab_nl
193 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
194 TYPE(pw_env_type), POINTER :: pw_env
195 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
196 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
197 TYPE(qs_matrix_pools_type), POINTER :: mpools_kp
198 TYPE(qs_rho_type), POINTER :: rho
199 TYPE(qs_scf_env_type), POINTER :: scf_env
200
201 CALL timeset(routinen, handle)
202
203 NULLIFY (pw_env, auxbas_pw_pool, ao_mo_pools, ao_ao_fm_pools, dft_control, mos, mo_coeff, &
204 rho, rho_r, rho_g, rho_ao, matrix_s, matrix_s_kp, kpoints, kp, &
205 kp_dist, cell_to_index, xkp, sab_nl, scf_env, mpools_kp, para_env_ft, &
206 rmat_ft, cmat_ft, tmpmat_ft, ao_ao_struct_ft)
207 CALL get_qs_env(qs_env, pw_env=pw_env, &
208 dft_control=dft_control, rho=rho)
209 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_pools)
210 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
211
212 cpassert(ASSOCIATED(wf_history))
213 cpassert(ASSOCIATED(dft_control))
214 IF (.NOT. ASSOCIATED(snapshot)) THEN
215 ALLOCATE (snapshot)
216 CALL wfs_create(snapshot)
217 END IF
218 cpassert(wf_history%ref_count > 0)
219
220 nspins = dft_control%nspins
221 snapshot%dt = 1.0_dp
222 IF (PRESENT(dt)) snapshot%dt = dt
223 IF (wf_history%store_wf) THEN
224 CALL get_qs_env(qs_env, mos=mos)
225 IF (.NOT. ASSOCIATED(snapshot%wf)) THEN
226 CALL fm_pools_create_fm_vect(ao_mo_pools, snapshot%wf, &
227 name="ws_snap-ws")
228 cpassert(nspins == SIZE(snapshot%wf))
229 END IF
230 DO ispin = 1, nspins
231 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
232 CALL cp_fm_to_fm(mo_coeff, snapshot%wf(ispin))
233 END DO
234 ELSE
235 CALL fm_pools_give_back_fm_vect(ao_mo_pools, snapshot%wf)
236 END IF
237
238 IF (wf_history%store_rho_r) THEN
239 CALL qs_rho_get(rho, rho_r=rho_r)
240 cpassert(ASSOCIATED(rho_r))
241 IF (.NOT. ASSOCIATED(snapshot%rho_r)) THEN
242 ALLOCATE (snapshot%rho_r(nspins))
243 DO ispin = 1, nspins
244 CALL auxbas_pw_pool%create_pw(snapshot%rho_r(ispin))
245 END DO
246 END IF
247 DO ispin = 1, nspins
248 CALL pw_copy(rho_r(ispin), snapshot%rho_r(ispin))
249 END DO
250 ELSE IF (ASSOCIATED(snapshot%rho_r)) THEN
251 DO ispin = 1, SIZE(snapshot%rho_r)
252 CALL auxbas_pw_pool%give_back_pw(snapshot%rho_r(ispin))
253 END DO
254 DEALLOCATE (snapshot%rho_r)
255 END IF
256
257 IF (wf_history%store_rho_g) THEN
258 CALL qs_rho_get(rho, rho_g=rho_g)
259 cpassert(ASSOCIATED(rho_g))
260 IF (.NOT. ASSOCIATED(snapshot%rho_g)) THEN
261 ALLOCATE (snapshot%rho_g(nspins))
262 DO ispin = 1, nspins
263 CALL auxbas_pw_pool%create_pw(snapshot%rho_g(ispin))
264 END DO
265 END IF
266 DO ispin = 1, nspins
267 CALL pw_copy(rho_g(ispin), snapshot%rho_g(ispin))
268 END DO
269 ELSE IF (ASSOCIATED(snapshot%rho_g)) THEN
270 DO ispin = 1, SIZE(snapshot%rho_g)
271 CALL auxbas_pw_pool%give_back_pw(snapshot%rho_g(ispin))
272 END DO
273 DEALLOCATE (snapshot%rho_g)
274 END IF
275
276 IF (ASSOCIATED(snapshot%rho_ao)) THEN ! the sparsity might be different
277 ! (future struct:check)
278 CALL dbcsr_deallocate_matrix_set(snapshot%rho_ao)
279 END IF
280 IF (wf_history%store_rho_ao) THEN
281 CALL qs_rho_get(rho, rho_ao=rho_ao)
282 cpassert(ASSOCIATED(rho_ao))
283
284 CALL dbcsr_allocate_matrix_set(snapshot%rho_ao, nspins)
285 DO ispin = 1, nspins
286 ALLOCATE (snapshot%rho_ao(ispin)%matrix)
287 CALL dbcsr_copy(snapshot%rho_ao(ispin)%matrix, rho_ao(ispin)%matrix)
288 END DO
289 END IF
290
291 IF (ASSOCIATED(snapshot%rho_ao_kp)) THEN ! the sparsity might be different
292 ! (future struct:check)
293 CALL dbcsr_deallocate_matrix_set(snapshot%rho_ao_kp)
294 END IF
295 IF (wf_history%store_rho_ao_kp) THEN
296 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
297 cpassert(ASSOCIATED(rho_ao_kp))
298
299 nimg = dft_control%nimages
300 CALL dbcsr_allocate_matrix_set(snapshot%rho_ao_kp, nspins, nimg)
301 DO ispin = 1, nspins
302 DO img = 1, nimg
303 ALLOCATE (snapshot%rho_ao_kp(ispin, img)%matrix)
304 CALL dbcsr_copy(snapshot%rho_ao_kp(ispin, img)%matrix, &
305 rho_ao_kp(ispin, img)%matrix)
306 END DO
307 END DO
308 END IF
309
310 IF (ASSOCIATED(snapshot%overlap)) THEN ! the sparsity might be different
311 ! (future struct:check)
312 CALL dbcsr_deallocate_matrix(snapshot%overlap)
313 END IF
314 IF (wf_history%store_overlap) THEN
315 CALL get_qs_env(qs_env, matrix_s=matrix_s)
316 cpassert(ASSOCIATED(matrix_s))
317 cpassert(ASSOCIATED(matrix_s(1)%matrix))
318 ALLOCATE (snapshot%overlap)
319 CALL dbcsr_copy(snapshot%overlap, matrix_s(1)%matrix)
320 END IF
321
322 CALL get_qs_env(qs_env, kpoints=kpoints)
323 IF (ASSOCIATED(kpoints)) THEN
324 IF (ASSOCIATED(kpoints%kp_env)) THEN
325 ! --- k-point WFN snapshot: store complex MO coefficients per local k-point ---
326 IF (wf_history%store_wf_kp) THEN
327 CALL get_kpoint_info(kpoints, kp_range=kp_range)
328 kplocal = kp_range(2) - kp_range(1) + 1
329 nspin_kp = SIZE(kpoints%kp_env(1)%kpoint_env%mos, 2)
330 nc = SIZE(kpoints%kp_env(1)%kpoint_env%mos, 1) ! 2=complex, 1=real
331
332 IF (ASSOCIATED(snapshot%wf_kp)) THEN
333 DO ikp = 1, SIZE(snapshot%wf_kp, 1)
334 DO ic = 1, SIZE(snapshot%wf_kp, 2)
335 DO ispin = 1, SIZE(snapshot%wf_kp, 3)
336 CALL cp_fm_release(snapshot%wf_kp(ikp, ic, ispin))
337 END DO
338 END DO
339 END DO
340 DEALLOCATE (snapshot%wf_kp)
341 END IF
342
343 ALLOCATE (snapshot%wf_kp(kplocal, nc, nspin_kp))
344 DO ikp = 1, kplocal
345 kp => kpoints%kp_env(ikp)%kpoint_env
346 DO ispin = 1, nspin_kp
347 DO ic = 1, nc
348 CALL get_mo_set(kp%mos(ic, ispin), mo_coeff=mo_coeff)
349 CALL cp_fm_create(snapshot%wf_kp(ikp, ic, ispin), &
350 mo_coeff%matrix_struct, &
351 name="wfkp_snap")
352 CALL cp_fm_to_fm(mo_coeff, snapshot%wf_kp(ikp, ic, ispin))
353 END DO
354 END DO
355 END DO
356 END IF
357
358 ! --- k-point overlap snapshot: Fourier-transform S(R)→S(k) NOW and store as cfm ---
359 ! This is critical: we MUST transform at snapshot time using the CURRENT neighbor
360 ! list. Storing S(R) and re-transforming later would use a stale neighbor list,
361 ! producing wrong S(k) when the neighbor list changes during MD.
362 IF (wf_history%store_overlap_kp) THEN
363 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s_kp, scf_env=scf_env)
364 CALL get_kpoint_info(kpoints, nkp=nkp_all, xkp=xkp, kp_range=kp_range, &
365 nkp_groups=nkp_grps, kp_dist=kp_dist, &
366 sab_nl=sab_nl, cell_to_index=cell_to_index)
367 kplocal = kp_range(2) - kp_range(1) + 1
368 para_env_ft => kpoints%blacs_env_all%para_env
369
370 ! Allocate dbcsr work matrices for FT (same pattern as do_general_diag_kp)
371 ALLOCATE (rmat_ft, cmat_ft, tmpmat_ft)
372 CALL dbcsr_create(rmat_ft, template=matrix_s_kp(1, 1)%matrix, &
373 matrix_type=dbcsr_type_symmetric)
374 CALL dbcsr_create(cmat_ft, template=matrix_s_kp(1, 1)%matrix, &
375 matrix_type=dbcsr_type_antisymmetric)
376 CALL dbcsr_create(tmpmat_ft, template=matrix_s_kp(1, 1)%matrix, &
377 matrix_type=dbcsr_type_no_symmetry)
378 CALL cp_dbcsr_alloc_block_from_nbl(rmat_ft, sab_nl)
379 CALL cp_dbcsr_alloc_block_from_nbl(cmat_ft, sab_nl)
380
381 ! Get kp-subgroup FM from pool
382 CALL get_kpoint_info(kpoints, mpools=mpools_kp)
383 CALL mpools_get(mpools_kp, ao_ao_fm_pools=ao_ao_fm_pools)
384 CALL fm_pool_create_fm(ao_ao_fm_pools(1)%pool, fmlocal_ft)
385
386 ! Release old snapshot if present
387 IF (ASSOCIATED(snapshot%overlap_cfm_kp)) THEN
388 DO ikp = 1, SIZE(snapshot%overlap_cfm_kp)
389 CALL cp_cfm_release(snapshot%overlap_cfm_kp(ikp))
390 END DO
391 DEALLOCATE (snapshot%overlap_cfm_kp)
392 END IF
393 ALLOCATE (snapshot%overlap_cfm_kp(kplocal))
394
395 CALL cp_fm_get_info(fmlocal_ft, matrix_struct=ao_ao_struct_ft)
396
397 ! Communication info array
398 ALLOCATE (info_ft(kplocal*nkp_grps, 2))
399
400 ! Phase A: Start async FT + redistribute for each k-point
401 indx_ft = 0
402 DO ikp = 1, kplocal
403 DO igroup = 1, nkp_grps
404 ik = kp_dist(1, igroup) + ikp - 1
405 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
406 indx_ft = indx_ft + 1
407
408 CALL dbcsr_set(rmat_ft, 0.0_dp)
409 CALL dbcsr_set(cmat_ft, 0.0_dp)
410 CALL rskp_transform(rmatrix=rmat_ft, cmatrix=cmat_ft, rsmat=matrix_s_kp, &
411 ispin=1, xkp=xkp(1:3, ik), &
412 cell_to_index=cell_to_index, sab_nl=sab_nl)
413 CALL dbcsr_desymmetrize(rmat_ft, tmpmat_ft)
414 CALL copy_dbcsr_to_fm(tmpmat_ft, scf_env%scf_work1(1))
415 CALL dbcsr_desymmetrize(cmat_ft, tmpmat_ft)
416 CALL copy_dbcsr_to_fm(tmpmat_ft, scf_env%scf_work1(2))
417
418 IF (my_kpgrp) THEN
419 CALL cp_fm_start_copy_general(scf_env%scf_work1(1), fmlocal_ft, &
420 para_env_ft, info_ft(indx_ft, 1))
421 CALL cp_fm_start_copy_general(scf_env%scf_work1(2), fmlocal_ft, &
422 para_env_ft, info_ft(indx_ft, 2))
423 ELSE
424 CALL cp_fm_start_copy_general(scf_env%scf_work1(1), fmdummy_ft, &
425 para_env_ft, info_ft(indx_ft, 1))
426 CALL cp_fm_start_copy_general(scf_env%scf_work1(2), fmdummy_ft, &
427 para_env_ft, info_ft(indx_ft, 2))
428 END IF
429 END DO
430 END DO
431
432 ! Phase B: Finish communication and assemble S(k) as cfm
433 indx_ft = 0
434 DO ikp = 1, kplocal
435 CALL cp_cfm_create(snapshot%overlap_cfm_kp(ikp), ao_ao_struct_ft)
436 CALL cp_cfm_set_all(snapshot%overlap_cfm_kp(ikp), z_zero)
437 DO igroup = 1, nkp_grps
438 ik = kp_dist(1, igroup) + ikp - 1
439 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
440 indx_ft = indx_ft + 1
441 IF (my_kpgrp) THEN
442 CALL cp_fm_finish_copy_general(fmlocal_ft, info_ft(indx_ft, 1))
443 CALL cp_cfm_scale_and_add_fm(z_zero, snapshot%overlap_cfm_kp(ikp), &
444 z_one, fmlocal_ft)
445 CALL cp_fm_finish_copy_general(fmlocal_ft, info_ft(indx_ft, 2))
446 CALL cp_cfm_scale_and_add_fm(z_one, snapshot%overlap_cfm_kp(ikp), &
447 gaussi, fmlocal_ft)
448 END IF
449 END DO
450 END DO
451
452 ! Cleanup
453 DO indx_ft = 1, kplocal*nkp_grps
454 CALL cp_fm_cleanup_copy_general(info_ft(indx_ft, 1))
455 CALL cp_fm_cleanup_copy_general(info_ft(indx_ft, 2))
456 END DO
457 DEALLOCATE (info_ft)
458 CALL fm_pool_give_back_fm(ao_ao_fm_pools(1)%pool, fmlocal_ft)
459 CALL dbcsr_deallocate_matrix(rmat_ft)
460 CALL dbcsr_deallocate_matrix(cmat_ft)
461 CALL dbcsr_deallocate_matrix(tmpmat_ft)
462 END IF
463 END IF
464 END IF
465
466 IF (wf_history%store_frozen_density) THEN
467 ! do nothing
468 ! CALL deallocate_matrix_set(snapshot%rho_frozen%rho_ao)
469 END IF
470
471 CALL timestop(handle)
472
473 END SUBROUTINE wfs_update
474
475! **************************************************************************************************
476!> \brief ...
477!> \param wf_history ...
478!> \param interpolation_method_nr the tag of the method used for
479!> the extrapolation of the initial density for the next md step
480!> (see qs_wf_history_types:wfi_*_method_nr)
481!> \param extrapolation_order ...
482!> \param has_unit_metric ...
483!> \par History
484!> 02.2003 created [fawzi]
485!> \author fawzi
486! **************************************************************************************************
487 SUBROUTINE wfi_create(wf_history, interpolation_method_nr, extrapolation_order, &
488 has_unit_metric)
489 TYPE(qs_wf_history_type), POINTER :: wf_history
490 INTEGER, INTENT(in) :: interpolation_method_nr, &
491 extrapolation_order
492 LOGICAL, INTENT(IN) :: has_unit_metric
493
494 CHARACTER(len=*), PARAMETER :: routinen = 'wfi_create'
495
496 INTEGER :: handle, i
497
498 CALL timeset(routinen, handle)
499
500 ALLOCATE (wf_history)
501 wf_history%ref_count = 1
502 wf_history%memory_depth = 0
503 wf_history%snapshot_count = 0
504 wf_history%last_state_index = 1
505 wf_history%store_wf = .false.
506 wf_history%store_rho_r = .false.
507 wf_history%store_rho_g = .false.
508 wf_history%store_rho_ao = .false.
509 wf_history%store_rho_ao_kp = .false.
510 wf_history%store_overlap = .false.
511 wf_history%store_wf_kp = .false.
512 wf_history%store_overlap_kp = .false.
513 wf_history%store_frozen_density = .false.
514 NULLIFY (wf_history%past_states)
515
516 wf_history%interpolation_method_nr = interpolation_method_nr
517
518 SELECT CASE (wf_history%interpolation_method_nr)
520 wf_history%memory_depth = 0
522 wf_history%memory_depth = 0
524 wf_history%memory_depth = 1
525 wf_history%store_rho_ao = .true.
527 wf_history%memory_depth = 1
528 wf_history%store_rho_ao = .true.
530 wf_history%memory_depth = 2
531 wf_history%store_wf = .true.
533 wf_history%memory_depth = 2
534 wf_history%store_rho_ao = .true.
536 wf_history%memory_depth = 2
537 wf_history%store_wf = .true.
538 IF (.NOT. has_unit_metric) wf_history%store_overlap = .true.
539 CASE (wfi_ps_method_nr)
540 CALL cite_reference(vandevondele2005a)
541 wf_history%memory_depth = extrapolation_order + 1
542 wf_history%store_wf = .true.
543 wf_history%store_wf_kp = .true.
544 IF (.NOT. has_unit_metric) THEN
545 wf_history%store_overlap = .true.
546 wf_history%store_overlap_kp = .true.
547 END IF
549 wf_history%memory_depth = 1
550 wf_history%store_frozen_density = .true.
551 CASE (wfi_aspc_nr)
552 wf_history%memory_depth = extrapolation_order + 2
553 wf_history%store_wf = .true.
554 wf_history%store_wf_kp = .true.
555 IF (.NOT. has_unit_metric) THEN
556 wf_history%store_overlap = .true.
557 wf_history%store_overlap_kp = .true.
558 END IF
559 CASE default
560 CALL cp_abort(__location__, &
561 "Unknown interpolation method: "// &
562 trim(adjustl(cp_to_string(interpolation_method_nr))))
563 wf_history%interpolation_method_nr = wfi_use_prev_rho_r_method_nr
564 END SELECT
565 ALLOCATE (wf_history%past_states(wf_history%memory_depth))
566
567 DO i = 1, SIZE(wf_history%past_states)
568 NULLIFY (wf_history%past_states(i)%snapshot)
569 END DO
570
571 CALL timestop(handle)
572 END SUBROUTINE wfi_create
573
574! **************************************************************************************************
575!> \brief Adapts wf_history storage flags for k-point calculations.
576!> For ASPC, switches from Gamma WFN storage to k-point WFN storage.
577!> Other WFN-based methods remain blocked.
578!> \param wf_history ...
579!> \par History
580!> 06.2015 created [jhu]
581!> \author jhu
582! **************************************************************************************************
583 SUBROUTINE wfi_create_for_kp(wf_history)
584 TYPE(qs_wf_history_type), POINTER :: wf_history
585
586 cpassert(ASSOCIATED(wf_history))
587 IF (wf_history%store_rho_ao) THEN
588 wf_history%store_rho_ao_kp = .true.
589 wf_history%store_rho_ao = .false.
590 END IF
591 ! KP-compatible PS and ASPC: switch from Gamma WFN storage to KP WFN storage
592 IF (wf_history%store_wf_kp) THEN
593 wf_history%store_wf = .false.
594 wf_history%store_overlap = .false.
595 ! store_wf_kp and store_overlap_kp remain TRUE
596 ELSE
597 ! Linear methods (except LINEAR_P) are still blocked
598 IF (wf_history%store_wf .OR. wf_history%store_overlap) THEN
599 cpabort("Linear WFN-based extrapolation methods not implemented for k-points.")
600 END IF
601 END IF
602 IF (wf_history%store_frozen_density) THEN
603 cpabort("Frozen density initialization method not possible for kpoints.")
604 END IF
605
606 END SUBROUTINE wfi_create_for_kp
607
608! **************************************************************************************************
609!> \brief returns a string describing the interpolation method
610!> \param method_nr ...
611!> \return ...
612!> \par History
613!> 02.2003 created [fawzi]
614!> \author fawzi
615! **************************************************************************************************
616 FUNCTION wfi_get_method_label(method_nr) RESULT(res)
617 INTEGER, INTENT(in) :: method_nr
618 CHARACTER(len=30) :: res
619
620 res = "unknown"
621 SELECT CASE (method_nr)
623 res = "previous_p"
625 res = "previous_wf"
627 res = "previous_rho_r"
629 res = "initial_guess"
631 res = "mo linear"
633 res = "P linear"
635 res = "PS linear"
636 CASE (wfi_ps_method_nr)
637 res = "PS Nth order"
639 res = "frozen density approximation"
640 CASE (wfi_aspc_nr)
641 res = "ASPC"
642 CASE default
643 CALL cp_abort(__location__, &
644 "Unknown interpolation method: "// &
645 trim(adjustl(cp_to_string(method_nr))))
646 END SELECT
647 END FUNCTION wfi_get_method_label
648
649! **************************************************************************************************
650!> \brief calculates the new starting state for the scf for the next
651!> wf optimization
652!> \param wf_history the previous history needed to extrapolate
653!> \param qs_env the qs env with the latest result, and that will contain
654!> the new starting state
655!> \param dt the time at which to extrapolate (wrt. to the last snapshot)
656!> \param extrapolation_method_nr returns the extrapolation method used
657!> \param orthogonal_wf ...
658!> \par History
659!> 02.2003 created [fawzi]
660!> 11.2003 Joost VandeVondele : Implemented Nth order PS extrapolation
661!> \author fawzi
662! **************************************************************************************************
663 SUBROUTINE wfi_extrapolate(wf_history, qs_env, dt, extrapolation_method_nr, &
664 orthogonal_wf)
665 TYPE(qs_wf_history_type), POINTER :: wf_history
666 TYPE(qs_environment_type), POINTER :: qs_env
667 REAL(kind=dp), INTENT(IN) :: dt
668 INTEGER, INTENT(OUT), OPTIONAL :: extrapolation_method_nr
669 LOGICAL, INTENT(OUT), OPTIONAL :: orthogonal_wf
670
671 CHARACTER(len=*), PARAMETER :: routinen = 'wfi_extrapolate'
672
673 INTEGER :: actual_extrapolation_method_nr, handle, &
674 i, img, io_unit, ispin, k, n, nmo, &
675 nvec, print_level
676 LOGICAL :: do_kpoints, my_orthogonal_wf, use_overlap
677 REAL(kind=dp) :: alpha, t0, t1, t2
678 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
679 TYPE(cp_fm_struct_type), POINTER :: matrix_struct, matrix_struct_new
680 TYPE(cp_fm_type) :: csc, fm_tmp
681 TYPE(cp_fm_type), POINTER :: mo_coeff
682 TYPE(cp_logger_type), POINTER :: logger
683 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao, rho_frozen_ao
684 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
685 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
686 TYPE(qs_rho_type), POINTER :: rho
687 TYPE(qs_wf_snapshot_type), POINTER :: t0_state, t1_state
688
689 NULLIFY (mos, ao_mo_fm_pools, t0_state, t1_state, mo_coeff, &
690 rho, rho_ao, rho_frozen_ao)
691
692 use_overlap = wf_history%store_overlap
693
694 CALL timeset(routinen, handle)
695 logger => cp_get_default_logger()
696 print_level = logger%iter_info%print_level
697 io_unit = cp_print_key_unit_nr(logger, qs_env%input, "DFT%SCF%PRINT%PROGRAM_RUN_INFO", &
698 extension=".scfLog")
699
700 cpassert(ASSOCIATED(wf_history))
701 cpassert(wf_history%ref_count > 0)
702 cpassert(ASSOCIATED(qs_env))
703 CALL get_qs_env(qs_env, mos=mos, rho=rho, do_kpoints=do_kpoints)
704 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
705 ! chooses the method for this extrapolation
706 IF (wf_history%snapshot_count < 1) THEN
707 actual_extrapolation_method_nr = wfi_use_guess_method_nr
708 ELSE
709 actual_extrapolation_method_nr = wf_history%interpolation_method_nr
710 END IF
711
712 SELECT CASE (actual_extrapolation_method_nr)
714 IF (wf_history%snapshot_count < 2) THEN
715 actual_extrapolation_method_nr = wfi_use_prev_wf_method_nr
716 END IF
718 IF (wf_history%snapshot_count < 2) THEN
719 actual_extrapolation_method_nr = wfi_use_prev_wf_method_nr
720 END IF
722 IF (wf_history%snapshot_count < 2) THEN
723 actual_extrapolation_method_nr = wfi_use_prev_wf_method_nr
724 END IF
725 END SELECT
726
727 IF (PRESENT(extrapolation_method_nr)) &
728 extrapolation_method_nr = actual_extrapolation_method_nr
729 my_orthogonal_wf = .false.
730
731 SELECT CASE (actual_extrapolation_method_nr)
733 cpassert(.NOT. do_kpoints)
734 t0_state => wfi_get_snapshot(wf_history, wf_index=1)
735 cpassert(ASSOCIATED(t0_state%rho_frozen))
736
737 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
738 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
739
740 CALL qs_rho_get(t0_state%rho_frozen, rho_ao=rho_frozen_ao)
741 CALL qs_rho_get(rho, rho_ao=rho_ao)
742 DO ispin = 1, SIZE(rho_frozen_ao)
743 CALL dbcsr_copy(rho_ao(ispin)%matrix, &
744 rho_frozen_ao(ispin)%matrix, &
745 keep_sparsity=.true.)
746 END DO
747 !FM updating rho_ao directly with t0_state%rho_ao would have the
748 !FM wrong matrix structure
749 CALL qs_rho_update_rho(rho, qs_env=qs_env)
750 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
751
752 my_orthogonal_wf = .false.
754 t0_state => wfi_get_snapshot(wf_history, wf_index=1)
755 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
756 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
757 IF (do_kpoints) THEN
758 cpassert(ASSOCIATED(t0_state%rho_ao_kp))
759 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
760 DO ispin = 1, SIZE(t0_state%rho_ao_kp, 1)
761 DO img = 1, SIZE(t0_state%rho_ao_kp, 2)
762 IF (img > SIZE(rho_ao_kp, 2)) THEN
763 cpwarn("Change in cell neighborlist: might affect quality of initial guess")
764 ELSE
765 CALL dbcsr_copy(rho_ao_kp(ispin, img)%matrix, &
766 t0_state%rho_ao_kp(ispin, img)%matrix, &
767 keep_sparsity=.true.)
768 END IF
769 END DO
770 END DO
771 ELSE
772 cpassert(ASSOCIATED(t0_state%rho_ao))
773 CALL qs_rho_get(rho, rho_ao=rho_ao)
774 DO ispin = 1, SIZE(t0_state%rho_ao)
775 CALL dbcsr_copy(rho_ao(ispin)%matrix, &
776 t0_state%rho_ao(ispin)%matrix, &
777 keep_sparsity=.true.)
778 END DO
779 END IF
780 ! Why is rho_g valid at this point ?
781 CALL qs_rho_set(rho, rho_g_valid=.true.)
782
783 ! does nothing
785 my_orthogonal_wf = .true.
786 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
787 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
788
789 IF (do_kpoints) THEN
790 CALL wfi_use_prev_wf_kp(qs_env, io_unit, print_level)
791 ELSE
792 CALL qs_rho_get(rho, rho_ao=rho_ao)
793 DO ispin = 1, SIZE(mos)
794 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
795 CALL reorthogonalize_vectors(qs_env, v_matrix=mo_coeff, n_col=nmo)
796 CALL calculate_density_matrix(mo_set=mos(ispin), density_matrix=rho_ao(ispin)%matrix)
797 END DO
798 CALL qs_rho_update_rho(rho, qs_env=qs_env)
799 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
800 END IF
801
803 t0_state => wfi_get_snapshot(wf_history, wf_index=1)
804 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
805 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
806 IF (do_kpoints) THEN
807 cpassert(ASSOCIATED(t0_state%rho_ao_kp))
808 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
809 DO ispin = 1, SIZE(t0_state%rho_ao_kp, 1)
810 DO img = 1, SIZE(t0_state%rho_ao_kp, 2)
811 IF (img > SIZE(rho_ao_kp, 2)) THEN
812 cpwarn("Change in cell neighborlist: might affect quality of initial guess")
813 ELSE
814 CALL dbcsr_copy(rho_ao_kp(ispin, img)%matrix, &
815 t0_state%rho_ao_kp(ispin, img)%matrix, &
816 keep_sparsity=.true.)
817 END IF
818 END DO
819 END DO
820 ELSE
821 cpassert(ASSOCIATED(t0_state%rho_ao))
822 CALL qs_rho_get(rho, rho_ao=rho_ao)
823 DO ispin = 1, SIZE(t0_state%rho_ao)
824 CALL dbcsr_copy(rho_ao(ispin)%matrix, &
825 t0_state%rho_ao(ispin)%matrix, &
826 keep_sparsity=.true.)
827 END DO
828 END IF
829 !FM updating rho_ao directly with t0_state%rho_ao would have the
830 !FM wrong matrix structure
831 CALL qs_rho_update_rho(rho, qs_env=qs_env)
832 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
833
835 !FM more clean to do it here, but it
836 !FM might need to read a file (restart) and thus globenv
837 !FM I do not want globenv here, thus done by the caller
838 !FM (btw. it also needs the eigensolver, and unless you relocate it
839 !FM gives circular dependencies)
840 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
841 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
843 cpassert(.NOT. do_kpoints)
844 t0_state => wfi_get_snapshot(wf_history, wf_index=2)
845 t1_state => wfi_get_snapshot(wf_history, wf_index=1)
846 cpassert(ASSOCIATED(t0_state))
847 cpassert(ASSOCIATED(t1_state))
848 cpassert(ASSOCIATED(t0_state%wf))
849 cpassert(ASSOCIATED(t1_state%wf))
850 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
851 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
852
853 my_orthogonal_wf = .true.
854 t0 = 0.0_dp
855 t1 = t1_state%dt
856 t2 = t1 + dt
857 CALL qs_rho_get(rho, rho_ao=rho_ao)
858 DO ispin = 1, SIZE(mos)
859 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, &
860 nmo=nmo)
861 CALL cp_fm_scale_and_add(alpha=0.0_dp, &
862 matrix_a=mo_coeff, &
863 matrix_b=t1_state%wf(ispin), &
864 beta=(t2 - t0)/(t1 - t0))
865 ! this copy should be unnecessary
866 CALL cp_fm_scale_and_add(alpha=1.0_dp, &
867 matrix_a=mo_coeff, &
868 beta=(t1 - t2)/(t1 - t0), matrix_b=t0_state%wf(ispin))
869 CALL reorthogonalize_vectors(qs_env, &
870 v_matrix=mo_coeff, &
871 n_col=nmo)
872 CALL calculate_density_matrix(mo_set=mos(ispin), &
873 density_matrix=rho_ao(ispin)%matrix)
874 END DO
875 CALL qs_rho_update_rho(rho, qs_env=qs_env)
876
877 CALL qs_ks_did_change(qs_env%ks_env, &
878 rho_changed=.true.)
880 t0_state => wfi_get_snapshot(wf_history, wf_index=2)
881 t1_state => wfi_get_snapshot(wf_history, wf_index=1)
882 cpassert(ASSOCIATED(t0_state))
883 cpassert(ASSOCIATED(t1_state))
884 IF (do_kpoints) THEN
885 cpassert(ASSOCIATED(t0_state%rho_ao_kp))
886 cpassert(ASSOCIATED(t1_state%rho_ao_kp))
887 ELSE
888 cpassert(ASSOCIATED(t0_state%rho_ao))
889 cpassert(ASSOCIATED(t1_state%rho_ao))
890 END IF
891 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
892 CALL wfi_set_history_variables(qs_env=qs_env, nvec=nvec)
893
894 t0 = 0.0_dp
895 t1 = t1_state%dt
896 t2 = t1 + dt
897 IF (do_kpoints) THEN
898 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
899 DO ispin = 1, SIZE(rho_ao_kp, 1)
900 DO img = 1, SIZE(rho_ao_kp, 2)
901 IF (img > SIZE(t0_state%rho_ao_kp, 2) .OR. &
902 img > SIZE(t1_state%rho_ao_kp, 2)) THEN
903 cpwarn("Change in cell neighborlist: might affect quality of initial guess")
904 ELSE
905 CALL dbcsr_add(rho_ao_kp(ispin, img)%matrix, t1_state%rho_ao_kp(ispin, img)%matrix, &
906 alpha_scalar=0.0_dp, beta_scalar=(t2 - t0)/(t1 - t0)) ! this copy should be unnecessary
907 CALL dbcsr_add(rho_ao_kp(ispin, img)%matrix, t0_state%rho_ao_kp(ispin, img)%matrix, &
908 alpha_scalar=1.0_dp, beta_scalar=(t1 - t2)/(t1 - t0))
909 END IF
910 END DO
911 END DO
912 ELSE
913 CALL qs_rho_get(rho, rho_ao=rho_ao)
914 DO ispin = 1, SIZE(rho_ao)
915 CALL dbcsr_add(rho_ao(ispin)%matrix, t1_state%rho_ao(ispin)%matrix, &
916 alpha_scalar=0.0_dp, beta_scalar=(t2 - t0)/(t1 - t0)) ! this copy should be unnecessary
917 CALL dbcsr_add(rho_ao(ispin)%matrix, t0_state%rho_ao(ispin)%matrix, &
918 alpha_scalar=1.0_dp, beta_scalar=(t1 - t2)/(t1 - t0))
919 END DO
920 END IF
921 CALL qs_rho_update_rho(rho, qs_env=qs_env)
922 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
924 ! wf not calculated, extract with PSC renormalized?
925 ! use wf_linear?
926 cpassert(.NOT. do_kpoints)
927 t0_state => wfi_get_snapshot(wf_history, wf_index=2)
928 t1_state => wfi_get_snapshot(wf_history, wf_index=1)
929 cpassert(ASSOCIATED(t0_state))
930 cpassert(ASSOCIATED(t1_state))
931 cpassert(ASSOCIATED(t0_state%wf))
932 cpassert(ASSOCIATED(t1_state%wf))
933 IF (wf_history%store_overlap) THEN
934 cpassert(ASSOCIATED(t0_state%overlap))
935 cpassert(ASSOCIATED(t1_state%overlap))
936 END IF
937 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
938 IF (nvec >= wf_history%memory_depth) THEN
939 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. (qs_env%scf_control%eps_scf_hist /= 0)) THEN
940 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
941 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
942 qs_env%scf_control%outer_scf%have_scf = .false.
943 ELSE IF (qs_env%scf_control%max_scf_hist /= 0) THEN
944 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
945 qs_env%scf_control%outer_scf%have_scf = .false.
946 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0) THEN
947 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
948 END IF
949 END IF
950
951 my_orthogonal_wf = .true.
952 ! use PS_2=2 PS_1-PS_0
953 ! C_2 comes from using PS_2 as a projector acting on C_1
954 CALL qs_rho_get(rho, rho_ao=rho_ao)
955 DO ispin = 1, SIZE(mos)
956 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
957 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
958 CALL cp_fm_get_info(mo_coeff, nrow_global=n, ncol_global=k, &
959 matrix_struct=matrix_struct)
960 CALL cp_fm_struct_create(matrix_struct_new, template_fmstruct=matrix_struct, &
961 nrow_global=k, ncol_global=k)
962 CALL cp_fm_create(csc, matrix_struct_new)
963 CALL cp_fm_struct_release(matrix_struct_new)
964
965 IF (use_overlap) THEN
966 CALL cp_dbcsr_sm_fm_multiply(t0_state%overlap, t1_state%wf(ispin), mo_coeff, k)
967 CALL parallel_gemm('T', 'N', k, k, n, 1.0_dp, t0_state%wf(ispin), mo_coeff, 0.0_dp, csc)
968 ELSE
969 CALL parallel_gemm('T', 'N', k, k, n, 1.0_dp, t0_state%wf(ispin), &
970 t1_state%wf(ispin), 0.0_dp, csc)
971 END IF
972 CALL parallel_gemm('N', 'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, mo_coeff)
973 CALL cp_fm_release(csc)
974 CALL cp_fm_scale_and_add(-1.0_dp, mo_coeff, 2.0_dp, t1_state%wf(ispin))
975 CALL reorthogonalize_vectors(qs_env, &
976 v_matrix=mo_coeff, &
977 n_col=k)
978 CALL calculate_density_matrix(mo_set=mos(ispin), &
979 density_matrix=rho_ao(ispin)%matrix)
980 END DO
981 CALL qs_rho_update_rho(rho, qs_env=qs_env)
982 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
983
984 CASE (wfi_ps_method_nr)
985 ! figure out the actual number of vectors to use in the extrapolation:
986 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
987 cpassert(nvec > 0)
988 IF (nvec >= wf_history%memory_depth) THEN
989 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. (qs_env%scf_control%eps_scf_hist /= 0)) THEN
990 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
991 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
992 qs_env%scf_control%outer_scf%have_scf = .false.
993 ELSE IF (qs_env%scf_control%max_scf_hist /= 0) THEN
994 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
995 qs_env%scf_control%outer_scf%have_scf = .false.
996 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0) THEN
997 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
998 END IF
999 END IF
1000
1001 IF (do_kpoints) THEN
1002 CALL wfi_extrapolate_ps_aspc_kp(wf_history, qs_env, nvec, io_unit, print_level)
1003 my_orthogonal_wf = .true.
1004 ELSE
1005 my_orthogonal_wf = .true.
1006 DO ispin = 1, SIZE(mos)
1007 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
1008 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1009 CALL cp_fm_get_info(mo_coeff, nrow_global=n, ncol_global=k, &
1010 matrix_struct=matrix_struct)
1011 CALL cp_fm_create(fm_tmp, matrix_struct)
1012 CALL cp_fm_struct_create(matrix_struct_new, template_fmstruct=matrix_struct, &
1013 nrow_global=k, ncol_global=k)
1014 CALL cp_fm_create(csc, matrix_struct_new)
1015 CALL cp_fm_struct_release(matrix_struct_new)
1016 ! first the most recent
1017 t1_state => wfi_get_snapshot(wf_history, wf_index=1)
1018 CALL cp_fm_to_fm(t1_state%wf(ispin), mo_coeff)
1019 alpha = nvec
1020 CALL cp_fm_scale(alpha, mo_coeff)
1021 CALL qs_rho_get(rho, rho_ao=rho_ao)
1022 DO i = 2, nvec
1023 t0_state => wfi_get_snapshot(wf_history, wf_index=i)
1024 IF (use_overlap) THEN
1025 CALL cp_dbcsr_sm_fm_multiply(t0_state%overlap, t1_state%wf(ispin), fm_tmp, k)
1026 CALL parallel_gemm('T', 'N', k, k, n, 1.0_dp, t0_state%wf(ispin), fm_tmp, 0.0_dp, csc)
1027 ELSE
1028 CALL parallel_gemm('T', 'N', k, k, n, 1.0_dp, t0_state%wf(ispin), &
1029 t1_state%wf(ispin), 0.0_dp, csc)
1030 END IF
1031 CALL parallel_gemm('N', 'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, fm_tmp)
1032 alpha = -1.0_dp*alpha*real(nvec - i + 1, dp)/real(i, dp)
1033 CALL cp_fm_scale_and_add(1.0_dp, mo_coeff, alpha, fm_tmp)
1034 END DO
1035
1036 CALL cp_fm_release(csc)
1037 CALL cp_fm_release(fm_tmp)
1038 CALL reorthogonalize_vectors(qs_env, &
1039 v_matrix=mo_coeff, &
1040 n_col=k)
1041 CALL calculate_density_matrix(mo_set=mos(ispin), &
1042 density_matrix=rho_ao(ispin)%matrix)
1043 END DO
1044 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1045 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1046 END IF
1047
1048 CASE (wfi_aspc_nr)
1049 CALL cite_reference(kolafa2004)
1050 CALL cite_reference(kuhne2007)
1051 ! figure out the actual number of vectors to use in the extrapolation:
1052 nvec = min(wf_history%memory_depth, wf_history%snapshot_count)
1053 cpassert(nvec > 0)
1054 IF (nvec >= wf_history%memory_depth) THEN
1055 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. &
1056 (qs_env%scf_control%eps_scf_hist /= 0)) THEN
1057 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1058 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1059 qs_env%scf_control%outer_scf%have_scf = .false.
1060 ELSE IF (qs_env%scf_control%max_scf_hist /= 0) THEN
1061 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1062 qs_env%scf_control%outer_scf%have_scf = .false.
1063 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0) THEN
1064 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1065 END IF
1066 END IF
1067
1068 IF (do_kpoints) THEN
1069 CALL wfi_extrapolate_ps_aspc_kp(wf_history, qs_env, nvec, io_unit, print_level)
1070 my_orthogonal_wf = .true.
1071 ELSE
1072 my_orthogonal_wf = .true.
1073 CALL qs_rho_get(rho, rho_ao=rho_ao)
1074 DO ispin = 1, SIZE(mos)
1075 NULLIFY (mo_coeff, matrix_struct, matrix_struct_new)
1076 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
1077 CALL cp_fm_get_info(mo_coeff, &
1078 nrow_global=n, &
1079 ncol_global=k, &
1080 matrix_struct=matrix_struct)
1081 CALL cp_fm_create(fm_tmp, matrix_struct, set_zero=.true.)
1082 CALL cp_fm_struct_create(matrix_struct_new, &
1083 template_fmstruct=matrix_struct, &
1084 nrow_global=k, &
1085 ncol_global=k)
1086 CALL cp_fm_create(csc, matrix_struct_new, set_zero=.true.)
1087 CALL cp_fm_struct_release(matrix_struct_new)
1088 ! first the most recent
1089 t1_state => wfi_get_snapshot(wf_history, &
1090 wf_index=1)
1091 CALL cp_fm_to_fm(t1_state%wf(ispin), mo_coeff)
1092 alpha = real(4*nvec - 2, kind=dp)/real(nvec + 1, kind=dp)
1093 IF ((io_unit > 0) .AND. (print_level > low_print_level)) THEN
1094 WRITE (unit=io_unit, fmt="(/,T2,A,/,/,T3,A,I0,/,/,T3,A2,I0,A4,F10.6)") &
1095 "Parameters for the always stable predictor-corrector (ASPC) method:", &
1096 "ASPC order: ", max(nvec - 2, 0), &
1097 "B(", 1, ") = ", alpha
1098 END IF
1099 CALL cp_fm_scale(alpha, mo_coeff)
1100
1101 DO i = 2, nvec
1102 t0_state => wfi_get_snapshot(wf_history, wf_index=i)
1103 IF (use_overlap) THEN
1104 CALL cp_dbcsr_sm_fm_multiply(t0_state%overlap, t1_state%wf(ispin), fm_tmp, k)
1105 CALL parallel_gemm('T', 'N', k, k, n, 1.0_dp, t0_state%wf(ispin), fm_tmp, 0.0_dp, csc)
1106 ELSE
1107 CALL parallel_gemm('T', 'N', k, k, n, 1.0_dp, t0_state%wf(ispin), &
1108 t1_state%wf(ispin), 0.0_dp, csc)
1109 END IF
1110 CALL parallel_gemm('N', 'N', n, k, k, 1.0_dp, t0_state%wf(ispin), csc, 0.0_dp, fm_tmp)
1111 alpha = (-1.0_dp)**(i + 1)*real(i, kind=dp)* &
1112 binomial(2*nvec, nvec - i)/binomial(2*nvec - 2, nvec - 1)
1113 IF ((io_unit > 0) .AND. (print_level > low_print_level)) THEN
1114 WRITE (unit=io_unit, fmt="(T3,A2,I0,A4,F10.6)") &
1115 "B(", i, ") = ", alpha
1116 END IF
1117 CALL cp_fm_scale_and_add(1.0_dp, mo_coeff, alpha, fm_tmp)
1118 END DO
1119 CALL cp_fm_release(csc)
1120 CALL cp_fm_release(fm_tmp)
1121 CALL reorthogonalize_vectors(qs_env, &
1122 v_matrix=mo_coeff, &
1123 n_col=k)
1124 CALL calculate_density_matrix(mo_set=mos(ispin), &
1125 density_matrix=rho_ao(ispin)%matrix)
1126 END DO
1127 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1128 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1129 END IF ! do_kpoints
1130
1131 CASE default
1132 CALL cp_abort(__location__, &
1133 "Unknown interpolation method: "// &
1134 trim(adjustl(cp_to_string(wf_history%interpolation_method_nr))))
1135 END SELECT
1136 IF (PRESENT(orthogonal_wf)) orthogonal_wf = my_orthogonal_wf
1137 CALL cp_print_key_finished_output(io_unit, logger, qs_env%input, &
1138 "DFT%SCF%PRINT%PROGRAM_RUN_INFO")
1139 CALL timestop(handle)
1140 END SUBROUTINE wfi_extrapolate
1141
1142! **************************************************************************************************
1143!> \brief Reorthogonalizes the wavefunctions from the previous step for k-points
1144!> using the current S(k) metric and rebuilds the density matrix.
1145!> \param qs_env The QS environment
1146!> \param io_unit output unit
1147!> \param print_level print level
1148! **************************************************************************************************
1149 SUBROUTINE wfi_use_prev_wf_kp(qs_env, io_unit, print_level)
1150 TYPE(qs_environment_type), POINTER :: qs_env
1151 INTEGER, INTENT(IN) :: io_unit, print_level
1152
1153 CHARACTER(len=*), PARAMETER :: routinen = 'wfi_use_prev_wf_kp'
1154
1155 COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:) :: col_scaling
1156 INTEGER :: chol_info, handle, igroup, ik, ikp, &
1157 indx, ispin, j, kplocal, nao, nkp, &
1158 nkp_groups, nmo, nspin
1159 INTEGER, DIMENSION(2) :: kp_range
1160 INTEGER, DIMENSION(:, :), POINTER :: kp_dist
1161 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
1162 LOGICAL :: my_kpgrp, use_real_wfn
1163 REAL(kind=dp) :: eval_thresh
1164 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: eigenvalues
1165 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp
1166 TYPE(copy_info_type), ALLOCATABLE, DIMENSION(:, :) :: info
1167 TYPE(cp_cfm_type) :: cfm_evecs, cfm_mhalf, cfm_nao_nmo_work, &
1168 cmos_new, csc_cfm
1169 TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:) :: csmat_cur
1170 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_ao_fm_pools_kp
1171 TYPE(cp_fm_struct_type), POINTER :: ao_ao_struct, nmo_nmo_struct
1172 TYPE(cp_fm_type) :: fmdummy, fmlocal
1173 TYPE(cp_fm_type), POINTER :: imos, mo_coeff, rmos
1174 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp, rho_ao_kp
1175 TYPE(dbcsr_type), POINTER :: cmatrix_db, rmatrix, tmpmat
1176 TYPE(dft_control_type), POINTER :: dft_control
1177 TYPE(kpoint_env_type), POINTER :: kp
1178 TYPE(kpoint_type), POINTER :: kpoints
1179 TYPE(mp_para_env_type), POINTER :: para_env
1180 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1181 POINTER :: sab_nl
1182 TYPE(qs_matrix_pools_type), POINTER :: mpools_kp
1183 TYPE(qs_rho_type), POINTER :: rho
1184 TYPE(qs_scf_env_type), POINTER :: scf_env
1185 TYPE(scf_control_type), POINTER :: scf_control
1186
1187 CALL timeset(routinen, handle)
1188
1189 NULLIFY (kpoints, dft_control, matrix_s_kp, scf_env, scf_control, rho, sab_nl, kp, mo_coeff, rmos, imos)
1190
1191 CALL get_qs_env(qs_env, kpoints=kpoints, dft_control=dft_control, &
1192 matrix_s_kp=matrix_s_kp, scf_env=scf_env, &
1193 scf_control=scf_control, rho=rho)
1194 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, &
1195 kp_range=kp_range, nkp_groups=nkp_groups, kp_dist=kp_dist, &
1196 sab_nl=sab_nl, cell_to_index=cell_to_index)
1197 kplocal = kp_range(2) - kp_range(1) + 1
1198
1199 IF (use_real_wfn) THEN
1200 CALL timestop(handle)
1201 RETURN
1202 END IF
1203
1204 kp => kpoints%kp_env(1)%kpoint_env
1205 nspin = SIZE(kp%mos, 2)
1206 CALL get_mo_set(kp%mos(1, 1), nao=nao, nmo=nmo, mo_coeff=mo_coeff)
1207
1208 IF ((io_unit > 0) .AND. (print_level > low_print_level)) THEN
1209 WRITE (unit=io_unit, fmt="(/,T2,A)") &
1210 "Using previous wavefunctions as initial guess for k-points (with reorthogonalization)"
1211 END IF
1212
1213 ! Allocate dbcsr work matrices
1214 ALLOCATE (rmatrix, cmatrix_db, tmpmat)
1215 CALL dbcsr_create(rmatrix, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
1216 CALL dbcsr_create(cmatrix_db, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_antisymmetric)
1217 CALL dbcsr_create(tmpmat, template=matrix_s_kp(1, 1)%matrix, matrix_type=dbcsr_type_no_symmetry)
1218 CALL cp_dbcsr_alloc_block_from_nbl(rmatrix, sab_nl)
1219 CALL cp_dbcsr_alloc_block_from_nbl(cmatrix_db, sab_nl)
1220
1221 CALL get_kpoint_info(kpoints, mpools=mpools_kp)
1222 CALL mpools_get(mpools_kp, ao_ao_fm_pools=ao_ao_fm_pools_kp)
1223 CALL fm_pool_create_fm(ao_ao_fm_pools_kp(1)%pool, fmlocal)
1224 CALL cp_fm_get_info(fmlocal, matrix_struct=ao_ao_struct)
1225
1226 CALL cp_cfm_create(cmos_new, mo_coeff%matrix_struct)
1227 CALL cp_cfm_create(cfm_nao_nmo_work, mo_coeff%matrix_struct)
1228
1229 NULLIFY (nmo_nmo_struct)
1230 CALL cp_fm_struct_create(nmo_nmo_struct, template_fmstruct=mo_coeff%matrix_struct, &
1231 nrow_global=nmo, ncol_global=nmo)
1232 CALL cp_cfm_create(csc_cfm, nmo_nmo_struct)
1233 CALL cp_fm_struct_release(nmo_nmo_struct)
1234
1235 para_env => kpoints%blacs_env_all%para_env
1236 ALLOCATE (info(kplocal*nkp_groups, 2))
1237
1238 ALLOCATE (csmat_cur(kplocal))
1239 DO ikp = 1, kplocal
1240 CALL cp_cfm_create(csmat_cur(ikp), ao_ao_struct)
1241 END DO
1242
1243 ! Phase A: Fourier Transform S(R) -> S(k)
1244 indx = 0
1245 DO ikp = 1, kplocal
1246 DO igroup = 1, nkp_groups
1247 ik = kp_dist(1, igroup) + ikp - 1
1248 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
1249 indx = indx + 1
1250
1251 CALL dbcsr_set(rmatrix, 0.0_dp)
1252 CALL dbcsr_set(cmatrix_db, 0.0_dp)
1253 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix_db, rsmat=matrix_s_kp, &
1254 ispin=1, xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
1255 CALL dbcsr_desymmetrize(rmatrix, tmpmat)
1256 CALL copy_dbcsr_to_fm(tmpmat, scf_env%scf_work1(1))
1257 CALL dbcsr_desymmetrize(cmatrix_db, tmpmat)
1258 CALL copy_dbcsr_to_fm(tmpmat, scf_env%scf_work1(2))
1259
1260 IF (my_kpgrp) THEN
1261 CALL cp_fm_start_copy_general(scf_env%scf_work1(1), fmlocal, para_env, info(indx, 1))
1262 CALL cp_fm_start_copy_general(scf_env%scf_work1(2), fmlocal, para_env, info(indx, 2))
1263 ELSE
1264 CALL cp_fm_start_copy_general(scf_env%scf_work1(1), fmdummy, para_env, info(indx, 1))
1265 CALL cp_fm_start_copy_general(scf_env%scf_work1(2), fmdummy, para_env, info(indx, 2))
1266 END IF
1267 END DO
1268 END DO
1269
1270 ! Finish Communication
1271 indx = 0
1272 DO ikp = 1, kplocal
1273 DO igroup = 1, nkp_groups
1274 ik = kp_dist(1, igroup) + ikp - 1
1275 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
1276 indx = indx + 1
1277 IF (my_kpgrp) THEN
1278 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 1))
1279 CALL cp_cfm_scale_and_add_fm(z_zero, csmat_cur(ikp), z_one, fmlocal)
1280 CALL cp_fm_finish_copy_general(fmlocal, info(indx, 2))
1281 CALL cp_cfm_scale_and_add_fm(z_one, csmat_cur(ikp), gaussi, fmlocal)
1282 END IF
1283 END DO
1284 END DO
1285
1286 DO indx = 1, kplocal*nkp_groups
1287 CALL cp_fm_cleanup_copy_general(info(indx, 1))
1288 CALL cp_fm_cleanup_copy_general(info(indx, 2))
1289 END DO
1290
1291 ! Phase B: Orthogonalize current MOs w.r.t. new S(k)
1292 ALLOCATE (eigenvalues(nmo))
1293 eval_thresh = 1.0e-12_dp
1294
1295 DO ikp = 1, kplocal
1296 kp => kpoints%kp_env(ikp)%kpoint_env
1297 DO ispin = 1, nspin
1298 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
1299 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1300 CALL cp_fm_to_cfm(rmos, imos, cmos_new)
1301
1302 CALL cp_cfm_gemm('N', 'N', nao, nmo, nao, z_one, &
1303 csmat_cur(ikp), cmos_new, z_zero, cfm_nao_nmo_work)
1304 CALL cp_cfm_gemm('C', 'N', nmo, nmo, nao, z_one, &
1305 cmos_new, cfm_nao_nmo_work, z_zero, csc_cfm)
1306
1307 CALL cp_cfm_cholesky_decompose(csc_cfm, info_out=chol_info)
1308 IF (chol_info == 0) THEN
1309 CALL cp_cfm_triangular_multiply(csc_cfm, cmos_new, side='R', invert_tr=.true., uplo_tr='U')
1310 ELSE
1311 CALL cp_cfm_gemm('C', 'N', nmo, nmo, nao, z_one, cmos_new, cfm_nao_nmo_work, z_zero, csc_cfm)
1312 CALL cp_cfm_create(cfm_evecs, csc_cfm%matrix_struct)
1313 CALL cp_cfm_create(cfm_mhalf, csc_cfm%matrix_struct)
1314 CALL cp_cfm_heevd(csc_cfm, cfm_evecs, eigenvalues)
1315 CALL cp_cfm_to_cfm(cfm_evecs, cfm_mhalf)
1316 ALLOCATE (col_scaling(nmo))
1317 DO j = 1, nmo
1318 IF (eigenvalues(j) > eval_thresh) THEN
1319 col_scaling(j) = cmplx(1.0_dp/sqrt(eigenvalues(j)), 0.0_dp, kind=dp)
1320 ELSE
1321 col_scaling(j) = z_zero
1322 END IF
1323 END DO
1324 CALL cp_cfm_column_scale(cfm_mhalf, col_scaling)
1325 DEALLOCATE (col_scaling)
1326 CALL cp_cfm_gemm('N', 'C', nmo, nmo, nmo, z_one, cfm_mhalf, cfm_evecs, z_zero, csc_cfm)
1327 CALL cp_cfm_gemm('N', 'N', nao, nmo, nmo, z_one, cmos_new, csc_cfm, z_zero, cfm_nao_nmo_work)
1328 CALL cp_cfm_to_cfm(cfm_nao_nmo_work, cmos_new)
1329 CALL cp_cfm_release(cfm_evecs)
1330 CALL cp_cfm_release(cfm_mhalf)
1331 END IF
1332 CALL cp_cfm_to_fm(cmos_new, rmos, imos)
1333 END DO
1334 END DO
1335 DEALLOCATE (eigenvalues)
1336
1337 ! Phase C: Rebuild Density Matrix P(R)
1338 CALL kpoint_set_mo_occupation(kpoints, scf_control%smear)
1339 CALL kpoint_density_matrices(kpoints)
1340 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1341 CALL kpoint_density_transform(kpoints, rho_ao_kp, .false., &
1342 matrix_s_kp(1, 1)%matrix, sab_nl, scf_env%scf_work1)
1343 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1344 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1345
1346 ! Cleanup
1347 DO ikp = 1, kplocal
1348 CALL cp_cfm_release(csmat_cur(ikp))
1349 END DO
1350 DEALLOCATE (csmat_cur)
1351 DEALLOCATE (info)
1352 CALL cp_cfm_release(cmos_new)
1353 CALL cp_cfm_release(cfm_nao_nmo_work)
1354 CALL cp_cfm_release(csc_cfm)
1355 CALL fm_pool_give_back_fm(ao_ao_fm_pools_kp(1)%pool, fmlocal)
1356 CALL dbcsr_deallocate_matrix(rmatrix)
1357 CALL dbcsr_deallocate_matrix(cmatrix_db)
1358 CALL dbcsr_deallocate_matrix(tmpmat)
1359
1360 CALL timestop(handle)
1361 END SUBROUTINE wfi_use_prev_wf_kp
1362
1363! **************************************************************************************************
1364!> \brief Performs PS/ASPC wavefunction extrapolation for k-point calculations.
1365!> Applies PS/ASPC coefficients to complex MO coefficients at each k-point,
1366!> with subspace alignment via historical overlap matrices.
1367!> Delegates final orthogonalization and density building to wfi_use_prev_wf_kp.
1368!> \param wf_history wavefunction history buffer
1369!> \param qs_env QS environment
1370!> \param nvec number of history snapshots to use
1371!> \param io_unit output unit for logging
1372!> \param print_level current print level
1373! **************************************************************************************************
1374 SUBROUTINE wfi_extrapolate_ps_aspc_kp(wf_history, qs_env, nvec, io_unit, print_level)
1375 TYPE(qs_wf_history_type), POINTER :: wf_history
1376 TYPE(qs_environment_type), POINTER :: qs_env
1377 INTEGER, INTENT(IN) :: nvec, io_unit, print_level
1378
1379 CHARACTER(len=*), PARAMETER :: routinen = 'wfi_extrapolate_ps_aspc_kp'
1380
1381 INTEGER :: handle, i, ikp, ispin, kplocal, &
1382 method_nr, nao, nmo, nspin
1383 INTEGER, DIMENSION(2) :: kp_range
1384 LOGICAL :: use_real_wfn
1385 REAL(kind=dp) :: alpha_coeff
1386 TYPE(cp_cfm_type) :: cfm_nao_nmo_work, cmos_1, cmos_i, &
1387 cmos_new, csc_cfm
1388 TYPE(cp_fm_struct_type), POINTER :: nmo_nmo_struct
1389 TYPE(cp_fm_type), POINTER :: imos, mo_coeff, rmos
1390 TYPE(kpoint_env_type), POINTER :: kp
1391 TYPE(kpoint_type), POINTER :: kpoints
1392 TYPE(qs_wf_snapshot_type), POINTER :: t0_state, t1_state
1393
1394 method_nr = wf_history%interpolation_method_nr
1395
1396 CALL timeset(routinen, handle)
1397 NULLIFY (kpoints, kp, mo_coeff, rmos, imos, t0_state, t1_state, nmo_nmo_struct)
1398
1399 CALL get_qs_env(qs_env, kpoints=kpoints)
1400 CALL get_kpoint_info(kpoints, use_real_wfn=use_real_wfn, kp_range=kp_range)
1401 kplocal = kp_range(2) - kp_range(1) + 1
1402
1403 IF (use_real_wfn) THEN
1404 IF (method_nr == wfi_aspc_nr) THEN
1405 CALL cp_warn(__location__, "ASPC with k-points requires complex wavefunctions; "// &
1406 "falling back to USE_PREV_WF.")
1407 ELSE
1408 CALL cp_warn(__location__, "PS with k-points requires complex wavefunctions; "// &
1409 "falling back to USE_PREV_WF.")
1410 END IF
1411 CALL wfi_use_prev_wf_kp(qs_env, io_unit, print_level)
1412 CALL timestop(handle)
1413 RETURN
1414 END IF
1415
1416 kp => kpoints%kp_env(1)%kpoint_env
1417 nspin = SIZE(kp%mos, 2)
1418 CALL get_mo_set(kp%mos(1, 1), nao=nao, nmo=nmo, mo_coeff=mo_coeff)
1419
1420 IF (method_nr == wfi_aspc_nr) THEN
1421 IF ((io_unit > 0) .AND. (print_level > low_print_level)) THEN
1422 WRITE (unit=io_unit, fmt="(/,T2,A,/,T3,A,I0)") &
1423 "Parameters for the always stable predictor-corrector (ASPC) method:", &
1424 "ASPC order: ", max(nvec - 2, 0)
1425 END IF
1426 END IF
1427
1428 IF (method_nr == wfi_aspc_nr) THEN
1429 CALL cp_cfm_create(cmos_new, mo_coeff%matrix_struct, set_zero=.true.)
1430 CALL cp_cfm_create(cmos_1, mo_coeff%matrix_struct, set_zero=.true.)
1431 CALL cp_cfm_create(cmos_i, mo_coeff%matrix_struct, set_zero=.true.)
1432 CALL cp_cfm_create(cfm_nao_nmo_work, mo_coeff%matrix_struct, set_zero=.true.)
1433 ELSE
1434 CALL cp_cfm_create(cmos_new, mo_coeff%matrix_struct)
1435 CALL cp_cfm_create(cmos_1, mo_coeff%matrix_struct)
1436 CALL cp_cfm_create(cmos_i, mo_coeff%matrix_struct)
1437 CALL cp_cfm_create(cfm_nao_nmo_work, mo_coeff%matrix_struct)
1438 END IF
1439
1440 CALL cp_fm_struct_create(nmo_nmo_struct, template_fmstruct=mo_coeff%matrix_struct, &
1441 nrow_global=nmo, ncol_global=nmo)
1442 IF (method_nr == wfi_aspc_nr) THEN
1443 CALL cp_cfm_create(csc_cfm, nmo_nmo_struct, set_zero=.true.)
1444 ELSE
1445 CALL cp_cfm_create(csc_cfm, nmo_nmo_struct)
1446 END IF
1447 CALL cp_fm_struct_release(nmo_nmo_struct)
1448
1449 ! Phase 1: Initialize C_new(k) = B(1) * C_1(k)
1450 t1_state => wfi_get_snapshot(wf_history, wf_index=1)
1451 IF (method_nr == wfi_aspc_nr) THEN
1452 alpha_coeff = real(4*nvec - 2, kind=dp)/real(nvec + 1, kind=dp)
1453 IF ((io_unit > 0) .AND. (print_level > low_print_level)) THEN
1454 WRITE (unit=io_unit, fmt="(T3,A2,I0,A4,F10.6)") "B(", 1, ") = ", alpha_coeff
1455 END IF
1456 ELSE
1457 alpha_coeff = nvec
1458 END IF
1459
1460 DO ikp = 1, kplocal
1461 kp => kpoints%kp_env(ikp)%kpoint_env
1462 DO ispin = 1, nspin
1463 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
1464 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1465 CALL cp_fm_to_fm(t1_state%wf_kp(ikp, 1, ispin), rmos)
1466 CALL cp_fm_to_fm(t1_state%wf_kp(ikp, 2, ispin), imos)
1467 CALL cp_fm_scale(alpha_coeff, rmos)
1468 CALL cp_fm_scale(alpha_coeff, imos)
1469 END DO
1470 END DO
1471
1472 ! Phase 2: Accumulate historical snapshots C_new += B(i) * C_proj(k)
1473 DO i = 2, nvec
1474 t0_state => wfi_get_snapshot(wf_history, wf_index=i)
1475 IF (method_nr == wfi_aspc_nr) THEN
1476 alpha_coeff = (-1.0_dp)**(i + 1)*real(i, kind=dp)* &
1477 binomial(2*nvec, nvec - i)/binomial(2*nvec - 2, nvec - 1)
1478 IF ((io_unit > 0) .AND. (print_level > low_print_level)) THEN
1479 WRITE (unit=io_unit, fmt="(T3,A2,I0,A4,F10.6)") "B(", i, ") = ", alpha_coeff
1480 END IF
1481 ELSE
1482 alpha_coeff = -1.0_dp*alpha_coeff*real(nvec - i + 1, dp)/real(i, dp)
1483 END IF
1484
1485 DO ikp = 1, kplocal
1486 kp => kpoints%kp_env(ikp)%kpoint_env
1487 DO ispin = 1, nspin
1488 CALL cp_fm_to_cfm(t1_state%wf_kp(ikp, 1, ispin), t1_state%wf_kp(ikp, 2, ispin), cmos_1)
1489 CALL cp_fm_to_cfm(t0_state%wf_kp(ikp, 1, ispin), t0_state%wf_kp(ikp, 2, ispin), cmos_i)
1490
1491 ! Subspace projection: C_proj = C_i * (C_i^dag S_i C_1)
1492 CALL cp_cfm_gemm('N', 'N', nao, nmo, nao, z_one, &
1493 t0_state%overlap_cfm_kp(ikp), cmos_1, z_zero, cfm_nao_nmo_work)
1494 CALL cp_cfm_gemm('C', 'N', nmo, nmo, nao, z_one, &
1495 cmos_i, cfm_nao_nmo_work, z_zero, csc_cfm)
1496 CALL cp_cfm_gemm('N', 'N', nao, nmo, nmo, z_one, &
1497 cmos_i, csc_cfm, z_zero, cfm_nao_nmo_work)
1498
1499 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos)
1500 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
1501 CALL cp_fm_to_cfm(rmos, imos, cmos_new)
1502 CALL cp_cfm_scale_and_add(z_one, cmos_new, cmplx(alpha_coeff, 0.0_dp, kind=dp), cfm_nao_nmo_work)
1503 CALL cp_cfm_to_fm(cmos_new, rmos, imos)
1504 END DO
1505 END DO
1506 END DO
1507
1508 CALL cp_cfm_release(cmos_new)
1509 CALL cp_cfm_release(cmos_1)
1510 CALL cp_cfm_release(cmos_i)
1511 CALL cp_cfm_release(cfm_nao_nmo_work)
1512 CALL cp_cfm_release(csc_cfm)
1513
1514 ! Phase 3: Delegate Orthogonalization and Density Building
1515 ! We pass io_unit = 0 to suppress the redundant "Using previous..." print
1516 ! inside wfi_use_prev_wf_kp, keeping the ASPC log output perfectly clean.
1517 CALL wfi_use_prev_wf_kp(qs_env, 0, print_level)
1518
1519 CALL timestop(handle)
1520
1521 END SUBROUTINE wfi_extrapolate_ps_aspc_kp
1522
1523! **************************************************************************************************
1524!> \brief Decides if scf control variables has to changed due
1525!> to using a WF extrapolation.
1526!> \param qs_env The QS environment
1527!> \param nvec ...
1528!> \par History
1529!> 11.2006 created [TdK]
1530!> \author Thomas D. Kuehne (tkuehne@phys.chem.ethz.ch)
1531! **************************************************************************************************
1532 ELEMENTAL SUBROUTINE wfi_set_history_variables(qs_env, nvec)
1533 TYPE(qs_environment_type), INTENT(INOUT) :: qs_env
1534 INTEGER, INTENT(IN) :: nvec
1535
1536 IF (nvec >= qs_env%wf_history%memory_depth) THEN
1537 IF ((qs_env%scf_control%max_scf_hist /= 0) .AND. (qs_env%scf_control%eps_scf_hist /= 0)) THEN
1538 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1539 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1540 qs_env%scf_control%outer_scf%have_scf = .false.
1541 ELSE IF (qs_env%scf_control%max_scf_hist /= 0) THEN
1542 qs_env%scf_control%max_scf = qs_env%scf_control%max_scf_hist
1543 qs_env%scf_control%outer_scf%have_scf = .false.
1544 ELSE IF (qs_env%scf_control%eps_scf_hist /= 0) THEN
1545 qs_env%scf_control%eps_scf = qs_env%scf_control%eps_scf_hist
1546 qs_env%scf_control%outer_scf%eps_scf = qs_env%scf_control%eps_scf_hist
1547 END IF
1548 END IF
1549
1550 END SUBROUTINE wfi_set_history_variables
1551
1552! **************************************************************************************************
1553!> \brief updates the snapshot buffer, taking a new snapshot
1554!> \param wf_history the history buffer to update
1555!> \param qs_env the qs_env we get the info from
1556!> \param dt ...
1557!> \par History
1558!> 02.2003 created [fawzi]
1559!> \author fawzi
1560! **************************************************************************************************
1561 SUBROUTINE wfi_update(wf_history, qs_env, dt)
1562 TYPE(qs_wf_history_type), POINTER :: wf_history
1563 TYPE(qs_environment_type), POINTER :: qs_env
1564 REAL(kind=dp), INTENT(in) :: dt
1565
1566 cpassert(ASSOCIATED(wf_history))
1567 cpassert(wf_history%ref_count > 0)
1568 cpassert(ASSOCIATED(qs_env))
1569
1570 wf_history%snapshot_count = wf_history%snapshot_count + 1
1571 IF (wf_history%memory_depth > 0) THEN
1572 wf_history%last_state_index = modulo(wf_history%snapshot_count, &
1573 wf_history%memory_depth) + 1
1574 CALL wfs_update(snapshot=wf_history%past_states &
1575 (wf_history%last_state_index)%snapshot, wf_history=wf_history, &
1576 qs_env=qs_env, dt=dt)
1577 END IF
1578 END SUBROUTINE wfi_update
1579
1580! **************************************************************************************************
1581!> \brief reorthogonalizes the mos
1582!> \param qs_env the qs_env in which to orthogonalize
1583!> \param v_matrix the vectors to orthogonalize
1584!> \param n_col number of column of v to orthogonalize
1585!> \par History
1586!> 04.2003 created [fawzi]
1587!> \author Fawzi Mohamed
1588! **************************************************************************************************
1589 SUBROUTINE reorthogonalize_vectors(qs_env, v_matrix, n_col)
1590 TYPE(qs_environment_type), POINTER :: qs_env
1591 TYPE(cp_fm_type), INTENT(IN) :: v_matrix
1592 INTEGER, INTENT(in), OPTIONAL :: n_col
1593
1594 CHARACTER(len=*), PARAMETER :: routinen = 'reorthogonalize_vectors'
1595
1596 INTEGER :: handle, my_n_col
1597 LOGICAL :: has_unit_metric, &
1598 ortho_contains_cholesky, &
1599 smearing_is_used
1600 TYPE(cp_fm_pool_type), POINTER :: maxao_maxmo_fm_pool
1601 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
1602 TYPE(dft_control_type), POINTER :: dft_control
1603 TYPE(qs_matrix_pools_type), POINTER :: mpools
1604 TYPE(qs_scf_env_type), POINTER :: scf_env
1605 TYPE(scf_control_type), POINTER :: scf_control
1606
1607 NULLIFY (scf_env, scf_control, maxao_maxmo_fm_pool, matrix_s, mpools, dft_control)
1608 CALL timeset(routinen, handle)
1609
1610 cpassert(ASSOCIATED(qs_env))
1611
1612 CALL cp_fm_get_info(v_matrix, ncol_global=my_n_col)
1613 IF (PRESENT(n_col)) my_n_col = n_col
1614 CALL get_qs_env(qs_env, mpools=mpools, &
1615 scf_env=scf_env, &
1616 scf_control=scf_control, &
1617 matrix_s=matrix_s, &
1618 dft_control=dft_control)
1619 CALL mpools_get(mpools, maxao_maxmo_fm_pool=maxao_maxmo_fm_pool)
1620 IF (ASSOCIATED(scf_env)) THEN
1621 ortho_contains_cholesky = (scf_env%method /= ot_method_nr) .AND. &
1622 (scf_env%cholesky_method > 0) .AND. &
1623 ASSOCIATED(scf_env%ortho)
1624 ELSE
1625 ortho_contains_cholesky = .false.
1626 END IF
1627
1628 CALL get_qs_env(qs_env, has_unit_metric=has_unit_metric)
1629 smearing_is_used = .false.
1630 IF (dft_control%smear) THEN
1631 smearing_is_used = .true.
1632 END IF
1633
1634 IF (has_unit_metric) THEN
1635 CALL make_basis_simple(v_matrix, my_n_col)
1636 ELSE IF (smearing_is_used) THEN
1637 CALL make_basis_lowdin(vmatrix=v_matrix, ncol=my_n_col, &
1638 matrix_s=matrix_s(1)%matrix)
1639 ELSE IF (ortho_contains_cholesky) THEN
1640 CALL make_basis_cholesky(vmatrix=v_matrix, ncol=my_n_col, &
1641 ortho=scf_env%ortho)
1642 ELSE
1643 CALL make_basis_sm(v_matrix, my_n_col, matrix_s(1)%matrix)
1644 END IF
1645 CALL timestop(handle)
1646 END SUBROUTINE reorthogonalize_vectors
1647
1648! **************************************************************************************************
1649!> \brief purges wf_history retaining only the latest snapshot
1650!> \param qs_env the qs env with the latest result, and that will contain
1651!> the purged wf_history
1652!> \par History
1653!> 05.2016 created [Nico Holmberg]
1654!> \author Nico Holmberg
1655! **************************************************************************************************
1656 SUBROUTINE wfi_purge_history(qs_env)
1657 TYPE(qs_environment_type), POINTER :: qs_env
1658
1659 CHARACTER(len=*), PARAMETER :: routinen = 'wfi_purge_history'
1660
1661 INTEGER :: handle, io_unit, print_level
1662 TYPE(cp_logger_type), POINTER :: logger
1663 TYPE(dft_control_type), POINTER :: dft_control
1664 TYPE(qs_wf_history_type), POINTER :: wf_history
1665
1666 NULLIFY (dft_control, wf_history)
1667
1668 CALL timeset(routinen, handle)
1669 logger => cp_get_default_logger()
1670 print_level = logger%iter_info%print_level
1671 io_unit = cp_print_key_unit_nr(logger, qs_env%input, "DFT%SCF%PRINT%PROGRAM_RUN_INFO", &
1672 extension=".scfLog")
1673
1674 cpassert(ASSOCIATED(qs_env))
1675 cpassert(ASSOCIATED(qs_env%wf_history))
1676 cpassert(qs_env%wf_history%ref_count > 0)
1677 CALL get_qs_env(qs_env, dft_control=dft_control)
1678
1679 SELECT CASE (qs_env%wf_history%interpolation_method_nr)
1683 ! do nothing
1687 IF (qs_env%wf_history%snapshot_count >= 2) THEN
1688 IF (debug_this_module .AND. io_unit > 0) &
1689 WRITE (io_unit, fmt="(T2,A)") "QS| Purging WFN history"
1690 CALL wfi_create(wf_history, interpolation_method_nr= &
1691 dft_control%qs_control%wf_interpolation_method_nr, &
1692 extrapolation_order=dft_control%qs_control%wf_extrapolation_order, &
1693 has_unit_metric=qs_env%has_unit_metric)
1694 CALL set_qs_env(qs_env=qs_env, &
1695 wf_history=wf_history)
1696 CALL wfi_release(wf_history)
1697 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
1698 END IF
1699 CASE DEFAULT
1700 cpabort("Unknown extrapolation method.")
1701 END SELECT
1702 CALL timestop(handle)
1703
1704 END SUBROUTINE wfi_purge_history
1705
1706END MODULE qs_wf_history_methods
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public vandevondele2005a
integer, save, public kuhne2007
integer, save, public kolafa2004
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b).
subroutine, public cp_cfm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
Performs one of the matrix-matrix operations: matrix_c = alpha * op1( matrix_a ) * op2( matrix_b ) + ...
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
subroutine, public cp_cfm_triangular_multiply(triangular_matrix, matrix_b, side, transa_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
Multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
subroutine, public cp_cfm_column_scale(matrix_a, scaling)
Scales columns of the full matrix by corresponding factors.
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
used for collecting diagonalization schemes available for cp_cfm_type
Definition cp_cfm_diag.F:14
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
Definition cp_cfm_diag.F:60
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
subroutine, public cp_fm_scale(alpha, matrix_a)
scales a matrix matrix_a = alpha * matrix_b
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the pool
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_start_copy_general(source, destination, para_env, info)
Initiates the copy operation: get distribution data, post MPI isend and irecvs.
subroutine, public cp_fm_cleanup_copy_general(info)
Completes the copy operation: wait for comms clean up MPI state.
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_finish_copy_general(destination, info)
Completes the copy operation: wait for comms, unpack, clean up MPI state.
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
integer, parameter, public low_print_level
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public wfi_frozen_method_nr
integer, parameter, public wfi_linear_wf_method_nr
integer, parameter, public wfi_linear_p_method_nr
integer, parameter, public wfi_linear_ps_method_nr
integer, parameter, public wfi_use_prev_rho_r_method_nr
integer, parameter, public wfi_use_guess_method_nr
integer, parameter, public wfi_use_prev_wf_method_nr
integer, parameter, public wfi_ps_method_nr
integer, parameter, public wfi_aspc_nr
integer, parameter, public wfi_use_prev_p_method_nr
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext)
generate real space density matrices in DBCSR format
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups)
subroutine, public kpoint_set_mo_occupation(kpoint, smear, probe)
Given the eigenvalues of all kpoints, calculates the occupation numbers.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
complex(kind=dp), parameter, public z_zero
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
elemental real(kind=dp) function, public binomial(n, k)
The binomial coefficient n over k for 0 <= k <= n is calculated, otherwise zero is returned.
Definition mathlib.F:214
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
collects routines that calculate density matrices
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, mimic, 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_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, 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, xcint_weights, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, harris_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, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
collects routines that perform operations directly related to MOs
subroutine, public make_basis_simple(vmatrix, ncol)
given a set of vectors, return an orthogonal (C^T C == 1) set spanning the same space (notice,...
subroutine, public make_basis_lowdin(vmatrix, ncol, matrix_s)
return a set of S orthonormal vectors (C^T S C == 1) where a Loedwin transformation is applied to kee...
subroutine, public make_basis_cholesky(vmatrix, ncol, ortho)
return a set of S orthonormal vectors (C^T S C == 1) where the cholesky decomposed form of S is passe...
subroutine, public make_basis_sm(vmatrix, ncol, matrix_s)
returns an S-orthonormal basis v (v^T S v ==1)
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(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)
...
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...
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
Storage of past states of the qs_env. Methods to interpolate (or actually normally extrapolate) the n...
subroutine, public wfi_create_for_kp(wf_history)
Adapts wf_history storage flags for k-point calculations. For ASPC, switches from Gamma WFN storage t...
subroutine, public wfi_purge_history(qs_env)
purges wf_history retaining only the latest snapshot
character(len=30) function, public wfi_get_method_label(method_nr)
returns a string describing the interpolation method
subroutine, public reorthogonalize_vectors(qs_env, v_matrix, n_col)
reorthogonalizes the mos
subroutine, public wfi_update(wf_history, qs_env, dt)
updates the snapshot buffer, taking a new snapshot
subroutine, public wfi_extrapolate(wf_history, qs_env, dt, extrapolation_method_nr, orthogonal_wf)
calculates the new starting state for the scf for the next wf optimization
subroutine, public wfi_create(wf_history, interpolation_method_nr, extrapolation_order, has_unit_metric)
...
interpolate the wavefunctions to speed up the convergence when doing MD
type(qs_wf_snapshot_type) function, pointer, public wfi_get_snapshot(wf_history, wf_index)
returns a snapshot, the first being the latest snapshot
subroutine, public wfi_release(wf_history)
releases a wf_history of a wavefunction (see doc/ReferenceCounting.html)
parameters that control an scf iteration
Represent a complex full matrix.
represent a pool of elements with the same structure
keeps the information about the structure of a full matrix
Stores the state of a copy between cp_fm_start_copy_general and cp_fm_finish_copy_general.
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
container for the pools of matrixes used by qs
keeps the density in various representations, keeping track of which ones are valid.
keeps track of the previous wavefunctions and can extrapolate them for the next step of md
represent a past snapshot of the wavefunction. some elements might not be associated (to spare memory...