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