24 dbcsr_type_antisymmetric, dbcsr_type_no_symmetry
104#include "../base/base_uses.f90"
110 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rt_propagation_output'
136 INTEGER,
INTENT(in) :: run_type
137 REAL(
dp),
INTENT(in),
OPTIONAL :: delta_iter, used_time
139 INTEGER :: i, n_electrons, n_proj, natom, nspin, &
140 output_unit, spin, unit_nr
141 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: first_sgf, last_sgf
142 INTEGER,
DIMENSION(2) :: nelectron_spin
143 INTEGER,
DIMENSION(:),
POINTER :: row_blk_sizes
145 REAL(
dp) :: orthonormality, strace, tot_rho_r, trace
146 REAL(kind=
dp),
DIMENSION(3) :: field, reference_point
147 REAL(kind=
dp),
DIMENSION(:),
POINTER :: qs_tot_rho_r
148 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: j_int
150 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mos_new
153 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s, p_im, p_xyz, rho_new
157 POINTER :: sab_all, sab_orb
159 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
164 NULLIFY (logger, dft_control)
172 particle_set=particle_set, &
173 atomic_kind_set=atomic_kind_set, &
174 qs_kind_set=qs_kind_set, &
175 dft_control=dft_control, sab_all=sab_all, sab_orb=sab_orb, &
176 dbcsr_dist=dbcsr_dist, nelectron_spin=nelectron_spin)
181 n_electrons = n_electrons - dft_control%charge
183 CALL qs_rho_get(rho_struct=rho, tot_rho_r=qs_tot_rho_r)
190 IF (output_unit > 0)
THEN
191 WRITE (output_unit, fmt=
"(/,(T3,A,T40,I5))") &
192 "Information at iteration step:", rtp%iter
193 WRITE (unit=output_unit, fmt=
"((T3,A,T41,2F20.10))") &
194 "Total electronic density (r-space): ", &
197 REAL(n_electrons,
dp)
198 WRITE (unit=output_unit, fmt=
"((T3,A,T59,F22.14))") &
199 "Total energy:", rtp%energy_new
201 WRITE (unit=output_unit, fmt=
"((T3,A,T61,F20.14))") &
202 "Energy difference to previous iteration step:", rtp%energy_new - rtp%energy_old
205 WRITE (unit=output_unit, fmt=
"((T3,A,T61,F20.14))") &
206 "Energy difference to initial state:", rtp%energy_new - rtp%energy_old
208 IF (
PRESENT(delta_iter))
THEN
209 WRITE (unit=output_unit, fmt=
"((T3,A,T61,E20.6))") &
210 "Convergence:", delta_iter
212 IF (rtp%converged)
THEN
214 WRITE (unit=output_unit, fmt=
"((T3,A,T61,F12.2))") &
215 "Time needed for propagation:", used_time
217 WRITE (unit=output_unit, fmt=
"(/,(T3,A,3X,F16.14))") &
218 "CONVERGENCE REACHED", rtp%energy_new - rtp%energy_old
222 IF (rtp%converged)
THEN
223 IF (.NOT. rtp%linear_scaling)
THEN
224 CALL get_rtp(rtp=rtp, mos_new=mos_new)
225 CALL rt_calculate_orthonormality(orthonormality, &
226 mos_new, matrix_s(1)%matrix)
227 IF (output_unit > 0)
THEN
228 WRITE (output_unit, fmt=
"(/,(T3,A,T60,F20.10))") &
229 "Max deviation from orthonormalization:", orthonormality
234 IF (output_unit > 0)
THEN
238 "PRINT%PROGRAM_RUN_INFO")
240 IF (rtp%converged)
THEN
243 dft_section,
"REAL_TIME_PROPAGATION%PRINT%FIELD"),
cp_p_file))
THEN
244 CALL print_field_applied(qs_env, dft_section)
246 CALL make_moment(qs_env)
248 dft_section,
"REAL_TIME_PROPAGATION%PRINT%E_CONSTITUENTS"),
cp_p_file))
THEN
249 CALL print_rtp_energy_components(qs_env, dft_section)
251 IF (.NOT. dft_control%qs_control%dftb)
THEN
252 CALL write_available_results(qs_env=qs_env, rtp=rtp)
255 IF (rtp%linear_scaling)
THEN
256 CALL get_rtp(rtp=rtp, rho_new=rho_new)
259 IF (dft_control%rtp_control%save_local_moments)
THEN
261 IF (dft_control%apply_efield_field)
THEN
262 CALL make_field(dft_control, field, qs_env%sim_step, qs_env%sim_time)
263 rtp%fields(:, rtp%istep + rtp%i_start + 1) = cmplx(field(:), 0.0, kind=
dp)
265 IF (.NOT. dft_control%rtp_control%fixed_ions)
THEN
272 rtp%local_moments_work, rtp%moments(:, :, rtp%istep + rtp%i_start + 1))
274 rtp%times(rtp%istep + rtp%i_start + 1) = qs_env%sim_time
277 rtp%moments(:, :, rtp%istep + rtp%i_start + 1), qs_env%sim_time, rtp%track_imag_density)
281 dft_section,
"REAL_TIME_PROPAGATION%PRINT%RESTART"),
cp_p_file))
THEN
282 CALL write_rt_p_to_restart(rho_new, .false.)
285 dft_section,
"REAL_TIME_PROPAGATION%PRINT%RESTART_HISTORY"),
cp_p_file))
THEN
286 CALL write_rt_p_to_restart(rho_new, .true.)
288 IF (.NOT. dft_control%qs_control%dftb)
THEN
291 dft_section,
"REAL_TIME_PROPAGATION%PRINT%CURRENT"),
cp_p_file))
THEN
292 DO spin = 1,
SIZE(rho_new)/2
293 CALL rt_current(qs_env, rho_new(2*spin)%matrix, dft_section, spin,
SIZE(rho_new)/2)
298 CALL get_rtp(rtp=rtp, mos_new=mos_new)
299 IF (.NOT. dft_control%qs_control%dftb .AND. .NOT. dft_control%qs_control%xtb)
THEN
300 IF (rtp%track_imag_density)
THEN
301 NULLIFY (p_im, p_xyz)
306 natom =
SIZE(particle_set, 1)
307 ALLOCATE (first_sgf(natom))
308 ALLOCATE (last_sgf(natom))
310 first_sgf=first_sgf, &
312 ALLOCATE (row_blk_sizes(natom))
313 CALL dbcsr_convert_offsets_to_sizes(first_sgf, row_blk_sizes, last_sgf)
314 DEALLOCATE (first_sgf)
315 DEALLOCATE (last_sgf)
317 ALLOCATE (p_xyz(1)%matrix)
320 dist=dbcsr_dist, matrix_type=dbcsr_type_antisymmetric, &
321 row_blk_size=row_blk_sizes, col_blk_size=row_blk_sizes, &
326 ALLOCATE (p_xyz(i)%matrix)
331 DEALLOCATE (row_blk_sizes)
333 nspin =
SIZE(mos_new)/2
335 ALLOCATE (j_int(nspin, 3))
340 CALL dbcsr_create(tmp_ao, template=matrix_s(1)%matrix, matrix_type=dbcsr_type_no_symmetry, name=
"tmp")
348 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, p_im(spin)%matrix, p_xyz(i)%matrix, &
351 strace = strace + trace
353 j_int(spin, i) = -trace + dft_control%rtp_control%vec_pot(i)*nelectron_spin(spin)
360 dft_section,
"REAL_TIME_PROPAGATION%PRINT%CURRENT_INT"),
cp_p_file))
THEN
364 "REAL_TIME_PROPAGATION%PRINT%CURRENT_INT", extension=
".dat", is_new_file=new_file)
366 IF (output_unit > 0)
THEN
369 WRITE (unit=unit_nr, fmt=
'("#",5X,A,4X,A,2X,A,2(10X,A),4X,A,2(10X,A))') &
370 "Step Nr.",
"Time[fs]",
"ALPHA jint[X]",
"jint[Y]",
"jint[Z]", &
371 "BETA jint[X]",
"jint[Y]",
"jint[Z]"
373 WRITE (unit=unit_nr, fmt=
'("#",5X,A,4X,A,8X,A,2(10X,A))')
"Step Nr.",
"Time[fs]", &
374 "jint[X]",
"jint[Y]",
"jint[Z]"
379 WRITE (unit=unit_nr, fmt=
"(I10,F16.6,6(F16.8,1X))") qs_env%sim_step, qs_env%sim_time*
femtoseconds, &
380 j_int(1, 1:3), j_int(2, 1:3)
382 WRITE (unit=unit_nr, fmt=
"(I10,F16.6,3(F16.8,1X))") qs_env%sim_step, qs_env%sim_time*
femtoseconds, &
387 "REAL_TIME_PROPAGATION%PRINT%CURRENT_INT")
392 dft_section,
"REAL_TIME_PROPAGATION%PRINT%CURRENT"),
cp_p_file))
THEN
394 CALL rt_current(qs_env, p_im(spin)%matrix, dft_section, spin, nspin)
402 IF (dft_control%rtp_control%is_proj_mo)
THEN
403 DO n_proj = 1,
SIZE(dft_control%rtp_control%proj_mo_list)
405 dft_control%rtp_control%proj_mo_list(n_proj)%proj_mo, n_proj)
410 dft_section, qs_kind_set)
414 rtp%energy_old = rtp%energy_new
416 IF (.NOT. rtp%converged .AND. rtp%iter >= dft_control%rtp_control%max_iter)
THEN
417 CALL cp_abort(__location__,
"EMD did not converge, either increase MAX_ITER "// &
418 "or use a smaller TIMESTEP")
431 SUBROUTINE rt_calculate_orthonormality(orthonormality, mos_new, matrix_s)
432 REAL(kind=
dp),
INTENT(out) :: orthonormality
433 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mos_new
434 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: matrix_s
436 CHARACTER(len=*),
PARAMETER :: routinen =
'rt_calculate_orthonormality'
438 INTEGER :: handle, i, im, ispin, j, k, n, &
439 ncol_local, nrow_local, nspin, re
440 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
441 REAL(kind=
dp) :: alpha, max_alpha, max_beta
443 TYPE(
cp_fm_type) :: overlap_re, svec_im, svec_re
445 NULLIFY (tmp_fm_struct)
447 CALL timeset(routinen, handle)
449 nspin =
SIZE(mos_new)/2
459 nrow_global=n, ncol_global=k)
467 para_env=mos_new(re)%matrix_struct%para_env, &
468 context=mos_new(re)%matrix_struct%context)
474 svec_re, 0.0_dp, overlap_re)
476 svec_im, 1.0_dp, overlap_re)
481 CALL cp_fm_get_info(overlap_re, nrow_local=nrow_local, ncol_local=ncol_local, &
482 row_indices=row_indices, col_indices=col_indices)
485 alpha = overlap_re%local_data(i, j)
486 IF (row_indices(i) == col_indices(j)) alpha = alpha - 1.0_dp
487 max_alpha = max(max_alpha, abs(alpha))
492 CALL mos_new(1)%matrix_struct%para_env%max(max_alpha)
493 CALL mos_new(1)%matrix_struct%para_env%max(max_beta)
494 orthonormality = max_alpha
496 CALL timestop(handle)
498 END SUBROUTINE rt_calculate_orthonormality
512 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: delta_mos
513 REAL(
dp),
INTENT(out) :: delta_eps
515 CHARACTER(len=*),
PARAMETER :: routinen =
'rt_convergence'
516 REAL(kind=
dp),
PARAMETER ::
one = 1.0_dp,
zero = 0.0_dp
518 INTEGER :: handle, i, icol, im, ispin, j, lcol, &
519 lrow, nao, newdim, nmo, nspin, re
520 LOGICAL :: double_col, double_row
521 REAL(kind=
dp) :: alpha, max_alpha
524 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mos_new
526 NULLIFY (tmp_fm_struct)
528 CALL timeset(routinen, handle)
530 CALL get_rtp(rtp=rtp, mos_new=mos_new)
532 nspin =
SIZE(delta_mos)/2
535 DO i = 1,
SIZE(mos_new)
546 delta_mos(re)%matrix_struct, &
547 delta_mos(re)%matrix_struct%context, &
554 CALL cp_fm_get_info(delta_mos(re), ncol_local=lcol, ncol_global=nmo, &
561 work%local_data(:, icol) = delta_mos(re)%local_data(:, icol)
562 work%local_data(:, icol + lcol) = delta_mos(im)%local_data(:, icol)
570 para_env=delta_mos(re)%matrix_struct%para_env, &
571 context=delta_mos(re)%matrix_struct%context)
574 delta_mos(re)%matrix_struct%context, &
590 alpha = sqrt((work%local_data(i, j) + work2%local_data(i, j + lcol))**2 + &
591 (work%local_data(i, j + lcol) - work2%local_data(i, j))**2)
592 max_alpha = max(max_alpha, abs(alpha))
605 CALL delta_mos(1)%matrix_struct%para_env%max(max_alpha)
606 delta_eps = sqrt(max_alpha)
608 CALL timestop(handle)
624 REAL(
dp),
INTENT(out) :: delta_eps
626 CHARACTER(len=*),
PARAMETER :: routinen =
'rt_convergence_density'
627 REAL(kind=
dp),
PARAMETER ::
one = 1.0_dp,
zero = 0.0_dp
629 INTEGER :: col_atom, handle, i, ispin, row_atom
630 REAL(
dp) :: alpha, max_alpha
631 REAL(
dp),
DIMENSION(:, :),
POINTER :: block_values
637 CALL timeset(routinen, handle)
639 CALL get_rtp(rtp=rtp, rho_new=rho_new)
641 DO i = 1,
SIZE(rho_new)
645 DO i = 1,
SIZE(delta_p)
650 block_values = block_values*block_values
656 CALL dbcsr_create(tmp, template=delta_p(1)%matrix, matrix_type=
"N")
657 DO ispin = 1,
SIZE(delta_p)/2
663 DO ispin = 1,
SIZE(delta_p)/2
667 alpha = maxval(block_values)
668 IF (alpha > max_alpha) max_alpha = alpha
673 CALL group%max(max_alpha)
674 delta_eps = sqrt(max_alpha)
676 CALL timestop(handle)
686 SUBROUTINE make_moment(qs_env)
690 CHARACTER(len=*),
PARAMETER :: routinen =
'make_moment'
692 INTEGER :: handle, output_unit
696 CALL timeset(routinen, handle)
698 NULLIFY (dft_control)
702 CALL get_qs_env(qs_env, dft_control=dft_control)
703 IF (dft_control%qs_control%dftb)
THEN
705 ELSE IF (dft_control%qs_control%xtb)
THEN
710 CALL timestop(handle)
712 END SUBROUTINE make_moment
723 REAL(kind=
dp) :: filter_eps
726 CHARACTER(len=*),
PARAMETER :: routinen =
'report_density_occupation'
728 INTEGER :: handle, i, im, ispin, re, unit_nr
729 REAL(kind=
dp) :: eps, occ
733 CALL timeset(routinen, handle)
741 CALL dbcsr_create(tmp(i)%matrix, template=rho(i)%matrix)
744 DO ispin = 1,
SIZE(rho)/2
747 eps = max(filter_eps, 1.0e-11_dp)
748 DO WHILE (eps < 1.1_dp)
751 IF (unit_nr > 0)
WRITE (unit_nr, fmt=
"((T3,A,I1,A,F15.12,A,T61,F20.10))")
"Occupation of rho spin ", &
752 ispin,
" eps ", eps,
" real: ", occ
755 eps = max(filter_eps, 1.0e-11_dp)
756 DO WHILE (eps < 1.1_dp)
759 IF (unit_nr > 0)
WRITE (unit_nr, fmt=
"((T3,A,I1,A,F15.12,A,T61,F20.10))")
"Occupation of rho spin ", &
760 ispin,
" eps ", eps,
" imag: ", occ
765 CALL timestop(handle)
776 SUBROUTINE write_rt_p_to_restart(rho_new, history)
781 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_rt_p_to_restart'
783 CHARACTER(LEN=default_path_length) :: file_name, project_name
784 INTEGER :: handle, im, ispin, re, unit_nr
785 REAL(kind=
dp) :: cs_pos
788 CALL timeset(routinen, handle)
790 IF (logger%para_env%is_source())
THEN
796 project_name = logger%iter_info%project_name
797 DO ispin = 1,
SIZE(rho_new)/2
801 WRITE (file_name,
'(A,I0,A)') &
802 trim(project_name)//
"_LS_DM_SPIN_RE", ispin,
"_"//trim(
cp_iter_string(logger%iter_info))//
"_RESTART.dm"
804 WRITE (file_name,
'(A,I0,A)') trim(project_name)//
"_LS_DM_SPIN_RE", ispin,
"_RESTART.dm"
807 IF (unit_nr > 0)
THEN
808 WRITE (unit_nr,
'(T2,A,E20.8)')
"Writing restart DM "//trim(file_name)//
" with checksum: ", cs_pos
812 WRITE (file_name,
'(A,I0,A)') &
813 trim(project_name)//
"_LS_DM_SPIN_IM", ispin,
"_"//trim(
cp_iter_string(logger%iter_info))//
"_RESTART.dm"
815 WRITE (file_name,
'(A,I0,A)') trim(project_name)//
"_LS_DM_SPIN_IM", ispin,
"_RESTART.dm"
818 IF (unit_nr > 0)
THEN
819 WRITE (unit_nr,
'(T2,A,E20.8)')
"Writing restart DM "//trim(file_name)//
" with checksum: ", cs_pos
824 CALL timestop(handle)
826 END SUBROUTINE write_rt_p_to_restart
837 SUBROUTINE rt_current(qs_env, P_im, dft_section, spin, nspin)
841 INTEGER :: spin, nspin
843 CHARACTER(len=*),
PARAMETER :: routinen =
'rt_current'
845 CHARACTER(len=1) :: char_spin
846 CHARACTER(len=14) :: ext
847 CHARACTER(len=2) :: sdir
848 INTEGER :: dir, handle, print_unit
849 INTEGER,
DIMENSION(:),
POINTER :: stride
861 CALL timeset(routinen, handle)
864 CALL get_qs_env(qs_env=qs_env, subsys=subsys, pw_env=pw_env)
866 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
878 current_env%gauge = -1
879 current_env%gauge_init = .false.
880 CALL auxbas_pw_pool%create_pw(rs)
881 CALL auxbas_pw_pool%create_pw(gs)
891 CALL calculate_jrho_resp(
zero, tmp,
zero,
zero, dir, dir, rs, gs, qs_env, current_env, retain_rsgrid=.true.)
893 stride =
section_get_ivals(dft_section,
"REAL_TIME_PROPAGATION%PRINT%CURRENT%STRIDE")
897 ELSE IF (dir == 2)
THEN
902 WRITE (char_spin,
"(I1)") spin
904 ext =
"-SPIN-"//char_spin//sdir//
".cube"
907 extension=ext, file_status=
"REPLACE", file_action=
"WRITE", &
908 log_filename=.false., mpi_io=mpi_io)
910 CALL cp_pw_to_cube(rs, print_unit,
"EMD current", particles=particles, stride=stride, &
918 CALL auxbas_pw_pool%give_back_pw(rs)
919 CALL auxbas_pw_pool%give_back_pw(gs)
926 CALL timestop(handle)
928 END SUBROUTINE rt_current
940 SUBROUTINE write_available_results(qs_env, rtp)
944 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
949 CALL timeset(routinen, handle)
952 IF (rtp%linear_scaling)
THEN
962 CALL timestop(handle)
964 END SUBROUTINE write_available_results
974 SUBROUTINE print_field_applied(qs_env, dft_section)
978 CHARACTER(LEN=3),
DIMENSION(3) :: rlab
979 CHARACTER(LEN=default_path_length) :: filename
980 INTEGER :: i, i_step, output_unit, unit_nr
982 REAL(kind=
dp) :: field(3)
987 NULLIFY (dft_control)
992 CALL get_qs_env(qs_env, dft_control=dft_control, rtp=rtp)
997 "REAL_TIME_PROPAGATION%PRINT%FIELD", extension=
".dat", is_new_file=new_file)
999 IF (output_unit > 0)
THEN
1000 rlab = [
CHARACTER(LEN=3) ::
"X",
"Y",
"Z"]
1001 IF (unit_nr /= output_unit)
THEN
1002 INQUIRE (unit=unit_nr, name=filename)
1003 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1004 "FIELD",
"The field applied is written to the file:", &
1007 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"FIELD APPLIED [a.u.]"
1008 WRITE (unit=output_unit, fmt=
"(T5,3(A,A,E16.8,1X))") &
1009 (trim(rlab(i)),
"=", dft_control%rtp_control%field(i), i=1, 3)
1013 IF (dft_control%apply_efield_field)
THEN
1014 WRITE (unit=unit_nr, fmt=
'("#",5X,A,8X,A,3(6X,A))')
"Step Nr.",
"Time[fs]",
" Field X",
" Field Y",
" Field Z"
1015 ELSE IF (dft_control%apply_vector_potential)
THEN
1016 WRITE (unit=unit_nr, fmt=
'("#",5X,A,8X,A,6(6X,A))')
"Step Nr.",
"Time[fs]",
" Field X",
" Field Y",
" Field Z", &
1017 " Vec. Pot. X",
" Vec. Pot. Y",
" Vec. Pot. Z"
1022 IF (dft_control%apply_efield_field)
THEN
1023 CALL make_field(dft_control, field, qs_env%sim_step, qs_env%sim_time)
1024 WRITE (unit=unit_nr, fmt=
"(I10,F16.6,3(F16.8,1X))") qs_env%sim_step, qs_env%sim_time*
femtoseconds, &
1025 field(1), field(2), field(3)
1029 ELSE IF (dft_control%apply_vector_potential)
THEN
1030 WRITE (unit=unit_nr, fmt=
"(I10,F16.6,6(F16.8,1X))") qs_env%sim_step, qs_env%sim_time*
femtoseconds, &
1031 dft_control%rtp_control%field(1), dft_control%rtp_control%field(2), dft_control%rtp_control%field(3), &
1032 dft_control%rtp_control%vec_pot(1), dft_control%rtp_control%vec_pot(2), dft_control%rtp_control%vec_pot(3)
1038 "REAL_TIME_PROPAGATION%PRINT%FIELD")
1040 END SUBROUTINE print_field_applied
1049 SUBROUTINE print_rtp_energy_components(qs_env, dft_section)
1053 CHARACTER(LEN=default_path_length) :: filename
1054 INTEGER :: i_step, output_unit, unit_nr
1061 NULLIFY (dft_control, energy, rtp)
1066 CALL get_qs_env(qs_env, dft_control=dft_control, rtp=rtp, energy=energy)
1070 "REAL_TIME_PROPAGATION%PRINT%E_CONSTITUENTS", extension=
".ener", &
1071 file_action=
"WRITE", is_new_file=new_file)
1073 IF (output_unit > 0)
THEN
1074 IF (unit_nr /= output_unit)
THEN
1075 INQUIRE (unit=unit_nr, name=filename)
1076 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1077 "ENERGY_CONSTITUENTS",
"Total Energy constituents written to file:", &
1080 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ENERGY_CONSTITUENTS"
1086 WRITE (unit=unit_nr, fmt=
'("#",5X,A,8X,A,10(6X,A))')
"Step Nr.",
"Time[fs]", &
1087 "Total ener.[a.u.]",
"core[a.u.] ",
" overlap [a.u.]",
"hartree[a.u.]",
" exc. [a.u.] ", &
1088 " hartree 1c[a.u.]",
"exc 1c[a.u.] ",
"exc admm[a.u.]",
"exc 1c admm[a.u.]",
"efield LG"
1091 WRITE (unit=unit_nr, fmt=
"(I10,F20.6,10(F20.9))") &
1093 energy%total, energy%core, energy%core_overlap, energy%hartree, energy%exc, &
1094 energy%hartree_1c, energy%exc1, energy%exc_aux_fit, energy%exc1_aux_fit, energy%efield_core
1099 "REAL_TIME_PROPAGATION%PRINT%E_CONSTITUENTS")
1101 END SUBROUTINE print_rtp_energy_components
1114 SUBROUTINE print_moments(moments_section, info_unit, moments, time, imag_opt, append_opt)
1116 INTEGER :: info_unit
1117 COMPLEX(kind=dp),
DIMENSION(:, :) :: moments
1118 REAL(kind=
dp),
OPTIONAL :: time
1119 LOGICAL,
OPTIONAL :: imag_opt, append_opt
1121 CHARACTER(len=14),
DIMENSION(4) :: file_extensions
1122 CHARACTER(len=21) :: prefix
1123 COMPLEX(kind=dp),
DIMENSION(3, 1) :: moment_t
1124 INTEGER :: i, ndir, nspin, print_unit
1125 LOGICAL :: append, imaginary
1130 nspin =
SIZE(moments, 1)
1131 ndir =
SIZE(moments, 2)
1133 IF (nspin < 1) cpabort(
"Zero spin index size in print moments!")
1134 IF (ndir < 1) cpabort(
"Zero direction index size in print moments!")
1137 IF (
PRESENT(imag_opt)) imaginary = imag_opt
1140 IF (
PRESENT(append_opt)) append = append_opt
1145 file_extensions(1) =
"_SPIN_A_RE.dat"
1146 file_extensions(2) =
"_SPIN_A_IM.dat"
1147 file_extensions(3) =
"_SPIN_B_RE.dat"
1148 file_extensions(4) =
"_SPIN_B_IM.dat"
1151 moment_t(:, 1) = moments(i, :)
1154 IF (print_unit == info_unit)
THEN
1156 prefix =
" MOMENTS_TRACE_RE|"
1159 CALL print_rt_file(print_unit, xvals=[time], yvals=moment_t, &
1160 prefix=prefix, prefix_format=
"(A18)", &
1165 headers=[
"# Time [fs]",
" re(mom_t) x [at.u.]", &
1166 " re(mom_t) y [at.u.]",
" re(mom_t) z [at.u.]"], &
1167 xvals=[time], yvals=moment_t, &
1168 prefix=prefix, prefix_format=
"(A18)", &
1175 CALL print_rt_file(print_unit, xvals=[time], yvals=moment_t, &
1180 headers=[
"# Time [fs]",
" re(mom_t) x [at.u.]", &
1181 " re(mom_t) y [at.u.]",
" re(mom_t) z [at.u.]"], &
1182 xvals=[time], yvals=moment_t, &
1190 IF (print_unit == info_unit)
THEN
1192 prefix =
" MOMENTS_TRACE_IM|"
1195 CALL print_rt_file(print_unit, xvals=[time], yvals=moment_t, &
1196 prefix=prefix, prefix_format=
"(A18)", &
1201 headers=[
"# Time [fs]",
" im(mom_t) x [at.u.]", &
1202 " im(mom_t) y [at.u.]",
" im(mom_t) z [at.u.]"], &
1203 xvals=[time], yvals=moment_t, &
1204 prefix=prefix, prefix_format=
"(A18)", &
1211 CALL print_rt_file(print_unit, xvals=[time], yvals=moment_t, &
1216 headers=[
"# Time [fs]",
" im(mom_t) x [at.u.]", &
1217 " im(mom_t) y [at.u.]",
" im(mom_t) z [at.u.]"], &
1218 xvals=[time], yvals=moment_t, &
1239 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: moment_matrices, density_matrices
1241 COMPLEX(kind=dp),
DIMENSION(:, :) :: moment
1242 LOGICAL,
OPTIONAL :: imag_opt
1244 INTEGER :: i, k, nspin
1246 REAL(kind=
dp) :: real_moment
1249 IF (
PRESENT(imag_opt)) imag = imag_opt
1250 nspin =
SIZE(density_matrices)/2
1255 density_matrices(2*i - 1)%matrix, moment_matrices(k)%matrix, &
1258 moment(i, k) = cmplx(real_moment, 0.0, kind=
dp)
1261 density_matrices(2*i)%matrix, moment_matrices(k)%matrix, &
1264 moment(i, k) = moment(i, k) + cmplx(0.0, real_moment, kind=
dp)
1283 SUBROUTINE print_ft(rtp_section, moments, times, fields, rtc, info_opt, cell)
1285 COMPLEX(kind=dp),
DIMENSION(:, :, :),
POINTER :: moments
1286 REAL(kind=
dp),
DIMENSION(:),
POINTER :: times
1287 COMPLEX(kind=dp),
DIMENSION(:, :),
POINTER :: fields
1289 INTEGER,
OPTIONAL :: info_opt
1290 TYPE(
cell_type),
OPTIONAL,
POINTER :: cell
1292 CHARACTER(len=*),
PARAMETER :: routinen =
'print_ft'
1294 CHARACTER(len=11),
DIMENSION(2) :: file_extensions
1295 CHARACTER(len=20),
ALLOCATABLE,
DIMENSION(:) :: headers
1296 CHARACTER(len=21) :: prefix
1297 CHARACTER(len=5) :: prefix_format
1298 COMPLEX(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: omegas_complex, omegas_pade
1299 COMPLEX(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: field_results, field_results_pade, &
1300 pol_results, pol_results_pade, pol_results_pade_spin_total, pol_results_spin_total, &
1301 results, results_pade, results_pade_spin_total, results_spin_total, value_series
1302 INTEGER :: ft_unit, handle, i, idx_omega_zero, &
1303 info_unit, k, k_static, n, n_elems, &
1305 LOGICAL :: do_moments_ft, do_polarizability
1306 REAL(kind=
dp) :: damping, t0
1307 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: omegas, omegas_pade_real
1308 REAL(kind=
dp),
DIMENSION(3) :: delta_vec
1312 CALL timeset(routinen, handle)
1322 nspin =
SIZE(moments, 1)
1324 n_elems =
SIZE(rtc%print_pol_elements, 1)
1327 IF (
PRESENT(info_opt)) info_unit = info_opt
1330 file_extensions(1) =
"_SPIN_A.dat"
1331 file_extensions(2) =
"_SPIN_B.dat"
1336 do_polarizability = do_polarizability .AND. (n_elems > 0)
1338 damping = rtc%ft_damping
1342 IF (do_polarizability)
THEN
1343 ALLOCATE (field_results(3, n))
1344 IF (rtc%apply_delta_pulse)
THEN
1346 IF (
PRESENT(cell))
THEN
1347 delta_vec(:) = (real(rtc%delta_pulse_direction(1), kind=
dp)*cell%h_inv(1, :) + &
1348 REAL(rtc%delta_pulse_direction(2), kind=
dp)*cell%h_inv(2, :) + &
1349 REAL(rtc%delta_pulse_direction(3), kind=
dp)*cell%h_inv(3, :)) &
1350 *
twopi*rtc%delta_pulse_scale
1352 delta_vec(:) = real(rtc%delta_pulse_direction(:), kind=
dp)*rtc%delta_pulse_scale
1355 field_results(k, :) = cmplx(delta_vec(k), 0.0, kind=
dp)
1359 CALL multi_fft(times, fields, field_results, &
1360 damping_opt=damping, t0_opt=t0, subtract_initial_opt=.true.)
1364 IF (do_moments_ft .OR. do_polarizability)
THEN
1368 ALLOCATE (results(3*nspin, n))
1369 ALLOCATE (omegas(n))
1370 ALLOCATE (value_series(3*nspin, n))
1373 value_series(3*(i - 1) + k, :) = moments(i, k, :)
1377 CALL multi_fft(times, value_series, results, omegas, &
1378 damping_opt=damping, t0_opt=t0, subtract_initial_opt=.true.)
1379 DEALLOCATE (value_series)
1383 file_form=
"FORMATTED", file_position=
"REWIND")
1385 IF (ft_unit > 0)
THEN
1386 ALLOCATE (headers(7))
1387 headers(2) =
" x,real [at.u.]"
1388 headers(3) =
" x,imag [at.u.]"
1389 headers(4) =
" y,real [at.u.]"
1390 headers(5) =
" y,imag [at.u.]"
1391 headers(6) =
" z,real [at.u.]"
1392 headers(7) =
" z,imag [at.u.]"
1393 IF (info_unit == ft_unit)
THEN
1394 headers(1) =
"# Energy [eV]"
1395 prefix =
" MOMENTS_FT|"
1396 prefix_format =
"(A12)"
1397 CALL print_rt_file(ft_unit, headers, omegas, results(3*(i - 1) + 1:3*(i - 1) + 3, :), &
1398 prefix, prefix_format,
evolt)
1400 headers(1) =
"# omega [at.u.]"
1401 CALL print_rt_file(ft_unit, headers, omegas, results(3*(i - 1) + 1:3*(i - 1) + 3, :))
1403 DEALLOCATE (headers)
1409 ALLOCATE (results_spin_total(3, n))
1410 results_spin_total(:, :) = (0.0_dp, 0.0_dp)
1413 results_spin_total(k, :) = results_spin_total(k, :) + results(3*(i - 1) + k, :)
1417 file_form=
"FORMATTED", file_position=
"REWIND")
1418 IF (ft_unit > 0)
THEN
1419 ALLOCATE (headers(7))
1420 headers(2) =
" x,real [at.u.]"
1421 headers(3) =
" x,imag [at.u.]"
1422 headers(4) =
" y,real [at.u.]"
1423 headers(5) =
" y,imag [at.u.]"
1424 headers(6) =
" z,real [at.u.]"
1425 headers(7) =
" z,imag [at.u.]"
1426 IF (info_unit == ft_unit)
THEN
1427 headers(1) =
"# Energy [eV]"
1428 prefix =
" MOMENTS_FT|"
1429 prefix_format =
"(A12)"
1430 CALL print_rt_file(ft_unit, headers, omegas, results_spin_total, &
1431 prefix, prefix_format,
evolt)
1433 headers(1) =
"# omega [at.u.]"
1434 CALL print_rt_file(ft_unit, headers, omegas, results_spin_total)
1436 DEALLOCATE (headers)
1439 DEALLOCATE (results_spin_total)
1443 IF (rtc%pade_requested .AND. (do_moments_ft .OR. do_polarizability))
THEN
1444 ALLOCATE (omegas_complex(
SIZE(omegas)))
1445 omegas_complex(:) = cmplx(omegas(:), 0.0, kind=
dp)
1446 n_pade = int((rtc%pade_e_max - rtc%pade_e_min)/rtc%pade_e_step)
1447 ALLOCATE (omegas_pade(n_pade))
1448 ALLOCATE (omegas_pade_real(n_pade))
1451 omegas_pade_real(i) = (i - 1)*rtc%pade_e_step + rtc%pade_e_min
1452 omegas_pade(i) = cmplx(omegas_pade_real(i), 0.0, kind=
dp)
1454 ALLOCATE (results_pade(nspin*3, n_pade), source=cmplx(0.0, 0.0, kind=
dp))
1457 CALL greenx_refine_ft(rtc%pade_fit_e_min, rtc%pade_fit_e_max, omegas_complex, results(3*(i - 1) + k, :), &
1458 omegas_pade, results_pade(3*(i - 1) + k, :))
1461 ft_unit =
cp_print_key_unit_nr(logger, moment_ft_section, extension=
"_PADE"//file_extensions(i), &
1462 file_form=
"FORMATTED", file_position=
"REWIND")
1463 IF (ft_unit > 0)
THEN
1464 ALLOCATE (headers(7))
1465 headers(2) =
" x,real,pade [at.u.]"
1466 headers(3) =
" x,imag,pade [at.u.]"
1467 headers(4) =
" y,real,pade [at.u.]"
1468 headers(5) =
" y,imag,pade [at.u.]"
1469 headers(6) =
" z,real,pade [at.u.]"
1470 headers(7) =
" z,imag,pade [at.u.]"
1471 IF (info_unit == ft_unit)
THEN
1472 headers(1) =
"# Energy [eV]"
1473 prefix =
" MOMENTS_FT_PADE|"
1474 prefix_format =
"(A17)"
1475 CALL print_rt_file(ft_unit, headers, omegas_pade_real, results_pade(3*(i - 1) + 1:3*(i - 1) + 3, :), &
1476 prefix, prefix_format,
evolt)
1478 headers(1) =
"# omega [at.u.]"
1479 CALL print_rt_file(ft_unit, headers, omegas_pade_real, results_pade(3*(i - 1) + 1:3*(i - 1) + 3, :))
1481 DEALLOCATE (headers)
1486 ALLOCATE (results_pade_spin_total(3, n_pade))
1487 results_pade_spin_total(:, :) = (0.0_dp, 0.0_dp)
1490 results_pade_spin_total(k, :) = results_pade_spin_total(k, :) + results_pade(3*(i - 1) + k, :)
1494 file_form=
"FORMATTED", file_position=
"REWIND")
1495 IF (ft_unit > 0)
THEN
1496 ALLOCATE (headers(7))
1497 headers(2) =
" x,real,pade [at.u.]"
1498 headers(3) =
" x,imag,pade [at.u.]"
1499 headers(4) =
" y,real,pade [at.u.]"
1500 headers(5) =
" y,imag,pade [at.u.]"
1501 headers(6) =
" z,real,pade [at.u.]"
1502 headers(7) =
" z,imag,pade [at.u.]"
1503 IF (info_unit == ft_unit)
THEN
1504 headers(1) =
"# Energy [eV]"
1505 prefix =
" MOMENTS_FT_PADE|"
1506 prefix_format =
"(A17)"
1507 CALL print_rt_file(ft_unit, headers, omegas_pade_real, results_pade_spin_total, &
1508 prefix, prefix_format,
evolt)
1510 headers(1) =
"# omega [at.u.]"
1511 CALL print_rt_file(ft_unit, headers, omegas_pade_real, results_pade_spin_total)
1513 DEALLOCATE (headers)
1515 DEALLOCATE (results_pade_spin_total)
1519 IF (do_polarizability)
THEN
1521 ALLOCATE (pol_results(n_elems, n))
1525 pol_results(k, :) = results(3*(i - 1) + &
1526 rtc%print_pol_elements(k, 1), :)/ &
1527 (field_results(rtc%print_pol_elements(k, 2), :) + &
1528 1.0e-10*field_results(rtc%print_pol_elements(k, 2), 2))
1532 file_form=
"FORMATTED", file_position=
"REWIND")
1533 IF (ft_unit > 0)
THEN
1534 ALLOCATE (headers(2*n_elems + 1))
1536 WRITE (headers(2*k),
"(A16,I2,I2)")
"real pol. elem.", &
1537 rtc%print_pol_elements(k, 1), &
1538 rtc%print_pol_elements(k, 2)
1539 WRITE (headers(2*k + 1),
"(A16,I2,I2)")
"imag pol. elem.", &
1540 rtc%print_pol_elements(k, 1), &
1541 rtc%print_pol_elements(k, 2)
1544 IF (info_unit == ft_unit)
THEN
1545 headers(1) =
"# Energy [eV]"
1546 prefix =
" POLARIZABILITY|"
1547 prefix_format =
"(A16)"
1549 prefix, prefix_format,
evolt)
1551 headers(1) =
"# omega [at.u.]"
1554 DEALLOCATE (headers)
1559 IF (info_unit > 0)
THEN
1560 idx_omega_zero = minloc(abs(omegas), dim=1)
1562 WRITE (info_unit,
'(A,T22,A,T28,A,T36,A,T59,A)') &
1563 " STATIC_POL|",
"spin",
"element",
"Re [a.u.]",
"Im [a.u.]"
1565 DO k_static = 1, n_elems
1566 WRITE (info_unit,
'(A,T22,I4,T28,I3,",",I3,T36,ES22.10E3,T59,ES22.10E3)') &
1567 " STATIC_POL|", i, &
1568 rtc%print_pol_elements(k_static, 1), &
1569 rtc%print_pol_elements(k_static, 2), &
1570 REAL(pol_results(k_static, idx_omega_zero), kind=
dp), &
1571 aimag(pol_results(k_static, idx_omega_zero))
1578 ALLOCATE (pol_results_spin_total(n_elems, n))
1579 pol_results_spin_total(:, :) = (0.0_dp, 0.0_dp)
1582 pol_results_spin_total(k, :) = pol_results_spin_total(k, :) + &
1583 results(3*(i - 1) + rtc%print_pol_elements(k, 1), :)
1585 pol_results_spin_total(k, :) = pol_results_spin_total(k, :)/ &
1586 (field_results(rtc%print_pol_elements(k, 2), :) + &
1587 1.0e-10*field_results(rtc%print_pol_elements(k, 2), 2))
1590 file_form=
"FORMATTED", file_position=
"REWIND")
1591 IF (ft_unit > 0)
THEN
1592 ALLOCATE (headers(2*n_elems + 1))
1594 WRITE (headers(2*k),
"(A16,I2,I2)")
"real pol. elem.", &
1595 rtc%print_pol_elements(k, 1), &
1596 rtc%print_pol_elements(k, 2)
1597 WRITE (headers(2*k + 1),
"(A16,I2,I2)")
"imag pol. elem.", &
1598 rtc%print_pol_elements(k, 1), &
1599 rtc%print_pol_elements(k, 2)
1601 IF (info_unit == ft_unit)
THEN
1602 headers(1) =
"# Energy [eV]"
1603 prefix =
" POLARIZABILITY|"
1604 prefix_format =
"(A16)"
1605 CALL print_rt_file(ft_unit, headers, omegas, pol_results_spin_total, &
1606 prefix, prefix_format,
evolt)
1608 headers(1) =
"# omega [at.u.]"
1609 CALL print_rt_file(ft_unit, headers, omegas, pol_results_spin_total)
1611 DEALLOCATE (headers)
1615 IF (info_unit > 0)
THEN
1616 idx_omega_zero = minloc(abs(omegas), dim=1)
1617 DO k_static = 1, n_elems
1618 WRITE (info_unit,
'(A,T22,A,T28,I3,",",I3,T36,ES22.10E3,T59,ES22.10E3)') &
1619 " STATIC_POL|",
"TOT", &
1620 rtc%print_pol_elements(k_static, 1), &
1621 rtc%print_pol_elements(k_static, 2), &
1622 REAL(pol_results_spin_total(k_static, idx_omega_zero), kind=
dp), &
1623 aimag(pol_results_spin_total(k_static, idx_omega_zero))
1626 DEALLOCATE (pol_results_spin_total)
1631 IF (rtc%pade_requested .AND. do_polarizability)
THEN
1633 ALLOCATE (field_results_pade(3, n_pade))
1634 IF (rtc%apply_delta_pulse)
THEN
1636 field_results_pade(k, :) = cmplx(delta_vec(k), 0.0, kind=
dp)
1641 omegas_complex, field_results(k, :), &
1642 omegas_pade, field_results_pade(k, :))
1646 ALLOCATE (pol_results_pade(n_elems, n_pade))
1651 pol_results_pade(k, :) = results_pade(3*(i - 1) + rtc%print_pol_elements(k, 1), :)/( &
1652 field_results_pade(rtc%print_pol_elements(k, 2), :) + &
1653 field_results_pade(rtc%print_pol_elements(k, 2), 2)*1.0e-10_dp)
1657 file_form=
"FORMATTED", file_position=
"REWIND")
1658 IF (ft_unit > 0)
THEN
1659 ALLOCATE (headers(2*n_elems + 1))
1661 WRITE (headers(2*k),
"(A16,I2,I2)")
"re,pade,pol.", &
1662 rtc%print_pol_elements(k, 1), &
1663 rtc%print_pol_elements(k, 2)
1664 WRITE (headers(2*k + 1),
"(A16,I2,I2)")
"im,pade,pol.", &
1665 rtc%print_pol_elements(k, 1), &
1666 rtc%print_pol_elements(k, 2)
1669 IF (info_unit == ft_unit)
THEN
1670 headers(1) =
"# Energy [eV]"
1671 prefix =
" POLARIZABILITY_PADE|"
1672 prefix_format =
"(A21)"
1673 CALL print_rt_file(ft_unit, headers, omegas_pade_real, pol_results_pade, &
1674 prefix, prefix_format,
evolt)
1676 headers(1) =
"# omega [at.u.]"
1677 CALL print_rt_file(ft_unit, headers, omegas_pade_real, pol_results_pade)
1679 DEALLOCATE (headers)
1685 ALLOCATE (pol_results_pade_spin_total(n_elems, n_pade))
1686 pol_results_pade_spin_total(:, :) = (0.0_dp, 0.0_dp)
1689 pol_results_pade_spin_total(k, :) = pol_results_pade_spin_total(k, :) + &
1690 results_pade(3*(i - 1) + rtc%print_pol_elements(k, 1), :)
1692 pol_results_pade_spin_total(k, :) = pol_results_pade_spin_total(k, :)/( &
1693 field_results_pade(rtc%print_pol_elements(k, 2), :) + &
1694 field_results_pade(rtc%print_pol_elements(k, 2), 2)*1.0e-10_dp)
1697 file_form=
"FORMATTED", file_position=
"REWIND")
1698 IF (ft_unit > 0)
THEN
1699 ALLOCATE (headers(2*n_elems + 1))
1701 WRITE (headers(2*k),
"(A16,I2,I2)")
"re,pade,pol.", &
1702 rtc%print_pol_elements(k, 1), &
1703 rtc%print_pol_elements(k, 2)
1704 WRITE (headers(2*k + 1),
"(A16,I2,I2)")
"im,pade,pol.", &
1705 rtc%print_pol_elements(k, 1), &
1706 rtc%print_pol_elements(k, 2)
1708 IF (info_unit == ft_unit)
THEN
1709 headers(1) =
"# Energy [eV]"
1710 prefix =
" POLARIZABILITY_PADE|"
1711 prefix_format =
"(A21)"
1712 CALL print_rt_file(ft_unit, headers, omegas_pade_real, pol_results_pade_spin_total, &
1713 prefix, prefix_format,
evolt)
1715 headers(1) =
"# omega [at.u.]"
1716 CALL print_rt_file(ft_unit, headers, omegas_pade_real, pol_results_pade_spin_total)
1718 DEALLOCATE (headers)
1721 DEALLOCATE (pol_results_pade_spin_total)
1723 DEALLOCATE (field_results_pade)
1724 DEALLOCATE (pol_results_pade)
1727 IF (rtc%pade_requested .AND. (do_moments_ft .OR. do_polarizability))
THEN
1728 DEALLOCATE (omegas_complex)
1729 DEALLOCATE (omegas_pade)
1730 DEALLOCATE (omegas_pade_real)
1731 DEALLOCATE (results_pade)
1734 IF (do_polarizability)
THEN
1735 DEALLOCATE (pol_results)
1736 DEALLOCATE (field_results)
1739 IF (do_moments_ft .OR. do_polarizability)
THEN
1740 DEALLOCATE (results)
1744 CALL timestop(handle)
1759 SUBROUTINE print_rt_file(rt_unit, headers, xvals, yvals, prefix, prefix_format, xscale_opt, comp_opt)
1760 INTEGER,
INTENT(IN) :: rt_unit
1761 CHARACTER(len=20),
DIMENSION(:),
INTENT(IN), &
1763 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: xvals
1764 COMPLEX(kind=dp),
DIMENSION(:, :),
INTENT(IN) :: yvals
1765 CHARACTER(len=21),
INTENT(IN),
OPTIONAL :: prefix
1766 CHARACTER(len=5),
INTENT(IN),
OPTIONAL :: prefix_format
1767 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: xscale_opt
1768 INTEGER,
OPTIONAL :: comp_opt
1770 INTEGER :: do_comp, i, j, ncols, nrows
1771 LOGICAL :: do_headers, do_prefix
1772 REAL(kind=
dp) :: xscale
1775 IF (
PRESENT(prefix))
THEN
1776 IF (
PRESENT(prefix_format))
THEN
1779 cpabort(
"Printing of prefix with missing format!")
1784 IF (
PRESENT(xscale_opt)) xscale = xscale_opt
1786 ncols =
SIZE(yvals, 1)
1787 nrows =
SIZE(yvals, 2)
1791 IF (
PRESENT(comp_opt)) do_comp = comp_opt
1793 do_headers =
PRESENT(headers)
1795 IF (do_headers)
THEN
1798 cpabort(
"Not enought headers to print the file!")
1802 IF (
SIZE(xvals) < nrows)
THEN
1803 cpabort(
"Not enough xvals to print all yvals!")
1806 IF (rt_unit > 0)
THEN
1808 IF (do_headers)
THEN
1811 WRITE (rt_unit, prefix_format, advance=
"no") prefix
1813 WRITE (rt_unit,
"(A20)", advance=
"no") headers(1)
1815 SELECT CASE (do_comp)
1818 DO j = 1, 2*ncols - 1
1819 WRITE (rt_unit,
"(A20)", advance=
"no") headers(j + 1)
1821 WRITE (rt_unit,
"(A20)") headers(2*ncols + 1)
1825 WRITE (rt_unit,
"(A20)", advance=
"no") headers(j + 1)
1827 WRITE (rt_unit,
"(A20)") headers(ncols + 1)
1834 WRITE (rt_unit, prefix_format, advance=
"no") prefix
1836 WRITE (rt_unit,
"(E20.8E3)", advance=
"no") xvals(i)*xscale
1838 SELECT CASE (do_comp)
1840 WRITE (rt_unit,
"(E20.8E3)", advance=
"no") &
1843 WRITE (rt_unit,
"(E20.8E3)", advance=
"no") &
1847 WRITE (rt_unit,
"(E20.8E3,E20.8E3)", advance=
"no") &
1848 REAL(yvals(j, i)), aimag(yvals(j, i))
1852 SELECT CASE (do_comp)
1854 WRITE (rt_unit,
"(E20.8E3)") real(yvals(j, i))
1856 WRITE (rt_unit,
"(E20.8E3)") aimag(yvals(j, i))
1859 WRITE (rt_unit,
"(E20.8E3,E20.8E3)") &
1860 REAL(yvals(j, i)), aimag(yvals(j, i))
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_binary_write(matrix, filepath)
...
real(kind=dp) function, public dbcsr_get_occupation(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
subroutine, public dbcsr_trace(matrix, trace)
Computes the trace of the given matrix, also known as the sum of its diagonal elements.
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
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_double(fmstruct, struct, context, col, row)
creates a struct with twice the number of blocks on each core. If matrix A has to be multiplied with ...
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
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 ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
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...
character(len=default_string_length) function, public cp_iter_string(iter_info, print_key, for_file)
returns the iteration string, a string that is useful to create unique filenames (once you trim it)
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
logical function, public cp_printkey_is_on(iteration_info, print_key)
returns true if the printlevel activates this printkey does not look if this iteration it should be p...
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)
...
all routins needed for a nonperiodic electric field
subroutine, public make_field(dft_control, field, sim_step, sim_time)
computes the amplitude of the efield within a given envelop
Interface to the Greenx library.
subroutine, public greenx_refine_ft(fit_e_min, fit_e_max, x_fit, y_fit, x_eval, y_eval, n_pade_opt)
Refines the FT grid using Padé approximants.
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition of mathematical constants and functions.
real(kind=dp), parameter, public one
real(kind=dp), parameter, public twopi
real(kind=dp), parameter, public zero
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
represent a simple array based list of the given type
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis, ncgf)
Get the components of a particle set.
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public femtoseconds
real(kind=dp), parameter, public evolt
container for various plainwaves related things
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
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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, matrix_vhxc, 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_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, do_mtlr_present, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
given the response wavefunctions obtained by the application of the (rxp), p, and ((dk-dl)xp) operato...
subroutine, public calculate_jrho_resp(mat_d0, mat_jp, mat_jp_rii, mat_jp_riii, ib, idir, current_rs, current_gs, qs_env, current_env, soft_valid, retain_rsgrid)
Calculation of the idir component of the response current density in the presence of a constant magne...
Type definitiona for linear response calculations.
Definition and initialisation of the mo data type.
subroutine, public write_rt_mos_to_restart(mo_array, rt_mos, particle_set, dft_section, qs_kind_set)
...
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public build_lin_mom_matrix(qs_env, matrix)
Calculation of the linear momentum matrix <mu|∂|nu> over Cartesian Gaussian functions.
superstucture that hold various representations of the density and keeps track of which ones are vali...
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...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public write_mo_free_results(qs_env)
Write QS results always available (if switched on through the print_keys) Can be called from ls_scf.
subroutine, public qs_scf_post_moments(input, logger, qs_env, output_unit)
Computes and prints electric moments.
subroutine, public write_mo_dependent_results(qs_env, scf_env)
Write QS results available if MO's are present (if switched on through the print_keys) Writes only MO...
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.
module that contains the definitions of the scf types
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)
...
Function related to MO projection in RTP calculations.
subroutine, public compute_and_write_proj_mo(qs_env, mos_new, proj_mo, n_proj)
Compute the projection of the current MO coefficients on reference ones and write the results.
Separation of Fourier transform utilities into separate file.
subroutine, public multi_fft(time_series, value_series, result_series, omega_series, damping_opt, t0_opt, subtract_initial_opt)
Calculates the Fourier transform - couples to FFT libraries in CP2K, if available.
Routine for the real time propagation output.
subroutine, public print_ft(rtp_section, moments, times, fields, rtc, info_opt, cell)
Calculate and print the Fourier transforms + polarizabilites from moment trace.
subroutine, public report_density_occupation(filter_eps, rho)
Reports the sparsity pattern of the complex density matrix.
subroutine, public print_rt_file(rt_unit, headers, xvals, yvals, prefix, prefix_format, xscale_opt, comp_opt)
...
subroutine, public rt_prop_output(qs_env, run_type, delta_iter, used_time)
...
subroutine, public print_moments(moments_section, info_unit, moments, time, imag_opt, append_opt)
Print the dipole moments into a file.
subroutine, public rt_convergence(rtp, matrix_s, delta_mos, delta_eps)
computes the convergence criterion for RTP and EMD
integer, parameter, public rt_file_comp_both
subroutine, public calc_local_moment(moment_matrices, density_matrices, work, moment, imag_opt)
Calculate the values of real/imaginary parts of moments in all directions.
integer, parameter, public rt_file_comp_imag
integer, parameter, public rt_file_comp_real
subroutine, public rt_convergence_density(rtp, delta_p, delta_eps)
computes the convergence criterion for RTP and EMD based on the density matrix
Types and set_get for real time propagation depending on runtype and diagonalization method different...
subroutine, public get_rtp(rtp, exp_h_old, exp_h_new, h_last_iter, rho_old, rho_next, rho_new, mos, mos_new, mos_old, mos_next, s_inv, s_half, s_minus_half, b_mat, c_mat, propagator_matrix, mixing, mixing_factor, s_der, dt, nsteps, sinvh, sinvh_imag, sinvb, admm_mos)
...
subroutine, public write_rtp_mos_to_output_unit(qs_env, rtp)
...
subroutine, public write_rtp_mo_cubes(qs_env, rtp)
Write the time dependent amplitude of the MOs in real grid. Very close to qs_scf_post_gpw/qs_scf_post...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represent a list of objects
contained for different pw related things
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.
keeps the density in various representations, keeping track of which ones are valid.