(git:af0c710)
Loading...
Searching...
No Matches
qs_scf_post_tb.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Does all kind of post scf calculations for DFTB
10!> \par History
11!> Started as a copy from the GPW file
12!> - Revise MO information printout (10.05.2021, MK)
13!> \author JHU (03.2013)
14! **************************************************************************************************
18 USE cell_types, ONLY: cell_type,&
19 pbc
23 USE cp_dbcsr_api, ONLY: dbcsr_p_type,&
34 USE cp_fm_types, ONLY: cp_fm_create,&
43 USE cp_output_handling, ONLY: cp_p_file,&
51 USE eeq_method, ONLY: eeq_print
61 USE kinds, ONLY: default_path_length,&
63 dp
64 USE machine, ONLY: m_flush
65 USE mathconstants, ONLY: twopi,&
66 z_one,&
67 z_zero
72 USE mulliken, ONLY: mulliken_charges
75 USE physcon, ONLY: debye
78 USE pw_env_methods, ONLY: pw_env_create,&
80 USE pw_env_types, ONLY: pw_env_get,&
84 USE pw_methods, ONLY: pw_axpy,&
85 pw_copy,&
86 pw_derive,&
87 pw_scale,&
96 USE pw_pool_types, ONLY: pw_pool_p_type,&
98 USE pw_types, ONLY: pw_c1d_gs_type,&
105 USE qs_dos, ONLY: calculate_dos,&
107 USE qs_elf_methods, ONLY: qs_elf_calc
111 USE qs_kind_types, ONLY: get_qs_kind,&
113 USE qs_ks_types, ONLY: get_ks_env,&
119 USE qs_mo_types, ONLY: get_mo_set,&
124 USE qs_rho_types, ONLY: qs_rho_get,&
125 qs_rho_set,&
132 USE qs_scf_types, ONLY: ot_method_nr,&
134 USE qs_scf_wfn_mix, ONLY: wfn_mix
135 USE qs_subsys_types, ONLY: qs_subsys_get,&
138 USE stm_images, ONLY: th_stm_image
142 USE xtb_qresp, ONLY: build_xtb_qresp
143 USE xtb_types, ONLY: get_xtb_atom_param,&
145#include "./base/base_uses.f90"
146
147 IMPLICIT NONE
148 PRIVATE
149
150 ! Global parameters
151 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_post_tb'
153
154! **************************************************************************************************
155
156CONTAINS
157
158! **************************************************************************************************
159!> \brief collects possible post - scf calculations and prints info / computes properties.
160!> \param qs_env ...
161!> \param tb_type ...
162!> \param no_mos ...
163!> \par History
164!> 03.2013 copy of scf_post_gpw
165!> \author JHU
166!> \note
167! **************************************************************************************************
168 SUBROUTINE scf_post_calculation_tb(qs_env, tb_type, no_mos)
169
170 TYPE(qs_environment_type), POINTER :: qs_env
171 CHARACTER(LEN=*) :: tb_type
172 LOGICAL, INTENT(IN) :: no_mos
173
174 CHARACTER(len=*), PARAMETER :: routinen = 'scf_post_calculation_tb'
175
176 CHARACTER(LEN=6) :: ana
177 CHARACTER(LEN=default_string_length) :: aname
178 INTEGER :: after, gfn_type, handle, homo, iat, iatom, ikind, img, ispin, iw, nat, natom, &
179 nkind, nlumo_stm, nlumos, nspins, print_level, unit_nr
180 LOGICAL :: do_cube, do_kpoints, explicit, gfn0, &
181 has_homo, omit_headers, print_it, &
182 rebuild, vdip
183 REAL(kind=dp) :: zeff
184 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: mcharge, zcharge
185 REAL(kind=dp), DIMENSION(2, 2) :: homo_lumo
186 REAL(kind=dp), DIMENSION(:), POINTER :: echarge, mo_eigenvalues
187 REAL(kind=dp), DIMENSION(:, :), POINTER :: charges
188 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
189 TYPE(cell_type), POINTER :: cell
190 TYPE(cp_1d_r_p_type), DIMENSION(:), POINTER :: unoccupied_evals_stm
191 TYPE(cp_fm_type), DIMENSION(:), POINTER :: unoccupied_orbs_stm
192 TYPE(cp_fm_type), POINTER :: mo_coeff
193 TYPE(cp_logger_type), POINTER :: logger
194 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, mo_derivs
195 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_p, matrix_s
196 TYPE(dbcsr_type), POINTER :: mo_coeff_deriv
197 TYPE(dft_control_type), POINTER :: dft_control
198 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
199 TYPE(mp_para_env_type), POINTER :: para_env
200 TYPE(particle_list_type), POINTER :: particles
201 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
202 TYPE(qs_dftb_atom_type), POINTER :: dftb_kind
203 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
204 TYPE(qs_rho_type), POINTER :: rho
205 TYPE(qs_scf_env_type), POINTER :: scf_env
206 TYPE(qs_subsys_type), POINTER :: subsys
207 TYPE(scf_control_type), POINTER :: scf_control
208 TYPE(section_vals_type), POINTER :: dft_section, moments_section, print_key, &
209 print_section, sprint_section, &
210 wfn_mix_section
211 TYPE(xtb_atom_type), POINTER :: xtb_kind
212
213 CALL timeset(routinen, handle)
214
215 logger => cp_get_default_logger()
216
217 gfn0 = .false.
218 vdip = .false.
219 CALL get_qs_env(qs_env, dft_control=dft_control)
220 SELECT CASE (trim(tb_type))
221 CASE ("DFTB")
222 CASE ("xTB")
223 gfn_type = dft_control%qs_control%xtb_control%gfn_type
224 gfn0 = (gfn_type == 0)
225 vdip = dft_control%qs_control%xtb_control%var_dipole
226 CASE DEFAULT
227 cpabort("unknown TB type")
228 END SELECT
229
230 cpassert(ASSOCIATED(qs_env))
231 NULLIFY (rho, para_env, matrix_s, matrix_p)
232 CALL get_qs_env(qs_env, scf_env=scf_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
233 rho=rho, natom=natom, para_env=para_env, &
234 particle_set=particle_set, do_kpoints=do_kpoints, matrix_s_kp=matrix_s)
235 nspins = dft_control%nspins
236 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
237 ! Mulliken charges
238 ALLOCATE (charges(natom, nspins), mcharge(natom))
239 !
240 CALL mulliken_charges(matrix_p, matrix_s, para_env, charges)
241 !
242 ALLOCATE (zcharge(natom))
243 nkind = SIZE(atomic_kind_set)
244 DO ikind = 1, nkind
245 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
246 SELECT CASE (trim(tb_type))
247 CASE ("DFTB")
248 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
249 CALL get_dftb_atom_param(dftb_kind, zeff=zeff)
250 CASE ("xTB")
251 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
252 CALL get_xtb_atom_param(xtb_kind, zeff=zeff)
253 CASE DEFAULT
254 cpabort("unknown TB type")
255 END SELECT
256 DO iatom = 1, nat
257 iat = atomic_kind_set(ikind)%atom_list(iatom)
258 mcharge(iat) = zeff - sum(charges(iat, 1:nspins))
259 zcharge(iat) = zeff
260 END DO
261 END DO
262
263 dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
264 print_section => section_vals_get_subs_vals(dft_section, "PRINT")
265
266 ! Mulliken
267 print_key => section_vals_get_subs_vals(print_section, "MULLIKEN")
268 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
269 unit_nr = cp_print_key_unit_nr(logger, print_section, "MULLIKEN", &
270 extension=".mulliken", log_filename=.false.)
271 IF (unit_nr > 0) THEN
272 WRITE (unit=unit_nr, fmt="(/,/,T2,A)") "MULLIKEN POPULATION ANALYSIS"
273 IF (nspins == 1) THEN
274 WRITE (unit=unit_nr, fmt="(/,T2,A,T70,A)") &
275 " # Atom Element Kind Atomic population", " Net charge"
276 DO ikind = 1, nkind
277 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
278 aname = ""
279 SELECT CASE (tb_type)
280 CASE ("DFTB")
281 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
282 CALL get_dftb_atom_param(dftb_kind, name=aname)
283 CASE ("xTB")
284 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
285 CALL get_xtb_atom_param(xtb_kind, symbol=aname)
286 CASE DEFAULT
287 cpabort("unknown TB type")
288 END SELECT
289 ana = adjustr(trim(adjustl(aname)))
290 DO iatom = 1, nat
291 iat = atomic_kind_set(ikind)%atom_list(iatom)
292 WRITE (unit=unit_nr, &
293 fmt="(T2,I7,5X,A6,I6,T39,F12.6,T69,F12.6)") &
294 iat, adjustl(ana), ikind, charges(iat, 1), mcharge(iat)
295 END DO
296 END DO
297 WRITE (unit=unit_nr, &
298 fmt="(T2,A,T39,F12.6,T69,F12.6,/)") &
299 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
300 ELSE
301 WRITE (unit=unit_nr, fmt="(/,T2,A)") &
302 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
303 DO ikind = 1, nkind
304 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
305 aname = ""
306 SELECT CASE (tb_type)
307 CASE ("DFTB")
308 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
309 CALL get_dftb_atom_param(dftb_kind, name=aname)
310 CASE ("xTB")
311 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
312 CALL get_xtb_atom_param(xtb_kind, symbol=aname)
313 CASE DEFAULT
314 cpabort("unknown TB type")
315 END SELECT
316 ana = adjustr(trim(adjustl(aname)))
317 DO iatom = 1, nat
318 iat = atomic_kind_set(ikind)%atom_list(iatom)
319 WRITE (unit=unit_nr, &
320 fmt="(T2,I6,3X,A6,I6,T29,4(1X,F12.6))") &
321 iat, adjustl(ana), ikind, charges(iat, 1:2), mcharge(iat), &
322 charges(iat, 1) - charges(iat, 2)
323 END DO
324 END DO
325 WRITE (unit=unit_nr, &
326 fmt="(T2,A,T29,4(1X,F12.6),/)") &
327 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
328 END IF
329 CALL m_flush(unit_nr)
330 END IF
331 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
332 END IF
333
334 ! Compute the Lowdin charges
335 print_key => section_vals_get_subs_vals(print_section, "LOWDIN")
336 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
337 SELECT CASE (tb_type)
338 CASE ("DFTB")
339 cpwarn("Lowdin population analysis not implemented for DFTB method.")
340 CASE ("xTB")
341 unit_nr = cp_print_key_unit_nr(logger, print_section, "LOWDIN", extension=".lowdin", &
342 log_filename=.false.)
343 print_level = 1
344 CALL section_vals_val_get(print_key, "PRINT_GOP", l_val=print_it)
345 IF (print_it) print_level = 2
346 CALL section_vals_val_get(print_key, "PRINT_ALL", l_val=print_it)
347 IF (print_it) print_level = 3
348 IF (do_kpoints) THEN
349 cpwarn("Lowdin charges not implemented for k-point calculations!")
350 ELSE
351 CALL lowdin_population_analysis(qs_env, unit_nr, print_level)
352 END IF
353 CALL cp_print_key_finished_output(unit_nr, logger, print_section, "LOWDIN")
354 CASE DEFAULT
355 cpabort("unknown TB type")
356 END SELECT
357 END IF
358
359 ! EEQ Charges
360 print_key => section_vals_get_subs_vals(print_section, "EEQ_CHARGES")
361 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
362 unit_nr = cp_print_key_unit_nr(logger, print_section, "EEQ_CHARGES", &
363 extension=".eeq", log_filename=.false.)
364 CALL eeq_print(qs_env, unit_nr, print_level, ext=gfn0)
365 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
366 END IF
367
368 ! Hirshfeld
369 print_key => section_vals_get_subs_vals(print_section, "HIRSHFELD")
370 CALL section_vals_get(print_key, explicit=explicit)
371 IF (explicit) THEN
372 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
373 cpwarn("Hirshfeld charges not available for TB methods.")
374 END IF
375 END IF
376
377 ! MAO
378 print_key => section_vals_get_subs_vals(print_section, "MAO_ANALYSIS")
379 CALL section_vals_get(print_key, explicit=explicit)
380 IF (explicit) THEN
381 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
382 cpwarn("MAO analysis not available for TB methods.")
383 END IF
384 END IF
385
386 ! ED
387 print_key => section_vals_get_subs_vals(print_section, "ENERGY_DECOMPOSITION_ANALYSIS")
388 CALL section_vals_get(print_key, explicit=explicit)
389 IF (explicit) THEN
390 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
391 cpwarn("ED analysis not available for TB methods.")
392 END IF
393 END IF
394
395 ! Dipole Moments
396 print_key => section_vals_get_subs_vals(print_section, "MOMENTS")
397 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
398 unit_nr = cp_print_key_unit_nr(logger, print_section, "MOMENTS", &
399 extension=".data", middle_name="tb_dipole", log_filename=.false.)
400 moments_section => section_vals_get_subs_vals(print_section, "MOMENTS")
401 IF (gfn0) THEN
402 NULLIFY (echarge)
403 CALL get_qs_env(qs_env, eeq=echarge)
404 cpassert(ASSOCIATED(echarge))
405 IF (vdip) THEN
406 CALL build_xtb_qresp(qs_env, mcharge)
407 mcharge(1:natom) = echarge(1:natom) - mcharge(1:natom)
408 END IF
409 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
410 ELSE
411 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
412 END IF
413 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
414 END IF
415
416 DEALLOCATE (charges, mcharge)
417
418 ! MO
419 IF (.NOT. no_mos) THEN
420 print_key => section_vals_get_subs_vals(print_section, "MO")
421 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
422 CALL qs_scf_write_mos(qs_env, scf_env, final_mos=.true.)
423 IF (.NOT. do_kpoints) THEN
424 SELECT CASE (tb_type)
425 CASE ("DFTB")
426 CASE ("xTB")
427 sprint_section => section_vals_get_subs_vals(dft_section, "PRINT%MO_MOLDEN")
428 CALL get_qs_env(qs_env, mos=mos, cell=cell)
429 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
430 qs_env=qs_env, calc_energies=.true.)
431 CASE DEFAULT
432 cpabort("Unknown TB type")
433 END SELECT
434 END IF
435 END IF
436 END IF
437
438 ! Wavefunction mixing
439 IF (.NOT. no_mos) THEN
440 wfn_mix_section => section_vals_get_subs_vals(dft_section, "PRINT%WFN_MIX")
441 CALL section_vals_get(wfn_mix_section, explicit=explicit)
442 IF (explicit .AND. .NOT. qs_env%run_rtp) CALL wfn_mix_tb(qs_env, dft_section, scf_env)
443 END IF
444
445 IF (.NOT. no_mos) THEN
446 print_key => section_vals_get_subs_vals(print_section, "DOS")
447 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
448 IF (do_kpoints) THEN
449 CALL calculate_dos_kp(qs_env, dft_section)
450 ELSE
451 CALL get_qs_env(qs_env, mos=mos)
452 CALL calculate_dos(mos, dft_section)
453 END IF
454 END IF
455 END IF
456
457 ! PDOS
458 IF (.NOT. no_mos) THEN
459 print_key => section_vals_get_subs_vals(print_section, "PDOS")
460 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
461 IF (do_kpoints) THEN
462 cpwarn("Projected density of states not implemented for k-points.")
463 ELSE
464 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
465 DO ispin = 1, dft_control%nspins
466 IF (scf_env%method == ot_method_nr) THEN
467 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
468 eigenvalues=mo_eigenvalues)
469 IF (ASSOCIATED(qs_env%mo_derivs)) THEN
470 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
471 ELSE
472 mo_coeff_deriv => null()
473 END IF
474 CALL calculate_subspace_eigenvalues(mo_coeff, ks_rmpv(ispin)%matrix, mo_eigenvalues, &
475 do_rotation=.true., &
476 co_rotate_dbcsr=mo_coeff_deriv)
477 CALL set_mo_occupation(mo_set=mos(ispin))
478 END IF
479 IF (dft_control%nspins == 2) THEN
480 CALL calculate_projected_dos(mos(ispin), atomic_kind_set, &
481 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
482 ELSE
483 CALL calculate_projected_dos(mos(ispin), atomic_kind_set, &
484 qs_kind_set, particle_set, qs_env, dft_section)
485 END IF
486 END DO
487 END IF
488 END IF
489 END IF
490
491 ! can we do CUBE files?
492 SELECT CASE (tb_type)
493 CASE ("DFTB")
494 do_cube = .false.
495 rebuild = .false.
496 CASE ("xTB")
497 do_cube = .true.
498 rebuild = .true.
499 CASE DEFAULT
500 cpabort("unknown TB type")
501 END SELECT
502
503 ! Energy Windows for LS code
504 print_key => section_vals_get_subs_vals(print_section, "ENERGY_WINDOWS")
505 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
506 IF (do_cube) THEN
507 IF (do_kpoints) THEN
508 cpwarn("Energy Windows not implemented for k-points.")
509 ELSE
510 IF (rebuild) THEN
511 CALL rebuild_pw_env(qs_env)
512 rebuild = .false.
513 END IF
514 CALL energy_windows(qs_env)
515 END IF
516 ELSE
517 cpwarn("Energy Windows not implemented for TB methods.")
518 END IF
519 END IF
520
521 ! DENSITY CUBE FILE
522 print_key => section_vals_get_subs_vals(print_section, "E_DENSITY_CUBE")
523 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
524 IF (do_cube) THEN
525 IF (rebuild) THEN
526 CALL rebuild_pw_env(qs_env)
527 rebuild = .false.
528 END IF
529 CALL print_e_density(qs_env, zcharge, print_key)
530 ELSE
531 cpwarn("Electronic density cube file not implemented for TB methods.")
532 END IF
533 END IF
534
535 ! TOTAL DENSITY CUBE FILE
536 print_key => section_vals_get_subs_vals(print_section, "TOT_DENSITY_CUBE")
537 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
538 IF (do_cube) THEN
539 IF (rebuild) THEN
540 CALL rebuild_pw_env(qs_env)
541 rebuild = .false.
542 END IF
543 CALL print_density_cubes(qs_env, zcharge, print_key, total_density=.true.)
544 ELSE
545 cpwarn("Total density cube file not implemented for TB methods.")
546 END IF
547 END IF
548
549 ! V_Hartree CUBE FILE
550 print_key => section_vals_get_subs_vals(print_section, "V_HARTREE_CUBE")
551 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
552 IF (do_cube) THEN
553 IF (rebuild) THEN
554 CALL rebuild_pw_env(qs_env)
555 rebuild = .false.
556 END IF
557 CALL print_density_cubes(qs_env, zcharge, print_key, v_hartree=.true.)
558 ELSE
559 cpwarn("Hartree potential cube file not implemented for TB methods.")
560 END IF
561 END IF
562
563 ! EFIELD CUBE FILE
564 print_key => section_vals_get_subs_vals(print_section, "EFIELD_CUBE")
565 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
566 IF (do_cube) THEN
567 IF (rebuild) THEN
568 CALL rebuild_pw_env(qs_env)
569 rebuild = .false.
570 END IF
571 CALL print_density_cubes(qs_env, zcharge, print_key, efield=.true.)
572 ELSE
573 cpwarn("Efield cube file not implemented for TB methods.")
574 END IF
575 END IF
576
577 ! ELF
578 print_key => section_vals_get_subs_vals(print_section, "ELF_CUBE")
579 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
580 IF (do_cube) THEN
581 IF (rebuild) THEN
582 CALL rebuild_pw_env(qs_env)
583 rebuild = .false.
584 END IF
585 CALL print_elf(qs_env, zcharge, print_key)
586 ELSE
587 cpwarn("ELF not implemented for TB methods.")
588 END IF
589 END IF
590
591 ! MO CUBES
592 IF (.NOT. no_mos) THEN
593 print_key => section_vals_get_subs_vals(print_section, "MO_CUBES")
594 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
595 IF (do_cube) THEN
596 IF (rebuild) THEN
597 CALL rebuild_pw_env(qs_env)
598 rebuild = .false.
599 END IF
600 CALL print_mo_cubes(qs_env, zcharge, print_key)
601 ELSE
602 cpwarn("Printing of MO cube files not implemented for TB methods.")
603 END IF
604 END IF
605 END IF
606
607 ! STM
608 IF (.NOT. no_mos) THEN
609 print_key => section_vals_get_subs_vals(print_section, "STM")
610 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
611 IF (do_cube) THEN
612 IF (rebuild) THEN
613 CALL rebuild_pw_env(qs_env)
614 rebuild = .false.
615 END IF
616 IF (do_kpoints) THEN
617 cpwarn("STM not implemented for k-point calculations!")
618 ELSE
619 nlumo_stm = section_get_ival(print_key, "NLUMO")
620 cpassert(.NOT. dft_control%restricted)
621 CALL get_qs_env(qs_env, mos=mos, mo_derivs=mo_derivs, &
622 scf_control=scf_control, matrix_ks=ks_rmpv)
623 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
624 DO ispin = 1, dft_control%nspins
625 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
626 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
627 END DO
628 has_homo = .true.
629 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
630 IF (nlumo_stm > 0) THEN
631 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
632 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
633 CALL make_lumo_tb(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
634 nlumo_stm, nlumos)
635 END IF
636
637 CALL get_qs_env(qs_env, subsys=subsys)
638 CALL qs_subsys_get(subsys, particles=particles)
639 CALL th_stm_image(qs_env, print_key, particles, unoccupied_orbs_stm, &
640 unoccupied_evals_stm)
641
642 IF (nlumo_stm > 0) THEN
643 DO ispin = 1, dft_control%nspins
644 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
645 END DO
646 DEALLOCATE (unoccupied_evals_stm)
647 CALL cp_fm_release(unoccupied_orbs_stm)
648 END IF
649 END IF
650 END IF
651 END IF
652 END IF
653
654 ! Write the density matrix
655 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks)
656 CALL section_vals_val_get(print_section, "AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
657 IF (btest(cp_print_key_should_output(logger%iter_info, print_section, &
658 "AO_MATRICES/DENSITY"), cp_p_file)) THEN
659 iw = cp_print_key_unit_nr(logger, print_section, "AO_MATRICES/DENSITY", &
660 extension=".Log")
661 CALL section_vals_val_get(print_section, "AO_MATRICES%NDIGITS", i_val=after)
662 after = min(max(after, 1), 16)
663 DO ispin = 1, dft_control%nspins
664 DO img = 1, SIZE(matrix_p, 2)
665 CALL cp_dbcsr_write_sparse_matrix(matrix_p(ispin, img)%matrix, 4, after, qs_env, &
666 para_env, output_unit=iw, omit_headers=omit_headers)
667 END DO
668 END DO
669 CALL cp_print_key_finished_output(iw, logger, print_section, "AO_MATRICES/DENSITY")
670 END IF
671
672 ! The xTB matrix itself
673 IF (btest(cp_print_key_should_output(logger%iter_info, print_section, &
674 "AO_MATRICES/KOHN_SHAM_MATRIX"), cp_p_file)) THEN
675 iw = cp_print_key_unit_nr(logger, print_section, "AO_MATRICES/KOHN_SHAM_MATRIX", &
676 extension=".Log")
677 CALL section_vals_val_get(print_section, "AO_MATRICES%NDIGITS", i_val=after)
678 after = min(max(after, 1), 16)
679 DO ispin = 1, dft_control%nspins
680 DO img = 1, SIZE(matrix_ks, 2)
681 CALL cp_dbcsr_write_sparse_matrix(matrix_ks(ispin, img)%matrix, 4, after, qs_env, para_env, &
682 output_unit=iw, omit_headers=omit_headers)
683 END DO
684 END DO
685 CALL cp_print_key_finished_output(iw, logger, print_section, "AO_MATRICES/KOHN_SHAM_MATRIX")
686 END IF
687
688 ! these print keys are not supported in TB
689
690 ! V_XC CUBE FILE
691 print_key => section_vals_get_subs_vals(print_section, "V_XC_CUBE")
692 CALL section_vals_get(print_key, explicit=explicit)
693 IF (explicit) THEN
694 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
695 cpwarn("XC potential cube file not available for TB methods.")
696 END IF
697 END IF
698
699 ! Electric field gradients
700 print_key => section_vals_get_subs_vals(print_section, "ELECTRIC_FIELD_GRADIENT")
701 CALL section_vals_get(print_key, explicit=explicit)
702 IF (explicit) THEN
703 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
704 cpwarn("Electric field gradient not implemented for TB methods.")
705 END IF
706 END IF
707
708 ! KINETIC ENERGY
709 print_key => section_vals_get_subs_vals(print_section, "KINETIC_ENERGY")
710 CALL section_vals_get(print_key, explicit=explicit)
711 IF (explicit) THEN
712 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
713 cpwarn("Kinetic energy not available for TB methods.")
714 END IF
715 END IF
716
717 ! Xray diffraction spectrum
718 print_key => section_vals_get_subs_vals(print_section, "XRAY_DIFFRACTION_SPECTRUM")
719 CALL section_vals_get(print_key, explicit=explicit)
720 IF (explicit) THEN
721 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
722 cpwarn("Xray diffraction spectrum not implemented for TB methods.")
723 END IF
724 END IF
725
726 ! EPR Hyperfine Coupling
727 print_key => section_vals_get_subs_vals(print_section, "HYPERFINE_COUPLING_TENSOR")
728 CALL section_vals_get(print_key, explicit=explicit)
729 IF (explicit) THEN
730 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
731 cpwarn("Hyperfine Coupling not implemented for TB methods.")
732 END IF
733 END IF
734
735 ! PLUS_U
736 print_key => section_vals_get_subs_vals(print_section, "PLUS_U")
737 CALL section_vals_get(print_key, explicit=explicit)
738 IF (explicit) THEN
739 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
740 cpwarn("DFT+U method not implemented for TB methods.")
741 END IF
742 END IF
743
744 CALL write_ks_matrix_csr(qs_env, qs_env%input)
745 CALL write_s_matrix_csr(qs_env, qs_env%input)
746 CALL write_hcore_matrix_csr(qs_env, qs_env%input)
747 CALL write_p_matrix_csr(qs_env, qs_env%input)
748
749 DEALLOCATE (zcharge)
750
751 CALL timestop(handle)
752
753 END SUBROUTINE scf_post_calculation_tb
754
755! **************************************************************************************************
756!> \brief ...
757!> \param qs_env ...
758!> \param input ...
759!> \param unit_nr ...
760!> \param charges ...
761! **************************************************************************************************
762 SUBROUTINE tb_dipole(qs_env, input, unit_nr, charges)
763
764 TYPE(qs_environment_type), POINTER :: qs_env
765 TYPE(section_vals_type), POINTER :: input
766 INTEGER, INTENT(in) :: unit_nr
767 REAL(kind=dp), DIMENSION(:), INTENT(in) :: charges
768
769 CHARACTER(LEN=default_string_length) :: description, dipole_type
770 COMPLEX(KIND=dp) :: dzeta, dzphase(3), zeta, zphase(3)
771 COMPLEX(KIND=dp), DIMENSION(3) :: dggamma, ggamma
772 INTEGER :: i, iat, ikind, j, nat, reference
773 LOGICAL :: do_berry
774 REAL(kind=dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
775 dtheta, gvec(3), q, rcc(3), ria(3), theta, tmp(3), via(3)
776 REAL(kind=dp), DIMENSION(:), POINTER :: ref_point
777 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
778 TYPE(cell_type), POINTER :: cell
779 TYPE(cp_result_type), POINTER :: results
780 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
781
782 NULLIFY (atomic_kind_set, cell, results)
783 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
784 particle_set=particle_set, cell=cell, results=results)
785
786 ! Reference point
787 reference = section_get_ival(input, keyword_name="REFERENCE")
788 NULLIFY (ref_point)
789 description = '[DIPOLE]'
790 CALL section_vals_val_get(input, "REF_POINT", r_vals=ref_point)
791 CALL section_vals_val_get(input, "PERIODIC", l_val=do_berry)
792
793 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
794
795 ! Dipole deriv will be the derivative of the Dipole(dM/dt=\sum e_j v_j)
796 dipole_deriv = 0.0_dp
797 dipole = 0.0_dp
798 IF (do_berry) THEN
799 dipole_type = "periodic (Berry phase)"
800 rcc = pbc(rcc, cell)
801 charge_tot = 0._dp
802 charge_tot = sum(charges)
803 ria = twopi*matmul(cell%h_inv, rcc)
804 zphase = cmplx(cos(ria), sin(ria), dp)**charge_tot
805
806 dria = twopi*matmul(cell%h_inv, drcc)
807 dzphase = charge_tot*cmplx(-sin(ria), cos(ria), dp)**(charge_tot - 1.0_dp)*dria
808
809 ggamma = z_one
810 dggamma = z_zero
811 DO ikind = 1, SIZE(atomic_kind_set)
812 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
813 DO i = 1, nat
814 iat = atomic_kind_set(ikind)%atom_list(i)
815 ria = particle_set(iat)%r(:)
816 ria = pbc(ria, cell)
817 via = particle_set(iat)%v(:)
818 q = charges(iat)
819 DO j = 1, 3
820 gvec = twopi*cell%h_inv(j, :)
821 theta = sum(ria(:)*gvec(:))
822 dtheta = sum(via(:)*gvec(:))
823 zeta = cmplx(cos(theta), sin(theta), kind=dp)**(-q)
824 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=dp)**(-q - 1.0_dp)*dtheta
825 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
826 ggamma(j) = ggamma(j)*zeta
827 END DO
828 END DO
829 END DO
830 dggamma = dggamma*zphase + ggamma*dzphase
831 ggamma = ggamma*zphase
832 IF (all(real(ggamma, kind=dp) /= 0.0_dp)) THEN
833 tmp = aimag(ggamma)/real(ggamma, kind=dp)
834 ci = -atan(tmp)
835 dci = -(1.0_dp/(1.0_dp + tmp**2))* &
836 (aimag(dggamma)*real(ggamma, kind=dp) - aimag(ggamma)*real(dggamma, kind=dp))/(real(ggamma, kind=dp))**2
837 dipole = matmul(cell%hmat, ci)/twopi
838 dipole_deriv = matmul(cell%hmat, dci)/twopi
839 END IF
840 ELSE
841 dipole_type = "non-periodic"
842 DO i = 1, SIZE(particle_set)
843 ! no pbc(particle_set(i)%r(:),cell) so that the total dipole is the sum of the molecular dipoles
844 ria = particle_set(i)%r(:)
845 q = charges(i)
846 dipole = dipole + q*(ria - rcc)
847 dipole_deriv(:) = dipole_deriv(:) + q*(particle_set(i)%v(:) - drcc)
848 END DO
849 END IF
850 CALL cp_results_erase(results=results, description=description)
851 CALL put_results(results=results, description=description, &
852 values=dipole(1:3))
853 IF (unit_nr > 0) THEN
854 WRITE (unit_nr, '(/,T2,A,T31,A50)') &
855 'TB_DIPOLE| Dipole type', adjustr(trim(dipole_type))
856 WRITE (unit_nr, "(T2,A,T30,3(1X,F16.8))") "TB_DIPOLE| Ref. Point [Bohr]", rcc
857 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
858 'TB_DIPOLE| Moment [a.u.]', dipole(1:3)
859 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
860 'TB_DIPOLE| Moment [Debye]', dipole(1:3)*debye
861 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
862 'TB_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
863 END IF
864
865 END SUBROUTINE tb_dipole
866
867! **************************************************************************************************
868!> \brief computes the MOs and calls the wavefunction mixing routine.
869!> \param qs_env ...
870!> \param dft_section ...
871!> \param scf_env ...
872!> \author Florian Schiffmann
873!> \note
874! **************************************************************************************************
875
876 SUBROUTINE wfn_mix_tb(qs_env, dft_section, scf_env)
877
878 TYPE(qs_environment_type), POINTER :: qs_env
879 TYPE(section_vals_type), POINTER :: dft_section
880 TYPE(qs_scf_env_type), POINTER :: scf_env
881
882 INTEGER :: ispin, nao, nmo, output_unit
883 REAL(dp), DIMENSION(:), POINTER :: mo_eigenvalues
884 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
885 TYPE(cp_fm_struct_type), POINTER :: ao_ao_fmstruct, ao_lumo_struct
886 TYPE(cp_fm_type) :: ks_tmp, mo_tmp, s_tmp, work
887 TYPE(cp_fm_type), DIMENSION(:), POINTER :: lumos
888 TYPE(cp_fm_type), POINTER :: mo_coeff
889 TYPE(cp_logger_type), POINTER :: logger
890 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
891 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
892 TYPE(mp_para_env_type), POINTER :: para_env
893 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
894 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
895 TYPE(section_vals_type), POINTER :: wfn_mix_section
896
897 logger => cp_get_default_logger()
898 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks, &
899 particle_set=particle_set, atomic_kind_set=atomic_kind_set, &
900 qs_kind_set=qs_kind_set, mos=mos, para_env=para_env)
901
902 wfn_mix_section => section_vals_get_subs_vals(dft_section, "PRINT%WFN_MIX")
903
904 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nao=nao)
905
906 CALL cp_fm_struct_create(fmstruct=ao_ao_fmstruct, nrow_global=nao, ncol_global=nao, &
907 template_fmstruct=mo_coeff%matrix_struct)
908 CALL cp_fm_create(s_tmp, matrix_struct=ao_ao_fmstruct)
909 CALL cp_fm_create(ks_tmp, matrix_struct=ao_ao_fmstruct)
910 CALL cp_fm_create(mo_tmp, matrix_struct=ao_ao_fmstruct)
911 CALL cp_fm_create(work, matrix_struct=ao_ao_fmstruct)
912 ALLOCATE (lumos(SIZE(mos)))
913
914 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, s_tmp)
915 CALL cp_fm_cholesky_decompose(s_tmp)
916
917 DO ispin = 1, SIZE(mos)
918 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, eigenvalues=mo_eigenvalues, nmo=nmo)
919 CALL cp_fm_struct_create(fmstruct=ao_lumo_struct, nrow_global=nao, ncol_global=nao - nmo, &
920 template_fmstruct=mo_coeff%matrix_struct)
921
922 CALL cp_fm_create(lumos(ispin), matrix_struct=ao_lumo_struct)
923 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, ks_tmp)
924 CALL cp_fm_cholesky_reduce(ks_tmp, s_tmp)
925 CALL choose_eigv_solver(ks_tmp, work, mo_eigenvalues)
926 CALL cp_fm_cholesky_restore(work, nao, s_tmp, mo_tmp, "SOLVE")
927 CALL cp_fm_to_fm_submat(mo_tmp, mo_coeff, nao, nmo, 1, 1, 1, 1)
928 CALL cp_fm_to_fm_submat(mo_tmp, lumos(ispin), nao, nao - nmo, 1, nmo + 1, 1, 1)
929
930 CALL cp_fm_struct_release(ao_lumo_struct)
931 END DO
932
933 output_unit = cp_logger_get_default_io_unit(logger)
934 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
935 unoccupied_orbs=lumos, scf_env=scf_env, matrix_s=matrix_s)
936
937 CALL cp_fm_release(lumos)
938 CALL cp_fm_release(s_tmp)
939 CALL cp_fm_release(mo_tmp)
940 CALL cp_fm_release(ks_tmp)
941 CALL cp_fm_release(work)
942 CALL cp_fm_struct_release(ao_ao_fmstruct)
943
944 END SUBROUTINE wfn_mix_tb
945
946! **************************************************************************************************
947!> \brief Gets the lumos, and eigenvalues for the lumos
948!> \param qs_env ...
949!> \param scf_env ...
950!> \param unoccupied_orbs ...
951!> \param unoccupied_evals ...
952!> \param nlumo ...
953!> \param nlumos ...
954! **************************************************************************************************
955 SUBROUTINE make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
956
957 TYPE(qs_environment_type), POINTER :: qs_env
958 TYPE(qs_scf_env_type), POINTER :: scf_env
959 TYPE(cp_fm_type), DIMENSION(:), POINTER :: unoccupied_orbs
960 TYPE(cp_1d_r_p_type), DIMENSION(:), INTENT(INOUT) :: unoccupied_evals
961 INTEGER :: nlumo
962 INTEGER, INTENT(OUT) :: nlumos
963
964 INTEGER :: homo, iounit, ispin, n, nao, nmo
965 TYPE(cp_blacs_env_type), POINTER :: blacs_env
966 TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
967 TYPE(cp_fm_type), POINTER :: mo_coeff
968 TYPE(cp_logger_type), POINTER :: logger
969 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, matrix_s
970 TYPE(dft_control_type), POINTER :: dft_control
971 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
972 TYPE(mp_para_env_type), POINTER :: para_env
973 TYPE(preconditioner_type), POINTER :: local_preconditioner
974 TYPE(scf_control_type), POINTER :: scf_control
975
976 NULLIFY (mos, ks_rmpv, scf_control, dft_control, para_env, blacs_env)
977 CALL get_qs_env(qs_env, &
978 mos=mos, &
979 matrix_ks=ks_rmpv, &
980 scf_control=scf_control, &
981 dft_control=dft_control, &
982 matrix_s=matrix_s, &
983 para_env=para_env, &
984 blacs_env=blacs_env)
985
986 logger => cp_get_default_logger()
987 iounit = cp_logger_get_default_io_unit(logger)
988
989 DO ispin = 1, dft_control%nspins
990 NULLIFY (unoccupied_evals(ispin)%array)
991 ! Always write eigenvalues
992 IF (iounit > 0) WRITE (iounit, *) " "
993 IF (iounit > 0) WRITE (iounit, *) " Lowest Eigenvalues of the unoccupied subspace spin ", ispin
994 IF (iounit > 0) WRITE (iounit, fmt='(1X,A)') "-----------------------------------------------------"
995 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
996 CALL cp_fm_get_info(mo_coeff, nrow_global=n)
997 nlumos = max(1, min(nlumo, nao - nmo))
998 IF (nlumo == -1) nlumos = nao - nmo
999 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1000 CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
1001 nrow_global=n, ncol_global=nlumos)
1002 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name="lumos")
1003 CALL cp_fm_struct_release(fm_struct_tmp)
1004 CALL cp_fm_init_random(unoccupied_orbs(ispin), nlumos)
1005
1006 ! the full_all preconditioner makes not much sense for lumos search
1007 NULLIFY (local_preconditioner)
1008 IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
1009 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1010 ! this one can for sure not be right (as it has to match a given C0)
1011 IF (local_preconditioner%in_use == ot_precond_full_all) THEN
1012 NULLIFY (local_preconditioner)
1013 END IF
1014 END IF
1015
1016 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1017 matrix_c_fm=unoccupied_orbs(ispin), &
1018 matrix_orthogonal_space_fm=mo_coeff, &
1019 eps_gradient=scf_control%eps_lumos, &
1020 preconditioner=local_preconditioner, &
1021 iter_max=scf_control%max_iter_lumos, &
1022 size_ortho_space=nmo)
1023
1024 CALL calculate_subspace_eigenvalues(unoccupied_orbs(ispin), ks_rmpv(ispin)%matrix, &
1025 unoccupied_evals(ispin)%array, scr=iounit, &
1026 ionode=iounit > 0)
1027
1028 END DO
1029
1030 END SUBROUTINE make_lumo_tb
1031
1032! **************************************************************************************************
1033!> \brief ...
1034!> \param qs_env ...
1035! **************************************************************************************************
1036 SUBROUTINE rebuild_pw_env(qs_env)
1037
1038 TYPE(qs_environment_type), POINTER :: qs_env
1039
1040 LOGICAL :: skip_load_balance_distributed
1041 TYPE(cell_type), POINTER :: cell
1042 TYPE(dft_control_type), POINTER :: dft_control
1043 TYPE(pw_env_type), POINTER :: new_pw_env
1044 TYPE(qs_ks_env_type), POINTER :: ks_env
1045 TYPE(qs_rho_type), POINTER :: rho
1046 TYPE(task_list_type), POINTER :: task_list
1047
1048 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=new_pw_env)
1049 IF (.NOT. ASSOCIATED(new_pw_env)) THEN
1050 CALL pw_env_create(new_pw_env)
1051 CALL set_ks_env(ks_env, pw_env=new_pw_env)
1052 CALL pw_env_release(new_pw_env)
1053 END IF
1054 CALL get_qs_env(qs_env, pw_env=new_pw_env, dft_control=dft_control, cell=cell)
1055
1056 new_pw_env%cell_hmat = cell%hmat
1057 CALL pw_env_rebuild(new_pw_env, qs_env=qs_env)
1058
1059 NULLIFY (task_list)
1060 CALL get_ks_env(ks_env, task_list=task_list)
1061 IF (.NOT. ASSOCIATED(task_list)) THEN
1062 CALL allocate_task_list(task_list)
1063 CALL set_ks_env(ks_env, task_list=task_list)
1064 END IF
1065 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
1066 CALL generate_qs_task_list(ks_env, task_list, basis_type="ORB", &
1067 reorder_rs_grid_ranks=.true., &
1068 skip_load_balance_distributed=skip_load_balance_distributed)
1069 CALL get_qs_env(qs_env, rho=rho)
1070 CALL qs_rho_rebuild(rho, qs_env=qs_env, rebuild_ao=.false., rebuild_grids=.true.)
1071
1072 END SUBROUTINE rebuild_pw_env
1073
1074! **************************************************************************************************
1075!> \brief ...
1076!> \param qs_env ...
1077!> \param zcharge ...
1078!> \param cube_section ...
1079! **************************************************************************************************
1080 SUBROUTINE print_e_density(qs_env, zcharge, cube_section)
1081
1082 TYPE(qs_environment_type), POINTER :: qs_env
1083 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1084 TYPE(section_vals_type), POINTER :: cube_section
1085
1086 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1087 INTEGER :: iounit, ispin, unit_nr
1088 LOGICAL :: append_cube, mpi_io
1089 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho_r
1090 TYPE(cp_logger_type), POINTER :: logger
1091 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
1092 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1093 TYPE(dft_control_type), POINTER :: dft_control
1094 TYPE(particle_list_type), POINTER :: particles
1095 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
1096 TYPE(pw_env_type), POINTER :: pw_env
1097 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1098 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1099 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
1100 TYPE(qs_ks_env_type), POINTER :: ks_env
1101 TYPE(qs_rho_type), POINTER :: rho
1102 TYPE(qs_subsys_type), POINTER :: subsys
1103
1104 CALL get_qs_env(qs_env, dft_control=dft_control)
1105
1106 append_cube = section_get_lval(cube_section, "APPEND")
1107 my_pos_cube = "REWIND"
1108 IF (append_cube) my_pos_cube = "APPEND"
1109
1110 logger => cp_get_default_logger()
1111 iounit = cp_logger_get_default_io_unit(logger)
1112
1113 ! we need to construct the density on a realspace grid
1114 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1115 NULLIFY (rho_r, rho_g, tot_rho_r)
1116 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1117 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1118 DO ispin = 1, dft_control%nspins
1119 rho_ao => rho_ao_kp(ispin, :)
1120 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1121 rho=rho_r(ispin), &
1122 rho_gspace=rho_g(ispin), &
1123 total_rho=tot_rho_r(ispin), &
1124 ks_env=ks_env)
1125 END DO
1126 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1127
1128 CALL get_qs_env(qs_env, subsys=subsys)
1129 CALL qs_subsys_get(subsys, particles=particles)
1130
1131 IF (dft_control%nspins > 1) THEN
1132 IF (iounit > 0) THEN
1133 WRITE (unit=iounit, fmt="(/,T2,A,T51,2F15.6)") &
1134 "Integrated alpha and beta electronic density:", tot_rho_r(1:2)
1135 END IF
1136 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1137 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1138 block
1139 TYPE(pw_r3d_rs_type) :: rho_elec_rspace
1140 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
1141 CALL pw_copy(rho_r(1), rho_elec_rspace)
1142 CALL pw_axpy(rho_r(2), rho_elec_rspace)
1143 filename = "ELECTRON_DENSITY"
1144 mpi_io = .true.
1145 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1146 extension=".cube", middle_name=trim(filename), &
1147 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1148 fout=mpi_filename)
1149 IF (iounit > 0) THEN
1150 IF (.NOT. mpi_io) THEN
1151 INQUIRE (unit=unit_nr, name=filename)
1152 ELSE
1153 filename = mpi_filename
1154 END IF
1155 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1156 "The sum of alpha and beta density is written in cube file format to the file:", adjustr(trim(filename))
1157 END IF
1158 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr, "SUM OF ALPHA AND BETA DENSITY", &
1159 particles=particles, zeff=zcharge, stride=section_get_ivals(cube_section, "STRIDE"), &
1160 mpi_io=mpi_io)
1161 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1162 CALL pw_copy(rho_r(1), rho_elec_rspace)
1163 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
1164 filename = "SPIN_DENSITY"
1165 mpi_io = .true.
1166 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1167 extension=".cube", middle_name=trim(filename), &
1168 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1169 fout=mpi_filename)
1170 IF (iounit > 0) THEN
1171 IF (.NOT. mpi_io) THEN
1172 INQUIRE (unit=unit_nr, name=filename)
1173 ELSE
1174 filename = mpi_filename
1175 END IF
1176 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1177 "The spin density is written in cube file format to the file:", adjustr(trim(filename))
1178 END IF
1179 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr, "SPIN DENSITY", &
1180 particles=particles, zeff=zcharge, &
1181 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1182 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1183 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
1184 END block
1185 ELSE
1186 IF (iounit > 0) THEN
1187 WRITE (unit=iounit, fmt="(/,T2,A,T66,F15.6)") &
1188 "Integrated electronic density:", tot_rho_r(1)
1189 END IF
1190 filename = "ELECTRON_DENSITY"
1191 mpi_io = .true.
1192 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1193 extension=".cube", middle_name=trim(filename), &
1194 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1195 fout=mpi_filename)
1196 IF (iounit > 0) THEN
1197 IF (.NOT. mpi_io) THEN
1198 INQUIRE (unit=unit_nr, name=filename)
1199 ELSE
1200 filename = mpi_filename
1201 END IF
1202 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1203 "The electron density is written in cube file format to the file:", adjustr(trim(filename))
1204 END IF
1205 CALL cp_pw_to_cube(rho_r(1), unit_nr, "ELECTRON DENSITY", &
1206 particles=particles, zeff=zcharge, &
1207 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1208 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1209 END IF ! nspins
1210
1211 END SUBROUTINE print_e_density
1212! **************************************************************************************************
1213!> \brief ...
1214!> \param qs_env ...
1215!> \param zcharge ...
1216!> \param cube_section ...
1217!> \param total_density ...
1218!> \param v_hartree ...
1219!> \param efield ...
1220! **************************************************************************************************
1221 SUBROUTINE print_density_cubes(qs_env, zcharge, cube_section, total_density, v_hartree, efield)
1222
1223 TYPE(qs_environment_type), POINTER :: qs_env
1224 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1225 TYPE(section_vals_type), POINTER :: cube_section
1226 LOGICAL, INTENT(IN), OPTIONAL :: total_density, v_hartree, efield
1227
1228 CHARACTER(len=1), DIMENSION(3), PARAMETER :: cdir = ["x", "y", "z"]
1229
1230 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1231 INTEGER :: id, iounit, ispin, nd(3), unit_nr
1232 LOGICAL :: append_cube, mpi_io, my_efield, &
1233 my_total_density, my_v_hartree
1234 REAL(kind=dp) :: total_rho_core_rspace, udvol
1235 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho_r
1236 TYPE(cell_type), POINTER :: cell
1237 TYPE(cp_logger_type), POINTER :: logger
1238 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
1239 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1240 TYPE(dft_control_type), POINTER :: dft_control
1241 TYPE(particle_list_type), POINTER :: particles
1242 TYPE(pw_c1d_gs_type) :: rho_core
1243 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
1244 TYPE(pw_env_type), POINTER :: pw_env
1245 TYPE(pw_poisson_parameter_type) :: poisson_params
1246 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1247 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1248 TYPE(pw_r3d_rs_type) :: rho_tot_rspace
1249 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
1250 TYPE(qs_ks_env_type), POINTER :: ks_env
1251 TYPE(qs_rho_type), POINTER :: rho
1252 TYPE(qs_subsys_type), POINTER :: subsys
1253
1254 CALL get_qs_env(qs_env, cell=cell, dft_control=dft_control)
1255
1256 append_cube = section_get_lval(cube_section, "APPEND")
1257 my_pos_cube = "REWIND"
1258 IF (append_cube) my_pos_cube = "APPEND"
1259
1260 IF (PRESENT(total_density)) THEN
1261 my_total_density = total_density
1262 ELSE
1263 my_total_density = .false.
1264 END IF
1265 IF (PRESENT(v_hartree)) THEN
1266 my_v_hartree = v_hartree
1267 ELSE
1268 my_v_hartree = .false.
1269 END IF
1270 IF (PRESENT(efield)) THEN
1271 my_efield = efield
1272 ELSE
1273 my_efield = .false.
1274 END IF
1275
1276 logger => cp_get_default_logger()
1277 iounit = cp_logger_get_default_io_unit(logger)
1278
1279 ! we need to construct the density on a realspace grid
1280 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1281 NULLIFY (rho_r, rho_g, tot_rho_r)
1282 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1283 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1284 DO ispin = 1, dft_control%nspins
1285 rho_ao => rho_ao_kp(ispin, :)
1286 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1287 rho=rho_r(ispin), &
1288 rho_gspace=rho_g(ispin), &
1289 total_rho=tot_rho_r(ispin), &
1290 ks_env=ks_env)
1291 END DO
1292 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1293
1294 CALL get_qs_env(qs_env, subsys=subsys)
1295 CALL qs_subsys_get(subsys, particles=particles)
1296
1297 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1298 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1299 CALL auxbas_pw_pool%create_pw(pw=rho_core)
1300 CALL calculate_rho_core(rho_core, total_rho_core_rspace, qs_env)
1301
1302 IF (iounit > 0) THEN
1303 WRITE (unit=iounit, fmt="(/,T2,A,T66,F15.6)") &
1304 "Integrated electronic density:", sum(tot_rho_r(:))
1305 WRITE (unit=iounit, fmt="(T2,A,T66,F15.6)") &
1306 "Integrated core density:", total_rho_core_rspace
1307 END IF
1308
1309 CALL auxbas_pw_pool%create_pw(pw=rho_tot_rspace)
1310 CALL pw_transfer(rho_core, rho_tot_rspace)
1311 DO ispin = 1, dft_control%nspins
1312 CALL pw_axpy(rho_r(ispin), rho_tot_rspace)
1313 END DO
1314
1315 IF (my_total_density) THEN
1316 filename = "TOTAL_DENSITY"
1317 mpi_io = .true.
1318 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1319 extension=".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1320 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1321 IF (iounit > 0) THEN
1322 IF (.NOT. mpi_io) THEN
1323 INQUIRE (unit=unit_nr, name=filename)
1324 ELSE
1325 filename = mpi_filename
1326 END IF
1327 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1328 "The total density is written in cube file format to the file:", adjustr(trim(filename))
1329 END IF
1330 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr, "TOTAL DENSITY", &
1331 particles=particles, zeff=zcharge, &
1332 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1333 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1334 END IF
1335 IF (my_v_hartree .OR. my_efield) THEN
1336 block
1337 TYPE(pw_c1d_gs_type) :: rho_tot_gspace
1338 CALL auxbas_pw_pool%create_pw(pw=rho_tot_gspace)
1339 CALL pw_transfer(rho_tot_rspace, rho_tot_gspace)
1340 poisson_params%solver = pw_poisson_analytic
1341 poisson_params%periodic = cell%perd
1342 poisson_params%ewald_type = do_ewald_none
1343 block
1344 TYPE(greens_fn_type) :: green_fft
1345 TYPE(pw_grid_type), POINTER :: pwdummy
1346 NULLIFY (pwdummy)
1347 CALL pw_green_create(green_fft, poisson_params, cell%hmat, auxbas_pw_pool, pwdummy, pwdummy)
1348 rho_tot_gspace%array(:) = rho_tot_gspace%array(:)*green_fft%influence_fn%array(:)
1349 CALL pw_green_release(green_fft, auxbas_pw_pool)
1350 END block
1351 IF (my_v_hartree) THEN
1352 block
1353 TYPE(pw_r3d_rs_type) :: vhartree
1354 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1355 CALL pw_transfer(rho_tot_gspace, vhartree)
1356 filename = "V_HARTREE"
1357 mpi_io = .true.
1358 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1359 extension=".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1360 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1361 IF (iounit > 0) THEN
1362 IF (.NOT. mpi_io) THEN
1363 INQUIRE (unit=unit_nr, name=filename)
1364 ELSE
1365 filename = mpi_filename
1366 END IF
1367 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1368 "The Hartree potential is written in cube file format to the file:", adjustr(trim(filename))
1369 END IF
1370 CALL cp_pw_to_cube(vhartree, unit_nr, "Hartree Potential", &
1371 particles=particles, zeff=zcharge, &
1372 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1373 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1374 CALL auxbas_pw_pool%give_back_pw(vhartree)
1375 END block
1376 END IF
1377 IF (my_efield) THEN
1378 block
1379 TYPE(pw_c1d_gs_type) :: vhartree
1380 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1381 udvol = 1.0_dp/rho_tot_rspace%pw_grid%dvol
1382 DO id = 1, 3
1383 CALL pw_transfer(rho_tot_gspace, vhartree)
1384 nd = 0
1385 nd(id) = 1
1386 CALL pw_derive(vhartree, nd)
1387 CALL pw_transfer(vhartree, rho_tot_rspace)
1388 CALL pw_scale(rho_tot_rspace, udvol)
1389
1390 filename = "EFIELD_"//cdir(id)
1391 mpi_io = .true.
1392 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1393 extension=".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1394 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1395 IF (iounit > 0) THEN
1396 IF (.NOT. mpi_io) THEN
1397 INQUIRE (unit=unit_nr, name=filename)
1398 ELSE
1399 filename = mpi_filename
1400 END IF
1401 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1402 "The Efield is written in cube file format to the file:", adjustr(trim(filename))
1403 END IF
1404 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr, "EFIELD "//cdir(id), &
1405 particles=particles, zeff=zcharge, &
1406 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1407 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1408 END DO
1409 CALL auxbas_pw_pool%give_back_pw(vhartree)
1410 END block
1411 END IF
1412 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1413 END block
1414 END IF
1415
1416 CALL auxbas_pw_pool%give_back_pw(rho_tot_rspace)
1417 CALL auxbas_pw_pool%give_back_pw(rho_core)
1418
1419 END SUBROUTINE print_density_cubes
1420
1421! **************************************************************************************************
1422!> \brief ...
1423!> \param qs_env ...
1424!> \param zcharge ...
1425!> \param elf_section ...
1426! **************************************************************************************************
1427 SUBROUTINE print_elf(qs_env, zcharge, elf_section)
1428
1429 TYPE(qs_environment_type), POINTER :: qs_env
1430 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1431 TYPE(section_vals_type), POINTER :: elf_section
1432
1433 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1434 title
1435 INTEGER :: iounit, ispin, unit_nr
1436 LOGICAL :: append_cube, mpi_io
1437 REAL(kind=dp) :: rho_cutoff
1438 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho_r
1439 TYPE(cp_logger_type), POINTER :: logger
1440 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
1441 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1442 TYPE(dft_control_type), POINTER :: dft_control
1443 TYPE(particle_list_type), POINTER :: particles
1444 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
1445 TYPE(pw_env_type), POINTER :: pw_env
1446 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1447 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1448 TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:) :: elf_r
1449 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
1450 TYPE(qs_ks_env_type), POINTER :: ks_env
1451 TYPE(qs_rho_type), POINTER :: rho
1452 TYPE(qs_subsys_type), POINTER :: subsys
1453
1454 logger => cp_get_default_logger()
1455 iounit = cp_logger_get_default_io_unit(logger)
1456
1457 ! we need to construct the density on a realspace grid
1458 CALL get_qs_env(qs_env, dft_control=dft_control, ks_env=ks_env, rho=rho)
1459 NULLIFY (rho_r, rho_g, tot_rho_r)
1460 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1461 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1462 DO ispin = 1, dft_control%nspins
1463 rho_ao => rho_ao_kp(ispin, :)
1464 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1465 rho=rho_r(ispin), &
1466 rho_gspace=rho_g(ispin), &
1467 total_rho=tot_rho_r(ispin), &
1468 ks_env=ks_env)
1469 END DO
1470 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1471
1472 CALL get_qs_env(qs_env, subsys=subsys)
1473 CALL qs_subsys_get(subsys, particles=particles)
1474
1475 ALLOCATE (elf_r(dft_control%nspins))
1476 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1477 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1478 DO ispin = 1, dft_control%nspins
1479 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1480 CALL pw_zero(elf_r(ispin))
1481 END DO
1482
1483 IF (iounit > 0) THEN
1484 WRITE (unit=iounit, fmt="(/,T2,A)") &
1485 "ELF is computed on the real space grid -----"
1486 END IF
1487 rho_cutoff = section_get_rval(elf_section, "density_cutoff")
1488 CALL qs_elf_calc(qs_env, elf_r, rho_cutoff)
1489
1490 ! write ELF into cube file
1491 append_cube = section_get_lval(elf_section, "APPEND")
1492 my_pos_cube = "REWIND"
1493 IF (append_cube) my_pos_cube = "APPEND"
1494 DO ispin = 1, dft_control%nspins
1495 WRITE (filename, '(a5,I1.1)') "ELF_S", ispin
1496 WRITE (title, *) "ELF spin ", ispin
1497 mpi_io = .true.
1498 unit_nr = cp_print_key_unit_nr(logger, elf_section, '', extension=".cube", &
1499 middle_name=trim(filename), file_position=my_pos_cube, &
1500 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1501 IF (iounit > 0) THEN
1502 IF (.NOT. mpi_io) THEN
1503 INQUIRE (unit=unit_nr, name=filename)
1504 ELSE
1505 filename = mpi_filename
1506 END IF
1507 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1508 "ELF is written in cube file format to the file:", adjustr(trim(filename))
1509 END IF
1510
1511 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
1512 stride=section_get_ivals(elf_section, "STRIDE"), mpi_io=mpi_io)
1513 CALL cp_print_key_finished_output(unit_nr, logger, elf_section, '', mpi_io=mpi_io)
1514
1515 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1516 END DO
1517
1518 DEALLOCATE (elf_r)
1519
1520 END SUBROUTINE print_elf
1521! **************************************************************************************************
1522!> \brief ...
1523!> \param qs_env ...
1524!> \param zcharge ...
1525!> \param cube_section ...
1526! **************************************************************************************************
1527 SUBROUTINE print_mo_cubes(qs_env, zcharge, cube_section)
1528
1529 TYPE(qs_environment_type), POINTER :: qs_env
1530 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1531 TYPE(section_vals_type), POINTER :: cube_section
1532
1533 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1534 INTEGER :: homo, i, ifirst, ilast, iounit, ir, &
1535 ispin, ivector, n_rep, nhomo, nlist, &
1536 nlumo, nmo, shomo, unit_nr
1537 INTEGER, DIMENSION(:), POINTER :: list, list_index
1538 LOGICAL :: append_cube, mpi_io, write_cube
1539 REAL(kind=dp) :: homo_lumo(2, 2)
1540 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues
1541 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1542 TYPE(cell_type), POINTER :: cell
1543 TYPE(cp_fm_type), POINTER :: mo_coeff
1544 TYPE(cp_logger_type), POINTER :: logger
1545 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, mo_derivs
1546 TYPE(dft_control_type), POINTER :: dft_control
1547 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1548 TYPE(particle_list_type), POINTER :: particles
1549 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1550 TYPE(pw_c1d_gs_type) :: wf_g
1551 TYPE(pw_env_type), POINTER :: pw_env
1552 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1553 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1554 TYPE(pw_r3d_rs_type) :: wf_r
1555 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1556 TYPE(qs_subsys_type), POINTER :: subsys
1557 TYPE(scf_control_type), POINTER :: scf_control
1558
1559 logger => cp_get_default_logger()
1560 iounit = cp_logger_get_default_io_unit(logger)
1561
1562 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv, scf_control=scf_control)
1563 CALL get_qs_env(qs_env, dft_control=dft_control, mo_derivs=mo_derivs)
1564 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
1565 NULLIFY (mo_eigenvalues)
1566 homo = 0
1567 DO ispin = 1, dft_control%nspins
1568 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=shomo)
1569 homo_lumo(ispin, 1) = mo_eigenvalues(shomo)
1570 homo = max(homo, shomo)
1571 END DO
1572 write_cube = section_get_lval(cube_section, "WRITE_CUBE")
1573 nlumo = section_get_ival(cube_section, "NLUMO")
1574 nhomo = section_get_ival(cube_section, "NHOMO")
1575 NULLIFY (list_index)
1576 CALL section_vals_val_get(cube_section, "HOMO_LIST", n_rep_val=n_rep)
1577 IF (n_rep > 0) THEN
1578 nlist = 0
1579 DO ir = 1, n_rep
1580 NULLIFY (list)
1581 CALL section_vals_val_get(cube_section, "HOMO_LIST", i_rep_val=ir, i_vals=list)
1582 IF (ASSOCIATED(list)) THEN
1583 CALL reallocate(list_index, 1, nlist + SIZE(list))
1584 DO i = 1, SIZE(list)
1585 list_index(i + nlist) = list(i)
1586 END DO
1587 nlist = nlist + SIZE(list)
1588 END IF
1589 END DO
1590 nhomo = maxval(list_index)
1591 ELSE
1592 IF (nhomo == -1) nhomo = homo
1593 nlist = homo - max(1, homo - nhomo + 1) + 1
1594 ALLOCATE (list_index(nlist))
1595 DO i = 1, nlist
1596 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1597 END DO
1598 END IF
1599
1600 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1601 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1602 CALL auxbas_pw_pool%create_pw(wf_r)
1603 CALL auxbas_pw_pool%create_pw(wf_g)
1604
1605 CALL get_qs_env(qs_env, subsys=subsys)
1606 CALL qs_subsys_get(subsys, particles=particles)
1607
1608 append_cube = section_get_lval(cube_section, "APPEND")
1609 my_pos_cube = "REWIND"
1610 IF (append_cube) THEN
1611 my_pos_cube = "APPEND"
1612 END IF
1613
1614 CALL get_qs_env(qs_env=qs_env, &
1615 atomic_kind_set=atomic_kind_set, &
1616 qs_kind_set=qs_kind_set, &
1617 cell=cell, &
1618 particle_set=particle_set)
1619
1620 IF (nhomo >= 0) THEN
1621 DO ispin = 1, dft_control%nspins
1622 ! Prints the cube files of OCCUPIED ORBITALS
1623 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1624 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1625 IF (write_cube) THEN
1626 DO i = 1, nlist
1627 ivector = list_index(i)
1628 IF (ivector > homo) cycle
1629 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1630 cell, dft_control, particle_set, pw_env)
1631 WRITE (filename, '(a4,I5.5,a1,I1.1)') "WFN_", ivector, "_", ispin
1632 mpi_io = .true.
1633 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', extension=".cube", &
1634 middle_name=trim(filename), file_position=my_pos_cube, &
1635 log_filename=.false., mpi_io=mpi_io)
1636 WRITE (title, *) "WAVEFUNCTION ", ivector, " spin ", ispin, " i.e. HOMO - ", ivector - homo
1637 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1638 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1639 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1640 END DO
1641 END IF
1642 END DO
1643 END IF
1644
1645 IF (nlumo /= 0) THEN
1646 DO ispin = 1, dft_control%nspins
1647 ! Prints the cube files of UNOCCUPIED ORBITALS
1648 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1649 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1650 IF (write_cube) THEN
1651 ifirst = homo + 1
1652 IF (nlumo == -1) THEN
1653 ilast = nmo
1654 ELSE
1655 ilast = ifirst + nlumo - 1
1656 ilast = min(nmo, ilast)
1657 END IF
1658 DO ivector = ifirst, ilast
1659 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, &
1660 qs_kind_set, cell, dft_control, particle_set, pw_env)
1661 WRITE (filename, '(a4,I5.5,a1,I1.1)') "WFN_", ivector, "_", ispin
1662 mpi_io = .true.
1663 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', extension=".cube", &
1664 middle_name=trim(filename), file_position=my_pos_cube, &
1665 log_filename=.false., mpi_io=mpi_io)
1666 WRITE (title, *) "WAVEFUNCTION ", ivector, " spin ", ispin, " i.e. LUMO + ", ivector - ifirst
1667 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1668 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1669 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1670 END DO
1671 END IF
1672 END DO
1673 END IF
1674
1675 CALL auxbas_pw_pool%give_back_pw(wf_g)
1676 CALL auxbas_pw_pool%give_back_pw(wf_r)
1677 IF (ASSOCIATED(list_index)) DEALLOCATE (list_index)
1678
1679 END SUBROUTINE print_mo_cubes
1680
1681! **************************************************************************************************
1682
1683END MODULE qs_scf_post_tb
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
Definition cell_types.F:15
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
DBCSR output in CP2K.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers)
...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
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,...
subroutine, public cp_fm_cholesky_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
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 choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
Definition cp_fm_diag.F:239
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_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
subroutine, public cp_fm_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
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...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_results_erase(results, description, nval)
erase a part of result_list
set of type/routines to handle the storage of results in force_envs
Calculation of charge equilibration method.
Definition eeq_method.F:12
subroutine, public eeq_print(qs_env, iounit, print_level, ext)
...
Definition eeq_method.F:127
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ot_precond_full_all
objects that represent the structure of input sections and the data contained in an input section
real(kind=dp) function, public section_get_rval(section_vals, keyword_name)
...
integer function, dimension(:), pointer, public section_get_ivals(section_vals, keyword_name)
...
integer function, public section_get_ival(section_vals, keyword_name)
...
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_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
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
logical function, public section_get_lval(section_vals, keyword_name)
...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:136
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Utility routines for the memory handling.
Interface to the message passing library MPI.
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section, cell, unoccupied_orbs, unoccupied_evals, qs_env, calc_energies)
Write out the MOs in molden format for visualisation.
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Definition mulliken.F:13
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public debye
Definition physcon.F:201
Provide various population analyses and print the requested output information.
subroutine, public lowdin_population_analysis(qs_env, output_unit, print_level)
Perform a Lowdin population analysis based on a symmetric orthogonalisation of the density matrix usi...
types of preconditioners
computes preconditioners, and implements methods to apply them currently used in qs_ot
methods of pw_env that have dependence on qs_env
subroutine, public pw_env_rebuild(pw_env, qs_env, external_para_env)
rebuilds the pw_env data (necessary if cell or cutoffs change)
subroutine, public pw_env_create(pw_env)
creates a pw_env, if qs_env is given calls pw_env_rebuild
container for various plainwaves related things
subroutine, public pw_env_release(pw_env, para_env)
releases the given pw_env (see doc/ReferenceCounting.html)
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
functions related to the poisson solver on regular grids
subroutine, public pw_green_create(green, poisson_params, cell_hmat, pw_pool, mt_super_ref_pw_grid, dct_pw_grid)
Allocates and sets up the green functions for the fft based poisson solvers.
subroutine, public pw_green_release(gftype, pw_pool)
destroys the type (deallocates data)
integer, parameter, public do_ewald_none
integer, parameter, public pw_poisson_analytic
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
Definition of the DFTB parameter types.
Working with the DFTB parameter types.
subroutine, public get_dftb_atom_param(dftb_parameter, name, typ, defined, z, zeff, natorb, lmax, skself, occupation, eta, energy, cutoff, xi, di, rcdisp, dudq)
...
Calculation and writing of density of states.
Definition qs_dos.F:14
subroutine, public calculate_dos(mos, dft_section)
Compute and write density of states.
Definition qs_dos.F:59
subroutine, public calculate_dos_kp(qs_env, dft_section)
Compute and write density of states (kpoints)
Definition qs_dos.F:206
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public qs_elf_calc(qs_env, elf_r, rho_cutoff)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public energy_windows(qs_env)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
collects routines that perform operations directly related to MOs
subroutine, public make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env, hairy_probes, probe)
Calculate KS eigenvalues starting from OF MOS.
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
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.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
Calculation and writing of projected density of states The DOS is computed per angular momentum and p...
Definition qs_pdos.F:15
subroutine, public calculate_projected_dos(mo_set, atomic_kind_set, qs_kind_set, particle_set, qs_env, dft_section, ispin, xas_mittle, external_matrix_shalf)
Compute and write projected density of states.
Definition qs_pdos.F:139
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(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)
...
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...
Functions to print the KS and S matrix in the CSR format to file.
subroutine, public write_s_matrix_csr(qs_env, input)
writing the overlap matrix in csr format into a file
subroutine, public write_ks_matrix_csr(qs_env, input)
writing the KS matrix in csr format into a file
subroutine, public write_p_matrix_csr(qs_env, input)
writing the density matrix in csr format into a file
subroutine, public write_hcore_matrix_csr(qs_env, input)
writing the core Hamiltonian matrix in csr format into a file
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
Does all kind of post scf calculations for DFTB.
subroutine, public scf_post_calculation_tb(qs_env, tb_type, no_mos)
collects possible post - scf calculations and prints info / computes properties.
subroutine, public make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
Gets the lumos, and eigenvalues for the lumos.
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, unoccupied_orbs, scf_env, matrix_s, marked_states, for_rtp)
writes a new 'mixed' set of mos to restart file, without touching the current MOs
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
parameters that control an scf iteration
Calculation of STM image as post processing of an electronic structure calculation,...
Definition stm_images.F:15
subroutine, public th_stm_image(qs_env, stm_section, particles, unoccupied_orbs, unoccupied_evals)
Driver for the calculation of STM image, as post processing of a ground-state electronic structure ca...
Definition stm_images.F:90
generate the tasks lists used by collocate and integrate routines
subroutine, public generate_qs_task_list(ks_env, task_list, basis_type, reorder_rs_grid_ranks, skip_load_balance_distributed, pw_env_external, sab_orb_external, ext_kpoints)
...
types for task lists
subroutine, public allocate_task_list(task_list)
allocates and initialised the components of the task_list_type
Calculation of charge response in xTB (EEQ only) Reference: Stefan Grimme, Christoph Bannwarth,...
Definition xtb_qresp.F:15
subroutine, public build_xtb_qresp(qs_env, qresp)
...
Definition xtb_qresp.F:83
Definition of the xTB parameter types.
Definition xtb_types.F:20
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, hen, zeta, xi, kappa0, alpg, occupation, electronegativity, chmax, en, kqat2, kcn, kq)
...
Definition xtb_types.F:199
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a pointer to a 1d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
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 arbitrary information which need to be stored
stores all the informations relevant to an mpi environment
contained for different pw related things
contains all the informations needed by the fft based poisson solvers
parameters for the poisson solver independet of input_section
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.