13 gto_basis_set_p_type,&
44 USE dbcsr_api,
ONLY: &
45 dbcsr_create, dbcsr_finalize, dbcsr_get_info, dbcsr_iterator_blocks_left, &
46 dbcsr_iterator_next_block, dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, &
47 dbcsr_multiply, dbcsr_p_type, dbcsr_release, dbcsr_reserve_blocks, dbcsr_set, dbcsr_type, &
48 dbcsr_type_no_symmetry
99 #include "./base/base_uses.f90"
105 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_fb_env_methods'
131 TYPE(fb_env_obj),
INTENT(INOUT) :: fb_env
132 TYPE(qs_environment_type),
POINTER :: qs_env
133 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
134 TYPE(section_vals_type),
POINTER :: scf_section
135 LOGICAL,
INTENT(INOUT) :: diis_step
137 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fb_env_do_diag'
139 CHARACTER(len=2) :: spin_string
140 CHARACTER(len=default_string_length) :: name
141 INTEGER :: filtered_nfullrowsorcols_total, handle, homo_filtered, ispin, lfomo_filtered, &
142 my_nmo, nao, ndep, nelectron, nmo, nmo_filtered, nspin, original_nfullrowsorcols_total
143 INTEGER,
DIMENSION(:),
POINTER :: filtered_roworcol_block_sizes, &
144 original_roworcol_block_sizes
145 LOGICAL :: collective_com
146 REAL(kind=
dp) :: diis_error, eps_default, eps_diis, eps_eigval, fermi_level, filter_temp, &
147 flexible_electron_count, kts_filtered, maxocc, mu_filtered
148 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, eigenvalues_filtered, occ, &
150 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
151 TYPE(cp_fm_struct_type),
POINTER :: filter_fm_struct, fm_struct
152 TYPE(cp_fm_type) :: fm_matrix_filter, fm_matrix_filtered_ks, &
153 fm_matrix_filtered_s, fm_matrix_ortho, &
155 TYPE(cp_fm_type),
POINTER :: mo_coeff, mo_coeff_filtered
156 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_filter
157 TYPE(dbcsr_type) :: matrix_filtered_ks, matrix_filtered_s, &
159 TYPE(dbcsr_type),
POINTER :: matrix_filtered_p
160 TYPE(fb_atomic_halo_list_obj) :: atomic_halos
161 TYPE(fb_trial_fns_obj) :: trial_fns
162 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_filtered
163 TYPE(mp_para_env_type),
POINTER :: para_env
164 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
165 TYPE(qs_scf_env_type),
POINTER :: scf_env
166 TYPE(scf_control_type),
POINTER :: scf_control
170 CALL timeset(routinen, handle)
172 NULLIFY (scf_env, scf_control, para_env, blacs_env, particle_set)
173 NULLIFY (eigenvalues, eigenvalues_filtered, occ, occ_filtered)
174 NULLIFY (mos, mos_filtered)
175 NULLIFY (matrix_filter, matrix_filtered_p)
176 NULLIFY (fm_struct, filter_fm_struct)
177 NULLIFY (mo_coeff_filtered, mo_coeff)
181 NULLIFY (original_roworcol_block_sizes, filtered_roworcol_block_sizes)
186 scf_control=scf_control, &
188 blacs_env=blacs_env, &
189 particle_set=particle_set, &
192 nspin =
SIZE(matrix_ks)
200 scf_env%scf_work1(ispin))
203 eps_diis = scf_control%eps_diis
204 eps_eigval = epsilon(0.0_dp)
206 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis)
THEN
207 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
208 scf_env%scf_work2, scf_env%iter_delta, &
209 diis_error, diis_step, eps_diis, scf_control%nmixing, &
210 s_matrix=matrix_s, scf_section=scf_section)
216 scf_env%iter_param = diis_error
217 scf_env%iter_method =
"DIIS/Filter"
219 IF (scf_env%mixing_method == 0)
THEN
220 scf_env%iter_method =
"NoMix/Filter"
221 ELSE IF (scf_env%mixing_method == 1)
THEN
222 scf_env%iter_param = scf_env%p_mix_alpha
223 scf_env%iter_method =
"P_Mix/Filter"
224 ELSE IF (scf_env%mixing_method > 1)
THEN
225 scf_env%iter_param = scf_env%mixing_store%alpha
226 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Filter"
235 filter_temperature=filter_temp, &
236 atomic_halos=atomic_halos, &
237 eps_default=eps_default)
241 CALL fb_env_build_trial_fns_auto(fb_env, qs_env, maxocc)
255 WRITE (spin_string, fmt=
"(I1)") ispin
256 name = trim(
"FILTER MATRIX SPIN "//spin_string)
262 collective_com=collective_com)
263 IF (collective_com)
THEN
265 s_mat=matrix_s(1)%matrix, &
266 atomic_halos=atomic_halos, &
267 trial_fns=trial_fns, &
269 particle_set=particle_set, &
270 fermi_level=fermi_level, &
271 filter_temp=filter_temp, &
273 filter_mat=matrix_filter(ispin)%matrix, &
274 tolerance=eps_default)
277 s_mat=matrix_s(1)%matrix, &
278 atomic_halos=atomic_halos, &
279 trial_fns=trial_fns, &
281 particle_set=particle_set, &
282 fermi_level=fermi_level, &
283 filter_temp=filter_temp, &
285 filter_mat=matrix_filter(ispin)%matrix, &
286 tolerance=eps_default)
301 CALL dbcsr_get_info(matrix_ks(1)%matrix, &
302 row_blk_size=original_roworcol_block_sizes, &
303 nfullrows_total=original_nfullrowsorcols_total)
304 CALL dbcsr_get_info(matrix_filter(1)%matrix, &
305 col_blk_size=filtered_roworcol_block_sizes, &
306 nfullcols_total=filtered_nfullrowsorcols_total)
311 ALLOCATE (mos_filtered(nspin))
315 nelectron=nelectron, &
316 flexible_electron_count=flexible_electron_count)
318 nao=filtered_nfullrowsorcols_total, &
319 nmo=filtered_nfullrowsorcols_total, &
320 nelectron=nelectron, &
321 n_el_f=real(nelectron,
dp), &
323 flexible_electron_count=flexible_electron_count)
330 CALL dbcsr_create(matrix=matrix_filtered_ks, template=matrix_ks(1)%matrix, &
331 name=trim(
"FILTERED_KS_MATRIX"), &
332 matrix_type=dbcsr_type_no_symmetry, &
333 row_blk_size=filtered_roworcol_block_sizes, &
334 col_blk_size=filtered_roworcol_block_sizes, &
336 CALL dbcsr_finalize(matrix_filtered_ks)
347 CALL dbcsr_create(matrix=matrix_filtered_s, template=matrix_s(1)%matrix, &
348 name=trim(
"FILTERED_S_MATRIX"), &
349 matrix_type=dbcsr_type_no_symmetry, &
350 row_blk_size=filtered_roworcol_block_sizes, &
351 col_blk_size=filtered_roworcol_block_sizes, &
353 CALL dbcsr_finalize(matrix_filtered_s)
357 CALL dbcsr_create(matrix=matrix_tmp, template=matrix_s(1)%matrix, &
358 name=trim(
"TEMPORARY_MATRIX"), &
359 matrix_type=dbcsr_type_no_symmetry, &
360 row_blk_size=original_roworcol_block_sizes, &
361 col_blk_size=filtered_roworcol_block_sizes, &
363 CALL dbcsr_finalize(matrix_tmp)
369 nrow_global=filtered_nfullrowsorcols_total, &
370 ncol_global=filtered_nfullrowsorcols_total)
375 name=
"FM_MATRIX_FILTERED_S")
378 name=
"FM_MATRIX_FILTERED_KS")
380 CALL cp_fm_create(fm_matrix_work, fm_struct, name=
"FM_MATRIX_WORK")
381 CALL cp_fm_create(fm_matrix_ortho, fm_struct, name=
"FM_MATRIX_ORTHO")
389 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
390 matrix_ks(ispin)%matrix, matrix_filter(ispin)%matrix, &
392 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
393 matrix_filter(ispin)%matrix, matrix_tmp, &
394 0.0_dp, matrix_filtered_ks)
396 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
397 matrix_s(1)%matrix, matrix_filter(ispin)%matrix, &
399 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, &
400 matrix_filter(ispin)%matrix, matrix_tmp, &
401 0.0_dp, matrix_filtered_s)
410 CALL get_mo_set(mos_filtered(ispin), nmo=nmo, nao=nao)
413 ncol_global=nmo, para_env=para_env, &
418 fm_struct=fm_struct, &
423 CALL fb_env_eigensolver(fm_matrix_filtered_ks, &
424 fm_matrix_filtered_s, &
425 mos_filtered(ispin), &
430 scf_env%cholesky_method)
434 CALL dbcsr_release(matrix_filtered_s)
435 CALL dbcsr_release(matrix_filtered_ks)
436 CALL cp_fm_release(fm_matrix_filtered_s)
437 CALL cp_fm_release(fm_matrix_filtered_ks)
438 CALL cp_fm_release(fm_matrix_work)
439 CALL cp_fm_release(fm_matrix_ortho)
447 CALL set_mo_occupation(mo_array=mos_filtered, &
448 smear=scf_control%smear)
453 ALLOCATE (matrix_filtered_p)
461 CALL dbcsr_create(matrix=matrix_filtered_p, template=scf_env%p_mix_new(1, 1)%matrix, &
462 name=trim(
"FILTERED_MATRIX_P"), &
463 row_blk_size=filtered_roworcol_block_sizes, &
464 col_blk_size=filtered_roworcol_block_sizes, &
466 CALL dbcsr_finalize(matrix_filtered_p)
467 CALL fb_dbcsr_copy_sparse_struct(matrix_filtered_p, &
468 scf_env%p_mix_new(1, 1)%matrix)
472 CALL dbcsr_set(matrix_filtered_p, 0.0_dp)
476 CALL calculate_density_matrix(mos_filtered(ispin), &
479 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, &
480 matrix_filter(ispin)%matrix, matrix_filtered_p, &
482 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, &
483 matrix_tmp, matrix_filter(ispin)%matrix, &
484 0.0_dp, scf_env%p_mix_new(ispin, 1)%matrix, &
485 retain_sparsity=.true.)
491 CALL dbcsr_release(matrix_tmp)
492 CALL dbcsr_release(matrix_filtered_p)
493 DEALLOCATE (matrix_filtered_p)
520 nrow_global=original_nfullrowsorcols_total, &
521 ncol_global=filtered_nfullrowsorcols_total)
524 name=
"FM_MATRIX_FILTER")
531 homo=homo_filtered, &
532 lfomo=lfomo_filtered, &
534 eigenvalues=eigenvalues_filtered, &
535 occupation_numbers=occ_filtered, &
536 mo_coeff=mo_coeff_filtered, &
541 homo=homo_filtered, &
542 lfomo=lfomo_filtered, &
548 occupation_numbers=occ, &
549 eigenvalues=eigenvalues, &
553 my_nmo = min(nmo, nmo_filtered)
554 eigenvalues(:) = 0.0_dp
555 eigenvalues(1:my_nmo) = eigenvalues_filtered(1:my_nmo)
557 occ(1:my_nmo) = occ_filtered(1:my_nmo)
562 original_nfullrowsorcols_total, &
564 filtered_nfullrowsorcols_total, &
565 1.0_dp, fm_matrix_filter, mo_coeff_filtered, &
571 CALL cp_fm_release(fm_matrix_filter)
580 DEALLOCATE (mos_filtered)
583 CALL timestop(handle)
607 SUBROUTINE fb_env_eigensolver(fm_KS, fm_S, mo_set, fm_ortho, &
608 fm_work, eps_eigval, ndep, method)
609 TYPE(cp_fm_type),
INTENT(IN) :: fm_ks, fm_s
610 TYPE(mo_set_type),
INTENT(IN) :: mo_set
611 TYPE(cp_fm_type),
INTENT(IN) :: fm_ortho, fm_work
612 REAL(kind=
dp),
INTENT(IN) :: eps_eigval
613 INTEGER,
INTENT(OUT) :: ndep
614 INTEGER,
INTENT(IN) :: method
616 CHARACTER(len=*),
PARAMETER :: routinen =
'fb_env_eigensolver'
618 CHARACTER(len=8) :: ndep_string
619 INTEGER :: handle, info, my_method, nao, nmo
620 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
621 TYPE(cp_fm_type),
POINTER :: mo_coeff
623 CALL timeset(routinen, handle)
628 eigenvalues=mo_eigenvalues, &
635 CALL cp_fm_to_fm(fm_s, fm_ortho)
637 IF (info .NE. 0)
THEN
638 CALL cp_warn(__location__, &
639 "Unable to perform Cholesky decomposition on the overlap "// &
640 "matrix. The new filtered basis may not be linearly "// &
641 "independent set. Revert to using inverse square-root "// &
642 "of the overlap. To avoid this warning, you can try "// &
643 "to use a higher filter termperature.")
646 SELECT CASE (my_method)
648 CALL cp_abort(__location__, &
649 "filter matrix method with CHOLESKY_DBCSR is not yet implemented")
659 pos=
"LEFT", transa=
"T")
668 transpose_tr=.false., &
677 transpose_tr=.true., &
687 transpose_tr=.false., &
693 CALL cp_fm_to_fm(fm_work, mo_coeff, nmo, 1, 1)
700 CALL cp_fm_to_fm(fm_s, fm_ortho)
704 WRITE (ndep_string, fmt=
"(I8)") ndep
705 CALL cp_warn(__location__, &
706 "Number of linearly dependent filtered orbitals: "//ndep_string)
709 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, fm_ks, fm_ortho, &
711 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, fm_ortho, &
712 fm_work, 0.0_dp, fm_ks)
714 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, fm_ortho, &
715 fm_work, 0.0_dp, mo_coeff)
718 CALL timestop(handle)
720 END SUBROUTINE fb_env_eigensolver
730 TYPE(fb_env_obj),
INTENT(INOUT) :: fb_env
731 TYPE(section_vals_type),
POINTER :: scf_section
733 CHARACTER(len=*),
PARAMETER :: routinen =
'fb_env_read_input'
737 REAL(kind=
dp) :: r_val
738 TYPE(section_vals_type),
POINTER :: fb_section
740 CALL timeset(routinen, handle)
744 "DIAGONALIZATION%FILTER_MATRIX")
749 filter_temperature=r_val)
754 auto_cutoff_scale=r_val)
759 collective_com=l_val)
766 CALL timestop(handle)
779 TYPE(fb_env_obj),
INTENT(INOUT) :: fb_env
780 TYPE(qs_environment_type),
POINTER :: qs_env
782 CHARACTER(len=*),
PARAMETER :: routinen =
'fb_env_build_rcut_auto'
784 INTEGER :: handle, ikind, nkinds
785 REAL(kind=
dp) :: auto_cutoff_scale, kind_radius
786 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rcut
787 TYPE(dft_control_type),
POINTER :: dft_control
788 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: basis_set_list
789 TYPE(gto_basis_set_type),
POINTER :: basis_set
790 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
792 CALL timeset(routinen, handle)
794 NULLIFY (rcut, qs_kind_set, dft_control)
797 qs_kind_set=qs_kind_set, &
798 dft_control=dft_control)
800 auto_cutoff_scale=auto_cutoff_scale)
802 nkinds =
SIZE(qs_kind_set)
803 ALLOCATE (rcut(nkinds))
812 ALLOCATE (basis_set_list(nkinds))
813 IF (dft_control%do_admm)
THEN
820 basis_set => basis_set_list(ikind)%gto_basis_set
822 rcut(ikind) = kind_radius*auto_cutoff_scale
829 DEALLOCATE (basis_set_list)
831 CALL timestop(handle)
846 TYPE(fb_env_obj),
INTENT(INOUT) :: fb_env
847 TYPE(qs_environment_type),
POINTER :: qs_env
848 TYPE(section_vals_type),
POINTER :: scf_section
850 CHARACTER(len=*),
PARAMETER :: routinen =
'fb_env_build_atomic_halos'
852 INTEGER :: handle, iatom, ihalo, max_natoms_local, natoms_global, natoms_local, nelectrons, &
853 nhalo_atoms, nkinds_global, owner_id_in_halo
854 INTEGER,
DIMENSION(:),
POINTER :: halo_atoms, local_atoms
855 REAL(kind=
dp) :: cost
856 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pair_radii
857 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rcut
858 TYPE(cell_type),
POINTER :: cell
859 TYPE(fb_atomic_halo_list_obj) :: atomic_halos
860 TYPE(fb_atomic_halo_obj),
DIMENSION(:),
POINTER :: halos
861 TYPE(mp_para_env_type),
POINTER :: para_env
862 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
863 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
865 CALL timeset(routinen, handle)
869 NULLIFY (cell, halos, halo_atoms, rcut, particle_set, para_env, &
870 qs_kind_set, local_atoms)
876 local_atoms=local_atoms, &
877 nlocal_atoms=natoms_local)
884 natom=natoms_global, &
885 particle_set=particle_set, &
886 qs_kind_set=qs_kind_set, &
887 nkind=nkinds_global, &
892 max_natoms_local = natoms_local
893 CALL para_env%max(max_natoms_local)
896 ALLOCATE (halos(natoms_local))
897 DO ihalo = 1, natoms_local
902 nhalos=natoms_local, &
903 max_nhalos=max_natoms_local)
905 ALLOCATE (pair_radii(nkinds_global, nkinds_global))
908 DO iatom = 1, natoms_local
918 owner_atom=local_atoms(iatom), &
919 owner_id_in_halo=owner_id_in_halo, &
920 natoms=nhalo_atoms, &
921 halo_atoms=halo_atoms)
932 nelectrons=nelectrons, &
937 DEALLOCATE (pair_radii)
943 atomic_halos=atomic_halos)
950 CALL timestop(handle)
963 SUBROUTINE fb_env_build_trial_fns_auto(fb_env, qs_env, maxocc)
965 TYPE(fb_env_obj),
INTENT(INOUT) :: fb_env
966 TYPE(qs_environment_type),
POINTER :: qs_env
967 REAL(kind=
dp),
INTENT(IN) :: maxocc
969 CHARACTER(len=*),
PARAMETER :: routinen =
'fb_env_build_trial_fns_auto'
971 INTEGER :: counter, handle, icgf, ico, ikind, iset, &
972 ishell, itrial, lshell, max_n_trial, &
973 nkinds, nset, old_lshell
974 INTEGER,
DIMENSION(:),
POINTER :: lmax, nfunctions, nshell
975 INTEGER,
DIMENSION(:, :),
POINTER :: functions
976 REAL(kind=
dp) :: zeff
977 TYPE(dft_control_type),
POINTER :: dft_control
978 TYPE(fb_trial_fns_obj) :: trial_fns
979 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: basis_set_list
980 TYPE(gto_basis_set_type),
POINTER :: basis_set
981 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
983 CALL timeset(routinen, handle)
986 NULLIFY (nfunctions, functions, basis_set, basis_set_list, qs_kind_set, dft_control)
993 qs_kind_set=qs_kind_set, &
994 dft_control=dft_control)
996 nkinds =
SIZE(qs_kind_set)
1005 ALLOCATE (basis_set_list(nkinds))
1006 IF (dft_control%do_admm)
THEN
1012 ALLOCATE (nfunctions(nkinds))
1015 DO ikind = 1, nkinds
1017 basis_set => basis_set_list(ikind)%gto_basis_set
1025 bset1:
DO iset = 1, nset
1028 DO ishell = 1, nshell(iset)
1029 lshell = basis_set%l(ishell, iset)
1033 counter = counter + 1
1035 IF ((lshell .GT. old_lshell) .AND. (counter .LE.
nco(lshell)))
THEN
1036 nfunctions(ikind) = nfunctions(ikind) + 1
1043 IF (((lshell .GT. old_lshell) .OR. (lshell .EQ. lmax(iset))) .AND. &
1044 (maxocc*real(nfunctions(ikind),
dp) .GE. zeff))
THEN
1054 max_n_trial = maxval(nfunctions)
1055 ALLOCATE (functions(max_n_trial, nkinds))
1058 DO ikind = 1, nkinds
1060 basis_set => basis_set_list(ikind)%gto_basis_set
1069 bset2:
DO iset = 1, nset
1071 DO ishell = 1, nshell(iset)
1072 lshell = basis_set%l(ishell, iset)
1077 counter = counter + 1
1079 IF ((lshell .GT. old_lshell) .AND. (counter .LE.
nco(lshell)))
THEN
1081 functions(itrial, ikind) = icgf
1089 IF (((lshell .GT. old_lshell) .OR. (lshell .EQ. lmax(iset))) .AND. &
1090 (maxocc*real(itrial,
dp) .GE. zeff))
THEN
1100 nfunctions=nfunctions, &
1101 functions=functions)
1104 trial_fns=trial_fns)
1108 DEALLOCATE (basis_set_list)
1110 CALL timestop(handle)
1112 END SUBROUTINE fb_env_build_trial_fns_auto
1124 SUBROUTINE fb_dbcsr_copy_sparse_struct(matrix_out, matrix_in)
1126 TYPE(dbcsr_type),
INTENT(INOUT) :: matrix_out
1127 TYPE(dbcsr_type),
INTENT(IN) :: matrix_in
1129 INTEGER :: iatom, iblk, jatom, nblkcols_total, &
1130 nblkrows_total, nblks
1131 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: cols, rows
1132 REAL(
dp),
DIMENSION(:, :),
POINTER :: mat_block
1133 TYPE(dbcsr_iterator_type) :: iter
1135 CALL dbcsr_get_info(matrix=matrix_in, &
1136 nblkrows_total=nblkrows_total, &
1137 nblkcols_total=nblkcols_total)
1139 nblks = nblkrows_total*nblkcols_total
1140 ALLOCATE (rows(nblks))
1141 ALLOCATE (cols(nblks))
1146 CALL dbcsr_iterator_start(iter, matrix_in)
1147 DO WHILE (dbcsr_iterator_blocks_left(iter))
1148 CALL dbcsr_iterator_next_block(iter, iatom, jatom, mat_block, iblk)
1153 CALL dbcsr_iterator_stop(iter)
1154 CALL dbcsr_reserve_blocks(matrix_out, rows(1:nblks), cols(1:nblks))
1155 CALL dbcsr_finalize(matrix_out)
1161 END SUBROUTINE fb_dbcsr_copy_sparse_struct
1172 TYPE(fb_env_obj),
INTENT(IN) :: fb_env
1173 TYPE(qs_environment_type),
POINTER :: qs_env
1174 TYPE(section_vals_type),
POINTER :: scf_section
1176 CHARACTER(len=*),
PARAMETER :: routinen =
'fb_env_write_info'
1178 CHARACTER(LEN=2) :: element_symbol
1179 INTEGER :: handle, ikind, nkinds, unit_nr
1180 LOGICAL :: collective_com
1181 REAL(kind=
dp) :: auto_cutoff_scale, filter_temperature
1182 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rcut
1183 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1184 TYPE(cp_logger_type),
POINTER :: logger
1186 CALL timeset(routinen, handle)
1188 NULLIFY (rcut, atomic_kind_set, logger)
1191 atomic_kind_set=atomic_kind_set)
1193 filter_temperature=filter_temperature, &
1194 auto_cutoff_scale=auto_cutoff_scale, &
1196 collective_com=collective_com)
1198 nkinds =
SIZE(atomic_kind_set)
1202 "PRINT%FILTER_MATRIX", &
1204 IF (unit_nr > 0)
THEN
1205 IF (collective_com)
THEN
1206 WRITE (unit=unit_nr, fmt=
"(/,A,T71,A)") &
1207 " FILTER_MAT_DIAG| MPI communication method:", &
1210 WRITE (unit=unit_nr, fmt=
"(/,A,T71,A)") &
1211 " FILTER_MAT_DIAG| MPI communication method:", &
1214 WRITE (unit=unit_nr, fmt=
"(A,T71,g10.4)") &
1215 " FILTER_MAT_DIAG| Filter temperature [K]:", &
1217 WRITE (unit=unit_nr, fmt=
"(A,T71,f10.4)") &
1218 " FILTER_MAT_DIAG| Filter temperature [a.u.]:", &
1220 WRITE (unit=unit_nr, fmt=
"(A,T71,f10.4)") &
1221 " FILTER_MAT_DIAG| Auto atomic cutoff radius scale:", &
1223 WRITE (unit=unit_nr, fmt=
"(A)") &
1224 " FILTER_MAT_DIAG| atomic cutoff radii [a.u.]"
1225 DO ikind = 1, nkinds
1227 element_symbol=element_symbol)
1228 WRITE (unit=unit_nr, fmt=
"(A,A,T71,f10.4)") &
1229 " FILTER_MAT_DIAG| ", element_symbol, rcut(ikind)
1233 "PRINT%FILTER_MATRIX")
1235 CALL timestop(handle)
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.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius)
...
Handles all functions related to the CELL.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
basic linear algebra operations for full matrices
subroutine, public cp_fm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
computes matrix_c = beta * matrix_c + alpha * ( matrix_a ** transa ) * ( matrix_b ** transb )
subroutine, public cp_fm_upper_to_full(matrix, work)
given an upper triangular matrix computes the corresponding full matrix
subroutine, public cp_fm_triangular_invert(matrix_a, uplo_tr)
inverts a triangular matrix
subroutine, public cp_fm_symm(side, uplo, m, n, alpha, matrix_a, matrix_b, beta, matrix_c)
computes matrix_c = beta * matrix_c + alpha * matrix_a * matrix_b computes matrix_c = beta * matrix_c...
subroutine, public cp_fm_triangular_multiply(triangular_matrix, matrix_b, side, transpose_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_fm_cholesky_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
subroutine, public cp_fm_cholesky_restore(matrix, neig, matrixb, matrixout, op, pos, transa)
...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public ncoset
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
collects routines that calculate density matrices
Apply the direct inversion in the iterative subspace (DIIS) of Pulay in the framework of an SCF itera...
subroutine, public qs_diis_b_step(diis_buffer, mo_array, kc, sc, delta, error_max, diis_step, eps_diis, nmixing, s_matrix, scf_section, roks)
Update the SCF DIIS buffer, and if appropriate does a diis step.
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.
real(kind=dp) function, public fb_atomic_halo_cost(atomic_halo, particle_set, qs_kind_set)
Estimates the computational cost with respect to the filter matrix calculation associated to an atomi...
subroutine, public fb_atomic_halo_build_halo_atoms(owner_atom, particle_set, cell, pair_radii, halo_atoms, nhalo_atoms, owner_id_in_halo)
Builds halo atoms for a given (owner) atom.
subroutine, public fb_atomic_halo_set(atomic_halo, owner_atom, owner_id_in_halo, natoms, nelectrons, halo_atoms, sorted, cost)
Sets attributes in a fb_atomic_halo object, one should only set the data content in a fb_atomic_halo ...
subroutine, public fb_atomic_halo_sort(atomic_halo)
Sort the list of atomic indices in the halo in ascending order. The atomic_halo must not be empty.
subroutine, public fb_atomic_halo_create(atomic_halo)
Creates and initialises an empty fb_atomic_halo object.
subroutine, public fb_atomic_halo_list_create(atomic_halos)
Creates and initialises an empty fb_atomic_halo_list object.
pure subroutine, public fb_build_pair_radii(rcut, nkinds, pair_radii)
Builds the required pair_radii array required for building the halo atoms from a given set of cut off...
subroutine, public fb_atomic_halo_list_set(atomic_halos, nhalos, max_nhalos, halos)
Sets attributes from an fb_atomic_halo_list object, one should only set the data content in a fb_atom...
subroutine, public fb_atomic_halo_nullify(atomic_halo)
Nullifies a fb_atomic_halo object, note that it does not release the original object....
integer function, public fb_atomic_halo_nelectrons_estimate_z(atomic_halo, particle_set)
Estimates the total number of electrons in a halo using atomic numbers.
subroutine, public fb_atomic_halo_list_write_info(atomic_halos, para_env, scf_section)
Writes out the atomic halo list summary, no detailed neighbour lists, just average,...
subroutine, public fb_atomic_halo_list_nullify(atomic_halos)
Nullifies a fb_atomic_halo_list object, note that it does not release the original object....
subroutine, public fb_env_do_diag(fb_env, qs_env, matrix_ks, matrix_s, scf_section, diis_step)
Do filtered matrix method diagonalisation.
subroutine, public fb_env_read_input(fb_env, scf_section)
Read input sections for filter matrix method.
subroutine, public fb_env_build_atomic_halos(fb_env, qs_env, scf_section)
Builds an fb_atomic_halo_list object using information from fb_env.
subroutine, public fb_env_write_info(fb_env, qs_env, scf_section)
Write out parameters used for the filter matrix method to output.
subroutine, public fb_env_build_rcut_auto(fb_env, qs_env)
Automatically generate the cutoff radii of atoms used for constructing the atomic halos,...
logical function, public fb_env_has_data(fb_env)
Checks if a fb_env object is associated with an actual data content or not.
subroutine, public fb_env_get(fb_env, rcut, filter_temperature, auto_cutoff_scale, eps_default, atomic_halos, trial_fns, collective_com, local_atoms, nlocal_atoms)
method to get attributes from a given fb_env object
subroutine, public fb_env_set(fb_env, rcut, filter_temperature, auto_cutoff_scale, eps_default, atomic_halos, trial_fns, collective_com, local_atoms, nlocal_atoms)
method to set attributes from a given fb_env object
subroutine, public fb_fltrmat_build_2(H_mat, S_mat, atomic_halos, trial_fns, para_env, particle_set, fermi_level, filter_temp, name, filter_mat, tolerance)
Build the filter matrix, with MPI communications grouped together. More effcient on communication,...
subroutine, public fb_fltrmat_build(H_mat, S_mat, atomic_halos, trial_fns, para_env, particle_set, fermi_level, filter_temp, name, filter_mat, tolerance)
Build the filter matrix, with MPI communications happening at each step. Less efficient on communicat...
subroutine, public fb_trial_fns_set(trial_fns, nfunctions, functions)
sets the attributes of a fb_trial_fns object
subroutine, public fb_trial_fns_nullify(trial_fns)
nullifies the content of given object
subroutine, public fb_trial_fns_release(trial_fns)
releases given object
subroutine, public fb_trial_fns_create(trial_fns)
creates an fb_trial_fns object and initialises it
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
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, 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_r3d_rs_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_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Set occupation of molecular orbitals.
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 deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kTS, mu, flexible_electron_count)
Get the components of a MO set data structure.
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 ...
module that contains the definitions of the scf types
parameters that control an scf iteration
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.