89#include "./base/base_uses.f90"
97 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_loc_utils'
113 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mo_loc_history
114 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_loc
116 CHARACTER(len=*),
PARAMETER :: routinen =
'retain_history'
118 INTEGER :: handle, i, ncol_hist, ncol_loc
120 CALL timeset(routinen, handle)
122 IF (.NOT.
ASSOCIATED(mo_loc_history))
THEN
123 ALLOCATE (mo_loc_history(
SIZE(mo_loc)))
124 DO i = 1,
SIZE(mo_loc_history)
125 CALL cp_fm_create(mo_loc_history(i), mo_loc(i)%matrix_struct)
129 DO i = 1,
SIZE(mo_loc_history)
132 cpassert(ncol_hist == ncol_loc)
136 CALL timestop(handle)
147 SUBROUTINE rotate_state_to_ref(mo_new, mo_ref, matrix_S)
149 TYPE(
cp_fm_type),
INTENT(IN) :: mo_new, mo_ref
152 CHARACTER(len=*),
PARAMETER :: routinen =
'rotate_state_to_ref'
154 INTEGER :: handle, ncol, ncol_ref, nrow
155 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
159 CALL timeset(routinen, handle)
163 cpassert(ncol == ncol_ref)
165 NULLIFY (fm_struct_tmp)
169 ncol_global=ncol, para_env=mo_new%matrix_struct%para_env, &
170 context=mo_new%matrix_struct%context)
179 CALL parallel_gemm(
'T',
'N', ncol, ncol, nrow, 1.0_dp, mo_new, smo, 0.0_dp, o1)
182 CALL parallel_gemm(
'T',
'N', ncol, ncol, ncol, 1.0_dp, o1, o1, 0.0_dp, o2)
185 ALLOCATE (eigenvalues(ncol))
188 eigenvalues(:) = 1.0_dp/sqrt(eigenvalues(:))
190 CALL parallel_gemm(
'N',
'T', ncol, ncol, ncol, 1.0_dp, o3, o4, 0.0_dp, o2)
193 CALL parallel_gemm(
'N',
'N', ncol, ncol, ncol, 1.0_dp, o1, o2, 0.0_dp, o3)
196 CALL parallel_gemm(
'N',
'N', nrow, ncol, ncol, 1.0_dp, mo_new, o3, 0.0_dp, smo)
211 CALL timestop(handle)
213 END SUBROUTINE rotate_state_to_ref
230 SUBROUTINE qs_loc_env_init(qs_loc_env, localized_wfn_control, qs_env, myspin, do_localize, &
231 loc_coeff, mo_loc_history)
236 INTEGER,
INTENT(IN),
OPTIONAL :: myspin
237 LOGICAL,
INTENT(IN),
OPTIONAL :: do_localize
239 OPTIONAL :: loc_coeff
240 TYPE(
cp_fm_type),
DIMENSION(:),
OPTIONAL,
POINTER :: mo_loc_history
242 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_loc_env_init'
244 INTEGER :: dim_op, handle, i, iatom, imo, imoloc, &
245 ispin, j, l_spin, lb, nao, naosub, &
246 natoms, nmo, nmosub, nspins, s_spin, ub
247 REAL(kind=
dp) :: my_occ, occ_imo
248 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occupations
249 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: vecbuffer
252 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: moloc_coeff
253 TYPE(
cp_fm_type),
POINTER :: mat_ptr, mo_coeff
260 CALL timeset(routinen, handle)
262 NULLIFY (mos, matrix_s, moloc_coeff, particle_set, para_env, cell, &
263 local_molecules, occupations, mat_ptr)
264 IF (
PRESENT(do_localize)) qs_loc_env%do_localize = do_localize
265 IF (qs_loc_env%do_localize)
THEN
266 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, cell=cell, &
267 local_molecules=local_molecules, particle_set=particle_set, &
268 para_env=para_env, mos=mos)
269 nspins =
SIZE(mos, 1)
272 IF (
PRESENT(myspin))
THEN
276 IF (
PRESENT(loc_coeff) .AND. nspins*2 ==
SIZE(loc_coeff))
THEN
277 ALLOCATE (moloc_coeff(s_spin:s_spin + 2*(l_spin - s_spin) + 1))
279 ALLOCATE (moloc_coeff(s_spin:l_spin))
281 DO ispin = s_spin, l_spin
282 NULLIFY (tmp_fm_struct, mo_coeff)
283 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
284 nmosub = localized_wfn_control%nloc_states(ispin)
286 ncol_global=nmosub, para_env=para_env, context=mo_coeff%matrix_struct%context)
287 IF (
PRESENT(loc_coeff) .AND. nspins*2 ==
SIZE(loc_coeff))
THEN
288 CALL cp_fm_create(moloc_coeff(2*ispin - 1), tmp_fm_struct)
296 cpassert(nao == naosub)
297 IF ((localized_wfn_control%do_homo) .OR. &
299 cpassert(nmo >= nmosub)
301 cpassert(nao - nmo >= nmosub)
308 IF (
PRESENT(loc_coeff))
ALLOCATE (mat_ptr)
310 DO ispin = s_spin, l_spin
311 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, &
312 occupation_numbers=occupations, nao=nao, nmo=nmo)
313 lb = localized_wfn_control%lu_bound_states(1, ispin)
314 ub = localized_wfn_control%lu_bound_states(2, ispin)
316 IF (
PRESENT(loc_coeff))
THEN
317 mat_ptr = loc_coeff(ispin)
321 IF ((localized_wfn_control%set_of_states ==
state_loc_list) .OR. &
323 ALLOCATE (vecbuffer(1, nao))
324 IF (localized_wfn_control%do_homo)
THEN
325 my_occ = occupations(localized_wfn_control%loc_states(1, ispin))
327 nmosub =
SIZE(localized_wfn_control%loc_states, 1)
334 imo = localized_wfn_control%loc_states(i, ispin)
335 IF (localized_wfn_control%do_homo)
THEN
336 occ_imo = occupations(imo)
337 IF (abs(occ_imo - my_occ) > localized_wfn_control%eps_occ)
THEN
338 IF (localized_wfn_control%localization_method /=
do_loc_none) &
339 CALL cp_abort(__location__, &
340 "States with different occupations "// &
341 "cannot be rotated together")
346 nao, 1, transpose=.true.)
348 nao, 1, transpose=.true.)
350 DEALLOCATE (vecbuffer)
352 my_occ = occupations(lb)
353 occ_imo = occupations(ub)
354 IF (abs(occ_imo - my_occ) > localized_wfn_control%eps_occ)
THEN
355 IF (localized_wfn_control%localization_method /=
do_loc_none) &
356 CALL cp_abort(__location__, &
357 "States with different occupations "// &
358 "cannot be rotated together")
360 nmosub = localized_wfn_control%nloc_states(ispin)
362 IF (
PRESENT(loc_coeff) .AND. nspins*2 ==
SIZE(loc_coeff))
THEN
363 CALL cp_fm_to_fm(loc_coeff(2*ispin - 1), moloc_coeff(2*ispin - 1))
364 CALL cp_fm_to_fm(loc_coeff(2*ispin), moloc_coeff(2*ispin))
366 CALL cp_fm_to_fm(mat_ptr, moloc_coeff(ispin), nmosub, lb, 1)
372 IF (
PRESENT(mo_loc_history))
THEN
373 IF (localized_wfn_control%use_history .AND.
ASSOCIATED(mo_loc_history))
THEN
374 CALL rotate_state_to_ref(moloc_coeff(ispin), &
375 mo_loc_history(ispin), matrix_s(1)%matrix)
381 IF (
PRESENT(loc_coeff))
DEALLOCATE (mat_ptr)
383 CALL set_qs_loc_env(qs_loc_env=qs_loc_env, cell=cell, local_molecules=local_molecules, &
384 moloc_coeff=moloc_coeff, particle_set=particle_set, para_env=para_env, &
385 localized_wfn_control=localized_wfn_control)
388 NULLIFY (tmp_fm_struct, mo_coeff)
389 nmosub = maxval(localized_wfn_control%nloc_states)
392 ncol_global=nmosub, para_env=para_env, context=mo_coeff%matrix_struct%context)
394 IF (localized_wfn_control%operator_type ==
op_loc_berry)
THEN
395 IF (qs_loc_env%cell%orthorhombic)
THEN
401 ALLOCATE (qs_loc_env%op_sm_set(2, dim_op))
403 DO j = 1,
SIZE(qs_loc_env%op_sm_set, 1)
404 NULLIFY (qs_loc_env%op_sm_set(j, i)%matrix)
405 ALLOCATE (qs_loc_env%op_sm_set(j, i)%matrix)
406 CALL dbcsr_copy(qs_loc_env%op_sm_set(j, i)%matrix, matrix_s(1)%matrix, &
408 CALL dbcsr_set(qs_loc_env%op_sm_set(j, i)%matrix, 0.0_dp)
412 ELSEIF (localized_wfn_control%operator_type ==
op_loc_pipek)
THEN
413 natoms =
SIZE(qs_loc_env%particle_set, 1)
414 ALLOCATE (qs_loc_env%op_fm_set(natoms, 1))
416 DO ispin = 1,
SIZE(qs_loc_env%op_fm_set, 2)
419 CALL cp_fm_create(qs_loc_env%op_fm_set(iatom, ispin), tmp_fm_struct)
421 CALL cp_fm_get_info(qs_loc_env%op_fm_set(iatom, ispin), nrow_global=nmosub)
422 cpassert(nmo >= nmosub)
423 CALL cp_fm_set_all(qs_loc_env%op_fm_set(iatom, ispin), 0.0_dp)
427 cpabort(
"Type of operator not implemented")
431 IF (localized_wfn_control%operator_type ==
op_loc_berry)
THEN
435 CALL get_berry_operator(qs_loc_env, qs_env)
437 ELSEIF (localized_wfn_control%operator_type ==
op_loc_pipek)
THEN
444 qs_loc_env%molecular_states = .false.
445 qs_loc_env%wannier_states = .false.
447 CALL timestop(handle)
460 SUBROUTINE get_berry_operator(qs_loc_env, qs_env)
464 CHARACTER(len=*),
PARAMETER :: routinen =
'get_berry_operator'
466 INTEGER :: dim_op, handle
468 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: op_sm_set
470 CALL timeset(routinen, handle)
472 NULLIFY (cell, op_sm_set)
474 cell=cell, dim_op=dim_op)
477 CALL timestop(handle)
478 END SUBROUTINE get_berry_operator
503 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: op_sm_set
506 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_berry_operator'
508 INTEGER :: handle, i, iatom, icol, ikind, inode, irow, iset, jatom, jkind, jset, last_jatom, &
509 ldab, ldsa, ldsb, ldwork, maxl, ncoa, ncob, nkind, nrow, nseta, nsetb, sgfa, sgfb
510 INTEGER,
DIMENSION(3) :: perd0
511 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
513 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
514 LOGICAL :: found, new_atom_b
515 REAL(kind=
dp) :: dab, kvec(3), rab2, vector_k(3, 6)
516 REAL(kind=
dp),
DIMENSION(3) :: ra, rab, rb
517 REAL(kind=
dp),
DIMENSION(:),
POINTER :: set_radius_a, set_radius_b
518 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: cosab, rpgfa, rpgfb, sinab, sphi_a, &
519 sphi_b, work, zeta, zetb
520 TYPE(
block_p_type),
DIMENSION(:),
POINTER :: op_cos, op_sin
524 DIMENSION(:),
POINTER :: nl_iterator
528 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
531 CALL timeset(routinen, handle)
532 NULLIFY (qs_kind, qs_kind_set)
533 NULLIFY (particle_set)
535 NULLIFY (cosab, sinab, work)
536 NULLIFY (la_max, la_min, lb_max, lb_min, npgfa, npgfb, nsgfa, nsgfb)
537 NULLIFY (set_radius_a, set_radius_b, rpgfa, rpgfb, sphi_a, sphi_b, zeta, zetb)
539 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, &
540 particle_set=particle_set, sab_orb=sab_orb)
542 nkind =
SIZE(qs_kind_set)
545 maxco=ldwork, maxlgto=maxl)
547 ALLOCATE (cosab(ldab, ldab))
549 ALLOCATE (sinab(ldab, ldab))
551 ALLOCATE (work(ldwork, ldwork))
554 ALLOCATE (op_cos(dim_op))
555 ALLOCATE (op_sin(dim_op))
557 NULLIFY (op_cos(i)%block)
558 NULLIFY (op_sin(i)%block)
563 vector_k(:, 1) =
twopi*cell%h_inv(1, :)
564 vector_k(:, 2) =
twopi*cell%h_inv(2, :)
565 vector_k(:, 3) =
twopi*cell%h_inv(3, :)
566 vector_k(:, 4) =
twopi*(cell%h_inv(1, :) + cell%h_inv(2, :))
567 vector_k(:, 5) =
twopi*(cell%h_inv(1, :) + cell%h_inv(3, :))
568 vector_k(:, 6) =
twopi*(cell%h_inv(2, :) + cell%h_inv(3, :))
572 perd0(1:3) = cell%perd(1:3)
575 ALLOCATE (basis_set_list(nkind))
577 qs_kind => qs_kind_set(ikind)
578 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set_a)
579 IF (
ASSOCIATED(basis_set_a))
THEN
580 basis_set_list(ikind)%gto_basis_set => basis_set_a
582 NULLIFY (basis_set_list(ikind)%gto_basis_set)
588 iatom=iatom, jatom=jatom, r=rab)
589 basis_set_a => basis_set_list(ikind)%gto_basis_set
590 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
591 basis_set_b => basis_set_list(jkind)%gto_basis_set
592 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
593 ra =
pbc(particle_set(iatom)%r, cell)
595 first_sgfa => basis_set_a%first_sgf
596 la_max => basis_set_a%lmax
597 la_min => basis_set_a%lmin
598 npgfa => basis_set_a%npgf
599 nseta = basis_set_a%nset
600 nsgfa => basis_set_a%nsgf_set
601 rpgfa => basis_set_a%pgf_radius
602 set_radius_a => basis_set_a%set_radius
603 sphi_a => basis_set_a%sphi
604 zeta => basis_set_a%zet
606 first_sgfb => basis_set_b%first_sgf
607 lb_max => basis_set_b%lmax
608 lb_min => basis_set_b%lmin
609 npgfb => basis_set_b%npgf
610 nsetb = basis_set_b%nset
611 nsgfb => basis_set_b%nsgf_set
612 rpgfb => basis_set_b%pgf_radius
613 set_radius_b => basis_set_b%set_radius
614 sphi_b => basis_set_b%sphi
615 zetb => basis_set_b%zet
617 ldsa =
SIZE(sphi_a, 1)
618 ldsb =
SIZE(sphi_b, 1)
619 IF (inode == 1) last_jatom = 0
623 IF (jatom /= last_jatom)
THEN
631 IF (iatom <= jatom)
THEN
640 NULLIFY (op_cos(i)%block)
642 row=irow, col=icol, block=op_cos(i)%block, found=found)
643 NULLIFY (op_sin(i)%block)
645 row=irow, col=icol, block=op_sin(i)%block, found=found)
649 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
655 ncoa = npgfa(iset)*
ncoset(la_max(iset))
656 sgfa = first_sgfa(1, iset)
660 ncob = npgfb(jset)*
ncoset(lb_max(jset))
661 sgfb = first_sgfb(1, jset)
663 IF (set_radius_a(iset) + set_radius_b(jset) >= dab)
THEN
667 kvec(1:3) = vector_k(1:3, i)
670 CALL cossin(la_max(iset), npgfa(iset), zeta(:, iset), rpgfa(:, iset), &
671 la_min(iset), lb_max(jset), npgfb(jset), zetb(:, jset), &
672 rpgfb(:, jset), lb_min(jset), &
673 ra, rb, kvec, cosab, sinab)
675 iatom, ncoa, nsgfa(iset), sgfa, sphi_a, ldsa, &
676 jatom, ncob, nsgfb(jset), sgfb, sphi_b, ldsb, &
677 cosab, sinab, ldab, work, ldwork)
692 cell%perd(1:3) = perd0(1:3)
695 NULLIFY (op_cos(i)%block)
696 NULLIFY (op_sin(i)%block)
698 DEALLOCATE (op_cos, op_sin)
700 DEALLOCATE (cosab, sinab, work, basis_set_list)
702 CALL timestop(handle)
716 do_homo, evals, do_mixed)
719 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mo_array
720 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: coeff_localized
721 LOGICAL,
INTENT(IN) :: do_homo
724 LOGICAL,
INTENT(IN),
OPTIONAL ::
do_mixed
726 CHARACTER(LEN=*),
PARAMETER :: routinen =
'loc_write_restart'
728 CHARACTER(LEN=default_path_length) :: filename
729 CHARACTER(LEN=default_string_length) :: my_middle
730 INTEGER :: handle, ispin, max_block, nao, nloc, &
731 nmo, output_unit, rst_unit
732 LOGICAL :: my_do_mixed
736 CALL timeset(routinen, handle)
741 IF (qs_loc_env%do_localize)
THEN
745 section,
"LOC_RESTART"), &
751 my_do_mixed = .false.
754 my_middle =
"LOC_HOMO"
755 ELSEIF (my_do_mixed)
THEN
756 my_middle =
"LOC_MIXED"
758 my_middle =
"LOC_LUMO"
762 extension=
".wfn", file_status=
"REPLACE", file_action=
"WRITE", &
763 file_form=
"UNFORMATTED", middle_name=trim(my_middle))
766 middle_name=trim(my_middle), extension=
".wfn", &
769 IF (output_unit > 0)
THEN
770 WRITE (unit=output_unit, fmt=
"(/,T2,A, A/)") &
771 "LOCALIZATION| Write restart file for the localized MOS : ", &
775 IF (rst_unit > 0)
THEN
776 WRITE (rst_unit) qs_loc_env%localized_wfn_control%set_of_states
777 WRITE (rst_unit) qs_loc_env%localized_wfn_control%lu_bound_states
778 WRITE (rst_unit) qs_loc_env%localized_wfn_control%nloc_states
781 DO ispin = 1,
SIZE(coeff_localized)
782 associate(mo_coeff => coeff_localized(ispin))
783 CALL cp_fm_get_info(mo_coeff, nrow_global=nao, ncol_global=nmo, ncol_block=max_block)
784 nloc = qs_loc_env%localized_wfn_control%nloc_states(ispin)
785 IF (rst_unit > 0)
THEN
786 WRITE (rst_unit) qs_loc_env%localized_wfn_control%loc_states(1:nloc, ispin)
787 IF (do_homo .OR. my_do_mixed)
THEN
788 WRITE (rst_unit) nmo, &
789 mo_array(ispin)%homo, &
790 mo_array(ispin)%lfomo, &
791 mo_array(ispin)%nelectron
792 WRITE (rst_unit) mo_array(ispin)%eigenvalues(1:nmo), &
793 mo_array(ispin)%occupation_numbers(1:nmo)
796 WRITE (rst_unit) evals(ispin)%array(1:nmo)
811 CALL timestop(handle)
828 SUBROUTINE loc_read_restart(qs_loc_env, mos, mos_localized, section, section2, para_env, &
829 do_homo, restart_found, evals, do_mixed)
831 TYPE(qs_loc_env_type),
POINTER :: qs_loc_env
832 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
833 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: mos_localized
834 TYPE(section_vals_type),
POINTER :: section, section2
835 TYPE(mp_para_env_type),
POINTER :: para_env
836 LOGICAL,
INTENT(IN) :: do_homo
837 LOGICAL,
INTENT(INOUT) :: restart_found
838 TYPE(cp_1d_r_p_type),
DIMENSION(:),
OPTIONAL, &
840 LOGICAL,
INTENT(IN),
OPTIONAL :: do_mixed
842 CHARACTER(len=*),
PARAMETER :: routinen =
'loc_read_restart'
844 CHARACTER(LEN=25) :: fname_key
845 CHARACTER(LEN=default_path_length) :: filename
846 CHARACTER(LEN=default_string_length) :: my_middle
847 INTEGER :: handle, homo_read, i, ispin, lfomo_read, max_nloc, n_rep_val, nao, &
848 nelectron_read, nloc, nmo, nmo_read, nspin, output_unit, rst_unit
849 LOGICAL :: file_exists, my_do_mixed
850 REAL(kind=dp),
ALLOCATABLE,
DIMENSION(:) :: eig_read, occ_read
851 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: vecbuffer
852 TYPE(cp_logger_type),
POINTER :: logger
853 TYPE(section_vals_type),
POINTER :: print_key
855 CALL timeset(routinen, handle)
857 logger => cp_get_default_logger()
859 nspin =
SIZE(mos_localized)
863 output_unit = cp_print_key_unit_nr(logger, section2, &
864 "PROGRAM_RUN_INFO", extension=
".Log")
866 my_do_mixed = .false.
867 IF (
PRESENT(do_mixed)) my_do_mixed = do_mixed
869 fname_key =
"LOCHOMO_RESTART_FILE_NAME"
870 ELSEIF (my_do_mixed)
THEN
871 fname_key =
"LOCMIXD_RESTART_FILE_NAME"
873 fname_key =
"LOCLUMO_RESTART_FILE_NAME"
874 IF (.NOT.
PRESENT(evals)) &
875 cpabort(
"Missing argument to localize unoccupied states.")
878 file_exists = .false.
879 CALL section_vals_val_get(section, fname_key, n_rep_val=n_rep_val)
880 IF (n_rep_val > 0)
THEN
881 CALL section_vals_val_get(section, fname_key, c_val=filename)
884 print_key => section_vals_get_subs_vals(section2,
"LOC_RESTART")
886 my_middle =
"LOC_HOMO"
887 ELSEIF (my_do_mixed)
THEN
888 my_middle =
"LOC_MIXED"
890 my_middle =
"LOC_LUMO"
892 filename = cp_print_key_generate_filename(logger, print_key, &
893 middle_name=trim(my_middle), extension=
".wfn", &
897 IF (para_env%is_source())
INQUIRE (file=filename, exist=file_exists)
899 IF (file_exists)
THEN
900 IF (para_env%is_source())
THEN
901 CALL open_file(file_name=filename, &
902 file_action=
"READ", &
903 file_form=
"UNFORMATTED", &
905 unit_number=rst_unit)
907 READ (rst_unit) qs_loc_env%localized_wfn_control%set_of_states
908 READ (rst_unit) qs_loc_env%localized_wfn_control%lu_bound_states
909 READ (rst_unit) qs_loc_env%localized_wfn_control%nloc_states
912 IF (output_unit > 0)
WRITE (output_unit,
"(/,T10,A)") &
913 "Restart file not available filename=<"//trim(filename)//
'>'
915 CALL para_env%bcast(file_exists)
917 IF (file_exists)
THEN
918 restart_found = .true.
920 CALL para_env%bcast(qs_loc_env%localized_wfn_control%set_of_states)
921 CALL para_env%bcast(qs_loc_env%localized_wfn_control%lu_bound_states)
922 CALL para_env%bcast(qs_loc_env%localized_wfn_control%nloc_states)
924 max_nloc = maxval(qs_loc_env%localized_wfn_control%nloc_states(:))
926 ALLOCATE (vecbuffer(1, nao))
927 IF (
ASSOCIATED(qs_loc_env%localized_wfn_control%loc_states))
THEN
928 DEALLOCATE (qs_loc_env%localized_wfn_control%loc_states)
930 ALLOCATE (qs_loc_env%localized_wfn_control%loc_states(max_nloc, 2))
931 qs_loc_env%localized_wfn_control%loc_states = 0
934 IF (do_homo .OR. do_mixed)
THEN
937 nmo =
SIZE(evals(ispin)%array, 1)
939 IF (para_env%is_source() .AND. (nmo > 0))
THEN
940 nloc = qs_loc_env%localized_wfn_control%nloc_states(ispin)
941 READ (rst_unit) qs_loc_env%localized_wfn_control%loc_states(1:nloc, ispin)
942 IF (do_homo .OR. do_mixed)
THEN
943 READ (rst_unit) nmo_read, homo_read, lfomo_read, nelectron_read
944 ALLOCATE (eig_read(nmo_read), occ_read(nmo_read))
947 READ (rst_unit) eig_read(1:nmo_read), occ_read(1:nmo_read)
949 READ (rst_unit) nmo_read
950 ALLOCATE (eig_read(nmo_read))
952 READ (rst_unit) eig_read(1:nmo_read)
954 IF (nmo_read < nmo) &
955 CALL cp_warn(__location__, &
956 "The number of MOs on the restart unit is smaller than the number of "// &
957 "the allocated MOs. ")
958 IF (nmo_read > nmo) &
959 CALL cp_warn(__location__, &
960 "The number of MOs on the restart unit is greater than the number of "// &
961 "the allocated MOs. The read MO set will be truncated!")
963 nmo = min(nmo, nmo_read)
964 IF (do_homo .OR. do_mixed)
THEN
965 mos(ispin)%eigenvalues(1:nmo) = eig_read(1:nmo)
966 mos(ispin)%occupation_numbers(1:nmo) = occ_read(1:nmo)
967 DEALLOCATE (eig_read, occ_read)
969 evals(ispin)%array(1:nmo) = eig_read(1:nmo)
970 DEALLOCATE (eig_read)
974 IF (do_homo .OR. do_mixed)
THEN
975 CALL para_env%bcast(mos(ispin)%eigenvalues)
976 CALL para_env%bcast(mos(ispin)%occupation_numbers)
978 CALL para_env%bcast(evals(ispin)%array)
982 IF (para_env%is_source())
THEN
983 READ (rst_unit) vecbuffer
985 vecbuffer(1, :) = 0.0_dp
987 CALL para_env%bcast(vecbuffer)
988 CALL cp_fm_set_submatrix(mos_localized(ispin), &
989 vecbuffer, 1, i, nao, 1, transpose=.true.)
993 CALL para_env%bcast(qs_loc_env%localized_wfn_control%loc_states)
995 DEALLOCATE (vecbuffer)
1000 IF (para_env%is_source())
THEN
1001 IF (file_exists)
CALL close_file(unit_number=rst_unit)
1004 CALL timestop(handle)
1006 END SUBROUTINE loc_read_restart
1021 do_xas, nloc_xas, spin_xas)
1023 TYPE(qs_loc_env_type),
POINTER :: qs_loc_env
1024 TYPE(section_vals_type),
POINTER :: loc_section
1025 LOGICAL,
INTENT(IN) :: do_homo
1026 LOGICAL,
INTENT(IN),
OPTIONAL :: do_mixed, do_xas
1027 INTEGER,
INTENT(IN),
OPTIONAL :: nloc_xas, spin_xas
1029 LOGICAL :: my_do_mixed
1030 TYPE(localized_wfn_control_type),
POINTER :: localized_wfn_control
1032 NULLIFY (localized_wfn_control)
1034 IF (
PRESENT(do_mixed))
THEN
1035 my_do_mixed = do_mixed
1037 my_do_mixed = .false.
1039 CALL localized_wfn_control_create(localized_wfn_control)
1040 CALL set_qs_loc_env(qs_loc_env, localized_wfn_control=localized_wfn_control)
1041 CALL localized_wfn_control_release(localized_wfn_control)
1042 CALL get_qs_loc_env(qs_loc_env, localized_wfn_control=localized_wfn_control)
1043 localized_wfn_control%do_homo = do_homo
1044 localized_wfn_control%do_mixed = my_do_mixed
1045 CALL read_loc_section(localized_wfn_control, loc_section, qs_loc_env%do_localize, &
1046 my_do_mixed, do_xas, nloc_xas, spin_xas)
1063 SUBROUTINE qs_loc_init(qs_env, qs_loc_env, localize_section, mos_localized, &
1064 do_homo, do_mo_cubes, mo_loc_history, evals, &
1065 tot_zeff_corr, do_mixed)
1067 TYPE(qs_environment_type),
POINTER :: qs_env
1068 TYPE(qs_loc_env_type),
POINTER :: qs_loc_env
1069 TYPE(section_vals_type),
POINTER :: localize_section
1070 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: mos_localized
1071 LOGICAL,
OPTIONAL :: do_homo, do_mo_cubes
1072 TYPE(cp_fm_type),
DIMENSION(:),
OPTIONAL,
POINTER :: mo_loc_history
1073 TYPE(cp_1d_r_p_type),
DIMENSION(:),
OPTIONAL, &
1075 REAL(kind=dp),
INTENT(IN),
OPTIONAL :: tot_zeff_corr
1076 LOGICAL,
OPTIONAL :: do_mixed
1078 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_loc_init'
1080 INTEGER :: handle, homo, i, ilast_intocc, ilow, ispin, iup, n_mo(2), n_mos(2), nao, &
1081 nelectron, nextra, nmoloc(2), nocc, npocc, nspin, output_unit
1082 LOGICAL :: my_do_homo, my_do_mixed, my_do_mo_cubes, &
1084 REAL(kind=dp) :: maxocc, my_tot_zeff_corr
1085 REAL(kind=dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation
1086 TYPE(cp_fm_type),
POINTER :: mo_coeff
1087 TYPE(cp_logger_type),
POINTER :: logger
1088 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
1089 TYPE(dft_control_type),
POINTER :: dft_control
1090 TYPE(localized_wfn_control_type),
POINTER :: localized_wfn_control
1091 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
1092 TYPE(mp_para_env_type),
POINTER :: para_env
1093 TYPE(scf_control_type),
POINTER :: scf_control
1094 TYPE(section_vals_type),
POINTER :: loc_print_section
1096 CALL timeset(routinen, handle)
1098 NULLIFY (mos, mo_coeff, mo_eigenvalues, occupation, ks_rmpv, mo_derivs, scf_control, para_env)
1099 CALL get_qs_env(qs_env, &
1101 matrix_ks=ks_rmpv, &
1102 mo_derivs=mo_derivs, &
1103 scf_control=scf_control, &
1104 dft_control=dft_control, &
1107 loc_print_section => section_vals_get_subs_vals(localize_section,
"PRINT")
1109 logger => cp_get_default_logger()
1110 output_unit = cp_logger_get_default_io_unit(logger)
1113 IF (
PRESENT(do_homo))
THEN
1114 my_do_homo = do_homo
1118 IF (
PRESENT(do_mo_cubes))
THEN
1119 my_do_mo_cubes = do_mo_cubes
1121 my_do_mo_cubes = .false.
1123 IF (
PRESENT(do_mixed))
THEN
1124 my_do_mixed = do_mixed
1126 my_do_mixed = .false.
1128 IF (
PRESENT(tot_zeff_corr))
THEN
1129 my_tot_zeff_corr = tot_zeff_corr
1131 my_tot_zeff_corr = 0.0_dp
1133 restart_found = .false.
1135 IF (qs_loc_env%do_localize)
THEN
1137 CALL get_qs_loc_env(qs_loc_env, localized_wfn_control=localized_wfn_control)
1138 IF (localized_wfn_control%loc_restart)
THEN
1139 IF (localized_wfn_control%nextra > 0)
THEN
1141 my_do_homo = .false.
1143 CALL loc_read_restart(qs_loc_env, mos, mos_localized, localize_section, &
1144 loc_print_section, para_env, my_do_homo, restart_found, evals=evals, &
1145 do_mixed=my_do_mixed)
1146 IF (output_unit > 0)
WRITE (output_unit,
"(/,T2,A,A)")
"LOCALIZATION| ", &
1147 " The orbitals to be localized are read from localization restart file."
1148 nmoloc = localized_wfn_control%nloc_states
1149 localized_wfn_control%nguess = nmoloc
1150 IF (localized_wfn_control%nextra > 0)
THEN
1153 localized_wfn_control%loc_restart = restart_found
1154 localized_wfn_control%set_of_states = state_loc_mixed
1156 CALL get_mo_set(mos(ispin), homo=homo, occupation_numbers=occupation, &
1158 nextra = localized_wfn_control%nextra
1161 IF (maxocc - occupation(i) < localized_wfn_control%eps_occ)
THEN
1168 nmoloc(ispin) = nocc + nextra
1169 localized_wfn_control%lu_bound_states(1, ispin) = 1
1170 localized_wfn_control%lu_bound_states(2, ispin) = nmoloc(ispin)
1171 localized_wfn_control%nloc_states(ispin) = nmoloc(ispin)
1173 my_do_homo = .false.
1176 IF (.NOT. restart_found)
THEN
1179 CALL get_mo_set(mos(ispin), nmo=n_mo(ispin), nelectron=nelectron, homo=homo, nao=nao, &
1180 mo_coeff=mo_coeff, eigenvalues=mo_eigenvalues, occupation_numbers=occupation, &
1183 IF ((.NOT. my_do_mo_cubes) &
1185 .AND. my_do_homo .AND.
ASSOCIATED(qs_env%scf_env) &
1186 .AND. qs_env%scf_env%method == ot_method_nr .AND. (.NOT. dft_control%restricted))
THEN
1187 CALL make_mo_eig(mos, nspin, ks_rmpv, scf_control, mo_derivs)
1189 IF (localized_wfn_control%set_of_states == state_loc_all .AND. my_do_homo)
THEN
1190 nmoloc(ispin) = nint(nelectron/occupation(1))
1191 IF (n_mo(ispin) > homo)
THEN
1192 DO i = nmoloc(ispin), 1, -1
1193 IF (occupation(1) - occupation(i) < localized_wfn_control%eps_occ)
THEN
1199 ilast_intocc = nmoloc(ispin)
1201 nmoloc(ispin) = ilast_intocc
1202 localized_wfn_control%lu_bound_states(1, ispin) = 1
1203 localized_wfn_control%lu_bound_states(2, ispin) = ilast_intocc
1204 IF (nmoloc(ispin) /= n_mo(ispin))
THEN
1205 IF (output_unit > 0) &
1206 WRITE (output_unit,
"(/,T2,A,I4,A,I6,A,/,T15,A,F12.6,A,F12.6,A)") &
1207 "LOCALIZATION| Spin ", ispin,
" The first ", &
1208 ilast_intocc,
" occupied orbitals are localized,",
" with energies from ", &
1209 mo_eigenvalues(1),
" to ", mo_eigenvalues(ilast_intocc),
" [a.u.]."
1211 ELSE IF (localized_wfn_control%set_of_states == energy_loc_range .AND. my_do_homo)
THEN
1214 DO i = 1, n_mo(ispin)
1215 IF (mo_eigenvalues(i) >= localized_wfn_control%lu_ene_bound(1))
THEN
1220 DO i = n_mo(ispin), 1, -1
1221 IF (mo_eigenvalues(i) <= localized_wfn_control%lu_ene_bound(2))
THEN
1226 localized_wfn_control%lu_bound_states(1, ispin) = ilow
1227 localized_wfn_control%lu_bound_states(2, ispin) = iup
1228 localized_wfn_control%nloc_states(ispin) = iup - ilow + 1
1229 nmoloc(ispin) = localized_wfn_control%nloc_states(ispin)
1230 IF (occupation(ilow) - occupation(iup) > localized_wfn_control%eps_occ)
THEN
1231 CALL cp_abort(__location__, &
1232 "The selected energy range includes orbitals with different occupation number. "// &
1233 "The localization procedure cannot be applied.")
1235 IF (output_unit > 0)
WRITE (output_unit,
"(/,T2,A,I4,A,I6,A)")
"LOCALIZATION| Spin ", ispin,
" : ", &
1236 nmoloc(ispin),
" orbitals in the selected energy range are localized."
1237 ELSE IF (localized_wfn_control%set_of_states == state_loc_all .AND. (.NOT. my_do_homo))
THEN
1238 nmoloc(ispin) = n_mo(ispin) - homo
1239 localized_wfn_control%lu_bound_states(1, ispin) = homo + 1
1240 localized_wfn_control%lu_bound_states(2, ispin) = n_mo(ispin)
1241 IF (output_unit > 0) &
1242 WRITE (output_unit,
"(/,T2,A,I4,A,I6,A,/,T15,A,F12.6,A,F12.6,A)") &
1243 "LOCALIZATION| Spin ", ispin,
" The first ", &
1244 nmoloc(ispin),
" virtual orbitals are localized,",
" with energies from ", &
1245 mo_eigenvalues(homo + 1),
" to ", mo_eigenvalues(n_mo(ispin)),
" [a.u.]."
1246 ELSE IF (localized_wfn_control%set_of_states == state_loc_mixed)
THEN
1247 nextra = localized_wfn_control%nextra
1250 IF (maxocc - occupation(i) < localized_wfn_control%eps_occ)
THEN
1257 nmoloc(ispin) = nocc + nextra
1258 localized_wfn_control%lu_bound_states(1, ispin) = 1
1259 localized_wfn_control%lu_bound_states(2, ispin) = nmoloc(ispin)
1260 IF (output_unit > 0) &
1261 WRITE (output_unit,
"(/,T2,A,I4,A,I6,A,/,T15,A,I6,/,T15,A,I6,/,T15,A,I6,/,T15,A,F12.6,A)") &
1262 "LOCALIZATION| Spin ", ispin,
" The first ", &
1263 nmoloc(ispin),
" orbitals are localized.", &
1264 "Number of fully occupied MOs: ", nocc, &
1265 "Number of partially occupied MOs: ", npocc, &
1266 "Number of extra degrees of freedom: ", nextra, &
1267 "Excess charge: ", my_tot_zeff_corr,
" electrons"
1269 nmoloc(ispin) = min(localized_wfn_control%nloc_states(1), n_mo(ispin))
1270 IF (output_unit > 0 .AND. my_do_homo)
WRITE (output_unit,
"(/,T2,A,I4,A,I6,A)")
"LOCALIZATION| Spin ", ispin, &
1271 " : ", nmoloc(ispin),
" occupied orbitals are localized, as given in the input list."
1272 IF (output_unit > 0 .AND. (.NOT. my_do_homo))
WRITE (output_unit,
"(/,T2,A,I4,A,I6,A)")
"LOCALIZATION| Spin ", &
1273 ispin,
" : ", nmoloc(ispin),
" unoccupied orbitals are localized, as given in the input list."
1274 IF (n_mo(ispin) > homo .AND. my_do_homo)
THEN
1275 ilow = localized_wfn_control%loc_states(1, ispin)
1276 DO i = 2, nmoloc(ispin)
1277 iup = localized_wfn_control%loc_states(i, ispin)
1278 IF (abs(occupation(ilow) - occupation(iup)) > localized_wfn_control%eps_occ)
THEN
1280 CALL cp_warn(__location__, &
1281 "User requested the calculation of localized wavefunction from a subset of MOs, "// &
1282 "including MOs with different occupations. Check the selected subset, "// &
1283 "the electronic density is not invariant with "// &
1284 "respect to rotations among orbitals with different occupation numbers!")
1290 n_mos(:) = nao - n_mo(:)
1291 IF (my_do_homo .OR. my_do_mixed) n_mos = n_mo
1295 IF (my_do_homo .OR. my_do_mixed)
THEN
1297 loc_coeff=mos_localized, mo_loc_history=mo_loc_history)
1301 CALL cp_warn(__location__, &
1302 "User requested the calculation of the localized wavefunction but the section "// &
1303 "LOCALIZE was not specified. Localization will not be performed!")
1306 CALL timestop(handle)
1322 SUBROUTINE read_loc_section(localized_wfn_control, loc_section, &
1323 localize, do_mixed, do_xas, nloc_xas, spin_channel_xas)
1325 TYPE(localized_wfn_control_type),
POINTER :: localized_wfn_control
1326 TYPE(section_vals_type),
POINTER :: loc_section
1327 LOGICAL,
INTENT(OUT) :: localize
1328 LOGICAL,
INTENT(IN),
OPTIONAL :: do_mixed, do_xas
1329 INTEGER,
INTENT(IN),
OPTIONAL :: nloc_xas, spin_channel_xas
1331 INTEGER :: i, ind, ir, n_list, n_rep, n_state, &
1332 nextra, nline, other_spin, &
1333 output_unit, spin_xas
1334 INTEGER,
DIMENSION(:),
POINTER ::
list, loc_list
1335 LOGICAL :: my_do_mixed, my_do_xas
1336 REAL(dp),
POINTER :: ene(:)
1337 TYPE(cp_logger_type),
POINTER :: logger
1338 TYPE(section_vals_type),
POINTER :: loc_print_section
1342 IF (
PRESENT(do_xas))
THEN
1344 cpassert(
PRESENT(nloc_xas))
1346 IF (
PRESENT(spin_channel_xas)) spin_xas = spin_channel_xas
1347 my_do_mixed = .false.
1348 IF (
PRESENT(do_mixed))
THEN
1349 my_do_mixed = do_mixed
1351 cpassert(
ASSOCIATED(loc_section))
1353 logger => cp_get_default_logger()
1355 CALL section_vals_val_get(loc_section,
"_SECTION_PARAMETERS_", l_val=localize)
1357 loc_print_section => section_vals_get_subs_vals(loc_section,
"PRINT")
1360 localized_wfn_control%lu_bound_states = 0
1361 localized_wfn_control%lu_ene_bound = 0.0_dp
1362 localized_wfn_control%nloc_states = 0
1363 localized_wfn_control%set_of_states = 0
1364 localized_wfn_control%nextra = 0
1367 CALL section_vals_val_get(loc_section,
"MAX_ITER", &
1368 i_val=localized_wfn_control%max_iter)
1369 CALL section_vals_val_get(loc_section,
"MAX_CRAZY_ANGLE", &
1370 r_val=localized_wfn_control%max_crazy_angle)
1371 CALL section_vals_val_get(loc_section,
"CRAZY_SCALE", &
1372 r_val=localized_wfn_control%crazy_scale)
1373 CALL section_vals_val_get(loc_section,
"EPS_OCCUPATION", &
1374 r_val=localized_wfn_control%eps_occ)
1375 CALL section_vals_val_get(loc_section,
"CRAZY_USE_DIAG", &
1376 l_val=localized_wfn_control%crazy_use_diag)
1377 CALL section_vals_val_get(loc_section,
"OUT_ITER_EACH", &
1378 i_val=localized_wfn_control%out_each)
1379 CALL section_vals_val_get(loc_section,
"EPS_LOCALIZATION", &
1380 r_val=localized_wfn_control%eps_localization)
1381 CALL section_vals_val_get(loc_section,
"MIN_OR_MAX", &
1382 i_val=localized_wfn_control%min_or_max)
1383 CALL section_vals_val_get(loc_section,
"JACOBI_FALLBACK", &
1384 l_val=localized_wfn_control%jacobi_fallback)
1385 CALL section_vals_val_get(loc_section,
"JACOBI_REFINEMENT", &
1386 l_val=localized_wfn_control%jacobi_refinement)
1387 CALL section_vals_val_get(loc_section,
"METHOD", &
1388 i_val=localized_wfn_control%localization_method)
1389 CALL section_vals_val_get(loc_section,
"OPERATOR", &
1390 i_val=localized_wfn_control%operator_type)
1391 CALL section_vals_val_get(loc_section,
"RESTART", &
1392 l_val=localized_wfn_control%loc_restart)
1393 CALL section_vals_val_get(loc_section,
"USE_HISTORY", &
1394 l_val=localized_wfn_control%use_history)
1395 CALL section_vals_val_get(loc_section,
"NEXTRA", &
1396 i_val=localized_wfn_control%nextra)
1397 CALL section_vals_val_get(loc_section,
"CPO_GUESS", &
1398 i_val=localized_wfn_control%coeff_po_guess)
1399 CALL section_vals_val_get(loc_section,
"CPO_GUESS_SPACE", &
1400 i_val=localized_wfn_control%coeff_po_guess_mo_space)
1401 CALL section_vals_val_get(loc_section,
"CG_PO", &
1402 l_val=localized_wfn_control%do_cg_po)
1404 IF (localized_wfn_control%do_homo)
THEN
1406 CALL section_vals_val_get(loc_section,
"LIST", n_rep_val=n_rep)
1411 CALL section_vals_val_get(loc_section,
"LIST", i_rep_val=ir, i_vals=
list)
1412 IF (
ASSOCIATED(
list))
THEN
1413 CALL reallocate(loc_list, 1, n_list +
SIZE(
list))
1414 DO i = 1,
SIZE(
list)
1415 loc_list(n_list + i) =
list(i)
1417 n_list = n_list +
SIZE(
list)
1420 IF (n_list /= 0)
THEN
1421 localized_wfn_control%set_of_states = state_loc_list
1422 ALLOCATE (localized_wfn_control%loc_states(n_list, 2))
1423 localized_wfn_control%loc_states = 0
1424 localized_wfn_control%loc_states(:, 1) = loc_list(:)
1425 localized_wfn_control%loc_states(:, 2) = loc_list(:)
1426 localized_wfn_control%nloc_states(1) = n_list
1427 localized_wfn_control%nloc_states(2) = n_list
1430 IF (spin_xas == 2) other_spin = 1
1431 localized_wfn_control%nloc_states(other_spin) = 0
1432 localized_wfn_control%loc_states(:, other_spin) = 0
1434 DEALLOCATE (loc_list)
1440 CALL section_vals_val_get(loc_section,
"LIST_UNOCCUPIED", n_rep_val=n_rep)
1445 CALL section_vals_val_get(loc_section,
"LIST_UNOCCUPIED", i_rep_val=ir, i_vals=
list)
1446 IF (
ASSOCIATED(
list))
THEN
1447 CALL reallocate(loc_list, 1, n_list +
SIZE(
list))
1448 DO i = 1,
SIZE(
list)
1449 loc_list(n_list + i) =
list(i)
1451 n_list = n_list +
SIZE(
list)
1454 IF (n_list /= 0)
THEN
1455 localized_wfn_control%set_of_states = state_loc_list
1456 ALLOCATE (localized_wfn_control%loc_states(n_list, 2))
1457 localized_wfn_control%loc_states = 0
1458 localized_wfn_control%loc_states(:, 1) = loc_list(:)
1459 localized_wfn_control%loc_states(:, 2) = loc_list(:)
1460 localized_wfn_control%nloc_states(1) = n_list
1461 DEALLOCATE (loc_list)
1466 IF (localized_wfn_control%set_of_states == 0)
THEN
1467 CALL section_vals_val_get(loc_section,
"ENERGY_RANGE", r_vals=ene)
1468 IF (ene(1) /= ene(2))
THEN
1469 localized_wfn_control%set_of_states = energy_loc_range
1470 localized_wfn_control%lu_ene_bound(1) = ene(1)
1471 localized_wfn_control%lu_ene_bound(2) = ene(2)
1476 IF (localized_wfn_control%set_of_states == 0)
THEN
1478 localized_wfn_control%set_of_states = state_loc_range
1479 localized_wfn_control%nloc_states(:) = 0
1480 localized_wfn_control%lu_bound_states(1, :) = 0
1481 localized_wfn_control%lu_bound_states(2, :) = 0
1482 localized_wfn_control%nloc_states(spin_xas) = nloc_xas
1483 localized_wfn_control%lu_bound_states(1, spin_xas) = 1
1484 localized_wfn_control%lu_bound_states(2, spin_xas) = nloc_xas
1485 ELSE IF (my_do_mixed)
THEN
1486 localized_wfn_control%set_of_states = state_loc_mixed
1487 nextra = localized_wfn_control%nextra
1489 localized_wfn_control%set_of_states = state_loc_all
1493 localized_wfn_control%print_centers = &
1494 btest(cp_print_key_should_output(logger%iter_info, loc_print_section, &
1495 "WANNIER_CENTERS"), cp_p_file)
1496 localized_wfn_control%print_spreads = &
1497 btest(cp_print_key_should_output(logger%iter_info, loc_print_section, &
1498 "WANNIER_SPREADS"), cp_p_file)
1499 localized_wfn_control%print_cubes = &
1500 btest(cp_print_key_should_output(logger%iter_info, loc_print_section, &
1501 "WANNIER_CUBES"), cp_p_file)
1503 output_unit = cp_print_key_unit_nr(logger, loc_print_section,
"PROGRAM_RUN_INFO", &
1506 IF (output_unit > 0)
THEN
1507 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
1508 "LOCALIZE| The spread relative to a set of orbitals is computed"
1510 SELECT CASE (localized_wfn_control%set_of_states)
1511 CASE (state_loc_all)
1512 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1513 "LOCALIZE| Orbitals to be localized: All orbitals"
1514 WRITE (unit=output_unit, fmt=
"(T2,A,/,T12,A,F16.8)") &
1515 "LOCALIZE| If fractional occupation, fully occupied MOs are those ", &
1516 "within occupation tolerance of ", localized_wfn_control%eps_occ
1517 CASE (state_loc_range)
1518 WRITE (unit=output_unit, fmt=
"(T2,A,T65,I8,A,I8)") &
1519 "LOCALIZE| Orbitals to be localized: Those with index between ", &
1520 localized_wfn_control%lu_bound_states(1, spin_xas),
" and ", &
1521 localized_wfn_control%lu_bound_states(2, spin_xas)
1522 CASE (state_loc_list)
1523 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1524 "LOCALIZE| Orbitals to be localized: Those with index in the following list"
1525 nline = localized_wfn_control%nloc_states(1)/10 + 1
1528 IF (ind + 10 < localized_wfn_control%nloc_states(1))
THEN
1529 WRITE (unit=output_unit, fmt=
"(T8,10I7)") localized_wfn_control%loc_states(ind + 1:ind + 10, 1)
1532 WRITE (unit=output_unit, fmt=
"(T8,10I7)") &
1533 localized_wfn_control%loc_states(ind + 1:localized_wfn_control%nloc_states(1), 1)
1534 ind = localized_wfn_control%nloc_states(1)
1537 CASE (energy_loc_range)
1538 WRITE (unit=output_unit, fmt=
"(T2,A,T65,/,f16.6,A,f16.6,A)") &
1539 "LOCALIZE| Orbitals to be localized: Those with energy in the range between ", &
1540 localized_wfn_control%lu_ene_bound(1),
" and ", localized_wfn_control%lu_ene_bound(2),
" a.u."
1541 CASE (state_loc_mixed)
1542 WRITE (unit=output_unit, fmt=
"(T2,A,I4,A)") &
1543 "LOCALIZE| Orbitals to be localized: Occupied orbitals + ", nextra,
" orbitals"
1545 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1546 "LOCALIZE| Orbitals to be localized: None "
1549 SELECT CASE (localized_wfn_control%operator_type)
1551 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1552 "LOCALIZE| Spread defined by the Berry phase operator "
1554 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1555 "LOCALIZE| Spread defined by the Boys phase operator "
1557 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1558 "LOCALIZE| Spread defined by the Pipek phase operator "
1561 SELECT CASE (localized_wfn_control%localization_method)
1562 CASE (do_loc_jacobi)
1563 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1564 "LOCALIZE| Optimal unitary transformation generated by Jacobi algorithm"
1566 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1567 "LOCALIZE| Optimal unitary transformation generated by Crazy angle algorithm"
1568 WRITE (unit=output_unit, fmt=
"(T2,A,F16.8)") &
1569 "LOCALIZE| maximum angle: ", localized_wfn_control%max_crazy_angle
1570 WRITE (unit=output_unit, fmt=
"(T2,A,F16.8)") &
1571 "LOCALIZE| scaling: ", localized_wfn_control%crazy_scale
1572 WRITE (unit=output_unit, fmt=
"(T2,A,L1)") &
1573 "LOCALIZE| use diag:", localized_wfn_control%crazy_use_diag
1575 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1576 "LOCALIZE| Optimal unitary transformation generated by gradient ascent algorithm "
1577 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1578 "LOCALIZE| for partially occupied wannier functions"
1579 CASE (do_loc_direct)
1580 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1581 "LOCALIZE| Optimal unitary transformation generated by direct algorithm"
1582 CASE (do_loc_l1_norm_sd)
1583 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1584 "LOCALIZE| Optimal unitary transformation generated by "
1585 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1586 "LOCALIZE| steepest descent algorithm applied on an approximate l1 norm"
1588 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1589 "LOCALIZE| No unitary transformation is applied"
1591 WRITE (unit=output_unit, fmt=
"(T2,A)") &
1592 "LOCALIZE| Pivoted QR decomposition is used to transform coefficients"
1597 CALL cp_print_key_finished_output(output_unit, logger, loc_print_section,
"PROGRAM_RUN_INFO")
1600 localized_wfn_control%localization_method = do_loc_none
1601 localized_wfn_control%localization_method = state_loc_none
1602 localized_wfn_control%print_centers = .false.
1603 localized_wfn_control%print_spreads = .false.
1604 localized_wfn_control%print_cubes = .false.
1607 END SUBROUTINE read_loc_section
1619 TYPE(localized_wfn_control_type) :: localized_wfn_control
1620 INTEGER,
DIMENSION(2),
INTENT(IN) :: nmoloc
1621 INTEGER,
INTENT(IN) :: nspins
1625 DO ispin = 1, nspins
1626 ALLOCATE (localized_wfn_control%centers_set(ispin)%array(6, nmoloc(ispin)))
1627 localized_wfn_control%centers_set(ispin)%array = 0.0_dp
1644 TYPE(localized_wfn_control_type) :: localized_wfn_control
1645 INTEGER,
DIMENSION(2),
INTENT(IN) :: nmoloc, nmo
1646 INTEGER,
INTENT(IN) :: nspins
1647 INTEGER,
INTENT(IN),
OPTIONAL :: my_spin
1649 CHARACTER(len=*),
PARAMETER :: routinen =
'set_loc_wfn_lists'
1651 INTEGER :: i, ispin, max_iloc, max_nmoloc, state
1653 CALL timeset(routinen, state)
1655 localized_wfn_control%nloc_states(1:2) = nmoloc(1:2)
1656 max_nmoloc = max(nmoloc(1), nmoloc(2))
1658 SELECT CASE (localized_wfn_control%set_of_states)
1659 CASE (state_loc_list)
1661 cpassert(
ASSOCIATED(localized_wfn_control%loc_states))
1662 DO ispin = 1, nspins
1663 localized_wfn_control%lu_bound_states(1, ispin) = 1
1664 localized_wfn_control%lu_bound_states(2, ispin) = nmoloc(ispin)
1665 IF (nmoloc(ispin) < 1)
THEN
1666 localized_wfn_control%lu_bound_states(1, ispin) = 0
1667 localized_wfn_control%loc_states(:, ispin) = 0
1670 CASE (state_loc_range)
1672 ALLOCATE (localized_wfn_control%loc_states(max_nmoloc, 2))
1673 localized_wfn_control%loc_states = 0
1674 DO ispin = 1, nspins
1675 localized_wfn_control%lu_bound_states(1, ispin) = &
1676 localized_wfn_control%lu_bound_states(1, my_spin)
1677 localized_wfn_control%lu_bound_states(2, ispin) = &
1678 localized_wfn_control%lu_bound_states(1, my_spin) + nmoloc(ispin) - 1
1679 max_iloc = localized_wfn_control%lu_bound_states(2, ispin)
1680 DO i = 1, nmoloc(ispin)
1681 localized_wfn_control%loc_states(i, ispin) = localized_wfn_control%lu_bound_states(1, ispin) + i - 1
1683 cpassert(max_iloc <= nmo(ispin))
1686 CASE (energy_loc_range)
1688 ALLOCATE (localized_wfn_control%loc_states(max_nmoloc, 2))
1689 localized_wfn_control%loc_states = 0
1690 DO ispin = 1, nspins
1691 DO i = 1, nmoloc(ispin)
1692 localized_wfn_control%loc_states(i, ispin) = localized_wfn_control%lu_bound_states(1, ispin) + i - 1
1695 CASE (state_loc_all)
1697 ALLOCATE (localized_wfn_control%loc_states(max_nmoloc, 2))
1698 localized_wfn_control%loc_states = 0
1700 IF (localized_wfn_control%lu_bound_states(1, 1) == 1)
THEN
1701 DO ispin = 1, nspins
1702 localized_wfn_control%lu_bound_states(1, ispin) = 1
1703 localized_wfn_control%lu_bound_states(2, ispin) = nmoloc(ispin)
1704 IF (nmoloc(ispin) < 1) localized_wfn_control%lu_bound_states(1, ispin) = 0
1705 DO i = 1, nmoloc(ispin)
1706 localized_wfn_control%loc_states(i, ispin) = i
1710 DO ispin = 1, nspins
1711 IF (nmoloc(ispin) < 1) localized_wfn_control%lu_bound_states(1, ispin) = 0
1712 DO i = 1, nmoloc(ispin)
1713 localized_wfn_control%loc_states(i, ispin) = &
1714 localized_wfn_control%lu_bound_states(1, ispin) + i - 1
1718 CASE (state_loc_mixed)
1720 ALLOCATE (localized_wfn_control%loc_states(max_nmoloc, 2))
1721 localized_wfn_control%loc_states = 0
1722 DO ispin = 1, nspins
1723 DO i = 1, nmoloc(ispin)
1724 localized_wfn_control%loc_states(i, ispin) = i
1729 CALL timestop(state)
Calculation of the moment integrals over Cartesian Gaussian-type functions.
subroutine, public contract_cossin(cos_block, sin_block, iatom, ncoa, nsgfa, sgfa, sphi_a, ldsa, jatom, ncob, nsgfb, sgfb, sphi_b, ldsb, cosab, sinab, ldab, work, ldwork)
...
subroutine, public cossin(la_max_set, npgfa, zeta, rpgfa, la_min_set, lb_max, npgfb, zetb, rpgfb, lb_min, rac, rbc, kvec, cosab, sinab, dcosab, dsinab)
...
collect pointers to a block of reals
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_set(matrix, alpha)
...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
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_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_write_unformatted(fm, unit)
...
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
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, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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,...
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...
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)
...
character(len=default_path_length) function, public cp_print_key_generate_filename(logger, print_key, middle_name, extension, my_local)
Utility function that returns a unit number to write the print key. Might open a file with a unique f...
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,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
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.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, 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, xcint_weights, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public localized_wfn_control_create(localized_wfn_control)
create the localized_wfn_control_type
subroutine, public localized_wfn_control_release(localized_wfn_control)
release the localized_wfn_control_type
subroutine, public get_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, moloc_coeff, op_sm_set, op_fm_set, para_env, particle_set, weights, dim_op)
...
subroutine, public set_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, moloc_coeff, op_sm_set, op_fm_set, para_env, particle_set, weights, dim_op)
...
Some utilities for the construction of the localization environment.
subroutine, public compute_berry_operator(qs_env, cell, op_sm_set, dim_op)
Computes the Berry operator for periodic systems used to define the spread of the MOS Here the matrix...
subroutine, public set_loc_wfn_lists(localized_wfn_control, nmoloc, nmo, nspins, my_spin)
create the lists of mos that are taken into account
subroutine, public loc_write_restart(qs_loc_env, section, mo_array, coeff_localized, do_homo, evals, do_mixed)
...
subroutine, public qs_loc_env_init(qs_loc_env, localized_wfn_control, qs_env, myspin, do_localize, loc_coeff, mo_loc_history)
allocates the data, and initializes the operators
subroutine, public set_loc_centers(localized_wfn_control, nmoloc, nspins)
create the center and spread array and the file names for the output
subroutine, public qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_mixed, do_xas, nloc_xas, spin_xas)
initializes everything needed for localization of the HOMOs
subroutine, public retain_history(mo_loc_history, mo_loc)
copy old mos to new ones, allocating as necessary
subroutine, public qs_loc_init(qs_env, qs_loc_env, localize_section, mos_localized, do_homo, do_mo_cubes, mo_loc_history, evals, tot_zeff_corr, do_mixed)
initializes everything needed for localization of the molecular orbitals
Localization methods such as 2x2 Jacobi rotations Steepest Decents Conjugate Gradient.
subroutine, public initialize_weights(cell, weights)
...
collects routines that perform operations directly related to MOs
subroutine, public make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env, hairy_probes, probe)
Calculate KS eigenvalues starting from OF MOS.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
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)
...
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
parameters that control an scf iteration
Type defining parameters related to the simulation cell.
represent a pointer to a 1d array
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
structure to store local (to a processor) ordered lists of integers.
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
A type that holds controlling information for the calculation of the spread of wfn and the optimizati...
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...