(git:e5b1968)
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 DO ik = 1, SIZE(kpoints%kp_env)
664 CALL mpools_get(kpoints%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
665 mos_k => kpoints%kp_env(ik)%kpoint_env%mos
666 ikk = kpoints%kp_range(1) + ik - 1
667 cpassert(ASSOCIATED(mos_k))
668 DO ispin = 1, SIZE(mos_k, 2)
669 DO ic = 1, SIZE(mos_k, 1)
670 CALL get_mo_set(mos_k(ic, ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
671 IF (.NOT. ASSOCIATED(mo_coeff)) THEN
672 CALL init_mo_set(mos_k(ic, ispin), &
673 fm_pool=ao_mo_fm_pools(ispin)%pool, &
674 name="kpoints_"//trim(adjustl(cp_to_string(ikk)))// &
675 "%mo"//trim(adjustl(cp_to_string(ispin))))
676 END IF
677 ! no sparse matrix representation of kpoint MO vectors
678 cpassert(.NOT. ASSOCIATED(mo_coeff_b))
679 END DO
680 END DO
681 END DO
682 END IF
683
684 CALL timestop(handle)
685
686 END SUBROUTINE qs_scf_ensure_mos
687
688! **************************************************************************************************
689!> \brief sets flag for mixing/DIIS during scf
690!> \param scf_control ...
691!> \param scf_section ...
692!> \param scf_env ...
693!> \param dft_control ...
694! **************************************************************************************************
695 SUBROUTINE qs_scf_ensure_mixing(scf_control, scf_section, scf_env, dft_control)
696 TYPE(scf_control_type), POINTER :: scf_control
697 TYPE(section_vals_type), POINTER :: scf_section
698 TYPE(qs_scf_env_type), POINTER :: scf_env
699 TYPE(dft_control_type), POINTER :: dft_control
700
701 TYPE(section_vals_type), POINTER :: mixing_section
702
703 SELECT CASE (scf_control%mixing_method)
704 CASE (no_mix)
705 scf_env%mixing_method = no_mixing_nr
706 scf_env%p_mix_alpha = 1.0_dp
708 scf_env%mixing_method = scf_control%mixing_method
709 mixing_section => section_vals_get_subs_vals(scf_section, "MIXING")
710 IF (.NOT. ASSOCIATED(scf_env%mixing_store)) THEN
711 ALLOCATE (scf_env%mixing_store)
712 CALL mixing_storage_create(scf_env%mixing_store, mixing_section, scf_env%mixing_method, &
713 dft_control%qs_control%cutoff)
714 END IF
715 CASE DEFAULT
716 cpabort("Unknown mixing method")
717 END SELECT
718
719 ! Disable DIIS for OT and g-space density mixing methods
720 IF (scf_env%method == ot_method_nr) THEN
721 ! No mixing is used with OT
722 scf_env%mixing_method = no_mixing_nr
723 scf_env%p_mix_alpha = 1.0_dp
724 scf_env%skip_diis = .true.
725 END IF
726
727 IF (scf_control%use_diag .AND. scf_env%mixing_method == no_mixing_nr) THEN
728 cpabort("Diagonalization procedures without mixing are not recommendable")
729 END IF
730
731 IF (scf_env%mixing_method > direct_mixing_nr) THEN
732 scf_env%skip_diis = .true.
733 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
734 IF (scf_env%mixing_store%beta == 0.0_dp) THEN
735 cpabort("Mixing employing the Kerker damping factor needs BETA /= 0.0")
736 END IF
737 END IF
738
739 IF (scf_env%mixing_method == direct_mixing_nr) THEN
740 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
741 IF (scf_control%eps_diis < scf_control%eps_scf) THEN
742 scf_env%skip_diis = .true.
743 cpwarn("the DIIS scheme is disabled, since EPS_DIIS < EPS_SCF")
744 END IF
745 END IF
746
747 END SUBROUTINE qs_scf_ensure_mixing
748
749! **************************************************************************************************
750!> \brief sets flags for diagonalization and ensure that everything is
751!> allocated
752!> \param scf_env ...
753!> \param scf_section ...
754!> \param qs_env ...
755!> \param scf_control ...
756!> \param has_unit_metric ...
757! **************************************************************************************************
758 SUBROUTINE qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
759 scf_control, has_unit_metric)
760 TYPE(qs_scf_env_type), POINTER :: scf_env
761 TYPE(section_vals_type), POINTER :: scf_section
762 TYPE(qs_environment_type), POINTER :: qs_env
763 TYPE(scf_control_type), POINTER :: scf_control
764 LOGICAL :: has_unit_metric
765
766 INTEGER :: ispin, nao, nmo
767 LOGICAL :: do_kpoints, need_coeff_b, not_se_or_tb
768 TYPE(cp_fm_type), POINTER :: mo_coeff
769 TYPE(dft_control_type), POINTER :: dft_control
770 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
771
772 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints, dft_control=dft_control, mos=mos)
773 not_se_or_tb = .NOT. (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
774 dft_control%qs_control%semi_empirical)
775 need_coeff_b = .false.
776 scf_env%needs_ortho = .false.
777
778 IF (dft_control%smeagol_control%smeagol_enabled .AND. &
779 dft_control%smeagol_control%run_type == smeagol_runtype_emtransport) THEN
780 scf_env%method = smeagol_method_nr
781 scf_env%skip_diis = .true.
782 scf_control%use_diag = .false.
783
784 IF (.NOT. do_kpoints) THEN
785 cpabort("SMEAGOL requires kpoint calculations")
786 END IF
787 cpwarn_if(scf_control%use_ot, "OT is irrelevant to NEGF method")
788 END IF
789
790 IF (scf_control%use_diag) THEN
791 ! sanity check whether combinations are allowed
792 IF (dft_control%restricted) &
793 cpabort("OT only for restricted (ROKS)")
794 SELECT CASE (scf_control%diagonalization%method)
796 IF (.NOT. not_se_or_tb) &
797 cpabort("TB and SE not possible with OT diagonalization")
798 END SELECT
799 SELECT CASE (scf_control%diagonalization%method)
800 ! Diagonalization: additional check whether we are in an orthonormal basis
801 CASE (diag_standard)
802 scf_env%method = general_diag_method_nr
803 scf_env%needs_ortho = (.NOT. has_unit_metric) .AND. (.NOT. do_kpoints)
804 IF (has_unit_metric) THEN
805 scf_env%method = special_diag_method_nr
806 END IF
807 ! OT Diagonalization: not possible with ROKS
808 CASE (diag_ot)
809 IF (dft_control%roks) &
810 cpabort("ROKS with OT diagonalization not possible")
811 IF (do_kpoints) &
812 cpabort("OT diagonalization not possible with kpoint calculations")
813 scf_env%method = ot_diag_method_nr
814 need_coeff_b = .true.
815 ! Block Krylov diagonlization: not possible with ROKS,
816 ! allocation of additional matrices is needed
817 CASE (diag_block_krylov)
818 IF (dft_control%roks) &
819 cpabort("ROKS with block PF diagonalization not possible")
820 IF (do_kpoints) &
821 cpabort("Block Krylov diagonalization not possible with kpoint calculations")
822 scf_env%method = block_krylov_diag_method_nr
823 scf_env%needs_ortho = .true.
824 IF (.NOT. ASSOCIATED(scf_env%krylov_space)) &
825 CALL krylov_space_create(scf_env%krylov_space, scf_section)
826 CALL krylov_space_allocate(scf_env%krylov_space, scf_control, mos)
827 ! Block davidson diagonlization: allocation of additional matrices is needed
829 IF (do_kpoints) &
830 cpabort("Block Davidson diagonalization not possible with kpoint calculations")
831 scf_env%method = block_davidson_diag_method_nr
832 IF (.NOT. ASSOCIATED(scf_env%block_davidson_env)) &
833 CALL block_davidson_env_create(scf_env%block_davidson_env, dft_control%nspins, &
834 scf_section)
835 DO ispin = 1, dft_control%nspins
836 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
837 CALL block_davidson_allocate(scf_env%block_davidson_env(ispin), mo_coeff, nao, nmo)
838 END DO
839 need_coeff_b = .true.
840 ! Filter matrix diagonalisation method
841 CASE (diag_filter_matrix)
842 scf_env%method = filter_matrix_diag_method_nr
843 IF (.NOT. fb_env_has_data(scf_env%filter_matrix_env)) THEN
844 CALL fb_env_create(scf_env%filter_matrix_env)
845 END IF
846 CALL fb_env_read_input(scf_env%filter_matrix_env, scf_section)
847 CALL fb_env_build_rcut_auto(scf_env%filter_matrix_env, qs_env)
848 CALL fb_env_write_info(scf_env%filter_matrix_env, qs_env, scf_section)
849 CALL fb_distribution_build(scf_env%filter_matrix_env, qs_env, scf_section)
850 CALL fb_env_build_atomic_halos(scf_env%filter_matrix_env, qs_env, scf_section)
851 CASE DEFAULT
852 cpabort("Unknown diagonalization method")
853 END SELECT
854 ! Check if subspace diagonlization is requested: allocation of additional matrices is needed
855 IF (scf_control%do_diag_sub) THEN
856 scf_env%needs_ortho = .true.
857 IF (.NOT. ASSOCIATED(scf_env%subspace_env)) &
858 CALL diag_subspace_env_create(scf_env%subspace_env, scf_section, &
859 dft_control%qs_control%cutoff)
860 CALL diag_subspace_allocate(scf_env%subspace_env, qs_env, mos)
861 IF (do_kpoints) &
862 cpabort("No subspace diagonlization with kpoint calculation")
863 END IF
864 ! OT: check if OT is used instead of diagonlization. Not possible with added MOS at the moment
865 ELSEIF (scf_control%use_ot) THEN
866 scf_env%method = ot_method_nr
867 need_coeff_b = .true.
868 IF (sum(abs(scf_control%added_mos)) > 0) &
869 cpabort("OT with ADDED_MOS/=0 not implemented")
870 IF (dft_control%restricted .AND. dft_control%nspins .NE. 2) &
871 cpabort("nspin must be 2 for restricted (ROKS)")
872 IF (do_kpoints) &
873 cpabort("OT not possible with kpoint calculations")
874 ELSEIF (scf_env%method /= smeagol_method_nr) THEN
875 cpabort("OT or DIAGONALIZATION have to be set")
876 END IF
877 DO ispin = 1, dft_control%nspins
878 mos(ispin)%use_mo_coeff_b = need_coeff_b
879 END DO
880
881 END SUBROUTINE qs_scf_ensure_diagonalization
882
883! **************************************************************************************************
884!> \brief performs those initialisations that need to be done only once
885!> (e.g. that only depend on the atomic positions)
886!> this will be called in scf
887!> \param scf_env ...
888!> \param qs_env ...
889!> \param scf_section ...
890!> \param scf_control ...
891!> \par History
892!> 03.2006 created [Joost VandeVondele]
893! **************************************************************************************************
894 SUBROUTINE init_scf_run(scf_env, qs_env, scf_section, scf_control)
895
896 TYPE(qs_scf_env_type), POINTER :: scf_env
897 TYPE(qs_environment_type), POINTER :: qs_env
898 TYPE(section_vals_type), POINTER :: scf_section
899 TYPE(scf_control_type), POINTER :: scf_control
900
901 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_scf_run'
902
903 INTEGER :: after, handle, homo, ii, ikind, ispin, &
904 iw, nao, ndep, needed_evals, nmo, &
905 output_unit
906 LOGICAL :: dft_plus_u_atom, do_kpoints, &
907 init_u_ramping_each_scf, omit_headers, &
908 s_minus_half_available
909 REAL(kind=dp) :: u_ramping
910 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals
911 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues
912 TYPE(cp_fm_struct_type), POINTER :: fm_struct
913 TYPE(cp_fm_type) :: evecs
914 TYPE(cp_fm_type), POINTER :: mo_coeff
915 TYPE(cp_logger_type), POINTER :: logger
916 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
917 TYPE(dft_control_type), POINTER :: dft_control
918 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
919 TYPE(mp_para_env_type), POINTER :: para_env
920 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
921 TYPE(qs_kind_type), POINTER :: qs_kind
922 TYPE(qs_rho_type), POINTER :: rho
923 TYPE(xas_environment_type), POINTER :: xas_env
924
925 CALL timeset(routinen, handle)
926
927 NULLIFY (qs_kind_set, matrix_s, dft_control, mos, qs_kind, rho, xas_env, mo_coeff)
928
929 logger => cp_get_default_logger()
930
931 cpassert(ASSOCIATED(scf_env))
932 cpassert(ASSOCIATED(qs_env))
933 NULLIFY (para_env)
934
935 s_minus_half_available = .false.
936 CALL get_qs_env(qs_env, &
937 dft_control=dft_control, &
938 qs_kind_set=qs_kind_set, &
939 mos=mos, &
940 rho=rho, &
941 nelectron_total=scf_env%nelectron, &
942 do_kpoints=do_kpoints, &
943 para_env=para_env, &
944 xas_env=xas_env)
945
946 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
947 extension=".scfLog")
948 CALL qs_scf_initial_info(output_unit, mos, dft_control)
949 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
950 "PRINT%PROGRAM_RUN_INFO")
951
952 ! calc ortho matrix
953 ndep = 0
954 IF (scf_env%needs_ortho) THEN
955 CALL get_qs_env(qs_env, matrix_s=matrix_s)
956 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, scf_env%ortho)
957 IF (scf_env%cholesky_method > cholesky_off) THEN
958 CALL cp_fm_cholesky_decompose(scf_env%ortho)
959 IF (scf_env%cholesky_method == cholesky_dbcsr) THEN
960 CALL cp_fm_triangular_invert(scf_env%ortho)
961 CALL cp_fm_set_all(scf_env%scf_work2, 0.0_dp)
962 CALL cp_fm_to_fm_triangular(scf_env%ortho, scf_env%scf_work2, "U")
963 CALL copy_fm_to_dbcsr(scf_env%scf_work2, scf_env%ortho_dbcsr)
964 ELSE IF (scf_env%cholesky_method == cholesky_inverse) THEN
965 CALL cp_fm_to_fm(scf_env%ortho, scf_env%ortho_m1)
966 CALL cp_fm_triangular_invert(scf_env%ortho_m1)
967 END IF
968 ELSE
969 CALL cp_fm_get_info(scf_env%ortho, ncol_global=nao)
970 ALLOCATE (evals(nao))
971 evals = 0
972
973 CALL cp_fm_create(evecs, scf_env%ortho%matrix_struct)
974
975 ! Perform an EVD
976 CALL choose_eigv_solver(scf_env%ortho, evecs, evals)
977
978 ! Determine the number of neglectable eigenvalues assuming that the eigenvalues are in ascending order
979 ! (Required by Lapack)
980 ndep = 0
981 DO ii = 1, nao
982 IF (evals(ii) > scf_control%eps_eigval) THEN
983 ndep = ii - 1
984 EXIT
985 END IF
986 END DO
987 needed_evals = nao - ndep
988
989 ! Set the eigenvalue of the eigenvectors belonging to the linear subspace to zero
990 evals(1:ndep) = 0.0_dp
991 ! Determine the eigenvalues of the inverse square root
992 evals(ndep + 1:nao) = 1.0_dp/sqrt(evals(ndep + 1:nao))
993
994 ! Create reduced matrices
995 NULLIFY (fm_struct)
996 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
997 nrow_global=nao, ncol_global=needed_evals)
998
999 ALLOCATE (scf_env%ortho_red, scf_env%scf_work2_red)
1000 CALL cp_fm_create(scf_env%ortho_red, fm_struct)
1001 CALL cp_fm_create(scf_env%scf_work2_red, fm_struct)
1002 CALL cp_fm_struct_release(fm_struct)
1003
1004 IF (scf_control%level_shift /= 0.0_dp) THEN
1005 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1006 nrow_global=needed_evals, ncol_global=nao)
1007
1008 ALLOCATE (scf_env%ortho_m1_red)
1009 CALL cp_fm_create(scf_env%ortho_m1_red, fm_struct)
1010 CALL cp_fm_struct_release(fm_struct)
1011 END IF
1012
1013 ALLOCATE (scf_env%scf_work1_red(SIZE(scf_env%scf_work1)))
1014 DO ispin = 1, SIZE(scf_env%scf_work1)
1015 CALL cp_fm_struct_create(fm_struct, template_fmstruct=scf_env%ortho%matrix_struct, &
1016 nrow_global=needed_evals, ncol_global=needed_evals)
1017 CALL cp_fm_create(scf_env%scf_work1_red(ispin), fm_struct)
1018 CALL cp_fm_struct_release(fm_struct)
1019 END DO
1020
1021 ! Scale the eigenvalues and copy them to
1022 CALL cp_fm_to_fm(evecs, scf_env%ortho_red, needed_evals, ndep + 1, 1)
1023
1024 IF (scf_control%level_shift /= 0.0_dp) THEN
1025 CALL cp_fm_transpose(scf_env%ortho_red, scf_env%ortho_m1_red)
1026 END IF
1027
1028 CALL cp_fm_column_scale(scf_env%ortho_red, evals(ndep + 1:))
1029
1030 ! Copy the linear dependent columns to the mo sets and set their orbital energies
1031 ! to a very large value to reduce the probability of occupying them
1032 DO ispin = 1, SIZE(mos)
1033 CALL get_mo_set(mos(ispin), nmo=nmo, mo_coeff=mo_coeff, homo=homo, eigenvalues=eigenvalues)
1034 IF (needed_evals < nmo) THEN
1035 IF (needed_evals < homo) THEN
1036 CALL cp_abort(__location__, &
1037 "The numerical rank of the overlap matrix is lower than the "// &
1038 "number of orbitals to be occupied! Check the geometry or increase "// &
1039 "EPS_DEFAULT or EPS_PGF_ORB!")
1040 END IF
1041 CALL cp_warn(__location__, &
1042 "The numerical rank of the overlap matrix is lower than the number of requested MOs! "// &
1043 "Reduce the number of MOs to the number of available MOs. If necessary, request a lower number of "// &
1044 "MOs or increase EPS_DEFAULT or EPS_PGF_ORB.")
1045 CALL set_mo_set(mos(ispin), nmo=needed_evals)
1046 END IF
1047 ! Copy the last columns to mo_coeff if the container is large enough
1048 CALL cp_fm_to_fm(evecs, mo_coeff, min(ndep, max(0, nmo - needed_evals)), 1, needed_evals + 1)
1049 ! Set the corresponding eigenvalues to a large value
1050 ! This prevents their occupation but still keeps the information on them
1051 eigenvalues(needed_evals + 1:min(nao, nmo)) = 1.0_dp/scf_control%eps_eigval
1052 END DO
1053
1054 ! Obtain ortho from (P)DGEMM, skip the linear dependent columns
1055 CALL parallel_gemm("N", "T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_red, evecs, &
1056 0.0_dp, scf_env%ortho, b_first_col=ndep + 1)
1057
1058 IF (scf_control%level_shift /= 0.0_dp) THEN
1059 ! We need SQRT(evals) of the eigenvalues of H, so 1/SQRT(evals) of ortho_red
1060 evals(ndep + 1:nao) = 1.0_dp/evals(ndep + 1:nao)
1061 CALL cp_fm_row_scale(scf_env%ortho_m1_red, evals(ndep + 1:))
1062
1063 CALL parallel_gemm("T", "T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_m1_red, evecs, &
1064 0.0_dp, scf_env%ortho_m1, b_first_col=ndep + 1)
1065 END IF
1066
1067 CALL cp_fm_release(evecs)
1068
1069 s_minus_half_available = .true.
1070 END IF
1071
1072 IF (btest(cp_print_key_should_output(logger%iter_info, &
1073 qs_env%input, "DFT%PRINT%AO_MATRICES/ORTHO"), cp_p_file)) THEN
1074 iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/ORTHO", &
1075 extension=".Log")
1076 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
1077 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
1078 after = min(max(after, 1), 16)
1079 CALL write_fm_with_basis_info(scf_env%ortho, 4, after, qs_env, &
1080 para_env, output_unit=iw, omit_headers=omit_headers)
1081 CALL cp_print_key_finished_output(iw, logger, qs_env%input, &
1082 "DFT%PRINT%AO_MATRICES/ORTHO")
1083 END IF
1084 END IF
1085
1086 CALL get_mo_set(mo_set=mos(1), nao=nao)
1087
1088 ! DFT+U methods based on Lowdin charges need S^(1/2)
1089 IF (dft_control%dft_plus_u) THEN
1090 CALL get_qs_env(qs_env, matrix_s=matrix_s)
1091 IF (dft_control%plus_u_method_id == plus_u_lowdin) THEN
1092 IF (s_minus_half_available) THEN
1093 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, scf_env%ortho, scf_env%s_half, &
1094 nao)
1095 ELSE
1096 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, scf_env%s_half)
1097 CALL cp_fm_power(scf_env%s_half, scf_env%scf_work2, 0.5_dp, &
1098 scf_control%eps_eigval, ndep)
1099 END IF
1100 END IF
1101 DO ikind = 1, SIZE(qs_kind_set)
1102 qs_kind => qs_kind_set(ikind)
1103 CALL get_qs_kind(qs_kind=qs_kind, &
1104 dft_plus_u_atom=dft_plus_u_atom, &
1105 u_ramping=u_ramping, &
1106 init_u_ramping_each_scf=init_u_ramping_each_scf)
1107 IF (dft_plus_u_atom .AND. (u_ramping /= 0.0_dp)) THEN
1108 IF (init_u_ramping_each_scf) THEN
1109 CALL set_qs_kind(qs_kind=qs_kind, u_minus_j=0.0_dp)
1110 END IF
1111 END IF
1112 END DO
1113 END IF
1114
1115 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1116 extension=".scfLog")
1117 IF (output_unit > 0) THEN
1118 WRITE (unit=output_unit, fmt="(T2,A,T71,I10)") &
1119 "Number of independent orbital functions:", nao - ndep
1120 END IF
1121 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1122 "PRINT%PROGRAM_RUN_INFO")
1123
1124 ! extrapolate outer loop variables
1125 IF (scf_control%outer_scf%have_scf) THEN
1126 CALL outer_loop_extrapolate(qs_env)
1127 END IF
1128
1129 ! initializes rho and the mos
1130 IF (ASSOCIATED(qs_env%xas_env)) THEN
1131 ! if just optimized wfn, e.g. ground state
1132 ! changes come from a perturbation, e.g., the occupation numbers
1133 ! it could be generalized for other cases, at the moment used only for core level spectroscopy
1134 ! initialize the density with the localized mos
1135 CALL xas_initialize_rho(qs_env, scf_env, scf_control)
1136 ELSE
1137 CALL scf_env_initial_rho_setup(scf_env, qs_env=qs_env, &
1138 scf_section=scf_section, scf_control=scf_control)
1139 END IF
1140
1141 ! Frozen density approximation
1142 IF (ASSOCIATED(qs_env%wf_history)) THEN
1143 IF (qs_env%wf_history%interpolation_method_nr == wfi_frozen_method_nr) THEN
1144 IF (.NOT. ASSOCIATED(qs_env%wf_history%past_states(1)%snapshot)) THEN
1145 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
1146 ALLOCATE (qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1147 CALL qs_rho_create(qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1148 CALL duplicate_rho_type(rho_input=rho, &
1149 rho_output=qs_env%wf_history%past_states(1)%snapshot%rho_frozen, &
1150 qs_env=qs_env)
1151 END IF
1152 END IF
1153 END IF
1154
1155 !image charge method, calculate image_matrix if required
1156 IF (qs_env%qmmm) THEN
1157 IF (qs_env%qmmm .AND. qs_env%qmmm_env_qm%image_charge) THEN
1158 CALL conditional_calc_image_matrix(qs_env=qs_env, &
1159 qmmm_env=qs_env%qmmm_env_qm)
1160 END IF
1161 END IF
1162
1163 CALL timestop(handle)
1164
1165 END SUBROUTINE init_scf_run
1166
1167! **************************************************************************************************
1168!> \brief Initializes rho and the mos, so that an scf cycle can start
1169!> \param scf_env the scf env in which to do the scf
1170!> \param qs_env the qs env the scf_env lives in
1171!> \param scf_section ...
1172!> \param scf_control ...
1173!> \par History
1174!> 02.2003 created [fawzi]
1175!> \author fawzi
1176! **************************************************************************************************
1177 SUBROUTINE scf_env_initial_rho_setup(scf_env, qs_env, scf_section, scf_control)
1178 TYPE(qs_scf_env_type), POINTER :: scf_env
1179 TYPE(qs_environment_type), POINTER :: qs_env
1180 TYPE(section_vals_type), POINTER :: scf_section
1181 TYPE(scf_control_type), POINTER :: scf_control
1182
1183 CHARACTER(len=*), PARAMETER :: routinen = 'scf_env_initial_rho_setup'
1184
1185 INTEGER :: extrapolation_method_nr, handle, ispin, &
1186 nmo, output_unit
1187 LOGICAL :: do_harris, orthogonal_wf
1188 TYPE(cp_fm_type), POINTER :: mo_coeff
1189 TYPE(cp_logger_type), POINTER :: logger
1190 TYPE(dft_control_type), POINTER :: dft_control
1191 TYPE(harris_type), POINTER :: harris_env
1192 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1193 TYPE(mp_para_env_type), POINTER :: para_env
1194 TYPE(qs_rho_type), POINTER :: rho
1195 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom
1196
1197 CALL timeset(routinen, handle)
1198 NULLIFY (mo_coeff, rho, dft_control, para_env, mos)
1199 logger => cp_get_default_logger()
1200 cpassert(ASSOCIATED(scf_env))
1201 cpassert(ASSOCIATED(qs_env))
1202
1203 CALL get_qs_env(qs_env, &
1204 rho=rho, &
1205 mos=mos, &
1206 dft_control=dft_control, &
1207 para_env=para_env)
1208
1209 do_harris = qs_env%harris_method
1210
1211 extrapolation_method_nr = wfi_use_guess_method_nr
1212 IF (ASSOCIATED(qs_env%wf_history)) THEN
1213 CALL wfi_extrapolate(qs_env%wf_history, &
1214 qs_env=qs_env, dt=1.0_dp, &
1215 extrapolation_method_nr=extrapolation_method_nr, &
1216 orthogonal_wf=orthogonal_wf)
1217 ! wfi_use_guess_method_nr the wavefunctions are not yet initialized
1218 IF ((.NOT. orthogonal_wf) .AND. &
1219 (scf_env%method == ot_method_nr) .AND. &
1220 (.NOT. (extrapolation_method_nr == wfi_use_guess_method_nr))) THEN
1221 DO ispin = 1, SIZE(mos)
1222 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1223 CALL reorthogonalize_vectors(qs_env, v_matrix=mo_coeff, n_col=nmo)
1224 IF (dft_control%hairy_probes .EQV. .true.) THEN
1225 scf_control%smear%do_smear = .false.
1226 CALL set_mo_occupation(mo_set=mos(ispin), &
1227 smear=scf_control%smear, probe=dft_control%probe)
1228 ELSE
1229 CALL set_mo_occupation(mo_set=mos(ispin), &
1230 smear=scf_control%smear)
1231 END IF
1232 END DO
1233 END IF
1234 END IF
1235
1236 IF (.NOT. do_harris) THEN
1237 output_unit = cp_print_key_unit_nr(logger, scf_section, "PRINT%PROGRAM_RUN_INFO", &
1238 extension=".scfLog")
1239 IF (output_unit > 0) THEN
1240 WRITE (unit=output_unit, fmt="(/,T2,A,I0)") &
1241 "Extrapolation method: "// &
1242 trim(wfi_get_method_label(extrapolation_method_nr))
1243 IF (extrapolation_method_nr == wfi_ps_method_nr) THEN
1244 WRITE (unit=output_unit, fmt="(T2,A,I0,A)") &
1245 "Extrapolation order: ", &
1246 max((min(qs_env%wf_history%memory_depth, qs_env%wf_history%snapshot_count) - 1), 0)
1247 END IF
1248 END IF
1249 CALL cp_print_key_finished_output(output_unit, logger, scf_section, &
1250 "PRINT%PROGRAM_RUN_INFO")
1251 END IF
1252
1253 IF (do_harris) THEN
1254 CALL get_qs_env(qs_env, harris_env=harris_env)
1255 CALL harris_density_update(qs_env, harris_env)
1256 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1257 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1258 ELSE IF (extrapolation_method_nr == wfi_use_guess_method_nr) THEN
1259 CALL calculate_first_density_matrix(scf_env=scf_env, qs_env=qs_env)
1260 CALL qs_rho_update_rho(rho, qs_env=qs_env)
1261 CALL qs_ks_did_change(qs_env%ks_env, rho_changed=.true.)
1262 END IF
1263
1264 ! Some preparation for the mixing
1265 IF (scf_env%mixing_method > 1) THEN
1266 IF (dft_control%qs_control%gapw) THEN
1267 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
1268 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1269 para_env, rho_atom=rho_atom)
1270 ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
1271 CALL charge_mixing_init(scf_env%mixing_store)
1272 ELSEIF (dft_control%qs_control%semi_empirical) THEN
1273 cpabort('SE Code not possible')
1274 ELSE
1275 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1276 para_env)
1277 END IF
1278 END IF
1279
1280 DO ispin = 1, SIZE(mos) !fm->dbcsr
1281 IF (mos(ispin)%use_mo_coeff_b) THEN
1282 CALL copy_fm_to_dbcsr(mos(ispin)%mo_coeff, &
1283 mos(ispin)%mo_coeff_b) !fm->dbcsr
1284 END IF
1285 END DO !fm->dbcsr
1286
1287 CALL timestop(handle)
1288
1289 END SUBROUTINE scf_env_initial_rho_setup
1290
1291END 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:238
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 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 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, tb_tblite)
Set the QUICKSTEP environment.
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, tb_tblite)
Get 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...
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.