(git:30099c3)
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(cp_1d_r_p_type), DIMENSION(:), POINTER :: unoccupied_evals_stm
190 TYPE(cp_fm_type), DIMENSION(:), POINTER :: unoccupied_orbs_stm
191 TYPE(cp_fm_type), POINTER :: mo_coeff
192 TYPE(cp_logger_type), POINTER :: logger
193 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, mo_derivs
194 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks, matrix_p, matrix_s
195 TYPE(dbcsr_type), POINTER :: mo_coeff_deriv
196 TYPE(dft_control_type), POINTER :: dft_control
197 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
198 TYPE(mp_para_env_type), POINTER :: para_env
199 TYPE(particle_list_type), POINTER :: particles
200 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
201 TYPE(qs_dftb_atom_type), POINTER :: dftb_kind
202 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
203 TYPE(qs_rho_type), POINTER :: rho
204 TYPE(qs_scf_env_type), POINTER :: scf_env
205 TYPE(qs_subsys_type), POINTER :: subsys
206 TYPE(scf_control_type), POINTER :: scf_control
207 TYPE(section_vals_type), POINTER :: dft_section, moments_section, print_key, &
208 print_section, sprint_section, &
209 wfn_mix_section
210 TYPE(xtb_atom_type), POINTER :: xtb_kind
211
212 CALL timeset(routinen, handle)
213
214 logger => cp_get_default_logger()
215
216 gfn0 = .false.
217 vdip = .false.
218 CALL get_qs_env(qs_env, dft_control=dft_control)
219 SELECT CASE (trim(tb_type))
220 CASE ("DFTB")
221 CASE ("xTB")
222 gfn_type = dft_control%qs_control%xtb_control%gfn_type
223 gfn0 = (gfn_type == 0)
224 vdip = dft_control%qs_control%xtb_control%var_dipole
225 CASE DEFAULT
226 cpabort("unknown TB type")
227 END SELECT
228
229 cpassert(ASSOCIATED(qs_env))
230 NULLIFY (rho, para_env, matrix_s, matrix_p)
231 CALL get_qs_env(qs_env, scf_env=scf_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
232 rho=rho, natom=natom, para_env=para_env, &
233 particle_set=particle_set, do_kpoints=do_kpoints, matrix_s_kp=matrix_s)
234 nspins = dft_control%nspins
235 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
236 ! Mulliken charges
237 ALLOCATE (charges(natom, nspins), mcharge(natom))
238 !
239 CALL mulliken_charges(matrix_p, matrix_s, para_env, charges)
240 !
241 ALLOCATE (zcharge(natom))
242 nkind = SIZE(atomic_kind_set)
243 DO ikind = 1, nkind
244 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
245 SELECT CASE (trim(tb_type))
246 CASE ("DFTB")
247 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
248 CALL get_dftb_atom_param(dftb_kind, zeff=zeff)
249 CASE ("xTB")
250 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
251 CALL get_xtb_atom_param(xtb_kind, zeff=zeff)
252 CASE DEFAULT
253 cpabort("unknown TB type")
254 END SELECT
255 DO iatom = 1, nat
256 iat = atomic_kind_set(ikind)%atom_list(iatom)
257 mcharge(iat) = zeff - sum(charges(iat, 1:nspins))
258 zcharge(iat) = zeff
259 END DO
260 END DO
261
262 dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
263 print_section => section_vals_get_subs_vals(dft_section, "PRINT")
264
265 ! Mulliken
266 print_key => section_vals_get_subs_vals(print_section, "MULLIKEN")
267 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
268 unit_nr = cp_print_key_unit_nr(logger, print_section, "MULLIKEN", &
269 extension=".mulliken", log_filename=.false.)
270 IF (unit_nr > 0) THEN
271 WRITE (unit=unit_nr, fmt="(/,/,T2,A)") "MULLIKEN POPULATION ANALYSIS"
272 IF (nspins == 1) THEN
273 WRITE (unit=unit_nr, fmt="(/,T2,A,T70,A)") &
274 " # Atom Element Kind Atomic population", " Net charge"
275 DO ikind = 1, nkind
276 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
277 aname = ""
278 SELECT CASE (tb_type)
279 CASE ("DFTB")
280 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
281 CALL get_dftb_atom_param(dftb_kind, name=aname)
282 CASE ("xTB")
283 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
284 CALL get_xtb_atom_param(xtb_kind, symbol=aname)
285 CASE DEFAULT
286 cpabort("unknown TB type")
287 END SELECT
288 ana = adjustr(trim(adjustl(aname)))
289 DO iatom = 1, nat
290 iat = atomic_kind_set(ikind)%atom_list(iatom)
291 WRITE (unit=unit_nr, &
292 fmt="(T2,I7,5X,A6,I6,T39,F12.6,T69,F12.6)") &
293 iat, adjustl(ana), ikind, charges(iat, 1), mcharge(iat)
294 END DO
295 END DO
296 WRITE (unit=unit_nr, &
297 fmt="(T2,A,T39,F12.6,T69,F12.6,/)") &
298 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
299 ELSE
300 WRITE (unit=unit_nr, fmt="(/,T2,A)") &
301 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
302 DO ikind = 1, nkind
303 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
304 aname = ""
305 SELECT CASE (tb_type)
306 CASE ("DFTB")
307 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
308 CALL get_dftb_atom_param(dftb_kind, name=aname)
309 CASE ("xTB")
310 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
311 CALL get_xtb_atom_param(xtb_kind, symbol=aname)
312 CASE DEFAULT
313 cpabort("unknown TB type")
314 END SELECT
315 ana = adjustr(trim(adjustl(aname)))
316 DO iatom = 1, nat
317 iat = atomic_kind_set(ikind)%atom_list(iatom)
318 WRITE (unit=unit_nr, &
319 fmt="(T2,I6,3X,A6,I6,T29,4(1X,F12.6))") &
320 iat, adjustl(ana), ikind, charges(iat, 1:2), mcharge(iat), &
321 charges(iat, 1) - charges(iat, 2)
322 END DO
323 END DO
324 WRITE (unit=unit_nr, &
325 fmt="(T2,A,T29,4(1X,F12.6),/)") &
326 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
327 END IF
328 CALL m_flush(unit_nr)
329 END IF
330 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
331 END IF
332
333 ! Compute the Lowdin charges
334 print_key => section_vals_get_subs_vals(print_section, "LOWDIN")
335 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
336 SELECT CASE (tb_type)
337 CASE ("DFTB")
338 cpwarn("Lowdin population analysis not implemented for DFTB method.")
339 CASE ("xTB")
340 unit_nr = cp_print_key_unit_nr(logger, print_section, "LOWDIN", extension=".lowdin", &
341 log_filename=.false.)
342 print_level = 1
343 CALL section_vals_val_get(print_key, "PRINT_GOP", l_val=print_it)
344 IF (print_it) print_level = 2
345 CALL section_vals_val_get(print_key, "PRINT_ALL", l_val=print_it)
346 IF (print_it) print_level = 3
347 IF (do_kpoints) THEN
348 cpwarn("Lowdin charges not implemented for k-point calculations!")
349 ELSE
350 CALL lowdin_population_analysis(qs_env, unit_nr, print_level)
351 END IF
352 CALL cp_print_key_finished_output(unit_nr, logger, print_section, "LOWDIN")
353 CASE DEFAULT
354 cpabort("unknown TB type")
355 END SELECT
356 END IF
357
358 ! EEQ Charges
359 print_key => section_vals_get_subs_vals(print_section, "EEQ_CHARGES")
360 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
361 unit_nr = cp_print_key_unit_nr(logger, print_section, "EEQ_CHARGES", &
362 extension=".eeq", log_filename=.false.)
363 CALL eeq_print(qs_env, unit_nr, print_level, ext=gfn0)
364 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
365 END IF
366
367 ! Hirshfeld
368 print_key => section_vals_get_subs_vals(print_section, "HIRSHFELD")
369 CALL section_vals_get(print_key, explicit=explicit)
370 IF (explicit) THEN
371 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
372 cpwarn("Hirshfeld charges not available for TB methods.")
373 END IF
374 END IF
375
376 ! MAO
377 print_key => section_vals_get_subs_vals(print_section, "MAO_ANALYSIS")
378 CALL section_vals_get(print_key, explicit=explicit)
379 IF (explicit) THEN
380 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
381 cpwarn("MAO analysis not available for TB methods.")
382 END IF
383 END IF
384
385 ! ED
386 print_key => section_vals_get_subs_vals(print_section, "ENERGY_DECOMPOSITION_ANALYSIS")
387 CALL section_vals_get(print_key, explicit=explicit)
388 IF (explicit) THEN
389 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
390 cpwarn("ED analysis not available for TB methods.")
391 END IF
392 END IF
393
394 ! Dipole Moments
395 print_key => section_vals_get_subs_vals(print_section, "MOMENTS")
396 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
397 unit_nr = cp_print_key_unit_nr(logger, print_section, "MOMENTS", &
398 extension=".data", middle_name="tb_dipole", log_filename=.false.)
399 moments_section => section_vals_get_subs_vals(print_section, "MOMENTS")
400 IF (gfn0) THEN
401 NULLIFY (echarge)
402 CALL get_qs_env(qs_env, eeq=echarge)
403 cpassert(ASSOCIATED(echarge))
404 IF (vdip) THEN
405 CALL build_xtb_qresp(qs_env, mcharge)
406 mcharge(1:natom) = echarge(1:natom) - mcharge(1:natom)
407 END IF
408 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
409 ELSE
410 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
411 END IF
412 CALL cp_print_key_finished_output(unit_nr, logger, print_key)
413 END IF
414
415 DEALLOCATE (charges, mcharge)
416
417 ! MO
418 IF (.NOT. no_mos) THEN
419 print_key => section_vals_get_subs_vals(print_section, "MO")
420 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
421 CALL qs_scf_write_mos(qs_env, scf_env, final_mos=.true.)
422 IF (.NOT. do_kpoints) THEN
423 SELECT CASE (tb_type)
424 CASE ("DFTB")
425 CASE ("xTB")
426 sprint_section => section_vals_get_subs_vals(dft_section, "PRINT%MO_MOLDEN")
427 CALL get_qs_env(qs_env, mos=mos)
428 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section)
429 CASE DEFAULT
430 cpabort("Unknown TB type")
431 END SELECT
432 END IF
433 END IF
434 END IF
435
436 ! Wavefunction mixing
437 IF (.NOT. no_mos) THEN
438 wfn_mix_section => section_vals_get_subs_vals(dft_section, "PRINT%WFN_MIX")
439 CALL section_vals_get(wfn_mix_section, explicit=explicit)
440 IF (explicit .AND. .NOT. qs_env%run_rtp) CALL wfn_mix_tb(qs_env, dft_section, scf_env)
441 END IF
442
443 IF (.NOT. no_mos) THEN
444 print_key => section_vals_get_subs_vals(print_section, "DOS")
445 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
446 IF (do_kpoints) THEN
447 CALL calculate_dos_kp(qs_env, dft_section)
448 ELSE
449 CALL get_qs_env(qs_env, mos=mos)
450 CALL calculate_dos(mos, dft_section)
451 END IF
452 END IF
453 END IF
454
455 ! PDOS
456 IF (.NOT. no_mos) THEN
457 print_key => section_vals_get_subs_vals(print_section, "PDOS")
458 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
459 IF (do_kpoints) THEN
460 cpwarn("Projected density of states not implemented for k-points.")
461 ELSE
462 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
463 DO ispin = 1, dft_control%nspins
464 IF (scf_env%method == ot_method_nr) THEN
465 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
466 eigenvalues=mo_eigenvalues)
467 IF (ASSOCIATED(qs_env%mo_derivs)) THEN
468 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
469 ELSE
470 mo_coeff_deriv => null()
471 END IF
472 CALL calculate_subspace_eigenvalues(mo_coeff, ks_rmpv(ispin)%matrix, mo_eigenvalues, &
473 do_rotation=.true., &
474 co_rotate_dbcsr=mo_coeff_deriv)
475 CALL set_mo_occupation(mo_set=mos(ispin))
476 END IF
477 IF (dft_control%nspins == 2) THEN
478 CALL calculate_projected_dos(mos(ispin), atomic_kind_set, &
479 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
480 ELSE
481 CALL calculate_projected_dos(mos(ispin), atomic_kind_set, &
482 qs_kind_set, particle_set, qs_env, dft_section)
483 END IF
484 END DO
485 END IF
486 END IF
487 END IF
488
489 ! can we do CUBE files?
490 SELECT CASE (tb_type)
491 CASE ("DFTB")
492 do_cube = .false.
493 rebuild = .false.
494 CASE ("xTB")
495 do_cube = .true.
496 rebuild = .true.
497 CASE DEFAULT
498 cpabort("unknown TB type")
499 END SELECT
500
501 ! Energy Windows for LS code
502 print_key => section_vals_get_subs_vals(print_section, "ENERGY_WINDOWS")
503 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
504 IF (do_cube) THEN
505 IF (do_kpoints) THEN
506 cpwarn("Energy Windows not implemented for k-points.")
507 ELSE
508 IF (rebuild) THEN
509 CALL rebuild_pw_env(qs_env)
510 rebuild = .false.
511 END IF
512 CALL energy_windows(qs_env)
513 END IF
514 ELSE
515 cpwarn("Energy Windows not implemented for TB methods.")
516 END IF
517 END IF
518
519 ! DENSITY CUBE FILE
520 print_key => section_vals_get_subs_vals(print_section, "E_DENSITY_CUBE")
521 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
522 IF (do_cube) THEN
523 IF (rebuild) THEN
524 CALL rebuild_pw_env(qs_env)
525 rebuild = .false.
526 END IF
527 CALL print_e_density(qs_env, zcharge, print_key)
528 ELSE
529 cpwarn("Electronic density cube file not implemented for TB methods.")
530 END IF
531 END IF
532
533 ! TOTAL DENSITY CUBE FILE
534 print_key => section_vals_get_subs_vals(print_section, "TOT_DENSITY_CUBE")
535 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
536 IF (do_cube) THEN
537 IF (rebuild) THEN
538 CALL rebuild_pw_env(qs_env)
539 rebuild = .false.
540 END IF
541 CALL print_density_cubes(qs_env, zcharge, print_key, total_density=.true.)
542 ELSE
543 cpwarn("Total density cube file not implemented for TB methods.")
544 END IF
545 END IF
546
547 ! V_Hartree CUBE FILE
548 print_key => section_vals_get_subs_vals(print_section, "V_HARTREE_CUBE")
549 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
550 IF (do_cube) THEN
551 IF (rebuild) THEN
552 CALL rebuild_pw_env(qs_env)
553 rebuild = .false.
554 END IF
555 CALL print_density_cubes(qs_env, zcharge, print_key, v_hartree=.true.)
556 ELSE
557 cpwarn("Hartree potential cube file not implemented for TB methods.")
558 END IF
559 END IF
560
561 ! EFIELD CUBE FILE
562 print_key => section_vals_get_subs_vals(print_section, "EFIELD_CUBE")
563 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
564 IF (do_cube) THEN
565 IF (rebuild) THEN
566 CALL rebuild_pw_env(qs_env)
567 rebuild = .false.
568 END IF
569 CALL print_density_cubes(qs_env, zcharge, print_key, efield=.true.)
570 ELSE
571 cpwarn("Efield cube file not implemented for TB methods.")
572 END IF
573 END IF
574
575 ! ELF
576 print_key => section_vals_get_subs_vals(print_section, "ELF_CUBE")
577 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
578 IF (do_cube) THEN
579 IF (rebuild) THEN
580 CALL rebuild_pw_env(qs_env)
581 rebuild = .false.
582 END IF
583 CALL print_elf(qs_env, zcharge, print_key)
584 ELSE
585 cpwarn("ELF not implemented for TB methods.")
586 END IF
587 END IF
588
589 ! MO CUBES
590 IF (.NOT. no_mos) THEN
591 print_key => section_vals_get_subs_vals(print_section, "MO_CUBES")
592 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
593 IF (do_cube) THEN
594 IF (rebuild) THEN
595 CALL rebuild_pw_env(qs_env)
596 rebuild = .false.
597 END IF
598 CALL print_mo_cubes(qs_env, zcharge, print_key)
599 ELSE
600 cpwarn("Printing of MO cube files not implemented for TB methods.")
601 END IF
602 END IF
603 END IF
604
605 ! STM
606 IF (.NOT. no_mos) THEN
607 print_key => section_vals_get_subs_vals(print_section, "STM")
608 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
609 IF (do_cube) THEN
610 IF (rebuild) THEN
611 CALL rebuild_pw_env(qs_env)
612 rebuild = .false.
613 END IF
614 IF (do_kpoints) THEN
615 cpwarn("STM not implemented for k-point calculations!")
616 ELSE
617 nlumo_stm = section_get_ival(print_key, "NLUMO")
618 cpassert(.NOT. dft_control%restricted)
619 CALL get_qs_env(qs_env, mos=mos, mo_derivs=mo_derivs, &
620 scf_control=scf_control, matrix_ks=ks_rmpv)
621 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
622 DO ispin = 1, dft_control%nspins
623 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
624 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
625 END DO
626 has_homo = .true.
627 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
628 IF (nlumo_stm > 0) THEN
629 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
630 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
631 CALL make_lumo_tb(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
632 nlumo_stm, nlumos)
633 END IF
634
635 CALL get_qs_env(qs_env, subsys=subsys)
636 CALL qs_subsys_get(subsys, particles=particles)
637 CALL th_stm_image(qs_env, print_key, particles, unoccupied_orbs_stm, &
638 unoccupied_evals_stm)
639
640 IF (nlumo_stm > 0) THEN
641 DO ispin = 1, dft_control%nspins
642 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
643 END DO
644 DEALLOCATE (unoccupied_evals_stm)
645 CALL cp_fm_release(unoccupied_orbs_stm)
646 END IF
647 END IF
648 END IF
649 END IF
650 END IF
651
652 ! Write the density matrix
653 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks)
654 CALL section_vals_val_get(print_section, "AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
655 IF (btest(cp_print_key_should_output(logger%iter_info, print_section, &
656 "AO_MATRICES/DENSITY"), cp_p_file)) THEN
657 iw = cp_print_key_unit_nr(logger, print_section, "AO_MATRICES/DENSITY", &
658 extension=".Log")
659 CALL section_vals_val_get(print_section, "AO_MATRICES%NDIGITS", i_val=after)
660 after = min(max(after, 1), 16)
661 DO ispin = 1, dft_control%nspins
662 DO img = 1, SIZE(matrix_p, 2)
663 CALL cp_dbcsr_write_sparse_matrix(matrix_p(ispin, img)%matrix, 4, after, qs_env, &
664 para_env, output_unit=iw, omit_headers=omit_headers)
665 END DO
666 END DO
667 CALL cp_print_key_finished_output(iw, logger, print_section, "AO_MATRICES/DENSITY")
668 END IF
669
670 ! The xTB matrix itself
671 IF (btest(cp_print_key_should_output(logger%iter_info, print_section, &
672 "AO_MATRICES/KOHN_SHAM_MATRIX"), cp_p_file)) THEN
673 iw = cp_print_key_unit_nr(logger, print_section, "AO_MATRICES/KOHN_SHAM_MATRIX", &
674 extension=".Log")
675 CALL section_vals_val_get(print_section, "AO_MATRICES%NDIGITS", i_val=after)
676 after = min(max(after, 1), 16)
677 DO ispin = 1, dft_control%nspins
678 DO img = 1, SIZE(matrix_ks, 2)
679 CALL cp_dbcsr_write_sparse_matrix(matrix_ks(ispin, img)%matrix, 4, after, qs_env, para_env, &
680 output_unit=iw, omit_headers=omit_headers)
681 END DO
682 END DO
683 CALL cp_print_key_finished_output(iw, logger, print_section, "AO_MATRICES/KOHN_SHAM_MATRIX")
684 END IF
685
686 ! these print keys are not supported in TB
687
688 ! V_XC CUBE FILE
689 print_key => section_vals_get_subs_vals(print_section, "V_XC_CUBE")
690 CALL section_vals_get(print_key, explicit=explicit)
691 IF (explicit) THEN
692 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
693 cpwarn("XC potential cube file not available for TB methods.")
694 END IF
695 END IF
696
697 ! Electric field gradients
698 print_key => section_vals_get_subs_vals(print_section, "ELECTRIC_FIELD_GRADIENT")
699 CALL section_vals_get(print_key, explicit=explicit)
700 IF (explicit) THEN
701 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
702 cpwarn("Electric field gradient not implemented for TB methods.")
703 END IF
704 END IF
705
706 ! KINETIC ENERGY
707 print_key => section_vals_get_subs_vals(print_section, "KINETIC_ENERGY")
708 CALL section_vals_get(print_key, explicit=explicit)
709 IF (explicit) THEN
710 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
711 cpwarn("Kinetic energy not available for TB methods.")
712 END IF
713 END IF
714
715 ! Xray diffraction spectrum
716 print_key => section_vals_get_subs_vals(print_section, "XRAY_DIFFRACTION_SPECTRUM")
717 CALL section_vals_get(print_key, explicit=explicit)
718 IF (explicit) THEN
719 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
720 cpwarn("Xray diffraction spectrum not implemented for TB methods.")
721 END IF
722 END IF
723
724 ! EPR Hyperfine Coupling
725 print_key => section_vals_get_subs_vals(print_section, "HYPERFINE_COUPLING_TENSOR")
726 CALL section_vals_get(print_key, explicit=explicit)
727 IF (explicit) THEN
728 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
729 cpwarn("Hyperfine Coupling not implemented for TB methods.")
730 END IF
731 END IF
732
733 ! PLUS_U
734 print_key => section_vals_get_subs_vals(print_section, "PLUS_U")
735 CALL section_vals_get(print_key, explicit=explicit)
736 IF (explicit) THEN
737 IF (btest(cp_print_key_should_output(logger%iter_info, print_key), cp_p_file)) THEN
738 cpwarn("DFT+U method not implemented for TB methods.")
739 END IF
740 END IF
741
742 CALL write_ks_matrix_csr(qs_env, qs_env%input)
743 CALL write_s_matrix_csr(qs_env, qs_env%input)
744 CALL write_hcore_matrix_csr(qs_env, qs_env%input)
745 CALL write_p_matrix_csr(qs_env, qs_env%input)
746
747 DEALLOCATE (zcharge)
748
749 CALL timestop(handle)
750
751 END SUBROUTINE scf_post_calculation_tb
752
753! **************************************************************************************************
754!> \brief ...
755!> \param qs_env ...
756!> \param input ...
757!> \param unit_nr ...
758!> \param charges ...
759! **************************************************************************************************
760 SUBROUTINE tb_dipole(qs_env, input, unit_nr, charges)
761
762 TYPE(qs_environment_type), POINTER :: qs_env
763 TYPE(section_vals_type), POINTER :: input
764 INTEGER, INTENT(in) :: unit_nr
765 REAL(kind=dp), DIMENSION(:), INTENT(in) :: charges
766
767 CHARACTER(LEN=default_string_length) :: description, dipole_type
768 COMPLEX(KIND=dp) :: dzeta, dzphase(3), zeta, zphase(3)
769 COMPLEX(KIND=dp), DIMENSION(3) :: dggamma, ggamma
770 INTEGER :: i, iat, ikind, j, nat, reference
771 LOGICAL :: do_berry
772 REAL(kind=dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
773 dtheta, gvec(3), q, rcc(3), ria(3), theta, tmp(3), via(3)
774 REAL(kind=dp), DIMENSION(:), POINTER :: ref_point
775 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
776 TYPE(cell_type), POINTER :: cell
777 TYPE(cp_result_type), POINTER :: results
778 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
779
780 NULLIFY (atomic_kind_set, cell, results)
781 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
782 particle_set=particle_set, cell=cell, results=results)
783
784 ! Reference point
785 reference = section_get_ival(input, keyword_name="REFERENCE")
786 NULLIFY (ref_point)
787 description = '[DIPOLE]'
788 CALL section_vals_val_get(input, "REF_POINT", r_vals=ref_point)
789 CALL section_vals_val_get(input, "PERIODIC", l_val=do_berry)
790
791 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
792
793 ! Dipole deriv will be the derivative of the Dipole(dM/dt=\sum e_j v_j)
794 dipole_deriv = 0.0_dp
795 dipole = 0.0_dp
796 IF (do_berry) THEN
797 dipole_type = "periodic (Berry phase)"
798 rcc = pbc(rcc, cell)
799 charge_tot = 0._dp
800 charge_tot = sum(charges)
801 ria = twopi*matmul(cell%h_inv, rcc)
802 zphase = cmplx(cos(ria), sin(ria), dp)**charge_tot
803
804 dria = twopi*matmul(cell%h_inv, drcc)
805 dzphase = charge_tot*cmplx(-sin(ria), cos(ria), dp)**(charge_tot - 1.0_dp)*dria
806
807 ggamma = z_one
808 dggamma = z_zero
809 DO ikind = 1, SIZE(atomic_kind_set)
810 CALL get_atomic_kind(atomic_kind_set(ikind), natom=nat)
811 DO i = 1, nat
812 iat = atomic_kind_set(ikind)%atom_list(i)
813 ria = particle_set(iat)%r(:)
814 ria = pbc(ria, cell)
815 via = particle_set(iat)%v(:)
816 q = charges(iat)
817 DO j = 1, 3
818 gvec = twopi*cell%h_inv(j, :)
819 theta = sum(ria(:)*gvec(:))
820 dtheta = sum(via(:)*gvec(:))
821 zeta = cmplx(cos(theta), sin(theta), kind=dp)**(-q)
822 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=dp)**(-q - 1.0_dp)*dtheta
823 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
824 ggamma(j) = ggamma(j)*zeta
825 END DO
826 END DO
827 END DO
828 dggamma = dggamma*zphase + ggamma*dzphase
829 ggamma = ggamma*zphase
830 IF (all(real(ggamma, kind=dp) /= 0.0_dp)) THEN
831 tmp = aimag(ggamma)/real(ggamma, kind=dp)
832 ci = -atan(tmp)
833 dci = -(1.0_dp/(1.0_dp + tmp**2))* &
834 (aimag(dggamma)*real(ggamma, kind=dp) - aimag(ggamma)*real(dggamma, kind=dp))/(real(ggamma, kind=dp))**2
835 dipole = matmul(cell%hmat, ci)/twopi
836 dipole_deriv = matmul(cell%hmat, dci)/twopi
837 END IF
838 ELSE
839 dipole_type = "non-periodic"
840 DO i = 1, SIZE(particle_set)
841 ! no pbc(particle_set(i)%r(:),cell) so that the total dipole is the sum of the molecular dipoles
842 ria = particle_set(i)%r(:)
843 q = charges(i)
844 dipole = dipole + q*(ria - rcc)
845 dipole_deriv(:) = dipole_deriv(:) + q*(particle_set(i)%v(:) - drcc)
846 END DO
847 END IF
848 CALL cp_results_erase(results=results, description=description)
849 CALL put_results(results=results, description=description, &
850 values=dipole(1:3))
851 IF (unit_nr > 0) THEN
852 WRITE (unit_nr, '(/,T2,A,T31,A50)') &
853 'TB_DIPOLE| Dipole type', adjustr(trim(dipole_type))
854 WRITE (unit_nr, "(T2,A,T30,3(1X,F16.8))") "TB_DIPOLE| Ref. Point [Bohr]", rcc
855 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
856 'TB_DIPOLE| Moment [a.u.]', dipole(1:3)
857 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
858 'TB_DIPOLE| Moment [Debye]', dipole(1:3)*debye
859 WRITE (unit_nr, '(T2,A,T30,3(1X,F16.8))') &
860 'TB_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
861 END IF
862
863 END SUBROUTINE tb_dipole
864
865! **************************************************************************************************
866!> \brief computes the MOs and calls the wavefunction mixing routine.
867!> \param qs_env ...
868!> \param dft_section ...
869!> \param scf_env ...
870!> \author Florian Schiffmann
871!> \note
872! **************************************************************************************************
873
874 SUBROUTINE wfn_mix_tb(qs_env, dft_section, scf_env)
875
876 TYPE(qs_environment_type), POINTER :: qs_env
877 TYPE(section_vals_type), POINTER :: dft_section
878 TYPE(qs_scf_env_type), POINTER :: scf_env
879
880 INTEGER :: ispin, nao, nmo, output_unit
881 REAL(dp), DIMENSION(:), POINTER :: mo_eigenvalues
882 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
883 TYPE(cp_fm_struct_type), POINTER :: ao_ao_fmstruct, ao_lumo_struct
884 TYPE(cp_fm_type) :: ks_tmp, mo_tmp, s_tmp, work
885 TYPE(cp_fm_type), DIMENSION(:), POINTER :: lumos
886 TYPE(cp_fm_type), POINTER :: mo_coeff
887 TYPE(cp_logger_type), POINTER :: logger
888 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
889 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
890 TYPE(mp_para_env_type), POINTER :: para_env
891 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
892 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
893 TYPE(section_vals_type), POINTER :: wfn_mix_section
894
895 logger => cp_get_default_logger()
896 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks, &
897 particle_set=particle_set, atomic_kind_set=atomic_kind_set, &
898 qs_kind_set=qs_kind_set, mos=mos, para_env=para_env)
899
900 wfn_mix_section => section_vals_get_subs_vals(dft_section, "PRINT%WFN_MIX")
901
902 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nao=nao)
903
904 CALL cp_fm_struct_create(fmstruct=ao_ao_fmstruct, nrow_global=nao, ncol_global=nao, &
905 template_fmstruct=mo_coeff%matrix_struct)
906 CALL cp_fm_create(s_tmp, matrix_struct=ao_ao_fmstruct)
907 CALL cp_fm_create(ks_tmp, matrix_struct=ao_ao_fmstruct)
908 CALL cp_fm_create(mo_tmp, matrix_struct=ao_ao_fmstruct)
909 CALL cp_fm_create(work, matrix_struct=ao_ao_fmstruct)
910 ALLOCATE (lumos(SIZE(mos)))
911
912 CALL copy_dbcsr_to_fm(matrix_s(1)%matrix, s_tmp)
913 CALL cp_fm_cholesky_decompose(s_tmp)
914
915 DO ispin = 1, SIZE(mos)
916 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, eigenvalues=mo_eigenvalues, nmo=nmo)
917 CALL cp_fm_struct_create(fmstruct=ao_lumo_struct, nrow_global=nao, ncol_global=nao - nmo, &
918 template_fmstruct=mo_coeff%matrix_struct)
919
920 CALL cp_fm_create(lumos(ispin), matrix_struct=ao_lumo_struct)
921 CALL copy_dbcsr_to_fm(matrix_ks(ispin)%matrix, ks_tmp)
922 CALL cp_fm_cholesky_reduce(ks_tmp, s_tmp)
923 CALL choose_eigv_solver(ks_tmp, work, mo_eigenvalues)
924 CALL cp_fm_cholesky_restore(work, nao, s_tmp, mo_tmp, "SOLVE")
925 CALL cp_fm_to_fm_submat(mo_tmp, mo_coeff, nao, nmo, 1, 1, 1, 1)
926 CALL cp_fm_to_fm_submat(mo_tmp, lumos(ispin), nao, nao - nmo, 1, nmo + 1, 1, 1)
927
928 CALL cp_fm_struct_release(ao_lumo_struct)
929 END DO
930
931 output_unit = cp_logger_get_default_io_unit(logger)
932 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
933 unoccupied_orbs=lumos, scf_env=scf_env, matrix_s=matrix_s)
934
935 CALL cp_fm_release(lumos)
936 CALL cp_fm_release(s_tmp)
937 CALL cp_fm_release(mo_tmp)
938 CALL cp_fm_release(ks_tmp)
939 CALL cp_fm_release(work)
940 CALL cp_fm_struct_release(ao_ao_fmstruct)
941
942 END SUBROUTINE wfn_mix_tb
943
944! **************************************************************************************************
945!> \brief Gets the lumos, and eigenvalues for the lumos
946!> \param qs_env ...
947!> \param scf_env ...
948!> \param unoccupied_orbs ...
949!> \param unoccupied_evals ...
950!> \param nlumo ...
951!> \param nlumos ...
952! **************************************************************************************************
953 SUBROUTINE make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
954
955 TYPE(qs_environment_type), POINTER :: qs_env
956 TYPE(qs_scf_env_type), POINTER :: scf_env
957 TYPE(cp_fm_type), DIMENSION(:), POINTER :: unoccupied_orbs
958 TYPE(cp_1d_r_p_type), DIMENSION(:), INTENT(INOUT) :: unoccupied_evals
959 INTEGER :: nlumo
960 INTEGER, INTENT(OUT) :: nlumos
961
962 INTEGER :: homo, iounit, ispin, n, nao, nmo
963 TYPE(cp_blacs_env_type), POINTER :: blacs_env
964 TYPE(cp_fm_struct_type), POINTER :: fm_struct_tmp
965 TYPE(cp_fm_type), POINTER :: mo_coeff
966 TYPE(cp_logger_type), POINTER :: logger
967 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, matrix_s
968 TYPE(dft_control_type), POINTER :: dft_control
969 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
970 TYPE(mp_para_env_type), POINTER :: para_env
971 TYPE(preconditioner_type), POINTER :: local_preconditioner
972 TYPE(scf_control_type), POINTER :: scf_control
973
974 NULLIFY (mos, ks_rmpv, scf_control, dft_control, para_env, blacs_env)
975 CALL get_qs_env(qs_env, &
976 mos=mos, &
977 matrix_ks=ks_rmpv, &
978 scf_control=scf_control, &
979 dft_control=dft_control, &
980 matrix_s=matrix_s, &
981 para_env=para_env, &
982 blacs_env=blacs_env)
983
984 logger => cp_get_default_logger()
985 iounit = cp_logger_get_default_io_unit(logger)
986
987 DO ispin = 1, dft_control%nspins
988 NULLIFY (unoccupied_evals(ispin)%array)
989 ! Always write eigenvalues
990 IF (iounit > 0) WRITE (iounit, *) " "
991 IF (iounit > 0) WRITE (iounit, *) " Lowest Eigenvalues of the unoccupied subspace spin ", ispin
992 IF (iounit > 0) WRITE (iounit, fmt='(1X,A)') "-----------------------------------------------------"
993 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
994 CALL cp_fm_get_info(mo_coeff, nrow_global=n)
995 nlumos = max(1, min(nlumo, nao - nmo))
996 IF (nlumo == -1) nlumos = nao - nmo
997 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
998 CALL cp_fm_struct_create(fm_struct_tmp, para_env=para_env, context=blacs_env, &
999 nrow_global=n, ncol_global=nlumos)
1000 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name="lumos")
1001 CALL cp_fm_struct_release(fm_struct_tmp)
1002 CALL cp_fm_init_random(unoccupied_orbs(ispin), nlumos)
1003
1004 ! the full_all preconditioner makes not much sense for lumos search
1005 NULLIFY (local_preconditioner)
1006 IF (ASSOCIATED(scf_env%ot_preconditioner)) THEN
1007 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1008 ! this one can for sure not be right (as it has to match a given C0)
1009 IF (local_preconditioner%in_use == ot_precond_full_all) THEN
1010 NULLIFY (local_preconditioner)
1011 END IF
1012 END IF
1013
1014 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1015 matrix_c_fm=unoccupied_orbs(ispin), &
1016 matrix_orthogonal_space_fm=mo_coeff, &
1017 eps_gradient=scf_control%eps_lumos, &
1018 preconditioner=local_preconditioner, &
1019 iter_max=scf_control%max_iter_lumos, &
1020 size_ortho_space=nmo)
1021
1022 CALL calculate_subspace_eigenvalues(unoccupied_orbs(ispin), ks_rmpv(ispin)%matrix, &
1023 unoccupied_evals(ispin)%array, scr=iounit, &
1024 ionode=iounit > 0)
1025
1026 END DO
1027
1028 END SUBROUTINE make_lumo_tb
1029
1030! **************************************************************************************************
1031!> \brief ...
1032!> \param qs_env ...
1033! **************************************************************************************************
1034 SUBROUTINE rebuild_pw_env(qs_env)
1035
1036 TYPE(qs_environment_type), POINTER :: qs_env
1037
1038 LOGICAL :: skip_load_balance_distributed
1039 TYPE(cell_type), POINTER :: cell
1040 TYPE(dft_control_type), POINTER :: dft_control
1041 TYPE(pw_env_type), POINTER :: new_pw_env
1042 TYPE(qs_ks_env_type), POINTER :: ks_env
1043 TYPE(qs_rho_type), POINTER :: rho
1044 TYPE(task_list_type), POINTER :: task_list
1045
1046 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=new_pw_env)
1047 IF (.NOT. ASSOCIATED(new_pw_env)) THEN
1048 CALL pw_env_create(new_pw_env)
1049 CALL set_ks_env(ks_env, pw_env=new_pw_env)
1050 CALL pw_env_release(new_pw_env)
1051 END IF
1052 CALL get_qs_env(qs_env, pw_env=new_pw_env, dft_control=dft_control, cell=cell)
1053
1054 new_pw_env%cell_hmat = cell%hmat
1055 CALL pw_env_rebuild(new_pw_env, qs_env=qs_env)
1056
1057 NULLIFY (task_list)
1058 CALL get_ks_env(ks_env, task_list=task_list)
1059 IF (.NOT. ASSOCIATED(task_list)) THEN
1060 CALL allocate_task_list(task_list)
1061 CALL set_ks_env(ks_env, task_list=task_list)
1062 END IF
1063 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
1064 CALL generate_qs_task_list(ks_env, task_list, basis_type="ORB", &
1065 reorder_rs_grid_ranks=.true., &
1066 skip_load_balance_distributed=skip_load_balance_distributed)
1067 CALL get_qs_env(qs_env, rho=rho)
1068 CALL qs_rho_rebuild(rho, qs_env=qs_env, rebuild_ao=.false., rebuild_grids=.true.)
1069
1070 END SUBROUTINE rebuild_pw_env
1071
1072! **************************************************************************************************
1073!> \brief ...
1074!> \param qs_env ...
1075!> \param zcharge ...
1076!> \param cube_section ...
1077! **************************************************************************************************
1078 SUBROUTINE print_e_density(qs_env, zcharge, cube_section)
1079
1080 TYPE(qs_environment_type), POINTER :: qs_env
1081 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1082 TYPE(section_vals_type), POINTER :: cube_section
1083
1084 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1085 INTEGER :: iounit, ispin, unit_nr
1086 LOGICAL :: append_cube, mpi_io
1087 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho_r
1088 TYPE(cp_logger_type), POINTER :: logger
1089 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
1090 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1091 TYPE(dft_control_type), POINTER :: dft_control
1092 TYPE(particle_list_type), POINTER :: particles
1093 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
1094 TYPE(pw_env_type), POINTER :: pw_env
1095 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1096 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1097 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
1098 TYPE(qs_ks_env_type), POINTER :: ks_env
1099 TYPE(qs_rho_type), POINTER :: rho
1100 TYPE(qs_subsys_type), POINTER :: subsys
1101
1102 CALL get_qs_env(qs_env, dft_control=dft_control)
1103
1104 append_cube = section_get_lval(cube_section, "APPEND")
1105 my_pos_cube = "REWIND"
1106 IF (append_cube) my_pos_cube = "APPEND"
1107
1108 logger => cp_get_default_logger()
1109 iounit = cp_logger_get_default_io_unit(logger)
1110
1111 ! we need to construct the density on a realspace grid
1112 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1113 NULLIFY (rho_r, rho_g, tot_rho_r)
1114 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1115 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1116 DO ispin = 1, dft_control%nspins
1117 rho_ao => rho_ao_kp(ispin, :)
1118 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1119 rho=rho_r(ispin), &
1120 rho_gspace=rho_g(ispin), &
1121 total_rho=tot_rho_r(ispin), &
1122 ks_env=ks_env)
1123 END DO
1124 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1125
1126 CALL get_qs_env(qs_env, subsys=subsys)
1127 CALL qs_subsys_get(subsys, particles=particles)
1128
1129 IF (dft_control%nspins > 1) THEN
1130 IF (iounit > 0) THEN
1131 WRITE (unit=iounit, fmt="(/,T2,A,T51,2F15.6)") &
1132 "Integrated alpha and beta electronic density:", tot_rho_r(1:2)
1133 END IF
1134 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1135 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1136 block
1137 TYPE(pw_r3d_rs_type) :: rho_elec_rspace
1138 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
1139 CALL pw_copy(rho_r(1), rho_elec_rspace)
1140 CALL pw_axpy(rho_r(2), rho_elec_rspace)
1141 filename = "ELECTRON_DENSITY"
1142 mpi_io = .true.
1143 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1144 extension=".cube", middle_name=trim(filename), &
1145 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1146 fout=mpi_filename)
1147 IF (iounit > 0) THEN
1148 IF (.NOT. mpi_io) THEN
1149 INQUIRE (unit=unit_nr, name=filename)
1150 ELSE
1151 filename = mpi_filename
1152 END IF
1153 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1154 "The sum of alpha and beta density is written in cube file format to the file:", adjustr(trim(filename))
1155 END IF
1156 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr, "SUM OF ALPHA AND BETA DENSITY", &
1157 particles=particles, zeff=zcharge, stride=section_get_ivals(cube_section, "STRIDE"), &
1158 mpi_io=mpi_io)
1159 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1160 CALL pw_copy(rho_r(1), rho_elec_rspace)
1161 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
1162 filename = "SPIN_DENSITY"
1163 mpi_io = .true.
1164 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1165 extension=".cube", middle_name=trim(filename), &
1166 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1167 fout=mpi_filename)
1168 IF (iounit > 0) THEN
1169 IF (.NOT. mpi_io) THEN
1170 INQUIRE (unit=unit_nr, name=filename)
1171 ELSE
1172 filename = mpi_filename
1173 END IF
1174 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1175 "The spin density is written in cube file format to the file:", adjustr(trim(filename))
1176 END IF
1177 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr, "SPIN DENSITY", &
1178 particles=particles, zeff=zcharge, &
1179 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1180 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1181 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
1182 END block
1183 ELSE
1184 IF (iounit > 0) THEN
1185 WRITE (unit=iounit, fmt="(/,T2,A,T66,F15.6)") &
1186 "Integrated electronic density:", tot_rho_r(1)
1187 END IF
1188 filename = "ELECTRON_DENSITY"
1189 mpi_io = .true.
1190 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1191 extension=".cube", middle_name=trim(filename), &
1192 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1193 fout=mpi_filename)
1194 IF (iounit > 0) THEN
1195 IF (.NOT. mpi_io) THEN
1196 INQUIRE (unit=unit_nr, name=filename)
1197 ELSE
1198 filename = mpi_filename
1199 END IF
1200 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1201 "The electron density is written in cube file format to the file:", adjustr(trim(filename))
1202 END IF
1203 CALL cp_pw_to_cube(rho_r(1), unit_nr, "ELECTRON DENSITY", &
1204 particles=particles, zeff=zcharge, &
1205 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1206 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1207 END IF ! nspins
1208
1209 END SUBROUTINE print_e_density
1210! **************************************************************************************************
1211!> \brief ...
1212!> \param qs_env ...
1213!> \param zcharge ...
1214!> \param cube_section ...
1215!> \param total_density ...
1216!> \param v_hartree ...
1217!> \param efield ...
1218! **************************************************************************************************
1219 SUBROUTINE print_density_cubes(qs_env, zcharge, cube_section, total_density, v_hartree, efield)
1220
1221 TYPE(qs_environment_type), POINTER :: qs_env
1222 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1223 TYPE(section_vals_type), POINTER :: cube_section
1224 LOGICAL, INTENT(IN), OPTIONAL :: total_density, v_hartree, efield
1225
1226 CHARACTER(len=1), DIMENSION(3), PARAMETER :: cdir = ["x", "y", "z"]
1227
1228 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1229 INTEGER :: id, iounit, ispin, nd(3), unit_nr
1230 LOGICAL :: append_cube, mpi_io, my_efield, &
1231 my_total_density, my_v_hartree
1232 REAL(kind=dp) :: total_rho_core_rspace, udvol
1233 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho_r
1234 TYPE(cell_type), POINTER :: cell
1235 TYPE(cp_logger_type), POINTER :: logger
1236 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
1237 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1238 TYPE(dft_control_type), POINTER :: dft_control
1239 TYPE(particle_list_type), POINTER :: particles
1240 TYPE(pw_c1d_gs_type) :: rho_core
1241 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
1242 TYPE(pw_env_type), POINTER :: pw_env
1243 TYPE(pw_poisson_parameter_type) :: poisson_params
1244 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1245 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1246 TYPE(pw_r3d_rs_type) :: rho_tot_rspace
1247 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
1248 TYPE(qs_ks_env_type), POINTER :: ks_env
1249 TYPE(qs_rho_type), POINTER :: rho
1250 TYPE(qs_subsys_type), POINTER :: subsys
1251
1252 CALL get_qs_env(qs_env, cell=cell, dft_control=dft_control)
1253
1254 append_cube = section_get_lval(cube_section, "APPEND")
1255 my_pos_cube = "REWIND"
1256 IF (append_cube) my_pos_cube = "APPEND"
1257
1258 IF (PRESENT(total_density)) THEN
1259 my_total_density = total_density
1260 ELSE
1261 my_total_density = .false.
1262 END IF
1263 IF (PRESENT(v_hartree)) THEN
1264 my_v_hartree = v_hartree
1265 ELSE
1266 my_v_hartree = .false.
1267 END IF
1268 IF (PRESENT(efield)) THEN
1269 my_efield = efield
1270 ELSE
1271 my_efield = .false.
1272 END IF
1273
1274 logger => cp_get_default_logger()
1275 iounit = cp_logger_get_default_io_unit(logger)
1276
1277 ! we need to construct the density on a realspace grid
1278 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1279 NULLIFY (rho_r, rho_g, tot_rho_r)
1280 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1281 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1282 DO ispin = 1, dft_control%nspins
1283 rho_ao => rho_ao_kp(ispin, :)
1284 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1285 rho=rho_r(ispin), &
1286 rho_gspace=rho_g(ispin), &
1287 total_rho=tot_rho_r(ispin), &
1288 ks_env=ks_env)
1289 END DO
1290 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1291
1292 CALL get_qs_env(qs_env, subsys=subsys)
1293 CALL qs_subsys_get(subsys, particles=particles)
1294
1295 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1296 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1297 CALL auxbas_pw_pool%create_pw(pw=rho_core)
1298 CALL calculate_rho_core(rho_core, total_rho_core_rspace, qs_env)
1299
1300 IF (iounit > 0) THEN
1301 WRITE (unit=iounit, fmt="(/,T2,A,T66,F15.6)") &
1302 "Integrated electronic density:", sum(tot_rho_r(:))
1303 WRITE (unit=iounit, fmt="(T2,A,T66,F15.6)") &
1304 "Integrated core density:", total_rho_core_rspace
1305 END IF
1306
1307 CALL auxbas_pw_pool%create_pw(pw=rho_tot_rspace)
1308 CALL pw_transfer(rho_core, rho_tot_rspace)
1309 DO ispin = 1, dft_control%nspins
1310 CALL pw_axpy(rho_r(ispin), rho_tot_rspace)
1311 END DO
1312
1313 IF (my_total_density) THEN
1314 filename = "TOTAL_DENSITY"
1315 mpi_io = .true.
1316 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1317 extension=".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1318 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1319 IF (iounit > 0) THEN
1320 IF (.NOT. mpi_io) THEN
1321 INQUIRE (unit=unit_nr, name=filename)
1322 ELSE
1323 filename = mpi_filename
1324 END IF
1325 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1326 "The total density is written in cube file format to the file:", adjustr(trim(filename))
1327 END IF
1328 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr, "TOTAL DENSITY", &
1329 particles=particles, zeff=zcharge, &
1330 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1331 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1332 END IF
1333 IF (my_v_hartree .OR. my_efield) THEN
1334 block
1335 TYPE(pw_c1d_gs_type) :: rho_tot_gspace
1336 CALL auxbas_pw_pool%create_pw(pw=rho_tot_gspace)
1337 CALL pw_transfer(rho_tot_rspace, rho_tot_gspace)
1338 poisson_params%solver = pw_poisson_analytic
1339 poisson_params%periodic = cell%perd
1340 poisson_params%ewald_type = do_ewald_none
1341 block
1342 TYPE(greens_fn_type) :: green_fft
1343 TYPE(pw_grid_type), POINTER :: pwdummy
1344 NULLIFY (pwdummy)
1345 CALL pw_green_create(green_fft, poisson_params, cell%hmat, auxbas_pw_pool, pwdummy, pwdummy)
1346 rho_tot_gspace%array(:) = rho_tot_gspace%array(:)*green_fft%influence_fn%array(:)
1347 CALL pw_green_release(green_fft, auxbas_pw_pool)
1348 END block
1349 IF (my_v_hartree) THEN
1350 block
1351 TYPE(pw_r3d_rs_type) :: vhartree
1352 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1353 CALL pw_transfer(rho_tot_gspace, vhartree)
1354 filename = "V_HARTREE"
1355 mpi_io = .true.
1356 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1357 extension=".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1358 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1359 IF (iounit > 0) THEN
1360 IF (.NOT. mpi_io) THEN
1361 INQUIRE (unit=unit_nr, name=filename)
1362 ELSE
1363 filename = mpi_filename
1364 END IF
1365 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1366 "The Hartree potential is written in cube file format to the file:", adjustr(trim(filename))
1367 END IF
1368 CALL cp_pw_to_cube(vhartree, unit_nr, "Hartree Potential", &
1369 particles=particles, zeff=zcharge, &
1370 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1371 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1372 CALL auxbas_pw_pool%give_back_pw(vhartree)
1373 END block
1374 END IF
1375 IF (my_efield) THEN
1376 block
1377 TYPE(pw_c1d_gs_type) :: vhartree
1378 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1379 udvol = 1.0_dp/rho_tot_rspace%pw_grid%dvol
1380 DO id = 1, 3
1381 CALL pw_transfer(rho_tot_gspace, vhartree)
1382 nd = 0
1383 nd(id) = 1
1384 CALL pw_derive(vhartree, nd)
1385 CALL pw_transfer(vhartree, rho_tot_rspace)
1386 CALL pw_scale(rho_tot_rspace, udvol)
1387
1388 filename = "EFIELD_"//cdir(id)
1389 mpi_io = .true.
1390 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', &
1391 extension=".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1392 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1393 IF (iounit > 0) THEN
1394 IF (.NOT. mpi_io) THEN
1395 INQUIRE (unit=unit_nr, name=filename)
1396 ELSE
1397 filename = mpi_filename
1398 END IF
1399 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1400 "The Efield is written in cube file format to the file:", adjustr(trim(filename))
1401 END IF
1402 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr, "EFIELD "//cdir(id), &
1403 particles=particles, zeff=zcharge, &
1404 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1405 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1406 END DO
1407 CALL auxbas_pw_pool%give_back_pw(vhartree)
1408 END block
1409 END IF
1410 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1411 END block
1412 END IF
1413
1414 CALL auxbas_pw_pool%give_back_pw(rho_tot_rspace)
1415 CALL auxbas_pw_pool%give_back_pw(rho_core)
1416
1417 END SUBROUTINE print_density_cubes
1418
1419! **************************************************************************************************
1420!> \brief ...
1421!> \param qs_env ...
1422!> \param zcharge ...
1423!> \param elf_section ...
1424! **************************************************************************************************
1425 SUBROUTINE print_elf(qs_env, zcharge, elf_section)
1426
1427 TYPE(qs_environment_type), POINTER :: qs_env
1428 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1429 TYPE(section_vals_type), POINTER :: elf_section
1430
1431 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1432 title
1433 INTEGER :: iounit, ispin, unit_nr
1434 LOGICAL :: append_cube, mpi_io
1435 REAL(kind=dp) :: rho_cutoff
1436 REAL(kind=dp), DIMENSION(:), POINTER :: tot_rho_r
1437 TYPE(cp_logger_type), POINTER :: logger
1438 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
1439 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
1440 TYPE(dft_control_type), POINTER :: dft_control
1441 TYPE(particle_list_type), POINTER :: particles
1442 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
1443 TYPE(pw_env_type), POINTER :: pw_env
1444 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1445 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1446 TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:) :: elf_r
1447 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r
1448 TYPE(qs_ks_env_type), POINTER :: ks_env
1449 TYPE(qs_rho_type), POINTER :: rho
1450 TYPE(qs_subsys_type), POINTER :: subsys
1451
1452 logger => cp_get_default_logger()
1453 iounit = cp_logger_get_default_io_unit(logger)
1454
1455 ! we need to construct the density on a realspace grid
1456 CALL get_qs_env(qs_env, dft_control=dft_control, ks_env=ks_env, rho=rho)
1457 NULLIFY (rho_r, rho_g, tot_rho_r)
1458 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1459 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1460 DO ispin = 1, dft_control%nspins
1461 rho_ao => rho_ao_kp(ispin, :)
1462 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1463 rho=rho_r(ispin), &
1464 rho_gspace=rho_g(ispin), &
1465 total_rho=tot_rho_r(ispin), &
1466 ks_env=ks_env)
1467 END DO
1468 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1469
1470 CALL get_qs_env(qs_env, subsys=subsys)
1471 CALL qs_subsys_get(subsys, particles=particles)
1472
1473 ALLOCATE (elf_r(dft_control%nspins))
1474 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1475 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1476 DO ispin = 1, dft_control%nspins
1477 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1478 CALL pw_zero(elf_r(ispin))
1479 END DO
1480
1481 IF (iounit > 0) THEN
1482 WRITE (unit=iounit, fmt="(/,T2,A)") &
1483 "ELF is computed on the real space grid -----"
1484 END IF
1485 rho_cutoff = section_get_rval(elf_section, "density_cutoff")
1486 CALL qs_elf_calc(qs_env, elf_r, rho_cutoff)
1487
1488 ! write ELF into cube file
1489 append_cube = section_get_lval(elf_section, "APPEND")
1490 my_pos_cube = "REWIND"
1491 IF (append_cube) my_pos_cube = "APPEND"
1492 DO ispin = 1, dft_control%nspins
1493 WRITE (filename, '(a5,I1.1)') "ELF_S", ispin
1494 WRITE (title, *) "ELF spin ", ispin
1495 mpi_io = .true.
1496 unit_nr = cp_print_key_unit_nr(logger, elf_section, '', extension=".cube", &
1497 middle_name=trim(filename), file_position=my_pos_cube, &
1498 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1499 IF (iounit > 0) THEN
1500 IF (.NOT. mpi_io) THEN
1501 INQUIRE (unit=unit_nr, name=filename)
1502 ELSE
1503 filename = mpi_filename
1504 END IF
1505 WRITE (unit=iounit, fmt="(T2,A,/,T2,A79)") &
1506 "ELF is written in cube file format to the file:", adjustr(trim(filename))
1507 END IF
1508
1509 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
1510 stride=section_get_ivals(elf_section, "STRIDE"), mpi_io=mpi_io)
1511 CALL cp_print_key_finished_output(unit_nr, logger, elf_section, '', mpi_io=mpi_io)
1512
1513 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1514 END DO
1515
1516 DEALLOCATE (elf_r)
1517
1518 END SUBROUTINE print_elf
1519! **************************************************************************************************
1520!> \brief ...
1521!> \param qs_env ...
1522!> \param zcharge ...
1523!> \param cube_section ...
1524! **************************************************************************************************
1525 SUBROUTINE print_mo_cubes(qs_env, zcharge, cube_section)
1526
1527 TYPE(qs_environment_type), POINTER :: qs_env
1528 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: zcharge
1529 TYPE(section_vals_type), POINTER :: cube_section
1530
1531 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1532 INTEGER :: homo, i, ifirst, ilast, iounit, ir, &
1533 ispin, ivector, n_rep, nhomo, nlist, &
1534 nlumo, nmo, shomo, unit_nr
1535 INTEGER, DIMENSION(:), POINTER :: list, list_index
1536 LOGICAL :: append_cube, mpi_io, write_cube
1537 REAL(kind=dp) :: homo_lumo(2, 2)
1538 REAL(kind=dp), DIMENSION(:), POINTER :: mo_eigenvalues
1539 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1540 TYPE(cell_type), POINTER :: cell
1541 TYPE(cp_fm_type), POINTER :: mo_coeff
1542 TYPE(cp_logger_type), POINTER :: logger
1543 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_rmpv, mo_derivs
1544 TYPE(dft_control_type), POINTER :: dft_control
1545 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
1546 TYPE(particle_list_type), POINTER :: particles
1547 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1548 TYPE(pw_c1d_gs_type) :: wf_g
1549 TYPE(pw_env_type), POINTER :: pw_env
1550 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
1551 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
1552 TYPE(pw_r3d_rs_type) :: wf_r
1553 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1554 TYPE(qs_subsys_type), POINTER :: subsys
1555 TYPE(scf_control_type), POINTER :: scf_control
1556
1557 logger => cp_get_default_logger()
1558 iounit = cp_logger_get_default_io_unit(logger)
1559
1560 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv, scf_control=scf_control)
1561 CALL get_qs_env(qs_env, dft_control=dft_control, mo_derivs=mo_derivs)
1562 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
1563 NULLIFY (mo_eigenvalues)
1564 homo = 0
1565 DO ispin = 1, dft_control%nspins
1566 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=shomo)
1567 homo_lumo(ispin, 1) = mo_eigenvalues(shomo)
1568 homo = max(homo, shomo)
1569 END DO
1570 write_cube = section_get_lval(cube_section, "WRITE_CUBE")
1571 nlumo = section_get_ival(cube_section, "NLUMO")
1572 nhomo = section_get_ival(cube_section, "NHOMO")
1573 NULLIFY (list_index)
1574 CALL section_vals_val_get(cube_section, "HOMO_LIST", n_rep_val=n_rep)
1575 IF (n_rep > 0) THEN
1576 nlist = 0
1577 DO ir = 1, n_rep
1578 NULLIFY (list)
1579 CALL section_vals_val_get(cube_section, "HOMO_LIST", i_rep_val=ir, i_vals=list)
1580 IF (ASSOCIATED(list)) THEN
1581 CALL reallocate(list_index, 1, nlist + SIZE(list))
1582 DO i = 1, SIZE(list)
1583 list_index(i + nlist) = list(i)
1584 END DO
1585 nlist = nlist + SIZE(list)
1586 END IF
1587 END DO
1588 nhomo = maxval(list_index)
1589 ELSE
1590 IF (nhomo == -1) nhomo = homo
1591 nlist = homo - max(1, homo - nhomo + 1) + 1
1592 ALLOCATE (list_index(nlist))
1593 DO i = 1, nlist
1594 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1595 END DO
1596 END IF
1597
1598 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1599 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1600 CALL auxbas_pw_pool%create_pw(wf_r)
1601 CALL auxbas_pw_pool%create_pw(wf_g)
1602
1603 CALL get_qs_env(qs_env, subsys=subsys)
1604 CALL qs_subsys_get(subsys, particles=particles)
1605
1606 append_cube = section_get_lval(cube_section, "APPEND")
1607 my_pos_cube = "REWIND"
1608 IF (append_cube) THEN
1609 my_pos_cube = "APPEND"
1610 END IF
1611
1612 CALL get_qs_env(qs_env=qs_env, &
1613 atomic_kind_set=atomic_kind_set, &
1614 qs_kind_set=qs_kind_set, &
1615 cell=cell, &
1616 particle_set=particle_set)
1617
1618 IF (nhomo >= 0) THEN
1619 DO ispin = 1, dft_control%nspins
1620 ! Prints the cube files of OCCUPIED ORBITALS
1621 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1622 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1623 IF (write_cube) THEN
1624 DO i = 1, nlist
1625 ivector = list_index(i)
1626 IF (ivector > homo) cycle
1627 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1628 cell, dft_control, particle_set, pw_env)
1629 WRITE (filename, '(a4,I5.5,a1,I1.1)') "WFN_", ivector, "_", ispin
1630 mpi_io = .true.
1631 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', extension=".cube", &
1632 middle_name=trim(filename), file_position=my_pos_cube, &
1633 log_filename=.false., mpi_io=mpi_io)
1634 WRITE (title, *) "WAVEFUNCTION ", ivector, " spin ", ispin, " i.e. HOMO - ", ivector - homo
1635 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1636 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1637 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1638 END DO
1639 END IF
1640 END DO
1641 END IF
1642
1643 IF (nlumo /= 0) THEN
1644 DO ispin = 1, dft_control%nspins
1645 ! Prints the cube files of UNOCCUPIED ORBITALS
1646 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1647 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1648 IF (write_cube) THEN
1649 ifirst = homo + 1
1650 IF (nlumo == -1) THEN
1651 ilast = nmo
1652 ELSE
1653 ilast = ifirst + nlumo - 1
1654 ilast = min(nmo, ilast)
1655 END IF
1656 DO ivector = ifirst, ilast
1657 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, &
1658 qs_kind_set, cell, dft_control, particle_set, pw_env)
1659 WRITE (filename, '(a4,I5.5,a1,I1.1)') "WFN_", ivector, "_", ispin
1660 mpi_io = .true.
1661 unit_nr = cp_print_key_unit_nr(logger, cube_section, '', extension=".cube", &
1662 middle_name=trim(filename), file_position=my_pos_cube, &
1663 log_filename=.false., mpi_io=mpi_io)
1664 WRITE (title, *) "WAVEFUNCTION ", ivector, " spin ", ispin, " i.e. LUMO + ", ivector - ifirst
1665 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1666 stride=section_get_ivals(cube_section, "STRIDE"), mpi_io=mpi_io)
1667 CALL cp_print_key_finished_output(unit_nr, logger, cube_section, '', mpi_io=mpi_io)
1668 END DO
1669 END IF
1670 END DO
1671 END IF
1672
1673 CALL auxbas_pw_pool%give_back_pw(wf_g)
1674 CALL auxbas_pw_pool%give_back_pw(wf_r)
1675 IF (ASSOCIATED(list_index)) DEALLOCATE (list_index)
1676
1677 END SUBROUTINE print_mo_cubes
1678
1679! **************************************************************************************************
1680
1681END 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:234
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:124
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)
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, 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, 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, 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, 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, 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)
...
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.