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