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