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