(git:1155b05)
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 cp_dbcsr_api, ONLY: dbcsr_create,&
18 dbcsr_type_no_symmetry
40 USE cp_fm_types, ONLY: cp_fm_create,&
50 USE cp_output_handling, ONLY: cp_p_file,&
55 USE input_constants, ONLY: &
64 USE kinds, ONLY: dp
65 USE kpoint_types, ONLY: kpoint_type
69 USE pw_types, ONLY: pw_c1d_gs_type
91 USE qs_kind_types, ONLY: get_qs_kind,&
100 USE qs_mo_types, ONLY: get_mo_set,&
110 USE qs_rho_types, ONLY: qs_rho_create,&
111 qs_rho_get,&
117 USE qs_scf_types, ONLY: &
129#include "./base/base_uses.f90"
130
131 IMPLICIT NONE
132
133 PRIVATE
134
135 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_initialization'
136
138
139CONTAINS
140
141! **************************************************************************************************
142!> \brief initializes input parameters if needed or restores values from
143!> previous runs to fill scf_env with the values required for scf
144!> \param qs_env the qs_environment where to perform the scf procedure
145!> \param scf_env ...
146!> \param scf_control ...
147!> \param scf_section ...
148! **************************************************************************************************
149 SUBROUTINE qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
150 TYPE(qs_environment_type), POINTER :: qs_env
151 TYPE(qs_scf_env_type), POINTER :: scf_env
152 TYPE(scf_control_type), OPTIONAL, POINTER :: scf_control
153 TYPE(section_vals_type), OPTIONAL, POINTER :: scf_section
154
155 INTEGER :: ip, np
156 TYPE(atomic_kind_type), POINTER :: atomic_kind_set(:)
157 TYPE(dft_control_type), POINTER :: dft_control
158 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
159 TYPE(particle_type), POINTER :: particle_set(:)
160 TYPE(qs_kind_type), POINTER :: qs_kind_set(:)
161 TYPE(scf_control_type), POINTER :: my_scf_control
162 TYPE(section_vals_type), POINTER :: dft_section, input, my_scf_section
163
164 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
165
166 !Initialize Hairy Probe calculation
167 IF (dft_control%hairy_probes .EQV. .true.) THEN
168 CALL get_qs_env(qs_env, &
169 mos=mos, &
170 atomic_kind_set=atomic_kind_set, &
171 qs_kind_set=qs_kind_set, &
172 particle_set=particle_set)
173 np = SIZE(dft_control%probe)
174 DO ip = 1, np
175 CALL ao_boundaries(probe=dft_control%probe(ip), atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
176 particle_set=particle_set, nao=mos(1)%nao) !FIX THIS!
177 END DO
178 END IF
179
180 IF (PRESENT(scf_control)) THEN
181 my_scf_control => scf_control
182 ELSE
183 CALL get_qs_env(qs_env, scf_control=my_scf_control)
184 END IF
185
186 dft_section => section_vals_get_subs_vals(input, "DFT")
187 IF (PRESENT(scf_section)) THEN
188 my_scf_section => scf_section
189 ELSE
190 my_scf_section => section_vals_get_subs_vals(dft_section, "SCF")
191 END IF
192
193 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
194
195 CALL section_vals_val_get(my_scf_section, "CHOLESKY", i_val=scf_env%cholesky_method)
196
197 CALL qs_scf_ensure_mos(qs_env)
198
199 ! set flags for diagonalization
200 CALL qs_scf_ensure_diagonalization(scf_env, my_scf_section, qs_env, &
201 my_scf_control, qs_env%has_unit_metric)
202 ! set parameters for mixing/DIIS during scf
203 CALL qs_scf_ensure_mixing(my_scf_control, my_scf_section, scf_env, dft_control)
204
205 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
206
207 CALL qs_scf_ensure_mixing_store(qs_env, scf_env)
208
209 ! Initialize outer loop variables: handle CDFT and regular outer loop separately
210 IF (dft_control%qs_control%cdft) THEN
211 CALL qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, &
212 scf_control=my_scf_control)
213 ELSE
214 CALL qs_scf_ensure_outer_loop_vars(scf_env, my_scf_control)
215 END IF
216
217 CALL init_scf_run(scf_env, qs_env, my_scf_section, my_scf_control)
218
219 END SUBROUTINE qs_scf_env_initialize
220
221! **************************************************************************************************
222!> \brief initializes input parameters if needed for non-scf calclulations using diagonalization
223!> \param qs_env the qs_environment where to perform the scf procedure
224!> \param scf_env ...
225! **************************************************************************************************
226 SUBROUTINE qs_scf_env_init_basic(qs_env, scf_env)
227 TYPE(qs_environment_type), POINTER :: qs_env
228 TYPE(qs_scf_env_type), POINTER :: scf_env
229
230 TYPE(dft_control_type), POINTER :: dft_control
231 TYPE(scf_control_type), POINTER :: scf_control
232 TYPE(section_vals_type), POINTER :: dft_section, input, scf_section
233
234 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
235
236 CALL get_qs_env(qs_env, scf_control=scf_control)
237 dft_section => section_vals_get_subs_vals(input, "DFT")
238 scf_section => section_vals_get_subs_vals(dft_section, "SCF")
239
240 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
241
242 CALL section_vals_val_get(scf_section, "CHOLESKY", i_val=scf_env%cholesky_method)
243 scf_control%use_diag = .true.
244 scf_control%diagonalization%method = diag_standard
245
246 CALL qs_scf_ensure_mos(qs_env)
247
248 ! set flags for diagonalization
249 CALL qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
250 scf_control, qs_env%has_unit_metric)
251 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
252
253 CALL init_scf_run(scf_env, qs_env, scf_section, scf_control)
254
255 END SUBROUTINE qs_scf_env_init_basic
256
257! **************************************************************************************************
258!> \brief makes sure scf_env is allocated (might already be from before)
259!> in case it is present the g-space mixing storage is reset
260!> \param qs_env ...
261!> \param scf_env ...
262! **************************************************************************************************
263 SUBROUTINE qs_scf_ensure_scf_env(qs_env, scf_env)
264 TYPE(qs_environment_type), POINTER :: qs_env
265 TYPE(qs_scf_env_type), POINTER :: scf_env
266
267 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
268 TYPE(qs_rho_type), POINTER :: rho
269
270 NULLIFY (rho_g)
271
272 IF (.NOT. ASSOCIATED(scf_env)) THEN ! i.e. for MD this is associated on the second step (it so seems)
273 ALLOCATE (scf_env)
274 CALL scf_env_create(scf_env)
275 ELSE
276 ! Reallocate mixing store, if the g space grid (cell) has changed
277 SELECT CASE (scf_env%mixing_method)
279 IF (ASSOCIATED(scf_env%mixing_store)) THEN
280 ! The current mixing_store data structure does not allow for an unique
281 ! grid comparison, but the probability that the 1d lengths of the old and
282 ! the new grid are accidentily equal is rather low
283 CALL get_qs_env(qs_env, rho=rho)
284 CALL qs_rho_get(rho, rho_g=rho_g)
285 IF (ASSOCIATED(scf_env%mixing_store%rhoin)) THEN
286 IF (SIZE(rho_g(1)%pw_grid%gsq) /= SIZE(scf_env%mixing_store%rhoin(1)%cc)) THEN
287 CALL mixing_storage_release(scf_env%mixing_store)
288 DEALLOCATE (scf_env%mixing_store)
289 END IF
290 END IF
291 END IF
292 END SELECT
293 END IF
294
295 END SUBROUTINE qs_scf_ensure_scf_env
296
297! **************************************************************************************************
298!> \brief performs allocation of outer SCF variables
299!> \param scf_env the SCF environment which contains the outer SCF variables
300!> \param scf_control control settings for the outer SCF loop
301!> \param nvar (optional) set number of outer SCF variables externally if CDFT SCF is active
302! **************************************************************************************************
303 SUBROUTINE qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvar)
304 TYPE(qs_scf_env_type), POINTER :: scf_env
305 TYPE(scf_control_type), POINTER :: scf_control
306 INTEGER, OPTIONAL :: nvar
307
308 INTEGER :: nhistory, nvariables
309
310 IF (scf_control%outer_scf%have_scf) THEN
311 nhistory = scf_control%outer_scf%max_scf + 1
312 IF (PRESENT(nvar)) THEN
313 IF (nvar > 0) THEN
314 nvariables = nvar
315 ELSE
316 nvariables = outer_loop_variables_count(scf_control)
317 END IF
318 ELSE
319 nvariables = outer_loop_variables_count(scf_control)
320 END IF
321 ALLOCATE (scf_env%outer_scf%variables(nvariables, nhistory))
322 ALLOCATE (scf_env%outer_scf%count(nhistory))
323 scf_env%outer_scf%count = 0
324 ALLOCATE (scf_env%outer_scf%gradient(nvariables, nhistory))
325 ALLOCATE (scf_env%outer_scf%energy(nhistory))
326 END IF
327
328 END SUBROUTINE qs_scf_ensure_outer_loop_vars
329
330! **************************************************************************************************
331!> \brief performs allocation of CDFT SCF variables
332!> \param qs_env the qs_env where to perform the allocation
333!> \param scf_env the currently active scf_env
334!> \param dft_control the dft_control that holds the cdft_control type
335!> \param scf_control the currently active scf_control
336! **************************************************************************************************
337 SUBROUTINE qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, scf_control)
338 TYPE(qs_environment_type), POINTER :: qs_env
339 TYPE(qs_scf_env_type), POINTER :: scf_env
340 TYPE(dft_control_type), POINTER :: dft_control
341 TYPE(scf_control_type), POINTER :: scf_control
342
343 INTEGER :: nhistory, nvariables
344 LOGICAL :: do_kpoints
345 REAL(kind=dp), DIMENSION(:, :), POINTER :: gradient_history, outer_scf_history, &
346 variable_history
347
348 NULLIFY (outer_scf_history, gradient_history, variable_history)
349 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
350 ! Test kpoints
351 IF (do_kpoints) &
352 cpabort("CDFT calculation not possible with kpoints")
353 ! Check that OUTER_SCF section in DFT&SCF is active
354 ! This section must always be active to facilitate
355 ! switching of the CDFT and SCF control parameters in outer_loop_switch
356 IF (.NOT. scf_control%outer_scf%have_scf) &
357 cpabort("Section SCF&OUTER_SCF must be active for CDFT calculations.")
358 ! Initialize CDFT and outer_loop variables (constraint settings active in scf_control)
359 IF (dft_control%qs_control%cdft_control%constraint_control%have_scf) THEN
360 nhistory = dft_control%qs_control%cdft_control%constraint_control%max_scf + 1
361 IF (scf_control%outer_scf%type /= outer_scf_none) THEN
362 nvariables = outer_loop_variables_count(scf_control, &
363 dft_control%qs_control%cdft_control)
364 ELSE
365 ! First iteration: scf_control has not yet been updated
366 nvariables = SIZE(dft_control%qs_control%cdft_control%target)
367 END IF
368 ALLOCATE (dft_control%qs_control%cdft_control%constraint%variables(nvariables, nhistory))
369 ALLOCATE (dft_control%qs_control%cdft_control%constraint%count(nhistory))
370 dft_control%qs_control%cdft_control%constraint%count = 0
371 ALLOCATE (dft_control%qs_control%cdft_control%constraint%gradient(nvariables, nhistory))
372 ALLOCATE (dft_control%qs_control%cdft_control%constraint%energy(nhistory))
373 CALL qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvariables)
374 END IF
375 ! Executed only on first call (OT settings active in scf_control)
376 ! Save OT settings and constraint initial values in CDFT control
377 ! Then switch to constraint outer_scf settings for proper initialization of history
378 IF (scf_control%outer_scf%have_scf) THEN
379 IF (scf_control%outer_scf%type == outer_scf_none) THEN
380 dft_control%qs_control%cdft_control%ot_control%have_scf = .true.
381 dft_control%qs_control%cdft_control%ot_control%max_scf = scf_control%outer_scf%max_scf
382 dft_control%qs_control%cdft_control%ot_control%eps_scf = scf_control%outer_scf%eps_scf
383 dft_control%qs_control%cdft_control%ot_control%step_size = scf_control%outer_scf%step_size
384 dft_control%qs_control%cdft_control%ot_control%type = scf_control%outer_scf%type
385 dft_control%qs_control%cdft_control%ot_control%optimizer = scf_control%outer_scf%optimizer
386 dft_control%qs_control%cdft_control%ot_control%diis_buffer_length = scf_control%outer_scf%diis_buffer_length
387 dft_control%qs_control%cdft_control%ot_control%bisect_trust_count = scf_control%outer_scf%bisect_trust_count
388 CALL cdft_opt_type_copy(dft_control%qs_control%cdft_control%ot_control%cdft_opt_control, &
389 scf_control%outer_scf%cdft_opt_control)
390 ! In case constraint and OT extrapolation orders are different, make sure to use former
391 nvariables = SIZE(dft_control%qs_control%cdft_control%target)
392 IF (scf_control%outer_scf%extrapolation_order /= &
393 dft_control%qs_control%cdft_control%constraint_control%extrapolation_order &
394 .OR. nvariables /= 1) THEN
395 DEALLOCATE (qs_env%outer_scf_history)
396 DEALLOCATE (qs_env%gradient_history)
397 DEALLOCATE (qs_env%variable_history)
398 nhistory = dft_control%qs_control%cdft_control%constraint_control%extrapolation_order
399 ALLOCATE (outer_scf_history(nvariables, nhistory))
400 ALLOCATE (gradient_history(nvariables, 2))
401 gradient_history = 0.0_dp
402 ALLOCATE (variable_history(nvariables, 2))
403 variable_history = 0.0_dp
404 CALL set_qs_env(qs_env, outer_scf_history=outer_scf_history, &
405 gradient_history=gradient_history, variable_history=variable_history)
406 END IF
407 CALL outer_loop_switch(scf_env, scf_control, dft_control%qs_control%cdft_control, ot2cdft)
408 END IF
409 END IF
410
411 END SUBROUTINE qs_scf_ensure_cdft_loop_vars
412
413! **************************************************************************************************
414!> \brief performs allocation of the mixing storage
415!> \param qs_env ...
416!> \param scf_env ...
417! **************************************************************************************************
418 SUBROUTINE qs_scf_ensure_mixing_store(qs_env, scf_env)
419 TYPE(qs_environment_type), POINTER :: qs_env
420 TYPE(qs_scf_env_type), POINTER :: scf_env
421
422 TYPE(dft_control_type), POINTER :: dft_control
423
424 NULLIFY (dft_control)
425 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
426
427 IF (scf_env%mixing_method > 0) THEN
428 CALL mixing_allocate(qs_env, scf_env%mixing_method, scf_env%p_mix_new, &
429 scf_env%p_delta, dft_control%nspins, &
430 scf_env%mixing_store)
431 ELSE
432 NULLIFY (scf_env%p_mix_new)
433 END IF
434
435 END SUBROUTINE qs_scf_ensure_mixing_store
436
437! **************************************************************************************************
438!> \brief Performs allocation of the SCF work matrices
439!> In case of kpoints we probably don't need most of these matrices,
440!> maybe we have to initialize some matrices in the fm_pool in kpoints
441!> \param qs_env ...
442!> \param scf_env ...
443! **************************************************************************************************
444 SUBROUTINE qs_scf_ensure_work_matrices(qs_env, scf_env)
445
446 TYPE(qs_environment_type), POINTER :: qs_env
447 TYPE(qs_scf_env_type), POINTER :: scf_env
448
449 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_scf_ensure_work_matrices'
450
451 INTEGER :: handle, is, nao, nrow_block, nw
452 LOGICAL :: do_kpoints
453 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
454 TYPE(cp_fm_struct_type), POINTER :: ao_ao_fmstruct, ao_mo_fmstruct
455 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
456 TYPE(dbcsr_type), POINTER :: ref_matrix
457 TYPE(dft_control_type), POINTER :: dft_control
458 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
459 TYPE(scf_control_type), POINTER :: scf_control
460
461 CALL timeset(routinen, handle)
462
463 NULLIFY (ao_mo_fm_pools, ao_mo_fmstruct, ao_ao_fmstruct, dft_control, matrix_s, mos)
464
465 CALL get_qs_env(qs_env=qs_env, &
466 dft_control=dft_control, &
467 matrix_s_kp=matrix_s, &
468 mos=mos, &
469 scf_control=scf_control, &
470 do_kpoints=do_kpoints)
471 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
472
473 ! create an ao_ao parallel matrix structure
474 ao_mo_fmstruct => fm_pool_get_el_struct(ao_mo_fm_pools(1)%pool)
475 CALL cp_fm_struct_get(ao_mo_fmstruct, nrow_block=nrow_block)
476 CALL get_mo_set(mos(1), nao=nao)
477 CALL cp_fm_struct_create(fmstruct=ao_ao_fmstruct, &
478 nrow_block=nrow_block, &
479 ncol_block=nrow_block, &
480 nrow_global=nao, &
481 ncol_global=nao, &
482 template_fmstruct=ao_mo_fmstruct)
483
484 IF ((scf_env%method /= ot_method_nr) .AND. &
485 (scf_env%method /= block_davidson_diag_method_nr)) THEN
486 IF (.NOT. ASSOCIATED(scf_env%scf_work1)) THEN
487 nw = dft_control%nspins
488 IF (do_kpoints) nw = 4
489 ALLOCATE (scf_env%scf_work1(nw))
490 DO is = 1, SIZE(scf_env%scf_work1)
491 CALL cp_fm_create(scf_env%scf_work1(is), &
492 matrix_struct=ao_ao_fmstruct, &
493 name="SCF-WORK_MATRIX-1-"//trim(adjustl(cp_to_string(is))))
494 END DO
495 END IF
496 IF ((.NOT. ASSOCIATED(scf_env%ortho)) .AND. &
497 (scf_env%method /= ot_diag_method_nr) .AND. &
498 (scf_env%method /= special_diag_method_nr)) THEN
499 ! Initialize fm matrix to store the Cholesky decomposition
500 ALLOCATE (scf_env%ortho)
501 CALL cp_fm_create(scf_env%ortho, &
502 matrix_struct=ao_ao_fmstruct, &
503 name="SCF-ORTHO_MATRIX")
504 ! Initialize dbcsr matrix to store the Cholesky decomposition
505 IF (scf_env%cholesky_method == cholesky_dbcsr) THEN
506 ref_matrix => matrix_s(1, 1)%matrix
507 CALL dbcsr_init_p(scf_env%ortho_dbcsr)
508 CALL dbcsr_create(scf_env%ortho_dbcsr, template=ref_matrix, &
509 matrix_type=dbcsr_type_no_symmetry)
510 CALL dbcsr_init_p(scf_env%buf1_dbcsr)
511 CALL dbcsr_create(scf_env%buf1_dbcsr, template=ref_matrix, &
512 matrix_type=dbcsr_type_no_symmetry)
513 CALL dbcsr_init_p(scf_env%buf2_dbcsr)
514 CALL dbcsr_create(scf_env%buf2_dbcsr, template=ref_matrix, &
515 matrix_type=dbcsr_type_no_symmetry)
516 ELSE IF (scf_env%cholesky_method == cholesky_inverse .OR. &
517 (scf_control%level_shift /= 0.0_dp .AND. &
518 scf_env%cholesky_method == cholesky_off)) THEN
519 ALLOCATE (scf_env%ortho_m1)
520 CALL cp_fm_create(scf_env%ortho_m1, &
521 matrix_struct=ao_ao_fmstruct, &
522 name="SCF-ORTHO_MATRIX-1")
523 END IF
524 END IF
525 IF (.NOT. ASSOCIATED(scf_env%scf_work2)) THEN
526 ALLOCATE (scf_env%scf_work2)
527 CALL cp_fm_create(scf_env%scf_work2, &
528 matrix_struct=ao_ao_fmstruct, &
529 name="SCF-WORK_MATRIX-2")
530 END IF
531 END IF
532
533 IF (dft_control%dft_plus_u) THEN
534 IF (dft_control%plus_u_method_id == plus_u_lowdin) THEN
535 IF (.NOT. ASSOCIATED(scf_env%s_half)) THEN
536 ALLOCATE (scf_env%s_half)
537 CALL cp_fm_create(scf_env%s_half, &
538 matrix_struct=ao_ao_fmstruct, &
539 name="S**(1/2) MATRIX")
540 END IF
541 END IF
542 END IF
543
544 IF (do_kpoints) THEN
545 IF (.NOT. ASSOCIATED(scf_env%scf_work1)) THEN
546 nw = 4
547 ALLOCATE (scf_env%scf_work1(nw))
548 DO is = 1, SIZE(scf_env%scf_work1)
549 CALL cp_fm_create(scf_env%scf_work1(is), &
550 matrix_struct=ao_ao_fmstruct, &
551 name="SCF-WORK_MATRIX-1-"//trim(adjustl(cp_to_string(is))))
552 END DO
553 END IF
554 END IF
555
556 CALL cp_fm_struct_release(ao_ao_fmstruct)
557
558 CALL timestop(handle)
559
560 END SUBROUTINE qs_scf_ensure_work_matrices
561
562! **************************************************************************************************
563!> \brief performs allocation of the MO matrices
564!> \param qs_env ...
565! **************************************************************************************************
566 SUBROUTINE qs_scf_ensure_mos(qs_env)
567 TYPE(qs_environment_type), POINTER :: qs_env
568
569 CHARACTER(len=*), PARAMETER :: routinen = 'qs_scf_ensure_mos'
570
571 INTEGER :: handle, ic, ik, ikk, ispin, nmo, nmo_mat
572 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
573 TYPE(cp_fm_type), POINTER :: mo_coeff, mo_coeff_last
574 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mo_derivs
575 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
576 TYPE(dbcsr_type), POINTER :: mo_coeff_b
577 TYPE(dft_control_type), POINTER :: dft_control
578 TYPE(kpoint_type), POINTER :: kpoints
579 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_last_converged
580 TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos_k
581 TYPE(xas_environment_type), POINTER :: xas_env
582
583 CALL timeset(routinen, handle)
584
585 NULLIFY (ao_mo_fm_pools, dft_control, mos, xas_env, matrix_s, mos_last_converged, mo_coeff_last)
586
587 CALL get_qs_env(qs_env=qs_env, &
588 dft_control=dft_control, &
589 mos=mos, &
590 matrix_s_kp=matrix_s, &
591 xas_env=xas_env)
592 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
593 IF (dft_control%switch_surf_dip) THEN
594 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
595 END IF
596
597 nmo_mat = dft_control%nspins
598 IF (dft_control%restricted) nmo_mat = 1 ! right now, there might be more mos than needed derivs
599
600 ! Finish initialization of the MOs
601 cpassert(ASSOCIATED(mos))
602 DO ispin = 1, SIZE(mos)
603 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
604 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
605 CALL init_mo_set(mos(ispin), &
606 fm_pool=ao_mo_fm_pools(ispin)%pool, &
607 name="qs_env%mo"//trim(adjustl(cp_to_string(ispin))))
608 END IF
609 IF (.NOT. ASSOCIATED(mo_coeff_b)) THEN
610 CALL cp_fm_get_info(mos(ispin)%mo_coeff, ncol_global=nmo)
611 CALL dbcsr_init_p(mos(ispin)%mo_coeff_b)
612 CALL cp_dbcsr_m_by_n_from_row_template(mos(ispin)%mo_coeff_b, template=matrix_s(1, 1)%matrix, n=nmo, &
613 sym=dbcsr_type_no_symmetry)
614 END IF
615 END DO
616 ! Get the mo_derivs OK if needed
617 IF (qs_env%requires_mo_derivs) THEN
618 CALL get_qs_env(qs_env, mo_derivs=mo_derivs)
619 IF (.NOT. ASSOCIATED(mo_derivs)) THEN
620 ALLOCATE (mo_derivs(nmo_mat))
621 DO ispin = 1, nmo_mat
622 CALL get_mo_set(mos(ispin), mo_coeff_b=mo_coeff_b)
623 NULLIFY (mo_derivs(ispin)%matrix)
624 CALL dbcsr_init_p(mo_derivs(ispin)%matrix)
625 CALL dbcsr_create(mo_derivs(ispin)%matrix, template=mo_coeff_b, &
626 name="mo_derivs", matrix_type=dbcsr_type_no_symmetry)
627 END DO
628 CALL set_qs_env(qs_env, mo_derivs=mo_derivs)
629 END IF
630
631 ELSE
632 ! nothing should be done
633 END IF
634
635 ! Finish initialization of the MOs for ADMM and derivs if needed ***
636 IF (dft_control%do_admm) THEN
637 IF (dft_control%restricted) cpabort("ROKS with ADMM is not implemented")
638 END IF
639
640 ! Finish initialization of mos_last_converged [SGh]
641 IF (dft_control%switch_surf_dip) THEN
642 cpassert(ASSOCIATED(mos_last_converged))
643 DO ispin = 1, SIZE(mos_last_converged)
644 CALL get_mo_set(mos_last_converged(ispin), mo_coeff=mo_coeff_last)
645 IF (.NOT. ASSOCIATED(mo_coeff_last)) THEN
646 CALL init_mo_set(mos_last_converged(ispin), &
647 fm_ref=mos(ispin)%mo_coeff, &
648 name="qs_env%mos_last_converged"//trim(adjustl(cp_to_string(ispin))))
649 END IF
650 END DO
651 END IF
652 ! kpoints: we have to initialize all the k-point MOs
653 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
654 IF (kpoints%nkp /= 0) THEN
655 ! check for some incompatible options
656 IF (qs_env%requires_mo_derivs) THEN
657 cpwarn("MO derivative methods flag has been switched off for kpoint calculation")
658 ! we switch it off to make band structure calculations
659 ! possible for OT gamma point calculations
660 qs_env%requires_mo_derivs = .false.
661 END IF
662 IF (dft_control%do_xas_calculation) &
663 cpabort("No XAS implemented with kpoints")
664 IF (qs_env%do_rixs) &
665 cpabort("RIXS not implemented with kpoints")
666 DO ik = 1, SIZE(kpoints%kp_env)
667 CALL mpools_get(kpoints%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
668 mos_k => kpoints%kp_env(ik)%kpoint_env%mos
669 ikk = kpoints%kp_range(1) + ik - 1
670 cpassert(ASSOCIATED(mos_k))
671 DO ispin = 1, SIZE(mos_k, 2)
672 DO ic = 1, SIZE(mos_k, 1)
673 CALL get_mo_set(mos_k(ic, ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
674 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
675 CALL init_mo_set(mos_k(ic, ispin), &
676 fm_pool=ao_mo_fm_pools(ispin)%pool, &
677 name="kpoints_"//trim(adjustl(cp_to_string(ikk)))// &
678 "%mo"//trim(adjustl(cp_to_string(ispin))))
679 END IF
680 ! no sparse matrix representation of kpoint MO vectors
681 cpassert(.NOT. ASSOCIATED(mo_coeff_b))
682 END DO
683 END DO
684 END DO
685 END IF
686
687 CALL timestop(handle)
688
689 END SUBROUTINE qs_scf_ensure_mos
690
691! **************************************************************************************************
692!> \brief sets flag for mixing/DIIS during scf
693!> \param scf_control ...
694!> \param scf_section ...
695!> \param scf_env ...
696!> \param dft_control ...
697! **************************************************************************************************
698 SUBROUTINE qs_scf_ensure_mixing(scf_control, scf_section, scf_env, dft_control)
699 TYPE(scf_control_type), POINTER :: scf_control
700 TYPE(section_vals_type), POINTER :: scf_section
701 TYPE(qs_scf_env_type), POINTER :: scf_env
702 TYPE(dft_control_type), POINTER :: dft_control
703
704 TYPE(section_vals_type), POINTER :: mixing_section
705
706 SELECT CASE (scf_control%mixing_method)
707 CASE (no_mix)
708 scf_env%mixing_method = no_mixing_nr
709 scf_env%p_mix_alpha = 1.0_dp
711 scf_env%mixing_method = scf_control%mixing_method
712 mixing_section => section_vals_get_subs_vals(scf_section, "MIXING")
713 IF (.NOT. ASSOCIATED(scf_env%mixing_store)) THEN
714 ALLOCATE (scf_env%mixing_store)
715 CALL mixing_storage_create(scf_env%mixing_store, mixing_section, scf_env%mixing_method, &
716 dft_control%qs_control%cutoff)
717 END IF
718 CASE DEFAULT
719 cpabort("Unknown mixing method")
720 END SELECT
721
722 ! Disable DIIS for OT and g-space density mixing methods
723 IF (scf_env%method == ot_method_nr) THEN
724 ! No mixing is used with OT
725 scf_env%mixing_method = no_mixing_nr
726 scf_env%p_mix_alpha = 1.0_dp
727 scf_env%skip_diis = .true.
728 END IF
729
730 IF (scf_control%use_diag .AND. scf_env%mixing_method == no_mixing_nr) THEN
731 cpabort("Diagonalization procedures without mixing are not recommendable")
732 END IF
733
734 IF (scf_env%mixing_method > direct_mixing_nr) THEN
735 scf_env%skip_diis = .true.
736 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
737 IF (scf_env%mixing_store%beta == 0.0_dp) THEN
738 cpabort("Mixing employing the Kerker damping factor needs BETA /= 0.0")
739 END IF
740 END IF
741
742 IF (scf_env%mixing_method == direct_mixing_nr) THEN
743 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
744 IF (scf_control%eps_diis < scf_control%eps_scf) THEN
745 scf_env%skip_diis = .true.
746 cpwarn("the DIIS scheme is disabled, since EPS_DIIS < EPS_SCF")
747 END IF
748 END IF
749
750 END SUBROUTINE qs_scf_ensure_mixing
751
752! **************************************************************************************************
753!> \brief sets flags for diagonalization and ensure that everything is
754!> allocated
755!> \param scf_env ...
756!> \param scf_section ...
757!> \param qs_env ...
758!> \param scf_control ...
759!> \param has_unit_metric ...
760! **************************************************************************************************
761 SUBROUTINE qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
762 scf_control, has_unit_metric)
763 TYPE(qs_scf_env_type), POINTER :: scf_env
764 TYPE(section_vals_type), POINTER :: scf_section
765 TYPE(qs_environment_type), POINTER :: qs_env
766 TYPE(scf_control_type), POINTER :: scf_control
767 LOGICAL :: has_unit_metric
768
769 INTEGER :: ispin, nao, nmo
770 LOGICAL :: do_kpoints, need_coeff_b, not_se_or_tb
771 TYPE(cp_fm_type), POINTER :: mo_coeff
772 TYPE(dft_control_type), POINTER :: dft_control
773 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
774
775 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints, dft_control=dft_control, mos=mos)
776 not_se_or_tb = .NOT. (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
777 dft_control%qs_control%semi_empirical)
778 need_coeff_b = .false.
779 scf_env%needs_ortho = .false.
780
781 IF (dft_control%smeagol_control%smeagol_enabled .AND. &
782 dft_control%smeagol_control%run_type == smeagol_runtype_emtransport) THEN
783 scf_env%method = smeagol_method_nr
784 scf_env%skip_diis = .true.
785 scf_control%use_diag = .false.
786
787 IF (.NOT. do_kpoints) THEN
788 cpabort("SMEAGOL requires kpoint calculations")
789 END IF
790 cpwarn_if(scf_control%use_ot, "OT is irrelevant to NEGF method")
791 END IF
792
793 IF (scf_control%use_diag) THEN
794 ! sanity check whether combinations are allowed
795 IF (dft_control%restricted) &
796 cpabort("OT only for restricted (ROKS)")
797 SELECT CASE (scf_control%diagonalization%method)
799 IF (.NOT. not_se_or_tb) &
800 cpabort("TB and SE not possible with OT diagonalization")
801 END SELECT
802 SELECT CASE (scf_control%diagonalization%method)
803 ! Diagonalization: additional check whether we are in an orthonormal basis
804 CASE (diag_standard)
805 scf_env%method = general_diag_method_nr
806 scf_env%needs_ortho = (.NOT. has_unit_metric) .AND. (.NOT. do_kpoints)
807 IF (diag_type == fm_diag_type_cusolver .AND. &
809 scf_control%level_shift == 0.0_dp .AND. &
810 scf_env%cholesky_method /= cholesky_off) THEN
811 scf_env%needs_ortho = .false.
812 END IF
813 IF (has_unit_metric) THEN
814 scf_env%method = special_diag_method_nr
815 END IF
816 ! OT Diagonalization: not possible with ROKS
817 CASE (diag_ot)
818 IF (dft_control%roks) &
819 cpabort("ROKS with OT diagonalization not possible")
820 IF (do_kpoints) &
821 cpabort("OT diagonalization not possible with kpoint calculations")
822 scf_env%method = ot_diag_method_nr
823 need_coeff_b = .true.
824 ! Block Krylov diagonlization: not possible with ROKS,
825 ! allocation of additional matrices is needed
826 CASE (diag_block_krylov)
827 IF (dft_control%roks) &
828 cpabort("ROKS with block PF diagonalization not possible")
829 IF (do_kpoints) &
830 cpabort("Block Krylov diagonalization not possible with kpoint calculations")
831 scf_env%method = block_krylov_diag_method_nr
832 scf_env%needs_ortho = .true.
833 IF (.NOT. ASSOCIATED(scf_env%krylov_space)) &
834 CALL krylov_space_create(scf_env%krylov_space, scf_section)
835 CALL krylov_space_allocate(scf_env%krylov_space, scf_control, mos)
836 ! Block davidson diagonlization: allocation of additional matrices is needed
838 IF (do_kpoints) &
839 cpabort("Block Davidson diagonalization not possible with kpoint calculations")
840 scf_env%method = block_davidson_diag_method_nr
841 IF (.NOT. ASSOCIATED(scf_env%block_davidson_env)) &
842 CALL block_davidson_env_create(scf_env%block_davidson_env, dft_control%nspins, &
843 scf_section)
844 DO ispin = 1, dft_control%nspins
845 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
846 CALL block_davidson_allocate(scf_env%block_davidson_env(ispin), mo_coeff, nao, nmo)
847 END DO
848 need_coeff_b = .true.
849 ! Filter matrix diagonalisation method
850 CASE (diag_filter_matrix)
851 scf_env%method = filter_matrix_diag_method_nr
852 IF (.NOT. fb_env_has_data(scf_env%filter_matrix_env)) THEN
853 CALL fb_env_create(scf_env%filter_matrix_env)
854 END IF
855 CALL fb_env_read_input(scf_env%filter_matrix_env, scf_section)
856 CALL fb_env_build_rcut_auto(scf_env%filter_matrix_env, qs_env)
857 CALL fb_env_write_info(scf_env%filter_matrix_env, qs_env, scf_section)
858 CALL fb_distribution_build(scf_env%filter_matrix_env, qs_env, scf_section)
859 CALL fb_env_build_atomic_halos(scf_env%filter_matrix_env, qs_env, scf_section)
860 CASE DEFAULT
861 cpabort("Unknown diagonalization method")
862 END SELECT
863 ! Check if subspace diagonlization is requested: allocation of additional matrices is needed
864 IF (scf_control%do_diag_sub) THEN
865 scf_env%needs_ortho = .true.
866 IF (.NOT. ASSOCIATED(scf_env%subspace_env)) &
867 CALL diag_subspace_env_create(scf_env%subspace_env, scf_section, &
868 dft_control%qs_control%cutoff)
869 CALL diag_subspace_allocate(scf_env%subspace_env, qs_env, mos)
870 IF (do_kpoints) &
871 cpabort("No subspace diagonlization with kpoint calculation")
872 END IF
873 ! OT: check if OT is used instead of diagonalization. Not possible with added MOS at the moment
874 ELSEIF (scf_control%use_ot) THEN
875 scf_env%method = ot_method_nr
876 need_coeff_b = .true.
877 IF (sum(abs(scf_control%added_mos)) > 0) &
878 cpabort("OT with ADDED_MOS/=0 not implemented")
879 IF (dft_control%restricted .AND. dft_control%nspins /= 2) &
880 cpabort("nspin must be 2 for restricted (ROKS)")
881 IF (do_kpoints) &
882 cpabort("OT not possible with kpoint calculations")
883 ELSEIF (scf_env%method /= smeagol_method_nr) THEN
884 cpabort("OT or DIAGONALIZATION have to be set")
885 END IF
886 DO ispin = 1, dft_control%nspins
887 mos(ispin)%use_mo_coeff_b = need_coeff_b
888 END DO
889
890 END SUBROUTINE qs_scf_ensure_diagonalization
891
892! **************************************************************************************************
893!> \brief performs those initialisations that need to be done only once
894!> (e.g. that only depend on the atomic positions)
895!> this will be called in scf
896!> \param scf_env ...
897!> \param qs_env ...
898!> \param scf_section ...
899!> \param scf_control ...
900!> \par History
901!> 03.2006 created [Joost VandeVondele]
902! **************************************************************************************************
903 SUBROUTINE init_scf_run(scf_env, qs_env, scf_section, scf_control)
904
905 TYPE(qs_scf_env_type), POINTER :: scf_env
906 TYPE(qs_environment_type), POINTER :: qs_env
907 TYPE(section_vals_type), POINTER :: scf_section
908 TYPE(scf_control_type), POINTER :: scf_control
909
910 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_scf_run'
911
912 INTEGER :: after, handle, homo, ii, ikind, ispin, &
913 iw, nao, ndep, needed_evals, nmo, &
914 output_unit
915 LOGICAL :: dft_plus_u_atom, do_kpoints, &
916 init_u_ramping_each_scf, omit_headers, &
917 s_minus_half_available
918 REAL(kind=dp) :: u_ramping
919 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals
920 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues
921 TYPE(cp_fm_struct_type), POINTER :: fm_struct
922 TYPE(cp_fm_type) :: evecs, fm_w
923 TYPE(cp_fm_type), POINTER :: mo_coeff
924 TYPE(cp_logger_type), POINTER :: logger
925 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
926 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp
927 TYPE(dft_control_type), POINTER :: dft_control
928 TYPE(kpoint_type), POINTER :: kpoints
929 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
930 TYPE(mp_para_env_type), POINTER :: para_env
931 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
932 TYPE(qs_kind_type), POINTER :: qs_kind
933 TYPE(qs_rho_type), POINTER :: rho
934 TYPE(xas_environment_type), POINTER :: xas_env
935
936 CALL timeset(routinen, handle)
937
938 NULLIFY (qs_kind_set, matrix_s, dft_control, mos, qs_kind, rho, xas_env, mo_coeff)
939
940 logger => cp_get_default_logger()
941
942 cpassert(ASSOCIATED(scf_env))
943 cpassert(ASSOCIATED(qs_env))
944 NULLIFY (para_env)
945
946 s_minus_half_available = .false.
947 CALL get_qs_env(qs_env, &
948 dft_control=dft_control, &
949 qs_kind_set=qs_kind_set, &
950 mos=mos, &
951 rho=rho, &
952 nelectron_total=scf_env%nelectron, &
953 do_kpoints=do_kpoints, &
954 para_env=para_env, &
955 xas_env=xas_env)
956
957 !Check restricted optimizers available for tblite library
958 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
959 IF (dft_control%lsd) THEN
960 cpabort("LSD option not compatible with tblite library.")
961 END IF
962 IF (scf_env%method == ot_method_nr) THEN
963 cpabort("OT SCF option not compatible with tblite library.")
964 END IF
965 END IF
966
967 ! Calculate ortho matrix
968 ndep = 0
969 IF (scf_env%needs_ortho) THEN
970 CALL get_qs_env(qs_env, matrix_s=matrix_s)
971 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, scf_env%ortho)
972 IF (scf_env%cholesky_method > cholesky_off) THEN
973 CALL cp_fm_cholesky_decompose(scf_env%ortho)
974 IF (scf_env%cholesky_method == cholesky_dbcsr) THEN
975 CALL cp_fm_triangular_invert(scf_env%ortho)
976 CALL cp_fm_set_all(scf_env%scf_work2, 0.0_dp)
977 CALL cp_fm_to_fm_triangular(scf_env%ortho, scf_env%scf_work2, "U")
978 CALL copy_fm_to_dbcsr(scf_env%scf_work2, scf_env%ortho_dbcsr)
979 ELSE IF (scf_env%cholesky_method == cholesky_inverse) THEN
980 CALL cp_fm_to_fm(scf_env%ortho, scf_env%ortho_m1)
981 CALL cp_fm_triangular_invert(scf_env%ortho_m1)
982 END IF
983 ELSE
984 CALL cp_fm_get_info(scf_env%ortho, ncol_global=nao)
985 ALLOCATE (evals(nao))
986 evals = 0
987
988 CALL cp_fm_create(evecs, scf_env%ortho%matrix_struct)
989
990 ! Perform an EVD
991 CALL choose_eigv_solver(scf_env%ortho, evecs, evals)
992
993 ! Determine the number of neglectable eigenvalues assuming that the eigenvalues are in ascending order
994 ! (Required by Lapack)
995 ndep = 0
996 DO ii = 1, nao
997 IF (evals(ii) > scf_control%eps_eigval) THEN
998 ndep = ii - 1
999 EXIT
1000 END IF
1001 END DO
1002 needed_evals = nao - ndep
1003
1004 ! Set the eigenvalue of the eigenvectors belonging to the linear subspace to zero
1005 evals(1:ndep) = 0.0_dp
1006 ! Determine the eigenvalues of the inverse square root
1007 evals(ndep + 1:nao) = 1.0_dp/sqrt(evals(ndep + 1:nao))
1008
1009 ! Create reduced matrices
1010 NULLIFY (fm_struct)
1011 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1012 nrow_global=nao, ncol_global=needed_evals)
1013
1014 ALLOCATE (scf_env%ortho_red, scf_env%scf_work2_red)
1015 CALL cp_fm_create(scf_env%ortho_red, fm_struct)
1016 CALL cp_fm_create(scf_env%scf_work2_red, fm_struct)
1017 CALL cp_fm_struct_release(fm_struct)
1018
1019 IF (scf_control%level_shift /= 0.0_dp) THEN
1020 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1021 nrow_global=needed_evals, ncol_global=nao)
1022
1023 ALLOCATE (scf_env%ortho_m1_red)
1024 CALL cp_fm_create(scf_env%ortho_m1_red, fm_struct)
1025 CALL cp_fm_struct_release(fm_struct)
1026 END IF
1027
1028 ALLOCATE (scf_env%scf_work1_red(SIZE(scf_env%scf_work1)))
1029 DO ispin = 1, SIZE(scf_env%scf_work1)
1030 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1031 nrow_global=needed_evals, ncol_global=needed_evals)
1032 CALL cp_fm_create(scf_env%scf_work1_red(ispin), fm_struct)
1033 CALL cp_fm_struct_release(fm_struct)
1034 END DO
1035
1036 ! Scale the eigenvalues and copy them to
1037 CALL cp_fm_to_fm(evecs, scf_env%ortho_red, needed_evals, ndep + 1, 1)
1038
1039 IF (scf_control%level_shift /= 0.0_dp) THEN
1040 CALL cp_fm_transpose(scf_env%ortho_red, scf_env%ortho_m1_red)
1041 END IF
1042
1043 CALL cp_fm_column_scale(scf_env%ortho_red, evals(ndep + 1:))
1044
1045 ! Copy the linear dependent columns to the MO sets and set their orbital energies
1046 ! to a very large value to reduce the probability of occupying them
1047 DO ispin = 1, SIZE(mos)
1048 CALL get_mo_set(mos(ispin), nmo=nmo, mo_coeff=mo_coeff, homo=homo, eigenvalues=eigenvalues)
1049 IF (needed_evals < nmo) THEN
1050 IF (needed_evals < homo) THEN
1051 CALL cp_abort(__location__, &
1052 "The numerical rank of the overlap matrix is lower than the "// &
1053 "number of orbitals to be occupied! Check the geometry or increase "// &
1054 "EPS_DEFAULT or EPS_PGF_ORB!")
1055 END IF
1056 CALL cp_warn(__location__, &
1057 "The numerical rank of the overlap matrix is lower than the number of requested MOs! "// &
1058 "Reduce the number of MOs to the number of available MOs. If necessary, "// &
1059 "request a lower number of MOs or increase EPS_DEFAULT or EPS_PGF_ORB.")
1060 CALL set_mo_set(mos(ispin), nmo=needed_evals)
1061 END IF
1062 ! Copy the last columns to mo_coeff if the container is large enough
1063 CALL cp_fm_to_fm(evecs, mo_coeff, min(ndep, max(0, nmo - needed_evals)), 1, needed_evals + 1)
1064 ! Set the corresponding eigenvalues to a large value
1065 ! This prevents their occupation but still keeps the information on them
1066 eigenvalues(needed_evals + 1:min(nao, nmo)) = 1.0_dp/scf_control%eps_eigval
1067 END DO
1068
1069 ! Obtain ortho from (P)DGEMM, skip the linear dependent columns
1070 CALL parallel_gemm("N", "T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_red, evecs, &
1071 0.0_dp, scf_env%ortho, b_first_col=ndep + 1)
1072
1073 IF (scf_control%level_shift /= 0.0_dp) THEN
1074 ! We need SQRT(evals) of the eigenvalues of H, so 1/SQRT(evals) of ortho_red
1075 evals(ndep + 1:nao) = 1.0_dp/evals(ndep + 1:nao)
1076 CALL cp_fm_row_scale(scf_env%ortho_m1_red, evals(ndep + 1:))
1077
1078 CALL parallel_gemm("T", "T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_m1_red, evecs, &
1079 0.0_dp, scf_env%ortho_m1, b_first_col=ndep + 1)
1080 END IF
1081
1082 CALL cp_fm_release(evecs)
1083
1084 s_minus_half_available = .true.
1085 END IF
1086
1087 IF (btest(cp_print_key_should_output(logger%iter_info, &
1088 qs_env%input, "DFT%PRINT%AO_MATRICES/ORTHO"), cp_p_file)) THEN
1089 iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/ORTHO", &
1090 extension=".Log")
1091 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
1092 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
1093 after = min(max(after, 1), 16)
1094 CALL write_fm_with_basis_info(scf_env%ortho, 4, after, qs_env, &
1095 para_env, output_unit=iw, omit_headers=omit_headers)
1096 CALL cp_print_key_finished_output(iw, logger, qs_env%input, &
1097 "DFT%PRINT%AO_MATRICES/ORTHO")
1098 END IF
1099 END IF
1100
1101 CALL get_mo_set(mo_set=mos(1), nao=nao)
1102
1103 ! DFT+U methods based on Lowdin charges need S^(1/2)
1104 IF (dft_control%dft_plus_u) THEN
1105 IF (dft_control%plus_u_method_id == plus_u_lowdin) THEN
1106 IF (do_kpoints) THEN
1107 CALL get_qs_env(qs_env, kpoints=kpoints, matrix_s_kp=matrix_s_kp)
1108 CALL diag_kp_smat(matrix_s_kp, kpoints, scf_env%scf_work1)
1109 ELSE
1110 CALL get_qs_env(qs_env, matrix_s=matrix_s)
1111 IF (s_minus_half_available) THEN
1112 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, scf_env%ortho, &
1113 scf_env%s_half, nao)
1114 ELSE
1115 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, scf_env%s_half)
1116 CALL cp_fm_create(fm_w, scf_env%s_half%matrix_struct)
1117 CALL cp_fm_power(scf_env%s_half, fm_w, 0.5_dp, scf_control%eps_eigval, ndep)
1118 CALL cp_fm_release(fm_w)
1119 END IF
1120 END IF
1121 END IF
1122 DO ikind = 1, SIZE(qs_kind_set)
1123 qs_kind => qs_kind_set(ikind)
1124 CALL get_qs_kind(qs_kind=qs_kind, &
1125 dft_plus_u_atom=dft_plus_u_atom, &
1126 u_ramping=u_ramping, &
1127 init_u_ramping_each_scf=init_u_ramping_each_scf)
1128 IF (dft_plus_u_atom .AND. (u_ramping /= 0.0_dp)) THEN
1129 IF (init_u_ramping_each_scf) THEN
1130 CALL set_qs_kind(qs_kind=qs_kind, u_minus_j=0.0_dp)
1131 END IF
1132 END IF
1133 END DO
1134 END IF
1135
1136 ! extrapolate outer loop variables
1137 IF (scf_control%outer_scf%have_scf) THEN
1138 CALL outer_loop_extrapolate(qs_env)
1139 END IF
1140
1141 ! initializes rho and the mos
1142 IF (ASSOCIATED(qs_env%xas_env)) THEN
1143 ! if just optimized wfn, e.g. ground state
1144 ! changes come from a perturbation, e.g., the occupation numbers
1145 ! it could be generalized for other cases, at the moment used only for core level spectroscopy
1146 ! initialize the density with the localized mos
1147 CALL xas_initialize_rho(qs_env, scf_env, scf_control)
1148 ELSE
1149 CALL scf_env_initial_rho_setup(scf_env, qs_env=qs_env, &
1150 scf_section=scf_section, scf_control=scf_control)
1151 END IF
1152
1153 ! Frozen density approximation
1154 IF (ASSOCIATED(qs_env%wf_history)) THEN
1155 IF (qs_env%wf_history%interpolation_method_nr == wfi_frozen_method_nr) THEN
1156 IF (.NOT. ASSOCIATED(qs_env%wf_history%past_states(1)%snapshot)) THEN
1157 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
1158 ALLOCATE (qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1159 CALL qs_rho_create(qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1160 CALL duplicate_rho_type(rho_input=rho, &
1161 rho_output=qs_env%wf_history%past_states(1)%snapshot%rho_frozen, &
1162 qs_env=qs_env)
1163 END IF
1164 END IF
1165 END IF
1166
1167 !image charge method, calculate image_matrix if required
1168 IF (qs_env%qmmm) THEN
1169 IF (qs_env%qmmm .AND. qs_env%qmmm_env_qm%image_charge) THEN
1170 CALL conditional_calc_image_matrix(qs_env=qs_env, &
1171 qmmm_env=qs_env%qmmm_env_qm)
1172 END IF
1173 END IF
1174
1175 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1176 extension=".scfLog")
1177 CALL qs_scf_initial_info(output_unit, mos, dft_control, ndep)
1178 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1179 "PRINT%PROGRAM_RUN_INFO")
1180
1181 CALL timestop(handle)
1182
1183 END SUBROUTINE init_scf_run
1184
1185! **************************************************************************************************
1186!> \brief Initializes rho and the mos, so that an scf cycle can start
1187!> \param scf_env the scf env in which to do the scf
1188!> \param qs_env the qs env the scf_env lives in
1189!> \param scf_section ...
1190!> \param scf_control ...
1191!> \par History
1192!> 02.2003 created [fawzi]
1193!> \author fawzi
1194! **************************************************************************************************
1195 SUBROUTINE scf_env_initial_rho_setup(scf_env, qs_env, scf_section, scf_control)
1196 TYPE(qs_scf_env_type), POINTER :: scf_env
1197 TYPE(qs_environment_type), POINTER :: qs_env
1198 TYPE(section_vals_type), POINTER :: scf_section
1199 TYPE(scf_control_type), POINTER :: scf_control
1200
1201 CHARACTER(len=*), PARAMETER :: routinen = 'scf_env_initial_rho_setup'
1202
1203 INTEGER :: extrapolation_method_nr, handle, ispin, &
1204 nmo, output_unit
1205 LOGICAL :: do_harris, orthogonal_wf
1206 TYPE(cp_fm_type), POINTER :: mo_coeff
1207 TYPE(cp_logger_type), POINTER :: logger
1208 TYPE(dft_control_type), POINTER :: dft_control
1209 TYPE(harris_type), POINTER :: harris_env
1210 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1211 TYPE(mp_para_env_type), POINTER :: para_env
1212 TYPE(qs_rho_type), POINTER :: rho
1213 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom
1214
1215 CALL timeset(routinen, handle)
1216 NULLIFY (mo_coeff, rho, dft_control, para_env, mos)
1217 logger => cp_get_default_logger()
1218 cpassert(ASSOCIATED(scf_env))
1219 cpassert(ASSOCIATED(qs_env))
1220
1221 CALL get_qs_env(qs_env, &
1222 rho=rho, &
1223 mos=mos, &
1224 dft_control=dft_control, &
1225 para_env=para_env)
1226
1227 do_harris = qs_env%harris_method
1228
1229 extrapolation_method_nr = wfi_use_guess_method_nr
1230 IF (ASSOCIATED(qs_env%wf_history)) THEN
1231 CALL wfi_extrapolate(qs_env%wf_history, &
1232 qs_env=qs_env, dt=1.0_dp, &
1233 extrapolation_method_nr=extrapolation_method_nr, &
1234 orthogonal_wf=orthogonal_wf)
1235 ! wfi_use_guess_method_nr the wavefunctions are not yet initialized
1236 IF ((.NOT. orthogonal_wf) .AND. &
1237 (scf_env%method == ot_method_nr) .AND. &
1238 (.NOT. (extrapolation_method_nr == wfi_use_guess_method_nr))) THEN
1239 DO ispin = 1, SIZE(mos)
1240 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1241 CALL reorthogonalize_vectors(qs_env, v_matrix=mo_coeff, n_col=nmo)
1242 IF (dft_control%hairy_probes .EQV. .true.) THEN
1243 scf_control%smear%do_smear = .false.
1244 CALL set_mo_occupation(mo_set=mos(ispin), &
1245 smear=scf_control%smear, probe=dft_control%probe)
1246 ELSE
1247 CALL set_mo_occupation(mo_set=mos(ispin), &
1248 smear=scf_control%smear)
1249 END IF
1250 END DO
1251 END IF
1252 END IF
1253
1254 IF (.NOT. do_harris) THEN
1255 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1256 extension=".scfLog")
1257 IF (output_unit > 0) THEN
1258 WRITE (unit=output_unit, fmt="(/,T2,A,I0)") &
1259 "Extrapolation method: "// &
1260 trim(wfi_get_method_label(extrapolation_method_nr))
1261 IF (extrapolation_method_nr == wfi_ps_method_nr) THEN
1262 WRITE (unit=output_unit, fmt="(T2,A,I0,A)") &
1263 "Extrapolation order: ", &
1264 max((min(qs_env%wf_history%memory_depth, qs_env%wf_history%snapshot_count) - 1), 0)
1265 END IF
1266 END IF
1267 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1268 "PRINT%PROGRAM_RUN_INFO")
1269 END IF
1270
1271 IF (do_harris) THEN
1272 CALL get_qs_env(qs_env, harris_env=harris_env)
1273 CALL harris_density_update(qs_env, harris_env)
1274 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1275 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1276 ELSE IF (extrapolation_method_nr == wfi_use_guess_method_nr) THEN
1277 CALL calculate_first_density_matrix(scf_env=scf_env, qs_env=qs_env)
1278 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1279 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1280 END IF
1281
1282 ! Some preparation for the mixing
1283 IF (scf_env%mixing_method > 1) THEN
1284 IF (dft_control%qs_control%gapw) THEN
1285 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
1286 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1287 para_env, rho_atom=rho_atom)
1288 ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
1289 CALL charge_mixing_init(scf_env%mixing_store)
1290 ELSEIF (dft_control%qs_control%semi_empirical) THEN
1291 cpabort('SE Code not possible')
1292 ELSE
1293 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1294 para_env)
1295 END IF
1296 END IF
1297
1298 DO ispin = 1, SIZE(mos) !fm->dbcsr
1299 IF (mos(ispin)%use_mo_coeff_b) THEN
1300 CALL copy_fm_to_dbcsr(mos(ispin)%mo_coeff, &
1301 mos(ispin)%mo_coeff_b) !fm->dbcsr
1302 END IF
1303 END DO !fm->dbcsr
1304
1305 CALL timestop(handle)
1306
1307 END SUBROUTINE scf_env_initial_rho_setup
1308
1309END MODULE qs_scf_initialization
Define the atomic kind types and their sub types.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_init_p(matrix)
...
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.
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_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
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:102
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:239
integer, save, public diag_type
Definition cp_fm_diag.F:87
logical, save, public cusolver_generalized
Definition cp_fm_diag.F:96
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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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_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...
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)
...
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...
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 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 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 diag_filter_matrix
integer, parameter, public multisec_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 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.
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_allocate(bdav_env, mo_coeff, nao, nmo)
...
subroutine, public block_davidson_env_create(bdav_env, nspins, scf_section)
...
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, 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 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, 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, 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, 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_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)
elemental subroutine, public charge_mixing_init(mixing_store)
initialiation needed when charge mixing is used
subroutine, public mixing_init(mixing_method, rho, mixing_store, para_env, rho_atom)
initialiation needed when gspace mixing is used
subroutine, public mixing_allocate(qs_env, mixing_method, p_mix_new, p_delta, nspins, mixing_store)
allocation needed when density mixing is used
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 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.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
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_subspace_allocate(subspace_env, qs_env, mos)
...
subroutine, public diag_kp_smat(matrix_s, kpoints, fmwork)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
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_space_allocate(krylov_space, scf_control, 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 krylov_space_create(krylov_space, scf_section)
creates krylov space
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
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.