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