(git:f824184)
Loading...
Searching...
No Matches
qs_scf_initialization.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 Utility routines for qs_scf
10! **************************************************************************************************
14 USE bibliography, ONLY: hu2010,&
15 cite_reference
17 USE cp_dbcsr_api, ONLY: dbcsr_create,&
20 dbcsr_set,&
22 dbcsr_type_no_symmetry,&
23 dbcsr_type_symmetric
40 diag_type,&
48 USE cp_fm_types, ONLY: cp_fm_create,&
58 USE cp_output_handling, ONLY: cp_p_file,&
62 USE dft_plus_u, ONLY: lowdin_kp_init,&
65 USE input_constants, ONLY: &
75 USE kinds, ONLY: dp
76 USE kpoint_types, ONLY: get_kpoint_info,&
82 USE pw_types, ONLY: pw_c1d_gs_type
100 USE qs_fb_env_types, ONLY: fb_env_create,&
105 USE qs_kind_types, ONLY: get_qs_kind,&
109 USE qs_matrix_pools, ONLY: mpools_get
114 USE qs_mo_types, ONLY: get_mo_set,&
125 USE qs_rho_types, ONLY: qs_rho_create,&
126 qs_rho_get,&
132 USE qs_scf_types, ONLY: &
144#include "./base/base_uses.f90"
145
146 IMPLICIT NONE
147
148 PRIVATE
149
150 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_initialization'
151
153
154CONTAINS
155
156! **************************************************************************************************
157!> \brief initializes input parameters if needed or restores values from
158!> previous runs to fill scf_env with the values required for scf
159!> \param qs_env the qs_environment where to perform the scf procedure
160!> \param scf_env ...
161!> \param scf_control ...
162!> \param scf_section ...
163! **************************************************************************************************
164 SUBROUTINE qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
165 TYPE(qs_environment_type), POINTER :: qs_env
166 TYPE(qs_scf_env_type), POINTER :: scf_env
167 TYPE(scf_control_type), OPTIONAL, POINTER :: scf_control
168 TYPE(section_vals_type), OPTIONAL, POINTER :: scf_section
169
170 INTEGER :: ip, np
171 TYPE(atomic_kind_type), POINTER :: atomic_kind_set(:)
172 TYPE(dft_control_type), POINTER :: dft_control
173 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
174 TYPE(particle_type), POINTER :: particle_set(:)
175 TYPE(qs_kind_type), POINTER :: qs_kind_set(:)
176 TYPE(scf_control_type), POINTER :: my_scf_control
177 TYPE(section_vals_type), POINTER :: dft_section, input, my_scf_section
178
179 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
180
181 !Initialize Hairy Probe calculation
182 IF (dft_control%hairy_probes .EQV. .true.) THEN
183 CALL get_qs_env(qs_env, &
184 mos=mos, &
185 atomic_kind_set=atomic_kind_set, &
186 qs_kind_set=qs_kind_set, &
187 particle_set=particle_set)
188 np = SIZE(dft_control%probe)
189 DO ip = 1, np
190 CALL ao_boundaries(probe=dft_control%probe(ip), atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
191 particle_set=particle_set, nao=mos(1)%nao) !FIX THIS!
192 END DO
193 END IF
194
195 IF (PRESENT(scf_control)) THEN
196 my_scf_control => scf_control
197 ELSE
198 CALL get_qs_env(qs_env, scf_control=my_scf_control)
199 END IF
200
201 dft_section => section_vals_get_subs_vals(input, "DFT")
202 IF (PRESENT(scf_section)) THEN
203 my_scf_section => scf_section
204 ELSE
205 my_scf_section => section_vals_get_subs_vals(dft_section, "SCF")
206 END IF
207
208 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
209
210 CALL section_vals_val_get(my_scf_section, "CHOLESKY", i_val=scf_env%cholesky_method)
211
212 CALL qs_scf_ensure_mos(qs_env)
213
214 ! set flags for diagonalization
215 CALL qs_scf_ensure_diagonalization(scf_env, my_scf_section, qs_env, &
216 my_scf_control, qs_env%has_unit_metric)
217 ! set parameters for mixing/DIIS during scf
218 CALL qs_scf_ensure_mixing(my_scf_control, my_scf_section, scf_env, dft_control)
219
220 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
221
222 CALL qs_scf_ensure_mixing_store(qs_env, scf_env, my_scf_control)
223
224 ! Initialize outer loop variables: handle CDFT and regular outer loop separately
225 IF (dft_control%qs_control%cdft) THEN
226 CALL qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, &
227 scf_control=my_scf_control)
228 ELSE
229 CALL qs_scf_ensure_outer_loop_vars(scf_env, my_scf_control)
230 END IF
231
232 CALL init_scf_run(scf_env, qs_env, my_scf_section, my_scf_control)
233
234 END SUBROUTINE qs_scf_env_initialize
235
236! **************************************************************************************************
237!> \brief initializes input parameters if needed for non-scf calclulations using diagonalization
238!> \param qs_env the qs_environment where to perform the scf procedure
239!> \param scf_env ...
240! **************************************************************************************************
241 SUBROUTINE qs_scf_env_init_basic(qs_env, scf_env)
242 TYPE(qs_environment_type), POINTER :: qs_env
243 TYPE(qs_scf_env_type), POINTER :: scf_env
244
245 TYPE(dft_control_type), POINTER :: dft_control
246 TYPE(scf_control_type), POINTER :: scf_control
247 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
248
249 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
250
251 CALL get_qs_env(qs_env, scf_control=scf_control)
252 dft_section => section_vals_get_subs_vals(input, "DFT")
253 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
254
255 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
256
257 CALL section_vals_val_get(scf_section, "CHOLESKY", i_val=scf_env%cholesky_method)
258 scf_control%use_diag = .true.
259 scf_control%diagonalization%method = diag_standard
260
261 CALL qs_scf_ensure_mos(qs_env)
262
263 ! set flags for diagonalization
264 CALL qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
265 scf_control, qs_env%has_unit_metric)
266 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
267
268 CALL init_scf_run(scf_env, qs_env, scf_section, scf_control)
269
270 END SUBROUTINE qs_scf_env_init_basic
271
272! **************************************************************************************************
273!> \brief makes sure scf_env is allocated (might already be from before)
274!> in case it is present the g-space mixing storage is reset
275!> \param qs_env ...
276!> \param scf_env ...
277! **************************************************************************************************
278 SUBROUTINE qs_scf_ensure_scf_env(qs_env, scf_env)
279 TYPE(qs_environment_type), POINTER :: qs_env
280 TYPE(qs_scf_env_type), POINTER :: scf_env
281
282 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
283 TYPE(qs_rho_type), POINTER :: rho
284
285 NULLIFY (rho_g)
286
287 IF (.NOT. ASSOCIATED(scf_env)) THEN ! i.e. for MD this is associated on the second step (it so seems)
288 ALLOCATE (scf_env)
289 CALL scf_env_create(scf_env)
290 ELSE
291 ! Reallocate mixing store, if the g space grid (cell) has changed
292 SELECT CASE (scf_env%mixing_method)
294 IF (ASSOCIATED(scf_env%mixing_store)) THEN
295 ! The current mixing_store data structure does not allow for an unique
296 ! grid comparison, but the probability that the 1d lengths of the old and
297 ! the new grid are accidentily equal is rather low
298 CALL get_qs_env(qs_env, rho=rho)
299 CALL qs_rho_get(rho, rho_g=rho_g)
300 IF (ASSOCIATED(scf_env%mixing_store%rhoin)) THEN
301 IF (SIZE(rho_g(1)%pw_grid%gsq) /= SIZE(scf_env%mixing_store%rhoin(1)%cc)) THEN
302 CALL mixing_storage_release(scf_env%mixing_store)
303 DEALLOCATE (scf_env%mixing_store)
304 END IF
305 END IF
306 END IF
307 END SELECT
308 END IF
309
310 END SUBROUTINE qs_scf_ensure_scf_env
311
312! **************************************************************************************************
313!> \brief performs allocation of outer SCF variables
314!> \param scf_env the SCF environment which contains the outer SCF variables
315!> \param scf_control control settings for the outer SCF loop
316!> \param nvar (optional) set number of outer SCF variables externally if CDFT SCF is active
317! **************************************************************************************************
318 SUBROUTINE qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvar)
319 TYPE(qs_scf_env_type), POINTER :: scf_env
320 TYPE(scf_control_type), POINTER :: scf_control
321 INTEGER, OPTIONAL :: nvar
322
323 INTEGER :: nhistory, nvariables
324
325 IF (scf_control%outer_scf%have_scf) THEN
326 nhistory = scf_control%outer_scf%max_scf + 1
327 IF (PRESENT(nvar)) THEN
328 IF (nvar > 0) THEN
329 nvariables = nvar
330 ELSE
331 nvariables = outer_loop_variables_count(scf_control)
332 END IF
333 ELSE
334 nvariables = outer_loop_variables_count(scf_control)
335 END IF
336 ALLOCATE (scf_env%outer_scf%variables(nvariables, nhistory))
337 ALLOCATE (scf_env%outer_scf%count(nhistory))
338 scf_env%outer_scf%count = 0
339 ALLOCATE (scf_env%outer_scf%gradient(nvariables, nhistory))
340 ALLOCATE (scf_env%outer_scf%energy(nhistory))
341 END IF
342
343 END SUBROUTINE qs_scf_ensure_outer_loop_vars
344
345! **************************************************************************************************
346!> \brief performs allocation of CDFT SCF variables
347!> \param qs_env the qs_env where to perform the allocation
348!> \param scf_env the currently active scf_env
349!> \param dft_control the dft_control that holds the cdft_control type
350!> \param scf_control the currently active scf_control
351! **************************************************************************************************
352 SUBROUTINE qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, scf_control)
353 TYPE(qs_environment_type), POINTER :: qs_env
354 TYPE(qs_scf_env_type), POINTER :: scf_env
355 TYPE(dft_control_type), POINTER :: dft_control
356 TYPE(scf_control_type), POINTER :: scf_control
357
358 INTEGER :: nhistory, nvariables
359 LOGICAL :: do_kpoints
360 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient_history, outer_scf_history, &
361 variable_history
362
363 NULLIFY (outer_scf_history, gradient_history, variable_history)
364 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
365 ! Test kpoints
366 IF (do_kpoints) THEN
367 cpabort("CDFT calculation not possible with kpoints")
368 END IF
369 ! Check that OUTER_SCF section in DFT&SCF is active
370 ! This section must always be active to facilitate
371 ! switching of the CDFT and SCF control parameters in outer_loop_switch
372 IF (.NOT. scf_control%outer_scf%have_scf) THEN
373 cpabort("Section SCF&OUTER_SCF must be active for CDFT calculations.")
374 END IF
375 ! Initialize CDFT and outer_loop variables (constraint settings active in scf_control)
376 IF (dft_control%qs_control%cdft_control%constraint_control%have_scf) THEN
377 nhistory = dft_control%qs_control%cdft_control%constraint_control%max_scf + 1
378 IF (scf_control%outer_scf%type /= outer_scf_none) THEN
379 nvariables = outer_loop_variables_count(scf_control, &
380 dft_control%qs_control%cdft_control)
381 ELSE
382 ! First iteration: scf_control has not yet been updated
383 nvariables = SIZE(dft_control%qs_control%cdft_control%target)
384 END IF
385 ALLOCATE (dft_control%qs_control%cdft_control%constraint%variables(nvariables, nhistory))
386 ALLOCATE (dft_control%qs_control%cdft_control%constraint%count(nhistory))
387 dft_control%qs_control%cdft_control%constraint%count = 0
388 ALLOCATE (dft_control%qs_control%cdft_control%constraint%gradient(nvariables, nhistory))
389 ALLOCATE (dft_control%qs_control%cdft_control%constraint%energy(nhistory))
390 CALL qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvariables)
391 END IF
392 ! Executed only on first call (OT settings active in scf_control)
393 ! Save OT settings and constraint initial values in CDFT control
394 ! Then switch to constraint outer_scf settings for proper initialization of history
395 IF (scf_control%outer_scf%have_scf) THEN
396 IF (scf_control%outer_scf%type == outer_scf_none) THEN
397 dft_control%qs_control%cdft_control%ot_control%have_scf = .true.
398 dft_control%qs_control%cdft_control%ot_control%max_scf = scf_control%outer_scf%max_scf
399 dft_control%qs_control%cdft_control%ot_control%eps_scf = scf_control%outer_scf%eps_scf
400 dft_control%qs_control%cdft_control%ot_control%step_size = scf_control%outer_scf%step_size
401 dft_control%qs_control%cdft_control%ot_control%type = scf_control%outer_scf%type
402 dft_control%qs_control%cdft_control%ot_control%optimizer = scf_control%outer_scf%optimizer
403 dft_control%qs_control%cdft_control%ot_control%diis_buffer_length = scf_control%outer_scf%diis_buffer_length
404 dft_control%qs_control%cdft_control%ot_control%bisect_trust_count = scf_control%outer_scf%bisect_trust_count
405 CALL cdft_opt_type_copy(dft_control%qs_control%cdft_control%ot_control%cdft_opt_control, &
406 scf_control%outer_scf%cdft_opt_control)
407 ! In case constraint and OT extrapolation orders are different, make sure to use former
408 nvariables = SIZE(dft_control%qs_control%cdft_control%target)
409 IF (scf_control%outer_scf%extrapolation_order /= &
410 dft_control%qs_control%cdft_control%constraint_control%extrapolation_order &
411 .OR. nvariables /= 1) THEN
412 DEALLOCATE (qs_env%outer_scf_history)
413 DEALLOCATE (qs_env%gradient_history)
414 DEALLOCATE (qs_env%variable_history)
415 nhistory = dft_control%qs_control%cdft_control%constraint_control%extrapolation_order
416 ALLOCATE (outer_scf_history(nvariables, nhistory))
417 ALLOCATE (gradient_history(nvariables, 2))
418 gradient_history = 0.0_dp
419 ALLOCATE (variable_history(nvariables, 2))
420 variable_history = 0.0_dp
421 CALL set_qs_env(qs_env, outer_scf_history=outer_scf_history, &
422 gradient_history=gradient_history, variable_history=variable_history)
423 END IF
424 CALL outer_loop_switch(scf_env, scf_control, dft_control%qs_control%cdft_control, ot2cdft)
425 END IF
426 END IF
427
428 END SUBROUTINE qs_scf_ensure_cdft_loop_vars
429
430! **************************************************************************************************
431!> \brief Allocate the candidate density produced by diagonalization.
432!> \param qs_env ...
433!> \param candidate Candidate density matrix set.
434!> \param nspins Number of spin channels.
435!>
436!> This workspace belongs to the generic diagonalization SCF driver. It is
437!> also used by density-mixing methods, but allocating it does not imply
438!> that a density mixer is active.
439! **************************************************************************************************
440 SUBROUTINE qs_scf_allocate_candidate_density(qs_env, candidate, nspins)
441 TYPE(qs_environment_type), POINTER :: qs_env
442 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: candidate
443 INTEGER, INTENT(IN) :: nspins
444
445 INTEGER :: ic, ispin, nimg
446 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
447 TYPE(dbcsr_type), POINTER :: refmatrix
448 TYPE(dft_control_type), POINTER :: dft_control
449 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
450 POINTER :: sab_orb
451
452 NULLIFY (dft_control, matrix_s, refmatrix, sab_orb)
453 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s, sab_orb=sab_orb, dft_control=dft_control)
454
455 IF (ASSOCIATED(candidate)) RETURN
456
457 refmatrix => matrix_s(1, 1)%matrix
458 nimg = dft_control%nimages
459 CALL dbcsr_allocate_matrix_set(candidate, nspins, nimg)
460 DO ic = 1, nimg
461 DO ispin = 1, nspins
462 ALLOCATE (candidate(ispin, ic)%matrix)
463 CALL dbcsr_create(matrix=candidate(ispin, ic)%matrix, template=refmatrix, &
464 name="SCF DENSITY", matrix_type=dbcsr_type_symmetric)
465 CALL cp_dbcsr_alloc_block_from_nbl(candidate(ispin, ic)%matrix, sab_orb)
466 CALL dbcsr_set(candidate(ispin, ic)%matrix, 0.0_dp)
467 END DO
468 END DO
469
470 END SUBROUTINE qs_scf_allocate_candidate_density
471
472! **************************************************************************************************
473!> \brief performs allocation of the mixing storage
474!> \param qs_env ...
475!> \param scf_env ...
476!> \param scf_control ...
477! **************************************************************************************************
478 SUBROUTINE qs_scf_ensure_mixing_store(qs_env, scf_env, scf_control)
479 TYPE(qs_environment_type), POINTER :: qs_env
480 TYPE(qs_scf_env_type), POINTER :: scf_env
481 TYPE(scf_control_type), POINTER :: scf_control
482
483 TYPE(dft_control_type), POINTER :: dft_control
484
485 NULLIFY (dft_control)
486 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
487
488 IF (scf_control%diagonalization%update_method == diag_update_method_adiis) THEN
489 CALL qs_scf_allocate_candidate_density(qs_env, scf_env%p_mix_new, dft_control%nspins)
490 ELSE IF (scf_env%mixing_method > 0) THEN
491 CALL mixing_allocate(qs_env, scf_env%mixing_method, scf_env%p_mix_new, &
492 scf_env%p_delta, dft_control%nspins, &
493 scf_env%mixing_store)
494 ELSE
495 NULLIFY (scf_env%p_mix_new)
496 END IF
497
498 END SUBROUTINE qs_scf_ensure_mixing_store
499
500! **************************************************************************************************
501!> \brief Performs allocation of the SCF work matrices
502!> In case of kpoints we probably don't need most of these matrices,
503!> maybe we have to initialize some matrices in the fm_pool in kpoints
504!> \param qs_env ...
505!> \param scf_env ...
506! **************************************************************************************************
507 SUBROUTINE qs_scf_ensure_work_matrices(qs_env, scf_env)
508
509 TYPE(qs_environment_type), POINTER :: qs_env
510 TYPE(qs_scf_env_type), POINTER :: scf_env
511
512 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_ensure_work_matrices'
513
514 INTEGER :: handle, is, nao, nrow_block, nw
515 LOGICAL :: do_kpoints
516 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
517 TYPE(cp_fm_struct_type), POINTER :: ao_ao_fmstruct, ao_mo_fmstruct
518 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
519 TYPE(dbcsr_type), POINTER :: ref_matrix
520 TYPE(dft_control_type), POINTER :: dft_control
521 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
522 TYPE(scf_control_type), POINTER :: scf_control
523
524 CALL timeset(routinen, handle)
525
526 NULLIFY (ao_mo_fm_pools, ao_mo_fmstruct, ao_ao_fmstruct, dft_control, matrix_s, mos)
527
528 CALL get_qs_env(qs_env=qs_env, &
529 dft_control=dft_control, &
530 matrix_s_kp=matrix_s, &
531 mos=mos, &
532 scf_control=scf_control, &
533 do_kpoints=do_kpoints)
534 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
535
536 ! create an ao_ao parallel matrix structure
537 ao_mo_fmstruct => fm_pool_get_el_struct(ao_mo_fm_pools(1)%pool)
538 CALL cp_fm_struct_get(ao_mo_fmstruct, nrow_block=nrow_block)
539 CALL get_mo_set(mos(1), nao=nao)
540 CALL cp_fm_struct_create(fmstruct=ao_ao_fmstruct, &
541 nrow_block=nrow_block, &
542 ncol_block=nrow_block, &
543 nrow_global=nao, &
544 ncol_global=nao, &
545 template_fmstruct=ao_mo_fmstruct)
546
547 IF ((scf_env%method /= ot_method_nr) .AND. &
548 (scf_env%method /= block_davidson_diag_method_nr)) THEN
549 IF (.NOT. ASSOCIATED(scf_env%scf_work1)) THEN
550 nw = dft_control%nspins
551 IF (do_kpoints) nw = 4
552 ALLOCATE (scf_env%scf_work1(nw))
553 DO is = 1, SIZE(scf_env%scf_work1)
554 CALL cp_fm_create(scf_env%scf_work1(is), &
555 matrix_struct=ao_ao_fmstruct, &
556 name="SCF-WORK_MATRIX-1-"//trim(adjustl(cp_to_string(is))))
557 END DO
558 END IF
559 IF ((.NOT. ASSOCIATED(scf_env%ortho)) .AND. &
560 ((scf_env%method /= ot_diag_method_nr) .OR. &
561 dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
562 dft_control%qs_control%semi_empirical) .AND. &
563 (scf_env%method /= special_diag_method_nr)) THEN
564 ! Initialize fm matrix to store the Cholesky decomposition
565 ALLOCATE (scf_env%ortho)
566 CALL cp_fm_create(scf_env%ortho, &
567 matrix_struct=ao_ao_fmstruct, &
568 name="SCF-ORTHO_MATRIX")
569 ! Initialize dbcsr matrix to store the Cholesky decomposition
570 IF (scf_env%cholesky_method == cholesky_dbcsr) THEN
571 ref_matrix => matrix_s(1, 1)%matrix
572 CALL dbcsr_init_p(scf_env%ortho_dbcsr)
573 CALL dbcsr_create(scf_env%ortho_dbcsr, template=ref_matrix, &
574 matrix_type=dbcsr_type_no_symmetry)
575 CALL dbcsr_init_p(scf_env%buf1_dbcsr)
576 CALL dbcsr_create(scf_env%buf1_dbcsr, template=ref_matrix, &
577 matrix_type=dbcsr_type_no_symmetry)
578 CALL dbcsr_init_p(scf_env%buf2_dbcsr)
579 CALL dbcsr_create(scf_env%buf2_dbcsr, template=ref_matrix, &
580 matrix_type=dbcsr_type_no_symmetry)
581 ELSE IF (scf_env%cholesky_method == cholesky_inverse .OR. &
582 (scf_control%level_shift /= 0.0_dp .AND. &
583 scf_env%cholesky_method == cholesky_off)) THEN
584 ALLOCATE (scf_env%ortho_m1)
585 CALL cp_fm_create(scf_env%ortho_m1, &
586 matrix_struct=ao_ao_fmstruct, &
587 name="SCF-ORTHO_MATRIX-1")
588 END IF
589 END IF
590 IF (.NOT. ASSOCIATED(scf_env%scf_work2)) THEN
591 ALLOCATE (scf_env%scf_work2)
592 CALL cp_fm_create(scf_env%scf_work2, &
593 matrix_struct=ao_ao_fmstruct, &
594 name="SCF-WORK_MATRIX-2")
595 END IF
596 END IF
597
598 IF (dft_control%dft_plus_u) THEN
599 IF (dft_control%plus_u_method_id == plus_u_lowdin) THEN
600 IF (.NOT. ASSOCIATED(scf_env%s_half)) THEN
601 ALLOCATE (scf_env%s_half)
602 CALL cp_fm_create(scf_env%s_half, &
603 matrix_struct=ao_ao_fmstruct, &
604 name="S**(1/2) MATRIX")
605 END IF
606 END IF
607 END IF
608
609 IF (do_kpoints) THEN
610 IF (.NOT. ASSOCIATED(scf_env%scf_work1)) THEN
611 nw = 4
612 ALLOCATE (scf_env%scf_work1(nw))
613 DO is = 1, SIZE(scf_env%scf_work1)
614 CALL cp_fm_create(scf_env%scf_work1(is), &
615 matrix_struct=ao_ao_fmstruct, &
616 name="SCF-WORK_MATRIX-1-"//trim(adjustl(cp_to_string(is))))
617 END DO
618 END IF
619 END IF
620
621 IF (.NOT. do_kpoints .AND. ASSOCIATED(scf_env%scf_work1)) THEN
622 IF (.NOT. ALLOCATED(scf_env%fm_copy_plan)) THEN
623 ALLOCATE (scf_env%fm_copy_plan(0:SIZE(scf_env%scf_work1)))
624 END IF
625 END IF
626
627 CALL cp_fm_struct_release(ao_ao_fmstruct)
628
629 CALL timestop(handle)
630
631 END SUBROUTINE qs_scf_ensure_work_matrices
632
633! **************************************************************************************************
634!> \brief performs allocation of the MO matrices
635!> \param qs_env ...
636! **************************************************************************************************
637 SUBROUTINE qs_scf_ensure_mos(qs_env)
638 TYPE(qs_environment_type), POINTER :: qs_env
639
640 CHARACTER(len=*), PARAMETER :: routinen = 'qs_scf_ensure_mos'
641
642 INTEGER :: handle, ik, ikk, ispin, nmo, nmo_mat
643 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
644 TYPE(cp_fm_type), POINTER :: mo_coeff, mo_coeff_last
645 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mo_derivs
646 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
647 TYPE(dbcsr_type), POINTER :: mo_coeff_b
648 TYPE(dft_control_type), POINTER :: dft_control
649 TYPE(kpoint_type), POINTER :: kpoints
650 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_k, mos_last_converged
651 TYPE(xas_environment_type), POINTER :: xas_env
652
653 CALL timeset(routinen, handle)
654
655 NULLIFY (ao_mo_fm_pools, dft_control, mos, xas_env, matrix_s, mos_last_converged, mo_coeff_last)
656
657 CALL get_qs_env(qs_env=qs_env, &
658 dft_control=dft_control, &
659 mos=mos, &
660 matrix_s_kp=matrix_s, &
661 xas_env=xas_env)
662 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
663 IF (dft_control%switch_surf_dip) THEN
664 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
665 END IF
666
667 nmo_mat = dft_control%nspins
668 IF (dft_control%restricted) nmo_mat = 1 ! right now, there might be more mos than needed derivs
669
670 ! Finish initialization of the MOs
671 cpassert(ASSOCIATED(mos))
672 DO ispin = 1, SIZE(mos)
673 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
674 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
675 CALL init_mo_set(mos(ispin), &
676 fm_pool=ao_mo_fm_pools(ispin)%pool, &
677 name="qs_env%mo"//trim(adjustl(cp_to_string(ispin))))
678 END IF
679 IF (.NOT. ASSOCIATED(mo_coeff_b)) THEN
680 CALL cp_fm_get_info(mos(ispin)%mo_coeff, ncol_global=nmo)
681 CALL dbcsr_init_p(mos(ispin)%mo_coeff_b)
682 CALL cp_dbcsr_m_by_n_from_row_template(mos(ispin)%mo_coeff_b, template=matrix_s(1, 1)%matrix, n=nmo, &
683 sym=dbcsr_type_no_symmetry)
684 END IF
685 END DO
686 ! Get the mo_derivs OK if needed
687 IF (qs_env%requires_mo_derivs) THEN
688 CALL get_qs_env(qs_env, mo_derivs=mo_derivs)
689 IF (.NOT. ASSOCIATED(mo_derivs)) THEN
690 ALLOCATE (mo_derivs(nmo_mat))
691 DO ispin = 1, nmo_mat
692 CALL get_mo_set(mos(ispin), mo_coeff_b=mo_coeff_b)
693 NULLIFY (mo_derivs(ispin)%matrix)
694 CALL dbcsr_init_p(mo_derivs(ispin)%matrix)
695 CALL dbcsr_create(mo_derivs(ispin)%matrix, template=mo_coeff_b, &
696 name="mo_derivs", matrix_type=dbcsr_type_no_symmetry)
697 END DO
698 CALL set_qs_env(qs_env, mo_derivs=mo_derivs)
699 END IF
700
701 ELSE
702 ! nothing should be done
703 END IF
704
705 ! Finish initialization of the MOs for ADMM and derivs if needed ***
706 IF (dft_control%do_admm) THEN
707 IF (dft_control%restricted) cpabort("ROKS with ADMM is not implemented")
708 END IF
709
710 ! Finish initialization of mos_last_converged [SGh]
711 IF (dft_control%switch_surf_dip) THEN
712 cpassert(ASSOCIATED(mos_last_converged))
713 DO ispin = 1, SIZE(mos_last_converged)
714 CALL get_mo_set(mos_last_converged(ispin), mo_coeff=mo_coeff_last)
715 IF (.NOT. ASSOCIATED(mo_coeff_last)) THEN
716 CALL init_mo_set(mos_last_converged(ispin), &
717 fm_ref=mos(ispin)%mo_coeff, &
718 name="qs_env%mos_last_converged"//trim(adjustl(cp_to_string(ispin))))
719 END IF
720 END DO
721 END IF
722 ! kpoints: we have to initialize all the k-point MOs
723 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
724 IF (kpoints%nkp /= 0) THEN
725 ! check for some incompatible options
726 IF (qs_env%requires_mo_derivs) THEN
727 cpwarn("MO derivative methods flag has been switched off for kpoint calculation")
728 ! we switch it off to make band structure calculations
729 ! possible for OT gamma point calculations
730 qs_env%requires_mo_derivs = .false.
731 END IF
732 IF (dft_control%do_xas_calculation) THEN
733 cpabort("No XAS implemented with kpoints")
734 END IF
735 IF (qs_env%do_rixs) THEN
736 cpabort("RIXS not implemented with kpoints")
737 END IF
738 DO ik = 1, SIZE(kpoints%kp_env)
739 CALL mpools_get(kpoints%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
740 mos_k => kpoints%kp_env(ik)%kpoint_env%mos
741 ikk = kpoints%kp_range(1) + ik - 1
742 cpassert(ASSOCIATED(mos_k))
743 DO ispin = 1, SIZE(mos_k)
744 cpassert(.NOT. ASSOCIATED(mos_k(ispin)%mo_coeff_b))
745 IF (kpoints%use_real_wfn) THEN
746 IF (ASSOCIATED(mos_k(ispin)%mo_coeff)) cycle
747 ELSE
748 IF (ASSOCIATED(mos_k(ispin)%cmo_coeff)) cycle
749 END IF
750 CALL init_mo_set(mos_k(ispin), fm_pool=ao_mo_fm_pools(ispin)%pool, &
751 name="kpoints_"//trim(adjustl(cp_to_string(ikk)))// &
752 "%mo"//trim(adjustl(cp_to_string(ispin))), &
753 complex_coeff=.NOT. kpoints%use_real_wfn)
754 END DO
755 END DO
756 END IF
757
758 CALL timestop(handle)
759
760 END SUBROUTINE qs_scf_ensure_mos
761
762! **************************************************************************************************
763!> \brief sets flag for mixing/DIIS during scf
764!> \param scf_control ...
765!> \param scf_section ...
766!> \param scf_env ...
767!> \param dft_control ...
768! **************************************************************************************************
769 SUBROUTINE qs_scf_ensure_mixing(scf_control, scf_section, scf_env, dft_control)
770 TYPE(scf_control_type), POINTER :: scf_control
771 TYPE(section_vals_type), POINTER :: scf_section
772 TYPE(qs_scf_env_type), POINTER :: scf_env
773 TYPE(dft_control_type), POINTER :: dft_control
774
775 TYPE(section_vals_type), POINTER :: mixing_section
776
777 IF (scf_control%diagonalization%update_method == diag_update_method_adiis) THEN
778 CALL cite_reference(hu2010)
779 ! ADIIS is a Fock-space SCF method. It does not use density mixing or
780 ! combine CDIIS with a separate density-mixing state.
781 scf_env%mixing_method = no_mixing_nr
782 scf_env%p_mix_alpha = 1.0_dp
783 scf_env%skip_diis = scf_control%max_diis < 2 .OR. &
784 scf_control%eps_diis < scf_control%eps_scf
785 IF (scf_control%eps_diis < scf_control%eps_scf) THEN
786 cpwarn("the ADIIS to DIIS switch is disabled, since EPS_DIIS < EPS_SCF")
787 END IF
788 RETURN
789 END IF
790
791 SELECT CASE (scf_control%mixing_method)
792 CASE (no_mix)
793 scf_env%mixing_method = no_mixing_nr
794 scf_env%p_mix_alpha = 1.0_dp
797 scf_env%mixing_method = scf_control%mixing_method
798 mixing_section => section_vals_get_subs_vals(scf_section, "MIXING")
799 IF (.NOT. ASSOCIATED(scf_env%mixing_store)) THEN
800 ALLOCATE (scf_env%mixing_store)
801 CALL mixing_storage_create(scf_env%mixing_store, mixing_section, scf_env%mixing_method, &
802 dft_control%qs_control%cutoff)
803 END IF
804 CASE DEFAULT
805 cpabort("Unknown mixing method")
806 END SELECT
807
808 ! Disable DIIS for OT and g-space density mixing methods
809 IF (scf_env%method == ot_method_nr) THEN
810 ! No mixing is used with OT
811 scf_env%mixing_method = no_mixing_nr
812 scf_env%p_mix_alpha = 1.0_dp
813 scf_env%skip_diis = .true.
814 END IF
815
816 IF (scf_control%use_diag .AND. scf_env%mixing_method == no_mixing_nr) THEN
817 cpabort("Diagonalization procedures without mixing are not recommendable")
818 END IF
819
820 IF (scf_env%mixing_method > direct_mixing_nr) THEN
821 scf_env%skip_diis = .true.
822 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
823 IF (scf_env%mixing_store%beta == 0.0_dp) THEN
824 cpabort("Mixing employing the Kerker damping factor needs BETA /= 0.0")
825 END IF
826 END IF
827
828 IF (scf_env%mixing_method == direct_mixing_nr) THEN
829 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
830 IF (scf_control%eps_diis < scf_control%eps_scf) THEN
831 scf_env%skip_diis = .true.
832 cpwarn("the DIIS scheme is disabled, since EPS_DIIS < EPS_SCF")
833 END IF
834 END IF
835
836 END SUBROUTINE qs_scf_ensure_mixing
837
838! **************************************************************************************************
839!> \brief sets flags for diagonalization and ensure that everything is
840!> allocated
841!> \param scf_env ...
842!> \param scf_section ...
843!> \param qs_env ...
844!> \param scf_control ...
845!> \param has_unit_metric ...
846! **************************************************************************************************
847 SUBROUTINE qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
848 scf_control, has_unit_metric)
849 TYPE(qs_scf_env_type), POINTER :: scf_env
850 TYPE(section_vals_type), POINTER :: scf_section
851 TYPE(qs_environment_type), POINTER :: qs_env
852 TYPE(scf_control_type), POINTER :: scf_control
853 LOGICAL :: has_unit_metric
854
855 INTEGER :: ispin, kplocal, nao, nmo
856 INTEGER, DIMENSION(2) :: kp_range
857 LOGICAL :: do_kpoints, need_coeff_b, not_se_or_tb, &
858 ot_energies
859 TYPE(cp_fm_type), POINTER :: mo_coeff
860 TYPE(dft_control_type), POINTER :: dft_control
861 TYPE(kpoint_type), POINTER :: kpoints
862 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
863
864 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints, dft_control=dft_control, mos=mos)
865 not_se_or_tb = .NOT. (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
866 dft_control%qs_control%semi_empirical)
867 need_coeff_b = .false.
868 ot_energies = .false.
869 scf_env%needs_ortho = .false.
870
871 IF (dft_control%smeagol_control%smeagol_enabled .AND. &
872 dft_control%smeagol_control%run_type == smeagol_runtype_emtransport) THEN
873 scf_env%method = smeagol_method_nr
874 scf_env%skip_diis = .true.
875 scf_control%use_diag = .false.
876
877 IF (.NOT. do_kpoints) THEN
878 cpabort("SMEAGOL requires kpoint calculations")
879 END IF
880 cpwarn_if(scf_control%use_ot, "OT is irrelevant to NEGF method")
881 END IF
882
883 IF (scf_control%use_diag) THEN
884 ! sanity check whether combinations are allowed
885 IF (dft_control%restricted) THEN
886 cpabort("OT only for restricted (ROKS)")
887 END IF
888 SELECT CASE (scf_control%diagonalization%method)
890 IF (.NOT. not_se_or_tb) THEN
891 cpabort("TB and SE not possible with block iterative diagonalization")
892 END IF
893 END SELECT
894 SELECT CASE (scf_control%diagonalization%method)
895 ! Diagonalization: additional check whether we are in an orthonormal basis
896 CASE (diag_standard)
897 scf_env%method = general_diag_method_nr
898 scf_env%needs_ortho = (.NOT. has_unit_metric) .AND. (.NOT. do_kpoints)
899 IF (diag_type == fm_diag_type_cusolver .AND. &
901 scf_control%level_shift == 0.0_dp .AND. &
902 scf_env%cholesky_method /= cholesky_off) THEN
903 CALL get_mo_set(mos(1), nao=nao)
904 IF (nao >= cusolver_n_min) THEN
905 scf_env%needs_ortho = .false.
906 END IF
907 END IF
908 IF (has_unit_metric) THEN
909 scf_env%method = special_diag_method_nr
910 END IF
911 CASE (diag_ot)
912 IF (dft_control%roks) THEN
913 cpabort("ROKS with OT diagonalization not possible")
914 END IF
915 scf_env%method = ot_diag_method_nr
916 need_coeff_b = .true.
917 ! Block Krylov diagonlization: not possible with ROKS,
918 ! allocation of additional matrices is needed
919 CASE (diag_block_krylov)
920 IF (dft_control%roks) THEN
921 cpabort("ROKS with block PF diagonalization not possible")
922 END IF
923 scf_env%method = block_krylov_diag_method_nr
924 IF (.NOT. ASSOCIATED(scf_env%krylov_settings)) THEN
925 CALL krylov_settings_create(scf_env%krylov_settings, scf_section)
926 END IF
927 ! the Gamma workspace carries the refinement buffers. The
928 ! k-point world parses the settings only. The complex kernel
929 ! takes a caller-owned workspace. Nothing is allocated from
930 ! the Gamma MOS, and the k-point world never uses
931 ! scf_env%ortho
932 scf_env%needs_ortho = .NOT. do_kpoints
933 IF (.NOT. do_kpoints) THEN
934 CALL krylov_workspace_allocate(scf_env%krylov_space, scf_env%krylov_settings, mos)
935 END IF
936 ! Block davidson diagonlization: allocation of additional matrices is needed
938 scf_env%method = block_davidson_diag_method_nr
939 IF (do_kpoints) THEN
940 IF (dft_control%roks) THEN
941 cpabort("Block Davidson not possible with ROKS")
942 END IF
943 ! one channel per (local kpoint, spin); scratch matrices are local
944 ! to generate_extended_space_c, so only the settings are stored
945 IF (.NOT. ASSOCIATED(scf_env%block_davidson_env)) THEN
946 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
947 CALL get_kpoint_info(kpoints, kp_range=kp_range)
948 kplocal = kp_range(2) - kp_range(1) + 1
949 CALL block_davidson_env_create(scf_env%block_davidson_env, &
950 kplocal*dft_control%nspins, scf_section)
951 END IF
952 need_coeff_b = .false.
953 ELSE
954 IF (.NOT. ASSOCIATED(scf_env%block_davidson_env)) THEN
955 CALL block_davidson_env_create(scf_env%block_davidson_env, dft_control%nspins, &
956 scf_section)
957 END IF
958 DO ispin = 1, dft_control%nspins
959 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
960 CALL block_davidson_allocate(scf_env%block_davidson_env(ispin), mo_coeff, nao, nmo)
961 END DO
962 need_coeff_b = .true.
963 END IF
964 ! Filter matrix diagonalisation method
965 CASE (diag_filter_matrix)
966 scf_env%method = filter_matrix_diag_method_nr
967 IF (.NOT. fb_env_has_data(scf_env%filter_matrix_env)) THEN
968 CALL fb_env_create(scf_env%filter_matrix_env)
969 END IF
970 CALL fb_env_read_input(scf_env%filter_matrix_env, scf_section)
971 CALL fb_env_build_rcut_auto(scf_env%filter_matrix_env, qs_env)
972 CALL fb_env_write_info(scf_env%filter_matrix_env, qs_env, scf_section)
973 CALL fb_distribution_build(scf_env%filter_matrix_env, qs_env, scf_section)
974 CALL fb_env_build_atomic_halos(scf_env%filter_matrix_env, qs_env, scf_section)
975 CASE DEFAULT
976 cpabort("Unknown diagonalization method")
977 END SELECT
978 ! Check if subspace diagonlization is requested: allocation of additional matrices is needed
979 IF (scf_control%do_diag_sub) THEN
980 scf_env%needs_ortho = .true.
981 IF (.NOT. ASSOCIATED(scf_env%subspace_env)) THEN
982 CALL diag_subspace_env_create(scf_env%subspace_env, scf_section, &
983 dft_control%qs_control%cutoff)
984 END IF
985 CALL diag_subspace_allocate(scf_env%subspace_env, qs_env, mos)
986 IF (do_kpoints) THEN
987 cpabort("No subspace diagonlization with kpoint calculation")
988 END IF
989 END IF
990 ! OT: check if OT is used instead of diagonalization. Not possible with added MOS at the moment
991 ELSE IF (scf_control%use_ot) THEN
992 scf_env%method = ot_method_nr
993 need_coeff_b = .true.
994 CALL section_vals_val_get(scf_section, "OT%ENERGIES", l_val=ot_energies)
995 IF (sum(abs(scf_control%added_mos)) > 0 .AND. &
996 (.NOT. do_kpoints .OR. .NOT. ot_energies)) THEN
997 cpabort("OT with ADDED_MOS currently requires complex K points and OT%ENERGIES.")
998 END IF
999 IF (dft_control%restricted .AND. dft_control%nspins /= 2) THEN
1000 cpabort("nspin must be 2 for restricted (ROKS)")
1001 END IF
1002 ! K-point OT is allowed to reach the spin/k-point channel allocation stub.
1003 ELSE IF (scf_env%method /= smeagol_method_nr) THEN
1004 cpabort("OT or DIAGONALIZATION have to be set")
1005 END IF
1006 DO ispin = 1, dft_control%nspins
1007 mos(ispin)%use_mo_coeff_b = need_coeff_b
1008 END DO
1009
1010 END SUBROUTINE qs_scf_ensure_diagonalization
1011
1012! **************************************************************************************************
1013!> \brief performs those initialisations that need to be done only once
1014!> (e.g. that only depend on the atomic positions)
1015!> this will be called in scf
1016!> \param scf_env ...
1017!> \param qs_env ...
1018!> \param scf_section ...
1019!> \param scf_control ...
1020!> \par History
1021!> 03.2006 created [Joost VandeVondele]
1022! **************************************************************************************************
1023 SUBROUTINE init_scf_run(scf_env, qs_env, scf_section, scf_control)
1024
1025 TYPE(qs_scf_env_type), POINTER :: scf_env
1026 TYPE(qs_environment_type), POINTER :: qs_env
1027 TYPE(section_vals_type), POINTER :: scf_section
1028 TYPE(scf_control_type), POINTER :: scf_control
1029
1030 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_scf_run'
1031
1032 INTEGER :: after, handle, homo, ii, ikind, ispin, &
1033 iw, nao, ndep, needed_evals, nmo, &
1034 output_unit
1035 LOGICAL :: dft_plus_u_atom, do_kpoints, &
1036 init_u_ramping_each_scf, omit_headers, &
1037 s_minus_half_available
1038 REAL(kind=dp) :: u_ramping
1039 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals
1040 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues
1041 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1042 TYPE(cp_fm_struct_type), POINTER :: fm_struct
1043 TYPE(cp_fm_type) :: evecs, fm_w
1044 TYPE(cp_fm_type), POINTER :: mo_coeff
1045 TYPE(cp_logger_type), POINTER :: logger
1046 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
1047 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp, matrix_w_kp
1048 TYPE(dft_control_type), POINTER :: dft_control
1049 TYPE(kpoint_type), POINTER :: kpoints
1050 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1051 TYPE(mp_para_env_type), POINTER :: para_env
1052 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1053 TYPE(qs_kind_type), POINTER :: qs_kind
1054 TYPE(qs_rho_type), POINTER :: rho
1055 TYPE(xas_environment_type), POINTER :: xas_env
1056
1057 CALL timeset(routinen, handle)
1058
1059 NULLIFY (qs_kind_set, matrix_s, dft_control, mos, qs_kind, rho, xas_env, mo_coeff)
1060
1061 logger => cp_get_default_logger()
1062
1063 cpassert(ASSOCIATED(scf_env))
1064 cpassert(ASSOCIATED(qs_env))
1065 NULLIFY (para_env)
1066
1067 s_minus_half_available = .false.
1068 CALL get_qs_env(qs_env, &
1069 dft_control=dft_control, &
1070 qs_kind_set=qs_kind_set, &
1071 mos=mos, &
1072 rho=rho, &
1073 nelectron_total=scf_env%nelectron, &
1074 do_kpoints=do_kpoints, &
1075 para_env=para_env, &
1076 xas_env=xas_env)
1077
1078 ! A new SCF run may use a different geometry, cell or basis.
1079 IF (do_kpoints) THEN
1080 CALL get_qs_env(qs_env, kpoints=kpoints)
1081 CALL kpoint_clear_scf_smat(kpoints)
1082 END IF
1083
1084 ! Check restricted optimizers available for tblite library
1085 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
1086 IF (scf_env%method == ot_method_nr) THEN
1087 CALL cp_warn(__location__, &
1088 "CP2K/tblite with OT updates the tblite SCC variables directly from the OT density; "// &
1089 "XTB/SCC_MIXER is ignored.")
1090 IF (scf_control%smear%do_smear .AND. &
1091 dft_control%qs_control%xtb_control%tblite_method == gfn2xtb) THEN
1092 CALL cp_warn(__location__, &
1093 "Direct GFN2/tblite smearing has indefinite shell and multipole SCC modes. "// &
1094 "Use SCF/DIAGONALIZATION ALGORITHM OT with XTB/SCC_MIXER TBLITE or CP2K.")
1095 cpabort("Use fixed-H OT for GFN2 smearing")
1096 END IF
1097 END IF
1098 END IF
1099
1100 ! Calculate ortho matrix
1101 ndep = 0
1102 IF (scf_env%needs_ortho) THEN
1103 CALL get_qs_env(qs_env, matrix_s=matrix_s)
1104 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, scf_env%ortho)
1105 IF (scf_env%cholesky_method > cholesky_off) THEN
1106 CALL cp_fm_cholesky_decompose(scf_env%ortho)
1107 IF (scf_env%cholesky_method == cholesky_dbcsr) THEN
1108 CALL cp_fm_triangular_invert(scf_env%ortho)
1109 CALL cp_fm_set_all(scf_env%scf_work2, 0.0_dp)
1110 CALL cp_fm_to_fm_triangular(scf_env%ortho, scf_env%scf_work2, "U")
1111 CALL copy_fm_to_dbcsr(scf_env%scf_work2, scf_env%ortho_dbcsr)
1112 ELSE IF (scf_env%cholesky_method == cholesky_inverse) THEN
1113 CALL cp_fm_to_fm(scf_env%ortho, scf_env%ortho_m1)
1114 CALL cp_fm_triangular_invert(scf_env%ortho_m1)
1115 END IF
1116 ELSE
1117 CALL cp_fm_get_info(scf_env%ortho, ncol_global=nao)
1118 ALLOCATE (evals(nao))
1119 evals = 0
1120
1121 CALL cp_fm_create(evecs, scf_env%ortho%matrix_struct)
1122
1123 ! Perform an EVD
1124 CALL choose_eigv_solver(scf_env%ortho, evecs, evals)
1125
1126 ! Determine the number of neglectable eigenvalues assuming that the eigenvalues are in ascending order
1127 ! (Required by Lapack)
1128 ndep = 0
1129 DO ii = 1, nao
1130 IF (evals(ii) > scf_control%eps_eigval) THEN
1131 ndep = ii - 1
1132 EXIT
1133 END IF
1134 END DO
1135 needed_evals = nao - ndep
1136
1137 ! Set the eigenvalue of the eigenvectors belonging to the linear subspace to zero
1138 evals(1:ndep) = 0.0_dp
1139 ! Determine the eigenvalues of the inverse square root
1140 evals(ndep + 1:nao) = 1.0_dp/sqrt(evals(ndep + 1:nao))
1141
1142 ! Create reduced matrices
1143 NULLIFY (fm_struct)
1144 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1145 nrow_global=nao, ncol_global=needed_evals)
1146
1147 ALLOCATE (scf_env%ortho_red, scf_env%scf_work2_red)
1148 CALL cp_fm_create(scf_env%ortho_red, fm_struct)
1149 CALL cp_fm_create(scf_env%scf_work2_red, fm_struct)
1150 CALL cp_fm_struct_release(fm_struct)
1151
1152 IF (scf_control%level_shift /= 0.0_dp) THEN
1153 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1154 nrow_global=needed_evals, ncol_global=nao)
1155
1156 ALLOCATE (scf_env%ortho_m1_red)
1157 CALL cp_fm_create(scf_env%ortho_m1_red, fm_struct)
1158 CALL cp_fm_struct_release(fm_struct)
1159 END IF
1160
1161 ALLOCATE (scf_env%scf_work1_red(SIZE(scf_env%scf_work1)))
1162 DO ispin = 1, SIZE(scf_env%scf_work1)
1163 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1164 nrow_global=needed_evals, ncol_global=needed_evals)
1165 CALL cp_fm_create(scf_env%scf_work1_red(ispin), fm_struct)
1166 CALL cp_fm_struct_release(fm_struct)
1167 END DO
1168
1169 ! Scale the eigenvalues and copy them to
1170 CALL cp_fm_to_fm(evecs, scf_env%ortho_red, needed_evals, ndep + 1, 1)
1171
1172 IF (scf_control%level_shift /= 0.0_dp) THEN
1173 CALL cp_fm_transpose(scf_env%ortho_red, scf_env%ortho_m1_red)
1174 END IF
1175
1176 CALL cp_fm_column_scale(scf_env%ortho_red, evals(ndep + 1:))
1177
1178 ! Copy the linear dependent columns to the MO sets and set their orbital energies
1179 ! to a very large value to reduce the probability of occupying them
1180 DO ispin = 1, SIZE(mos)
1181 CALL get_mo_set(mos(ispin), nmo=nmo, mo_coeff=mo_coeff, homo=homo, eigenvalues=eigenvalues)
1182 IF (needed_evals < nmo) THEN
1183 IF (needed_evals < homo) THEN
1184 CALL cp_abort(__location__, &
1185 "The numerical rank of the overlap matrix is lower than the "// &
1186 "number of orbitals to be occupied! Check the geometry or increase "// &
1187 "EPS_DEFAULT or EPS_PGF_ORB!")
1188 END IF
1189 CALL cp_warn(__location__, &
1190 "The numerical rank of the overlap matrix is lower than the number of requested MOs! "// &
1191 "Reduce the number of MOs to the number of available MOs. If necessary, "// &
1192 "request a lower number of MOs or increase EPS_DEFAULT or EPS_PGF_ORB.")
1193 CALL set_mo_set(mos(ispin), nmo=needed_evals)
1194 END IF
1195 ! Copy the last columns to mo_coeff if the container is large enough
1196 CALL cp_fm_to_fm(evecs, mo_coeff, min(ndep, max(0, nmo - needed_evals)), 1, needed_evals + 1)
1197 ! Set the corresponding eigenvalues to a large value
1198 ! This prevents their occupation but still keeps the information on them
1199 eigenvalues(needed_evals + 1:min(nao, nmo)) = 1.0_dp/scf_control%eps_eigval
1200 END DO
1201
1202 ! Obtain ortho from (P)DGEMM, skip the linear dependent columns
1203 CALL parallel_gemm("N", "T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_red, evecs, &
1204 0.0_dp, scf_env%ortho, b_first_col=ndep + 1)
1205
1206 IF (scf_control%level_shift /= 0.0_dp) THEN
1207 ! We need SQRT(evals) of the eigenvalues of H, so 1/SQRT(evals) of ortho_red
1208 evals(ndep + 1:nao) = 1.0_dp/evals(ndep + 1:nao)
1209 CALL cp_fm_row_scale(scf_env%ortho_m1_red, evals(ndep + 1:))
1210
1211 CALL parallel_gemm("T", "T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_m1_red, evecs, &
1212 0.0_dp, scf_env%ortho_m1, b_first_col=ndep + 1)
1213 END IF
1214
1215 CALL cp_fm_release(evecs)
1216
1217 s_minus_half_available = .true.
1218 END IF
1219
1220 IF (btest(cp_print_key_should_output(logger%iter_info, &
1221 qs_env%input, "DFT%PRINT%AO_MATRICES/ORTHO"), cp_p_file)) THEN
1222 iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/ORTHO", &
1223 extension=".Log")
1224 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
1225 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
1226 after = min(max(after, 1), 16)
1227 CALL write_fm_with_basis_info(scf_env%ortho, 4, after, qs_env, &
1228 para_env, output_unit=iw, omit_headers=omit_headers)
1229 CALL cp_print_key_finished_output(iw, logger, qs_env%input, &
1230 "DFT%PRINT%AO_MATRICES/ORTHO")
1231 END IF
1232 END IF
1233
1234 CALL get_mo_set(mo_set=mos(1), nao=nao)
1235
1236 ! DFT+U methods based on Lowdin charges need S^(1/2)
1237 IF (dft_control%dft_plus_u) THEN
1238 IF (dft_control%plus_u_method_id == plus_u_lowdin) THEN
1239 IF (do_kpoints) THEN
1240 ! The active SCF environment is bound to qs_env only after first initialization.
1241 IF (scf_env%method /= general_diag_method_nr .AND. scf_env%method /= ot_method_nr) THEN
1242 CALL cp_abort(__location__, &
1243 "Lowdin DFT+U with k-points requires STANDARD diagonalization or OT")
1244 END IF
1245 CALL get_qs_env(qs_env, kpoints=kpoints, matrix_s_kp=matrix_s_kp, matrix_w_kp=matrix_w_kp)
1246 IF (scf_control%use_ot) THEN
1247 IF (kpoints%use_real_wfn .OR. dft_control%restricted) THEN
1248 CALL cp_abort(__location__, &
1249 "Lowdin DFT+U with k-point OT requires complex RKS/UKS wavefunctions")
1250 END IF
1251 END IF
1252 CALL diag_kp_smat(matrix_s_kp, kpoints, scf_env%scf_work1, lowdin_forces=ASSOCIATED(matrix_w_kp))
1253 CALL lowdin_kp_init(qs_env)
1254 ELSE
1255 CALL get_qs_env(qs_env, matrix_s=matrix_s)
1256 IF (s_minus_half_available) THEN
1257 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, scf_env%ortho, &
1258 scf_env%s_half, nao)
1259 ELSE
1260 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, scf_env%s_half)
1261 CALL cp_fm_create(fm_w, scf_env%s_half%matrix_struct)
1262 CALL cp_fm_power(scf_env%s_half, fm_w, 0.5_dp, scf_control%eps_eigval, ndep)
1263 CALL cp_fm_release(fm_w)
1264 END IF
1265 END IF
1266 END IF
1267 DO ikind = 1, SIZE(qs_kind_set)
1268 qs_kind => qs_kind_set(ikind)
1269 CALL get_qs_kind(qs_kind=qs_kind, &
1270 dft_plus_u_atom=dft_plus_u_atom, &
1271 u_ramping=u_ramping, &
1272 init_u_ramping_each_scf=init_u_ramping_each_scf)
1273 IF (dft_plus_u_atom .AND. (u_ramping /= 0.0_dp)) THEN
1274 IF (init_u_ramping_each_scf) THEN
1275 CALL set_qs_kind(qs_kind=qs_kind, u_minus_j=0.0_dp)
1276 END IF
1277 END IF
1278 END DO
1279 END IF
1280
1281 IF (dft_control%dft_plus_u) THEN
1282 IF (dft_control%plus_u_method_id == plus_u_tensorial) THEN
1283 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
1284 DO ikind = 1, SIZE(atomic_kind_set)
1285 qs_kind => qs_kind_set(ikind)
1286 CALL get_qs_kind(qs_kind=qs_kind, dft_plus_u_atom=dft_plus_u_atom)
1287 IF (.NOT. dft_plus_u_atom) cycle
1288 CALL calculate_atomic_orbitals(atomic_kind=atomic_kind_set(ikind), &
1289 qs_kind=qs_kind_set(ikind), &
1290 which_l=qs_kind%dft_plus_u%l, &
1291 which_n=qs_kind%dft_plus_u%n, &
1292 proj_shell_charge=qs_kind%dft_plus_u%proj_shell_charge, &
1293 ao_coef=qs_kind%dft_plus_u%ao_coef)
1294 END DO
1295 END IF
1296 END IF
1297
1298 ! extrapolate outer loop variables
1299 IF (scf_control%outer_scf%have_scf) THEN
1300 CALL outer_loop_extrapolate(qs_env)
1301 END IF
1302
1303 ! initializes rho and the mos
1304 IF (ASSOCIATED(qs_env%xas_env)) THEN
1305 ! if just optimized wfn, e.g. ground state
1306 ! changes come from a perturbation, e.g., the occupation numbers
1307 ! it could be generalized for other cases, at the moment used only for core level spectroscopy
1308 ! initialize the density with the localized mos
1309 CALL xas_initialize_rho(qs_env, scf_env, scf_control)
1310 IF (do_kpoints .AND. dft_control%dft_plus_u .AND. dft_control%plus_u_method_id == plus_u_lowdin) THEN
1311 CALL lowdin_kp_initial_density(qs_env, scf_env%scf_work1(1))
1312 END IF
1313 ELSE
1314 CALL scf_env_initial_rho_setup(scf_env, qs_env=qs_env, &
1315 scf_section=scf_section, scf_control=scf_control)
1316 END IF
1317
1318 ! Frozen density approximation
1319 IF (ASSOCIATED(qs_env%wf_history)) THEN
1320 IF (qs_env%wf_history%interpolation_method_nr == wfi_frozen_method_nr) THEN
1321 IF (.NOT. ASSOCIATED(qs_env%wf_history%past_states(1)%snapshot)) THEN
1322 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
1323 ALLOCATE (qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1324 CALL qs_rho_create(qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1325 CALL duplicate_rho_type(rho_input=rho, &
1326 rho_output=qs_env%wf_history%past_states(1)%snapshot%rho_frozen, &
1327 qs_env=qs_env)
1328 END IF
1329 END IF
1330 END IF
1331
1332 !image charge method, calculate image_matrix if required
1333 IF (qs_env%qmmm) THEN
1334 IF (qs_env%qmmm .AND. qs_env%qmmm_env_qm%image_charge) THEN
1335 CALL conditional_calc_image_matrix(qs_env=qs_env, &
1336 qmmm_env=qs_env%qmmm_env_qm)
1337 END IF
1338 END IF
1339
1340 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1341 extension=".scfLog")
1342 CALL qs_scf_initial_info(output_unit, mos, dft_control, ndep)
1343 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1344 "PRINT%PROGRAM_RUN_INFO")
1345
1346 CALL timestop(handle)
1347
1348 END SUBROUTINE init_scf_run
1349
1350! **************************************************************************************************
1351!> \brief Initializes rho and the mos, so that an scf cycle can start
1352!> \param scf_env the scf env in which to do the scf
1353!> \param qs_env the qs env the scf_env lives in
1354!> \param scf_section ...
1355!> \param scf_control ...
1356!> \par History
1357!> 02.2003 created [fawzi]
1358!> \author fawzi
1359! **************************************************************************************************
1360 SUBROUTINE scf_env_initial_rho_setup(scf_env, qs_env, scf_section, scf_control)
1361 TYPE(qs_scf_env_type), POINTER :: scf_env
1362 TYPE(qs_environment_type), POINTER :: qs_env
1363 TYPE(section_vals_type), POINTER :: scf_section
1364 TYPE(scf_control_type), POINTER :: scf_control
1365
1366 CHARACTER(len=*), PARAMETER :: routinen = 'scf_env_initial_rho_setup'
1367
1368 INTEGER :: extrapolation_method_nr, handle, ispin, &
1369 nmo, output_unit
1370 LOGICAL :: do_harris, do_kpoints, orthogonal_wf
1371 REAL(kind=dp), POINTER :: auxiliary(:, :)
1372 TYPE(cp_fm_type), POINTER :: mo_coeff
1373 TYPE(cp_logger_type), POINTER :: logger
1374 TYPE(dft_control_type), POINTER :: dft_control
1375 TYPE(harris_type), POINTER :: harris_env
1376 TYPE(kpoint_type), POINTER :: kpoints
1377 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1378 TYPE(mp_para_env_type), POINTER :: para_env
1379 TYPE(qs_rho_type), POINTER :: rho
1380 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom
1381
1382 CALL timeset(routinen, handle)
1383 NULLIFY (mo_coeff, rho, dft_control, para_env, mos)
1384 logger => cp_get_default_logger()
1385 cpassert(ASSOCIATED(scf_env))
1386 cpassert(ASSOCIATED(qs_env))
1387
1388 CALL get_qs_env(qs_env, &
1389 rho=rho, &
1390 mos=mos, &
1391 dft_control=dft_control, &
1392 do_kpoints=do_kpoints, &
1393 para_env=para_env)
1394
1395 do_harris = qs_env%harris_method
1396 IF (do_harris .AND. scf_control%density_guess == external_density_guess) THEN
1397 cpabort("EXTERNAL_DENSITY SCF guess is incompatible with HARRIS_METHOD")
1398 END IF
1399
1400 extrapolation_method_nr = wfi_use_guess_method_nr
1401 IF (ASSOCIATED(qs_env%wf_history)) THEN
1402 CALL wfi_extrapolate(qs_env%wf_history, &
1403 qs_env=qs_env, dt=1.0_dp, &
1404 extrapolation_method_nr=extrapolation_method_nr, &
1405 orthogonal_wf=orthogonal_wf)
1406 ! wfi_use_guess_method_nr the wavefunctions are not yet initialized
1407 IF ((.NOT. orthogonal_wf) .AND. &
1408 (scf_env%method == ot_method_nr) .AND. &
1409 (.NOT. do_kpoints) .AND. &
1410 (.NOT. (extrapolation_method_nr == wfi_use_guess_method_nr))) THEN
1411 DO ispin = 1, SIZE(mos)
1412 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1413 CALL reorthogonalize_vectors(qs_env, v_matrix=mo_coeff, n_col=nmo)
1414 IF (dft_control%hairy_probes .EQV. .true.) THEN
1415 scf_control%smear%do_smear = .false.
1416 CALL set_mo_occupation(mo_set=mos(ispin), &
1417 smear=scf_control%smear, probe=dft_control%probe)
1418 ELSE
1419 CALL set_mo_occupation(mo_set=mos(ispin), &
1420 smear=scf_control%smear)
1421 END IF
1422 END DO
1423 END IF
1424 END IF
1425
1426 IF (.NOT. do_harris) THEN
1427 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1428 extension=".scfLog")
1429 IF (output_unit > 0) THEN
1430 WRITE (unit=output_unit, fmt="(/,T2,A,I0)") &
1431 "Extrapolation method: "// &
1432 trim(wfi_get_method_label(extrapolation_method_nr))
1433 IF (extrapolation_method_nr == wfi_ps_method_nr) THEN
1434 WRITE (unit=output_unit, fmt="(T2,A,I0,A)") &
1435 "Extrapolation order: ", &
1436 max((min(qs_env%wf_history%memory_depth, qs_env%wf_history%snapshot_count) - 1), 0)
1437 END IF
1438 END IF
1439 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1440 "PRINT%PROGRAM_RUN_INFO")
1441 END IF
1442
1443 IF (do_harris) THEN
1444 CALL get_qs_env(qs_env, harris_env=harris_env)
1445 CALL harris_density_update(qs_env, harris_env)
1446 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1447 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1448 ELSE IF (extrapolation_method_nr == wfi_use_guess_method_nr) THEN
1449 CALL calculate_first_density_matrix(scf_env=scf_env, qs_env=qs_env)
1450 IF (scf_control%density_guess == external_density_guess) THEN
1451 CALL read_scf_guess_density(qs_env, scf_control%external_density_file_name)
1452 ELSE
1453 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1454 END IF
1455 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1456 END IF
1457
1458 ! Some preparation for the mixing
1459 NULLIFY (auxiliary)
1460 IF (do_kpoints .AND. dft_control%dft_plus_u) THEN
1461 IF (dft_control%plus_u_method_id == plus_u_lowdin) THEN
1462 CALL lowdin_kp_initial_density(qs_env, scf_env%scf_work1(1))
1463 CALL get_qs_env(qs_env, kpoints=kpoints)
1464 auxiliary => kpoints%lowdin_q
1465 END IF
1466 END IF
1467 IF (scf_env%mixing_method > 1) THEN
1468 IF (dft_control%qs_control%gapw) THEN
1469 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
1470 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1471 para_env, rho_atom=rho_atom, auxiliary=auxiliary)
1472 ELSE IF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
1473 CALL charge_mixing_init(scf_env%mixing_store)
1474 ELSE IF (dft_control%qs_control%semi_empirical) THEN
1475 cpabort('SE Code not possible')
1476 ELSE
1477 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1478 para_env, auxiliary=auxiliary)
1479 END IF
1480 END IF
1481
1482 DO ispin = 1, SIZE(mos) !fm->dbcsr
1483 IF (mos(ispin)%use_mo_coeff_b) THEN
1484 CALL copy_fm_to_dbcsr(mos(ispin)%mo_coeff, &
1485 mos(ispin)%mo_coeff_b) !fm->dbcsr
1486 END IF
1487 END DO !fm->dbcsr
1488
1489 CALL timestop(handle)
1490
1491 END SUBROUTINE scf_env_initial_rho_setup
1492
1493END MODULE qs_scf_initialization
calculate the orbitals for a given atomic kind type
subroutine, public calculate_atomic_orbitals(atomic_kind, qs_kind, agrid, iunit, pmat, fmat, density, wavefunction, wfninfo, confine, xc_section, nocc, which_l, which_n, proj_shell_charge, ao_coef)
...
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public hu2010
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
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, plan, check_plan)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_m_by_n_from_row_template(matrix, template, n, sym)
Utility function to create dbcsr matrix, m x n matrix (n arbitrary) with the same processor grid and ...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
DBCSR output in CP2K.
subroutine, public write_fm_with_basis_info(blacs_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, output_unit, omit_headers)
Print a spherical matrix of blacs type.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_row_scale(matrixa, scaling)
scales row i of matrix a with scaling(i)
subroutine, public cp_fm_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
subroutine, public cp_fm_column_scale(matrixa, scaling, first_col, source)
Scales columns of the full matrix by corresponding factors.
subroutine, public cp_fm_triangular_invert(matrix_a, uplo_tr)
inverts a triangular matrix
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
Definition cp_fm_diag.F:17
subroutine, public cp_fm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
...
integer, parameter, public fm_diag_type_cusolver
Definition cp_fm_diag.F:112
logical, save, public direct_generalized_diagonalization
Definition cp_fm_diag.F:106
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
Definition cp_fm_diag.F:262
integer, save, public diag_type
Definition cp_fm_diag.F:93
integer, parameter, public cusolver_n_min
Definition cp_fm_diag.F:102
pool for for elements that are retained and released
type(cp_fm_struct_type) function, pointer, public fm_pool_get_el_struct(pool)
returns the structure of the elements in this 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_get(fmstruct, para_env, context, descriptor, ncol_block, nrow_block, nrow_global, ncol_global, first_p_pos, row_indices, col_indices, nrow_local, ncol_local, nrow_locals, ncol_locals, local_leading_dimension)
returns the values of various attributes of the 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_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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_to_fm_triangular(msource, mtarget, uplo)
copy just a triangular matrix
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...
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,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
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, file_access)
...
Add the DFT+U contribution to the Hamiltonian matrix.
Definition dft_plus_u.F:18
subroutine, public lowdin_kp_initial_density(qs_env, fmwork)
Complete the initial density's Lowdin coordinates, including atomic and density restarts.
subroutine, public lowdin_kp_init(qs_env)
Select the AO columns used by the existing orbital-diagonal Lowdin functional.
Definition dft_plus_u.F:935
subroutine, public ao_boundaries(probe, atomic_kind_set, qs_kind_set, particle_set, nao)
...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public smeagol_runtype_emtransport
integer, parameter, public external_density_guess
integer, parameter, public wfi_frozen_method_nr
integer, parameter, public diag_block_krylov
integer, parameter, public broy_mix
integer, parameter, public plus_u_lowdin
integer, parameter, public pulay_mix
integer, parameter, public cholesky_dbcsr
integer, parameter, public direct_p_mix
integer, parameter, public wfi_use_guess_method_nr
integer, parameter, public modified_broy_mix
integer, parameter, public cholesky_off
integer, parameter, public no_mix
integer, parameter, public kerker_mix
integer, parameter, public cholesky_inverse
integer, parameter, public diag_ot
integer, parameter, public plus_u_tensorial
integer, parameter, public diag_update_method_adiis
integer, parameter, public diag_filter_matrix
integer, parameter, public multisec_mix
integer, parameter, public new_pulay_mix
integer, parameter, public diag_block_davidson
integer, parameter, public wfi_ps_method_nr
integer, parameter, public outer_scf_none
integer, parameter, public diag_standard
integer, parameter, public gfn2xtb
integer, parameter, public ot2cdft
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Types and basic routines needed for a kpoint calculation.
subroutine, public kpoint_clear_scf_smat(kpoint)
Release overlap matrices cached for a single SCF run.
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, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered, lattice_fft)
Retrieve information from a kpoint environment.
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Routines for image charge calculation within QM/MM.
subroutine, public conditional_calc_image_matrix(qs_env, qmmm_env)
calculate image matrix T depending on constraints on image atoms in case coefficients are estimated n...
module that contains the algorithms to perform an iterative diagonalization by the block-Davidson app...
subroutine, public block_davidson_env_create(bdav_env, nchannels, scf_section)
creates one Davidson environment per solver channel: for Gamma-point runs a channel is a spin,...
subroutine, public block_davidson_allocate(bdav_env, mo_coeff, nao, nmo)
...
Control parameters for optimizers that work with CDFT constraints.
subroutine, public cdft_opt_type_copy(new, old)
copies settings between two CDFT optimizer control objects retaining both
module that contains the definitions of the scf types
subroutine, public mixing_storage_release(mixing_store)
releases a mixing_storage
integer, parameter, public no_mixing_nr
integer, parameter, public direct_mixing_nr
subroutine, public mixing_storage_create(mixing_store, mixing_section, mixing_method, ecut)
creates a mixing_storage
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, matrix_vhxc, 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.
Routines to handle an external density The external density can be generic and is provided by user in...
subroutine, public read_scf_guess_density(qs_env, filename)
Read a cube density for one-time use as the first SCF input density.
subroutine, public fb_distribution_build(fb_env, qs_env, scf_section)
Build local atoms associated to filter matrix algorithm for each MPI process, trying to balance the l...
subroutine, public fb_env_read_input(fb_env, scf_section)
Read input sections for filter matrix method.
subroutine, public fb_env_build_atomic_halos(fb_env, qs_env, scf_section)
Builds an fb_atomic_halo_list object using information from fb_env.
subroutine, public fb_env_write_info(fb_env, qs_env, scf_section)
Write out parameters used for the filter matrix method to output.
subroutine, public fb_env_build_rcut_auto(fb_env, qs_env)
Automatically generate the cutoff radii of atoms used for constructing the atomic halos,...
logical function, public fb_env_has_data(fb_env)
Checks if a fb_env object is associated with an actual data content or not.
subroutine, public fb_env_create(fb_env)
creates an empty fb_env object
Types needed for a for a Harris model calculation.
Harris method environment setup and handling.
subroutine, public harris_density_update(qs_env, harris_env)
...
Routines to somehow generate an initial guess.
subroutine, public calculate_first_density_matrix(scf_env, qs_env)
can use a variety of methods to come up with an initial density matrix and optionally an initial wave...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public set_qs_kind(qs_kind, paw_atom, ghost, floating, hard_radius, hard0_radius, covalent_radius, vdw_radius, lmax_rho0, zeff, no_optimize, dispersion, u_minus_j, hund_j, reltmat, dftb_parameter, xtb_parameter, elec_conf, pao_basis_size)
Set the components of an atomic kind data set.
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_pool, 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)
elemental subroutine, public charge_mixing_init(mixing_store)
initialiation needed when charge mixing is used
subroutine, public mixing_init(mixing_method, rho, mixing_store, para_env, rho_atom, auxiliary)
initialiation needed when gspace mixing is used
subroutine, public mixing_allocate(qs_env, mixing_method, p_mix_new, p_delta, nspins, mixing_store)
allocation needed when density mixing is used
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public set_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, uniform_occupation, kts, mu, flexible_electron_count)
Set the components of a MO set data structure.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name, counter, complex_coeff)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
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, cmo_coeff)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Routines for performing an outer scf loop.
subroutine, public outer_loop_switch(scf_env, scf_control, cdft_control, dir)
switch between two outer_scf envs stored in cdft_control
subroutine, public outer_loop_extrapolate(qs_env)
uses the outer_scf_history to extrapolate new values for the variables and updates their value in qs_...
integer function, public outer_loop_variables_count(scf_control, cdft_control)
returns the number of variables that is employed in the outer loop. with a CDFT constraint this value...
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...
subroutine, public duplicate_rho_type(rho_input, rho_output, qs_env)
Duplicates a pointer physically.
superstucture that hold various representations of the density and keeps track of which ones are vali...
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...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public diag_kp_smat(matrix_s, kpoints, fmwork, lowdin_forces)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
subroutine, public diag_subspace_allocate(subspace_env, qs_env, mos)
...
Utility routines for qs_scf.
subroutine, public qs_scf_env_init_basic(qs_env, scf_env)
initializes input parameters if needed for non-scf calclulations using diagonalization
subroutine, public qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
initializes input parameters if needed or restores values from previous runs to fill scf_env with the...
module that contains the algorithms to perform an iterative diagonalization by the block-Lanczos appr...
subroutine, public krylov_workspace_allocate(krylov_space, krylov_settings, mos)
allocates matrices and vectors used in the construction of the krylov space and for the lanczos refin...
subroutine, public qs_scf_initial_info(output_unit, mos, dft_control, ndep)
writes basic information at the beginning of an scf run
module that contains the definitions of the scf types
integer, parameter, public ot_diag_method_nr
subroutine, public diag_subspace_env_create(subspace_env, scf_section, ecut)
creates subspace-rotation environment
integer, parameter, public filter_matrix_diag_method_nr
integer, parameter, public block_davidson_diag_method_nr
integer, parameter, public smeagol_method_nr
subroutine, public krylov_settings_create(krylov_settings, scf_section)
creates the Krylov solver settings
integer, parameter, public ot_method_nr
subroutine, public scf_env_create(scf_env)
allocates and initialize an scf_env
integer, parameter, public special_diag_method_nr
integer, parameter, public block_krylov_diag_method_nr
integer, parameter, public general_diag_method_nr
Storage of past states of the qs_env. Methods to interpolate (or actually normally extrapolate) the n...
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
parameters that control an scf iteration
define create destroy get and put information in xas_env to calculate the x-ray absorption spectra
Initialize the XAS orbitals for specific core excitations Either the GS orbitals are used as initial ...
Definition xas_restart.F:20
subroutine, public xas_initialize_rho(qs_env, scf_env, scf_control)
Once the mos and the occupation numbers are initialized the electronic density of the excited state c...
Provides all information about an atomic kind.
keeps the information about the structure of a full matrix
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...
Contains information about kpoints.
stores all the informations relevant to an mpi environment
Contains information on the Harris method.
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.