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