86#include "./base/base_uses.f90"
92 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_large_cell_gamma'
110 CHARACTER(LEN=*),
PARAMETER :: routinen =
'gw_calc_large_cell_Gamma'
113 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_sigma_x_gamma, fm_w_mic_time
114 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_sigma_c_gamma_time
116 CALL timeset(routinen, handle)
121 CALL get_mat_chi_gamma_tau(bs_env, qs_env, bs_env%mat_chi_Gamma_tau)
124 CALL get_w_mic(bs_env, qs_env, bs_env%mat_chi_Gamma_tau, fm_w_mic_time)
128 CALL get_sigma_x(bs_env, qs_env, fm_sigma_x_gamma)
132 CALL get_sigma_c(bs_env, qs_env, fm_w_mic_time, fm_sigma_c_gamma_time)
135 CALL compute_qp_energies(bs_env, qs_env, fm_sigma_x_gamma, fm_sigma_c_gamma_time)
139 CALL timestop(handle)
149 SUBROUTINE get_mat_chi_gamma_tau(bs_env, qs_env, mat_chi_Gamma_tau)
152 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_chi_gamma_tau
154 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_mat_chi_Gamma_tau'
156 INTEGER :: handle, i_intval_idx, i_t, inner_loop_atoms_interval_index, ispin, j_intval_idx
157 INTEGER,
DIMENSION(2) :: i_atoms, il_atoms, j_atoms
158 LOGICAL :: dist_too_long_i, dist_too_long_j
159 REAL(kind=
dp) :: t1, tau
160 TYPE(dbt_type) :: t_2c_gocc, t_2c_gvir, t_3c_for_gocc, &
161 t_3c_for_gvir, t_3c_x_gocc, &
162 t_3c_x_gocc_2, t_3c_x_gvir, &
165 CALL timeset(routinen, handle)
167 DO i_t = 1, bs_env%num_time_freq_points
171 IF (bs_env%read_chi(i_t))
THEN
173 CALL fm_read(bs_env%fm_RI_RI, bs_env, bs_env%chi_name, i_t)
176 keep_sparsity=.false.)
178 IF (bs_env%unit_nr > 0)
THEN
179 WRITE (bs_env%unit_nr,
'(T2,A,I5,A,I3,A,F7.1,A)') &
180 χτ
'Read (i,k=0) from file for time point ', i_t,
' /', &
181 bs_env%num_time_freq_points, &
189 IF (.NOT. bs_env%calc_chi(i_t)) cycle
191 CALL create_tensors_chi(t_2c_gocc, t_2c_gvir, t_3c_for_gocc, t_3c_for_gvir, &
192 t_3c_x_gocc, t_3c_x_gvir, t_3c_x_gocc_2, t_3c_x_gvir_2, bs_env)
198 tau = bs_env%imag_time_points(i_t)
200 DO ispin = 1, bs_env%n_spin
201 CALL g_occ_vir(bs_env, tau, bs_env%fm_Gocc, ispin, occ=.true., vir=.false.)
202 CALL g_occ_vir(bs_env, tau, bs_env%fm_Gvir, ispin, occ=.false., vir=.true.)
205 bs_env%mat_ao_ao_tensor%matrix, t_2c_gocc, bs_env, &
206 bs_env%atoms_j_t_group)
208 bs_env%mat_ao_ao_tensor%matrix, t_2c_gvir, bs_env, &
209 bs_env%atoms_i_t_group)
213 DO i_intval_idx = 1, bs_env%n_intervals_i
214 DO j_intval_idx = 1, bs_env%n_intervals_j
215 i_atoms = bs_env%i_atom_intervals(1:2, i_intval_idx)
216 j_atoms = bs_env%j_atom_intervals(1:2, j_intval_idx)
218 DO inner_loop_atoms_interval_index = 1, bs_env%n_intervals_inner_loop_atoms
220 il_atoms = bs_env%inner_loop_atom_intervals(1:2, inner_loop_atoms_interval_index)
222 CALL check_dist(i_atoms, il_atoms, qs_env, bs_env, dist_too_long_i)
223 CALL check_dist(j_atoms, il_atoms, qs_env, bs_env, dist_too_long_j)
224 IF (dist_too_long_i .OR. dist_too_long_j) cycle
230 CALL g_times_3c(t_3c_for_gocc, t_2c_gocc, t_3c_x_gocc, bs_env, &
231 j_atoms, i_atoms, il_atoms)
237 CALL g_times_3c(t_3c_for_gvir, t_2c_gvir, t_3c_x_gvir, bs_env, &
238 i_atoms, j_atoms, il_atoms)
243 CALL dbt_copy(t_3c_x_gocc, t_3c_x_gocc_2, move_data=.true., order=[1, 3, 2])
244 CALL dbt_copy(t_3c_x_gvir, t_3c_x_gvir_2, move_data=.true.)
247 CALL dbt_contract(alpha=bs_env%spin_degeneracy, &
248 tensor_1=t_3c_x_gocc_2, tensor_2=t_3c_x_gvir_2, &
249 beta=1.0_dp, tensor_3=bs_env%t_chi, &
250 contract_1=[2, 3], notcontract_1=[1], map_1=[1], &
251 contract_2=[2, 3], notcontract_2=[1], map_2=[2], &
252 filter_eps=bs_env%eps_filter, move_data=.true.)
262 mat_chi_gamma_tau(i_t)%matrix, bs_env%para_env)
264 CALL write_matrix(mat_chi_gamma_tau(i_t)%matrix, i_t, bs_env%chi_name, &
265 bs_env%fm_RI_RI, qs_env)
267 CALL destroy_tensors_chi(t_2c_gocc, t_2c_gvir, t_3c_for_gocc, t_3c_for_gvir, &
268 t_3c_x_gocc, t_3c_x_gvir, t_3c_x_gocc_2, t_3c_x_gvir_2)
270 IF (bs_env%unit_nr > 0)
THEN
271 WRITE (bs_env%unit_nr,
'(T2,A,I13,A,I3,A,F7.1,A)') &
272 χτ
'Computed (i,k=0) for time point', i_t,
' /', bs_env%num_time_freq_points, &
278 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr,
'(A)')
' '
280 CALL timestop(handle)
282 END SUBROUTINE get_mat_chi_gamma_tau
291 SUBROUTINE fm_read(fm, bs_env, mat_name, idx)
294 CHARACTER(LEN=*) :: mat_name
297 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fm_read'
299 CHARACTER(LEN=default_string_length) :: f_chi
300 INTEGER :: handle, unit_nr
302 CALL timeset(routinen, handle)
305 IF (bs_env%para_env%is_source())
THEN
308 WRITE (f_chi,
'(3A,I1,A)') trim(bs_env%prefix), trim(mat_name),
"_0",
idx,
".matrix"
309 ELSE IF (
idx < 100)
THEN
310 WRITE (f_chi,
'(3A,I2,A)') trim(bs_env%prefix), trim(mat_name),
"_",
idx,
".matrix"
312 cpabort(
'Please implement more than 99 time/frequency points.')
315 CALL open_file(file_name=trim(f_chi), file_action=
"READ", file_form=
"UNFORMATTED", &
316 file_position=
"REWIND", file_status=
"OLD", unit_number=unit_nr)
322 IF (bs_env%para_env%is_source())
CALL close_file(unit_number=unit_nr)
324 CALL timestop(handle)
326 END SUBROUTINE fm_read
340 SUBROUTINE create_tensors_chi(t_2c_Gocc, t_2c_Gvir, t_3c_for_Gocc, t_3c_for_Gvir, &
341 t_3c_x_Gocc, t_3c_x_Gvir, t_3c_x_Gocc_2, t_3c_x_Gvir_2, bs_env)
343 TYPE(dbt_type) :: t_2c_gocc, t_2c_gvir, t_3c_for_gocc, &
344 t_3c_for_gvir, t_3c_x_gocc, &
345 t_3c_x_gvir, t_3c_x_gocc_2, &
349 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_tensors_chi'
353 CALL timeset(routinen, handle)
355 CALL dbt_create(bs_env%t_G, t_2c_gocc)
356 CALL dbt_create(bs_env%t_G, t_2c_gvir)
357 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_for_gocc)
358 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_for_gvir)
359 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_x_gocc)
360 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_x_gvir)
361 CALL dbt_create(bs_env%t_RI__AO_AO, t_3c_x_gocc_2)
362 CALL dbt_create(bs_env%t_RI__AO_AO, t_3c_x_gvir_2)
364 CALL timestop(handle)
366 END SUBROUTINE create_tensors_chi
379 SUBROUTINE destroy_tensors_chi(t_2c_Gocc, t_2c_Gvir, t_3c_for_Gocc, t_3c_for_Gvir, &
380 t_3c_x_Gocc, t_3c_x_Gvir, t_3c_x_Gocc_2, t_3c_x_Gvir_2)
381 TYPE(dbt_type) :: t_2c_gocc, t_2c_gvir, t_3c_for_gocc, &
382 t_3c_for_gvir, t_3c_x_gocc, &
383 t_3c_x_gvir, t_3c_x_gocc_2, &
386 CHARACTER(LEN=*),
PARAMETER :: routinen =
'destroy_tensors_chi'
390 CALL timeset(routinen, handle)
392 CALL dbt_destroy(t_2c_gocc)
393 CALL dbt_destroy(t_2c_gvir)
394 CALL dbt_destroy(t_3c_for_gocc)
395 CALL dbt_destroy(t_3c_for_gvir)
396 CALL dbt_destroy(t_3c_x_gocc)
397 CALL dbt_destroy(t_3c_x_gvir)
398 CALL dbt_destroy(t_3c_x_gocc_2)
399 CALL dbt_destroy(t_3c_x_gvir_2)
401 CALL timestop(handle)
403 END SUBROUTINE destroy_tensors_chi
413 SUBROUTINE write_matrix(matrix, matrix_index, matrix_name, fm, qs_env)
415 INTEGER :: matrix_index
416 CHARACTER(LEN=*) :: matrix_name
420 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_matrix'
424 CALL timeset(routinen, handle)
430 CALL fm_write(fm, matrix_index, matrix_name, qs_env)
432 CALL timestop(handle)
434 END SUBROUTINE write_matrix
443 SUBROUTINE fm_write(fm, matrix_index, matrix_name, qs_env)
445 INTEGER :: matrix_index
446 CHARACTER(LEN=*) :: matrix_name
449 CHARACTER(LEN=*),
PARAMETER :: key =
'PROPERTIES%BANDSTRUCTURE%GW%PRINT%RESTART', &
450 routinen =
'fm_write'
452 CHARACTER(LEN=default_string_length) :: filename
453 INTEGER :: handle, unit_nr
457 CALL timeset(routinen, handle)
465 IF (matrix_index < 10)
THEN
466 WRITE (filename,
'(3A,I1)')
"RESTART_", matrix_name,
"_0", matrix_index
467 ELSE IF (matrix_index < 100)
THEN
468 WRITE (filename,
'(3A,I2)')
"RESTART_", matrix_name,
"_", matrix_index
470 cpabort(
'Please implement more than 99 time/frequency points.')
474 file_form=
"UNFORMATTED", middle_name=trim(filename), &
475 file_position=
"REWIND", file_action=
"WRITE")
478 IF (unit_nr > 0)
THEN
483 CALL timestop(handle)
485 END SUBROUTINE fm_write
496 SUBROUTINE g_occ_vir(bs_env, tau, fm_G_Gamma, ispin, occ, vir)
503 CHARACTER(LEN=*),
PARAMETER :: routinen =
'G_occ_vir'
505 INTEGER :: handle, homo, i_row_local, j_col, &
506 j_col_local, n_mo, ncol_local, &
508 INTEGER,
DIMENSION(:),
POINTER :: col_indices
509 REAL(kind=
dp) :: tau_e
511 CALL timeset(routinen, handle)
513 cpassert(occ .NEQV. vir)
516 nrow_local=nrow_local, &
517 ncol_local=ncol_local, &
518 col_indices=col_indices)
521 homo = bs_env%n_occ(ispin)
523 CALL cp_fm_to_fm(bs_env%fm_mo_coeff_Gamma(ispin), bs_env%fm_work_mo(1))
525 DO i_row_local = 1, nrow_local
526 DO j_col_local = 1, ncol_local
528 j_col = col_indices(j_col_local)
530 tau_e = abs(tau*0.5_dp*(bs_env%eigenval_scf_Gamma(j_col, ispin) - bs_env%e_fermi(ispin)))
532 IF (tau_e < bs_env%stabilize_exp)
THEN
533 bs_env%fm_work_mo(1)%local_data(i_row_local, j_col_local) = &
534 bs_env%fm_work_mo(1)%local_data(i_row_local, j_col_local)*exp(-tau_e)
536 bs_env%fm_work_mo(1)%local_data(i_row_local, j_col_local) = 0.0_dp
539 IF ((occ .AND. j_col > homo) .OR. (vir .AND. j_col <= homo))
THEN
540 bs_env%fm_work_mo(1)%local_data(i_row_local, j_col_local) = 0.0_dp
546 CALL parallel_gemm(transa=
"N", transb=
"T", m=n_mo, n=n_mo, k=n_mo, alpha=1.0_dp, &
547 matrix_a=bs_env%fm_work_mo(1), matrix_b=bs_env%fm_work_mo(1), &
548 beta=0.0_dp, matrix_c=fm_g_gamma)
550 CALL timestop(handle)
552 END SUBROUTINE g_occ_vir
566 TYPE(dbt_type) :: t_3c
567 INTEGER,
DIMENSION(2),
OPTIONAL :: atoms_ao_1, atoms_ao_2, atoms_ri
569 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_3c_integrals'
572 INTEGER,
DIMENSION(2) :: my_atoms_ao_1, my_atoms_ao_2, my_atoms_ri
573 TYPE(dbt_type),
ALLOCATABLE,
DIMENSION(:, :) :: t_3c_array
575 CALL timeset(routinen, handle)
580 ALLOCATE (t_3c_array(1, 1))
581 CALL dbt_create(t_3c, t_3c_array(1, 1))
583 IF (
PRESENT(atoms_ao_1))
THEN
584 my_atoms_ao_1 = atoms_ao_1
586 my_atoms_ao_1 = [1, bs_env%n_atom]
588 IF (
PRESENT(atoms_ao_2))
THEN
589 my_atoms_ao_2 = atoms_ao_2
591 my_atoms_ao_2 = [1, bs_env%n_atom]
593 IF (
PRESENT(atoms_ri))
THEN
594 my_atoms_ri = atoms_ri
596 my_atoms_ri = [1, bs_env%n_atom]
603 int_eps=bs_env%eps_filter, &
604 basis_i=bs_env%basis_set_RI, &
605 basis_j=bs_env%basis_set_AO, &
606 basis_k=bs_env%basis_set_AO, &
607 potential_parameter=bs_env%ri_metric, &
609 bounds_j=atoms_ao_1, &
610 bounds_k=atoms_ao_2, &
611 desymmetrize=.false.)
613 CALL dbt_copy(t_3c_array(1, 1), t_3c, move_data=.true.)
615 CALL dbt_destroy(t_3c_array(1, 1))
616 DEALLOCATE (t_3c_array)
618 CALL timestop(handle)
632 SUBROUTINE g_times_3c(t_3c_for_G, t_G, t_M, bs_env, atoms_AO_1, atoms_AO_2, atoms_IL)
633 TYPE(dbt_type) :: t_3c_for_g, t_g, t_m
635 INTEGER,
DIMENSION(2) :: atoms_ao_1, atoms_ao_2, atoms_il
637 CHARACTER(LEN=*),
PARAMETER :: routinen =
'G_times_3c'
640 INTEGER,
DIMENSION(2) :: bounds_il, bounds_l
641 INTEGER,
DIMENSION(2, 2) :: bounds_k
643 CALL timeset(routinen, handle)
649 bounds_il(1:2) = [bs_env%i_ao_start_from_atom(atoms_il(1)), &
650 bs_env%i_ao_end_from_atom(atoms_il(2))]
651 bounds_k(1:2, 1) = [1, bs_env%n_RI]
652 bounds_k(1:2, 2) = [bs_env%i_ao_start_from_atom(atoms_ao_2(1)), &
653 bs_env%i_ao_end_from_atom(atoms_ao_2(2))]
654 bounds_l(1:2) = [bs_env%i_ao_start_from_atom(atoms_ao_1(1)), &
655 bs_env%i_ao_end_from_atom(atoms_ao_1(2))]
657 CALL dbt_contract(alpha=1.0_dp, &
658 tensor_1=t_3c_for_g, &
662 contract_1=[3], notcontract_1=[1, 2], map_1=[1, 2], &
663 contract_2=[2], notcontract_2=[1], map_2=[3], &
664 bounds_1=bounds_il, &
667 filter_eps=bs_env%eps_filter)
669 CALL dbt_clear(t_3c_for_g)
671 CALL timestop(handle)
673 END SUBROUTINE g_times_3c
683 SUBROUTINE check_dist(atoms_1, atoms_2, qs_env, bs_env, dist_too_long)
684 INTEGER,
DIMENSION(2) :: atoms_1, atoms_2
687 LOGICAL :: dist_too_long
689 CHARACTER(LEN=*),
PARAMETER :: routinen =
'check_dist'
691 INTEGER :: atom_1, atom_2, handle
692 REAL(
dp) :: abs_rab, min_dist_ao_atoms
693 REAL(kind=
dp),
DIMENSION(3) :: rab
697 CALL timeset(routinen, handle)
699 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
701 min_dist_ao_atoms = 1.0e5_dp
702 DO atom_1 = atoms_1(1), atoms_1(2)
703 DO atom_2 = atoms_2(1), atoms_2(2)
705 rab =
pbc(particle_set(atom_1)%r(1:3), particle_set(atom_2)%r(1:3), cell)
707 abs_rab = sqrt(rab(1)**2 + rab(2)**2 + rab(3)**2)
709 min_dist_ao_atoms = min(min_dist_ao_atoms, abs_rab)
714 dist_too_long = (min_dist_ao_atoms > bs_env%max_dist_AO_atoms)
716 CALL timestop(handle)
718 END SUBROUTINE check_dist
727 SUBROUTINE get_w_mic(bs_env, qs_env, mat_chi_Gamma_tau, fm_W_MIC_time)
730 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_chi_gamma_tau
731 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
733 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_W_MIC'
737 CALL timeset(routinen, handle)
739 IF (bs_env%all_W_exist)
THEN
740 CALL read_w_mic_time(bs_env, mat_chi_gamma_tau, fm_w_mic_time)
742 CALL compute_w_mic(bs_env, qs_env, mat_chi_gamma_tau, fm_w_mic_time)
745 CALL timestop(handle)
747 END SUBROUTINE get_w_mic
756 SUBROUTINE compute_v_k_by_lattice_sum(bs_env, qs_env, fm_V_kp, ikp_batch)
759 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_v_kp
762 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_V_k_by_lattice_sum'
764 INTEGER :: handle, ikp, ikp_end, ikp_start, &
765 nkp_chi_eps_w_batch, re_im
768 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_v_kp
770 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
772 CALL timeset(routinen, handle)
774 nkp_chi_eps_w_batch = bs_env%nkp_chi_eps_W_batch
776 ikp_start = (ikp_batch - 1)*bs_env%nkp_chi_eps_W_batch + 1
777 ikp_end = min(ikp_batch*bs_env%nkp_chi_eps_W_batch, bs_env%kpoints_chi_eps_W%nkp)
780 ALLOCATE (mat_v_kp(ikp_start:ikp_end, 2))
783 DO ikp = ikp_start, ikp_end
784 NULLIFY (mat_v_kp(ikp, re_im)%matrix)
785 ALLOCATE (mat_v_kp(ikp, re_im)%matrix)
786 CALL dbcsr_create(mat_v_kp(ikp, re_im)%matrix, template=bs_env%mat_RI_RI%matrix)
788 CALL dbcsr_set(mat_v_kp(ikp, re_im)%matrix, 0.0_dp)
793 particle_set=particle_set, &
795 qs_kind_set=qs_kind_set, &
796 atomic_kind_set=atomic_kind_set)
798 IF (ikp_end .LE. bs_env%nkp_chi_eps_W_orig)
THEN
801 bs_env%kpoints_chi_eps_W%nkp_grid = bs_env%nkp_grid_chi_eps_W_orig
803 ELSE IF (ikp_start > bs_env%nkp_chi_eps_W_orig .AND. &
804 ikp_end .LE. bs_env%nkp_chi_eps_W_orig_plus_extra)
THEN
807 bs_env%kpoints_chi_eps_W%nkp_grid = bs_env%nkp_grid_chi_eps_W_extra
811 cpabort(
"Error with k-point parallelization.")
816 bs_env%kpoints_chi_eps_W, &
817 basis_type=
"RI_AUX", &
819 particle_set=particle_set, &
820 qs_kind_set=qs_kind_set, &
821 atomic_kind_set=atomic_kind_set, &
822 size_lattice_sum=bs_env%size_lattice_sum_V, &
824 ikp_start=ikp_start, &
827 bs_env%kpoints_chi_eps_W%nkp_grid = bs_env%nkp_grid_chi_eps_W_orig
829 ALLOCATE (fm_v_kp(ikp_start:ikp_end, 2))
831 DO ikp = ikp_start, ikp_end
832 CALL cp_fm_create(fm_v_kp(ikp, re_im), bs_env%fm_RI_RI%matrix_struct)
837 DEALLOCATE (mat_v_kp)
839 CALL timestop(handle)
841 END SUBROUTINE compute_v_k_by_lattice_sum
852 SUBROUTINE compute_minvvsqrt_vsqrt(bs_env, qs_env, fm_V_kp, cfm_V_sqrt_ikp, &
853 cfm_M_inv_V_sqrt_ikp, ikp)
856 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_v_kp
857 TYPE(
cp_cfm_type) :: cfm_v_sqrt_ikp, cfm_m_inv_v_sqrt_ikp
860 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_MinvVsqrt_Vsqrt'
862 INTEGER :: handle, info, n_ri
864 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_m_ikp
866 CALL timeset(routinen, handle)
872 n_ri, bs_env%ri_metric, do_kpoints=.true., &
873 kpoints=bs_env%kpoints_chi_eps_W, &
874 regularization_ri=bs_env%regularization_RI, ikp_ext=ikp, &
875 do_build_cell_index=(ikp == 1))
878 CALL cp_cfm_create(cfm_v_sqrt_ikp, fm_v_kp(ikp, 1)%matrix_struct)
879 CALL cp_cfm_create(cfm_m_inv_v_sqrt_ikp, fm_v_kp(ikp, 1)%matrix_struct)
881 CALL cp_cfm_create(cfm_m_inv_ikp, fm_v_kp(ikp, 1)%matrix_struct)
883 CALL cp_fm_to_cfm(fm_m_ikp(1, 1), fm_m_ikp(1, 2), cfm_m_inv_ikp)
884 CALL cp_fm_to_cfm(fm_v_kp(ikp, 1), fm_v_kp(ikp, 2), cfm_v_sqrt_ikp)
900 CALL cp_cfm_power(cfm_work, threshold=bs_env%eps_eigval_mat_RI, exponent=-1.0_dp)
909 CALL clean_lower_part(cfm_v_sqrt_ikp)
912 CALL cp_cfm_power(cfm_work, threshold=0.0_dp, exponent=0.5_dp)
918 CALL parallel_gemm(
"N",
"C", n_ri, n_ri, n_ri,
z_one, cfm_m_inv_ikp, cfm_v_sqrt_ikp, &
919 z_zero, cfm_m_inv_v_sqrt_ikp)
923 CALL timestop(handle)
925 END SUBROUTINE compute_minvvsqrt_vsqrt
933 SUBROUTINE read_w_mic_time(bs_env, mat_chi_Gamma_tau, fm_W_MIC_time)
935 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_chi_gamma_tau
936 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
938 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_W_MIC_time'
940 INTEGER :: handle, i_t
943 CALL timeset(routinen, handle)
946 CALL create_fm_w_mic_time(bs_env, fm_w_mic_time)
948 DO i_t = 1, bs_env%num_time_freq_points
952 CALL fm_read(fm_w_mic_time(i_t), bs_env, bs_env%W_time_name, i_t)
954 IF (bs_env%unit_nr > 0)
THEN
955 WRITE (bs_env%unit_nr,
'(T2,A,I5,A,I3,A,F7.1,A)') &
956 τ
'Read W^MIC(i) from file for time point ', i_t,
' /', bs_env%num_time_freq_points, &
962 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr,
'(A)')
' '
967 CALL cp_fm_create(bs_env%fm_W_MIC_freq_zero, bs_env%fm_W_MIC_freq%matrix_struct)
969 CALL fm_read(bs_env%fm_W_MIC_freq_zero, bs_env,
"W_freq_rtp", 0)
970 IF (bs_env%unit_nr > 0)
THEN
971 WRITE (bs_env%unit_nr,
'(T2,A,I3,A,I3,A,F7.1,A)') &
972 'Read W^MIC(f=0) from file for freq. point ', 1,
' /', 1, &
977 CALL timestop(handle)
979 END SUBROUTINE read_w_mic_time
988 SUBROUTINE compute_w_mic(bs_env, qs_env, mat_chi_Gamma_tau, fm_W_MIC_time)
991 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_chi_gamma_tau
992 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
994 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_W_MIC'
996 INTEGER :: handle, i_t, ikp, ikp_batch, &
999 TYPE(
cp_cfm_type) :: cfm_m_inv_v_sqrt_ikp, cfm_v_sqrt_ikp
1000 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_v_kp
1002 CALL timeset(routinen, handle)
1004 CALL create_fm_w_mic_time(bs_env, fm_w_mic_time)
1006 DO ikp_batch = 1, bs_env%num_chi_eps_W_batches
1011 CALL compute_v_k_by_lattice_sum(bs_env, qs_env, fm_v_kp, ikp_batch)
1013 DO ikp_in_batch = 1, bs_env%nkp_chi_eps_W_batch
1015 ikp = (ikp_batch - 1)*bs_env%nkp_chi_eps_W_batch + ikp_in_batch
1017 IF (ikp > bs_env%nkp_chi_eps_W_orig_plus_extra) cycle
1019 CALL compute_minvvsqrt_vsqrt(bs_env, qs_env, fm_v_kp, &
1020 cfm_v_sqrt_ikp, cfm_m_inv_v_sqrt_ikp, ikp)
1022 CALL bs_env%para_env%sync()
1026 DO j_w = 1, bs_env%num_time_freq_points
1029 IF (bs_env%approx_kp_extrapol .AND. j_w > 1 .AND. &
1030 ikp > bs_env%nkp_chi_eps_W_orig) cycle
1032 CALL compute_fm_w_mic_freq_j(bs_env, qs_env, bs_env%fm_W_MIC_freq, j_w, ikp, &
1033 mat_chi_gamma_tau, cfm_m_inv_v_sqrt_ikp, &
1037 CALL fourier_transform_w_to_t(bs_env, fm_w_mic_time, bs_env%fm_W_MIC_freq, j_w)
1043 DEALLOCATE (fm_v_kp)
1045 IF (bs_env%unit_nr > 0)
THEN
1046 WRITE (bs_env%unit_nr,
'(T2,A,I12,A,I3,A,F7.1,A)') &
1047 τ
'Computed W(i,k) for k-point batch', &
1048 ikp_batch,
' /', bs_env%num_chi_eps_W_batches, &
1054 IF (bs_env%approx_kp_extrapol)
THEN
1055 CALL apply_extrapol_factor(bs_env, fm_w_mic_time)
1059 CALL multiply_fm_w_mic_time_with_minv_gamma(bs_env, qs_env, fm_w_mic_time)
1061 DO i_t = 1, bs_env%num_time_freq_points
1062 CALL fm_write(fm_w_mic_time(i_t), i_t, bs_env%W_time_name, qs_env)
1072 CALL cp_fm_create(bs_env%fm_W_MIC_freq_zero, bs_env%fm_W_MIC_freq%matrix_struct)
1076 DO i_t = 1, bs_env%num_time_freq_points
1079 bs_env%imag_time_weights_freq_zero(i_t), fm_w_mic_time(i_t))
1082 CALL fm_write(bs_env%fm_W_MIC_freq_zero, 0,
"W_freq_rtp", qs_env)
1084 IF (bs_env%unit_nr > 0)
THEN
1085 WRITE (bs_env%unit_nr,
'(T2,A,I11,A,I3,A,F7.1,A)') &
1086 'Computed W(f=0,k) for k-point batch', &
1092 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr,
'(A)')
' '
1094 CALL timestop(handle)
1096 END SUBROUTINE compute_w_mic
1109 SUBROUTINE compute_fm_w_mic_freq_j(bs_env, qs_env, fm_W_MIC_freq_j, j_w, ikp, mat_chi_Gamma_tau, &
1110 cfm_M_inv_V_sqrt_ikp, cfm_V_sqrt_ikp)
1115 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_chi_gamma_tau
1116 TYPE(
cp_cfm_type) :: cfm_m_inv_v_sqrt_ikp, cfm_v_sqrt_ikp
1118 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_fm_W_MIC_freq_j'
1121 TYPE(
cp_cfm_type) :: cfm_chi_ikp_freq_j, cfm_w_ikp_freq_j
1123 CALL timeset(routinen, handle)
1126 CALL compute_fm_chi_gamma_freq(bs_env, bs_env%fm_chi_Gamma_freq, j_w, mat_chi_gamma_tau)
1132 ikp, qs_env, bs_env%kpoints_chi_eps_W,
"RI_AUX")
1135 CALL cp_cfm_power(cfm_chi_ikp_freq_j, threshold=0.0_dp, exponent=1.0_dp)
1139 CALL compute_cfm_w_ikp_freq_j(bs_env, cfm_chi_ikp_freq_j, cfm_v_sqrt_ikp, &
1140 cfm_m_inv_v_sqrt_ikp, cfm_w_ikp_freq_j)
1143 SELECT CASE (bs_env%approx_kp_extrapol)
1147 bs_env%kpoints_chi_eps_W,
"RI_AUX")
1158 cfm_w_ikp_freq_j, ikp, bs_env%kpoints_chi_eps_W, &
1161 IF (ikp .LE. bs_env%nkp_chi_eps_W_orig)
THEN
1163 cfm_w_ikp_freq_j, ikp, bs_env%kpoints_chi_eps_W, &
1164 "RI_AUX", wkp_ext=bs_env%wkp_orig)
1170 IF (ikp .LE. bs_env%nkp_chi_eps_W_orig)
THEN
1172 ikp, bs_env%kpoints_chi_eps_W,
"RI_AUX", &
1173 wkp_ext=bs_env%wkp_orig)
1179 CALL timestop(handle)
1181 END SUBROUTINE compute_fm_w_mic_freq_j
1187 SUBROUTINE clean_lower_part(cfm_mat)
1190 CHARACTER(LEN=*),
PARAMETER :: routinen =
'clean_lower_part'
1192 INTEGER :: handle, i_row, j_col, j_global, &
1193 ncol_local, nrow_local
1194 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1196 CALL timeset(routinen, handle)
1199 nrow_local=nrow_local, ncol_local=ncol_local, &
1200 row_indices=row_indices, col_indices=col_indices)
1202 DO j_col = 1, ncol_local
1203 j_global = col_indices(j_col)
1204 DO i_row = 1, nrow_local
1205 IF (j_global < row_indices(i_row)) cfm_mat%local_data(i_row, j_col) =
z_zero
1209 CALL timestop(handle)
1211 END SUBROUTINE clean_lower_part
1218 SUBROUTINE apply_extrapol_factor(bs_env, fm_W_MIC_time)
1220 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
1222 CHARACTER(LEN=*),
PARAMETER :: routinen =
'apply_extrapol_factor'
1224 INTEGER :: handle, i, i_t, j, ncol_local, nrow_local
1225 REAL(kind=
dp) :: extrapol_factor, w_extra_1, w_no_extra_1
1227 CALL timeset(routinen, handle)
1229 CALL cp_fm_get_info(matrix=fm_w_mic_time(1), nrow_local=nrow_local, ncol_local=ncol_local)
1231 DO i_t = 1, bs_env%num_time_freq_points
1232 DO j = 1, ncol_local
1233 DO i = 1, nrow_local
1235 w_extra_1 = bs_env%fm_W_MIC_freq_1_extra%local_data(i, j)
1236 w_no_extra_1 = bs_env%fm_W_MIC_freq_1_no_extra%local_data(i, j)
1238 IF (abs(w_no_extra_1) > 1.0e-13)
THEN
1239 extrapol_factor = abs(w_extra_1/w_no_extra_1)
1241 extrapol_factor = 1.0_dp
1245 IF (extrapol_factor > 10.0_dp) extrapol_factor = 1.0_dp
1247 fm_w_mic_time(i_t)%local_data(i, j) = fm_w_mic_time(i_t)%local_data(i, j) &
1253 CALL timestop(handle)
1255 END SUBROUTINE apply_extrapol_factor
1264 SUBROUTINE compute_fm_chi_gamma_freq(bs_env, fm_chi_Gamma_freq, j_w, mat_chi_Gamma_tau)
1268 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_chi_gamma_tau
1270 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_fm_chi_Gamma_freq'
1272 INTEGER :: handle, i_t
1273 REAL(kind=
dp) :: freq_j, time_i, weight_ij
1275 CALL timeset(routinen, handle)
1277 CALL dbcsr_set(bs_env%mat_RI_RI%matrix, 0.0_dp)
1279 freq_j = bs_env%imag_freq_points(j_w)
1281 DO i_t = 1, bs_env%num_time_freq_points
1283 time_i = bs_env%imag_time_points(i_t)
1284 weight_ij = bs_env%weights_cos_t_to_w(j_w, i_t)
1287 CALL dbcsr_add(bs_env%mat_RI_RI%matrix, mat_chi_gamma_tau(i_t)%matrix, &
1288 1.0_dp, cos(time_i*freq_j)*weight_ij)
1294 CALL timestop(handle)
1296 END SUBROUTINE compute_fm_chi_gamma_freq
1307 SUBROUTINE mat_ikp_from_mat_gamma(mat_ikp_re, mat_ikp_im, mat_Gamma, kpoints, ikp, qs_env)
1308 TYPE(
dbcsr_type) :: mat_ikp_re, mat_ikp_im, mat_gamma
1313 CHARACTER(LEN=*),
PARAMETER :: routinen =
'mat_ikp_from_mat_Gamma'
1315 INTEGER :: col, handle, i_cell, j_cell, num_cells, &
1317 INTEGER,
DIMENSION(:, :),
POINTER :: index_to_cell
1318 LOGICAL :: f, i_cell_is_the_minimum_image_cell
1319 REAL(kind=
dp) :: abs_rab_cell_i, abs_rab_cell_j, arg
1320 REAL(kind=
dp),
DIMENSION(3) :: cell_vector, cell_vector_j, rab_cell_i, &
1322 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat
1323 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block_im, block_re, data_block
1328 CALL timeset(routinen, handle)
1336 NULLIFY (cell, particle_set)
1337 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
1340 index_to_cell => kpoints%index_to_cell
1342 num_cells =
SIZE(index_to_cell, 2)
1344 DO i_cell = 1, num_cells
1350 cell_vector(1:3) = matmul(hmat, real(index_to_cell(1:3, i_cell),
dp))
1352 rab_cell_i(1:3) =
pbc(particle_set(row)%r(1:3), cell) - &
1353 (
pbc(particle_set(col)%r(1:3), cell) + cell_vector(1:3))
1354 abs_rab_cell_i = sqrt(rab_cell_i(1)**2 + rab_cell_i(2)**2 + rab_cell_i(3)**2)
1357 i_cell_is_the_minimum_image_cell = .true.
1358 DO j_cell = 1, num_cells
1359 cell_vector_j(1:3) = matmul(hmat, real(index_to_cell(1:3, j_cell),
dp))
1360 rab_cell_j(1:3) =
pbc(particle_set(row)%r(1:3), cell) - &
1361 (
pbc(particle_set(col)%r(1:3), cell) + cell_vector_j(1:3))
1362 abs_rab_cell_j = sqrt(rab_cell_j(1)**2 + rab_cell_j(2)**2 + rab_cell_j(3)**2)
1364 IF (abs_rab_cell_i > abs_rab_cell_j + 1.0e-6_dp)
THEN
1365 i_cell_is_the_minimum_image_cell = .false.
1369 IF (i_cell_is_the_minimum_image_cell)
THEN
1370 NULLIFY (block_re, block_im)
1371 CALL dbcsr_get_block_p(matrix=mat_ikp_re, row=row, col=col, block=block_re, found=f)
1372 CALL dbcsr_get_block_p(matrix=mat_ikp_im, row=row, col=col, block=block_im, found=f)
1373 cpassert(all(abs(block_re) < 1.0e-10_dp))
1374 cpassert(all(abs(block_im) < 1.0e-10_dp))
1376 arg = real(index_to_cell(1, i_cell),
dp)*kpoints%xkp(1, ikp) + &
1377 REAL(index_to_cell(2, i_cell),
dp)*kpoints%xkp(2, ikp) + &
1378 REAL(index_to_cell(3, i_cell),
dp)*kpoints%xkp(3, ikp)
1380 block_re(:, :) = cos(
twopi*arg)*data_block(:, :)
1381 block_im(:, :) = sin(
twopi*arg)*data_block(:, :)
1389 CALL timestop(handle)
1391 END SUBROUTINE mat_ikp_from_mat_gamma
1401 SUBROUTINE compute_cfm_w_ikp_freq_j(bs_env, cfm_chi_ikp_freq_j, cfm_V_sqrt_ikp, &
1402 cfm_M_inv_V_sqrt_ikp, cfm_W_ikp_freq_j)
1405 TYPE(
cp_cfm_type) :: cfm_chi_ikp_freq_j, cfm_v_sqrt_ikp, &
1406 cfm_m_inv_v_sqrt_ikp, cfm_w_ikp_freq_j
1408 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_cfm_W_ikp_freq_j'
1410 INTEGER :: handle, info, n_ri
1413 CALL timeset(routinen, handle)
1415 CALL cp_cfm_create(cfm_work, cfm_chi_ikp_freq_j%matrix_struct)
1422 cfm_chi_ikp_freq_j, cfm_m_inv_v_sqrt_ikp,
z_zero, cfm_work)
1426 CALL cp_cfm_create(cfm_eps_ikp_freq_j, cfm_work%matrix_struct)
1428 cfm_m_inv_v_sqrt_ikp, cfm_work,
z_zero, cfm_eps_ikp_freq_j)
1431 CALL cfm_add_on_diag(cfm_eps_ikp_freq_j,
z_one)
1444 CALL cfm_add_on_diag(cfm_eps_ikp_freq_j, -
z_one)
1447 CALL parallel_gemm(
'N',
'N', n_ri, n_ri, n_ri,
z_one, cfm_eps_ikp_freq_j, cfm_v_sqrt_ikp, &
1451 CALL cp_cfm_create(cfm_w_ikp_freq_j, cfm_work%matrix_struct)
1453 z_zero, cfm_w_ikp_freq_j)
1458 CALL timestop(handle)
1460 END SUBROUTINE compute_cfm_w_ikp_freq_j
1467 SUBROUTINE cfm_add_on_diag(cfm, alpha)
1470 COMPLEX(KIND=dp) :: alpha
1472 CHARACTER(LEN=*),
PARAMETER :: routinen =
'cfm_add_on_diag'
1474 INTEGER :: handle, i_row, j_col, j_global, &
1475 ncol_local, nrow_local
1476 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
1478 CALL timeset(routinen, handle)
1481 nrow_local=nrow_local, &
1482 ncol_local=ncol_local, &
1483 row_indices=row_indices, &
1484 col_indices=col_indices)
1487 DO j_col = 1, ncol_local
1488 j_global = col_indices(j_col)
1489 DO i_row = 1, nrow_local
1490 IF (j_global == row_indices(i_row))
THEN
1491 cfm%local_data(i_row, j_col) = cfm%local_data(i_row, j_col) + alpha
1496 CALL timestop(handle)
1498 END SUBROUTINE cfm_add_on_diag
1505 SUBROUTINE create_fm_w_mic_time(bs_env, fm_W_MIC_time)
1507 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
1509 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_fm_W_MIC_time'
1511 INTEGER :: handle, i_t
1513 CALL timeset(routinen, handle)
1515 ALLOCATE (fm_w_mic_time(bs_env%num_time_freq_points))
1516 DO i_t = 1, bs_env%num_time_freq_points
1517 CALL cp_fm_create(fm_w_mic_time(i_t), bs_env%fm_RI_RI%matrix_struct)
1520 CALL timestop(handle)
1522 END SUBROUTINE create_fm_w_mic_time
1531 SUBROUTINE fourier_transform_w_to_t(bs_env, fm_W_MIC_time, fm_W_MIC_freq_j, j_w)
1533 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
1537 CHARACTER(LEN=*),
PARAMETER :: routinen =
'Fourier_transform_w_to_t'
1539 INTEGER :: handle, i_t
1540 REAL(kind=
dp) :: freq_j, time_i, weight_ij
1542 CALL timeset(routinen, handle)
1544 freq_j = bs_env%imag_freq_points(j_w)
1546 DO i_t = 1, bs_env%num_time_freq_points
1548 time_i = bs_env%imag_time_points(i_t)
1549 weight_ij = bs_env%weights_cos_w_to_t(i_t, j_w)
1553 beta=weight_ij*cos(time_i*freq_j), matrix_b=fm_w_mic_freq_j)
1557 CALL timestop(handle)
1559 END SUBROUTINE fourier_transform_w_to_t
1567 SUBROUTINE multiply_fm_w_mic_time_with_minv_gamma(bs_env, qs_env, fm_W_MIC_time)
1570 TYPE(
cp_fm_type),
DIMENSION(:) :: fm_w_mic_time
1572 CHARACTER(LEN=*),
PARAMETER :: routinen =
'multiply_fm_W_MIC_time_with_Minv_Gamma'
1574 INTEGER :: handle, i_t, n_ri, ndep
1576 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_minv_gamma
1578 CALL timeset(routinen, handle)
1582 CALL cp_fm_create(fm_work, fm_w_mic_time(1)%matrix_struct)
1586 bs_env%ri_metric, do_kpoints=.false.)
1588 CALL cp_fm_power(fm_minv_gamma(1, 1), fm_work, -1.0_dp, 0.0_dp, ndep)
1591 DO i_t = 1,
SIZE(fm_w_mic_time)
1593 CALL parallel_gemm(
'N',
'N', n_ri, n_ri, n_ri, 1.0_dp, fm_minv_gamma(1, 1), &
1594 fm_w_mic_time(i_t), 0.0_dp, fm_work)
1596 CALL parallel_gemm(
'N',
'N', n_ri, n_ri, n_ri, 1.0_dp, fm_work, &
1597 fm_minv_gamma(1, 1), 0.0_dp, fm_w_mic_time(i_t))
1604 CALL timestop(handle)
1606 END SUBROUTINE multiply_fm_w_mic_time_with_minv_gamma
1614 SUBROUTINE get_sigma_x(bs_env, qs_env, fm_Sigma_x_Gamma)
1617 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_sigma_x_gamma
1619 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_Sigma_x'
1621 INTEGER :: handle, ispin
1623 CALL timeset(routinen, handle)
1625 ALLOCATE (fm_sigma_x_gamma(bs_env%n_spin))
1626 DO ispin = 1, bs_env%n_spin
1627 CALL cp_fm_create(fm_sigma_x_gamma(ispin), bs_env%fm_s_Gamma%matrix_struct)
1630 IF (bs_env%Sigma_x_exists)
THEN
1631 DO ispin = 1, bs_env%n_spin
1632 CALL fm_read(fm_sigma_x_gamma(ispin), bs_env, bs_env%Sigma_x_name, ispin)
1635 CALL compute_sigma_x(bs_env, qs_env, fm_sigma_x_gamma)
1638 CALL timestop(handle)
1640 END SUBROUTINE get_sigma_x
1648 SUBROUTINE compute_sigma_x(bs_env, qs_env, fm_Sigma_x_Gamma)
1651 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_sigma_x_gamma
1653 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_Sigma_x'
1655 INTEGER :: handle, i_intval_idx, ispin, j_intval_idx
1656 INTEGER,
DIMENSION(2) :: i_atoms, j_atoms
1658 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: fm_vtr_gamma
1660 TYPE(dbt_type) :: t_2c_d, t_2c_sigma_x, t_2c_v, t_3c_x_v
1662 CALL timeset(routinen, handle)
1666 CALL dbt_create(bs_env%t_G, t_2c_d)
1667 CALL dbt_create(bs_env%t_W, t_2c_v)
1668 CALL dbt_create(bs_env%t_G, t_2c_sigma_x)
1669 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_x_v)
1670 CALL dbcsr_create(mat_sigma_x_gamma, template=bs_env%mat_ao_ao%matrix)
1674 bs_env%trunc_coulomb, do_kpoints=.false.)
1677 CALL multiply_fm_w_mic_time_with_minv_gamma(bs_env, qs_env, fm_vtr_gamma(:, 1))
1679 DO ispin = 1, bs_env%n_spin
1682 CALL g_occ_vir(bs_env, 0.0_dp, bs_env%fm_work_mo(2), ispin, occ=.true., vir=.false.)
1685 bs_env%mat_ao_ao_tensor%matrix, t_2c_d, bs_env, &
1686 bs_env%atoms_i_t_group)
1689 bs_env%mat_RI_RI_tensor%matrix, t_2c_v, bs_env, &
1690 bs_env%atoms_j_t_group)
1694 DO i_intval_idx = 1, bs_env%n_intervals_i
1695 DO j_intval_idx = 1, bs_env%n_intervals_j
1696 i_atoms = bs_env%i_atom_intervals(1:2, i_intval_idx)
1697 j_atoms = bs_env%j_atom_intervals(1:2, j_intval_idx)
1701 CALL compute_3c_and_contract_w(qs_env, bs_env, i_atoms, j_atoms, t_3c_x_v, t_2c_v)
1705 CALL contract_to_sigma(t_2c_d, t_3c_x_v, t_2c_sigma_x, i_atoms, j_atoms, &
1706 qs_env, bs_env, occ=.true., vir=.false., clear_w=.true.)
1712 mat_sigma_x_gamma, bs_env%para_env)
1714 CALL write_matrix(mat_sigma_x_gamma, ispin, bs_env%Sigma_x_name, &
1715 bs_env%fm_work_mo(1), qs_env)
1721 IF (bs_env%unit_nr > 0)
THEN
1722 WRITE (bs_env%unit_nr,
'(T2,A,T58,A,F7.1,A)') &
1723 Σ
'Computed ^x(k=0),',
' Execution time',
m_walltime() - t1,
' s'
1724 WRITE (bs_env%unit_nr,
'(A)')
' '
1728 CALL dbt_destroy(t_2c_d)
1729 CALL dbt_destroy(t_2c_v)
1730 CALL dbt_destroy(t_2c_sigma_x)
1731 CALL dbt_destroy(t_3c_x_v)
1734 CALL timestop(handle)
1736 END SUBROUTINE compute_sigma_x
1745 SUBROUTINE get_sigma_c(bs_env, qs_env, fm_W_MIC_time, fm_Sigma_c_Gamma_time)
1748 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
1749 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_sigma_c_gamma_time
1751 CHARACTER(LEN=*),
PARAMETER :: routinen =
'get_Sigma_c'
1753 INTEGER :: handle, i_intval_idx, i_t, ispin, &
1754 j_intval_idx, read_write_index
1755 INTEGER,
DIMENSION(2) :: i_atoms, j_atoms
1756 REAL(kind=
dp) :: t1, tau
1757 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_sigma_neg_tau, mat_sigma_pos_tau
1758 TYPE(dbt_type) :: t_2c_gocc, t_2c_gvir, &
1759 t_2c_sigma_neg_tau, &
1760 t_2c_sigma_pos_tau, t_2c_w, t_3c_x_w
1762 CALL timeset(routinen, handle)
1764 CALL create_mat_for_sigma_c(bs_env, t_2c_gocc, t_2c_gvir, t_2c_w, t_2c_sigma_neg_tau, &
1765 t_2c_sigma_pos_tau, t_3c_x_w, &
1766 mat_sigma_neg_tau, mat_sigma_pos_tau)
1768 DO i_t = 1, bs_env%num_time_freq_points
1770 DO ispin = 1, bs_env%n_spin
1774 read_write_index = i_t + (ispin - 1)*bs_env%num_time_freq_points
1777 IF (bs_env%Sigma_c_exists(i_t, ispin))
THEN
1778 CALL fm_read(bs_env%fm_work_mo(1), bs_env, bs_env%Sigma_p_name, read_write_index)
1779 CALL copy_fm_to_dbcsr(bs_env%fm_work_mo(1), mat_sigma_pos_tau(i_t, ispin)%matrix, &
1780 keep_sparsity=.false.)
1781 CALL fm_read(bs_env%fm_work_mo(1), bs_env, bs_env%Sigma_n_name, read_write_index)
1782 CALL copy_fm_to_dbcsr(bs_env%fm_work_mo(1), mat_sigma_neg_tau(i_t, ispin)%matrix, &
1783 keep_sparsity=.false.)
1784 IF (bs_env%unit_nr > 0)
THEN
1785 WRITE (bs_env%unit_nr,
'(T2,2A,I3,A,I3,A,F7.1,A)') Στ
'Read ^c(i,k=0) ', &
1786 'from file for time point ', i_t,
' /', bs_env%num_time_freq_points, &
1794 tau = bs_env%imag_time_points(i_t)
1796 CALL g_occ_vir(bs_env, tau, bs_env%fm_Gocc, ispin, occ=.true., vir=.false.)
1797 CALL g_occ_vir(bs_env, tau, bs_env%fm_Gvir, ispin, occ=.false., vir=.true.)
1801 bs_env%mat_ao_ao_tensor%matrix, t_2c_gocc, bs_env, &
1802 bs_env%atoms_i_t_group)
1804 bs_env%mat_ao_ao_tensor%matrix, t_2c_gvir, bs_env, &
1805 bs_env%atoms_i_t_group)
1807 bs_env%mat_RI_RI_tensor%matrix, t_2c_w, bs_env, &
1808 bs_env%atoms_j_t_group)
1812 DO i_intval_idx = 1, bs_env%n_intervals_i
1813 DO j_intval_idx = 1, bs_env%n_intervals_j
1814 i_atoms = bs_env%i_atom_intervals(1:2, i_intval_idx)
1815 j_atoms = bs_env%j_atom_intervals(1:2, j_intval_idx)
1817 IF (bs_env%skip_Sigma_occ(i_intval_idx, j_intval_idx) .AND. &
1818 bs_env%skip_Sigma_vir(i_intval_idx, j_intval_idx)) cycle
1822 CALL compute_3c_and_contract_w(qs_env, bs_env, i_atoms, j_atoms, t_3c_x_w, t_2c_w)
1826 CALL contract_to_sigma(t_2c_gocc, t_3c_x_w, t_2c_sigma_neg_tau, i_atoms, j_atoms, &
1827 qs_env, bs_env, occ=.true., vir=.false., clear_w=.false., &
1828 can_skip=bs_env%skip_Sigma_occ(i_intval_idx, j_intval_idx))
1831 CALL contract_to_sigma(t_2c_gvir, t_3c_x_w, t_2c_sigma_pos_tau, i_atoms, j_atoms, &
1832 qs_env, bs_env, occ=.false., vir=.true., clear_w=.true., &
1833 can_skip=bs_env%skip_Sigma_vir(i_intval_idx, j_intval_idx))
1841 mat_sigma_neg_tau(i_t, ispin)%matrix, bs_env%para_env)
1843 mat_sigma_pos_tau(i_t, ispin)%matrix, bs_env%para_env)
1845 CALL write_matrix(mat_sigma_pos_tau(i_t, ispin)%matrix, read_write_index, &
1846 bs_env%Sigma_p_name, bs_env%fm_work_mo(1), qs_env)
1847 CALL write_matrix(mat_sigma_neg_tau(i_t, ispin)%matrix, read_write_index, &
1848 bs_env%Sigma_n_name, bs_env%fm_work_mo(1), qs_env)
1850 IF (bs_env%unit_nr > 0)
THEN
1851 WRITE (bs_env%unit_nr,
'(T2,A,I10,A,I3,A,F7.1,A)') &
1852 Στ
'Computed ^c(i,k=0) for time point ', i_t,
' /', bs_env%num_time_freq_points, &
1860 IF (bs_env%unit_nr > 0)
WRITE (bs_env%unit_nr,
'(A)')
' '
1862 CALL fill_fm_sigma_c_gamma_time(fm_sigma_c_gamma_time, bs_env, &
1863 mat_sigma_pos_tau, mat_sigma_neg_tau)
1865 CALL print_skipping(bs_env)
1867 CALL destroy_mat_sigma_c(t_2c_gocc, t_2c_gvir, t_2c_w, t_2c_sigma_neg_tau, &
1868 t_2c_sigma_pos_tau, t_3c_x_w, fm_w_mic_time, &
1869 mat_sigma_neg_tau, mat_sigma_pos_tau)
1871 CALL delete_unnecessary_files(bs_env)
1873 CALL timestop(handle)
1875 END SUBROUTINE get_sigma_c
1889 SUBROUTINE create_mat_for_sigma_c(bs_env, t_2c_Gocc, t_2c_Gvir, t_2c_W, t_2c_Sigma_neg_tau, &
1890 t_2c_Sigma_pos_tau, t_3c_x_W, &
1891 mat_Sigma_neg_tau, mat_Sigma_pos_tau)
1894 TYPE(dbt_type) :: t_2c_gocc, t_2c_gvir, t_2c_w, &
1895 t_2c_sigma_neg_tau, &
1896 t_2c_sigma_pos_tau, t_3c_x_w
1897 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_sigma_neg_tau, mat_sigma_pos_tau
1899 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_mat_for_Sigma_c'
1901 INTEGER :: handle, i_t, ispin
1903 CALL timeset(routinen, handle)
1905 CALL dbt_create(bs_env%t_G, t_2c_gocc)
1906 CALL dbt_create(bs_env%t_G, t_2c_gvir)
1907 CALL dbt_create(bs_env%t_W, t_2c_w)
1908 CALL dbt_create(bs_env%t_G, t_2c_sigma_neg_tau)
1909 CALL dbt_create(bs_env%t_G, t_2c_sigma_pos_tau)
1910 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_x_w)
1912 NULLIFY (mat_sigma_neg_tau, mat_sigma_pos_tau)
1913 ALLOCATE (mat_sigma_neg_tau(bs_env%num_time_freq_points, bs_env%n_spin))
1914 ALLOCATE (mat_sigma_pos_tau(bs_env%num_time_freq_points, bs_env%n_spin))
1916 DO ispin = 1, bs_env%n_spin
1917 DO i_t = 1, bs_env%num_time_freq_points
1918 ALLOCATE (mat_sigma_neg_tau(i_t, ispin)%matrix)
1919 ALLOCATE (mat_sigma_pos_tau(i_t, ispin)%matrix)
1920 CALL dbcsr_create(mat_sigma_neg_tau(i_t, ispin)%matrix, template=bs_env%mat_ao_ao%matrix)
1921 CALL dbcsr_create(mat_sigma_pos_tau(i_t, ispin)%matrix, template=bs_env%mat_ao_ao%matrix)
1925 CALL timestop(handle)
1927 END SUBROUTINE create_mat_for_sigma_c
1938 SUBROUTINE compute_3c_and_contract_w(qs_env, bs_env, i_atoms, j_atoms, t_3c_x_W, t_2c_W)
1942 INTEGER,
DIMENSION(2) :: i_atoms, j_atoms
1943 TYPE(dbt_type) :: t_3c_x_w, t_2c_w
1945 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_3c_and_contract_W'
1947 INTEGER :: handle, ri_intval_idx
1948 INTEGER,
DIMENSION(2) :: bounds_j, ri_atoms
1949 TYPE(dbt_type) :: t_3c_for_w, t_3c_x_w_tmp
1951 CALL timeset(routinen, handle)
1953 CALL dbt_create(bs_env%t_RI__AO_AO, t_3c_x_w_tmp)
1954 CALL dbt_create(bs_env%t_RI__AO_AO, t_3c_for_w)
1956 bounds_j(1:2) = [bs_env%i_RI_start_from_atom(j_atoms(1)), &
1957 bs_env%i_RI_end_from_atom(j_atoms(2))]
1959 DO ri_intval_idx = 1, bs_env%n_intervals_inner_loop_atoms
1960 ri_atoms = bs_env%inner_loop_atom_intervals(1:2, ri_intval_idx)
1964 atoms_ao_1=i_atoms, atoms_ri=ri_atoms)
1967 CALL dbt_contract(alpha=1.0_dp, &
1969 tensor_2=t_3c_for_w, &
1971 tensor_3=t_3c_x_w_tmp, &
1972 contract_1=[2], notcontract_1=[1], map_1=[1], &
1973 contract_2=[1], notcontract_2=[2, 3], map_2=[2, 3], &
1974 bounds_2=bounds_j, &
1975 filter_eps=bs_env%eps_filter)
1980 CALL dbt_copy(t_3c_x_w_tmp, t_3c_x_w, order=[1, 2, 3], move_data=.true.)
1982 CALL dbt_destroy(t_3c_x_w_tmp)
1983 CALL dbt_destroy(t_3c_for_w)
1985 CALL timestop(handle)
1987 END SUBROUTINE compute_3c_and_contract_w
2003 SUBROUTINE contract_to_sigma(t_2c_G, t_3c_x_W, t_2c_Sigma, i_atoms, j_atoms, qs_env, bs_env, &
2004 occ, vir, clear_W, can_skip)
2005 TYPE(dbt_type) :: t_2c_g, t_3c_x_w, t_2c_sigma
2006 INTEGER,
DIMENSION(2) :: i_atoms, j_atoms
2009 LOGICAL :: occ, vir, clear_w
2010 LOGICAL,
OPTIONAL :: can_skip
2012 CHARACTER(LEN=*),
PARAMETER :: routinen =
'contract_to_Sigma'
2014 INTEGER :: handle, inner_loop_atoms_interval_index
2015 INTEGER(KIND=int_8) :: flop
2016 INTEGER,
DIMENSION(2) :: bounds_i, il_atoms
2017 REAL(kind=
dp) :: sign_sigma
2018 TYPE(dbt_type) :: t_3c_for_g, t_3c_x_g, t_3c_x_g_2
2020 CALL timeset(routinen, handle)
2022 cpassert(occ .EQV. (.NOT. vir))
2023 IF (occ) sign_sigma = -1.0_dp
2024 IF (vir) sign_sigma = 1.0_dp
2026 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_for_g)
2027 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_x_g)
2028 CALL dbt_create(bs_env%t_RI_AO__AO, t_3c_x_g_2)
2030 bounds_i(1:2) = [bs_env%i_ao_start_from_atom(i_atoms(1)), &
2031 bs_env%i_ao_end_from_atom(i_atoms(2))]
2033 DO inner_loop_atoms_interval_index = 1, bs_env%n_intervals_inner_loop_atoms
2034 il_atoms = bs_env%inner_loop_atom_intervals(1:2, inner_loop_atoms_interval_index)
2037 atoms_ri=j_atoms, atoms_ao_2=il_atoms)
2039 CALL dbt_contract(alpha=1.0_dp, &
2041 tensor_2=t_3c_for_g, &
2043 tensor_3=t_3c_x_g, &
2044 contract_1=[2], notcontract_1=[1], map_1=[3], &
2045 contract_2=[3], notcontract_2=[1, 2], map_2=[1, 2], &
2046 bounds_2=bounds_i, &
2047 filter_eps=bs_env%eps_filter)
2051 CALL dbt_copy(t_3c_x_g, t_3c_x_g_2, order=[1, 3, 2], move_data=.true.)
2053 CALL dbt_contract(alpha=sign_sigma, &
2054 tensor_1=t_3c_x_w, &
2055 tensor_2=t_3c_x_g_2, &
2057 tensor_3=t_2c_sigma, &
2058 contract_1=[1, 2], notcontract_1=[3], map_1=[1], &
2059 contract_2=[1, 2], notcontract_2=[3], map_2=[2], &
2060 filter_eps=bs_env%eps_filter, move_data=clear_w, flop=flop)
2062 IF (
PRESENT(can_skip))
THEN
2063 IF (flop == 0_int_8) can_skip = .true.
2066 CALL dbt_destroy(t_3c_for_g)
2067 CALL dbt_destroy(t_3c_x_g)
2068 CALL dbt_destroy(t_3c_x_g_2)
2070 CALL timestop(handle)
2072 END SUBROUTINE contract_to_sigma
2081 SUBROUTINE fill_fm_sigma_c_gamma_time(fm_Sigma_c_Gamma_time, bs_env, &
2082 mat_Sigma_pos_tau, mat_Sigma_neg_tau)
2084 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_sigma_c_gamma_time
2086 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_sigma_pos_tau, mat_sigma_neg_tau
2088 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fill_fm_Sigma_c_Gamma_time'
2090 INTEGER :: handle, i_t, ispin, pos_neg
2092 CALL timeset(routinen, handle)
2094 ALLOCATE (fm_sigma_c_gamma_time(bs_env%num_time_freq_points, 2, bs_env%n_spin))
2095 DO ispin = 1, bs_env%n_spin
2096 DO i_t = 1, bs_env%num_time_freq_points
2098 CALL cp_fm_create(fm_sigma_c_gamma_time(i_t, pos_neg, ispin), &
2099 bs_env%fm_s_Gamma%matrix_struct)
2102 fm_sigma_c_gamma_time(i_t, 1, ispin))
2104 fm_sigma_c_gamma_time(i_t, 2, ispin))
2108 CALL timestop(handle)
2110 END SUBROUTINE fill_fm_sigma_c_gamma_time
2116 SUBROUTINE print_skipping(bs_env)
2120 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_skipping'
2122 INTEGER :: handle, i_intval_idx, j_intval_idx, &
2125 CALL timeset(routinen, handle)
2129 DO i_intval_idx = 1, bs_env%n_intervals_i
2130 DO j_intval_idx = 1, bs_env%n_intervals_j
2131 IF (bs_env%skip_Sigma_occ(i_intval_idx, j_intval_idx) .AND. &
2132 bs_env%skip_Sigma_vir(i_intval_idx, j_intval_idx))
THEN
2138 IF (bs_env%unit_nr > 0)
THEN
2139 WRITE (bs_env%unit_nr,
'(T2,A,T74,F7.1,A)') &
2140 Στ
'Sparsity of ^c(i,k=0): Percentage of skipped atom pairs:', &
2141 REAL(100*n_skip, kind=
dp)/real(i_intval_idx*j_intval_idx, kind=
dp),
' %'
2144 CALL timestop(handle)
2146 END SUBROUTINE print_skipping
2160 SUBROUTINE destroy_mat_sigma_c(t_2c_Gocc, t_2c_Gvir, t_2c_W, t_2c_Sigma_neg_tau, &
2161 t_2c_Sigma_pos_tau, t_3c_x_W, fm_W_MIC_time, &
2162 mat_Sigma_neg_tau, mat_Sigma_pos_tau)
2164 TYPE(dbt_type) :: t_2c_gocc, t_2c_gvir, t_2c_w, &
2165 t_2c_sigma_neg_tau, &
2166 t_2c_sigma_pos_tau, t_3c_x_w
2167 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_w_mic_time
2168 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mat_sigma_neg_tau, mat_sigma_pos_tau
2170 CHARACTER(LEN=*),
PARAMETER :: routinen =
'destroy_mat_Sigma_c'
2174 CALL timeset(routinen, handle)
2176 CALL dbt_destroy(t_2c_gocc)
2177 CALL dbt_destroy(t_2c_gvir)
2178 CALL dbt_destroy(t_2c_w)
2179 CALL dbt_destroy(t_2c_sigma_neg_tau)
2180 CALL dbt_destroy(t_2c_sigma_pos_tau)
2181 CALL dbt_destroy(t_3c_x_w)
2186 CALL timestop(handle)
2188 END SUBROUTINE destroy_mat_sigma_c
2194 SUBROUTINE delete_unnecessary_files(bs_env)
2197 CHARACTER(LEN=*),
PARAMETER :: routinen =
'delete_unnecessary_files'
2199 CHARACTER(LEN=default_string_length) :: f_chi, f_w_t, prefix
2200 INTEGER :: handle, i_t
2202 CALL timeset(routinen, handle)
2204 prefix = bs_env%prefix
2206 DO i_t = 1, bs_env%num_time_freq_points
2209 WRITE (f_chi,
'(3A,I1,A)') trim(prefix), bs_env%chi_name,
"_00", i_t,
".matrix"
2210 WRITE (f_w_t,
'(3A,I1,A)') trim(prefix), bs_env%W_time_name,
"_00", i_t,
".matrix"
2211 ELSE IF (i_t < 100)
THEN
2212 WRITE (f_chi,
'(3A,I2,A)') trim(prefix), bs_env%chi_name,
"_0", i_t,
".matrix"
2213 WRITE (f_w_t,
'(3A,I2,A)') trim(prefix), bs_env%W_time_name,
"_0", i_t,
".matrix"
2215 cpabort(
'Please implement more than 99 time/frequency points.')
2218 CALL safe_delete(f_chi, bs_env)
2219 CALL safe_delete(f_w_t, bs_env)
2223 CALL timestop(handle)
2225 END SUBROUTINE delete_unnecessary_files
2232 SUBROUTINE safe_delete(filename, bs_env)
2233 CHARACTER(LEN=*) :: filename
2236 CHARACTER(LEN=*),
PARAMETER :: routinen =
'safe_delete'
2241 CALL timeset(routinen, handle)
2243 IF (bs_env%para_env%mepos == 0)
THEN
2250 CALL timestop(handle)
2252 END SUBROUTINE safe_delete
2261 SUBROUTINE compute_qp_energies(bs_env, qs_env, fm_Sigma_x_Gamma, fm_Sigma_c_Gamma_time)
2265 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_sigma_x_gamma
2266 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :, :) :: fm_sigma_c_gamma_time
2268 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_QP_energies'
2270 INTEGER :: handle, ikp, ispin, j_t
2271 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: sigma_x_ikp_n, v_xc_ikp_n
2272 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: sigma_c_ikp_n_freq, sigma_c_ikp_n_time
2273 TYPE(
cp_cfm_type) :: cfm_ks_ikp, cfm_mos_ikp, cfm_s_ikp, &
2274 cfm_sigma_x_ikp, cfm_work_ikp
2276 CALL timeset(routinen, handle)
2278 CALL cp_cfm_create(cfm_mos_ikp, bs_env%fm_s_Gamma%matrix_struct)
2279 CALL cp_cfm_create(cfm_work_ikp, bs_env%fm_s_Gamma%matrix_struct)
2281 ALLOCATE (v_xc_ikp_n(bs_env%n_ao), sigma_x_ikp_n(bs_env%n_ao))
2282 ALLOCATE (sigma_c_ikp_n_time(bs_env%n_ao, bs_env%num_time_freq_points, 2))
2283 ALLOCATE (sigma_c_ikp_n_freq(bs_env%n_ao, bs_env%num_time_freq_points, 2))
2285 DO ispin = 1, bs_env%n_spin
2287 DO ikp = 1, bs_env%nkp_bs_and_DOS
2291 ikp, qs_env, bs_env%kpoints_DOS,
"ORB")
2295 ikp, qs_env, bs_env%kpoints_DOS,
"ORB")
2298 CALL cp_cfm_geeig(cfm_ks_ikp, cfm_s_ikp, cfm_mos_ikp, &
2299 bs_env%eigenval_scf(:, ikp, ispin), cfm_work_ikp)
2302 CALL to_ikp_and_mo(v_xc_ikp_n, bs_env%fm_V_xc_Gamma(ispin), &
2303 ikp, qs_env, bs_env, cfm_mos_ikp)
2306 CALL to_ikp_and_mo(sigma_x_ikp_n, fm_sigma_x_gamma(ispin), &
2307 ikp, qs_env, bs_env, cfm_mos_ikp)
2310 DO j_t = 1, bs_env%num_time_freq_points
2311 CALL to_ikp_and_mo(sigma_c_ikp_n_time(:, j_t, 1), &
2312 fm_sigma_c_gamma_time(j_t, 1, ispin), &
2313 ikp, qs_env, bs_env, cfm_mos_ikp)
2314 CALL to_ikp_and_mo(sigma_c_ikp_n_time(:, j_t, 2), &
2315 fm_sigma_c_gamma_time(j_t, 2, ispin), &
2316 ikp, qs_env, bs_env, cfm_mos_ikp)
2320 CALL time_to_freq(bs_env, sigma_c_ikp_n_time, sigma_c_ikp_n_freq, ispin)
2325 bs_env%eigenval_scf(:, ikp, ispin), ikp, ispin)
2341 CALL timestop(handle)
2343 END SUBROUTINE compute_qp_energies
2354 SUBROUTINE to_ikp_and_mo(array_ikp_n, fm_Gamma, ikp, qs_env, bs_env, cfm_mos_ikp)
2356 REAL(kind=
dp),
DIMENSION(:) :: array_ikp_n
2363 CHARACTER(LEN=*),
PARAMETER :: routinen =
'to_ikp_and_mo'
2368 CALL timeset(routinen, handle)
2370 CALL cp_fm_create(fm_ikp_mo_re, fm_gamma%matrix_struct)
2372 CALL fm_gamma_ao_to_cfm_ikp_mo(fm_gamma, fm_ikp_mo_re, ikp, qs_env, bs_env, cfm_mos_ikp)
2378 CALL timestop(handle)
2380 END SUBROUTINE to_ikp_and_mo
2391 SUBROUTINE fm_gamma_ao_to_cfm_ikp_mo(fm_Gamma, fm_ikp_mo_re, ikp, qs_env, bs_env, cfm_mos_ikp)
2398 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fm_Gamma_ao_to_cfm_ikp_mo'
2400 INTEGER :: handle, nmo
2401 TYPE(
cp_cfm_type) :: cfm_ikp_ao, cfm_ikp_mo, cfm_tmp
2403 CALL timeset(routinen, handle)
2422 CALL timestop(handle)
2424 END SUBROUTINE fm_gamma_ao_to_cfm_ikp_mo
static GRID_HOST_DEVICE int idx(const orbital a)
Return coset index of given orbital angular momentum.
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
constants for the different operators of the 2c-integrals
integer, parameter, public operator_coulomb
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_uplo_to_full(matrix, workspace, uplo)
...
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
subroutine, public cp_cfm_cholesky_invert(matrix, n, info_out)
Used to replace Cholesky decomposition by the inverse.
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr 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.
logical function, public file_exists(file_name)
Checks if file exists, considering also the file discovery mechanism.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
...
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
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_read_unformatted(fm, unit)
...
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
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...
This is the start of a dbt_api, all publically needed functions are exported here....
subroutine, public fm_to_local_tensor(fm_global, mat_global, mat_local, tensor, bs_env, atom_ranges)
...
subroutine, public local_dbt_to_global_mat(tensor, mat_tensor, mat_global, para_env)
...
Routines from paper [Graml2024].
subroutine, public gw_calc_large_cell_gamma(qs_env, bs_env)
Perform GW band structure calculation.
subroutine, public compute_3c_integrals(qs_env, bs_env, t_3c, atoms_ao_1, atoms_ao_2, atoms_ri)
...
subroutine, public time_to_freq(bs_env, sigma_c_n_time, sigma_c_n_freq, ispin)
...
subroutine, public de_init_bs_env(bs_env)
...
subroutine, public analyt_conti_and_print(bs_env, sigma_c_ikp_n_freq, sigma_x_ikp_n, v_xc_ikp_n, eigenval_scf, ikp, ispin)
...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
Routines to compute the Coulomb integral V_(alpha beta)(k) for a k-point k using lattice summation in...
subroutine, public build_2c_coulomb_matrix_kp(matrix_v_kp, kpoints, basis_type, cell, particle_set, qs_kind_set, atomic_kind_set, size_lattice_sum, operator_type, ikp_start, ikp_end)
...
Types and basic routines needed for a kpoint calculation.
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Interface to the message passing library MPI.
subroutine, public mp_file_delete(filepath, info)
Deletes a file. Auxiliary routine to emulate 'replace' action for mp_file_open. Only the master proce...
Framework for 2c-integrals for RI.
subroutine, public ri_2c_integral_mat(qs_env, fm_matrix_minv_l_kpoints, fm_matrix_l, dimen_ri, ri_metric, do_kpoints, kpoints, put_mat_ks_env, regularization_ri, ikp_ext, do_build_cell_index)
...
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
subroutine, public cfm_ikp_from_fm_gamma(cfm_ikp, fm_gamma, ikp, qs_env, kpoints, basis_type)
...
subroutine, public get_all_vbm_cbm_bandgaps(bs_env)
...
subroutine, public mic_contribution_from_ikp(bs_env, qs_env, fm_w_mic_freq_j, cfm_w_ikp_freq_j, ikp, kpoints, basis_type, wkp_ext)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_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, 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.
Utility methods to build 3-center integral tensors of various types.
subroutine, public build_3c_integrals(t3c, filter_eps, qs_env, nl_3c, basis_i, basis_j, basis_k, potential_parameter, int_eps, op_pos, do_kpoints, do_hfx_kpoints, desymmetrize, cell_sym, bounds_i, bounds_j, bounds_k, ri_range, img_to_ri_cell, cell_to_index_ext)
Build 3-center integral tensor.
Routines treating GW and RPA calculations with kpoints.
subroutine, public cp_cfm_power(matrix, threshold, exponent, min_eigval)
...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Represent a complex full matrix.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information about kpoints.
Provides all information about a quickstep kind.