37 USE dbcsr_api,
ONLY: &
38 dbcsr_complete_redistribute, dbcsr_copy, dbcsr_copy_into_existing, dbcsr_create, &
39 dbcsr_desymmetrize, dbcsr_distribution_get, dbcsr_distribution_new, &
40 dbcsr_distribution_release, dbcsr_distribution_type, dbcsr_filter, dbcsr_finalize, &
41 dbcsr_get_block_p, dbcsr_get_info, dbcsr_get_num_blocks, dbcsr_get_stored_coordinates, &
42 dbcsr_multiply, dbcsr_nblkcols_total, dbcsr_nblkrows_total, dbcsr_p_type, dbcsr_release, &
43 dbcsr_reserve_block2d, dbcsr_set, dbcsr_type, dbcsr_type_no_symmetry, dbcsr_work_create
72 neighbor_list_iterator_p_type,&
74 neighbor_list_set_p_type
80 #include "./base/base_uses.f90"
86 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'almo_scf_qs'
115 name_new, size_keys, symmetry_new, &
116 spin_key, init_domains)
118 TYPE(dbcsr_type) :: matrix_new, matrix_qs
119 TYPE(almo_scf_env_type),
INTENT(IN) :: almo_scf_env
120 CHARACTER(len=*),
INTENT(IN) :: name_new
121 INTEGER,
DIMENSION(2),
INTENT(IN) :: size_keys
122 CHARACTER,
INTENT(IN) :: symmetry_new
123 INTEGER,
INTENT(IN) :: spin_key
124 LOGICAL,
INTENT(IN) :: init_domains
126 CHARACTER(len=*),
PARAMETER :: routinen =
'matrix_almo_create'
128 INTEGER :: dimen, handle, hold, iatom, iblock_col, &
129 iblock_row, imol, mynode, natoms, &
130 nblkrows_tot, nlength, nmols, row
131 INTEGER,
DIMENSION(:),
POINTER :: blk_distr, blk_sizes, block_sizes_new, col_distr_new, &
132 col_sizes_new, distr_new_array, row_distr_new, row_sizes_new
133 LOGICAL :: active, one_dim_is_mo, tr
134 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: p_new_block
135 TYPE(dbcsr_distribution_type) :: dist_new, dist_qs
149 CALL timeset(routinen, handle)
162 CALL dbcsr_get_info(matrix_qs, distribution=dist_qs)
164 natoms = almo_scf_env%natoms
165 nmols = almo_scf_env%nmolecules
171 CALL dbcsr_distribution_get(dist_qs, row_dist=blk_distr)
173 CALL dbcsr_distribution_get(dist_qs, col_dist=blk_distr)
179 CALL dbcsr_get_info(matrix_qs, row_blk_size=blk_sizes)
183 ALLOCATE (block_sizes_new(natoms), distr_new_array(natoms))
184 block_sizes_new(:) = blk_sizes(:)
185 distr_new_array(:) = blk_distr(:)
188 ALLOCATE (block_sizes_new(nmols), distr_new_array(nmols))
189 block_sizes_new(:) = 0
191 block_sizes_new(almo_scf_env%domain_index_of_atom(iatom)) = &
192 block_sizes_new(almo_scf_env%domain_index_of_atom(iatom)) + &
196 distr_new_array(imol) = &
197 blk_distr(almo_scf_env%first_atom_of_domain(imol))
200 cpabort(
"Illegal distribution")
213 ALLOCATE (block_sizes_new(nlength))
214 block_sizes_new(:) = 0
225 ALLOCATE (block_sizes_new(nlength))
227 block_sizes_new(:) = almo_scf_env%nocc_of_domain(:, spin_key)
230 WHERE (block_sizes_new == 0) block_sizes_new = 1
232 block_sizes_new(:) = almo_scf_env%nvirt_disc_of_domain(:, spin_key)
234 block_sizes_new(:) = almo_scf_env%nvirt_full_of_domain(:, spin_key)
236 block_sizes_new(:) = almo_scf_env%nvirt_of_domain(:, spin_key)
239 cpabort(
"Illegal distribution")
244 cpabort(
"Illegal dimension")
249 ALLOCATE (distr_new_array(nlength))
252 distr_new_array(:) = blk_distr(:)
256 distr_new_array(imol) = &
257 blk_distr(almo_scf_env%first_atom_of_domain(imol))
264 row_sizes_new => block_sizes_new
265 row_distr_new => distr_new_array
267 col_sizes_new => block_sizes_new
268 col_distr_new => distr_new_array
273 CALL dbcsr_distribution_new(dist_new, template=dist_qs, &
274 row_dist=row_distr_new, col_dist=col_distr_new, &
278 CALL dbcsr_create(matrix_new, name_new, &
279 dist_new, symmetry_new, &
280 row_sizes_new, col_sizes_new, reuse_arrays=.true.)
281 CALL dbcsr_distribution_release(dist_new)
285 IF (init_domains)
THEN
287 CALL dbcsr_distribution_get(dist_new, mynode=mynode)
288 CALL dbcsr_work_create(matrix_new, work_mutable=.true.)
350 nblkrows_tot = dbcsr_nblkrows_total(matrix_new)
351 DO row = 1, nblkrows_tot
355 CALL dbcsr_get_stored_coordinates(matrix_new, iblock_row, iblock_col, hold)
357 IF (hold .EQ. mynode)
THEN
361 one_dim_is_mo = .false.
365 IF (one_dim_is_mo)
THEN
366 IF (almo_scf_env%nocc_of_domain(row, spin_key) == 0) active = .false.
369 one_dim_is_mo = .false.
373 IF (one_dim_is_mo)
THEN
374 IF (almo_scf_env%nvirt_of_domain(row, spin_key) == 0) active = .false.
377 one_dim_is_mo = .false.
381 IF (one_dim_is_mo)
THEN
382 IF (almo_scf_env%nvirt_disc_of_domain(row, spin_key) == 0) active = .false.
385 one_dim_is_mo = .false.
389 IF (one_dim_is_mo)
THEN
390 IF (almo_scf_env%nvirt_full_of_domain(row, spin_key) == 0) active = .false.
394 NULLIFY (p_new_block)
395 CALL dbcsr_reserve_block2d(matrix_new, iblock_row, iblock_col, p_new_block)
396 cpassert(
ASSOCIATED(p_new_block))
397 p_new_block(:, :) = 1.0_dp
406 CALL dbcsr_finalize(matrix_new)
408 CALL timestop(handle)
424 TYPE(dbcsr_type) :: matrix_qs, matrix_almo
425 INTEGER :: mat_distr_aos
426 LOGICAL,
INTENT(IN) :: keep_sparsity
428 CHARACTER(len=*),
PARAMETER :: routinen =
'matrix_qs_to_almo'
431 TYPE(dbcsr_type) :: matrix_qs_nosym
433 CALL timeset(routinen, handle)
436 SELECT CASE (mat_distr_aos)
439 CALL dbcsr_copy(matrix_almo, matrix_qs, &
440 keep_sparsity=keep_sparsity)
443 CALL dbcsr_create(matrix_qs_nosym, template=matrix_qs, &
444 matrix_type=dbcsr_type_no_symmetry)
445 CALL dbcsr_desymmetrize(matrix_qs, matrix_qs_nosym)
454 CALL dbcsr_set(matrix_almo, 0.0_dp)
455 CALL dbcsr_complete_redistribute(matrix_qs_nosym, matrix_almo, &
456 keep_sparsity=keep_sparsity);
457 CALL dbcsr_release(matrix_qs_nosym)
463 CALL timestop(handle)
476 SUBROUTINE matrix_almo_to_qs(matrix_almo, matrix_qs, mat_distr_aos)
477 TYPE(dbcsr_type) :: matrix_almo, matrix_qs
478 INTEGER,
INTENT(IN) :: mat_distr_aos
480 CHARACTER(len=*),
PARAMETER :: routinen =
'matrix_almo_to_qs'
484 CALL timeset(routinen, handle)
487 SELECT CASE (mat_distr_aos)
489 CALL dbcsr_copy_into_existing(matrix_qs, matrix_almo)
491 CALL dbcsr_set(matrix_qs, 0.0_dp)
492 CALL dbcsr_complete_redistribute(matrix_almo, matrix_qs, keep_sparsity=.true.)
497 CALL timestop(handle)
499 END SUBROUTINE matrix_almo_to_qs
513 TYPE(qs_environment_type),
POINTER :: qs_env
514 TYPE(dbcsr_type),
DIMENSION(:) :: matrix_ks
515 INTEGER :: mat_distr_aos
516 REAL(kind=
dp) :: eps_filter
518 CHARACTER(len=*),
PARAMETER :: routinen =
'init_almo_ks_matrix_via_qs'
520 INTEGER :: handle, ispin, nspin
521 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_qs_ks, matrix_qs_s
522 TYPE(dft_control_type),
POINTER :: dft_control
523 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
525 TYPE(qs_ks_env_type),
POINTER :: ks_env
527 CALL timeset(routinen, handle)
533 dft_control=dft_control, &
534 matrix_s=matrix_qs_s, &
535 matrix_ks=matrix_qs_ks, &
539 nspin = dft_control%nspins
542 IF (.NOT.
ASSOCIATED(matrix_qs_ks))
THEN
545 ALLOCATE (matrix_qs_ks(ispin)%matrix)
546 CALL dbcsr_create(matrix_qs_ks(ispin)%matrix, &
547 template=matrix_qs_s(1)%matrix)
549 CALL dbcsr_set(matrix_qs_ks(ispin)%matrix, 0.0_dp)
551 CALL set_ks_env(ks_env, matrix_ks=matrix_qs_ks)
557 matrix_ks(ispin), mat_distr_aos, .false.)
558 CALL dbcsr_filter(matrix_ks(ispin), eps_filter)
561 CALL timestop(handle)
575 TYPE(qs_environment_type),
POINTER :: qs_env
576 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
578 CHARACTER(len=*),
PARAMETER :: routinen =
'construct_qs_mos'
580 INTEGER :: handle, ispin, ncol_fm, nrow_fm
581 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_tmp
582 TYPE(cp_fm_type) :: mo_fm_copy
583 TYPE(dft_control_type),
POINTER :: dft_control
584 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
585 TYPE(qs_scf_env_type),
POINTER :: scf_env
587 CALL timeset(routinen, handle)
590 NULLIFY (mos, fm_struct_tmp, scf_env)
596 CALL get_qs_env(qs_env, dft_control=dft_control, mos=mos)
598 CALL dbcsr_get_info(almo_scf_env%matrix_t(1), nfullrows_total=nrow_fm, nfullcols_total=ncol_fm)
601 DO ispin = 1, almo_scf_env%nspins
610 nelectron=almo_scf_env%nelectrons_total, &
611 n_el_f=real(almo_scf_env%nelectrons_total,
dp), &
613 flexible_electron_count=dft_control%relax_multiplicity)
616 context=almo_scf_env%blacs_env, &
617 para_env=almo_scf_env%para_env)
619 CALL cp_fm_create(mo_fm_copy, fm_struct_tmp, name=
"t_orthogonal_converted_to_fm")
623 CALL init_mo_set(mos(ispin), fm_ref=mo_fm_copy, name=
'fm_mo')
625 CALL cp_fm_release(mo_fm_copy)
629 CALL timestop(handle)
643 TYPE(qs_environment_type),
POINTER :: qs_env
644 TYPE(dbcsr_type),
DIMENSION(:) :: matrix_p
645 INTEGER,
INTENT(IN) :: mat_distr_aos
647 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_dm_to_qs_env'
649 INTEGER :: handle, ispin, nspins
650 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
651 TYPE(qs_rho_type),
POINTER :: rho
653 CALL timeset(routinen, handle)
655 NULLIFY (rho, rho_ao)
656 nspins =
SIZE(matrix_p)
662 CALL matrix_almo_to_qs(matrix_p(ispin), &
663 rho_ao(ispin)%matrix, &
669 CALL timestop(handle)
687 SUBROUTINE almo_dm_to_qs_ks(qs_env, matrix_p, energy_total, mat_distr_aos, smear, kTS_sum)
688 TYPE(qs_environment_type),
POINTER :: qs_env
689 TYPE(dbcsr_type),
DIMENSION(:) :: matrix_p
690 REAL(kind=
dp) :: energy_total
691 INTEGER,
INTENT(IN) :: mat_distr_aos
692 LOGICAL,
INTENT(IN),
OPTIONAL :: smear
693 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: kts_sum
695 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_dm_to_qs_ks'
699 REAL(kind=
dp) :: entropic_term
700 TYPE(qs_energy_type),
POINTER :: energy
702 CALL timeset(routinen, handle)
704 IF (
PRESENT(smear))
THEN
710 IF (
PRESENT(kts_sum))
THEN
711 entropic_term = kts_sum
713 entropic_term = 0.0_dp
725 energy%total = energy%total - energy%kTS + entropic_term
728 energy_total = energy%total
730 CALL timestop(handle)
732 END SUBROUTINE almo_dm_to_qs_ks
751 mat_distr_aos, smear, kTS_sum)
753 TYPE(qs_environment_type),
POINTER :: qs_env
754 TYPE(dbcsr_type),
DIMENSION(:) :: matrix_p, matrix_ks
755 REAL(kind=
dp) :: energy_total, eps_filter
756 INTEGER,
INTENT(IN) :: mat_distr_aos
757 LOGICAL,
INTENT(IN),
OPTIONAL :: smear
758 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: kts_sum
760 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_dm_to_almo_ks'
762 INTEGER :: handle, ispin, nspins
764 REAL(kind=
dp) :: entropic_term
765 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_qs_ks
767 CALL timeset(routinen, handle)
769 IF (
PRESENT(smear))
THEN
775 IF (
PRESENT(kts_sum))
THEN
776 entropic_term = kts_sum
778 entropic_term = 0.0_dp
782 CALL almo_dm_to_qs_ks(qs_env, matrix_p, energy_total, mat_distr_aos, &
784 kts_sum=entropic_term)
786 nspins =
SIZE(matrix_ks)
789 CALL get_qs_env(qs_env, matrix_ks=matrix_qs_ks)
793 mat_distr_aos, .false.)
794 CALL dbcsr_filter(matrix_ks(ispin), eps_filter)
797 CALL timestop(handle)
812 TYPE(qs_environment_type),
POINTER :: qs_env
813 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: energy, energy_singles_corr
815 TYPE(qs_energy_type),
POINTER ::
qs_energy
819 IF (
PRESENT(energy_singles_corr))
THEN
820 qs_energy%singles_corr = energy_singles_corr
825 IF (
PRESENT(energy))
THEN
843 TYPE(qs_environment_type),
POINTER :: qs_env
844 TYPE(almo_scf_env_type),
INTENT(INOUT) :: almo_scf_env
846 CHARACTER(len=*),
PARAMETER :: routinen =
'almo_scf_construct_quencher'
849 INTEGER :: col, contact_atom_1, contact_atom_2, domain_col, domain_map_local_entries, &
850 domain_row, global_entries, global_list_length, grid1, groupid, handle, hold, iatom, &
851 iatom2, iblock_col, iblock_row, idomain, idomain2, ientry, igrid, ineig, ineighbor, &
852 inode, inode2, ipair, ispin, jatom, jatom2, jdomain2, local_list_length, &
853 max_domain_neighbors, max_neig, mynode, nblkcols_tot, nblkrows_tot, nblks, ndomains, &
854 neig_temp, nnode2, nnodes, row, unit_nr
855 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: current_number_neighbors, domain_entries_cpu, &
856 domain_map_global, domain_map_local, first_atom_of_molecule, global_list, &
857 last_atom_of_molecule, list_length_cpu, list_offset_cpu, local_list, offset_for_cpu
858 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: domain_grid, domain_neighbor_list, &
859 domain_neighbor_list_excessive
860 LOGICAL :: already_listed, block_active, &
861 delayed_increment, found, &
863 REAL(kind=
dp) :: contact1_radius, contact2_radius, &
864 distance, distance_squared, overlap, &
865 r0, r1, s0, s1, trial_distance_squared
866 REAL(kind=
dp),
DIMENSION(3) :: rab
867 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: p_new_block
868 TYPE(cell_type),
POINTER :: cell
869 TYPE(cp_logger_type),
POINTER :: logger
870 TYPE(dbcsr_distribution_type) :: dist
871 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
872 TYPE(dbcsr_type) :: matrix_s_sym
873 TYPE(molecule_type),
DIMENSION(:),
POINTER :: molecule_set
874 TYPE(mp_comm_type) :: group
875 TYPE(neighbor_list_iterator_p_type), &
876 DIMENSION(:),
POINTER :: nl_iterator, nl_iterator2
877 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
879 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
881 CALL timeset(routinen, handle)
885 IF (logger%para_env%is_source())
THEN
891 ndomains = almo_scf_env%ndomains
894 particle_set=particle_set, &
895 molecule_set=molecule_set, &
903 ALLOCATE (first_atom_of_molecule(almo_scf_env%nmolecules))
904 ALLOCATE (last_atom_of_molecule(almo_scf_env%nmolecules))
906 mol_to_first_atom=first_atom_of_molecule, &
907 mol_to_last_atom=last_atom_of_molecule)
911 CALL dbcsr_create(matrix_s_sym, &
912 template=almo_scf_env%matrix_s(1), &
913 matrix_type=dbcsr_type_no_symmetry)
914 CALL dbcsr_get_info(almo_scf_env%matrix_s(1), &
916 IF (sym .EQ. dbcsr_type_no_symmetry)
THEN
917 CALL dbcsr_copy(matrix_s_sym, almo_scf_env%matrix_s(1))
919 CALL dbcsr_desymmetrize(almo_scf_env%matrix_s(1), &
923 ALLOCATE (almo_scf_env%quench_t(almo_scf_env%nspins))
924 ALLOCATE (almo_scf_env%domain_map(almo_scf_env%nspins))
931 matrix_qs=matrix_s(1)%matrix, &
932 almo_scf_env=almo_scf_env, &
933 name_new=
"T_QUENCHER", &
935 symmetry_new=dbcsr_type_no_symmetry, &
937 init_domains=.false.)
940 CALL dbcsr_work_create(almo_scf_env%quench_t(ispin), &
943 nblkrows_tot = dbcsr_nblkrows_total(almo_scf_env%quench_t(ispin))
944 nblkcols_tot = dbcsr_nblkcols_total(almo_scf_env%quench_t(ispin))
946 CALL dbcsr_get_info(almo_scf_env%quench_t(ispin), distribution=dist)
947 CALL dbcsr_distribution_get(dist, numnodes=nnodes, group=groupid, mynode=mynode)
948 CALL group%set_handle(groupid)
952 local_list_length = 0
958 iatom=iatom2, jatom=jatom2, inode=inode2, nnode=nnode2)
960 IF (inode2 == 1)
THEN
961 local_list_length = local_list_length + nnode2
967 ALLOCATE (local_list(2*local_list_length))
969 local_list_length = 0
973 iatom=iatom2, jatom=jatom2)
974 local_list(2*local_list_length + 1) = iatom2
975 local_list(2*local_list_length + 2) = jatom2
976 local_list_length = local_list_length + 1
981 ALLOCATE (list_length_cpu(nnodes), list_offset_cpu(nnodes))
982 CALL group%allgather(2*local_list_length, list_length_cpu)
985 list_offset_cpu(1) = 0
987 list_offset_cpu(inode) = list_offset_cpu(inode - 1) + &
988 list_length_cpu(inode - 1)
990 global_list_length = list_offset_cpu(nnodes) + list_length_cpu(nnodes)
993 ALLOCATE (global_list(global_list_length))
994 CALL group%allgatherv(local_list, global_list, &
995 list_length_cpu, list_offset_cpu)
996 DEALLOCATE (list_length_cpu, list_offset_cpu)
997 DEALLOCATE (local_list)
1000 ALLOCATE (current_number_neighbors(almo_scf_env%ndomains))
1001 current_number_neighbors(:) = 0
1002 global_list_length = global_list_length/2
1003 DO ipair = 1, global_list_length
1004 iatom2 = global_list(2*(ipair - 1) + 1)
1005 jatom2 = global_list(2*(ipair - 1) + 2)
1006 idomain2 = almo_scf_env%domain_index_of_atom(iatom2)
1007 jdomain2 = almo_scf_env%domain_index_of_atom(jatom2)
1009 current_number_neighbors(idomain2) = current_number_neighbors(idomain2) + 1
1011 IF (idomain2 .NE. jdomain2)
THEN
1012 current_number_neighbors(jdomain2) = current_number_neighbors(jdomain2) + 1
1015 max_domain_neighbors = maxval(current_number_neighbors)
1018 ALLOCATE (domain_neighbor_list_excessive(ndomains, max_domain_neighbors))
1019 current_number_neighbors(:) = 1
1020 DO ipair = 1, ndomains
1021 domain_neighbor_list_excessive(ipair, 1) = ipair
1023 DO ipair = 1, global_list_length
1024 iatom2 = global_list(2*(ipair - 1) + 1)
1025 jatom2 = global_list(2*(ipair - 1) + 2)
1026 idomain2 = almo_scf_env%domain_index_of_atom(iatom2)
1027 jdomain2 = almo_scf_env%domain_index_of_atom(jatom2)
1028 already_listed = .false.
1029 DO ineighbor = 1, current_number_neighbors(idomain2)
1030 IF (domain_neighbor_list_excessive(idomain2, ineighbor) .EQ. jdomain2)
THEN
1031 already_listed = .true.
1035 IF (.NOT. already_listed)
THEN
1037 current_number_neighbors(idomain2) = current_number_neighbors(idomain2) + 1
1038 domain_neighbor_list_excessive(idomain2, current_number_neighbors(idomain2)) = jdomain2
1040 IF (idomain2 .NE. jdomain2)
THEN
1041 current_number_neighbors(jdomain2) = current_number_neighbors(jdomain2) + 1
1042 domain_neighbor_list_excessive(jdomain2, current_number_neighbors(jdomain2)) = idomain2
1046 DEALLOCATE (global_list)
1048 max_domain_neighbors = maxval(current_number_neighbors)
1049 ALLOCATE (domain_neighbor_list(ndomains, max_domain_neighbors))
1050 domain_neighbor_list(:, :) = 0
1051 domain_neighbor_list(:, :) = domain_neighbor_list_excessive(:, 1:max_domain_neighbors)
1052 DEALLOCATE (domain_neighbor_list_excessive)
1054 ALLOCATE (almo_scf_env%domain_map(ispin)%index1(ndomains))
1055 ALLOCATE (almo_scf_env%domain_map(ispin)%pairs(max_domain_neighbors*ndomains, 2))
1056 almo_scf_env%domain_map(ispin)%pairs(:, :) = 0
1057 almo_scf_env%domain_map(ispin)%index1(:) = 0
1058 domain_map_local_entries = 0
1064 DO row = 1, nblkrows_tot
1065 DO col = 1, current_number_neighbors(row)
1068 iblock_col = domain_neighbor_list(row, col)
1069 CALL dbcsr_get_stored_coordinates(almo_scf_env%quench_t(ispin), &
1070 iblock_row, iblock_col, hold)
1072 IF (hold .EQ. mynode)
THEN
1076 domain_row = almo_scf_env%domain_index_of_ao_block(iblock_row)
1078 domain_col = almo_scf_env%domain_index_of_mo_block(iblock_col)
1080 SELECT CASE (almo_scf_env%constraint_type)
1083 block_active = .false.
1091 IF (domain_row == domain_col)
THEN
1092 block_active = .true.
1098 cpabort(
"Illegal: atomic domains and molecular groups")
1108 cpabort(
"Illegal: molecular domains and atomic groups")
1113 IF (domain_row == domain_col)
THEN
1114 block_active = .true.
1121 IF (block_active)
THEN
1123 NULLIFY (p_new_block)
1124 CALL dbcsr_reserve_block2d(almo_scf_env%quench_t(ispin), &
1125 iblock_row, iblock_col, p_new_block)
1126 cpassert(
ASSOCIATED(p_new_block))
1127 p_new_block(:, :) = 1.0_dp
1129 IF (domain_map_local_entries .GE. max_domain_neighbors*almo_scf_env%ndomains)
THEN
1130 cpabort(
"weird... max_domain_neighbors is exceeded")
1132 almo_scf_env%domain_map(ispin)%pairs(domain_map_local_entries + 1, 1) = iblock_row
1133 almo_scf_env%domain_map(ispin)%pairs(domain_map_local_entries + 1, 2) = iblock_col
1134 domain_map_local_entries = domain_map_local_entries + 1
1149 CALL dbcsr_get_block_p(matrix_s_sym, &
1150 iblock_row, iblock_col, p_new_block, found)
1154 overlap = maxval(abs(p_new_block))
1163 cpabort(
"atomic domains and molecular groups - NYI")
1174 cpabort(
"molecular domains and atomic groups - NYI")
1180 CALL dbcsr_get_block_p(matrix_s_sym, &
1181 iblock_row, iblock_col, p_new_block, found)
1185 overlap = maxval(abs(p_new_block))
1194 s0 = -log10(abs(almo_scf_env%quencher_s0))
1195 s1 = -log10(abs(almo_scf_env%quencher_s1))
1196 IF (overlap .EQ. 0.0_dp)
THEN
1197 overlap = -log10(abs(almo_scf_env%eps_filter)) + 100.0_dp
1199 overlap = -log10(overlap)
1201 IF (s0 .LT. 0.0_dp)
THEN
1202 cpabort(
"S0 is less than zero")
1204 IF (s1 .LE. 0.0_dp)
THEN
1205 cpabort(
"S1 is less than or equal to zero")
1207 IF (s0 .GE. s1)
THEN
1208 cpabort(
"S0 is greater than or equal to S1")
1212 IF (overlap .LT. s1)
THEN
1213 NULLIFY (p_new_block)
1214 CALL dbcsr_reserve_block2d(almo_scf_env%quench_t(ispin), &
1215 iblock_row, iblock_col, p_new_block)
1216 cpassert(
ASSOCIATED(p_new_block))
1217 IF (overlap .LE. s0)
THEN
1218 p_new_block(:, :) = 1.0_dp
1222 p_new_block(:, :) = 1.0_dp/(1.0_dp + exp(-(s0 - s1)/(s0 - overlap) - (s0 - s1)/(overlap - s1)))
1227 IF (abs(p_new_block(1, 1)) .GT. abs(almo_scf_env%eps_filter))
THEN
1228 IF (domain_map_local_entries .GE. max_domain_neighbors*almo_scf_env%ndomains)
THEN
1229 cpabort(
"weird... max_domain_neighbors is exceeded")
1231 almo_scf_env%domain_map(ispin)%pairs(domain_map_local_entries + 1, 1) = iblock_row
1232 almo_scf_env%domain_map(ispin)%pairs(domain_map_local_entries + 1, 2) = iblock_col
1233 domain_map_local_entries = domain_map_local_entries + 1
1251 IF (domain_row == domain_col)
THEN
1253 contact_atom_1 = first_atom_of_molecule(domain_row)
1254 contact_atom_2 = first_atom_of_molecule(domain_col)
1256 distance_squared = 1.0e+100_dp
1259 DO iatom = first_atom_of_molecule(domain_row), last_atom_of_molecule(domain_row)
1260 DO jatom = first_atom_of_molecule(domain_col), last_atom_of_molecule(domain_col)
1261 rab(:) =
pbc(particle_set(iatom)%r(:), particle_set(jatom)%r(:), cell)
1262 trial_distance_squared = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
1263 IF (trial_distance_squared .LT. distance_squared)
THEN
1264 distance_squared = trial_distance_squared
1265 contact_atom_1 = iatom
1266 contact_atom_2 = jatom
1270 cpassert(contact_atom_1 .GT. 0)
1271 distance = sqrt(distance_squared)
1278 cpabort(
"atomic domains and molecular groups - NYI")
1289 cpabort(
"molecular domains and atomic groups - NYI")
1295 rab(:) =
pbc(particle_set(domain_row)%r(:), particle_set(domain_col)%r(:), cell)
1296 distance = sqrt(rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3))
1297 contact_atom_1 = domain_row
1298 contact_atom_2 = domain_col
1306 CALL get_atomic_kind(atomic_kind=particle_set(contact_atom_1)%atomic_kind, &
1307 rcov=contact1_radius)
1308 CALL get_atomic_kind(atomic_kind=particle_set(contact_atom_2)%atomic_kind, &
1309 rcov=contact2_radius)
1311 CALL get_atomic_kind(atomic_kind=particle_set(contact_atom_1)%atomic_kind, &
1312 rvdw=contact1_radius)
1313 CALL get_atomic_kind(atomic_kind=particle_set(contact_atom_2)%atomic_kind, &
1314 rvdw=contact2_radius)
1316 cpabort(
"Illegal quencher_radius_type")
1326 r0 = almo_scf_env%quencher_r0_factor*(contact1_radius + contact2_radius)
1328 r1 = almo_scf_env%quencher_r1_factor*(contact1_radius + contact2_radius)
1331 IF (r0 .LT. 0.0_dp)
THEN
1332 cpabort(
"R0 is less than zero")
1334 IF (r1 .LE. 0.0_dp)
THEN
1335 cpabort(
"R1 is less than or equal to zero")
1337 IF (r0 .GT. r1)
THEN
1338 cpabort(
"R0 is greater than or equal to R1")
1342 IF (distance .LT. r1)
THEN
1343 NULLIFY (p_new_block)
1344 CALL dbcsr_reserve_block2d(almo_scf_env%quench_t(ispin), &
1345 iblock_row, iblock_col, p_new_block)
1346 cpassert(
ASSOCIATED(p_new_block))
1347 IF (distance .LE. r0)
THEN
1348 p_new_block(:, :) = 1.0_dp
1355 p_new_block(:, :) = 1.0_dp/(1.0_dp + exp((r1 - r0)/(r0 - distance) + (r1 - r0)/(r1 - distance)))
1361 IF (abs(p_new_block(1, 1)) .GT. abs(almo_scf_env%eps_filter))
THEN
1362 IF (domain_map_local_entries .GE. max_domain_neighbors*almo_scf_env%ndomains)
THEN
1363 cpabort(
"weird... max_domain_neighbors is exceeded")
1365 almo_scf_env%domain_map(ispin)%pairs(domain_map_local_entries + 1, 1) = iblock_row
1366 almo_scf_env%domain_map(ispin)%pairs(domain_map_local_entries + 1, 2) = iblock_col
1367 domain_map_local_entries = domain_map_local_entries + 1
1373 cpabort(
"Illegal constraint type")
1381 DEALLOCATE (domain_neighbor_list)
1382 DEALLOCATE (current_number_neighbors)
1384 CALL dbcsr_finalize(almo_scf_env%quench_t(ispin))
1387 CALL dbcsr_filter(almo_scf_env%quench_t(ispin), &
1388 almo_scf_env%eps_filter)
1391 nblks = dbcsr_get_num_blocks(almo_scf_env%quench_t(ispin))
1392 IF (nblks .NE. domain_map_local_entries)
THEN
1393 cpabort(
"number of blocks is wrong")
1397 ALLOCATE (domain_entries_cpu(nnodes), offset_for_cpu(nnodes))
1398 CALL group%allgather(2*domain_map_local_entries, domain_entries_cpu)
1401 offset_for_cpu(1) = 0
1402 DO inode = 2, nnodes
1403 offset_for_cpu(inode) = offset_for_cpu(inode - 1) + &
1404 domain_entries_cpu(inode - 1)
1406 global_entries = offset_for_cpu(nnodes) + domain_entries_cpu(nnodes)
1409 ALLOCATE (domain_map_global(global_entries))
1410 ALLOCATE (domain_map_local(2*domain_map_local_entries))
1411 DO ientry = 1, domain_map_local_entries
1412 domain_map_local(2*(ientry - 1) + 1) = almo_scf_env%domain_map(ispin)%pairs(ientry, 1)
1413 domain_map_local(2*ientry) = almo_scf_env%domain_map(ispin)%pairs(ientry, 2)
1415 CALL group%allgatherv(domain_map_local, domain_map_global, &
1416 domain_entries_cpu, offset_for_cpu)
1417 DEALLOCATE (domain_entries_cpu, offset_for_cpu)
1418 DEALLOCATE (domain_map_local)
1420 DEALLOCATE (almo_scf_env%domain_map(ispin)%index1)
1421 DEALLOCATE (almo_scf_env%domain_map(ispin)%pairs)
1422 ALLOCATE (almo_scf_env%domain_map(ispin)%index1(ndomains))
1423 ALLOCATE (almo_scf_env%domain_map(ispin)%pairs(global_entries/2, 2))
1424 almo_scf_env%domain_map(ispin)%pairs(:, :) = 0
1425 almo_scf_env%domain_map(ispin)%index1(:) = 0
1431 max_neig = max_domain_neighbors
1432 max_neig_fails = .true.
1433 max_neig_loop:
DO WHILE (max_neig_fails)
1434 ALLOCATE (domain_grid(almo_scf_env%ndomains, 0:max_neig))
1435 domain_grid(:, :) = 0
1437 domain_grid(:, 0) = 1
1439 global_entries = global_entries/2
1440 DO ientry = 1, global_entries
1442 grid1 = domain_map_global(2*ientry)
1444 ineig = domain_map_global(2*(ientry - 1) + 1)
1446 IF (domain_grid(grid1, 0) .GT. max_neig)
THEN
1449 DEALLOCATE (domain_grid)
1450 max_neig = max_neig*2
1455 delayed_increment = .false.
1456 DO igrid = 1, domain_grid(grid1, 0)
1458 IF (ineig .LT. domain_grid(grid1, igrid))
THEN
1462 ineig = domain_grid(grid1, igrid)
1463 domain_grid(grid1, igrid) = neig_temp
1465 IF (domain_grid(grid1, igrid) .EQ. 0)
THEN
1467 domain_grid(grid1, igrid) = ineig
1469 delayed_increment = .true.
1473 IF (delayed_increment)
THEN
1474 domain_grid(grid1, 0) = domain_grid(grid1, 0) + 1
1477 cpabort(
"all records must be inserted")
1480 max_neig_fails = .false.
1481 END DO max_neig_loop
1482 DEALLOCATE (domain_map_global)
1485 DO idomain = 1, almo_scf_env%ndomains
1486 DO ineig = 1, domain_grid(idomain, 0) - 1
1487 almo_scf_env%domain_map(ispin)%pairs(ientry, 1) = domain_grid(idomain, ineig)
1488 almo_scf_env%domain_map(ispin)%pairs(ientry, 2) = idomain
1491 almo_scf_env%domain_map(ispin)%index1(idomain) = ientry
1493 DEALLOCATE (domain_grid)
1496 IF (almo_scf_env%nspins .EQ. 2)
THEN
1497 CALL dbcsr_copy(almo_scf_env%quench_t(2), &
1498 almo_scf_env%quench_t(1))
1499 almo_scf_env%domain_map(2)%pairs(:, :) = &
1500 almo_scf_env%domain_map(1)%pairs(:, :)
1501 almo_scf_env%domain_map(2)%index1(:) = &
1502 almo_scf_env%domain_map(1)%index1(:)
1505 CALL dbcsr_release(matrix_s_sym)
1509 DEALLOCATE (first_atom_of_molecule)
1510 DEALLOCATE (last_atom_of_molecule)
1530 CALL timestop(handle)
1544 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_w
1545 TYPE(almo_scf_env_type) :: almo_scf_env
1547 CHARACTER(len=*),
PARAMETER :: routinen =
'calculate_w_matrix_almo'
1549 INTEGER :: handle, ispin
1550 REAL(kind=
dp) :: scaling
1551 TYPE(dbcsr_type) :: tmp_nn1, tmp_no1, tmp_oo1, tmp_oo2
1553 CALL timeset(routinen, handle)
1555 IF (almo_scf_env%nspins == 1)
THEN
1561 DO ispin = 1, almo_scf_env%nspins
1563 CALL dbcsr_create(tmp_nn1, template=almo_scf_env%matrix_s(1), &
1564 matrix_type=dbcsr_type_no_symmetry)
1565 CALL dbcsr_create(tmp_no1, template=almo_scf_env%matrix_t(ispin), &
1566 matrix_type=dbcsr_type_no_symmetry)
1567 CALL dbcsr_create(tmp_oo1, template=almo_scf_env%matrix_sigma_inv(ispin), &
1568 matrix_type=dbcsr_type_no_symmetry)
1569 CALL dbcsr_create(tmp_oo2, template=almo_scf_env%matrix_sigma_inv(ispin), &
1570 matrix_type=dbcsr_type_no_symmetry)
1572 CALL dbcsr_copy(tmp_nn1, almo_scf_env%matrix_ks(ispin))
1574 CALL dbcsr_multiply(
"N",
"N", scaling, tmp_nn1, almo_scf_env%matrix_t(ispin), &
1575 0.0_dp, tmp_no1, filter_eps=almo_scf_env%eps_filter)
1577 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, almo_scf_env%matrix_t(ispin), tmp_no1, &
1578 0.0_dp, tmp_oo1, filter_eps=almo_scf_env%eps_filter)
1580 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmp_oo1, almo_scf_env%matrix_sigma_inv(ispin), &
1581 0.0_dp, tmp_oo2, filter_eps=almo_scf_env%eps_filter)
1583 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, almo_scf_env%matrix_sigma_inv(ispin), tmp_oo2, &
1584 0.0_dp, tmp_oo1, filter_eps=almo_scf_env%eps_filter)
1586 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, almo_scf_env%matrix_t(ispin), tmp_oo1, &
1587 0.0_dp, tmp_no1, filter_eps=almo_scf_env%eps_filter)
1589 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, tmp_no1, almo_scf_env%matrix_t(ispin), &
1590 0.0_dp, tmp_nn1, filter_eps=almo_scf_env%eps_filter)
1591 CALL matrix_almo_to_qs(tmp_nn1, matrix_w(ispin)%matrix, almo_scf_env%mat_distr_aos)
1593 CALL dbcsr_release(tmp_nn1)
1594 CALL dbcsr_release(tmp_no1)
1595 CALL dbcsr_release(tmp_oo1)
1596 CALL dbcsr_release(tmp_oo2)
1600 CALL timestop(handle)
subroutine pbc(r, r_pbc, s, s_pbc, a, b, c, alpha, beta, gamma, debug, info, pbc0, h, hinv)
...
Interface between ALMO SCF and QS.
subroutine, public almo_scf_update_ks_energy(qs_env, energy, energy_singles_corr)
update qs_env total energy
subroutine, public construct_qs_mos(qs_env, almo_scf_env)
Create MOs in the QS env to be able to return ALMOs to QS.
subroutine, public matrix_qs_to_almo(matrix_qs, matrix_almo, mat_distr_aos, keep_sparsity)
convert between two types of matrices: QS style to ALMO style
subroutine, public calculate_w_matrix_almo(matrix_w, almo_scf_env)
Compute matrix W (energy-weighted density matrix) that is needed for the evaluation of forces.
subroutine, public matrix_almo_create(matrix_new, matrix_qs, almo_scf_env, name_new, size_keys, symmetry_new, spin_key, init_domains)
create the ALMO matrix templates
subroutine, public init_almo_ks_matrix_via_qs(qs_env, matrix_ks, mat_distr_aos, eps_filter)
Initialization of the QS and ALMO KS matrix.
subroutine, public almo_dm_to_qs_env(qs_env, matrix_p, mat_distr_aos)
return density matrix to the qs_env
subroutine, public almo_dm_to_almo_ks(qs_env, matrix_p, matrix_ks, energy_total, eps_filter, mat_distr_aos, smear, kTS_sum)
uses the ALMO density matrix to compute ALMO KS matrix and the new energy
subroutine, public almo_scf_construct_quencher(qs_env, almo_scf_env)
Creates the matrix that imposes absolute locality on MOs.
Types for all ALMO-based methods.
integer, parameter, public almo_mat_dim_occ
integer, parameter, public almo_mat_dim_virt_full
integer, parameter, public almo_mat_dim_aobasis
integer, parameter, public almo_mat_dim_virt
integer, parameter, public almo_mat_dim_virt_disc
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.
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.
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_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
real(kind=dp) function, public cp_unit_to_cp2k(value, unit_str, defaults, power)
converts to the internal cp2k units to the given unit
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
Define the data structure for the molecule information.
subroutine, public get_molecule_set_info(molecule_set, atom_to_mol, mol_to_first_atom, mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, mol_to_multiplicity)
returns information about molecules in the set.
Define the data structure for the particle information.
Perform a QUICKSTEP wavefunction optimization (single point)
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.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, WannierCentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Set the QUICKSTEP environment.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_ks_im_kp, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Definition and initialisation of the mo data type.
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 deallocate_mo_set(mo_set)
Deallocate a wavefunction 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)
...
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)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
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...
module that contains the definitions of the scf types
subroutine, public scf_env_create(scf_env)
allocates and initialize an scf_env