71#include "./base/base_uses.f90"
79 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ec_external'
97 LOGICAL,
INTENT(IN) :: calculate_forces
99 CHARACTER(len=*),
PARAMETER :: routinen =
'ec_ext_energy'
101 INTEGER :: handle, ispin, nocc, nspins, unit_nr
102 REAL(kind=
dp) :: focc
104 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: cpmos, mo_occ, mo_ref
111 CALL timeset(routinen, handle)
113 CALL get_qs_env(qs_env, dft_control=dft_control)
114 nspins = dft_control%nspins
117 IF (logger%para_env%is_source())
THEN
124 ALLOCATE (cpmos(nspins), mo_ref(nspins), mo_occ(nspins))
128 IF (ec_env%debug_external)
THEN
131 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=nocc)
134 template_fmstruct=mo_coeff%matrix_struct)
144 ec_env%mo_occ => mo_ref
145 CALL ec_ext_debug(qs_env, ec_env, calculate_forces, unit_nr)
147 IF (calculate_forces)
THEN
149 IF (nspins == 1) focc = 4.0_dp
151 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=nocc)
153 cpmos(ispin), nocc, &
154 alpha=focc, beta=0.0_dp)
157 ec_env%cpmos => cpmos
160 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=nocc)
163 template_fmstruct=mo_coeff%matrix_struct)
174 CALL ec_ext_interface(qs_env, ec_env%exresp_fn, mo_occ, mo_ref, cpmos, calculate_forces, unit_nr)
175 ec_env%mo_occ => mo_ref
176 ec_env%cpmos => cpmos
179 IF (calculate_forces)
THEN
183 CALL align_vectors(ec_env%cpmos(ispin), ec_env%mo_occ(ispin), mo_occ(ispin), &
184 matrix_s(1)%matrix, unit_nr)
187 CALL ec_ext_setup(qs_env, ec_env, .true., unit_nr)
189 CALL matrix_r_forces(qs_env, ec_env%cpmos, ec_env%mo_occ, &
190 ec_env%matrix_w(1, 1)%matrix, unit_nr)
192 CALL ec_ext_setup(qs_env, ec_env, .false., unit_nr)
197 CALL timestop(handle)
213 SUBROUTINE ec_ext_interface(qs_env, trexio_fn, mo_occ, mo_ref, cpmos, calculate_forces, unit_nr)
215 CHARACTER(LEN=*) :: trexio_fn
216 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mo_occ, mo_ref, cpmos
217 LOGICAL,
INTENT(IN) :: calculate_forces
218 INTEGER,
INTENT(IN) :: unit_nr
220 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_ext_interface'
222 INTEGER :: handle, ispin, nao, nmos, nocc(2), nspins
223 REAL(kind=
dp) :: focc
225 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: energy_derivative
227 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos_trexio
230 CALL timeset(routinen, handle)
232 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, para_env=para_env)
234 nspins = dft_control%nspins
237 CALL cp_fm_get_info(mo_occ(ispin), nrow_global=nao, ncol_global=nocc(ispin))
240 IF (unit_nr > 0)
THEN
241 WRITE (unit_nr,
'(T2,A)')
" Read EXTERNAL Response from file: "//trim(trexio_fn)
243 ALLOCATE (mos_trexio(nspins))
244 IF (calculate_forces)
THEN
245 NULLIFY (energy_derivative)
248 CALL read_trexio(qs_env, trexio_filename=trexio_fn, &
249 mo_set_trexio=mos_trexio, &
250 energy_derivative=energy_derivative)
253 IF (nspins == 1) focc = 4.0_dp
255 CALL get_mo_set(mo_set=mos_trexio(ispin), mo_coeff=mo_coeff, homo=nmos)
257 cpmos(ispin), ncol=nmos, alpha=focc, beta=0.0_dp)
262 CALL read_trexio(qs_env, trexio_filename=trexio_fn, &
263 mo_set_trexio=mos_trexio)
267 CALL get_mo_set(mo_set=mos_trexio(ispin), mo_coeff=mo_coeff, homo=nmos)
271 DEALLOCATE (mos_trexio)
273 CALL timestop(handle)
275 END SUBROUTINE ec_ext_interface
286 SUBROUTINE ec_ext_debug(qs_env, ec_env, calculate_forces, unit_nr)
289 LOGICAL,
INTENT(IN) :: calculate_forces
290 INTEGER,
INTENT(IN) :: unit_nr
292 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_ext_debug'
294 CHARACTER(LEN=default_string_length) :: headline
295 INTEGER :: handle, ispin, nocc, nspins
297 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_p, matrix_s
304 CALL timeset(routinen, handle)
307 dft_control=dft_control, &
310 matrix_s_kp=matrix_s, &
311 matrix_h_kp=matrix_h)
313 nspins = dft_control%nspins
316 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=nocc)
317 CALL cp_fm_to_fm(mo_coeff, ec_env%mo_occ(ispin), nocc)
323 headline =
"CORE HAMILTONIAN MATRIX"
324 ALLOCATE (ec_env%matrix_h(1, 1)%matrix)
325 CALL dbcsr_create(ec_env%matrix_h(1, 1)%matrix, name=trim(headline), &
326 template=matrix_h(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
328 CALL dbcsr_copy(ec_env%matrix_h(1, 1)%matrix, matrix_h(1, 1)%matrix)
335 IF (calculate_forces)
THEN
337 CALL ec_debug_force(qs_env, matrix_p, unit_nr)
340 CALL timestop(handle)
342 END SUBROUTINE ec_ext_debug
350 SUBROUTINE ec_debug_force(qs_env, matrix_p, unit_nr)
352 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p
353 INTEGER,
INTENT(IN) :: unit_nr
355 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_debug_force'
357 INTEGER :: handle, iounit, nder, nimages
358 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
359 LOGICAL :: calculate_forces, debug_forces, &
360 debug_stress, use_virial
361 REAL(kind=
dp) :: eps_ppnl, fconv
362 REAL(kind=
dp),
DIMENSION(3) :: fodeb
363 REAL(kind=
dp),
DIMENSION(3, 3) :: stdeb, sttot
370 POINTER :: sab_orb, sac_ppl, sap_ppnl
373 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
377 CALL timeset(routinen, handle)
379 debug_forces = .true.
380 debug_stress = .true.
383 calculate_forces = .true.
386 NULLIFY (cell, dft_control, force, ks_env, para_env, virial)
389 dft_control=dft_control, &
394 nimages = dft_control%nimages
395 IF (nimages /= 1)
THEN
396 cpabort(
"K-points not implemented")
400 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
402 fconv = 1.0e-9_dp*
pascal/cell%deth
403 IF (debug_stress .AND. use_virial)
THEN
404 sttot = virial%pv_virial
408 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
THEN
409 cpabort(
"GAPW not implemented")
413 NULLIFY (sab_orb, sac_ppl, sap_ppnl)
415 sab_orb=sab_orb, sac_ppl=sac_ppl, sap_ppnl=sap_ppnl)
420 ALLOCATE (scrm(1, 1)%matrix)
421 CALL dbcsr_create(scrm(1, 1)%matrix, template=matrix_p(1, 1)%matrix)
425 IF (
SIZE(matrix_p, 1) == 2)
THEN
426 CALL dbcsr_add(matrix_p(1, 1)%matrix, matrix_p(2, 1)%matrix, &
427 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
431 IF (debug_forces) fodeb(1:3) = force(1)%kinetic(1:3, 1)
432 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ekinetic
434 matrix_name=
"KINETIC ENERGY MATRIX", &
436 sab_nl=sab_orb, calculate_forces=.true., &
438 IF (debug_forces)
THEN
439 fodeb(1:3) = force(1)%kinetic(1:3, 1) - fodeb(1:3)
440 CALL para_env%sum(fodeb)
441 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dT ", fodeb
443 IF (debug_stress .AND. use_virial)
THEN
444 stdeb = fconv*(virial%pv_ekinetic - stdeb)
445 CALL para_env%sum(stdeb)
446 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
449 IF (
SIZE(matrix_p, 1) == 2)
THEN
450 CALL dbcsr_add(matrix_p(1, 1)%matrix, matrix_p(2, 1)%matrix, &
451 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
455 NULLIFY (atomic_kind_set, particle_set, qs_kind_set)
456 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, particle_set=particle_set, &
457 atomic_kind_set=atomic_kind_set)
459 IF (
ASSOCIATED(sac_ppl))
THEN
460 IF (calculate_forces .AND. debug_forces) fodeb(1:3) = force(1)%gth_ppl(1:3, 1)
461 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ppl
463 virial, calculate_forces, use_virial, nder, &
464 qs_kind_set, atomic_kind_set, particle_set, sab_orb, sac_ppl, &
465 nimages, cell_to_index,
"ORB")
466 IF (calculate_forces .AND. debug_forces)
THEN
467 fodeb(1:3) = force(1)%gth_ppl(1:3, 1) - fodeb(1:3)
468 CALL para_env%sum(fodeb)
469 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dH_PPL ", fodeb
471 IF (debug_stress .AND. use_virial)
THEN
472 stdeb = fconv*(virial%pv_ppl - stdeb)
473 CALL para_env%sum(stdeb)
474 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
480 eps_ppnl = dft_control%qs_control%eps_ppnl
481 IF (
ASSOCIATED(sap_ppnl))
THEN
482 IF (calculate_forces .AND. debug_forces) fodeb(1:3) = force(1)%gth_ppnl(1:3, 1)
483 IF (debug_stress .AND. use_virial) stdeb = virial%pv_ppnl
485 virial, calculate_forces, use_virial, nder, &
486 qs_kind_set, atomic_kind_set, particle_set, &
487 sab_orb, sap_ppnl, eps_ppnl, &
488 nimages, cell_to_index,
"ORB")
489 IF (calculate_forces .AND. debug_forces)
THEN
490 fodeb(1:3) = force(1)%gth_ppnl(1:3, 1) - fodeb(1:3)
491 CALL para_env%sum(fodeb)
492 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Pout*dH_PPNL", fodeb
494 IF (debug_stress .AND. use_virial)
THEN
495 stdeb = fconv*(virial%pv_ppnl - stdeb)
496 CALL para_env%sum(stdeb)
497 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
502 IF (debug_stress .AND. use_virial)
THEN
503 stdeb = fconv*(virial%pv_virial - sttot)
504 CALL para_env%sum(stdeb)
505 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
507 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))")
' '
513 CALL timestop(handle)
515 END SUBROUTINE ec_debug_force
526 SUBROUTINE ec_ext_setup(qs_env, ec_env, calc_forces, unit_nr)
529 LOGICAL,
INTENT(IN) :: calc_forces
530 INTEGER,
INTENT(IN) :: unit_nr
532 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ec_ext_setup'
534 CHARACTER(LEN=default_string_length) :: headline
535 INTEGER :: handle, ispin, nao, nocc, nspins
536 REAL(kind=
dp) :: a_max, c_max
539 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_h, matrix_ks, matrix_p, matrix_s
545 CALL timeset(routinen, handle)
548 dft_control=dft_control, &
551 matrix_s_kp=matrix_s, &
552 matrix_ks_kp=matrix_ks, &
553 matrix_h_kp=matrix_h)
555 nspins = dft_control%nspins
560 headline =
"HAMILTONIAN MATRIX"
562 ALLOCATE (ec_env%matrix_ks(ispin, 1)%matrix)
563 CALL dbcsr_create(ec_env%matrix_ks(ispin, 1)%matrix, name=trim(headline), &
564 template=matrix_ks(ispin, 1)%matrix, matrix_type=dbcsr_type_symmetric)
566 CALL dbcsr_copy(ec_env%matrix_ks(ispin, 1)%matrix, matrix_ks(ispin, 1)%matrix)
572 headline =
"OVERLAP MATRIX"
573 ALLOCATE (ec_env%matrix_s(1, 1)%matrix)
574 CALL dbcsr_create(ec_env%matrix_s(1, 1)%matrix, name=trim(headline), &
575 template=matrix_s(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
577 CALL dbcsr_copy(ec_env%matrix_s(1, 1)%matrix, matrix_s(1, 1)%matrix)
584 headline =
"DENSITY MATRIX"
586 ALLOCATE (ec_env%matrix_p(ispin, 1)%matrix)
587 CALL dbcsr_create(ec_env%matrix_p(ispin, 1)%matrix, name=trim(headline), &
588 template=matrix_p(ispin, 1)%matrix, matrix_type=dbcsr_type_symmetric)
590 CALL dbcsr_copy(ec_env%matrix_p(ispin, 1)%matrix, matrix_p(ispin, 1)%matrix)
593 IF (calc_forces)
THEN
598 headline =
"ENERGY WEIGHTED DENSITY MATRIX"
600 ALLOCATE (ec_env%matrix_w(ispin, 1)%matrix)
601 CALL dbcsr_create(ec_env%matrix_w(ispin, 1)%matrix, name=trim(headline), &
602 template=matrix_p(ispin, 1)%matrix, matrix_type=dbcsr_type_symmetric)
604 CALL dbcsr_set(ec_env%matrix_w(ispin, 1)%matrix, 0.0_dp)
610 headline =
"Hz MATRIX"
612 ALLOCATE (ec_env%matrix_hz(ispin)%matrix)
613 CALL dbcsr_create(ec_env%matrix_hz(ispin)%matrix, name=trim(headline), &
614 template=matrix_s(1, 1)%matrix, matrix_type=dbcsr_type_symmetric)
616 CALL dbcsr_set(ec_env%matrix_hz(ispin)%matrix, 0.0_dp)
621 mat_struct => ec_env%mo_occ(ispin)%matrix_struct
625 ksmo, nocc, alpha=1.0_dp, beta=0.0_dp)
628 smo, nocc, alpha=1.0_dp, beta=0.0_dp)
630 template_fmstruct=mat_struct)
632 CALL parallel_gemm(
'T',
'N', nocc, nocc, nao, 1.0_dp, ec_env%mo_occ(ispin), ksmo, 0.0_dp, emat)
633 CALL parallel_gemm(
'N',
'N', nao, nocc, nocc, -1.0_dp, smo, emat, 1.0_dp, ksmo)
640 IF (unit_nr > 0)
THEN
641 WRITE (unit_nr,
"(T3,A,T50,I2,T61,F20.12)")
"External:: Max value of MO coeficients", ispin, c_max
642 WRITE (unit_nr,
"(T3,A,T50,I2,T61,F20.12)")
"External:: Max value of MO gradients", ispin, a_max
647 CALL timestop(handle)
649 END SUBROUTINE ec_ext_setup
659 SUBROUTINE align_vectors(cpmos, mo_ref, mo_occ, matrix_s, unit_nr)
660 TYPE(
cp_fm_type),
INTENT(IN) :: cpmos, mo_ref, mo_occ
662 INTEGER,
INTENT(IN) :: unit_nr
664 CHARACTER(LEN=*),
PARAMETER :: routinen =
'align_vectors'
666 INTEGER :: handle, i, nao, nocc, scg
667 REAL(kind=
dp) :: a_max
668 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) ::
diag
672 CALL timeset(routinen, handle)
674 mat_struct => cpmos%matrix_struct
679 template_fmstruct=mat_struct)
681 CALL parallel_gemm(
'T',
'N', nocc, nocc, nao, 1.0_dp, mo_ref, smo, 0.0_dp, emat)
682 CALL parallel_gemm(
'N',
'N', nao, nocc, nocc, 1.0_dp, cpmos, emat, 0.0_dp, smo)
686 ALLOCATE (
diag(nocc))
688 a_max = nocc - sum(
diag)
691 IF (abs(
diag(i) + 1.0_dp) < 0.001) scg = scg + 1
693 IF (unit_nr > 0)
THEN
694 WRITE (unit_nr,
"(T3,A,T61,F20.8)")
"External:: Orbital rotation index", a_max
695 WRITE (unit_nr,
"(T3,A,T71,I10)")
"External:: Number of orbital phase changes", scg
703 CALL timestop(handle)
705 END SUBROUTINE align_vectors
713 SUBROUTINE matrix_w_forces(qs_env, matrix_w, unit_nr)
715 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_w
716 INTEGER,
INTENT(IN) :: unit_nr
718 CHARACTER(LEN=*),
PARAMETER :: routinen =
'matrix_w_forces'
720 INTEGER :: handle, iounit, nder, nimages
721 LOGICAL :: debug_forces, debug_stress, use_virial
722 REAL(kind=
dp) :: fconv
723 REAL(kind=
dp),
DIMENSION(3) :: fodeb
724 REAL(kind=
dp),
DIMENSION(3, 3) :: stdeb, sttot
735 CALL timeset(routinen, handle)
737 debug_forces = .true.
738 debug_stress = .true.
745 dft_control=dft_control, &
751 nimages = dft_control%nimages
752 IF (nimages /= 1)
THEN
753 cpabort(
"K-points not implemented")
757 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
759 fconv = 1.0e-9_dp*
pascal/cell%deth
760 IF (debug_stress .AND. use_virial)
THEN
761 sttot = virial%pv_virial
767 ALLOCATE (scrm(1, 1)%matrix)
768 CALL dbcsr_create(scrm(1, 1)%matrix, template=matrix_w(1, 1)%matrix)
772 IF (
SIZE(matrix_w, 1) == 2)
THEN
773 CALL dbcsr_add(matrix_w(1, 1)%matrix, matrix_w(2, 1)%matrix, &
774 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
778 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
779 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
781 matrix_name=
"OVERLAP MATRIX", &
782 basis_type_a=
"ORB", &
783 basis_type_b=
"ORB", &
784 sab_nl=sab_orb, calculate_forces=.true., &
787 IF (debug_forces)
THEN
788 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
789 CALL para_env%sum(fodeb)
790 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wout*dS ", fodeb
792 IF (debug_stress .AND. use_virial)
THEN
793 stdeb = fconv*(virial%pv_overlap - stdeb)
794 CALL para_env%sum(stdeb)
795 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
798 IF (
SIZE(matrix_w, 1) == 2)
THEN
799 CALL dbcsr_add(matrix_w(1, 1)%matrix, matrix_w(2, 1)%matrix, &
800 alpha_scalar=1.0_dp, beta_scalar=-1.0_dp)
806 CALL timestop(handle)
808 END SUBROUTINE matrix_w_forces
818 SUBROUTINE matrix_r_forces(qs_env, cpmos, mo_occ, matrix_r, unit_nr)
820 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: cpmos, mo_occ
822 INTEGER,
INTENT(IN) :: unit_nr
824 CHARACTER(LEN=*),
PARAMETER :: routinen =
'matrix_r_forces'
826 INTEGER :: handle, iounit, ispin, nao, nocc, nspins
827 LOGICAL :: debug_forces, debug_stress, use_virial
828 REAL(kind=
dp) :: fconv, focc
829 REAL(kind=
dp),
DIMENSION(3) :: fodeb
830 REAL(kind=
dp),
DIMENSION(3, 3) :: stdeb
843 CALL timeset(routinen, handle)
845 debug_forces = .true.
846 debug_stress = .true.
849 nspins =
SIZE(mo_occ)
851 IF (nspins == 1) focc = 2.0_dp
856 CALL cp_fm_get_info(cpmos(ispin), matrix_struct=fm_struct, nrow_global=nao, ncol_global=nocc)
858 CALL cp_fm_struct_create(mat_struct, nrow_global=nocc, ncol_global=nocc, template_fmstruct=fm_struct)
860 CALL parallel_gemm(
"T",
"N", nocc, nocc, nao, 1.0_dp, mo_occ(ispin), cpmos(ispin), 0.0_dp, chcmat)
861 CALL parallel_gemm(
"N",
"N", nao, nocc, nocc, 1.0_dp, mo_occ(ispin), chcmat, 0.0_dp, rcvec)
870 dft_control=dft_control, &
877 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
878 fconv = 1.0e-9_dp*
pascal/cell%deth
880 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
881 IF (debug_stress .AND. use_virial) stdeb = virial%pv_overlap
884 matrix_name=
"OVERLAP MATRIX", &
885 basis_type_a=
"ORB", basis_type_b=
"ORB", &
886 sab_nl=sab_orb, calculate_forces=.true., &
888 IF (debug_forces)
THEN
889 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
890 CALL para_env%sum(fodeb)
891 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wz*dS ", fodeb
893 IF (debug_stress .AND. use_virial)
THEN
894 stdeb = fconv*(virial%pv_overlap - stdeb)
895 CALL para_env%sum(stdeb)
896 IF (iounit > 0)
WRITE (unit=iounit, fmt=
"(T2,A,T41,2(1X,ES19.11))") &
901 CALL timestop(handle)
903 END SUBROUTINE matrix_r_forces
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Calculation of the local pseudopotential contribution to the core Hamiltonian <a|V(local)|b> = <a|Sum...
subroutine, public build_core_ppl(matrix_h, matrix_p, force, virial, calculate_forces, use_virial, nder, qs_kind_set, atomic_kind_set, particle_set, sab_orb, sac_ppl, nimages, cell_to_index, basis_type, deltar, atcore)
...
Calculation of the non-local pseudopotential contribution to the core Hamiltonian <a|V(non-local)|b> ...
subroutine, public build_core_ppnl(matrix_h, matrix_p, force, virial, calculate_forces, use_virial, nder, qs_kind_set, atomic_kind_set, particle_set, sab_orb, sap_ppnl, eps_ppnl, nimages, cell_to_index, basis_type, deltar, matrix_l, atcore)
...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
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
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
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
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
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_maxabsval(matrix, a_max, ir_max, ic_max)
find the maximum absolute value of the matrix element maxval(abs(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, 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 ...
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
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Types needed for a for a Energy Correction.
Routines for an external energy correction on top of a Kohn-Sham calculation.
subroutine, public ec_ext_energy(qs_env, ec_env, calculate_forces)
External energy method.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Collection of simple mathematical functions and subroutines.
subroutine, public diag(n, a, d, v)
Diagonalize matrix a. The eigenvalues are returned in vector d and the eigenvectors are returned in m...
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public pascal
Calculation of the energies concerning the core charge distribution.
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.
Calculation of kinetic energy matrix and forces.
subroutine, public build_kinetic_matrix(ks_env, matrix_t, matrixkp_t, matrix_name, basis_type, sab_nl, calculate_forces, matrix_p, matrixkp_p, eps_filter, nderivative)
Calculation of the kinetic energy matrix over Cartesian Gaussian functions.
Definition and initialisation of the mo data type.
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
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.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p)
Calculation of the overlap matrix 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...
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public read_trexio(qs_env, trexio_filename, mo_set_trexio, energy_derivative)
Read a trexio file.
pure real(kind=dp) function, public one_third_sum_diag(a)
...
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...
Contains information on the energy correction functional for KG.
stores all the informations relevant to an mpi environment
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.