34 USE dbcsr_api,
ONLY: dbcsr_copy,&
39 dbcsr_type_antisymmetric,&
40 dbcsr_type_no_symmetry
71 #include "./base/base_uses.f90"
80 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_vcd_utils'
82 REAL(dp),
DIMENSION(3, 3, 3),
PARAMETER :: Levi_Civita = reshape((/ &
83 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, -1.0_dp, 0.0_dp, 1.0_dp, 0.0_dp, &
84 0.0_dp, 0.0_dp, 1.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, -1.0_dp, 0.0_dp, 0.0_dp, &
85 0.0_dp, -1.0_dp, 0.0_dp, 1.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp/), (/3, 3, 3/))
96 TYPE(vcd_env_type),
TARGET :: vcd_env
97 TYPE(qs_environment_type),
POINTER :: qs_env
99 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vcd_env_init'
101 INTEGER :: handle, i, idir, ispin, j, natom, &
102 nspins, output_unit, reference, &
105 REAL(kind=dp),
DIMENSION(:),
POINTER :: ref_point
106 TYPE(cell_type),
POINTER :: cell
107 TYPE(cp_logger_type),
POINTER :: logger
108 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, my_matrix_hr_1d
109 TYPE(dft_control_type),
POINTER :: dft_control
110 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
111 POINTER :: sab_all, sab_orb, sap_ppnl
112 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
113 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
114 TYPE(qs_ks_env_type),
POINTER :: ks_env
115 TYPE(section_vals_type),
POINTER :: lr_section, vcd_section
117 CALL timeset(routinen, handle)
118 vcd_env%do_mfp = .false.
121 NULLIFY (logger, vcd_section, lr_section)
125 extension=
".data", middle_name=
"vcd", log_filename=.false., &
126 file_position=
"REWIND", file_status=
"REPLACE")
130 extension=
".linresLog")
131 unit_number =
cp_print_key_unit_nr(logger, lr_section,
"PRINT%PROGRAM_RUN_INFO", extension=
".linresLog")
137 IF (output_unit > 0)
THEN
138 WRITE (output_unit,
"(/,T20,A,/)")
"*** Start NVPT/MFPT calculation ***"
145 CALL section_vals_val_get(vcd_section,
"ORIGIN_DEPENDENT_MFP", l_val=vcd_env%origin_dependent_op_mfp)
148 vcd_env%magnetic_origin = 0._dp
149 vcd_env%spatial_origin = 0._dp
157 cpabort(
"User-defined reference point should be given explicitly")
161 reference=reference, &
171 cpabort(
"User-defined reference point should be given explicitly")
175 reference=reference, &
178 IF (vcd_env%distributed_origin .AND. any(vcd_env%magnetic_origin /= vcd_env%spatial_origin))
THEN
179 cpwarn(
"The magnetic and spatial origins don't match")
183 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,3F10.6)") &
184 'The reference point is', vcd_env%dcdr_env%ref_point
185 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,3F10.6)") &
186 'The magnetic origin is', vcd_env%magnetic_origin
187 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,3F10.6)") &
188 'The velocity origin is', vcd_env%spatial_origin
190 vcd_env%magnetic_origin_atom = vcd_env%magnetic_origin
191 vcd_env%spatial_origin_atom = vcd_env%spatial_origin
195 dft_control=dft_control, &
199 particle_set=particle_set, &
200 matrix_ks=matrix_ks, &
202 qs_kind_set=qs_kind_set)
204 natom =
SIZE(particle_set)
205 nspins = dft_control%nspins
207 ALLOCATE (vcd_env%apt_el_nvpt(3, 3, natom))
208 ALLOCATE (vcd_env%apt_nuc_nvpt(3, 3, natom))
209 ALLOCATE (vcd_env%apt_total_nvpt(3, 3, natom))
210 ALLOCATE (vcd_env%aat_atom_nvpt(3, 3, natom))
211 ALLOCATE (vcd_env%aat_atom_mfp(3, 3, natom))
212 vcd_env%apt_el_nvpt = 0._dp
213 vcd_env%apt_nuc_nvpt = 0._dp
214 vcd_env%apt_total_nvpt = 0._dp
215 vcd_env%aat_atom_nvpt = 0._dp
216 vcd_env%aat_atom_mfp = 0._dp
218 ALLOCATE (vcd_env%dCV(nspins))
219 ALLOCATE (vcd_env%dCV_prime(nspins))
220 ALLOCATE (vcd_env%op_dV(nspins))
221 ALLOCATE (vcd_env%op_dB(nspins))
223 CALL cp_fm_create(vcd_env%dCV(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct)
224 CALL cp_fm_create(vcd_env%dCV_prime(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct)
225 CALL cp_fm_create(vcd_env%op_dV(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct)
226 CALL cp_fm_create(vcd_env%op_dB(ispin), vcd_env%dcdr_env%likemos_fm_struct(1)%struct)
229 ALLOCATE (vcd_env%dCB(3))
230 ALLOCATE (vcd_env%dCB_prime(3))
232 CALL cp_fm_create(vcd_env%dCB(i), vcd_env%dcdr_env%likemos_fm_struct(1)%struct)
233 CALL cp_fm_create(vcd_env%dCB_prime(i), vcd_env%dcdr_env%likemos_fm_struct(1)%struct)
263 CALL dbcsr_init_p(vcd_env%moments_der(i, idir)%matrix)
264 CALL dbcsr_init_p(vcd_env%moments_der_right(i, idir)%matrix)
265 CALL dbcsr_init_p(vcd_env%moments_der_left(i, idir)%matrix)
267 CALL dbcsr_create(vcd_env%moments_der(i, idir)%matrix, template=matrix_ks(1)%matrix, &
268 matrix_type=dbcsr_type_antisymmetric)
270 CALL dbcsr_set(vcd_env%moments_der(i, idir)%matrix, 0.0_dp)
273 CALL dbcsr_copy(vcd_env%moments_der_right(i, idir)%matrix, &
274 vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
275 CALL dbcsr_copy(vcd_env%moments_der_left(i, idir)%matrix, &
276 vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
282 CALL dbcsr_init_p(vcd_env%matrix_difdip2(i, j)%matrix)
283 CALL dbcsr_copy(vcd_env%matrix_difdip2(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
284 CALL dbcsr_set(vcd_env%matrix_difdip2(i, j)%matrix, 0.0_dp)
286 CALL dbcsr_init_p(vcd_env%matrix_nosym_temp_33(i, j)%matrix)
287 CALL dbcsr_create(vcd_env%matrix_nosym_temp_33(i, j)%matrix, template=matrix_ks(1)%matrix, &
288 matrix_type=dbcsr_type_no_symmetry)
290 CALL dbcsr_set(vcd_env%matrix_nosym_temp_33(i, j)%matrix, 0._dp)
292 CALL dbcsr_init_p(vcd_env%matrix_nosym_temp2_33(i, j)%matrix)
293 CALL dbcsr_create(vcd_env%matrix_nosym_temp2_33(i, j)%matrix, template=matrix_ks(1)%matrix, &
294 matrix_type=dbcsr_type_no_symmetry)
296 CALL dbcsr_set(vcd_env%matrix_nosym_temp2_33(i, j)%matrix, 0._dp)
299 CALL dbcsr_init_p(vcd_env%matrix_dSdV(i)%matrix)
300 CALL dbcsr_copy(vcd_env%matrix_dSdV(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
301 CALL dbcsr_init_p(vcd_env%matrix_dSdB(i)%matrix)
302 CALL dbcsr_copy(vcd_env%matrix_dSdB(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
306 CALL dbcsr_init_p(vcd_env%matrix_hxc_dsdv(ispin)%matrix)
307 CALL dbcsr_copy(vcd_env%matrix_hxc_dsdv(ispin)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
313 CALL dbcsr_init_p(vcd_env%dipvel_ao(i)%matrix)
314 CALL dbcsr_copy(vcd_env%dipvel_ao(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
316 CALL dbcsr_init_p(vcd_env%dipvel_ao_delta(i)%matrix)
317 CALL dbcsr_copy(vcd_env%dipvel_ao_delta(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
322 CALL dbcsr_init_p(vcd_env%hcom(i)%matrix)
323 CALL dbcsr_create(vcd_env%hcom(i)%matrix, template=matrix_ks(1)%matrix, &
324 matrix_type=dbcsr_type_antisymmetric)
327 CALL dbcsr_init_p(vcd_env%matrix_rxrv(i)%matrix)
328 CALL dbcsr_create(vcd_env%matrix_rxrv(i)%matrix, template=matrix_ks(1)%matrix, &
329 matrix_type=dbcsr_type_antisymmetric)
333 CALL dbcsr_init_p(vcd_env%matrix_rcomr(i, j)%matrix)
334 CALL dbcsr_copy(vcd_env%matrix_rcomr(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
335 CALL dbcsr_init_p(vcd_env%matrix_rrcom(i, j)%matrix)
336 CALL dbcsr_copy(vcd_env%matrix_rrcom(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
337 CALL dbcsr_init_p(vcd_env%matrix_dcom(i, j)%matrix)
338 CALL dbcsr_copy(vcd_env%matrix_dcom(i, j)%matrix, matrix_ks(1)%matrix)
339 CALL dbcsr_set(vcd_env%matrix_dcom(i, j)%matrix, 0._dp)
341 CALL dbcsr_init_p(vcd_env%matrix_r_rxvr(i, j)%matrix)
342 CALL dbcsr_copy(vcd_env%matrix_r_rxvr(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
343 CALL dbcsr_set(vcd_env%matrix_r_rxvr(i, j)%matrix, 0._dp)
345 CALL dbcsr_init_p(vcd_env%matrix_rxvr_r(i, j)%matrix)
346 CALL dbcsr_copy(vcd_env%matrix_rxvr_r(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
347 CALL dbcsr_set(vcd_env%matrix_rxvr_r(i, j)%matrix, 0._dp)
349 CALL dbcsr_init_p(vcd_env%matrix_r_doublecom(i, j)%matrix)
350 CALL dbcsr_copy(vcd_env%matrix_r_doublecom(i, j)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
351 CALL dbcsr_set(vcd_env%matrix_r_doublecom(i, j)%matrix, 0._dp)
358 CALL dbcsr_init_p(vcd_env%matrix_hr(ispin, i)%matrix)
359 CALL dbcsr_copy(vcd_env%matrix_hr(ispin, i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
361 CALL dbcsr_init_p(vcd_env%matrix_rh(ispin, i)%matrix)
362 CALL dbcsr_copy(vcd_env%matrix_rh(ispin, i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
368 CALL dbcsr_init_p(vcd_env%matrix_drpnl(i)%matrix)
369 CALL dbcsr_copy(vcd_env%matrix_drpnl(i)%matrix, vcd_env%dcdr_env%matrix_nosym_temp(1)%matrix)
374 my_matrix_hr_1d => vcd_env%matrix_hr(1, 1:3)
375 CALL build_rpnl_matrix(my_matrix_hr_1d, qs_kind_set, particle_set, sab_all, sap_ppnl, &
376 dft_control%qs_control%eps_ppnl, cell, [0._dp, 0._dp, 0._dp], &
378 CALL build_tr_matrix(my_matrix_hr_1d, qs_env, qs_kind_set,
"ORB", sab_all, &
379 direction_or=.true., rc=[0._dp, 0._dp, 0._dp])
380 CALL build_rcore_matrix(my_matrix_hr_1d, qs_env, qs_kind_set,
"ORB", sab_all, [0._dp, 0._dp, 0._dp])
383 my_matrix_hr_1d => vcd_env%matrix_rh(1, 1:3)
384 CALL build_rpnl_matrix(my_matrix_hr_1d, qs_kind_set, particle_set, sab_all, sap_ppnl, &
385 dft_control%qs_control%eps_ppnl, cell, [0._dp, 0._dp, 0._dp], &
386 direction_or=.false.)
387 CALL build_tr_matrix(my_matrix_hr_1d, qs_env, qs_kind_set,
"ORB", sab_all, &
388 direction_or=.false., rc=[0._dp, 0._dp, 0._dp])
389 CALL build_rcore_matrix(my_matrix_hr_1d, qs_env, qs_kind_set,
"ORB", sab_all, [0._dp, 0._dp, 0._dp])
394 CALL build_com_mom_nl(qs_kind_set, sab_orb, sap_ppnl, dft_control%qs_control%eps_ppnl, &
395 particle_set, cell=cell, matrix_rv=vcd_env%hcom)
397 CALL build_com_rpnl_r(vcd_env%matrix_rcomr, qs_kind_set, sab_all, sap_ppnl, &
398 dft_control%qs_control%eps_ppnl, particle_set, cell, .true.)
399 CALL build_com_rpnl_r(vcd_env%matrix_rrcom, qs_kind_set, sab_all, sap_ppnl, &
400 dft_control%qs_control%eps_ppnl, particle_set, cell, .false.)
408 nmoments_der=2, nmoments=0, ref_point=[0._dp, 0._dp, 0._dp])
411 CALL build_com_mom_nl(qs_kind_set, sab_orb, sap_ppnl, dft_control%qs_control%eps_ppnl, &
412 particle_set, matrix_rxrv=vcd_env%matrix_rxrv, ref_point=[0._dp, 0._dp, 0._dp], &
415 CALL build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, dft_control%qs_control%eps_ppnl, &
416 particle_set, ref_point=[0._dp, 0._dp, 0._dp], cell=cell, &
417 matrix_r_rxvr=vcd_env%matrix_r_rxvr)
419 CALL build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, dft_control%qs_control%eps_ppnl, &
420 particle_set, ref_point=[0._dp, 0._dp, 0._dp], cell=cell, &
421 matrix_rxvr_r=vcd_env%matrix_rxvr_r)
426 "PRINT%PROGRAM_RUN_INFO")
428 CALL timestop(handle)
440 TYPE(qs_environment_type),
POINTER :: qs_env
441 TYPE(vcd_env_type) :: vcd_env
443 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vcd_env_cleanup'
447 CALL timeset(routinen, handle)
452 DEALLOCATE (vcd_env%apt_el_nvpt)
453 DEALLOCATE (vcd_env%apt_nuc_nvpt)
454 DEALLOCATE (vcd_env%apt_total_nvpt)
455 DEALLOCATE (vcd_env%aat_atom_nvpt)
456 DEALLOCATE (vcd_env%aat_atom_mfp)
458 CALL cp_fm_release(vcd_env%dCV)
459 CALL cp_fm_release(vcd_env%dCV_prime)
460 CALL cp_fm_release(vcd_env%op_dV)
461 CALL cp_fm_release(vcd_env%op_dB)
463 CALL cp_fm_release(vcd_env%dCB)
464 CALL cp_fm_release(vcd_env%dCB_prime)
493 CALL timestop(handle)
508 TYPE(qs_environment_type),
POINTER :: qs_env
509 TYPE(section_vals_type),
POINTER :: linres_section
510 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: vec
511 INTEGER,
INTENT(IN) :: lambda, beta
512 CHARACTER(LEN=*) :: tag
514 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vcd_read_restart'
516 CHARACTER(LEN=default_path_length) :: filename
517 CHARACTER(LEN=default_string_length) :: my_middle
518 INTEGER :: beta_tmp, handle, i, i_block, ia, ie, iostat, iounit, ispin, j, lambda_tmp, &
519 max_block, n_rep_val, nao, nao_tmp, nmo, nmo_tmp, nspins, nspins_tmp, rst_unit
520 LOGICAL :: file_exists
521 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: vecbuffer
522 TYPE(cp_fm_type),
POINTER :: mo_coeff
523 TYPE(cp_logger_type),
POINTER :: logger
524 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
525 TYPE(mp_para_env_type),
POINTER :: para_env
526 TYPE(section_vals_type),
POINTER :: print_key
528 file_exists = .false.
530 CALL timeset(routinen, handle)
532 NULLIFY (mos, para_env, logger, print_key, vecbuffer)
536 "PRINT%PROGRAM_RUN_INFO", extension=
".Log")
545 IF (para_env%is_source())
THEN
550 my_middle =
"RESTART-"//tag(ia:ie)//trim(
"-")//trim(adjustl(cp_to_string(beta))) &
551 //trim(
"-")//trim(adjustl(cp_to_string(lambda)))
553 IF (n_rep_val > 0)
THEN
556 filename = filename(ia:ie)//trim(my_middle)//
".lr"
561 extension=
".lr", middle_name=trim(my_middle), my_local=.false.)
563 INQUIRE (file=filename, exist=file_exists)
566 IF (file_exists)
THEN
567 CALL open_file(file_name=trim(filename), &
568 file_action=
"READ", &
569 file_form=
"UNFORMATTED", &
570 file_position=
"REWIND", &
572 unit_number=rst_unit)
574 IF (iounit > 0)
WRITE (iounit,
"(T2,A)") &
575 "LINRES| Reading response wavefunctions from the restart file <"//trim(adjustl(filename))//
">"
577 IF (iounit > 0)
WRITE (iounit,
"(T2,A)") &
578 "LINRES| Restart file <"//trim(adjustl(filename))//
"> not found"
582 CALL para_env%bcast(file_exists)
584 IF (file_exists)
THEN
587 CALL cp_fm_get_info(mo_coeff, nrow_global=nao, ncol_block=max_block)
589 ALLOCATE (vecbuffer(nao, max_block))
592 IF (rst_unit > 0)
READ (rst_unit, iostat=iostat) lambda_tmp, beta_tmp, nspins_tmp, nao_tmp
593 CALL para_env%bcast(iostat)
595 CALL para_env%bcast(beta_tmp)
596 CALL para_env%bcast(lambda_tmp)
597 CALL para_env%bcast(nspins_tmp)
598 CALL para_env%bcast(nao_tmp)
602 IF (nspins_tmp .NE. nspins)
THEN
603 cpabort(
"nspins not consistent")
605 IF (nao_tmp .NE. nao) cpabort(
"nao not consistent")
608 IF (lambda_tmp .NE. lambda) cpabort(
"lambda not consistent")
609 IF (beta_tmp .NE. beta) cpabort(
"beta not consistent")
612 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
615 IF (rst_unit > 0)
READ (rst_unit) nmo_tmp
616 CALL para_env%bcast(nmo_tmp)
617 IF (nmo_tmp .NE. nmo) cpabort(
"nmo not consistent")
620 DO i = 1, nmo, max(max_block, 1)
621 i_block = min(max_block, nmo - i + 1)
623 IF (rst_unit > 0)
READ (rst_unit) vecbuffer(1:nao, j)
625 CALL para_env%bcast(vecbuffer)
630 IF (iostat /= 0)
THEN
631 IF (iounit > 0)
WRITE (iounit,
"(T2,A)") &
632 "LINRES| Restart file <"//trim(adjustl(filename))//
"> not found"
635 DEALLOCATE (vecbuffer)
639 IF (para_env%is_source())
THEN
640 IF (file_exists)
CALL close_file(unit_number=rst_unit)
643 CALL timestop(handle)
658 TYPE(qs_environment_type),
POINTER :: qs_env
659 TYPE(section_vals_type),
POINTER :: linres_section
660 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: vec
661 INTEGER,
INTENT(IN) :: lambda, beta
662 CHARACTER(LEN=*) :: tag
664 CHARACTER(LEN=*),
PARAMETER :: routinen =
'vcd_write_restart'
666 CHARACTER(LEN=default_path_length) :: filename
667 CHARACTER(LEN=default_string_length) :: my_middle, my_pos, my_status
668 INTEGER :: handle, i, i_block, ia, ie, iounit, &
669 ispin, j, max_block, nao, nmo, nspins, &
671 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: vecbuffer
672 TYPE(cp_fm_type),
POINTER :: mo_coeff
673 TYPE(cp_logger_type),
POINTER :: logger
674 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
675 TYPE(mp_para_env_type),
POINTER :: para_env
676 TYPE(section_vals_type),
POINTER :: print_key
678 NULLIFY (logger, mo_coeff, mos, para_env, print_key, vecbuffer)
680 CALL timeset(routinen, handle)
685 used_print_key=print_key), &
689 "PRINT%PROGRAM_RUN_INFO", extension=
".Log")
697 my_status =
"REPLACE"
700 my_middle =
"RESTART-"//tag(ia:ie)//trim(
"-")//trim(adjustl(cp_to_string(beta))) &
701 //trim(
"-")//trim(adjustl(cp_to_string(lambda)))
703 extension=
".lr", middle_name=trim(my_middle), file_status=trim(my_status), &
704 file_position=trim(my_pos), file_action=
"WRITE", file_form=
"UNFORMATTED")
707 extension=
".lr", middle_name=trim(my_middle), my_local=.false.)
710 WRITE (unit=iounit, fmt=
"(T2,A)") &
711 "LINRES| Writing response functions to the restart file <"//trim(adjustl(filename))//
">"
718 CALL cp_fm_get_info(mo_coeff, nrow_global=nao, ncol_block=max_block)
719 ALLOCATE (vecbuffer(nao, max_block))
721 IF (rst_unit > 0)
WRITE (rst_unit) lambda, beta, nspins, nao
726 IF (rst_unit > 0)
WRITE (rst_unit) nmo
728 DO i = 1, nmo, max(max_block, 1)
729 i_block = min(max_block, nmo - i + 1)
735 IF (rst_unit > 0)
WRITE (rst_unit) vecbuffer(1:nao, j)
740 DEALLOCATE (vecbuffer)
746 CALL timestop(handle)
757 TYPE(vcd_env_type) :: vcd_env
758 TYPE(qs_environment_type),
POINTER :: qs_env
760 CHARACTER(len=*),
PARAMETER :: routinen =
'vcd_print'
762 CHARACTER(LEN=default_string_length) :: description
763 INTEGER :: alpha, beta, delta,
gamma, handle, i, l, &
764 lambda, natom, nsubset, output_unit
765 REAL(dp) :: mean, standard_deviation, &
766 standard_deviation_sum
767 REAL(dp),
DIMENSION(:, :, :),
POINTER :: apt_el_dcdr, apt_el_nvpt, apt_nuc_dcdr, &
768 apt_nuc_nvpt, apt_total_dcdr, &
770 REAL(dp),
DIMENSION(:, :, :, :),
POINTER :: apt_center_dcdr, apt_subset_dcdr
771 REAL(kind=dp),
DIMENSION(3, 3) :: sum_rule_0, sum_rule_0_second, &
772 sum_rule_1, sum_rule_2, &
773 sum_rule_2_second, sum_rule_3_mfp, &
775 TYPE(cp_logger_type),
POINTER :: logger
776 TYPE(cp_result_type),
POINTER :: results
777 TYPE(molecule_type),
DIMENSION(:),
POINTER :: molecule_set
778 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
779 TYPE(section_vals_type),
POINTER :: vcd_section
781 CALL timeset(routinen, handle)
790 NULLIFY (particle_set)
791 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, molecule_set=molecule_set)
792 natom =
SIZE(particle_set)
793 nsubset =
SIZE(molecule_set)
795 apt_el_dcdr => vcd_env%dcdr_env%apt_el_dcdr
796 apt_nuc_dcdr => vcd_env%dcdr_env%apt_nuc_dcdr
797 apt_total_dcdr => vcd_env%dcdr_env%apt_total_dcdr
798 apt_subset_dcdr => vcd_env%dcdr_env%apt_el_dcdr_per_subset
799 apt_center_dcdr => vcd_env%dcdr_env%apt_el_dcdr_per_center
801 apt_el_nvpt => vcd_env%apt_el_nvpt
802 apt_nuc_nvpt => vcd_env%apt_nuc_nvpt
803 apt_total_nvpt => vcd_env%apt_total_nvpt
805 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A)") &
806 'APT | Write the final APT matrix per atom (Position perturbation)'
808 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,I3,A,F15.6)") &
809 'APT | Atom', l,
' - GAPT ', &
810 (apt_total_dcdr(1, 1, l) &
811 + apt_total_dcdr(2, 2, l) &
812 + apt_total_dcdr(3, 3, l))/3._dp
814 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,F15.6,F15.6,F15.6)")
"APT | ", apt_total_dcdr(i, :, l)
818 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A)") &
819 'NVP | Write the final APT matrix per atom (Velocity perturbation)'
821 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,I3,A,F15.6)") &
822 'NVP | Atom', l,
' - GAPT ', &
823 (apt_total_nvpt(1, 1, l) &
824 + apt_total_nvpt(2, 2, l) &
825 + apt_total_nvpt(3, 3, l))/3._dp
827 IF (vcd_env%output_unit > 0) &
828 WRITE (vcd_env%output_unit,
"(A,F15.6,F15.6,F15.6)") &
829 "NVP | ", apt_total_nvpt(i, :, l)
833 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A)") &
834 'NVP | Write the final AAT matrix per atom (Velocity perturbation)'
836 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,I3)") &
839 IF (vcd_env%output_unit > 0) &
840 WRITE (vcd_env%output_unit,
"(A,F15.6,F15.6,F15.6)") &
841 "NVP | ", vcd_env%aat_atom_nvpt(i, :, l)
845 IF (vcd_env%do_mfp)
THEN
846 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A)") &
847 'MFP | Write the final AAT matrix per atom (Magnetic Field perturbation)'
849 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,I3)") &
852 IF (vcd_env%output_unit > 0) &
853 WRITE (vcd_env%output_unit,
"(A,F15.6,F15.6,F15.6)") &
854 "MFP | ", vcd_env%aat_atom_mfp(i, :, l)
861 description =
"[DIPOLE]"
862 CALL get_results(results=results, description=description, values=vcd_env%dcdr_env%dipole_pos(1:3))
868 sum_rule_0_second = 0._dp
869 sum_rule_2_second = 0._dp
870 sum_rule_3_second = 0._dp
871 sum_rule_3_mfp = 0._dp
872 standard_deviation = 0._dp
873 standard_deviation_sum = 0._dp
879 sum_rule_0(alpha, beta) = sum_rule_0(alpha, beta) &
880 + apt_total_dcdr(alpha, beta, lambda)
881 sum_rule_0_second(alpha, beta) = sum_rule_0_second(alpha, beta) &
882 + apt_total_nvpt(alpha, beta, lambda)
887 sum_rule_1(alpha, beta) = sum_rule_1(alpha, beta) &
888 + levi_civita(alpha, beta,
gamma)*vcd_env%dcdr_env%dipole_pos(
gamma)
895 sum_rule_2(alpha, beta) = sum_rule_2(alpha, beta) &
896 + levi_civita(beta,
gamma, delta) &
897 *particle_set(lambda)%r(
gamma) &
898 *apt_total_dcdr(delta, alpha, lambda)
899 sum_rule_2_second(alpha, beta) = sum_rule_2_second(alpha, beta) &
900 + levi_civita(beta,
gamma, delta) &
901 *particle_set(lambda)%r(
gamma) &
902 *apt_total_nvpt(delta, alpha, lambda)
909 sum_rule_3_second(alpha, beta) = sum_rule_3_second(alpha, beta) &
910 + vcd_env%aat_atom_nvpt(alpha, beta, lambda)
914 IF (vcd_env%do_mfp)
THEN
917 sum_rule_3_mfp(alpha, beta) = sum_rule_3_mfp(alpha, beta) &
918 + vcd_env%aat_atom_mfp(alpha, beta, lambda)
925 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A)")
"APT | Position perturbation sum rules"
926 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(A,T19,A,T35,A,T50,A,T65,A)") &
927 "APT |",
" Total APT",
"Dipole",
"R * APT",
"AAT"
928 standard_deviation_sum = 0._dp
931 mean = (sum_rule_1(alpha, beta) + sum_rule_2(alpha, beta) + sum_rule_3_mfp(alpha, beta))/3
932 standard_deviation = &
933 sqrt((sum_rule_1(alpha, beta)**2 + sum_rule_2(alpha, beta)**2 + sum_rule_3_mfp(alpha, beta)**2)/3 &
935 standard_deviation_sum = standard_deviation_sum + standard_deviation
937 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit, &
938 "(A,I3,I3,F15.6,F15.6,F15.6,F15.6,F15.6)") &
941 sum_rule_0(alpha, beta), &
942 sum_rule_1(alpha, beta), &
943 sum_rule_2(alpha, beta), &
944 sum_rule_3_mfp(alpha, beta), &
948 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(T73,F15.6)") standard_deviation_sum
950 IF (vcd_env%output_unit > 0)
THEN
951 WRITE (vcd_env%output_unit,
"(A)")
"NVP | Velocity perturbation sum rules"
952 WRITE (vcd_env%output_unit,
"(A,T19,A,T35,A,T50,A,T65,A)")
"NVP |",
" Total APT",
"Dipole",
"R * APT",
"AAT"
955 standard_deviation_sum = 0._dp
958 mean = (sum_rule_1(alpha, beta) + sum_rule_2_second(alpha, beta) + sum_rule_3_second(alpha, beta))/3
959 standard_deviation = &
960 sqrt((sum_rule_1(alpha, beta)**2 + sum_rule_2_second(alpha, beta)**2 + sum_rule_3_second(alpha, beta)**2)/3 &
962 standard_deviation_sum = standard_deviation_sum + standard_deviation
963 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit, &
964 "(A,I3,I3,F15.6,F15.6,F15.6,F15.6,F15.6)") &
968 sum_rule_0_second(alpha, beta), &
969 sum_rule_1(alpha, beta), &
970 sum_rule_2_second(alpha, beta), &
971 sum_rule_3_second(alpha, beta), &
975 IF (vcd_env%output_unit > 0)
WRITE (vcd_env%output_unit,
"(T73,F15.6)") standard_deviation_sum
977 CALL timestop(handle)
Handles all functions related to the CELL.
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_com_mom_nl(qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, cell, matrix_rv, matrix_rxrv, matrix_rrv, matrix_rvr, matrix_rrv_vrr, matrix_r_rxvr, matrix_rxvr_r, matrix_r_doublecom, pseudoatom, ref_point)
Calculate [r,Vnl] (matrix_rv), r x [r,Vnl] (matrix_rxrv) or [rr,Vnl] (matrix_rrv) in AO basis....
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
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_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
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)
...
character(len=default_path_length) function, public cp_print_key_generate_filename(logger, print_key, middle_name, extension, my_local)
Utility function that returns a unit number to write the print key. Might open a file with a unique f...
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...
set of type/routines to handle the storage of results in force_envs
set of type/routines to handle the storage of results in force_envs
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Interface to the message passing library MPI.
Define the data structure for the molecule information.
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
Define the data structure for the particle information.
Calculate the derivatives of the MO coefficients wrt nuclear coordinates.
subroutine, public dcdr_env_cleanup(qs_env, dcdr_env)
Deallocate the dcdr environment.
subroutine, public dcdr_env_init(dcdr_env, qs_env)
Initialize the dcdr environment.
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_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, 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, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
Type definitiona for linear response calculations.
Definition and initialisation of the mo data type.
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.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public build_local_moments_der_matrix(qs_env, moments_der, nmoments_der, nmoments, ref_point, moments)
Calculate right-hand sided derivatives of multipole moments, e. g. < a | xy d/dz | b > Optionally sto...
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.
subroutine, public build_tr_matrix(matrix_tr, qs_env, qs_kind_set, basis_type, sab_nl, direction_Or, rc)
Calculation of the product Tr or rT over Cartesian Gaussian functions.
subroutine, public build_matrix_r_vhxc(matrix_rv, qs_env, rc)
Commutator of the Hartree+XC potentials with r.
subroutine, public build_rcore_matrix(matrix_rcore, qs_env, qs_kind_set, basis_type, sab_nl, rf)
Commutator of the of the local part of the pseudopotential with r.
subroutine, public build_rpnl_matrix(matrix_rv, qs_kind_set, particle_set, sab_all, sap_ppnl, eps_ppnl, cell, ref_point, direction_Or)
Product of r with V_nl. Adapted from build_com_rpnl.
subroutine, public build_com_rpnl_r(matrix_rv, qs_kind_set, sab_all, sap_ppnl, eps_ppnl, particle_set, cell, direction_Or)
Builds the [Vnl, r] * r from either side.
subroutine, public vcd_print(vcd_env, qs_env)
Print the APTs, AATs, and sum rules.
subroutine, public vcd_env_cleanup(qs_env, vcd_env)
Deallocate the vcd environment.
subroutine, public vcd_write_restart(qs_env, linres_section, vec, lambda, beta, tag)
Copied from linres_write_restart.
subroutine, public vcd_env_init(vcd_env, qs_env)
Initialize the vcd environment.
subroutine, public vcd_read_restart(qs_env, linres_section, vec, lambda, beta, tag)
Copied from linres_read_restart.
Utilities for string manipulations.
elemental subroutine, public xstring(string, ia, ib)
...