42#include "./base/base_uses.f90"
48 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'kpoint_coulomb_2c'
55 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: block
75 atomic_kind_set, size_lattice_sum, operator_type, ikp_start, ikp_end)
77 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_v_kp
79 CHARACTER(LEN=*),
INTENT(IN) :: basis_type
84 INTEGER :: size_lattice_sum, operator_type, &
87 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_2c_coulomb_matrix_kp'
92 CALL timeset(routinen, handle)
94 CALL allocate_tmp(matrix_v_l_tmp, matrix_v_kp, ikp_start)
96 CALL lattice_sum(matrix_v_kp, kpoints, basis_type, cell, particle_set, &
97 qs_kind_set, atomic_kind_set, size_lattice_sum, matrix_v_l_tmp, &
98 operator_type, ikp_start, ikp_end)
100 CALL deallocate_tmp(matrix_v_l_tmp)
102 CALL timestop(handle)
121 SUBROUTINE lattice_sum(matrix_v_kp, kpoints, basis_type, cell, particle_set, &
122 qs_kind_set, atomic_kind_set, size_lattice_sum, matrix_v_L_tmp, &
123 operator_type, ikp_start, ikp_end)
125 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_v_kp
127 CHARACTER(LEN=*),
INTENT(IN) :: basis_type
130 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
132 INTEGER :: size_lattice_sum
134 INTEGER :: operator_type, ikp_start, ikp_end
136 CHARACTER(LEN=*),
PARAMETER :: routinen =
'lattice_sum'
138 INTEGER :: factor, handle, handle2, i_block, i_x, i_x_inner, i_x_outer, ik, j_y, j_y_inner, &
139 j_y_outer, k_z, k_z_inner, k_z_outer, x_max, x_min, y_max, y_min, z_max, z_min
140 INTEGER,
DIMENSION(3) :: nkp_grid
141 REAL(kind=
dp) :: coskl, sinkl
142 REAL(kind=
dp),
DIMENSION(3) :: vec_l, vec_s
143 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
144 TYPE(two_d_util_type),
ALLOCATABLE,
DIMENSION(:) :: blocks_v_l, blocks_v_l_store
145 TYPE(two_d_util_type),
ALLOCATABLE, &
146 DIMENSION(:, :, :) :: blocks_v_kp
148 CALL timeset(routinen, handle)
150 CALL get_factor_and_xyz_min_max(cell, kpoints, size_lattice_sum, factor, hmat, &
151 x_min, x_max, y_min, y_max, z_min, z_max, nkp_grid)
153 CALL allocate_blocks_v_kp(blocks_v_kp, matrix_v_kp, ikp_start, ikp_end)
154 CALL allocate_blocks_v_l(blocks_v_l, matrix_v_l_tmp)
155 CALL allocate_blocks_v_l(blocks_v_l_store, matrix_v_l_tmp)
157 DO i_x_inner = 0, 2*nkp_grid(1) - 1
158 DO j_y_inner = 0, 2*nkp_grid(2) - 1
159 DO k_z_inner = 0, 2*nkp_grid(3) - 1
161 DO i_x_outer = x_min, x_max + nkp_grid(1), 2*nkp_grid(1)
162 DO j_y_outer = y_min, y_max + nkp_grid(2), 2*nkp_grid(2)
163 DO k_z_outer = z_min, z_max + nkp_grid(3), 2*nkp_grid(3)
165 i_x = i_x_inner + i_x_outer
166 j_y = j_y_inner + j_y_outer
167 k_z = k_z_inner + k_z_outer
169 IF (i_x > x_max .OR. i_x < x_min .OR. &
170 j_y > y_max .OR. j_y < y_min .OR. &
171 k_z > z_max .OR. k_z < z_min) cycle
173 vec_s = [real(i_x,
dp), real(j_y,
dp), real(k_z,
dp)]
175 vec_l = matmul(hmat, vec_s)
178 CALL compute_v_transl(matrix_v_l_tmp, blocks_v_l, vec_l, particle_set, &
179 qs_kind_set, atomic_kind_set, basis_type, cell, &
182 DO i_block = 1,
SIZE(blocks_v_l)
183 blocks_v_l_store(i_block)%block(:, :) = blocks_v_l_store(i_block)%block(:, :) &
184 + blocks_v_l(i_block)%block(:, :)
191 CALL timeset(routinen//
"_R_to_k", handle2)
194 DO ik = ikp_start, ikp_end
197 coskl = cos(
twopi*dot_product(vec_s(1:3), kpoints%xkp(1:3, ik)))
198 sinkl = sin(
twopi*dot_product(vec_s(1:3), kpoints%xkp(1:3, ik)))
200 DO i_block = 1,
SIZE(blocks_v_l)
202 blocks_v_kp(ik, 1, i_block)%block(:, :) = blocks_v_kp(ik, 1, i_block)%block(:, :) &
203 + coskl*blocks_v_l_store(i_block)%block(:, :)
204 blocks_v_kp(ik, 2, i_block)%block(:, :) = blocks_v_kp(ik, 2, i_block)%block(:, :) &
205 + sinkl*blocks_v_l_store(i_block)%block(:, :)
211 DO i_block = 1,
SIZE(blocks_v_l)
213 blocks_v_l_store(i_block)%block(:, :) = 0.0_dp
217 CALL timestop(handle2)
223 CALL set_blocks_to_matrix_v_kp(matrix_v_kp, blocks_v_kp, ikp_start, ikp_end)
225 CALL deallocate_blocks_v_kp(blocks_v_kp)
226 CALL deallocate_blocks_v_l(blocks_v_l)
227 CALL deallocate_blocks_v_l(blocks_v_l_store)
229 CALL timestop(handle)
231 END SUBROUTINE lattice_sum
240 SUBROUTINE set_blocks_to_matrix_v_kp(matrix_v_kp, blocks_v_kp, ikp_start, ikp_end)
242 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_v_kp
243 TYPE(two_d_util_type),
ALLOCATABLE, &
244 DIMENSION(:, :, :) :: blocks_v_kp
245 INTEGER :: ikp_start, ikp_end
247 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_blocks_to_matrix_v_kp'
249 INTEGER :: col, handle, i_block, i_real_im, ik, row
250 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
253 CALL timeset(routinen, handle)
255 DO ik = ikp_start, ikp_end
267 data_block(:, :) = blocks_v_kp(ik, i_real_im, i_block)%block(:, :)
269 i_block = i_block + 1
279 CALL timestop(handle)
281 END SUBROUTINE set_blocks_to_matrix_v_kp
295 SUBROUTINE compute_v_transl(matrix_v_L_tmp, blocks_v_L, vec_L, particle_set, &
296 qs_kind_set, atomic_kind_set, basis_type, cell, operator_type)
299 TYPE(two_d_util_type),
ALLOCATABLE,
DIMENSION(:) :: blocks_v_l
300 REAL(kind=
dp),
DIMENSION(3) :: vec_l
302 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
304 CHARACTER(LEN=*),
INTENT(IN) :: basis_type
306 INTEGER :: operator_type
308 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_v_transl'
310 INTEGER :: col, handle, i_block, kind_a, kind_b, row
311 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
312 REAL(
dp),
DIMENSION(3) :: ra, rab_l, rb
313 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
314 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: contr_a, contr_b
318 CALL timeset(routinen, handle)
320 NULLIFY (basis_set_a, basis_set_b, data_block)
334 kind_a = kind_of(row)
335 kind_b = kind_of(col)
337 CALL get_qs_kind(qs_kind=qs_kind_set(kind_a), basis_set=basis_set_a, basis_type=basis_type)
338 CALL get_qs_kind(qs_kind=qs_kind_set(kind_b), basis_set=basis_set_b, basis_type=basis_type)
340 ra(1:3) =
pbc(particle_set(row)%r(1:3), cell)
341 rb(1:3) =
pbc(particle_set(col)%r(1:3), cell)
343 rab_l(1:3) = rb(1:3) - ra(1:3) + vec_l(1:3)
348 blocks_v_l(i_block)%block = 0.0_dp
351 fba=basis_set_a, fbb=basis_set_b, scona_shg=contr_a, sconb_shg=contr_b, &
352 calculate_forces=.false.)
354 i_block = i_block + 1
356 DEALLOCATE (contr_a, contr_b)
364 CALL timestop(handle)
366 END SUBROUTINE compute_v_transl
372 SUBROUTINE deallocate_blocks_v_kp(blocks_v_kp)
373 TYPE(two_d_util_type),
ALLOCATABLE, &
374 DIMENSION(:, :, :) :: blocks_v_kp
376 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_blocks_v_kp'
378 INTEGER :: handle, i_block, i_real_img, ik
380 CALL timeset(routinen, handle)
382 DO ik = lbound(blocks_v_kp, 1), ubound(blocks_v_kp, 1)
383 DO i_real_img = 1,
SIZE(blocks_v_kp, 2)
384 DO i_block = 1,
SIZE(blocks_v_kp, 3)
385 DEALLOCATE (blocks_v_kp(ik, i_real_img, i_block)%block)
390 DEALLOCATE (blocks_v_kp)
392 CALL timestop(handle)
400 SUBROUTINE deallocate_blocks_v_l(blocks_v_L)
401 TYPE(two_d_util_type),
ALLOCATABLE,
DIMENSION(:) :: blocks_v_l
403 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_blocks_v_L'
405 INTEGER :: handle, i_block
407 CALL timeset(routinen, handle)
409 DO i_block = 1,
SIZE(blocks_v_l, 1)
410 DEALLOCATE (blocks_v_l(i_block)%block)
413 DEALLOCATE (blocks_v_l)
415 CALL timestop(handle)
424 SUBROUTINE allocate_blocks_v_l(blocks_v_L, matrix_v_L_tmp)
425 TYPE(two_d_util_type),
ALLOCATABLE,
DIMENSION(:) :: blocks_v_l
428 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_blocks_v_L'
430 INTEGER :: col, handle, i_block, nblocks, row
431 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
434 CALL timeset(routinen, handle)
444 nblocks = nblocks + 1
450 ALLOCATE (blocks_v_l(nblocks))
460 ALLOCATE (blocks_v_l(i_block)%block(
SIZE(data_block, 1),
SIZE(data_block, 2)))
461 blocks_v_l(i_block)%block = 0.0_dp
463 i_block = i_block + 1
469 CALL timestop(handle)
480 SUBROUTINE allocate_blocks_v_kp(blocks_v_kp, matrix_v_kp, ikp_start, ikp_end)
481 TYPE(two_d_util_type),
ALLOCATABLE, &
482 DIMENSION(:, :, :) :: blocks_v_kp
483 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_v_kp
484 INTEGER :: ikp_start, ikp_end
486 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_blocks_v_kp'
488 INTEGER :: col, handle, i_block, i_real_img, ik, &
490 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
493 CALL timeset(routinen, handle)
503 nblocks = nblocks + 1
509 ALLOCATE (blocks_v_kp(ikp_start:ikp_end,
SIZE(matrix_v_kp, 2), nblocks))
511 DO ik = ikp_start, ikp_end
513 DO i_real_img = 1,
SIZE(matrix_v_kp, 2)
523 ALLOCATE (blocks_v_kp(ik, i_real_img, i_block)%block(
SIZE(data_block, 1), &
524 SIZE(data_block, 2)))
525 blocks_v_kp(ik, i_real_img, i_block)%block = 0.0_dp
527 i_block = i_block + 1
537 CALL timestop(handle)
556 SUBROUTINE get_factor_and_xyz_min_max(cell, kpoints, size_lattice_sum, factor, hmat, &
557 x_min, x_max, y_min, y_max, z_min, z_max, nkp_grid)
561 INTEGER :: size_lattice_sum, factor
562 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
563 INTEGER :: x_min, x_max, y_min, y_max, z_min, z_max
564 INTEGER,
DIMENSION(3) :: nkp_grid
566 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_factor_and_xyz_min_max'
568 INTEGER :: handle, nkp
569 INTEGER,
DIMENSION(3) :: periodic
571 CALL timeset(routinen, handle)
574 CALL get_cell(cell=cell, h=hmat, periodic=periodic)
576 IF (periodic(1) == 0)
THEN
577 cpassert(nkp_grid(1) == 1)
579 IF (periodic(2) == 0)
THEN
580 cpassert(nkp_grid(2) == 1)
582 IF (periodic(3) == 0)
THEN
583 cpassert(nkp_grid(3) == 1)
586 IF (
modulo(nkp_grid(1), 2) == 1)
THEN
587 factor = 3**(size_lattice_sum - 1)
588 ELSE IF (
modulo(nkp_grid(1), 2) == 0)
THEN
589 factor = 2**(size_lattice_sum - 1)
592 IF (
modulo(nkp_grid(1), 2) == 1)
THEN
593 x_min = -(factor*nkp_grid(1) - 1)/2
594 x_max = (factor*nkp_grid(1) - 1)/2
595 ELSE IF (
modulo(nkp_grid(1), 2) == 0)
THEN
596 x_min = -factor*nkp_grid(1)/2
597 x_max = factor*nkp_grid(1)/2 - 1
599 IF (periodic(1) == 0)
THEN
604 IF (
modulo(nkp_grid(2), 2) == 1)
THEN
605 y_min = -(factor*nkp_grid(2) - 1)/2
606 y_max = (factor*nkp_grid(2) - 1)/2
607 ELSE IF (
modulo(nkp_grid(2), 2) == 0)
THEN
608 y_min = -factor*nkp_grid(2)/2
609 y_max = factor*nkp_grid(2)/2 - 1
611 IF (periodic(2) == 0)
THEN
616 IF (
modulo(nkp_grid(3), 2) == 1)
THEN
617 z_min = -(factor*nkp_grid(3) - 1)/2
618 z_max = (factor*nkp_grid(3) - 1)/2
619 ELSE IF (
modulo(nkp_grid(3), 2) == 0)
THEN
620 z_min = -factor*nkp_grid(3)/2
621 z_max = factor*nkp_grid(3)/2 - 1
623 IF (periodic(3) == 0)
THEN
628 CALL timestop(handle)
638 SUBROUTINE allocate_tmp(matrix_v_L_tmp, matrix_v_kp, ikp_start)
641 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_v_kp
644 CHARACTER(LEN=*),
PARAMETER :: routinen =
'allocate_tmp'
648 CALL timeset(routinen, handle)
650 NULLIFY (matrix_v_l_tmp)
653 template=matrix_v_kp(ikp_start, 1)%matrix, &
654 matrix_type=dbcsr_type_no_symmetry)
658 CALL timestop(handle)
666 SUBROUTINE deallocate_tmp(matrix_v_L_tmp)
670 CHARACTER(LEN=*),
PARAMETER :: routinen =
'deallocate_tmp'
674 CALL timeset(routinen, handle)
678 CALL timestop(handle)
693 basis_type, ikp_start, ikp_end)
694 COMPLEX(KIND=dp),
DIMENSION(:, :, :) :: v_k
697 INTEGER :: size_lattice_sum
698 CHARACTER(LEN=*),
INTENT(IN) :: basis_type
699 INTEGER :: ikp_start, ikp_end
701 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_2c_coulomb_matrix_kp_small_cell'
703 INTEGER :: factor, handle, handle2, i_cell, i_x, i_x_inner, i_x_outer, ik, ikp_local, j_y, &
704 j_y_inner, j_y_outer, k_z, k_z_inner, k_z_outer, n_atom, n_bf, x_max, x_min, y_max, &
706 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: bf_end_from_atom, bf_start_from_atom
707 INTEGER,
DIMENSION(3) :: nkp_grid
708 REAL(kind=
dp) :: coskl, sinkl
709 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: v_l
710 REAL(kind=
dp),
DIMENSION(3) :: vec_l, vec_s
711 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
716 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
718 CALL timeset(routinen, handle)
722 particle_set=particle_set, &
724 qs_kind_set=qs_kind_set, &
725 atomic_kind_set=atomic_kind_set)
727 CALL get_factor_and_xyz_min_max(cell, kpoints, size_lattice_sum, factor, hmat, &
728 x_min, x_max, y_min, y_max, z_min, z_max, nkp_grid)
730 CALL get_basis_sizes(qs_env, n_atom, basis_type, bf_start_from_atom, bf_end_from_atom, n_bf)
732 ALLOCATE (v_l(n_bf, n_bf))
734 DO i_x_inner = 0, 2*nkp_grid(1) - 1
735 DO j_y_inner = 0, 2*nkp_grid(2) - 1
736 DO k_z_inner = 0, 2*nkp_grid(3) - 1
741 DO i_x_outer = x_min, x_max + nkp_grid(1), 2*nkp_grid(1)
742 DO j_y_outer = y_min, y_max + nkp_grid(2), 2*nkp_grid(2)
743 DO k_z_outer = z_min, z_max + nkp_grid(3), 2*nkp_grid(3)
745 i_x = i_x_inner + i_x_outer
746 j_y = j_y_inner + j_y_outer
747 k_z = k_z_inner + k_z_outer
749 IF (i_x > x_max .OR. i_x < x_min .OR. &
750 j_y > y_max .OR. j_y < y_min .OR. &
751 k_z > z_max .OR. k_z < z_min) cycle
755 vec_s = [real(i_x,
dp), real(j_y,
dp), real(k_z,
dp)]
757 IF (
modulo(i_cell, para_env%num_pe) .NE. para_env%mepos) cycle
759 vec_l = matmul(hmat, vec_s)
762 CALL add_v_l(v_l, vec_l, n_atom, bf_start_from_atom, bf_end_from_atom, &
763 particle_set, qs_kind_set, atomic_kind_set, basis_type, cell)
770 CALL para_env%sum(v_l)
772 CALL timeset(routinen//
"_R_to_k", handle2)
779 IF (
modulo(ik, para_env%num_pe) .NE. para_env%mepos) cycle
781 ikp_local = ikp_local + 1
783 IF (ik < ikp_start) cycle
786 coskl = cos(
twopi*dot_product(vec_s(1:3), kpoints%xkp(1:3, ik)))
787 sinkl = sin(
twopi*dot_product(vec_s(1:3), kpoints%xkp(1:3, ik)))
789 v_k(:, :, ikp_local) = v_k(:, :, ikp_local) +
z_one*coskl*v_l(:, :) + &
794 CALL timestop(handle2)
800 CALL timestop(handle)
813 SUBROUTINE get_basis_sizes(qs_env, n_atom, basis_type, bf_start_from_atom, bf_end_from_atom, n_bf)
817 CHARACTER(LEN=*),
INTENT(IN) :: basis_type
818 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: bf_start_from_atom, bf_end_from_atom
821 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_basis_sizes'
823 INTEGER :: handle, iatom, ikind, n_kind, nsgf
824 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
828 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
830 CALL timeset(routinen, handle)
832 CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, &
833 qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
836 n_atom =
SIZE(particle_set)
837 n_kind =
SIZE(qs_kind_set)
840 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), basis_set=basis_set_a, &
841 basis_type=basis_type)
842 cpassert(
ASSOCIATED(basis_set_a))
845 ALLOCATE (bf_start_from_atom(n_atom), bf_end_from_atom(n_atom))
849 bf_start_from_atom(iatom) = n_bf + 1
850 ikind = kind_of(iatom)
851 CALL get_qs_kind(qs_kind=qs_kind_set(ikind), nsgf=nsgf, basis_type=basis_type)
853 bf_end_from_atom(iatom) = n_bf
856 CALL timestop(handle)
858 END SUBROUTINE get_basis_sizes
873 SUBROUTINE add_v_l(V_L, vec_L, n_atom, bf_start_from_atom, bf_end_from_atom, &
874 particle_set, qs_kind_set, atomic_kind_set, basis_type, cell)
876 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: v_l
877 REAL(kind=
dp),
DIMENSION(3) :: vec_l
879 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: bf_start_from_atom, bf_end_from_atom
881 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
883 CHARACTER(LEN=*),
INTENT(IN) :: basis_type
886 CHARACTER(LEN=*),
PARAMETER :: routinen =
'add_V_L'
888 INTEGER :: a_1, a_2, atom_a, atom_b, b_1, b_2, &
889 handle, kind_a, kind_b
890 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of
891 REAL(
dp),
DIMENSION(3) :: ra, rab_l, rb
892 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: v_l_ab
893 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: contr_a, contr_b
896 CALL timeset(routinen, handle)
898 NULLIFY (basis_set_a, basis_set_b)
902 DO atom_a = 1, n_atom
904 DO atom_b = 1, n_atom
906 kind_a = kind_of(atom_a)
907 kind_b = kind_of(atom_b)
909 CALL get_qs_kind(qs_kind=qs_kind_set(kind_a), basis_set=basis_set_a, &
910 basis_type=basis_type)
911 CALL get_qs_kind(qs_kind=qs_kind_set(kind_b), basis_set=basis_set_b, &
912 basis_type=basis_type)
914 ra(1:3) =
pbc(particle_set(atom_a)%r(1:3), cell)
915 rb(1:3) =
pbc(particle_set(atom_b)%r(1:3), cell)
917 rab_l(1:3) = rb(1:3) - ra(1:3) + vec_l(1:3)
922 a_1 = bf_start_from_atom(atom_a)
923 a_2 = bf_end_from_atom(atom_a)
924 b_1 = bf_start_from_atom(atom_b)
925 b_2 = bf_end_from_atom(atom_b)
927 ALLOCATE (v_l_ab(a_2 - a_1 + 1, b_2 - b_1 + 1))
930 fba=basis_set_a, fbb=basis_set_b, &
931 scona_shg=contr_a, sconb_shg=contr_b, &
932 calculate_forces=.false.)
934 v_l(a_1:a_2, b_1:b_2) = v_l(a_1:a_2, b_1:b_2) + v_l_ab(:, :)
936 DEALLOCATE (contr_a, contr_b, v_l_ab)
944 CALL timestop(handle)
946 END SUBROUTINE add_v_l
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
constants for the different operators of the 2c-integrals
integer, parameter, public operator_coulomb
subroutine, public dbcsr_release_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)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
Initialization for solid harmonic Gaussian (SHG) integral scheme. Scheme for calculation of contracte...
subroutine, public contraction_matrix_shg(basis, scon_shg)
contraction matrix for SHG integrals
Calculation of contracted, spherical Gaussian integrals using the solid harmonic Gaussian (SHG) integ...
subroutine, public int_operators_r12_ab_shg(r12_operator, vab, dvab, rab, fba, fbb, scona_shg, sconb_shg, omega, calculate_forces)
Calcululates the two-center integrals of the type (a|O(r12)|b) using the SHG scheme.
Defines the basic variable types.
integer, parameter, public dp
Routines to compute the Coulomb integral V_(alpha beta)(k) for a k-point k using lattice summation in...
subroutine, public build_2c_coulomb_matrix_kp(matrix_v_kp, kpoints, basis_type, cell, particle_set, qs_kind_set, atomic_kind_set, size_lattice_sum, operator_type, ikp_start, ikp_end)
...
subroutine, public build_2c_coulomb_matrix_kp_small_cell(v_k, qs_env, kpoints, size_lattice_sum, basis_type, ikp_start, ikp_end)
...
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
Define the data structure for the particle information.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.