69#include "./base/base_uses.f90"
75 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'bse_util'
96 INTEGER,
INTENT(IN) :: i_occ, a_virt, virt
99 ia = (i_occ - 1)*virt + a_virt
111 INTEGER,
INTENT(IN) :: ia, virt
114 i_occ = (ia - 1)/virt + 1
126 INTEGER,
INTENT(IN) :: ia, virt
129 a_virt = mod(ia - 1, virt) + 1
146 SUBROUTINE screen_slabs(fm_eps_inv, fm_S_ij, fm_S_ia, dimen_RI_red, homo, virtual, &
147 fm_S_bar_ij, fm_S_bar_ia, do_abba)
149 TYPE(
cp_fm_type),
INTENT(IN) :: fm_eps_inv, fm_s_ij, fm_s_ia
150 INTEGER,
INTENT(IN) :: dimen_ri_red, homo, virtual
151 TYPE(
cp_fm_type),
INTENT(OUT) :: fm_s_bar_ij, fm_s_bar_ia
152 LOGICAL,
INTENT(IN) :: do_abba
154 CHARACTER(LEN=*),
PARAMETER :: routinen =
'screen_slabs'
158 CALL timeset(routinen, handle)
164 CALL parallel_gemm(transa=
"N", transb=
"N", m=dimen_ri_red, n=homo**2, k=dimen_ri_red, alpha=1.0_dp, &
165 matrix_a=fm_eps_inv, matrix_b=fm_s_ij, beta=0.0_dp, matrix_c=fm_s_bar_ij)
172 CALL parallel_gemm(transa=
"N", transb=
"N", m=dimen_ri_red, n=homo*virtual, k=dimen_ri_red, alpha=1.0_dp, &
173 matrix_a=fm_eps_inv, matrix_b=fm_s_ia, beta=0.0_dp, matrix_c=fm_s_bar_ia)
176 CALL timestop(handle)
192 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:), &
193 INTENT(IN) :: eig_vals
194 REAL(kind=
dp),
INTENT(IN) :: beta
195 REAL(kind=
dp),
INTENT(IN),
OPTIONAL ::
gamma
196 LOGICAL,
INTENT(IN),
OPTIONAL :: do_transpose
198 CHARACTER(LEN=*),
PARAMETER :: routinen =
'comp_eigvec_coeff_BSE'
200 INTEGER :: handle, i_row_global, ii, j_col_global, &
201 jj, ncol_local, nrow_local
202 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
203 LOGICAL :: my_do_transpose
204 REAL(kind=
dp) :: coeff, my_gamma
206 CALL timeset(routinen, handle)
208 IF (
PRESENT(
gamma))
THEN
214 IF (
PRESENT(do_transpose))
THEN
215 my_do_transpose = do_transpose
217 my_do_transpose = .false.
221 nrow_local=nrow_local, &
222 ncol_local=ncol_local, &
223 row_indices=row_indices, &
224 col_indices=col_indices)
226 IF (my_do_transpose)
THEN
227 DO jj = 1, ncol_local
228 j_col_global = col_indices(jj)
229 DO ii = 1, nrow_local
230 coeff = (eig_vals(j_col_global)**beta)/my_gamma
231 fm_work%local_data(ii, jj) = fm_work%local_data(ii, jj)*coeff
235 DO jj = 1, ncol_local
236 DO ii = 1, nrow_local
237 i_row_global = row_indices(ii)
238 coeff = (eig_vals(i_row_global)**beta)/my_gamma
239 fm_work%local_data(ii, jj) = fm_work%local_data(ii, jj)*coeff
244 CALL timestop(handle)
258 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: idx_prim, idx_sec
259 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigvec_entries
260 INTEGER,
ALLOCATABLE,
DIMENSION(:),
OPTIONAL :: idx_spin
262 CHARACTER(LEN=*),
PARAMETER :: routinen =
'sort_excitations'
264 INTEGER :: handle, ii, kk, num_entries, num_mults
265 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: idx_prim_work, idx_sec_work, &
266 idx_spin_work, tmp_index
267 LOGICAL :: unique_entries
268 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigvec_entries_work
270 CALL timeset(routinen, handle)
272 num_entries =
SIZE(idx_prim)
274 ALLOCATE (tmp_index(num_entries))
276 CALL sort(idx_prim, num_entries, tmp_index)
278 ALLOCATE (idx_sec_work(num_entries))
279 ALLOCATE (eigvec_entries_work(num_entries))
280 IF (
PRESENT(idx_spin))
ALLOCATE (idx_spin_work(num_entries))
282 DO ii = 1, num_entries
283 idx_sec_work(ii) = idx_sec(tmp_index(ii))
284 eigvec_entries_work(ii) = eigvec_entries(tmp_index(ii))
285 IF (
PRESENT(idx_spin)) idx_spin_work(ii) = idx_spin(tmp_index(ii))
288 DEALLOCATE (tmp_index)
290 DEALLOCATE (eigvec_entries)
292 CALL move_alloc(idx_sec_work, idx_sec)
293 CALL move_alloc(eigvec_entries_work, eigvec_entries)
294 IF (
PRESENT(idx_spin))
THEN
295 DEALLOCATE (idx_spin)
296 CALL move_alloc(idx_spin_work, idx_spin)
301 IF (.NOT. unique_entries)
THEN
302 ALLOCATE (idx_prim_work(num_entries))
303 idx_prim_work(:) = idx_prim(:)
305 DO ii = 1, num_entries
306 IF (idx_prim_work(ii) == 0) cycle
307 num_mults = count(idx_prim_work == idx_prim_work(ii))
308 IF (num_mults > 1)
THEN
310 idx_prim_work(ii:ii + num_mults - 1) = 0
312 ALLOCATE (idx_sec_work(num_mults))
313 ALLOCATE (eigvec_entries_work(num_mults))
314 idx_sec_work(:) = idx_sec(ii:ii + num_mults - 1)
315 eigvec_entries_work(:) = eigvec_entries(ii:ii + num_mults - 1)
316 IF (
PRESENT(idx_spin))
THEN
317 ALLOCATE (idx_spin_work(num_mults))
318 idx_spin_work(:) = idx_spin(ii:ii + num_mults - 1)
320 ALLOCATE (tmp_index(num_mults))
321 CALL sort(idx_sec_work, num_mults, tmp_index)
324 DO kk = ii, ii + num_mults - 1
325 idx_sec(kk) = idx_sec_work(kk - ii + 1)
326 eigvec_entries(kk) = eigvec_entries_work(tmp_index(kk - ii + 1))
327 IF (
PRESENT(idx_spin)) idx_spin(kk) = idx_spin_work(tmp_index(kk - ii + 1))
330 DEALLOCATE (tmp_index)
331 DEALLOCATE (idx_sec_work)
332 DEALLOCATE (eigvec_entries_work)
333 IF (
PRESENT(idx_spin))
DEALLOCATE (idx_spin_work)
335 idx_prim_work(ii) = idx_prim(ii)
337 DEALLOCATE (idx_prim_work)
340 CALL timestop(handle)
353 para_env, diag_runtime_est)
355 INTEGER,
INTENT(IN) :: n_ov_joint, unit_nr
358 REAL(kind=
dp) :: diag_runtime_est
360 CHARACTER(LEN=*),
PARAMETER :: routinen =
'estimate_BSE_resources'
363 REAL(kind=
dp) :: mem_est, mem_est_per_rank
365 CALL timeset(routinen, handle)
368 mem_est_per_rank = real(mem_est/para_env%num_pe, kind=
dp)
370 IF (unit_nr > 0)
THEN
373 WRITE (unit_nr,
'(T2,A4,T7,A40,T68,ES13.3)')
'BSE|',
'Total peak memory estimate from BSE [GB]', &
375 WRITE (unit_nr,
'(T2,A4,T7,A47,T68,F13.3)')
'BSE|',
'Peak memory estimate per MPI rank from BSE [GB]', &
377 WRITE (unit_nr,
'(T2,A4)')
'BSE|'
381 diag_runtime_est = real(int(n_ov_joint, kind=
int_8)/11000_int_8, kind=
dp)**3* &
382 10*32/real(para_env%num_pe, kind=
dp)
384 CALL timestop(handle)
398 INTEGER,
INTENT(IN) :: n_ov_joint
399 LOGICAL,
INTENT(IN) :: do_abba
400 REAL(kind=
dp) :: mem_gb
402 INTEGER :: num_bse_matrices
403 INTEGER(KIND=int_8) :: full_dim
406 IF (do_abba) num_bse_matrices = 10
407 full_dim = int(n_ov_joint, kind=
int_8)**2*int(num_bse_matrices, kind=
int_8)
409 mem_gb = 8.0e-9_dp*real(full_dim, kind=
dp)
429 i_exc, virtual, num_entries, bse_env, &
430 offsets, virtual_per_spin, idx_spin)
433 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: idx_homo, idx_virt
434 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigvec_entries
435 INTEGER :: i_exc, virtual, num_entries
437 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: offsets, virtual_per_spin
438 INTEGER,
ALLOCATABLE,
DIMENSION(:),
OPTIONAL :: idx_spin
440 CHARACTER(LEN=*),
PARAMETER :: routinen =
'filter_eigvec_contrib'
442 INTEGER :: eigvec_idx, handle, ii, iproc, isp, jj, &
443 kk, ksp, ncol_local, nrow_local, &
444 num_entries_local, r_local, v_local
445 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: displ, indx_all, indx_local, &
447 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
448 REAL(kind=
dp) :: eigvec_entry
449 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: entries_local
452 CALL timeset(routinen, handle)
454 para_env => fm_eigvec%matrix_struct%para_env
457 nrow_local=nrow_local, &
458 ncol_local=ncol_local, &
459 row_indices=row_indices, &
460 col_indices=col_indices)
463 num_entries_local = 0
464 DO jj = 1, ncol_local
465 IF (col_indices(jj) /= i_exc) cycle
466 DO ii = 1, nrow_local
467 IF (abs(fm_eigvec%local_data(ii, jj)) > bse_env%eps_x) num_entries_local = num_entries_local + 1
470 ALLOCATE (entries_local(num_entries_local), indx_local(3*num_entries_local))
472 DO jj = 1, ncol_local
473 IF (col_indices(jj) /= i_exc) cycle
474 DO ii = 1, nrow_local
475 eigvec_idx = row_indices(ii)
476 eigvec_entry = fm_eigvec%local_data(ii, jj)
477 IF (abs(eigvec_entry) > bse_env%eps_x)
THEN
483 IF (
PRESENT(offsets))
THEN
484 DO ksp =
SIZE(offsets), 1, -1
485 IF (eigvec_idx > offsets(ksp))
THEN
490 r_local = eigvec_idx - offsets(isp)
491 v_local = virtual_per_spin(isp)
494 indx_local(3*kk - 2) =
occ_of_ia(r_local, v_local)
495 indx_local(3*kk - 1) =
virt_of_ia(r_local, v_local)
496 indx_local(3*kk) = isp
497 entries_local(kk) = eigvec_entry
504 ALLOCATE (num_entries_to_comm(0:para_env%num_pe - 1), displ(0:para_env%num_pe - 1))
505 CALL para_env%allgather(num_entries_local, num_entries_to_comm)
507 DO iproc = 1, para_env%num_pe - 1
508 displ(iproc) = displ(iproc - 1) + num_entries_to_comm(iproc - 1)
510 num_entries = sum(num_entries_to_comm)
511 ALLOCATE (eigvec_entries(num_entries), indx_all(3*num_entries))
512 CALL para_env%allgatherv(entries_local, eigvec_entries, num_entries_to_comm, displ)
513 CALL para_env%allgatherv(indx_local, indx_all, 3*num_entries_to_comm, 3*displ)
515 ALLOCATE (idx_homo(num_entries), idx_virt(num_entries))
516 IF (
PRESENT(idx_spin))
ALLOCATE (idx_spin(num_entries))
517 DO kk = 1, num_entries
518 idx_homo(kk) = indx_all(3*kk - 2)
519 idx_virt(kk) = indx_all(3*kk - 1)
520 IF (
PRESENT(idx_spin)) idx_spin(kk) = indx_all(3*kk)
523 DEALLOCATE (entries_local, indx_local, indx_all, num_entries_to_comm, displ)
524 NULLIFY (row_indices)
525 NULLIFY (col_indices)
529 IF (
PRESENT(idx_spin))
THEN
535 CALL timestop(handle)
549 INTEGER,
DIMENSION(:),
INTENT(IN) :: homo_red, virt_red
550 INTEGER,
DIMENSION(:),
INTENT(OUT) :: n_ov, offsets
551 INTEGER,
INTENT(OUT) :: n_ov_joint
556 DO isp = 1,
SIZE(homo_red)
557 offsets(isp) = n_ov_joint
558 n_ov(isp) = homo_red(isp)*virt_red(isp)
559 n_ov_joint = n_ov_joint + n_ov(isp)
577 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenval_scf
578 INTEGER,
DIMENSION(:),
INTENT(IN) :: n_mo, homo
579 REAL(kind=
dp),
INTENT(IN) :: cutoff_occ, cutoff_empty
581 LOGICAL,
INTENT(IN) :: warn
583 INTEGER :: ispin, nspins
584 LOGICAL :: spins_differ
588 ALLOCATE (spin_windows(nspins))
591 cutoff_occ, cutoff_empty, spin_windows(ispin))
595 IF (spins_differ .AND. warn)
THEN
596 cpwarn(
"BSE: spin-resolved active MO cutoff candidates differ; using combined window.")
599 window = spin_windows(1)
601 DEALLOCATE (spin_windows)
616 REAL(kind=
dp),
INTENT(IN) :: cutoff_occ, cutoff_empty
618 LOGICAL,
INTENT(IN) :: warn
620 INTEGER :: ispin, nspins
621 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: homo, n_mo
622 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: eigenval_dft
623 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
626 ALLOCATE (homo(nspins), n_mo(nspins))
628 CALL get_mo_set(mos(ispin), nmo=n_mo(ispin), homo=homo(ispin), eigenvalues=eigenvalues)
629 IF (ispin == 1)
ALLOCATE (eigenval_dft(n_mo(1), nspins))
630 eigenval_dft(:, ispin) = eigenvalues(1:n_mo(ispin))
633 DEALLOCATE (homo, n_mo, eigenval_dft)
657 Eigenval_scf, Eigenval, Eigenval_reduced_scf, Eigenval_reduced_qp, &
658 homo, virtual, dimen_RI, unit_nr, &
661 window, print_window)
663 TYPE(
cp_fm_type),
INTENT(IN) :: fm_s_ia_full, fm_s_ij_full, fm_s_ab_full
664 REAL(kind=
dp),
DIMENSION(:) :: eigenval_scf, eigenval
665 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenval_reduced_scf, eigenval_reduced_qp
666 INTEGER,
INTENT(IN) :: homo, virtual, dimen_ri, unit_nr, ispin
669 LOGICAL,
INTENT(IN) :: print_window
671 CHARACTER(LEN=*),
PARAMETER :: routinen =
'truncate_BSE_matrices'
673 INTEGER :: handle, homo_incl, homo_red, virt_incl, &
679 CALL timeset(routinen, handle)
681 homo_incl = window%first_mo
682 virt_incl = window%last_mo - homo
683 homo_red = homo - homo_incl + 1
686 IF (print_window .AND. unit_nr > 0)
THEN
687 IF (bse_env%bse_cutoff_occ > 0)
THEN
688 WRITE (unit_nr,
'(T2,A4,T7,A29,T71,F10.3)')
'BSE|',
'Cutoff occupied orbitals [eV]', &
689 bse_env%bse_cutoff_occ*
evolt
691 WRITE (unit_nr,
'(T2,A4,T7,A37)')
'BSE|',
'No cutoff given for occupied orbitals'
693 IF (bse_env%bse_cutoff_empty > 0)
THEN
694 WRITE (unit_nr,
'(T2,A4,T7,A26,T71,F10.3)')
'BSE|',
'Cutoff empty orbitals [eV]', &
695 bse_env%bse_cutoff_empty*
evolt
697 WRITE (unit_nr,
'(T2,A4,T7,A34)')
'BSE|',
'No cutoff given for empty orbitals'
699 WRITE (unit_nr,
'(T2,A4,T7,A20,T71,I10)')
'BSE|',
'First occupied index', homo_incl
700 WRITE (unit_nr,
'(T2,A4,T7,A32,T71,I10)')
'BSE|',
'Last empty index (not MO index!)', virt_incl
701 WRITE (unit_nr,
'(T2,A4,T7,A35,T71,F10.3)')
'BSE|',
'Energy of first occupied index [eV]', &
702 eigenval(homo_incl)*
evolt
703 WRITE (unit_nr,
'(T2,A4,T7,A31,T71,F10.3)')
'BSE|',
'Energy of last empty index [eV]', &
704 eigenval(homo + virt_incl)*
evolt
705 WRITE (unit_nr,
'(T2,A4,T7,A54,T71,F10.3)')
'BSE|', &
706 'Energy difference of first occupied index to HOMO [eV]', &
707 -(eigenval(homo_incl) - eigenval(homo))*
evolt
708 WRITE (unit_nr,
'(T2,A4,T7,A50,T71,F10.3)')
'BSE|', &
709 'Energy difference of last empty index to LUMO [eV]', &
710 (eigenval(homo + virt_incl) - eigenval(homo + 1))*
evolt
711 WRITE (unit_nr,
'(T2,A4,T7,A35,T71,I10)')
'BSE|',
'Number of GW-corrected occupied MOs', &
712 bse_env%gw_corr_lev_occ
713 WRITE (unit_nr,
'(T2,A4,T7,A32,T71,I10)')
'BSE|',
'Number of GW-corrected empty MOs', &
714 bse_env%gw_corr_lev_virt(ispin)
715 WRITE (unit_nr,
'(T2,A4)')
'BSE|'
717 IF (unit_nr > 0)
THEN
718 IF (homo - homo_incl + 1 > bse_env%gw_corr_lev_occ)
THEN
719 cpabort(
"Number of GW-corrected occupied MOs too small for chosen BSE cutoff")
721 IF (virt_incl > bse_env%gw_corr_lev_virt(ispin))
THEN
722 cpabort(
"Number of GW-corrected virtual MOs too small for chosen BSE cutoff")
727 para_env => fm_s_ia_full%matrix_struct%para_env
728 context => fm_s_ia_full%matrix_struct%context
734 CALL cp_fm_create(bse_env%fm_S_ia(ispin), fm_struct_ia, name=
"fm_S_trunc", set_zero=.true.)
735 CALL cp_fm_create(bse_env%fm_S_ij(ispin), fm_struct_ij, name=
"fm_S_ij_trunc", set_zero=.true.)
736 CALL cp_fm_create(bse_env%fm_S_ab(ispin), fm_struct_ab, name=
"fm_S_ab_trunc", set_zero=.true.)
739 IF (bse_env%bse_cutoff_occ > 0 .OR. bse_env%bse_cutoff_empty > 0)
THEN
741 ALLOCATE (eigenval_reduced_scf(homo_red + virt_red), eigenval_reduced_qp(homo_red + virt_red))
742 eigenval_reduced_scf(:) = eigenval_scf(homo_incl:homo + virt_incl)
743 eigenval_reduced_qp(:) = eigenval(homo_incl:homo + virt_incl)
745 CALL cp_fm_permute(bse_env%fm_S_ia(ispin), fm_s_ia_full, 1.0_dp, 1, virtual, 1, virt_red, [1, 2, 3, 4], &
746 first_index=[1, 1, homo_incl, 1], &
747 last_index=[dimen_ri, 1, (homo_incl) + homo_red - 1, virt_red])
748 CALL cp_fm_permute(bse_env%fm_S_ij(ispin), fm_s_ij_full, 1.0_dp, 1, homo, 1, homo_red, [1, 2, 3, 4], &
749 first_index=[1, 1, homo_incl, homo_incl], &
750 last_index=[dimen_ri, 1, (homo_incl) + homo_red - 1, (homo_incl) + homo_red - 1])
751 CALL cp_fm_permute(bse_env%fm_S_ab(ispin), fm_s_ab_full, 1.0_dp, 1, bse_env%gw_corr_lev_virt(ispin), 1, &
752 virt_red, [1, 2, 3, 4], first_index=[1, 1, 1, 1], &
753 last_index=[dimen_ri, 1, virt_red, virt_red])
756 IF (unit_nr > 0)
THEN
757 WRITE (unit_nr,
'(T2,A4,T7,A37)')
'BSE|',
'No truncation of BSE matrices applied'
758 WRITE (unit_nr,
'(T2,A4)')
'BSE|'
760 ALLOCATE (eigenval_reduced_scf(homo_red + virt_red), eigenval_reduced_qp(homo_red + virt_red))
761 eigenval_reduced_scf(:) = eigenval_scf(:)
762 eigenval_reduced_qp(:) = eigenval(:)
771 bse_env%homo_red(ispin) = homo_red
772 bse_env%virt_red(ispin) = virt_red
781 CALL timestop(handle)
794 SUBROUTINE reshuffle_eigvec(fm_eigvec, fm_eigvec_reshuffled, homo, virtual, n_exc, do_transpose)
797 TYPE(
cp_fm_type),
INTENT(INOUT) :: fm_eigvec_reshuffled
798 INTEGER,
INTENT(IN) :: homo, virtual, n_exc
799 LOGICAL,
INTENT(IN) :: do_transpose
801 CHARACTER(LEN=*),
PARAMETER :: routinen =
'reshuffle_eigvec'
803 INTEGER :: handle, my_m_col, my_n_row
804 INTEGER,
DIMENSION(4) :: reordering
806 fm_struct_eigvec_reshuffled
809 CALL timeset(routinen, handle)
814 IF (do_transpose)
THEN
815 reordering = [2, 3, 1, 4]
819 reordering = [1, 3, 2, 4]
825 fm_eigvec%matrix_struct%para_env, fm_eigvec%matrix_struct%context, &
828 fm_eigvec%matrix_struct%para_env, fm_eigvec%matrix_struct%context, &
832 CALL cp_fm_create(fm_eigvec_col, fm_struct_eigvec_col, name=
"BSE_column_vector")
834 CALL cp_fm_create(fm_eigvec_reshuffled, fm_struct_eigvec_reshuffled, name=
"BSE_reshuffled_eigenvector")
842 CALL cp_fm_permute(fm_eigvec_reshuffled, fm_eigvec_col, 1.0_dp, virtual, 1, 1, 1, reordering)
848 CALL timestop(handle)
863 stride, append_cube, print_section)
867 INTEGER,
INTENT(IN) :: istate
868 CHARACTER(LEN=10) :: info_approximation
869 INTEGER,
DIMENSION(:),
POINTER :: stride
870 LOGICAL,
INTENT(IN) :: append_cube
873 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_bse_nto_cubes'
875 CHARACTER(LEN=default_path_length) :: filename, info_approx_trunc, &
877 INTEGER :: handle, i, iset, nmo, unit_nr_cube
891 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
895 CALL timeset(routinen, handle)
897 dft_control => bse_env%dft_control
899 IF (.NOT.
ASSOCIATED(bse_env%pw_env))
THEN
900 cpabort(
"NTO cube files need the SCF grids: set NTO_ANALYSIS%CUBE_FILES to F")
902 pw_env => bse_env%pw_env
903 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
904 CALL auxbas_pw_pool%create_pw(wf_r)
905 CALL auxbas_pw_pool%create_pw(wf_g)
907 subsys => bse_env%subsys
910 my_pos_cube =
"REWIND"
911 IF (append_cube)
THEN
912 my_pos_cube =
"APPEND"
915 CALL qs_subsys_get(subsys, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
916 cell=cell, particle_set=particle_set)
919 CALL get_mo_set(mo_set=mos(iset), mo_coeff=mo_coeff, nmo=nmo)
922 cell, dft_control, particle_set, pw_env)
924 WRITE (filename,
'(A6,I3.3,A5,I2.2,a11)')
"_NEXC_", istate,
"_NTO_", i,
"_Hole_State"
925 ELSE IF (iset == 2)
THEN
926 WRITE (filename,
'(A6,I3.3,A5,I2.2,a15)')
"_NEXC_", istate,
"_NTO_", i,
"_Particle_State"
928 info_approx_trunc = trim(adjustl(info_approximation))
929 info_approx_trunc = info_approx_trunc(2:len_trim(info_approx_trunc) - 1)
930 filename = trim(info_approx_trunc)//trim(filename)
933 middle_name=trim(filename), file_position=my_pos_cube, &
934 log_filename=.false., ignore_should_output=.true., mpi_io=mpi_io)
936 WRITE (title, *)
"Natural Transition Orbital Hole State", i
937 ELSE IF (iset == 2)
THEN
938 WRITE (title, *)
"Natural Transition Orbital Particle State", i
940 CALL cp_pw_to_cube(wf_r, unit_nr_cube, title, particles=particles, stride=stride, mpi_io=mpi_io)
942 ignore_should_output=.true., mpi_io=mpi_io)
946 CALL auxbas_pw_pool%give_back_pw(wf_g)
947 CALL auxbas_pw_pool%give_back_pw(wf_r)
949 CALL timestop(handle)
961 INTEGER,
INTENT(IN) :: homo, virtual, unit_nr
964 CHARACTER(LEN=*),
PARAMETER :: routinen =
'adapt_BSE_input_params'
966 INTEGER :: handle, i, j, n, n_exc_max, &
967 ndim_periodic_cell, &
968 ndim_periodic_poisson, &
969 num_state_list_exceptions
973 CALL timeset(routinen, handle)
977 ndim_periodic_poisson = bse_env%n_periodic_poisson
978 ndim_periodic_cell = sum(cell_ref%perd(1:3))
981 n_exc_max = homo*virtual
983 n_exc_max = min(n_exc_max, bse_env%num_exc_en)
987 IF (bse_env%num_print_exc < 0 .OR. &
988 bse_env%num_print_exc > n_exc_max)
THEN
989 bse_env%num_print_exc = n_exc_max
990 IF (unit_nr > 0)
THEN
991 CALL cp_hint(__location__, &
992 "Keyword NUM_PRINT_EXC is either negative or too large. "// &
993 "Printing all computed excitations.")
1003 IF (bse_env%do_nto_analysis)
THEN
1004 IF (bse_env%explicit_nto_list)
THEN
1005 IF (bse_env%num_print_exc_ntos > 0)
THEN
1006 IF (unit_nr > 0)
THEN
1007 CALL cp_hint(__location__, &
1008 "Keywords NUM_PRINT_EXC_NTOS and STATE_LIST are both given in input. "// &
1009 "Overriding NUM_PRINT_EXC_NTOS.")
1014 num_state_list_exceptions = 0
1015 DO i = 1,
SIZE(bse_env%bse_nto_state_list)
1016 IF (bse_env%bse_nto_state_list(i) < 1 .OR. &
1017 bse_env%bse_nto_state_list(i) > bse_env%num_print_exc)
THEN
1018 num_state_list_exceptions = num_state_list_exceptions + 1
1021 IF (num_state_list_exceptions > 0)
THEN
1022 IF (unit_nr > 0)
THEN
1023 CALL cp_hint(__location__, &
1024 "STATE_LIST contains indices outside the range of included excitation levels. "// &
1025 "Ignoring these states.")
1028 n =
SIZE(bse_env%bse_nto_state_list) - num_state_list_exceptions
1029 ALLOCATE (bse_env%bse_nto_state_list_final(n))
1030 bse_env%bse_nto_state_list_final(:) = 0
1032 DO j = 1,
SIZE(bse_env%bse_nto_state_list)
1033 IF (bse_env%bse_nto_state_list(j) >= 1 .AND. &
1034 bse_env%bse_nto_state_list(j) <= bse_env%num_print_exc)
THEN
1035 bse_env%bse_nto_state_list_final(i) = bse_env%bse_nto_state_list(j)
1040 bse_env%num_print_exc_ntos =
SIZE(bse_env%bse_nto_state_list_final)
1042 IF (bse_env%num_print_exc_ntos > bse_env%num_print_exc .OR. &
1043 bse_env%num_print_exc_ntos < 0)
THEN
1044 bse_env%num_print_exc_ntos = bse_env%num_print_exc
1046 ALLOCATE (bse_env%bse_nto_state_list_final(bse_env%num_print_exc_ntos))
1047 DO i = 1, bse_env%num_print_exc_ntos
1048 bse_env%bse_nto_state_list_final(i) = i
1054 IF (bse_env%bse_spin_config /= 0 .AND. &
1055 bse_env%eps_nto_osc_str > 0)
THEN
1056 IF (unit_nr > 0)
THEN
1057 CALL cp_warn(__location__, &
1058 "Cannot apply EPS_OSC_STR for Triplet excitations. "// &
1059 "Resetting EPS_OSC_STR to default.")
1061 bse_env%eps_nto_osc_str = -1.0_dp
1065 IF (bse_env%num_print_exc_descr < 0 .OR. &
1066 bse_env%num_print_exc_descr > bse_env%num_print_exc)
THEN
1067 IF (unit_nr > 0)
THEN
1068 CALL cp_hint(__location__, &
1069 "Keyword NUM_PRINT_EXC_DESCR is either negative or too large. "// &
1070 "Printing exciton descriptors up to NUM_PRINT_EXC.")
1072 bse_env%num_print_exc_descr = bse_env%num_print_exc
1076 CALL section_vals_val_get(bse_env%bse_section,
"PRINT_DIRECTIONAL_CROSSCORRELATION", explicit=explicit)
1077 IF (explicit .AND. bse_env%print_directional_crosscorrelation .AND. &
1078 .NOT. bse_env%print_directional_exc_descr)
THEN
1079 IF (unit_nr > 0)
THEN
1080 CALL cp_warn(__location__, &
1081 "PRINT_DIRECTIONAL_CROSSCORRELATION has no effect without PRINT_DIRECTIONAL_EXC_DESCR.")
1086 IF (bse_env%use_ks_energies)
THEN
1087 IF (unit_nr > 0)
THEN
1088 CALL cp_warn(__location__, &
1089 "Using KS energies for BSE calculations. Therefore, no quantities "// &
1090 "of the preceeding GW calculation enter the BSE.")
1095 IF (ndim_periodic_poisson /= 0)
THEN
1096 IF (unit_nr > 0)
THEN
1097 CALL cp_warn(__location__, &
1098 "Poisson solver should be invoked by PERIODIC NONE. "// &
1099 "The applied length gauge might give misleading results for "// &
1100 "oscillator strengths.")
1103 IF (ndim_periodic_cell /= 0)
THEN
1104 IF (unit_nr > 0)
THEN
1105 CALL cp_warn(__location__, &
1106 "CELL in SUBSYS should be invoked with PERIODIC NONE. "// &
1107 "The applied length gauge might give misleading results for "// &
1108 "oscillator strengths.")
1112 CALL timestop(handle)
1122 INTEGER,
INTENT(IN) :: unit_nr
1125 IF (bse_env%screening_factor > 0.0_dp)
THEN
1127 IF (unit_nr > 0)
THEN
1128 CALL cp_warn(__location__, &
1129 "Screening factor is only supported for &SCREENING_IN_W ALPHA. "// &
1130 "Resetting SCREENING_IN_W to ALPHA.")
1134 IF (bse_env%screening_factor > 1.0_dp)
THEN
1135 IF (unit_nr > 0)
THEN
1136 CALL cp_warn(__location__, &
1137 "Screening factor is larger than 1.0. ")
1142 IF (bse_env%screening_factor < 0.0_dp .AND. &
1144 IF (unit_nr > 0)
THEN
1145 CALL cp_warn(__location__, &
1146 "Screening factor is negative. Defaulting to 0.25")
1148 bse_env%screening_factor = 0.25_dp
1151 IF (bse_env%screening_factor == 0.0_dp)
THEN
1155 IF (bse_env%screening_factor == 1.0_dp)
THEN
1179 matrix_multipole, mos, mo_coeff, &
1180 homo_red, virtual_red, context_BSE, ispin)
1182 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
1183 INTENT(INOUT) :: fm_multipole_ai_trunc, &
1184 fm_multipole_ij_trunc, &
1185 fm_multipole_ab_trunc
1186 TYPE(
dbcsr_p_type),
DIMENSION(:),
INTENT(IN) :: matrix_multipole
1187 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos
1188 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
1189 INTEGER,
INTENT(IN) :: homo_red, virtual_red
1191 INTEGER,
INTENT(IN),
OPTIONAL :: ispin
1193 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_multipoles_mo'
1195 INTEGER :: handle, idir, my_ispin, n_multipole, &
1196 n_occ, n_virt, nao, nmo_mp2
1197 TYPE(
cp_fm_struct_type),
POINTER :: fm_struct_mp_ab_trunc, fm_struct_mp_ai_trunc, &
1198 fm_struct_mp_ij_trunc, fm_struct_multipoles_ao, fm_struct_nao_nmo, fm_struct_nmo_nmo
1200 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_multipole_per_dir
1203 CALL timeset(routinen, handle)
1206 IF (
PRESENT(ispin)) my_ispin = ispin
1209 fm_struct_multipoles_ao => mos(my_ispin)%mo_coeff%matrix_struct
1211 para_env_bse => context_bse%para_env
1212 n_multipole =
SIZE(matrix_multipole)
1213 ALLOCATE (fm_multipole_per_dir(n_multipole))
1219 CALL get_mo_set(mo_set=mos(my_ispin), homo=n_occ, nao=nao)
1221 nmo_mp2 = mo_coeff(1)%matrix_struct%ncol_global
1222 n_virt = nmo_mp2 - n_occ
1235 fm_struct_multipoles_ao%para_env, fm_struct_multipoles_ao%context, &
1238 fm_struct_multipoles_ao%para_env, fm_struct_multipoles_ao%context, &
1243 context_bse, virtual_red, homo_red)
1245 context_bse, homo_red, homo_red)
1247 context_bse, virtual_red, virtual_red)
1248 DO idir = 1, n_multipole
1249 CALL cp_fm_create(fm_multipole_ai_trunc(idir), matrix_struct=fm_struct_mp_ai_trunc, &
1250 name=
"dipoles_mo_ai_trunc")
1252 CALL cp_fm_create(fm_multipole_ij_trunc(idir), matrix_struct=fm_struct_mp_ij_trunc, &
1253 name=
"dipoles_mo_ij_trunc")
1255 CALL cp_fm_create(fm_multipole_ab_trunc(idir), matrix_struct=fm_struct_mp_ab_trunc, &
1256 name=
"dipoles_mo_ab_trunc")
1262 CALL cp_fm_create(fm_work, matrix_struct=fm_struct_nao_nmo, name=
"multipole_work")
1265 DO idir = 1, n_multipole
1267 CALL cp_fm_create(fm_multipole_per_dir(idir), matrix_struct=fm_struct_nmo_nmo, name=
"multipoles_mo")
1271 fm_work, ncol=nmo_mp2)
1274 CALL parallel_gemm(
'T',
'N', nmo_mp2, nmo_mp2, nao, 1.0_dp, mo_coeff(1), fm_work, 0.0_dp, fm_multipole_per_dir(idir))
1279 fm_multipole_ai_trunc(idir), &
1283 n_occ - homo_red + 1, &
1286 fm_multipole_per_dir(idir)%matrix_struct%context)
1289 fm_multipole_ij_trunc(idir), &
1292 n_occ - homo_red + 1, &
1293 n_occ - homo_red + 1, &
1296 fm_multipole_per_dir(idir)%matrix_struct%context)
1299 fm_multipole_ab_trunc(idir), &
1306 fm_multipole_per_dir(idir)%matrix_struct%context)
1310 NULLIFY (fm_struct_multipoles_ao)
1316 DO idir = 1, n_multipole
1319 DEALLOCATE (fm_multipole_per_dir)
1322 CALL timestop(handle)
1335 TYPE(
cp_fm_type),
INTENT(IN) :: fm_a, fm_b, fm_c
1336 REAL(kind=
dp),
INTENT(OUT) :: alpha
1338 CHARACTER(LEN=*),
PARAMETER :: routinen =
'trace_exciton_descr'
1340 INTEGER :: handle, ncol_a, ncol_b, ncol_c, nrow_a, &
1344 CALL timeset(routinen, handle)
1347 CALL cp_fm_get_info(fm_a, nrow_global=nrow_a, ncol_global=ncol_a)
1348 CALL cp_fm_get_info(fm_b, nrow_global=nrow_b, ncol_global=ncol_b)
1349 CALL cp_fm_get_info(fm_c, nrow_global=nrow_c, ncol_global=ncol_c)
1352 cpassert(nrow_a == nrow_b .AND. ncol_a == ncol_c .AND. ncol_b == nrow_c)
1356 CALL parallel_gemm(
"N",
"N", nrow_a, ncol_a, nrow_c, 1.0_dp, &
1357 fm_b, fm_c, 0.0_dp, fm_work_ia)
1363 CALL timestop(handle)
1378 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_s_ia
1379 INTEGER,
DIMENSION(:),
INTENT(IN) :: offsets, n_ov
1380 INTEGER,
INTENT(IN) :: dimen_ri
1381 TYPE(
cp_fm_type),
INTENT(INOUT) :: fm_s_joint
1383 CHARACTER(LEN=*),
PARAMETER :: routinen =
'assemble_joint_ov_slab'
1385 INTEGER :: handle, isp
1387 CALL timeset(routinen, handle)
1388 DO isp = 1,
SIZE(fm_s_ia)
1389 CALL cp_fm_to_fm_submat(fm_s_ia(isp), fm_s_joint, dimen_ri, n_ov(isp), 1, 1, 1, offsets(isp) + 1)
1391 CALL timestop(handle)
Define the atomic kind types and their sub types.
The BSE environment: the settings of the &BSE section and the state a GW path prepares for the solver...
Auxiliary routines for GW + Bethe-Salpeter for computing electronic excitations.
subroutine, public assemble_joint_ov_slab(fm_s_ia, offsets, n_ov, dimen_ri, fm_s_joint)
Column-concatenate per-spin ia-slabs into the joint dimen_RI x n_ov_joint slab. Sigma-block of spin i...
subroutine, public adapt_bse_screening(bse_env, unit_nr)
Resolve SCREENING_IN_W and its factor before constructing the dielectric matrix or slabs.
subroutine, public truncate_bse_matrices(fm_s_ia_full, fm_s_ij_full, fm_s_ab_full, eigenval_scf, eigenval, eigenval_reduced_scf, eigenval_reduced_qp, homo, virtual, dimen_ri, unit_nr, ispin, bse_env, window, print_window)
Determines indices within the given energy cutoffs and truncates Eigenvalues and matrices.
subroutine, public get_multipoles_mo(fm_multipole_ai_trunc, fm_multipole_ij_trunc, fm_multipole_ab_trunc, matrix_multipole, mos, mo_coeff, homo_red, virtual_red, context_bse, ispin)
The multipoles in the MO window, D^k_pq = sum_µν C_µp M^k_µν C_νq, cut to the ai, ij and ab blocks of...
subroutine, public estimate_bse_resources(n_ov_joint, unit_nr, bse_abba, para_env, diag_runtime_est)
Roughly estimates the needed runtime and memory during the BSE run.
subroutine, public trace_exciton_descr(fm_a, fm_b, fm_c, alpha)
Computes trace of form Tr{A^T B C} for exciton descriptors.
subroutine, public adapt_bse_input_params(homo, virtual, unit_nr, bse_env)
Checks BSE input section and adapts them if necessary.
pure integer function, public occ_of_ia(ia, virt)
Occupied level of the compound transition index ia = (i-1)*virt + a.
pure real(kind=dp) function, public fulldiag_memory_estimate_gb(n_ov_joint, do_abba)
Peak memory of the full diagonalization in GB, all ranks together: n_ov^2 doubles times the matrices ...
subroutine, public filter_eigvec_contrib(fm_eigvec, idx_homo, idx_virt, eigvec_entries, i_exc, virtual, num_entries, bse_env, offsets, virtual_per_spin, idx_spin)
Filters eigenvector entries above a given threshold to describe excitations in the singleparticle bas...
subroutine, public bse_window_from_dft(eigenval_scf, n_mo, homo, cutoff_occ, cutoff_empty, window, warn)
The active MO window on the DFT axis: one absolute MO range for every spin; when the spin windows dif...
subroutine, public reshuffle_eigvec(fm_eigvec, fm_eigvec_reshuffled, homo, virtual, n_exc, do_transpose)
...
pure integer function, public ia_of_occ_virt(i_occ, a_virt, virt)
Compound transition index ia = (i-1)*virt + a of the pair (i, a): a is the fast index.
subroutine, public screen_slabs(fm_eps_inv, fm_s_ij, fm_s_ia, dimen_ri_red, homo, virtual, fm_s_bar_ij, fm_s_bar_ia, do_abba)
The screened slabs \bar{B}^P_ij = sum_Q [1+Q(0)]^-1_PQ B^Q_ij and \bar{B}^P_ia = sum_Q [1+Q(0)]^-1_PQ...
subroutine, public get_bse_spin_block_layout(homo_red, virt_red, n_ov, offsets, n_ov_joint)
Spin-block layout for the open-shell (joint) BSE matrix: per-spin OV-pair counts and the block offset...
subroutine, public sort_excitations(idx_prim, idx_sec, eigvec_entries, idx_spin)
Sorts excitation entries by ascending primary index, reordering the secondary index,...
subroutine, public bse_window_from_mos(mos, cutoff_occ, cutoff_empty, window, warn)
The active MO window of bse_window_from_dft, from the DFT eigenvalues of the MO sets.
pure integer function, public virt_of_ia(ia, virt)
Virtual level of the compound transition index ia = (i-1)*virt + a.
subroutine, public comp_eigvec_coeff_bse(fm_work, eig_vals, beta, gamma, do_transpose)
Routine for computing the coefficients of the eigenvectors of the BSE matrix from a multiplication wi...
subroutine, public print_bse_nto_cubes(bse_env, mos, istate, info_approximation, stride, append_cube, print_section)
Borrowed from the tddfpt module with slight adaptions.
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 cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
Basic linear algebra operations for full matrices.
Redistribution of full matrices and distributed arrays.
subroutine, public cp_fm_permute(fm_out, fm_in, beta, nrow_secidx_in, ncol_secidx_in, nrow_secidx_out, ncol_secidx_out, reordering, row_offset, col_offset, first_index, last_index)
Add a permuted or restricted four-index tensor stored as a full matrix.
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_to_fm_submat_general(source, destination, nrows, ncols, s_firstrow, s_firstcol, d_firstrow, d_firstcol, global_context)
General copy of a submatrix of fm matrix to a submatrix of another fm matrix. The two matrices can ha...
subroutine, public cp_fm_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
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
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...
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 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, file_access)
...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_path_length
Interface to the message passing library MPI.
Common selection and union operations for contiguous molecular-orbital windows.
subroutine, public combine_mo_windows(spin_windows, combined_window, windows_differ)
Forms the smallest contiguous window covering all supplied spin windows.
subroutine, public determine_mo_window(eigenvalues, n_mo, n_occ, cutoff_occ, cutoff_empty, window)
Selects one contiguous MO window from an ordered reference spectrum.
basic linear algebra operations for full matrixes
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
Define the quickstep kind type and their sub types.
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, cmo_coeff)
Get the components of a MO set data structure.
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
All kind of helpful little routines.
Provides all information about an atomic kind.
Settings of the &BSE section (read_bse_section, re-read before every BSE run, normalised in place by ...
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
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...
stores all the informations relevant to an mpi environment
represent a list of objects
contained for different pw related things
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.