84#include "./base/base_uses.f90"
90 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'kpoint_methods'
113 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_initialize'
115 INTEGER :: handle, i, ic, ik, iounit, ir, ira, is, &
116 j, natom, nkind, nr, ns
117 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atype
119 REAL(kind=
dp) :: wsum
120 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: coord, scoord
124 CALL timeset(routinen, handle)
126 cpassert(
ASSOCIATED(kpoint))
128 SELECT CASE (kpoint%kp_scheme)
133 ALLOCATE (kpoint%xkp(3, 1), kpoint%wkp(1))
134 kpoint%xkp(1:3, 1) = 0.0_dp
135 kpoint%wkp(1) = 1.0_dp
136 ALLOCATE (kpoint%kp_sym(1))
137 NULLIFY (kpoint%kp_sym(1)%kpoint_sym)
139 CASE (
"MONKHORST-PACK",
"MACDONALD")
141 IF (.NOT. kpoint%symmetry)
THEN
144 ALLOCATE (coord(3, natom), scoord(3, natom), atype(natom))
147 coord(1, i) = sin(i*0.12345_dp)
148 coord(2, i) = cos(i*0.23456_dp)
149 coord(3, i) = sin(i*0.34567_dp)
153 natom =
SIZE(particle_set)
154 ALLOCATE (scoord(3, natom), atype(natom))
156 CALL get_atomic_kind(atomic_kind=particle_set(i)%atomic_kind, kind_number=atype(i))
160 IF (kpoint%verbose)
THEN
166 ALLOCATE (kpoint%atype(natom))
169 CALL crys_sym_gen(crys_sym, scoord, atype, cell%hmat, delta=kpoint%eps_geo, iounit=iounit)
170 CALL kpoint_gen(crys_sym, kpoint%nkp_grid, symm=kpoint%symmetry, shift=kpoint%kp_shift, &
171 full_grid=kpoint%full_grid)
172 kpoint%nkp = crys_sym%nkpoint
173 ALLOCATE (kpoint%xkp(3, kpoint%nkp), kpoint%wkp(kpoint%nkp))
174 wsum = sum(crys_sym%wkpoint)
175 DO ik = 1, kpoint%nkp
176 kpoint%xkp(1:3, ik) = crys_sym%xkpoint(1:3, ik)
177 kpoint%wkp(ik) = crys_sym%wkpoint(ik)/wsum
185 ALLOCATE (kpoint%kp_sym(kpoint%nkp))
186 DO ik = 1, kpoint%nkp
187 NULLIFY (kpoint%kp_sym(ik)%kpoint_sym)
189 kpsym => kpoint%kp_sym(ik)%kpoint_sym
190 IF (crys_sym%symlib .AND. .NOT. crys_sym%fullgrid .AND. crys_sym%istriz == 1)
THEN
192 kpsym%nwght = nint(crys_sym%wkpoint(ik))
196 kpsym%apply_symmetry = .true.
197 natom =
SIZE(particle_set)
198 ALLOCATE (
kpsym%rot(3, 3, ns))
199 ALLOCATE (
kpsym%xkp(3, ns))
200 ALLOCATE (
kpsym%rotp(ns))
201 ALLOCATE (
kpsym%f0(natom, ns))
203 DO is = 1,
SIZE(crys_sym%kplink, 2)
204 IF (crys_sym%kplink(2, is) == ik)
THEN
206 ir = crys_sym%kpop(is)
210 kpsym%rot(1:3, 1:3, nr) = crys_sym%rt(1:3, 1:3, ira)
212 kpsym%rot(1:3, 1:3, nr) = -crys_sym%rt(1:3, 1:3, ira)
214 kpsym%xkp(1:3, nr) = crys_sym%kpmesh(1:3, is)
215 DO ic = 1, crys_sym%nrtot
216 IF (crys_sym%ibrot(ic) == ira)
THEN
217 kpsym%f0(1:natom, nr) = crys_sym%f0(1:natom, ic)
228 IF (kpoint%symmetry)
THEN
229 nkind = maxval(atype)
231 ALLOCATE (kpoint%kind_rotmat(ns, nkind))
234 NULLIFY (kpoint%kind_rotmat(i, j)%rmat)
237 ALLOCATE (kpoint%ibrot(ns))
238 kpoint%ibrot(1:ns) = crys_sym%ibrot(1:ns)
242 DEALLOCATE (scoord, atype)
246 ALLOCATE (kpoint%kp_sym(kpoint%nkp))
248 NULLIFY (kpoint%kp_sym(i)%kpoint_sym)
256 SELECT CASE (kpoint%kp_scheme)
260 cpassert(kpoint%nkp == 1)
261 cpassert(sum(abs(kpoint%xkp)) <= 1.e-12_dp)
262 cpassert(kpoint%wkp(1) == 1.0_dp)
263 cpassert(.NOT. kpoint%symmetry)
265 cpassert(.NOT. kpoint%symmetry)
266 cpassert(kpoint%nkp >= 1)
267 CASE (
"MONKHORST-PACK",
"MACDONALD")
268 cpassert(kpoint%nkp >= 1)
270 IF (kpoint%use_real_wfn)
THEN
272 ikloop:
DO ik = 1, kpoint%nkp
274 spez = (kpoint%xkp(i, ik) == 0.0_dp .OR. kpoint%xkp(i, ik) == 0.5_dp)
275 IF (.NOT. spez)
EXIT ikloop
280 CALL cp_warn(__location__, &
281 "A calculation using real wavefunctions is requested. "// &
282 "We could not determine if the symmetry of the system allows real wavefunctions. ")
286 CALL timestop(handle)
302 LOGICAL,
INTENT(IN),
OPTIONAL :: with_aux_fit
304 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_env_initialize'
306 INTEGER :: handle, igr, ik, ikk, ngr, niogrp, nkp, &
307 nkp_grp, nkp_loc, npe, unit_nr
308 INTEGER,
DIMENSION(2) :: dims, pos
315 CALL timeset(routinen, handle)
317 IF (
PRESENT(with_aux_fit))
THEN
318 aux_fit = with_aux_fit
323 kpoint%para_env => para_env
324 CALL kpoint%para_env%retain()
325 kpoint%blacs_env_all => blacs_env
326 CALL kpoint%blacs_env_all%retain()
328 cpassert(.NOT.
ASSOCIATED(kpoint%kp_env))
330 cpassert(.NOT.
ASSOCIATED(kpoint%kp_aux_env))
333 NULLIFY (kp_env, kp_aux_env)
335 npe = para_env%num_pe
338 ALLOCATE (kp_env(nkp))
340 NULLIFY (kp_env(ik)%kpoint_env)
342 kp => kp_env(ik)%kpoint_env
344 kp%wkp = kpoint%wkp(ik)
345 kp%xkp(1:3) = kpoint%xkp(1:3, ik)
348 kpoint%kp_env => kp_env
351 ALLOCATE (kp_aux_env(nkp))
353 NULLIFY (kp_aux_env(ik)%kpoint_env)
355 kp => kp_aux_env(ik)%kpoint_env
357 kp%wkp = kpoint%wkp(ik)
358 kp%xkp(1:3) = kpoint%xkp(1:3, ik)
362 kpoint%kp_aux_env => kp_aux_env
365 ALLOCATE (kpoint%kp_dist(2, 1))
366 kpoint%kp_dist(1, 1) = 1
367 kpoint%kp_dist(2, 1) = nkp
368 kpoint%kp_range(1) = 1
369 kpoint%kp_range(2) = nkp
372 kpoint%para_env_kp => para_env
373 CALL kpoint%para_env_kp%retain()
374 kpoint%para_env_inter_kp => para_env
375 CALL kpoint%para_env_inter_kp%retain()
376 kpoint%iogrp = .true.
377 kpoint%nkp_groups = 1
379 IF (kpoint%parallel_group_size == -1)
THEN
384 IF (mod(npe, igr) .NE. 0) cycle
386 IF (mod(nkp, nkp_grp) .NE. 0) cycle
389 ELSE IF (kpoint%parallel_group_size == 0)
THEN
392 ELSE IF (kpoint%parallel_group_size > 0)
THEN
393 ngr = min(kpoint%parallel_group_size, npe)
401 cpassert(mod(nkp, nkp_grp) == 0)
402 nkp_loc = nkp/nkp_grp
404 IF ((dims(1)*dims(2) /= npe))
THEN
405 cpabort(
"Number of processors is not divisible by the kpoint group size.")
409 CALL comm_cart%create(comm_old=para_env, ndims=2, dims=dims)
410 pos = comm_cart%mepos_cart
411 ALLOCATE (para_env_kp)
412 CALL para_env_kp%from_split(comm_cart, pos(2))
413 ALLOCATE (para_env_inter_kp)
414 CALL para_env_inter_kp%from_split(comm_cart, pos(1))
415 CALL comm_cart%free()
418 IF (para_env%is_source()) niogrp = 1
419 CALL para_env_kp%sum(niogrp)
420 kpoint%iogrp = (niogrp == 1)
423 kpoint%para_env_kp => para_env_kp
424 kpoint%para_env_inter_kp => para_env_inter_kp
427 ALLOCATE (kpoint%kp_dist(2, nkp_grp))
429 kpoint%kp_dist(1:2, igr) =
get_limit(nkp, nkp_grp, igr - 1)
432 kpoint%kp_range(1:2) = kpoint%kp_dist(1:2, para_env_inter_kp%mepos + 1)
434 ALLOCATE (kp_env(nkp_loc))
436 NULLIFY (kp_env(ik)%kpoint_env)
437 ikk = kpoint%kp_range(1) + ik - 1
439 kp => kp_env(ik)%kpoint_env
441 kp%wkp = kpoint%wkp(ikk)
442 kp%xkp(1:3) = kpoint%xkp(1:3, ikk)
443 kp%is_local = (ngr == 1)
445 kpoint%kp_env => kp_env
448 ALLOCATE (kp_aux_env(nkp_loc))
450 NULLIFY (kp_aux_env(ik)%kpoint_env)
451 ikk = kpoint%kp_range(1) + ik - 1
453 kp => kp_aux_env(ik)%kpoint_env
455 kp%wkp = kpoint%wkp(ikk)
456 kp%xkp(1:3) = kpoint%xkp(1:3, ikk)
457 kp%is_local = (ngr == 1)
459 kpoint%kp_aux_env => kp_aux_env
464 IF (unit_nr > 0 .AND. kpoint%verbose)
THEN
466 WRITE (unit_nr, fmt=
"(T2,A,T71,I10)")
"KPOINTS| Number of kpoint groups ", nkp_grp
467 WRITE (unit_nr, fmt=
"(T2,A,T71,I10)")
"KPOINTS| Size of each kpoint group", ngr
468 WRITE (unit_nr, fmt=
"(T2,A,T71,I10)")
"KPOINTS| Number of kpoints per group", nkp_loc
470 kpoint%nkp_groups = nkp_grp
474 CALL timestop(handle)
488 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
489 INTEGER,
INTENT(IN),
OPTIONAL :: added_mos
490 LOGICAL,
OPTIONAL :: for_aux_fit
492 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_initialize_mos'
494 INTEGER :: handle, ic, ik, is, nadd, nao, nc, &
495 nelectron, nkp_loc, nmo, nmorig(2), &
498 REAL(kind=
dp) :: flexible_electron_count, maxocc, n_el_f
506 CALL timeset(routinen, handle)
508 IF (
PRESENT(for_aux_fit))
THEN
509 aux_fit = for_aux_fit
514 cpassert(
ASSOCIATED(kpoint))
516 IF (.true. .OR.
ASSOCIATED(mos(1)%mo_coeff))
THEN
518 cpassert(
ASSOCIATED(kpoint%kp_aux_env))
521 IF (
PRESENT(added_mos))
THEN
527 IF (kpoint%use_real_wfn)
THEN
533 nkp_loc = kpoint%kp_range(2) - kpoint%kp_range(1) + 1
534 IF (nkp_loc > 0)
THEN
536 cpassert(
SIZE(kpoint%kp_aux_env) == nkp_loc)
538 cpassert(
SIZE(kpoint%kp_env) == nkp_loc)
543 kp => kpoint%kp_aux_env(ik)%kpoint_env
545 kp => kpoint%kp_env(ik)%kpoint_env
547 ALLOCATE (kp%mos(nc, nspin))
549 CALL get_mo_set(mos(is), nao=nao, nmo=nmo, nelectron=nelectron, &
550 n_el_f=n_el_f, maxocc=maxocc, flexible_electron_count=flexible_electron_count)
551 nmo = min(nao, nmo + nadd)
553 CALL allocate_mo_set(kp%mos(ic, is), nao, nmo, nelectron, n_el_f, maxocc, &
554 flexible_electron_count)
564 IF (
ASSOCIATED(kpoint%blacs_env))
THEN
565 blacs_env => kpoint%blacs_env
568 kpoint%blacs_env => blacs_env
574 nmo = min(nao, nmorig(is) + nadd)
582 blacs_env=blacs_env, para_env=kpoint%para_env_kp)
585 kpoint%mpools_aux_fit => mpools
587 kpoint%mpools => mpools
596 CALL mpools_get(mpools, ao_ao_fm_pools=ao_ao_fm_pools)
602 kp => kpoint%kp_aux_env(ik)%kpoint_env
604 kp => kpoint%kp_env(ik)%kpoint_env
608 ALLOCATE (kp%pmat(nc, nspin))
616 ALLOCATE (kp%wmat(nc, nspin))
630 CALL timestop(handle)
641 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_initialize_mo_set'
643 INTEGER :: handle, ic, ik, ikk, ispin
646 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: moskp
648 CALL timeset(routinen, handle)
650 DO ik = 1,
SIZE(kpoint%kp_env)
651 CALL mpools_get(kpoint%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
652 moskp => kpoint%kp_env(ik)%kpoint_env%mos
653 ikk = kpoint%kp_range(1) + ik - 1
654 cpassert(
ASSOCIATED(moskp))
655 DO ispin = 1,
SIZE(moskp, 2)
656 DO ic = 1,
SIZE(moskp, 1)
657 CALL get_mo_set(moskp(ic, ispin), mo_coeff=mo_coeff)
658 IF (.NOT.
ASSOCIATED(mo_coeff))
THEN
660 fm_pool=ao_mo_fm_pools(ispin)%pool, name=
"kpoints")
666 CALL timestop(handle)
686 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_init_cell_index'
688 INTEGER :: handle, i1, i2, i3, ic, icount, it, &
690 INTEGER,
DIMENSION(3) :: cell, itm
691 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell,
list
692 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index, cti
695 DIMENSION(:),
POINTER :: nl_iterator
697 NULLIFY (cell_to_index, index_to_cell)
699 CALL timeset(routinen, handle)
701 cpassert(
ASSOCIATED(kpoint))
703 ALLOCATE (
list(3, 125))
713 IF (cell(1) ==
list(1, ic) .AND. cell(2) ==
list(2, ic) .AND. &
714 cell(3) ==
list(3, ic))
THEN
721 IF (icount >
SIZE(
list, 2))
THEN
724 list(1:3, icount) = cell(1:3)
730 itm(1) = maxval(abs(
list(1, 1:icount)))
731 itm(2) = maxval(abs(
list(2, 1:icount)))
732 itm(3) = maxval(abs(
list(3, 1:icount)))
733 CALL para_env%max(itm)
734 it = maxval(itm(1:3))
735 IF (
ASSOCIATED(kpoint%cell_to_index))
THEN
736 DEALLOCATE (kpoint%cell_to_index)
738 ALLOCATE (kpoint%cell_to_index(-itm(1):itm(1), -itm(2):itm(2), -itm(3):itm(3)))
739 cell_to_index => kpoint%cell_to_index
748 CALL para_env%sum(cti)
750 DO i1 = -itm(1), itm(1)
751 DO i2 = -itm(2), itm(2)
752 DO i3 = -itm(3), itm(3)
753 IF (cti(i1, i2, i3) == 0)
THEN
754 cti(i1, i2, i3) = 1000000
757 cti(i1, i2, i3) = (abs(i1) + abs(i2) + abs(i3))*1000 + abs(i3)*100 + abs(i2)*10 + abs(i1)
758 cti(i1, i2, i3) = cti(i1, i2, i3) + (i1 + i2 + i3)
764 IF (
ASSOCIATED(kpoint%index_to_cell))
THEN
765 DEALLOCATE (kpoint%index_to_cell)
767 ALLOCATE (kpoint%index_to_cell(3, ncount))
768 index_to_cell => kpoint%index_to_cell
771 i1 = cell(1) - 1 - itm(1)
772 i2 = cell(2) - 1 - itm(2)
773 i3 = cell(3) - 1 - itm(3)
774 cti(i1, i2, i3) = 1000000
775 index_to_cell(1, ic) = i1
776 index_to_cell(2, ic) = i2
777 index_to_cell(3, ic) = i3
781 i1 = index_to_cell(1, ic)
782 i2 = index_to_cell(2, ic)
783 i3 = index_to_cell(3, ic)
788 kpoint%sab_nl => sab_nl
791 dft_control%nimages =
SIZE(index_to_cell, 2)
795 CALL timestop(handle)
811 xkp, cell_to_index, sab_nl, is_complex, rs_sign)
816 INTEGER,
INTENT(IN) :: ispin
817 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: xkp
818 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
821 LOGICAL,
INTENT(IN),
OPTIONAL :: is_complex
822 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: rs_sign
824 CHARACTER(LEN=*),
PARAMETER :: routinen =
'rskp_transform'
826 INTEGER :: handle, iatom, ic, icol, irow, jatom, &
828 INTEGER,
DIMENSION(3) :: cell
829 LOGICAL :: do_symmetric, found, my_complex, &
831 REAL(kind=
dp) :: arg, coskl, fsign, fsym, sinkl
832 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: cblock, rblock, rsblock
834 DIMENSION(:),
POINTER :: nl_iterator
836 CALL timeset(routinen, handle)
839 IF (
PRESENT(is_complex)) my_complex = is_complex
842 IF (
PRESENT(rs_sign)) fsign = rs_sign
844 wfn_real_only = .true.
845 IF (
PRESENT(cmatrix)) wfn_real_only = .false.
847 nimg =
SIZE(rsmat, 2)
860 IF (do_symmetric .AND. (iatom > jatom))
THEN
866 ic = cell_to_index(cell(1), cell(2), cell(3))
867 IF (ic < 1 .OR. ic > nimg) cycle
869 arg = real(cell(1),
dp)*xkp(1) + real(cell(2),
dp)*xkp(2) + real(cell(3),
dp)*xkp(3)
871 coskl = fsign*fsym*cos(
twopi*arg)
872 sinkl = fsign*sin(
twopi*arg)
874 coskl = fsign*cos(
twopi*arg)
875 sinkl = fsign*fsym*sin(
twopi*arg)
879 block=rsblock, found=found)
880 IF (.NOT. found) cycle
882 IF (wfn_real_only)
THEN
884 block=rblock, found=found)
885 IF (.NOT. found) cycle
886 rblock = rblock + coskl*rsblock
889 block=rblock, found=found)
890 IF (.NOT. found) cycle
892 block=cblock, found=found)
893 IF (.NOT. found) cycle
894 rblock = rblock + coskl*rsblock
895 cblock = cblock + sinkl*rsblock
901 CALL timestop(handle)
918 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_set_mo_occupation'
920 INTEGER :: handle, ik, ikpgr, ispin, kplocal, nao, &
921 nb, ncol_global, ne_a, ne_b, &
922 nelectron, nkp, nmo, nrow_global, nspin
923 INTEGER,
DIMENSION(2) :: kp_range
924 REAL(kind=
dp) :: kts, mu, mus(2), nel
925 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smatrix
926 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: weig, wocc
927 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icoeff, rcoeff
928 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, occupation, wkp
934 CALL timeset(routinen, handle)
938 kp => kpoint%kp_env(1)%kpoint_env
939 nspin =
SIZE(kp%mos, 2)
940 mo_set => kp%mos(1, 1)
941 CALL get_mo_set(mo_set, nmo=nmo, nao=nao, nelectron=nelectron)
944 CALL get_mo_set(kp%mos(1, 2), nmo=nb, nelectron=ne_b)
947 ALLOCATE (weig(nmo, nkp, nspin), wocc(nmo, nkp, nspin))
950 IF (
PRESENT(probe))
THEN
951 ALLOCATE (rcoeff(nao, nmo, nkp, nspin), icoeff(nao, nmo, nkp, nspin))
956 kplocal = kp_range(2) - kp_range(1) + 1
957 DO ikpgr = 1, kplocal
958 ik = kp_range(1) + ikpgr - 1
959 kp => kpoint%kp_env(ikpgr)%kpoint_env
961 mo_set => kp%mos(1, ispin)
962 CALL get_mo_set(mo_set, eigenvalues=eigenvalues)
963 weig(1:nmo, ik, ispin) = eigenvalues(1:nmo)
964 IF (
PRESENT(probe))
THEN
967 nrow_global=nrow_global, &
968 ncol_global=ncol_global)
969 ALLOCATE (smatrix(nrow_global, ncol_global))
972 rcoeff(1:nao, 1:nmo, ik, ispin) = smatrix(1:nrow_global, 1:ncol_global)
976 mo_set => kp%mos(2, ispin)
980 nrow_global=nrow_global, &
981 ncol_global=ncol_global)
982 ALLOCATE (smatrix(nrow_global, ncol_global))
985 icoeff(1:nao, 1:nmo, ik, ispin) = smatrix(1:nrow_global, 1:ncol_global)
987 mo_set => kp%mos(1, ispin)
994 CALL para_env_inter_kp%sum(weig)
996 IF (
PRESENT(probe))
THEN
997 CALL para_env_inter_kp%sum(rcoeff)
998 CALL para_env_inter_kp%sum(icoeff)
1004 IF (
PRESENT(probe))
THEN
1005 smear%do_smear = .false.
1007 IF (nspin == 1)
THEN
1008 nel = real(nelectron, kind=
dp)
1009 CALL probe_occupancy_kp(wocc(:, :, :), mus(1), kts, weig(:, :, :), rcoeff(:, :, :, :), icoeff(:, :, :, :), 2.0d0, &
1012 nel = real(ne_a, kind=
dp) + real(ne_b, kind=
dp)
1013 CALL probe_occupancy_kp(wocc(:, :, :), mu, kts, weig(:, :, :), rcoeff(:, :, :, :), icoeff(:, :, :, :), 1.0d0, &
1019 DO ikpgr = 1, kplocal
1020 ik = kp_range(1) + ikpgr - 1
1021 kp => kpoint%kp_env(ikpgr)%kpoint_env
1023 mo_set => kp%mos(1, ispin)
1024 CALL get_mo_set(mo_set, eigenvalues=eigenvalues, occupation_numbers=occupation)
1025 eigenvalues(1:nmo) = weig(1:nmo, ik, ispin)
1026 occupation(1:nmo) = wocc(1:nmo, ik, ispin)
1028 mo_set%mu = mus(ispin)
1033 nrow_global=nrow_global, &
1034 ncol_global=ncol_global)
1035 ALLOCATE (smatrix(nrow_global, ncol_global))
1038 smatrix(1:nrow_global, 1:ncol_global) = rcoeff(1:nao, 1:nmo, ik, ispin)
1039 DEALLOCATE (smatrix)
1041 mo_set => kp%mos(2, ispin)
1046 nrow_global=nrow_global, &
1047 ncol_global=ncol_global)
1048 ALLOCATE (smatrix(nrow_global, ncol_global))
1051 smatrix(1:nrow_global, 1:ncol_global) = icoeff(1:nao, 1:nmo, ik, ispin)
1052 DEALLOCATE (smatrix)
1054 mo_set => kp%mos(1, ispin)
1059 DEALLOCATE (weig, wocc, rcoeff, icoeff)
1063 IF (
PRESENT(probe) .EQV. .false.)
THEN
1064 IF (smear%do_smear)
THEN
1066 SELECT CASE (smear%method)
1068 IF (nspin == 1)
THEN
1069 nel = real(nelectron, kind=
dp)
1070 CALL fermikp(wocc(:, :, 1), mus(1), kts, weig(:, :, 1), nel, wkp, &
1071 smear%electronic_temperature, 2.0_dp)
1072 ELSE IF (smear%fixed_mag_mom > 0.0_dp)
THEN
1073 nel = real(ne_a, kind=
dp)
1074 CALL fermikp(wocc(:, :, 1), mus(1), kts, weig(:, :, 1), nel, wkp, &
1075 smear%electronic_temperature, 1.0_dp)
1076 nel = real(ne_b, kind=
dp)
1077 CALL fermikp(wocc(:, :, 2), mus(2), kts, weig(:, :, 2), nel, wkp, &
1078 smear%electronic_temperature, 1.0_dp)
1080 nel = real(ne_a, kind=
dp) + real(ne_b, kind=
dp)
1081 CALL fermikp2(wocc(:, :, :), mu, kts, weig(:, :, :), nel, wkp, &
1082 smear%electronic_temperature)
1087 cpabort(
"kpoints: Selected smearing not (yet) supported")
1091 IF (nspin == 1)
THEN
1092 nel = real(nelectron, kind=
dp)
1093 CALL fermikp(wocc(:, :, 1), mus(1), kts, weig(:, :, 1), nel, wkp, 0.0_dp, 2.0_dp)
1095 nel = real(ne_a, kind=
dp)
1096 CALL fermikp(wocc(:, :, 1), mus(1), kts, weig(:, :, 1), nel, wkp, 0.0_dp, 1.0_dp)
1097 nel = real(ne_b, kind=
dp)
1098 CALL fermikp(wocc(:, :, 2), mus(2), kts, weig(:, :, 2), nel, wkp, 0.0_dp, 1.0_dp)
1101 DO ikpgr = 1, kplocal
1102 ik = kp_range(1) + ikpgr - 1
1103 kp => kpoint%kp_env(ikpgr)%kpoint_env
1105 mo_set => kp%mos(1, ispin)
1106 CALL get_mo_set(mo_set, eigenvalues=eigenvalues, occupation_numbers=occupation)
1107 eigenvalues(1:nmo) = weig(1:nmo, ik, ispin)
1108 occupation(1:nmo) = wocc(1:nmo, ik, ispin)
1110 mo_set%mu = mus(ispin)
1114 DEALLOCATE (weig, wocc)
1118 CALL timestop(handle)
1131 LOGICAL,
OPTIONAL :: energy_weighted, for_aux_fit
1133 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_density_matrices'
1135 INTEGER :: handle, ikpgr, ispin, kplocal, nao, nmo, &
1137 INTEGER,
DIMENSION(2) :: kp_range
1138 LOGICAL :: aux_fit, wtype
1139 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, occupation
1142 TYPE(
cp_fm_type),
POINTER :: cpmat, pmat, rpmat
1146 CALL timeset(routinen, handle)
1148 IF (
PRESENT(energy_weighted))
THEN
1149 wtype = energy_weighted
1155 IF (
PRESENT(for_aux_fit))
THEN
1156 aux_fit = for_aux_fit
1162 cpassert(
ASSOCIATED(kpoint%kp_aux_env))
1167 mo_set => kpoint%kp_aux_env(1)%kpoint_env%mos(1, 1)
1169 mo_set => kpoint%kp_env(1)%kpoint_env%mos(1, 1)
1172 CALL cp_fm_get_info(mo_set%mo_coeff, matrix_struct=matrix_struct)
1176 kplocal = kp_range(2) - kp_range(1) + 1
1177 DO ikpgr = 1, kplocal
1179 kp => kpoint%kp_aux_env(ikpgr)%kpoint_env
1181 kp => kpoint%kp_env(ikpgr)%kpoint_env
1183 nspin =
SIZE(kp%mos, 2)
1185 mo_set => kp%mos(1, ispin)
1187 CALL get_mo_set(mo_set, eigenvalues=eigenvalues)
1189 IF (kpoint%use_real_wfn)
THEN
1191 pmat => kp%wmat(1, ispin)
1193 pmat => kp%pmat(1, ispin)
1195 CALL get_mo_set(mo_set, occupation_numbers=occupation)
1201 CALL parallel_gemm(
"N",
"T", nao, nao, nmo, 1.0_dp, mo_set%mo_coeff, fwork, 0.0_dp, pmat)
1204 rpmat => kp%wmat(1, ispin)
1205 cpmat => kp%wmat(2, ispin)
1207 rpmat => kp%pmat(1, ispin)
1208 cpmat => kp%pmat(2, ispin)
1210 CALL get_mo_set(mo_set, occupation_numbers=occupation)
1217 CALL parallel_gemm(
"N",
"T", nao, nao, nmo, 1.0_dp, mo_set%mo_coeff, fwork, 0.0_dp, rpmat)
1218 mo_set => kp%mos(2, ispin)
1220 CALL parallel_gemm(
"N",
"T", nao, nao, nmo, 1.0_dp, mo_set%mo_coeff, fwork, 0.0_dp, cpmat)
1222 CALL parallel_gemm(
"N",
"T", nao, nao, nmo, -1.0_dp, fwork, mo_set%mo_coeff, 1.0_dp, cpmat)
1229 CALL parallel_gemm(
"N",
"T", nao, nao, nmo, 1.0_dp, mo_set%mo_coeff, fwork, 1.0_dp, rpmat)
1236 CALL timestop(handle)
1256 LOGICAL,
INTENT(IN) :: wtype
1260 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fmwork
1261 LOGICAL,
OPTIONAL :: for_aux_fit
1262 TYPE(
cp_fm_type),
DIMENSION(:, :, :),
INTENT(IN), &
1263 OPTIONAL :: pmat_ext
1265 CHARACTER(LEN=*),
PARAMETER :: routinen =
'kpoint_density_transform'
1267 INTEGER :: handle, ic, ik, ikk, indx, ir, ira, is, &
1268 ispin, jr, nc, nimg, nkp, nspin
1269 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1270 LOGICAL :: aux_fit, do_ext, do_symmetric, my_kpgrp, &
1272 REAL(kind=
dp) :: wkpx
1273 REAL(kind=
dp),
DIMENSION(:),
POINTER :: wkp
1274 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
1277 TYPE(
dbcsr_type),
POINTER :: cpmat, rpmat, scpmat, srpmat
1283 CALL timeset(routinen, handle)
1287 IF (
PRESENT(for_aux_fit))
THEN
1288 aux_fit = for_aux_fit
1294 IF (
PRESENT(pmat_ext)) do_ext = .true.
1297 cpassert(
ASSOCIATED(kpoint%kp_aux_env))
1303 matrix_type=merge(dbcsr_type_symmetric, dbcsr_type_no_symmetry, do_symmetric))
1308 matrix_type=merge(dbcsr_type_antisymmetric, dbcsr_type_no_symmetry, do_symmetric))
1311 IF (.NOT. kpoint%full_grid)
THEN
1323 cell_to_index=cell_to_index)
1326 kp => kpoint%kp_aux_env(1)%kpoint_env
1328 kp => kpoint%kp_env(1)%kpoint_env
1330 nspin =
SIZE(kp%mos, 2)
1331 nc =
SIZE(kp%mos, 1)
1332 nimg =
SIZE(denmat, 2)
1333 real_only = (nc == 1)
1335 para_env => kpoint%blacs_env_all%para_env
1336 ALLOCATE (info(nspin*nkp*nc))
1342 CALL dbcsr_set(denmat(ispin, ic)%matrix, 0.0_dp)
1346 my_kpgrp = (ik >= kpoint%kp_range(1) .AND. ik <= kpoint%kp_range(2))
1348 ikk = ik - kpoint%kp_range(1) + 1
1350 kp => kpoint%kp_aux_env(ikk)%kpoint_env
1352 kp => kpoint%kp_env(ikk)%kpoint_env
1358 cpassert(
SIZE(fmwork) >= nc)
1400 kpsym => kpoint%kp_sym(ik)%kpoint_sym
1401 cpassert(
ASSOCIATED(
kpsym))
1403 IF (
kpsym%apply_symmetry)
THEN
1404 wkpx = wkp(ik)/real(
kpsym%nwght, kind=
dp)
1405 DO is = 1,
kpsym%nwght
1406 ir = abs(
kpsym%rotp(is))
1408 DO jr = 1,
SIZE(kpoint%ibrot)
1409 IF (ir == kpoint%ibrot(jr)) ira = jr
1412 kind_rot => kpoint%kind_rotmat(ira, :)
1414 CALL symtrans(srpmat, rpmat, kind_rot,
kpsym%rot(1:3, 1:3, is), &
1415 kpsym%f0(:, is), kpoint%atype, symmetric=.true.)
1417 CALL symtrans(srpmat, rpmat, kind_rot,
kpsym%rot(1:3, 1:3, is), &
1418 kpsym%f0(:, is), kpoint%atype, symmetric=.true.)
1419 CALL symtrans(scpmat, cpmat, kind_rot,
kpsym%rot(1:3, 1:3, is), &
1420 kpsym%f0(:, is), kpoint%atype, antisymmetric=.true.)
1422 CALL transform_dmat(denmat, srpmat, scpmat, ispin, real_only, sab_nl, &
1423 cell_to_index,
kpsym%xkp(1:3, is), wkpx)
1427 CALL transform_dmat(denmat, rpmat, cpmat, ispin, real_only, sab_nl, &
1428 cell_to_index, xkp(1:3, ik), wkp(ik))
1437 my_kpgrp = (ik >= kpoint%kp_range(1) .AND. ik <= kpoint%kp_range(2))
1439 ikk = ik - kpoint%kp_range(1) + 1
1441 kp => kpoint%kp_aux_env(ikk)%kpoint_env
1443 kp => kpoint%kp_env(ikk)%kpoint_env
1463 IF (.NOT. kpoint%full_grid)
THEN
1468 CALL timestop(handle)
1484 SUBROUTINE transform_dmat(denmat, rpmat, cpmat, ispin, real_only, sab_nl, cell_to_index, xkp, wkp)
1488 INTEGER,
INTENT(IN) :: ispin
1489 LOGICAL,
INTENT(IN) :: real_only
1492 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1493 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: xkp
1494 REAL(kind=
dp),
INTENT(IN) :: wkp
1496 CHARACTER(LEN=*),
PARAMETER :: routinen =
'transform_dmat'
1498 INTEGER :: handle, iatom, icell, icol, irow, jatom, &
1500 INTEGER,
DIMENSION(3) :: cell
1501 LOGICAL :: do_symmetric, found
1502 REAL(kind=
dp) :: arg, coskl, fc, sinkl
1503 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: cblock, dblock, rblock
1505 DIMENSION(:),
POINTER :: nl_iterator
1507 CALL timeset(routinen, handle)
1509 nimg =
SIZE(denmat, 2)
1525 IF (do_symmetric .AND. iatom > jatom)
THEN
1531 icell = cell_to_index(cell(1), cell(2), cell(3))
1532 IF (icell < 1 .OR. icell > nimg) cycle
1534 arg = real(cell(1),
dp)*xkp(1) + real(cell(2),
dp)*xkp(2) + real(cell(3),
dp)*xkp(3)
1535 coskl = wkp*cos(
twopi*arg)
1536 sinkl = wkp*fc*sin(
twopi*arg)
1538 CALL dbcsr_get_block_p(matrix=denmat(ispin, icell)%matrix, row=irow, col=icol, &
1539 block=dblock, found=found)
1540 IF (.NOT. found) cycle
1543 CALL dbcsr_get_block_p(matrix=rpmat, row=irow, col=icol, block=rblock, found=found)
1544 IF (.NOT. found) cycle
1545 dblock = dblock + coskl*rblock
1547 CALL dbcsr_get_block_p(matrix=rpmat, row=irow, col=icol, block=rblock, found=found)
1548 IF (.NOT. found) cycle
1549 CALL dbcsr_get_block_p(matrix=cpmat, row=irow, col=icol, block=cblock, found=found)
1550 IF (.NOT. found) cycle
1551 dblock = dblock + coskl*rblock
1552 dblock = dblock + sinkl*cblock
1557 CALL timestop(handle)
1559 END SUBROUTINE transform_dmat
1572 SUBROUTINE symtrans(smat, pmat, kmat, rot, f0, atype, symmetric, antisymmetric)
1575 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(IN) :: rot
1576 INTEGER,
DIMENSION(:),
INTENT(IN) :: f0, atype
1577 LOGICAL,
INTENT(IN),
OPTIONAL :: symmetric, antisymmetric
1579 CHARACTER(LEN=*),
PARAMETER :: routinen =
'symtrans'
1581 INTEGER :: handle, iatom, icol, ikind, ip, irow, &
1582 jcol, jkind, jp, jrow, natom, numnodes
1583 LOGICAL :: asym, dorot, found, perm, sym, trans
1584 REAL(kind=
dp) :: dr, fsign
1585 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: kroti, krotj, pblock, sblock
1589 CALL timeset(routinen, handle)
1593 IF (
PRESENT(symmetric)) sym = symmetric
1595 IF (
PRESENT(antisymmetric)) asym = antisymmetric
1597 cpassert(.NOT. (sym .AND. asym))
1598 cpassert((sym .OR. asym))
1604 IF (f0(iatom) == iatom) cycle
1611 IF (abs(sum(abs(rot)) - 3.0_dp) > 1.e-12_dp) dorot = .true.
1612 dr = abs(rot(1, 1) - 1.0_dp) + abs(rot(2, 2) - 1.0_dp) + abs(rot(3, 3) - 1.0_dp)
1613 IF (abs(dr) > 1.e-12_dp) dorot = .true.
1616 IF (asym) fsign = -1.0_dp
1618 IF (dorot .OR. perm)
THEN
1619 CALL cp_abort(__location__,
"k-points need FULL_GRID currently. "// &
1620 "Reduced grids not yet working correctly")
1625 IF (numnodes == 1)
THEN
1641 CALL dbcsr_get_block_p(matrix=smat, row=jrow, col=jcol, block=sblock, found=found)
1645 kroti => kmat(ikind)%rmat
1646 krotj => kmat(jkind)%rmat
1649 sblock = fsign*matmul(transpose(krotj), matmul(transpose(pblock), kroti))
1651 sblock = fsign*matmul(transpose(kroti), matmul(pblock, krotj))
1658 CALL cp_abort(__location__,
"k-points need FULL_GRID currently. "// &
1659 "Reduced grids not yet working correctly")
1680 kroti => kmat(ikind)%rmat
1681 krotj => kmat(jkind)%rmat
1684 sblock = fsign*matmul(transpose(krotj), matmul(transpose(sblock), kroti))
1686 sblock = fsign*matmul(transpose(kroti), matmul(sblock, krotj))
1697 CALL timestop(handle)
1699 END SUBROUTINE symtrans
1705 SUBROUTINE matprint(mat)
1708 INTEGER :: i, icol, iounit, irow
1709 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: mblock
1717 IF (iounit > 0)
THEN
1718 WRITE (iounit,
'(A,2I4)')
'BLOCK ', irow, icol
1719 DO i = 1,
SIZE(mblock, 1)
1720 WRITE (iounit,
'(8F12.6)') mblock(i, :)
1727 END SUBROUTINE matprint
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(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_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
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_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, group, mynode, numnodes, nprows, npcols, myprow, mypcol, pgrid, subgroups_defined, prow_group, pcol_group)
...
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 copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the pool
represent the structure of a full matrix
represent a full matrix distributed on many processors
subroutine, public cp_fm_start_copy_general(source, destination, para_env, info)
Initiates the copy operation: get distribution data, post MPI isend and irecvs.
subroutine, public cp_fm_cleanup_copy_general(info)
Completes the copy operation: wait for comms clean up MPI state.
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_finish_copy_general(destination, info)
Completes the copy operation: wait for comms, unpack, clean up MPI state.
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...
K-points and crystal symmetry routines.
subroutine, public print_crys_symmetry(csym)
...
subroutine, public crys_sym_gen(csym, scoor, types, hmat, delta, iounit)
...
subroutine, public release_csym_type(csym)
Release the CSYM type.
subroutine, public kpoint_gen(csym, nk, symm, shift, full_grid)
...
subroutine, public print_kp_symmetry(csym)
...
deal with the Fermi distribution, compute it, fix mu, get derivs
subroutine, public fermikp2(f, mu, kts, e, nel, wk, t)
Bisection search to find mu for a given nel (kpoint case)
subroutine, public fermikp(f, mu, kts, e, nel, wk, t, maxocc)
Bisection search to find mu for a given nel (kpoint case)
subroutine, public probe_occupancy_kp(occ, fermi, kts, energies, rcoeff, icoeff, maxocc, probe, n, wk)
subroutine to calculate occupation number and 'Fermi' level using the
Defines the basic variable types.
integer, parameter, public dp
Routines needed for kpoint calculation.
subroutine, public kpoint_initialize_mo_set(kpoint)
...
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_initialize_mos(kpoint, mos, added_mos, for_aux_fit)
Initialize a set of MOs and density matrix for each kpoint (kpoint group)
subroutine, public kpoint_initialize(kpoint, particle_set, cell)
Generate the kpoints and initialize the kpoint environment.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext)
generate real space density matrices in DBCSR format
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, dft_control)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups)
subroutine, public kpoint_env_initialize(kpoint, para_env, blacs_env, with_aux_fit)
Initialize the kpoint environment.
subroutine, public kpoint_set_mo_occupation(kpoint, smear, probe)
Given the eigenvalues of all kpoints, calculates the occupation numbers.
Types and basic routines needed for a kpoint calculation.
subroutine, public kpoint_sym_create(kp_sym)
Create a single kpoint symmetry environment.
subroutine, public kpoint_env_create(kp_env)
Create a single kpoint environment.
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.
K-points and crystal symmetry routines based on.
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Utility routines for the memory handling.
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
wrapper for the pools of matrixes
subroutine, public mpools_create(mpools)
creates a mpools
subroutine, public mpools_rebuild_fm_pools(mpools, mos, blacs_env, para_env, nmosub)
rebuilds the pools of the (ao x mo, ao x ao , mo x mo) full matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
Definition and initialisation of the mo data type.
subroutine, public set_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, uniform_occupation, kts, mu, flexible_electron_count)
Set the components of a MO set data structure.
subroutine, public allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
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.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
parameters that control an scf iteration
All kind of helpful little routines.
pure integer function, dimension(2), public get_limit(m, n, me)
divide m entries into n parts, return size of part me
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
to create arrays of pools
keeps the information about the structure of a full matrix
Stores the state of a copy between cp_fm_start_copy_general and cp_fm_finish_copy_general.
Rotation matrices for basis sets.
Keeps information about a specific k-point.
Keeps symmetry information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
container for the pools of matrixes used by qs
contains the parameters needed by a scf run