48 USE dbcsr_api,
ONLY: &
49 dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_distribution_get, dbcsr_distribution_new, &
50 dbcsr_distribution_release, dbcsr_distribution_type, dbcsr_finalize, dbcsr_get_block_p, &
51 dbcsr_get_info, dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, &
52 dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, &
53 dbcsr_p_type, dbcsr_put_block, dbcsr_release, dbcsr_reserve_all_blocks, dbcsr_set, &
54 dbcsr_type, dbcsr_type_no_symmetry, dbcsr_type_symmetric
78 xas_tdp_control_type,&
82 #include "./base/base_uses.f90"
87 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xas_tdp_utils'
93 TYPE dbcsr_soc_package_type
94 TYPE(dbcsr_type),
POINTER :: dbcsr_sg => null()
95 TYPE(dbcsr_type),
POINTER :: dbcsr_tp => null()
96 TYPE(dbcsr_type),
POINTER :: dbcsr_sc => null()
97 TYPE(dbcsr_type),
POINTER :: dbcsr_sf => null()
98 TYPE(dbcsr_type),
POINTER :: dbcsr_prod => null()
99 TYPE(dbcsr_type),
POINTER :: dbcsr_ovlp => null()
100 TYPE(dbcsr_type),
POINTER :: dbcsr_tmp => null()
101 TYPE(dbcsr_type),
POINTER :: dbcsr_work => null()
102 END TYPE dbcsr_soc_package_type
169 TYPE(donor_state_type),
POINTER :: donor_state
170 TYPE(qs_environment_type),
POINTER :: qs_env
171 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
172 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
174 CHARACTER(len=*),
PARAMETER :: routinen =
'setup_xas_tdp_prob'
177 INTEGER,
DIMENSION(:),
POINTER :: submat_blk_size
178 LOGICAL :: do_coul, do_hfx, do_os, do_sc, do_sf, &
179 do_sg, do_tda, do_tp, do_xc
180 REAL(
dp) :: eps_filter, sx
181 TYPE(dbcsr_distribution_type),
POINTER :: submat_dist
182 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ex_ker, xc_ker
183 TYPE(dbcsr_type) :: matrix_a, matrix_a_sf, matrix_b, proj_q, &
185 TYPE(dbcsr_type),
POINTER :: matrix_c_sc, matrix_c_sf, matrix_c_sg, matrix_c_tp, matrix_d, &
186 matrix_e_sc, sc_matrix_tdp, sf_matrix_tdp, sg_matrix_tdp, tp_matrix_tdp
188 NULLIFY (sg_matrix_tdp, tp_matrix_tdp, submat_dist, submat_blk_size, matrix_c_sf)
189 NULLIFY (matrix_c_sg, matrix_c_tp, matrix_c_sc, matrix_d, matrix_e_sc)
190 NULLIFY (sc_matrix_tdp, sf_matrix_tdp, ex_ker, xc_ker)
192 CALL timeset(routinen, handle)
195 do_os = xas_tdp_control%do_uks .OR. xas_tdp_control%do_roks
196 do_sc = xas_tdp_control%do_spin_cons
197 do_sf = xas_tdp_control%do_spin_flip
198 do_sg = xas_tdp_control%do_singlet
199 do_tp = xas_tdp_control%do_triplet
200 do_xc = xas_tdp_control%do_xc
201 do_hfx = xas_tdp_control%do_hfx
202 do_coul = xas_tdp_control%do_coulomb
203 do_tda = xas_tdp_control%tamm_dancoff
204 sx = xas_tdp_control%sx
205 eps_filter = xas_tdp_control%eps_filter
207 ALLOCATE (donor_state%sc_matrix_tdp)
208 sc_matrix_tdp => donor_state%sc_matrix_tdp
211 ALLOCATE (donor_state%sf_matrix_tdp)
212 sf_matrix_tdp => donor_state%sf_matrix_tdp
215 ALLOCATE (donor_state%sg_matrix_tdp)
216 sg_matrix_tdp => donor_state%sg_matrix_tdp
219 ALLOCATE (donor_state%tp_matrix_tdp)
220 tp_matrix_tdp => donor_state%tp_matrix_tdp
224 CALL compute_submat_dist_and_blk_size(donor_state, do_os, qs_env)
225 submat_dist => donor_state%dbcsr_dist
226 submat_blk_size => donor_state%blk_size
231 IF (do_sg .OR. do_tp .OR. do_sc)
THEN
232 CALL get_q_projector(proj_q, donor_state, do_os, xas_tdp_env)
235 CALL get_q_projector(proj_q_sf, donor_state, do_os, xas_tdp_env, do_sf=.true.)
237 CALL dbcsr_create(matrix=work, matrix_type=dbcsr_type_no_symmetry, dist=submat_dist, &
238 name=
"WORK", row_blk_size=submat_blk_size, col_blk_size=submat_blk_size)
241 IF (do_sg .OR. do_tp .OR. do_sc)
THEN
242 CALL build_gs_contribution(matrix_a, donor_state, do_os, qs_env)
245 CALL build_gs_contribution(matrix_a_sf, donor_state, do_os, qs_env, do_sf=.true.)
250 ALLOCATE (xc_ker(1)%matrix, xc_ker(2)%matrix, xc_ker(3)%matrix, xc_ker(4)%matrix)
251 CALL kernel_coulomb_xc(matrix_b, xc_ker, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
252 matrix_c_sg => xc_ker(1)%matrix; matrix_c_tp => xc_ker(2)%matrix
253 matrix_c_sc => xc_ker(3)%matrix; matrix_c_sf => xc_ker(4)%matrix
257 ALLOCATE (ex_ker(1)%matrix, ex_ker(2)%matrix)
258 CALL kernel_exchange(ex_ker, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
259 matrix_d => ex_ker(1)%matrix; matrix_e_sc => ex_ker(2)%matrix
263 ALLOCATE (donor_state%metric(1))
264 CALL build_metric(donor_state%metric, donor_state, qs_env, do_os)
266 ALLOCATE (donor_state%metric(2))
267 CALL build_metric(donor_state%metric, donor_state, qs_env, do_os, do_inv=.true.)
276 CALL dbcsr_copy(sc_matrix_tdp, matrix_a, name=
"OS MATRIX TDP")
277 IF (do_coul)
CALL dbcsr_add(sc_matrix_tdp, matrix_b, 1.0_dp, 1.0_dp)
279 IF (do_xc)
CALL dbcsr_add(sc_matrix_tdp, matrix_c_sc, 1.0_dp, 1.0_dp)
280 IF (do_hfx)
CALL dbcsr_add(sc_matrix_tdp, matrix_d, 1.0_dp, -1.0_dp*sx)
283 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q, sc_matrix_tdp, 0.0_dp, work, filter_eps=eps_filter)
284 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q, 0.0_dp, sc_matrix_tdp, filter_eps=eps_filter)
291 CALL dbcsr_copy(sf_matrix_tdp, matrix_a_sf, name=
"OS MATRIX TDP")
293 IF (do_xc)
CALL dbcsr_add(sf_matrix_tdp, matrix_c_sf, 1.0_dp, 1.0_dp)
294 IF (do_hfx)
CALL dbcsr_add(sf_matrix_tdp, matrix_d, 1.0_dp, -1.0_dp*sx)
297 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q_sf, sf_matrix_tdp, 0.0_dp, work, filter_eps=eps_filter)
298 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q_sf, 0.0_dp, sf_matrix_tdp, filter_eps=eps_filter)
305 CALL dbcsr_copy(sg_matrix_tdp, matrix_a, name=
"SINGLET MATRIX TDP")
306 IF (do_coul)
CALL dbcsr_add(sg_matrix_tdp, matrix_b, 1.0_dp, 2.0_dp)
308 IF (do_xc)
CALL dbcsr_add(sg_matrix_tdp, matrix_c_sg, 1.0_dp, 1.0_dp)
309 IF (do_hfx)
CALL dbcsr_add(sg_matrix_tdp, matrix_d, 1.0_dp, -1.0_dp*sx)
312 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q, sg_matrix_tdp, 0.0_dp, work, filter_eps=eps_filter)
313 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q, 0.0_dp, sg_matrix_tdp, filter_eps=eps_filter)
320 CALL dbcsr_copy(tp_matrix_tdp, matrix_a, name=
"TRIPLET MATRIX TDP")
322 IF (do_xc)
CALL dbcsr_add(tp_matrix_tdp, matrix_c_tp, 1.0_dp, 1.0_dp)
323 IF (do_hfx)
CALL dbcsr_add(tp_matrix_tdp, matrix_d, 1.0_dp, -1.0_dp*sx)
326 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q, tp_matrix_tdp, 0.0_dp, work, filter_eps=eps_filter)
327 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q, 0.0_dp, tp_matrix_tdp, filter_eps=eps_filter)
335 CALL build_aux_matrix(1.0e-8_dp, sx, matrix_a, matrix_d, matrix_e_sc, do_hfx, proj_q, &
336 work, donor_state, eps_filter, qs_env)
342 CALL dbcsr_copy(sc_matrix_tdp, matrix_a, name=
"OS MATRIX TDP")
343 IF (do_coul)
CALL dbcsr_add(sc_matrix_tdp, matrix_b, 1.0_dp, 2.0_dp)
346 CALL dbcsr_add(sc_matrix_tdp, matrix_d, 1.0_dp, -1.0_dp*sx)
347 CALL dbcsr_add(sc_matrix_tdp, matrix_e_sc, 1.0_dp, -1.0_dp*sx)
350 CALL dbcsr_add(sc_matrix_tdp, matrix_c_sc, 1.0_dp, 2.0_dp)
354 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q, sc_matrix_tdp, 0.0_dp, work, filter_eps=eps_filter)
355 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q, 0.0_dp, sc_matrix_tdp, filter_eps=eps_filter)
359 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, donor_state%metric(2)%matrix, sc_matrix_tdp, &
360 0.0_dp, work, filter_eps=eps_filter)
361 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, work, donor_state%metric(2)%matrix, 0.0_dp, &
362 sc_matrix_tdp, filter_eps=eps_filter)
370 CALL dbcsr_copy(sg_matrix_tdp, matrix_a, name=
"SINGLET MATRIX TDP")
371 IF (do_coul)
CALL dbcsr_add(sg_matrix_tdp, matrix_b, 1.0_dp, 4.0_dp)
374 CALL dbcsr_add(sg_matrix_tdp, matrix_d, 1.0_dp, -1.0_dp*sx)
375 CALL dbcsr_add(sg_matrix_tdp, matrix_e_sc, 1.0_dp, -1.0_dp*sx)
378 CALL dbcsr_add(sg_matrix_tdp, matrix_c_sg, 1.0_dp, 2.0_dp)
382 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q, sg_matrix_tdp, 0.0_dp, work, filter_eps=eps_filter)
383 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q, 0.0_dp, sg_matrix_tdp, filter_eps=eps_filter)
387 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, donor_state%metric(2)%matrix, sg_matrix_tdp, &
388 0.0_dp, work, filter_eps=eps_filter)
389 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, work, donor_state%metric(2)%matrix, 0.0_dp, &
390 sg_matrix_tdp, filter_eps=eps_filter)
398 CALL dbcsr_copy(tp_matrix_tdp, matrix_a, name=
"TRIPLET MATRIX TDP")
401 CALL dbcsr_add(tp_matrix_tdp, matrix_d, 1.0_dp, -1.0_dp*sx)
402 CALL dbcsr_add(tp_matrix_tdp, matrix_e_sc, 1.0_dp, -1.0_dp*sx)
405 CALL dbcsr_add(tp_matrix_tdp, matrix_c_tp, 1.0_dp, 2.0_dp)
409 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q, tp_matrix_tdp, 0.0_dp, work, filter_eps=eps_filter)
410 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q, 0.0_dp, tp_matrix_tdp, filter_eps=eps_filter)
414 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, donor_state%metric(2)%matrix, tp_matrix_tdp, &
415 0.0_dp, work, filter_eps=eps_filter)
416 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, work, donor_state%metric(2)%matrix, 0.0_dp, &
417 tp_matrix_tdp, filter_eps=eps_filter)
424 CALL dbcsr_release(matrix_a)
425 CALL dbcsr_release(matrix_a_sf)
426 CALL dbcsr_release(matrix_b)
427 CALL dbcsr_release(proj_q)
428 CALL dbcsr_release(proj_q_sf)
429 CALL dbcsr_release(work)
433 CALL timestop(handle)
459 TYPE(donor_state_type),
POINTER :: donor_state
460 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
461 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
462 TYPE(qs_environment_type),
POINTER :: qs_env
463 INTEGER,
INTENT(IN) :: ex_type
465 CHARACTER(len=*),
PARAMETER :: routinen =
'solve_xas_tdp_prob'
467 INTEGER :: first_ex, handle, i, imo, ispin, nao, &
468 ndo_mo, nelectron, nevals, nocc, nrow, &
470 LOGICAL :: do_os, do_range, do_sf
472 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: scaling, tmp_evals
473 REAL(
dp),
DIMENSION(:),
POINTER :: lr_evals
474 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
475 TYPE(cp_fm_struct_type),
POINTER :: ex_struct, fm_struct, ot_fm_struct
476 TYPE(cp_fm_type) :: c_diff, c_sum, lhs_matrix, rhs_matrix, &
478 TYPE(cp_fm_type),
POINTER :: lr_coeffs
479 TYPE(dbcsr_type) :: tmp_mat, tmp_mat2
480 TYPE(dbcsr_type),
POINTER :: matrix_tdp
481 TYPE(mp_para_env_type),
POINTER :: para_env
483 CALL timeset(routinen, handle)
485 NULLIFY (para_env, blacs_env, fm_struct, matrix_tdp)
486 NULLIFY (ex_struct, lr_evals, lr_coeffs)
487 cpassert(
ASSOCIATED(xas_tdp_env))
492 matrix_tdp => donor_state%sc_matrix_tdp
495 matrix_tdp => donor_state%sf_matrix_tdp
499 matrix_tdp => donor_state%sg_matrix_tdp
501 matrix_tdp => donor_state%tp_matrix_tdp
503 CALL get_qs_env(qs_env=qs_env, para_env=para_env, blacs_env=blacs_env, nelectron_total=nelectron)
506 nspins = 1;
IF (do_os) nspins = 2
508 CALL dbcsr_get_info(matrix_tdp, nfullrows_total=nrow)
509 ndo_mo = donor_state%ndo_mo
510 nocc = nelectron/2;
IF (do_os) nocc = nelectron
515 IF (xas_tdp_control%e_range > 0.0_dp) do_range = .true.
519 para_env=para_env, ncol_global=nrow)
524 IF (xas_tdp_control%tamm_dancoff)
THEN
526 IF (xas_tdp_control%do_ot)
THEN
532 ot_elb = xas_tdp_env%lumo_evals(1)%array(1)
533 IF (do_os) ot_elb = min(ot_elb, xas_tdp_env%lumo_evals(2)%array(1))
535 ot_nevals = count(xas_tdp_env%lumo_evals(1)%array - ot_elb .LE. xas_tdp_control%e_range)
536 IF (do_os) ot_nevals = ot_nevals + &
537 count(xas_tdp_env%lumo_evals(2)%array - ot_elb .LE. xas_tdp_control%e_range)
541 ot_nevals = nspins*nao - nocc/ndo_mo
542 IF (xas_tdp_control%n_excited > 0 .AND. xas_tdp_control%n_excited < ot_nevals)
THEN
543 ot_nevals = xas_tdp_control%n_excited
546 ot_nevals = ndo_mo*ot_nevals
550 ALLOCATE (tmp_evals(ot_nevals))
552 nrow_global=nrow, ncol_global=ot_nevals)
555 CALL xas_ot_solver(matrix_tdp, donor_state%metric(1)%matrix, c_sum, tmp_evals, ot_nevals, &
556 do_sf, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
564 ALLOCATE (tmp_evals(nrow))
575 CALL cp_fm_geeig(rhs_matrix, lhs_matrix, c_sum, tmp_evals, work)
578 CALL cp_fm_release(lhs_matrix)
586 ALLOCATE (tmp_evals(nrow))
591 CALL dbcsr_create(matrix=tmp_mat, template=matrix_tdp, matrix_type=dbcsr_type_no_symmetry)
592 CALL dbcsr_create(matrix=tmp_mat2, template=matrix_tdp, matrix_type=dbcsr_type_no_symmetry)
593 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, donor_state%matrix_aux, matrix_tdp, &
594 0.0_dp, tmp_mat2, filter_eps=xas_tdp_control%eps_filter)
595 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, tmp_mat2, donor_state%matrix_aux, &
596 0.0_dp, tmp_mat, filter_eps=xas_tdp_control%eps_filter)
606 WHERE (tmp_evals < 1.0e-4_dp) tmp_evals = 0.0_dp
611 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_tdp, donor_state%matrix_aux, &
612 0.0_dp, tmp_mat, filter_eps=xas_tdp_control%eps_filter)
615 ALLOCATE (scaling(nrow))
617 WHERE (abs(tmp_evals) > 1.0e-8_dp) scaling = 1.0_dp/tmp_evals
622 CALL get_normal_scaling(scaling, c_diff, donor_state)
626 tmp_evals = sqrt(tmp_evals)
630 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, donor_state%matrix_aux, donor_state%matrix_aux, &
631 0.0_dp, tmp_mat2, filter_eps=xas_tdp_control%eps_filter)
632 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, donor_state%metric(2)%matrix, tmp_mat2, &
633 0.0_dp, tmp_mat, filter_eps=xas_tdp_control%eps_filter)
635 WHERE (tmp_evals .NE. 0) scaling = -1.0_dp/tmp_evals
639 CALL cp_fm_release(c_diff)
640 CALL dbcsr_release(tmp_mat)
641 CALL dbcsr_release(tmp_mat2)
647 CALL cp_fm_release(rhs_matrix)
648 CALL cp_fm_release(work)
652 IF (xas_tdp_control%do_ot)
THEN
656 ELSE IF (do_range)
THEN
658 WHERE (tmp_evals > tmp_evals(first_ex) + xas_tdp_control%e_range) tmp_evals = 0.0_dp
659 nevals = maxloc(tmp_evals, 1) - nocc
664 nevals = nspins*nao - nocc/ndo_mo
665 IF (xas_tdp_control%n_excited > 0 .AND. xas_tdp_control%n_excited < nevals)
THEN
666 nevals = xas_tdp_control%n_excited
668 nevals = ndo_mo*nevals
672 ALLOCATE (lr_evals(nevals))
673 lr_evals(:) = tmp_evals(first_ex:first_ex + nevals - 1)
680 para_env=para_env, context=blacs_env)
689 nrow=nao, ncol=1, s_firstrow=((ispin - 1)*ndo_mo + imo - 1)*nao + 1, &
690 s_firstcol=first_ex + i - 1, t_firstrow=1, &
691 t_firstcol=(i - 1)*ndo_mo*nspins + (ispin - 1)*ndo_mo + imo)
697 donor_state%sc_coeffs => lr_coeffs
698 donor_state%sc_evals => lr_evals
700 donor_state%sf_coeffs => lr_coeffs
701 donor_state%sf_evals => lr_evals
703 donor_state%sg_coeffs => lr_coeffs
704 donor_state%sg_evals => lr_evals
706 donor_state%tp_coeffs => lr_coeffs
707 donor_state%tp_evals => lr_evals
711 CALL cp_fm_release(c_sum)
716 CALL dbcsr_release(matrix_tdp)
718 CALL timestop(handle)
735 SUBROUTINE xas_ot_solver(matrix_tdp, metric, evecs, evals, neig, do_sf, donor_state, xas_tdp_env, &
736 xas_tdp_control, qs_env)
738 TYPE(dbcsr_type),
POINTER :: matrix_tdp, metric
739 TYPE(cp_fm_type),
INTENT(IN) :: evecs
740 REAL(
dp),
DIMENSION(:) :: evals
741 INTEGER,
INTENT(IN) :: neig
743 TYPE(donor_state_type),
POINTER :: donor_state
744 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
745 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
746 TYPE(qs_environment_type),
POINTER :: qs_env
748 CHARACTER(len=*),
PARAMETER :: routinen =
'xas_ot_solver'
750 INTEGER :: handle, max_iter, ndo_mo, nelec_spin(2), &
751 nocc, nrow, output_unit
754 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
755 TYPE(cp_fm_struct_type),
POINTER :: ortho_struct
756 TYPE(cp_fm_type) :: ortho_space
757 TYPE(dbcsr_type),
POINTER :: ot_prec
758 TYPE(mp_para_env_type),
POINTER :: para_env
759 TYPE(preconditioner_type),
POINTER :: precond
761 NULLIFY (para_env, blacs_env, ortho_struct, ot_prec)
763 CALL timeset(routinen, handle)
766 IF (output_unit > 0)
THEN
767 WRITE (output_unit,
"(/,T5,A)") &
768 "Using OT eigensolver for diagonalization: "
771 do_os = xas_tdp_control%do_uks .OR. xas_tdp_control%do_roks
772 ndo_mo = donor_state%ndo_mo
773 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env, nelectron_spin=nelec_spin)
775 max_iter = xas_tdp_control%ot_max_iter
776 eps_iter = xas_tdp_control%ot_eps_iter
777 nocc = nelec_spin(1)/2*ndo_mo
778 IF (do_os) nocc = sum(nelec_spin)*ndo_mo
782 CALL dbcsr_create(ot_prec, template=matrix_tdp)
784 nrow_global=nrow, ncol_global=nocc)
787 CALL prep_for_ot(evecs, ortho_space, ot_prec, neig, do_sf, donor_state, xas_tdp_env, &
788 xas_tdp_control, qs_env)
794 precond%dbcsr_matrix => ot_prec
797 CALL ot_eigensolver(matrix_h=matrix_tdp, matrix_s=metric, matrix_c_fm=evecs, &
798 eps_gradient=eps_iter, iter_max=max_iter, silent=.false., &
799 ot_settings=xas_tdp_control%ot_settings, &
800 matrix_orthogonal_space_fm=ortho_space, &
802 CALL calculate_subspace_eigenvalues(evecs, matrix_tdp, evals_arg=evals)
806 CALL cp_fm_release(ortho_space)
807 CALL dbcsr_release(ot_prec)
811 CALL timestop(handle)
813 END SUBROUTINE xas_ot_solver
828 SUBROUTINE prep_for_ot(guess, ortho, precond, neig, do_sf, donor_state, xas_tdp_env, &
829 xas_tdp_control, qs_env)
831 TYPE(cp_fm_type),
INTENT(IN) :: guess, ortho
832 TYPE(dbcsr_type) :: precond
835 TYPE(donor_state_type),
POINTER :: donor_state
836 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
837 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
838 TYPE(qs_environment_type),
POINTER :: qs_env
840 CHARACTER(len=*),
PARAMETER :: routinen =
'prep_for_ot'
842 INTEGER :: blk, handle, i, iblk, ido_mo, ispin, jblk, maxel, minel, nao, natom, ndo_mo, &
843 nelec_spin(2), nhomo(2), nlumo(2), nspins, start_block, start_col, start_row
844 LOGICAL :: do_os, found
845 REAL(
dp),
DIMENSION(:, :),
POINTER :: pblock
846 TYPE(cp_fm_type),
POINTER :: mo_coeff
847 TYPE(dbcsr_iterator_type) :: iter
848 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
850 NULLIFY (mos, mo_coeff, pblock)
858 CALL timeset(routinen, handle)
860 do_os = xas_tdp_control%do_uks .OR. xas_tdp_control%do_roks
861 nspins = 1;
IF (do_os) nspins = 2
862 ndo_mo = donor_state%ndo_mo
864 CALL get_qs_env(qs_env, natom=natom, nelectron_spin=nelec_spin)
868 minel = minloc(nelec_spin, 1)
870 nlumo(minel) = (neig/ndo_mo + nelec_spin(maxel) - nelec_spin(minel))/2
871 nlumo(maxel) = neig/ndo_mo - nlumo(minel)
873 nlumo(1) = neig/ndo_mo
882 DO ido_mo = 1, ndo_mo
885 nrow=nao, ncol=nlumo(ispin), s_firstrow=1, s_firstcol=1, &
886 t_firstrow=start_row + 1, t_firstcol=start_col + 1)
888 start_row = start_row + nao
889 start_col = start_col + nlumo(ispin)
899 CALL get_mo_set(mos(ispin), homo=nhomo(ispin))
905 ispin = i;
IF (do_sf) ispin = 3 - i
906 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
908 DO ido_mo = 1, ndo_mo
910 CALL cp_fm_to_fm_submat(msource=mo_coeff, mtarget=ortho, nrow=nao, ncol=nhomo(ispin), &
911 s_firstrow=1, s_firstcol=1, &
912 t_firstrow=start_row + 1, t_firstcol=start_col + 1)
914 start_row = start_row + nao
915 start_col = start_col + nhomo(ispin)
924 CALL dbcsr_iterator_start(iter, xas_tdp_env%ot_prec(ispin)%matrix)
925 DO WHILE (dbcsr_iterator_blocks_left(iter))
927 CALL dbcsr_iterator_next_block(iter, row=iblk, column=jblk, blk=blk)
929 CALL dbcsr_get_block_p(xas_tdp_env%ot_prec(ispin)%matrix, iblk, jblk, pblock, found)
933 start_block = (ispin - 1)*ndo_mo*natom
934 DO ido_mo = 1, ndo_mo
935 CALL dbcsr_put_block(precond, start_block + iblk, start_block + jblk, pblock)
937 start_block = start_block + natom
943 CALL dbcsr_iterator_stop(iter)
946 CALL dbcsr_finalize(precond)
948 CALL timestop(handle)
950 END SUBROUTINE prep_for_ot
960 SUBROUTINE get_normal_scaling(scaling, lr_coeffs, donor_state)
962 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: scaling
963 TYPE(cp_fm_type),
INTENT(IN) :: lr_coeffs
964 TYPE(donor_state_type),
POINTER :: donor_state
966 INTEGER :: nrow, nscal, nvals
967 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: diag
968 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
969 TYPE(cp_fm_struct_type),
POINTER :: norm_struct, work_struct
970 TYPE(cp_fm_type) :: fm_norm, work
971 TYPE(mp_para_env_type),
POINTER :: para_env
973 NULLIFY (para_env, blacs_env, norm_struct, work_struct)
976 CALL cp_fm_get_info(lr_coeffs, context=blacs_env, para_env=para_env, &
977 matrix_struct=work_struct, ncol_global=nvals, nrow_global=nrow)
979 nrow_global=nvals, ncol_global=nvals)
986 CALL parallel_gemm(
'T',
'N', nvals, nvals, nrow, 1.0_dp, lr_coeffs, work, 0.0_dp, fm_norm)
989 ALLOCATE (diag(nvals))
991 WHERE (abs(diag) > 1.0e-8_dp) diag = 1.0_dp/sqrt(abs(diag))
993 nscal =
SIZE(scaling)
994 scaling(1:nscal) = diag(1:nscal)
997 CALL cp_fm_release(work)
998 CALL cp_fm_release(fm_norm)
1001 END SUBROUTINE get_normal_scaling
1012 SUBROUTINE compute_submat_dist_and_blk_size(donor_state, do_os, qs_env)
1014 TYPE(donor_state_type),
POINTER :: donor_state
1015 LOGICAL,
INTENT(IN) :: do_os
1016 TYPE(qs_environment_type),
POINTER :: qs_env
1018 INTEGER :: group, i, nao, nblk_row, ndo_mo, nspins, &
1019 scol_dist, srow_dist
1020 INTEGER,
DIMENSION(:),
POINTER :: col_dist, col_dist_sub, row_blk_size, &
1021 row_dist, row_dist_sub, submat_blk_size
1022 INTEGER,
DIMENSION(:, :),
POINTER :: pgrid
1023 TYPE(dbcsr_distribution_type),
POINTER :: dbcsr_dist, submat_dist
1024 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks
1026 NULLIFY (matrix_ks, dbcsr_dist, row_blk_size, row_dist, col_dist, pgrid, col_dist_sub)
1027 NULLIFY (row_dist_sub, submat_dist, submat_blk_size)
1034 ndo_mo = donor_state%ndo_mo
1035 CALL get_qs_env(qs_env=qs_env, matrix_ks=matrix_ks, dbcsr_dist=dbcsr_dist)
1036 CALL dbcsr_get_info(matrix_ks(1)%matrix, row_blk_size=row_blk_size)
1037 CALL dbcsr_distribution_get(dbcsr_dist, row_dist=row_dist, col_dist=col_dist, group=group, &
1039 nao = sum(row_blk_size)
1040 nblk_row =
SIZE(row_blk_size)
1041 srow_dist =
SIZE(row_dist)
1042 scol_dist =
SIZE(col_dist)
1043 nspins = 1;
IF (do_os) nspins = 2
1046 ALLOCATE (submat_blk_size(ndo_mo*nspins*nblk_row))
1047 ALLOCATE (row_dist_sub(ndo_mo*nspins*srow_dist))
1048 ALLOCATE (col_dist_sub(ndo_mo*nspins*scol_dist))
1050 DO i = 1, ndo_mo*nspins
1051 submat_blk_size((i - 1)*nblk_row + 1:i*nblk_row) = row_blk_size
1052 row_dist_sub((i - 1)*srow_dist + 1:i*srow_dist) = row_dist
1053 col_dist_sub((i - 1)*scol_dist + 1:i*scol_dist) = col_dist
1057 ALLOCATE (submat_dist)
1058 CALL dbcsr_distribution_new(submat_dist, group=group, pgrid=pgrid, row_dist=row_dist_sub, &
1059 col_dist=col_dist_sub)
1061 donor_state%dbcsr_dist => submat_dist
1062 donor_state%blk_size => submat_blk_size
1065 DEALLOCATE (col_dist_sub, row_dist_sub)
1067 END SUBROUTINE compute_submat_dist_and_blk_size
1081 SUBROUTINE get_q_projector(proj_Q, donor_state, do_os, xas_tdp_env, do_sf)
1083 TYPE(dbcsr_type),
INTENT(INOUT) :: proj_q
1084 TYPE(donor_state_type),
POINTER :: donor_state
1085 LOGICAL,
INTENT(IN) :: do_os
1086 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
1087 LOGICAL,
INTENT(IN),
OPTIONAL :: do_sf
1089 CHARACTER(len=*),
PARAMETER :: routinen =
'get_q_projector'
1091 INTEGER :: blk, handle, iblk, imo, ispin, jblk, &
1092 nblk_row, ndo_mo, nspins
1093 INTEGER,
DIMENSION(:),
POINTER :: blk_size_q, row_blk_size
1094 LOGICAL :: found_block, my_dosf
1095 REAL(
dp),
DIMENSION(:),
POINTER :: work_block
1096 TYPE(dbcsr_distribution_type),
POINTER :: dist_q
1097 TYPE(dbcsr_iterator_type) :: iter
1098 TYPE(dbcsr_type),
POINTER :: one_sp
1100 NULLIFY (work_block, one_sp, row_blk_size, dist_q, blk_size_q)
1102 CALL timeset(routinen, handle)
1105 nspins = 1;
IF (do_os) nspins = 2
1106 ndo_mo = donor_state%ndo_mo
1107 one_sp => xas_tdp_env%q_projector(1)%matrix
1108 CALL dbcsr_get_info(one_sp, row_blk_size=row_blk_size)
1109 nblk_row =
SIZE(row_blk_size)
1111 IF (
PRESENT(do_sf)) my_dosf = do_sf
1112 dist_q => donor_state%dbcsr_dist
1113 blk_size_q => donor_state%blk_size
1116 CALL dbcsr_create(matrix=proj_q, name=
"PROJ Q", matrix_type=dbcsr_type_no_symmetry, dist=dist_q, &
1117 row_blk_size=blk_size_q, col_blk_size=blk_size_q)
1120 DO ispin = 1, nspins
1121 one_sp => xas_tdp_env%q_projector(ispin)%matrix
1124 IF (my_dosf) one_sp => xas_tdp_env%q_projector(3 - ispin)%matrix
1126 CALL dbcsr_iterator_start(iter, one_sp)
1127 DO WHILE (dbcsr_iterator_blocks_left(iter))
1129 CALL dbcsr_iterator_next_block(iter, row=iblk, column=jblk, blk=blk)
1132 CALL dbcsr_get_block_p(one_sp, iblk, jblk, work_block, found_block)
1134 IF (found_block)
THEN
1137 CALL dbcsr_put_block(proj_q, ((ispin - 1)*ndo_mo + imo - 1)*nblk_row + iblk, &
1138 ((ispin - 1)*ndo_mo + imo - 1)*nblk_row + jblk, work_block)
1142 NULLIFY (work_block)
1145 CALL dbcsr_iterator_stop(iter)
1148 CALL dbcsr_finalize(proj_q)
1150 CALL timestop(handle)
1152 END SUBROUTINE get_q_projector
1169 SUBROUTINE build_gs_contribution(matrix_a, donor_state, do_os, qs_env, do_sf)
1171 TYPE(dbcsr_type),
INTENT(INOUT) :: matrix_a
1172 TYPE(donor_state_type),
POINTER :: donor_state
1173 LOGICAL,
INTENT(IN) :: do_os
1174 TYPE(qs_environment_type),
POINTER :: qs_env
1175 LOGICAL,
INTENT(IN),
OPTIONAL :: do_sf
1177 CHARACTER(len=*),
PARAMETER :: routinen =
'build_gs_contribution'
1179 INTEGER :: blk, handle, iblk, imo, ispin, jblk, &
1180 nblk_row, ndo_mo, nspins
1181 INTEGER,
DIMENSION(:),
POINTER :: blk_size_a, row_blk_size
1182 LOGICAL :: found_block, my_dosf
1183 REAL(
dp),
DIMENSION(:),
POINTER :: work_block
1184 TYPE(dbcsr_distribution_type),
POINTER :: dbcsr_dist, dist_a
1185 TYPE(dbcsr_iterator_type) :: iter
1186 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: m_ks, matrix_ks, matrix_s
1187 TYPE(dbcsr_type) :: work_matrix
1189 NULLIFY (matrix_ks, dbcsr_dist, row_blk_size, work_block, matrix_s, m_ks)
1190 NULLIFY (dist_a, blk_size_a)
1195 CALL timeset(routinen, handle)
1198 nspins = 1;
IF (do_os) nspins = 2
1199 ndo_mo = donor_state%ndo_mo
1200 CALL get_qs_env(qs_env=qs_env, matrix_ks=matrix_ks, matrix_s=matrix_s, dbcsr_dist=dbcsr_dist)
1201 CALL dbcsr_get_info(matrix_s(1)%matrix, row_blk_size=row_blk_size)
1202 nblk_row =
SIZE(row_blk_size)
1203 dist_a => donor_state%dbcsr_dist
1204 blk_size_a => donor_state%blk_size
1207 ALLOCATE (m_ks(nspins))
1208 m_ks(1)%matrix => matrix_ks(1)%matrix
1209 IF (do_os) m_ks(2)%matrix => matrix_ks(2)%matrix
1213 IF (
PRESENT(do_sf)) my_dosf = do_sf
1214 IF (my_dosf .AND. do_os)
THEN
1215 m_ks(1)%matrix => matrix_ks(2)%matrix
1216 m_ks(2)%matrix => matrix_ks(1)%matrix
1220 CALL dbcsr_create(matrix=matrix_a, name=
"MATRIX A", matrix_type=dbcsr_type_symmetric, &
1221 dist=dist_a, row_blk_size=blk_size_a, col_blk_size=blk_size_a)
1222 CALL dbcsr_create(matrix=work_matrix, name=
"WORK MAT", matrix_type=dbcsr_type_symmetric, &
1223 dist=dist_a, row_blk_size=blk_size_a, col_blk_size=blk_size_a)
1225 DO ispin = 1, nspins
1228 CALL dbcsr_iterator_start(iter, m_ks(ispin)%matrix)
1229 DO WHILE (dbcsr_iterator_blocks_left(iter))
1231 CALL dbcsr_iterator_next_block(iter, row=iblk, column=jblk, blk=blk)
1234 CALL dbcsr_get_block_p(m_ks(ispin)%matrix, iblk, jblk, work_block, found_block)
1236 IF (found_block)
THEN
1242 CALL dbcsr_put_block(matrix_a, ((ispin - 1)*ndo_mo + imo - 1)*nblk_row + iblk, &
1243 ((ispin - 1)*ndo_mo + imo - 1)*nblk_row + jblk, work_block)
1247 NULLIFY (work_block)
1249 CALL dbcsr_iterator_stop(iter)
1253 CALL dbcsr_iterator_start(iter, matrix_s(1)%matrix)
1254 DO WHILE (dbcsr_iterator_blocks_left(iter))
1256 CALL dbcsr_iterator_next_block(iter, row=iblk, column=jblk, blk=blk)
1259 CALL dbcsr_get_block_p(matrix_s(1)%matrix, iblk, jblk, work_block, found_block)
1261 IF (found_block)
THEN
1266 CALL dbcsr_put_block(work_matrix, ((ispin - 1)*ndo_mo + imo - 1)*nblk_row + iblk, &
1267 ((ispin - 1)*ndo_mo + imo - 1)*nblk_row + jblk, &
1268 donor_state%gw2x_evals(imo, ispin)*work_block)
1271 NULLIFY (work_block)
1273 CALL dbcsr_iterator_stop(iter)
1276 CALL dbcsr_finalize(matrix_a)
1277 CALL dbcsr_finalize(work_matrix)
1280 CALL dbcsr_add(matrix_a, work_matrix, 1.0_dp, -1.0_dp)
1281 CALL dbcsr_finalize(matrix_a)
1284 CALL dbcsr_release(work_matrix)
1287 CALL timestop(handle)
1289 END SUBROUTINE build_gs_contribution
1300 SUBROUTINE build_metric(matrix_g, donor_state, qs_env, do_os, do_inv)
1302 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_g
1303 TYPE(donor_state_type),
POINTER :: donor_state
1304 TYPE(qs_environment_type),
POINTER :: qs_env
1305 LOGICAL,
INTENT(IN) :: do_os
1306 LOGICAL,
INTENT(IN),
OPTIONAL :: do_inv
1308 CHARACTER(len=*),
PARAMETER :: routinen =
'build_metric'
1310 INTEGER :: blk, handle, i, iblk, jblk, nao, &
1311 nblk_row, ndo_mo, nspins
1312 INTEGER,
DIMENSION(:),
POINTER :: blk_size_g, row_blk_size
1313 LOGICAL :: found_block, my_do_inv
1314 REAL(
dp),
DIMENSION(:),
POINTER :: work_block
1315 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1316 TYPE(dbcsr_distribution_type),
POINTER :: dist_g
1317 TYPE(dbcsr_iterator_type) :: iter
1318 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
1319 TYPE(dbcsr_type) :: matrix_sinv
1320 TYPE(mp_para_env_type),
POINTER :: para_env
1322 NULLIFY (matrix_s, row_blk_size, work_block, para_env, blacs_env, dist_g, blk_size_g)
1324 CALL timeset(routinen, handle)
1327 nspins = 1;
IF (do_os) nspins = 2
1328 ndo_mo = donor_state%ndo_mo
1329 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
1330 CALL dbcsr_get_info(matrix_s(1)%matrix, row_blk_size=row_blk_size, nfullrows_total=nao)
1331 nblk_row =
SIZE(row_blk_size)
1333 IF (
PRESENT(do_inv)) my_do_inv = do_inv
1334 dist_g => donor_state%dbcsr_dist
1335 blk_size_g => donor_state%blk_size
1338 ALLOCATE (matrix_g(1)%matrix)
1339 CALL dbcsr_create(matrix=matrix_g(1)%matrix, name=
"MATRIX G", matrix_type=dbcsr_type_symmetric, &
1340 dist=dist_g, row_blk_size=blk_size_g, col_blk_size=blk_size_g)
1343 CALL dbcsr_iterator_start(iter, matrix_s(1)%matrix)
1344 DO WHILE (dbcsr_iterator_blocks_left(iter))
1346 CALL dbcsr_iterator_next_block(iter, row=iblk, column=jblk, blk=blk)
1349 CALL dbcsr_get_block_p(matrix_s(1)%matrix, iblk, jblk, work_block, found_block)
1351 IF (found_block)
THEN
1354 DO i = 1, ndo_mo*nspins
1355 CALL dbcsr_put_block(matrix_g(1)%matrix, (i - 1)*nblk_row + iblk, (i - 1)*nblk_row + jblk, work_block)
1359 NULLIFY (work_block)
1362 CALL dbcsr_iterator_stop(iter)
1365 CALL dbcsr_finalize(matrix_g(1)%matrix)
1370 cpassert(
SIZE(matrix_g) == 2)
1373 ALLOCATE (matrix_g(2)%matrix)
1374 CALL dbcsr_create(matrix=matrix_g(2)%matrix, name=
"MATRIX GINV", &
1375 matrix_type=dbcsr_type_symmetric, dist=dist_g, &
1376 row_blk_size=blk_size_g, col_blk_size=blk_size_g)
1379 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1380 CALL dbcsr_copy(matrix_sinv, matrix_s(1)%matrix)
1385 CALL dbcsr_iterator_start(iter, matrix_sinv)
1386 DO WHILE (dbcsr_iterator_blocks_left(iter))
1388 CALL dbcsr_iterator_next_block(iter, row=iblk, column=jblk, blk=blk)
1391 CALL dbcsr_get_block_p(matrix_sinv, iblk, jblk, work_block, found_block)
1393 IF (found_block)
THEN
1396 DO i = 1, ndo_mo*nspins
1397 CALL dbcsr_put_block(matrix_g(2)%matrix, (i - 1)*nblk_row + iblk, (i - 1)*nblk_row + jblk, work_block)
1401 NULLIFY (work_block)
1404 CALL dbcsr_iterator_stop(iter)
1407 CALL dbcsr_finalize(matrix_g(2)%matrix)
1410 CALL dbcsr_release(matrix_sinv)
1413 CALL timestop(handle)
1415 END SUBROUTINE build_metric
1432 SUBROUTINE build_aux_matrix(threshold, sx, matrix_a, matrix_d, matrix_e, do_hfx, proj_Q, &
1433 work, donor_state, eps_filter, qs_env)
1435 REAL(
dp),
INTENT(IN) :: threshold, sx
1436 TYPE(dbcsr_type),
INTENT(INOUT) :: matrix_a, matrix_d, matrix_e
1437 LOGICAL,
INTENT(IN) :: do_hfx
1438 TYPE(dbcsr_type),
INTENT(INOUT) :: proj_q, work
1439 TYPE(donor_state_type),
POINTER :: donor_state
1440 REAL(
dp),
INTENT(IN) :: eps_filter
1441 TYPE(qs_environment_type),
POINTER :: qs_env
1443 CHARACTER(len=*),
PARAMETER :: routinen =
'build_aux_matrix'
1445 INTEGER :: handle, ndep
1446 REAL(
dp) :: evals(2)
1447 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1448 TYPE(dbcsr_type) :: tmp_mat
1449 TYPE(mp_para_env_type),
POINTER :: para_env
1451 NULLIFY (blacs_env, para_env)
1453 CALL timeset(routinen, handle)
1455 CALL dbcsr_copy(tmp_mat, matrix_a)
1457 CALL dbcsr_add(tmp_mat, matrix_d, 1.0_dp, -1.0_dp*sx)
1458 CALL dbcsr_add(tmp_mat, matrix_e, 1.0_dp, 1.0_dp*sx)
1462 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, proj_q, tmp_mat, 0.0_dp, work, filter_eps=eps_filter)
1463 CALL dbcsr_multiply(
'N',
'T', 1.0_dp, work, proj_q, 0.0_dp, tmp_mat, filter_eps=eps_filter)
1466 ALLOCATE (donor_state%matrix_aux)
1467 CALL dbcsr_create(matrix=donor_state%matrix_aux, template=matrix_a, name=
"MAT AUX")
1469 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1472 CALL cp_dbcsr_power(tmp_mat, 0.5_dp, threshold, ndep, para_env, blacs_env, eigenvalues=evals)
1474 CALL dbcsr_copy(donor_state%matrix_aux, tmp_mat)
1477 IF (evals(1) < 0.0_dp .AND. abs(evals(1)) > threshold)
THEN
1478 cpwarn(
"The full TDDFT problem might not have been soundly turned Hermitian. Try TDA.")
1482 CALL dbcsr_release(tmp_mat)
1484 CALL timestop(handle)
1486 END SUBROUTINE build_aux_matrix
1503 TYPE(donor_state_type),
POINTER :: donor_state
1504 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
1505 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
1506 TYPE(qs_environment_type),
POINTER :: qs_env
1508 CHARACTER(len=*),
PARAMETER :: routinen =
'include_os_soc'
1510 INTEGER :: group, handle, homo, iex, isc, isf, nao, &
1511 ndo_mo, ndo_so, nex, npcols, nprows, &
1512 nsc, nsf, ntot, tas(2), tbs(2)
1513 INTEGER,
DIMENSION(:),
POINTER :: col_blk_size, col_dist, row_blk_size, &
1514 row_dist, row_dist_new
1515 INTEGER,
DIMENSION(:, :),
POINTER :: pgrid
1516 LOGICAL :: do_roks, do_uks
1517 REAL(
dp) :: eps_filter, gs_sum, soc
1518 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: diag, tmp_evals
1519 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: domo_soc_x, domo_soc_y, domo_soc_z, &
1521 REAL(
dp),
DIMENSION(:),
POINTER :: sc_evals, sf_evals
1522 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1523 TYPE(cp_cfm_type) :: evecs_cfm, pert_cfm
1524 TYPE(cp_fm_struct_type),
POINTER :: full_struct, gsex_struct, prod_struct, &
1525 vec_struct, work_struct
1526 TYPE(cp_fm_type) :: gsex_fm, img_fm, prod_work, real_fm, &
1527 vec_soc_x, vec_soc_y, vec_soc_z, &
1529 TYPE(cp_fm_type),
POINTER :: gs_coeffs, mo_coeff, sc_coeffs, sf_coeffs
1530 TYPE(dbcsr_distribution_type),
POINTER :: coeffs_dist, dbcsr_dist, prod_dist
1531 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
1532 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
1533 TYPE(dbcsr_type),
POINTER :: dbcsr_ovlp, dbcsr_prod, dbcsr_sc, &
1534 dbcsr_sf, dbcsr_tmp, dbcsr_work, &
1535 orb_soc_x, orb_soc_y, orb_soc_z
1536 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
1537 TYPE(mp_para_env_type),
POINTER :: para_env
1539 NULLIFY (gs_coeffs, sc_coeffs, sf_coeffs, matrix_s, orb_soc_x, orb_soc_y, orb_soc_z, mos)
1540 NULLIFY (full_struct, para_env, blacs_env, mo_coeff, sc_evals, sf_evals, vec_struct, prod_struct)
1541 NULLIFY (work_struct, gsex_struct, col_dist, row_dist)
1542 NULLIFY (col_blk_size, row_blk_size, row_dist_new, pgrid, dbcsr_sc, dbcsr_sf, dbcsr_work)
1543 NULLIFY (dbcsr_tmp, dbcsr_ovlp, dbcsr_prod)
1545 CALL timeset(routinen, handle)
1548 sc_coeffs => donor_state%sc_coeffs
1549 sf_coeffs => donor_state%sf_coeffs
1550 sc_evals => donor_state%sc_evals
1551 sf_evals => donor_state%sf_evals
1552 nsc =
SIZE(sc_evals)
1553 nsf =
SIZE(sf_evals)
1554 ntot = 1 + nsc + nsf
1556 ndo_mo = donor_state%ndo_mo
1558 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env, mos=mos, matrix_s=matrix_s)
1559 CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
1560 orb_soc_x => xas_tdp_env%orb_soc(1)%matrix
1561 orb_soc_y => xas_tdp_env%orb_soc(2)%matrix
1562 orb_soc_z => xas_tdp_env%orb_soc(3)%matrix
1563 do_roks = xas_tdp_control%do_roks
1564 do_uks = xas_tdp_control%do_uks
1565 eps_filter = xas_tdp_control%eps_filter
1569 IF (do_uks) gs_coeffs => donor_state%gs_coeffs
1572 nrow_global=nao, ncol_global=ndo_so)
1573 ALLOCATE (gs_coeffs)
1577 CALL cp_fm_to_fm_submat(msource=donor_state%gs_coeffs, mtarget=gs_coeffs, nrow=nao, &
1578 ncol=ndo_mo, s_firstrow=1, s_firstcol=1, t_firstrow=1, &
1580 CALL cp_fm_to_fm_submat(msource=donor_state%gs_coeffs, mtarget=gs_coeffs, nrow=nao, &
1581 ncol=ndo_mo, s_firstrow=1, s_firstcol=1, t_firstrow=1, &
1582 t_firstcol=ndo_mo + 1)
1589 nrow_global=ntot, ncol_global=ntot)
1602 CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist)
1603 CALL dbcsr_distribution_get(dbcsr_dist, group=group, row_dist=row_dist, pgrid=pgrid, &
1604 npcols=npcols, nprows=nprows)
1605 ALLOCATE (col_dist(nex), row_dist_new(nex))
1607 col_dist(iex) =
modulo(npcols - iex, npcols)
1608 row_dist_new(iex) =
modulo(nprows - iex, nprows)
1610 ALLOCATE (coeffs_dist, prod_dist)
1611 CALL dbcsr_distribution_new(coeffs_dist, group=group, pgrid=pgrid, row_dist=row_dist, &
1613 CALL dbcsr_distribution_new(prod_dist, group=group, pgrid=pgrid, row_dist=row_dist_new, &
1617 ALLOCATE (col_blk_size(nex))
1618 col_blk_size = ndo_so
1619 CALL dbcsr_get_info(matrix_s(1)%matrix, row_blk_size=row_blk_size)
1621 ALLOCATE (dbcsr_sc, dbcsr_sf, dbcsr_work, dbcsr_ovlp, dbcsr_tmp, dbcsr_prod)
1622 CALL dbcsr_create(matrix=dbcsr_sc, name=
"SPIN CONS", matrix_type=dbcsr_type_no_symmetry, &
1623 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
1624 CALL dbcsr_create(matrix=dbcsr_sf, name=
"SPIN FLIP", matrix_type=dbcsr_type_no_symmetry, &
1625 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
1626 CALL dbcsr_create(matrix=dbcsr_work, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, &
1627 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
1628 CALL dbcsr_create(matrix=dbcsr_prod, name=
"PROD", matrix_type=dbcsr_type_no_symmetry, &
1629 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
1630 CALL dbcsr_create(matrix=dbcsr_ovlp, name=
"OVLP", matrix_type=dbcsr_type_no_symmetry, &
1631 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
1634 CALL dbcsr_create(matrix=dbcsr_tmp, name=
"TMP", matrix_type=dbcsr_type_no_symmetry, &
1635 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
1636 CALL dbcsr_reserve_all_blocks(dbcsr_tmp)
1638 dbcsr_soc_package%dbcsr_sc => dbcsr_sc
1639 dbcsr_soc_package%dbcsr_sf => dbcsr_sf
1640 dbcsr_soc_package%dbcsr_work => dbcsr_work
1641 dbcsr_soc_package%dbcsr_ovlp => dbcsr_ovlp
1642 dbcsr_soc_package%dbcsr_prod => dbcsr_prod
1643 dbcsr_soc_package%dbcsr_tmp => dbcsr_tmp
1654 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, homo=homo)
1655 ALLOCATE (diag(homo))
1658 nrow_global=homo, ncol_global=homo)
1664 CALL parallel_gemm(
'T',
'N', homo, homo, nao, 1.0_dp, mo_coeff, vec_work, 0.0_dp, prod_work)
1668 CALL cp_fm_release(vec_work)
1669 CALL cp_fm_release(prod_work)
1672 NULLIFY (vec_struct)
1675 CALL get_mo_set(mos(2), mo_coeff=mo_coeff, homo=homo)
1676 ALLOCATE (diag(homo))
1679 nrow_global=homo, ncol_global=homo)
1685 CALL parallel_gemm(
'T',
'N', homo, homo, nao, 1.0_dp, mo_coeff, vec_work, 0.0_dp, prod_work)
1687 gs_sum = gs_sum - sum(diag)
1689 CALL cp_fm_release(vec_work)
1690 CALL cp_fm_release(prod_work)
1697 nrow_global=nao, ncol_global=ndo_so)
1699 nrow_global=ndo_so, ncol_global=ndo_so)
1704 ALLOCATE (diag(ndo_so))
1706 ALLOCATE (domo_soc_x(ndo_so, ndo_so), domo_soc_y(ndo_so, ndo_so), domo_soc_z(ndo_so, ndo_so))
1709 CALL parallel_gemm(
'T',
'N', ndo_so, ndo_so, nao, 1.0_dp, gs_coeffs, vec_soc_x, 0.0_dp, prod_work)
1713 CALL parallel_gemm(
'T',
'N', ndo_so, ndo_so, nao, 1.0_dp, gs_coeffs, vec_soc_y, 0.0_dp, prod_work)
1717 CALL parallel_gemm(
'T',
'N', ndo_so, ndo_so, nao, 1.0_dp, gs_coeffs, vec_soc_z, 0.0_dp, prod_work)
1722 nrow_global=nex, ncol_global=nex)
1731 nrow_global=nex*ndo_so, ncol_global=ndo_so)
1733 ALLOCATE (gsex_block(ndo_so, ndo_so))
1739 CALL parallel_gemm(
'T',
'N', nex*ndo_so, ndo_so, nao, -1.0_dp, sc_coeffs, vec_soc_z, 0.0_dp, gsex_fm)
1742 CALL cp_fm_get_submatrix(fm=gsex_fm, target_m=gsex_block, start_row=(isc - 1)*ndo_so + 1, &
1743 start_col=1, n_rows=ndo_so, n_cols=ndo_so)
1745 soc = sum(diag(1:ndo_mo)) - sum(diag(ndo_mo + 1:ndo_so))
1755 CALL parallel_gemm(
'T',
'N', nex*ndo_so, ndo_so, nao, -1.0_dp, sc_coeffs, vec_soc_x, 0.0_dp, gsex_fm)
1758 CALL cp_fm_get_submatrix(fm=gsex_fm, target_m=gsex_block, start_row=(isf - 1)*ndo_so + 1, &
1759 start_col=1, n_rows=ndo_so, n_cols=ndo_so)
1766 CALL parallel_gemm(
'T',
'N', nex*ndo_so, ndo_so, nao, -1.0_dp, sc_coeffs, vec_soc_y, 0.0_dp, gsex_fm)
1769 CALL cp_fm_get_submatrix(fm=gsex_fm, target_m=gsex_block, start_row=(isf - 1)*ndo_so + 1, &
1770 start_col=1, n_rows=ndo_so, n_cols=ndo_so)
1772 soc = sum(diag(1:ndo_mo))
1773 soc = soc - sum(diag(ndo_mo + 1:ndo_so))
1778 CALL cp_fm_release(gsex_fm)
1779 CALL cp_fm_release(vec_soc_x)
1780 CALL cp_fm_release(vec_soc_y)
1781 CALL cp_fm_release(vec_soc_z)
1782 CALL cp_fm_release(prod_work)
1786 DEALLOCATE (gsex_block)
1794 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_z, dbcsr_sc, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
1795 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sc, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
1798 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_sc, 0.0_dp, dbcsr_work, &
1799 filter_eps=eps_filter)
1800 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sc, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
1802 CALL os_amew_soc_elements(dbcsr_tmp, dbcsr_prod, dbcsr_ovlp, domo_soc_z, pref_diaga=1.0_dp, &
1803 pref_diagb=-1.0_dp, pref_tracea=-1.0_dp, pref_traceb=1.0_dp, &
1804 pref_diags=gs_sum, symmetric=.true.)
1807 CALL cp_fm_to_fm_submat(msource=work_fm, mtarget=img_fm, nrow=nex, ncol=nex, s_firstrow=1, &
1808 s_firstcol=1, t_firstrow=2, t_firstcol=2)
1816 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_z, dbcsr_sf, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
1817 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sf, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
1820 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_sf, 0.0_dp, &
1821 dbcsr_work, filter_eps=eps_filter)
1822 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sf, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
1826 CALL os_amew_soc_elements(dbcsr_tmp, dbcsr_prod, dbcsr_ovlp, domo_soc_z, pref_diaga=-1.0_dp, &
1827 pref_diagb=1.0_dp, pref_tracea=-1.0_dp, pref_traceb=1.0_dp, &
1828 pref_diags=gs_sum, symmetric=.true.)
1831 CALL cp_fm_to_fm_submat(msource=work_fm, mtarget=img_fm, nrow=nex, ncol=nex, s_firstrow=1, &
1832 s_firstcol=1, t_firstrow=1 + nsc + 1, t_firstcol=1 + nsc + 1)
1838 tas(1) = ndo_mo + 1; tbs(1) = 1
1839 tas(2) = 1; tbs(2) = ndo_mo + 1
1842 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_sf, 0.0_dp, &
1843 dbcsr_work, filter_eps=eps_filter)
1844 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sc, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
1847 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_x, dbcsr_sc, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
1848 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sf, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
1850 CALL os_amew_soc_elements(dbcsr_tmp, dbcsr_prod, dbcsr_ovlp, domo_soc_x, pref_diaga=1.0_dp, &
1851 pref_diagb=1.0_dp, pref_tracea=-1.0_dp, pref_traceb=-1.0_dp, &
1852 tracea_start=tas, traceb_start=tbs)
1855 CALL cp_fm_to_fm_submat(msource=work_fm, mtarget=img_fm, nrow=nex, ncol=nex, s_firstrow=1, &
1856 s_firstcol=1, t_firstrow=2, t_firstcol=1 + nsc + 1)
1859 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_y, dbcsr_sf, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
1860 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sc, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
1862 CALL os_amew_soc_elements(dbcsr_tmp, dbcsr_prod, dbcsr_ovlp, domo_soc_y, pref_diaga=1.0_dp, &
1863 pref_diagb=-1.0_dp, pref_tracea=1.0_dp, pref_traceb=-1.0_dp, &
1864 tracea_start=tas, traceb_start=tbs)
1867 CALL cp_fm_to_fm_submat(msource=work_fm, mtarget=real_fm, nrow=nex, ncol=nex, s_firstrow=1, &
1868 s_firstcol=1, t_firstrow=2, t_firstcol=1 + nsc + 1)
1874 CALL cp_fm_release(real_fm)
1875 CALL cp_fm_release(img_fm)
1878 ALLOCATE (tmp_evals(ntot))
1883 ALLOCATE (donor_state%soc_evals(ntot - 1))
1884 donor_state%soc_evals(:) = tmp_evals(2:ntot) - tmp_evals(1)
1887 CALL compute_soc_dipole_fosc(evecs_cfm, dbcsr_soc_package, donor_state, xas_tdp_env, &
1888 xas_tdp_control, qs_env, gs_coeffs=gs_coeffs)
1891 IF (xas_tdp_control%do_quad)
THEN
1892 CALL compute_soc_quadrupole_fosc(evecs_cfm, dbcsr_soc_package, donor_state, xas_tdp_env, &
1893 xas_tdp_control, qs_env, gs_coeffs=gs_coeffs)
1901 CALL cp_fm_release(gs_coeffs)
1902 DEALLOCATE (gs_coeffs)
1904 CALL dbcsr_distribution_release(coeffs_dist)
1905 CALL dbcsr_distribution_release(prod_dist)
1906 CALL dbcsr_release(dbcsr_sc)
1907 CALL dbcsr_release(dbcsr_sf)
1908 CALL dbcsr_release(dbcsr_prod)
1909 CALL dbcsr_release(dbcsr_ovlp)
1910 CALL dbcsr_release(dbcsr_tmp)
1911 CALL dbcsr_release(dbcsr_work)
1912 CALL cp_fm_release(work_fm)
1914 DEALLOCATE (coeffs_dist, prod_dist, col_dist, col_blk_size, row_dist_new)
1915 DEALLOCATE (dbcsr_sc, dbcsr_sf, dbcsr_work, dbcsr_prod, dbcsr_ovlp, dbcsr_tmp)
1917 CALL timestop(handle)
1940 TYPE(donor_state_type),
POINTER :: donor_state
1941 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
1942 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
1943 TYPE(qs_environment_type),
POINTER :: qs_env
1945 CHARACTER(len=*),
PARAMETER :: routinen =
'include_rcs_soc'
1947 INTEGER :: group, handle, iex, isg, itp, nao, &
1948 ndo_mo, nex, npcols, nprows, nsg, &
1950 INTEGER,
DIMENSION(:),
POINTER :: col_blk_size, col_dist, row_blk_size, &
1951 row_dist, row_dist_new
1952 INTEGER,
DIMENSION(:, :),
POINTER :: pgrid
1953 REAL(
dp) :: eps_filter, soc_gst, sqrt2
1954 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: diag, tmp_evals
1955 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: domo_soc_x, domo_soc_y, domo_soc_z, &
1957 REAL(
dp),
DIMENSION(:),
POINTER :: sg_evals, tp_evals
1958 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1959 TYPE(cp_cfm_type) :: evecs_cfm, hami_cfm
1960 TYPE(cp_fm_struct_type),
POINTER :: full_struct, gstp_struct, prod_struct, &
1961 vec_struct, work_struct
1962 TYPE(cp_fm_type) :: gstp_fm, img_fm, prod_fm, real_fm, &
1963 tmp_fm, vec_soc_x, vec_soc_y, &
1965 TYPE(cp_fm_type),
POINTER :: gs_coeffs, sg_coeffs, tp_coeffs
1966 TYPE(dbcsr_distribution_type),
POINTER :: coeffs_dist, dbcsr_dist, prod_dist
1967 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
1968 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
1969 TYPE(dbcsr_type),
POINTER :: dbcsr_ovlp, dbcsr_prod, dbcsr_sg, &
1970 dbcsr_tmp, dbcsr_tp, dbcsr_work, &
1971 orb_soc_x, orb_soc_y, orb_soc_z
1972 TYPE(mp_para_env_type),
POINTER :: para_env
1974 NULLIFY (sg_coeffs, tp_coeffs, gs_coeffs, sg_evals, tp_evals, full_struct)
1975 NULLIFY (para_env, blacs_env, prod_struct, vec_struct, orb_soc_y, orb_soc_z)
1976 NULLIFY (matrix_s, orb_soc_x)
1977 NULLIFY (work_struct, dbcsr_dist, coeffs_dist, prod_dist, pgrid)
1978 NULLIFY (col_dist, row_dist, col_blk_size, row_blk_size, row_dist_new, gstp_struct)
1979 NULLIFY (dbcsr_tp, dbcsr_sg, dbcsr_prod, dbcsr_work, dbcsr_ovlp, dbcsr_tmp)
1981 CALL timeset(routinen, handle)
1984 cpassert(
ASSOCIATED(xas_tdp_control))
1985 gs_coeffs => donor_state%gs_coeffs
1986 sg_coeffs => donor_state%sg_coeffs
1987 tp_coeffs => donor_state%tp_coeffs
1988 sg_evals => donor_state%sg_evals
1989 tp_evals => donor_state%tp_evals
1990 nsg =
SIZE(sg_evals)
1991 ntp =
SIZE(tp_evals)
1992 ntot = 1 + nsg + 3*ntp
1993 ndo_mo = donor_state%ndo_mo
1995 CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
1996 orb_soc_x => xas_tdp_env%orb_soc(1)%matrix
1997 orb_soc_y => xas_tdp_env%orb_soc(2)%matrix
1998 orb_soc_z => xas_tdp_env%orb_soc(3)%matrix
2000 cpassert(nsg == ntp)
2002 eps_filter = xas_tdp_control%eps_filter
2005 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
2007 nrow_global=ntot, ncol_global=ntot)
2018 CALL cp_fm_set_element(real_fm, 1 + itp + ntp + nsg, 1 + itp + ntp + nsg, tp_evals(itp))
2019 CALL cp_fm_set_element(real_fm, 1 + itp + 2*ntp + nsg, 1 + itp + 2*ntp + nsg, tp_evals(itp))
2023 CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist)
2024 CALL dbcsr_distribution_get(dbcsr_dist, group=group, row_dist=row_dist, pgrid=pgrid, &
2025 npcols=npcols, nprows=nprows)
2026 ALLOCATE (col_dist(nex), row_dist_new(nex))
2028 col_dist(iex) =
modulo(npcols - iex, npcols)
2029 row_dist_new(iex) =
modulo(nprows - iex, nprows)
2031 ALLOCATE (coeffs_dist, prod_dist)
2032 CALL dbcsr_distribution_new(coeffs_dist, group=group, pgrid=pgrid, row_dist=row_dist, &
2034 CALL dbcsr_distribution_new(prod_dist, group=group, pgrid=pgrid, row_dist=row_dist_new, &
2038 ALLOCATE (col_blk_size(nex))
2039 col_blk_size = ndo_mo
2040 CALL dbcsr_get_info(matrix_s(1)%matrix, row_blk_size=row_blk_size)
2042 ALLOCATE (dbcsr_sg, dbcsr_tp, dbcsr_work, dbcsr_ovlp, dbcsr_tmp, dbcsr_prod)
2043 CALL dbcsr_create(matrix=dbcsr_sg, name=
"SINGLETS", matrix_type=dbcsr_type_no_symmetry, &
2044 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
2045 CALL dbcsr_create(matrix=dbcsr_tp, name=
"TRIPLETS", matrix_type=dbcsr_type_no_symmetry, &
2046 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
2047 CALL dbcsr_create(matrix=dbcsr_work, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, &
2048 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
2049 CALL dbcsr_create(matrix=dbcsr_prod, name=
"PROD", matrix_type=dbcsr_type_no_symmetry, &
2050 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
2051 CALL dbcsr_create(matrix=dbcsr_ovlp, name=
"OVLP", matrix_type=dbcsr_type_no_symmetry, &
2052 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
2055 CALL dbcsr_create(matrix=dbcsr_tmp, name=
"TMP", matrix_type=dbcsr_type_no_symmetry, &
2056 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
2057 CALL dbcsr_reserve_all_blocks(dbcsr_tmp)
2059 dbcsr_soc_package%dbcsr_sg => dbcsr_sg
2060 dbcsr_soc_package%dbcsr_tp => dbcsr_tp
2061 dbcsr_soc_package%dbcsr_work => dbcsr_work
2062 dbcsr_soc_package%dbcsr_ovlp => dbcsr_ovlp
2063 dbcsr_soc_package%dbcsr_prod => dbcsr_prod
2064 dbcsr_soc_package%dbcsr_tmp => dbcsr_tmp
2073 nrow_global=ndo_mo, ncol_global=ndo_mo)
2079 nrow_global=nex, ncol_global=nex)
2082 ALLOCATE (diag(ndo_mo))
2085 sqrt2 = sqrt(2.0_dp)
2088 ALLOCATE (domo_soc_x(ndo_mo, ndo_mo), domo_soc_y(ndo_mo, ndo_mo), domo_soc_z(ndo_mo, ndo_mo))
2091 CALL parallel_gemm(
'T',
'N', ndo_mo, ndo_mo, nao, 1.0_dp, gs_coeffs, vec_soc_x, 0.0_dp, prod_fm)
2095 CALL parallel_gemm(
'T',
'N', ndo_mo, ndo_mo, nao, 1.0_dp, gs_coeffs, vec_soc_y, 0.0_dp, prod_fm)
2099 CALL parallel_gemm(
'T',
'N', ndo_mo, ndo_mo, nao, 1.0_dp, gs_coeffs, vec_soc_z, 0.0_dp, prod_fm)
2111 nrow_global=ntp*ndo_mo, ncol_global=ndo_mo)
2113 ALLOCATE (gstp_block(ndo_mo, ndo_mo))
2116 CALL parallel_gemm(
'T',
'N', ndo_mo*ntp, ndo_mo, nao, -1.0_dp, tp_coeffs, vec_soc_x, 0.0_dp, gstp_fm)
2119 CALL cp_fm_get_submatrix(fm=gstp_fm, target_m=gstp_block, start_row=(itp - 1)*ndo_mo + 1, &
2120 start_col=1, n_rows=ndo_mo, n_cols=ndo_mo)
2128 CALL parallel_gemm(
'T',
'N', ndo_mo*ntp, ndo_mo, nao, -1.0_dp, tp_coeffs, vec_soc_y, 0.0_dp, gstp_fm)
2131 CALL cp_fm_get_submatrix(fm=gstp_fm, target_m=gstp_block, start_row=(itp - 1)*ndo_mo + 1, &
2132 start_col=1, n_rows=ndo_mo, n_cols=ndo_mo)
2140 CALL parallel_gemm(
'T',
'N', ndo_mo*ntp, ndo_mo, nao, -1.0_dp, tp_coeffs, vec_soc_z, 0.0_dp, gstp_fm)
2143 CALL cp_fm_get_submatrix(fm=gstp_fm, target_m=gstp_block, start_row=(itp - 1)*ndo_mo + 1, &
2144 start_col=1, n_rows=ndo_mo, n_cols=ndo_mo)
2146 soc_gst = sqrt2*sum(diag)
2151 CALL cp_fm_release(prod_fm)
2152 CALL cp_fm_release(vec_soc_x)
2153 CALL cp_fm_release(vec_soc_y)
2154 CALL cp_fm_release(vec_soc_z)
2155 CALL cp_fm_release(gstp_fm)
2158 DEALLOCATE (gstp_block)
2162 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_tp, 0.0_dp, &
2163 dbcsr_work, filter_eps=eps_filter)
2164 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sg, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
2167 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_x, dbcsr_tp, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2168 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sg, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2171 pref_trace=-1.0_dp, pref_overall=-0.5_dp*sqrt2)
2176 s_firstrow=1, s_firstcol=1, t_firstrow=2, &
2177 t_firstcol=1 + nsg + 1)
2182 s_firstrow=1, s_firstcol=1, t_firstrow=2, &
2183 t_firstcol=1 + nsg + 2*ntp + 1)
2186 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_y, dbcsr_tp, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2187 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sg, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2190 pref_trace=-1.0_dp, pref_overall=-0.5_dp*sqrt2)
2195 s_firstrow=1, s_firstcol=1, t_firstrow=2, &
2196 t_firstcol=1 + nsg + 1)
2200 s_firstrow=1, s_firstcol=1, t_firstrow=2, &
2201 t_firstcol=1 + nsg + 2*ntp + 1)
2204 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_z, dbcsr_tp, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2205 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sg, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2208 pref_trace=-1.0_dp, pref_overall=1.0_dp)
2213 s_firstrow=1, s_firstcol=1, t_firstrow=2, &
2214 t_firstcol=1 + nsg + ntp + 1)
2218 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_tp, 0.0_dp, &
2219 dbcsr_work, filter_eps=eps_filter)
2220 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_tp, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
2223 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_x, dbcsr_tp, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2224 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_tp, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2227 pref_trace=1.0_dp, pref_overall=-0.5_dp*sqrt2)
2232 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + ntp + 1, &
2233 t_firstcol=1 + nsg + 2*ntp + 1)
2239 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + 1, &
2240 t_firstcol=1 + nsg + ntp + 1)
2243 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_y, dbcsr_tp, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2244 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_tp, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2247 pref_trace=1.0_dp, pref_overall=0.5_dp*sqrt2)
2252 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + ntp + 1, &
2253 t_firstcol=1 + nsg + 2*ntp + 1)
2259 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + 1, &
2260 t_firstcol=1 + nsg + ntp + 1)
2263 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, orb_soc_z, dbcsr_tp, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2264 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_tp, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2267 pref_trace=1.0_dp, pref_overall=1.0_dp)
2272 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + 2*ntp + 1, &
2273 t_firstcol=1 + nsg + 2*ntp + 1)
2278 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + 1, &
2279 t_firstcol=1 + nsg + 1)
2283 CALL cp_fm_release(work_fm)
2284 CALL cp_fm_release(tmp_fm)
2285 DEALLOCATE (diag, domo_soc_x, domo_soc_y, domo_soc_z)
2291 CALL cp_fm_release(real_fm)
2292 CALL cp_fm_release(img_fm)
2295 ALLOCATE (tmp_evals(ntot))
2300 ALLOCATE (donor_state%soc_evals(ntot - 1))
2301 donor_state%soc_evals(:) = tmp_evals(2:ntot) - tmp_evals(1)
2304 CALL compute_soc_dipole_fosc(evecs_cfm, dbcsr_soc_package, donor_state, xas_tdp_env, &
2305 xas_tdp_control, qs_env)
2308 IF (xas_tdp_control%do_quad)
THEN
2309 CALL compute_soc_quadrupole_fosc(evecs_cfm, dbcsr_soc_package, donor_state, xas_tdp_env, &
2310 xas_tdp_control, qs_env)
2317 CALL dbcsr_distribution_release(coeffs_dist)
2318 CALL dbcsr_distribution_release(prod_dist)
2319 CALL dbcsr_release(dbcsr_sg)
2320 CALL dbcsr_release(dbcsr_tp)
2321 CALL dbcsr_release(dbcsr_prod)
2322 CALL dbcsr_release(dbcsr_ovlp)
2323 CALL dbcsr_release(dbcsr_tmp)
2324 CALL dbcsr_release(dbcsr_work)
2325 DEALLOCATE (coeffs_dist, prod_dist, col_dist, col_blk_size, row_dist_new)
2326 DEALLOCATE (dbcsr_sg, dbcsr_tp, dbcsr_work, dbcsr_prod, dbcsr_ovlp, dbcsr_tmp)
2328 CALL timestop(handle)
2348 SUBROUTINE get_os_amew_op(amew_op, ao_op, gs_coeffs, dbcsr_soc_package, donor_state, &
2351 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
2352 INTENT(OUT) :: amew_op
2353 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ao_op
2354 TYPE(cp_fm_type),
INTENT(IN) :: gs_coeffs
2355 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
2356 TYPE(donor_state_type),
POINTER :: donor_state
2357 REAL(
dp),
INTENT(IN) :: eps_filter
2358 TYPE(qs_environment_type),
POINTER :: qs_env
2360 INTEGER :: dim_op, homo, i, isc, nao, ndo_mo, &
2361 ndo_so, nex, nsc, nsf, ntot
2363 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: diag, gsgs_op
2364 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: domo_op, gsex_block, tmp
2365 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
2366 TYPE(cp_fm_struct_type),
POINTER :: full_struct, gsex_struct, prod_struct, &
2367 tmp_struct, vec_struct
2368 TYPE(cp_fm_type) :: gsex_fm, prod_work, tmp_fm, vec_work, &
2370 TYPE(cp_fm_type),
POINTER :: mo_coeff, sc_coeffs, sf_coeffs
2371 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
2372 TYPE(dbcsr_type),
POINTER :: ao_op_i, dbcsr_ovlp, dbcsr_prod, &
2373 dbcsr_sc, dbcsr_sf, dbcsr_tmp, &
2375 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
2376 TYPE(mp_para_env_type),
POINTER :: para_env
2378 NULLIFY (matrix_s, para_env, blacs_env, full_struct, vec_struct, prod_struct, mos)
2379 NULLIFY (mo_coeff, ao_op_i, tmp_struct)
2380 NULLIFY (dbcsr_sc, dbcsr_sf, dbcsr_ovlp, dbcsr_work, dbcsr_tmp, dbcsr_prod)
2383 dim_op =
SIZE(ao_op)
2384 sc_coeffs => donor_state%sc_coeffs
2385 sf_coeffs => donor_state%sf_coeffs
2386 nsc =
SIZE(donor_state%sc_evals)
2387 nsf =
SIZE(donor_state%sf_evals)
2389 ntot = 1 + nsc + nsf
2390 ndo_mo = donor_state%ndo_mo
2391 ndo_so = 2*donor_state%ndo_mo
2392 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env, blacs_env=blacs_env, mos=mos)
2393 CALL dbcsr_get_info(matrix_s(1)%matrix, nfullrows_total=nao)
2395 dbcsr_sc => dbcsr_soc_package%dbcsr_sc
2396 dbcsr_sf => dbcsr_soc_package%dbcsr_sf
2397 dbcsr_work => dbcsr_soc_package%dbcsr_work
2398 dbcsr_tmp => dbcsr_soc_package%dbcsr_tmp
2399 dbcsr_prod => dbcsr_soc_package%dbcsr_prod
2400 dbcsr_ovlp => dbcsr_soc_package%dbcsr_ovlp
2404 nrow_global=ntot, ncol_global=ntot)
2405 ALLOCATE (amew_op(dim_op))
2412 ALLOCATE (gsgs_op(dim_op))
2415 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, homo=homo)
2416 ALLOCATE (diag(homo))
2419 nrow_global=homo, ncol_global=homo)
2425 ao_op_i => ao_op(i)%matrix
2428 CALL parallel_gemm(
'T',
'N', homo, homo, nao, 1.0_dp, mo_coeff, vec_work, 0.0_dp, prod_work)
2430 gsgs_op(i) = sum(diag)
2434 CALL cp_fm_release(vec_work)
2435 CALL cp_fm_release(prod_work)
2438 NULLIFY (vec_struct)
2441 CALL get_mo_set(mos(2), mo_coeff=mo_coeff, homo=homo)
2442 ALLOCATE (diag(homo))
2445 nrow_global=homo, ncol_global=homo)
2451 ao_op_i => ao_op(i)%matrix
2454 CALL parallel_gemm(
'T',
'N', homo, homo, nao, 1.0_dp, mo_coeff, vec_work, 0.0_dp, prod_work)
2456 gsgs_op(i) = gsgs_op(i) + sum(diag)
2460 CALL cp_fm_release(vec_work)
2461 CALL cp_fm_release(prod_work)
2464 NULLIFY (vec_struct)
2468 nrow_global=nao, ncol_global=ndo_so)
2470 nrow_global=ndo_so, ncol_global=ndo_so)
2472 nrow_global=ndo_so*nex, ncol_global=ndo_so)
2474 nrow_global=nex, ncol_global=nex)
2480 ALLOCATE (diag(ndo_so))
2481 ALLOCATE (domo_op(ndo_so, ndo_so))
2482 ALLOCATE (tmp(ndo_so, ndo_so))
2483 ALLOCATE (gsex_block(ndo_so, ndo_so))
2488 ao_op_i => ao_op(i)%matrix
2496 CALL parallel_gemm(
'T',
'N', ndo_so, ndo_so, nao, 1.0_dp, gs_coeffs, vec_work, 0.0_dp, prod_work)
2500 CALL parallel_gemm(
'T',
'N', ndo_so*nsc, ndo_so, nao, 1.0_dp, sc_coeffs, vec_work, 0.0_dp, gsex_fm)
2502 CALL cp_fm_get_submatrix(fm=gsex_fm, target_m=gsex_block, start_row=(isc - 1)*ndo_so + 1, &
2503 start_col=1, n_rows=ndo_so, n_cols=ndo_so)
2511 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_sc, 0.0_dp, &
2512 dbcsr_work, filter_eps=eps_filter)
2513 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sc, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
2516 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, ao_op_i, dbcsr_sc, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2517 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sc, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2519 CALL os_amew_soc_elements(dbcsr_tmp, dbcsr_prod, dbcsr_ovlp, domo_op, pref_diaga=1.0_dp, &
2520 pref_diagb=1.0_dp, pref_tracea=-1.0_dp, pref_traceb=-1.0_dp, &
2521 pref_diags=gsgs_op(i), symmetric=.true.)
2525 s_firstrow=1, s_firstcol=1, t_firstrow=2, t_firstcol=2)
2529 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_sf, 0.0_dp, &
2530 dbcsr_work, filter_eps=eps_filter)
2531 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sf, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
2534 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, ao_op_i, dbcsr_sf, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2535 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sf, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2538 tmp(1:ndo_mo, 1:ndo_mo) = domo_op(ndo_mo + 1:ndo_so, ndo_mo + 1:ndo_so)
2539 tmp(ndo_mo + 1:ndo_so, ndo_mo + 1:ndo_so) = domo_op(1:ndo_mo, 1:ndo_mo)
2541 CALL os_amew_soc_elements(dbcsr_tmp, dbcsr_prod, dbcsr_ovlp, tmp, pref_diaga=1.0_dp, &
2542 pref_diagb=1.0_dp, pref_tracea=-1.0_dp, pref_traceb=-1.0_dp, &
2543 pref_diags=gsgs_op(i), symmetric=.true.)
2547 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsc + 1, t_firstcol=1 + nsc + 1)
2560 CALL cp_fm_release(work_fm)
2561 CALL cp_fm_release(tmp_fm)
2562 CALL cp_fm_release(vec_work)
2563 CALL cp_fm_release(prod_work)
2564 CALL cp_fm_release(gsex_fm)
2566 END SUBROUTINE get_os_amew_op
2582 SUBROUTINE get_rcs_amew_op(amew_op, ao_op, dbcsr_soc_package, donor_state, eps_filter, qs_env)
2584 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
2585 INTENT(OUT) :: amew_op
2586 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ao_op
2587 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
2588 TYPE(donor_state_type),
POINTER :: donor_state
2589 REAL(
dp),
INTENT(IN) :: eps_filter
2590 TYPE(qs_environment_type),
POINTER :: qs_env
2592 INTEGER :: dim_op, homo, i, isg, nao, ndo_mo, nex, &
2594 REAL(
dp) :: op, sqrt2
2595 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: diag, gs_diag, gsgs_op
2596 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: domo_op, sggs_block
2597 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
2598 TYPE(cp_fm_struct_type),
POINTER :: full_struct, gsgs_struct, prod_struct, &
2599 sggs_struct, std_struct, tmp_struct, &
2601 TYPE(cp_fm_type) :: gs_fm, prod_fm, sggs_fm, tmp_fm, vec_op, &
2603 TYPE(cp_fm_type),
POINTER :: gs_coeffs, mo_coeff, sg_coeffs
2604 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
2605 TYPE(dbcsr_type),
POINTER :: ao_op_i, dbcsr_ovlp, dbcsr_prod, &
2606 dbcsr_sg, dbcsr_tmp, dbcsr_tp, &
2608 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
2609 TYPE(mp_para_env_type),
POINTER :: para_env
2611 NULLIFY (gs_coeffs, sg_coeffs, matrix_s, full_struct, prod_struct, vec_struct, blacs_env)
2612 NULLIFY (para_env, mo_coeff, mos, gsgs_struct, std_struct, tmp_struct, sggs_struct)
2613 NULLIFY (ao_op_i, dbcsr_tp, dbcsr_sg, dbcsr_ovlp, dbcsr_work, dbcsr_tmp, dbcsr_prod)
2616 gs_coeffs => donor_state%gs_coeffs
2617 sg_coeffs => donor_state%sg_coeffs
2618 nsg =
SIZE(donor_state%sg_evals)
2619 ntp = nsg; nex = nsg
2620 ntot = 1 + nsg + 3*ntp
2621 ndo_mo = donor_state%ndo_mo
2622 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env, blacs_env=blacs_env, mos=mos)
2623 sqrt2 = sqrt(2.0_dp)
2624 dim_op =
SIZE(ao_op)
2626 dbcsr_sg => dbcsr_soc_package%dbcsr_sg
2627 dbcsr_tp => dbcsr_soc_package%dbcsr_tp
2628 dbcsr_work => dbcsr_soc_package%dbcsr_work
2629 dbcsr_prod => dbcsr_soc_package%dbcsr_prod
2630 dbcsr_ovlp => dbcsr_soc_package%dbcsr_ovlp
2631 dbcsr_tmp => dbcsr_soc_package%dbcsr_tmp
2635 nrow_global=ntot, ncol_global=ntot)
2636 ALLOCATE (amew_op(dim_op))
2642 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nao=nao, homo=homo)
2644 nrow_global=homo, ncol_global=homo)
2648 ALLOCATE (gsgs_op(dim_op))
2649 ALLOCATE (gs_diag(homo))
2653 ao_op_i => ao_op(i)%matrix
2656 CALL parallel_gemm(
'T',
'N', homo, homo, nao, 1.0_dp, mo_coeff, work_fm, 0.0_dp, gs_fm)
2658 gsgs_op(i) = 2.0_dp*sum(gs_diag)
2662 CALL cp_fm_release(gs_fm)
2663 CALL cp_fm_release(work_fm)
2665 DEALLOCATE (gs_diag)
2670 nrow_global=ndo_mo, ncol_global=ndo_mo)
2674 nrow_global=nex, ncol_global=nex)
2676 nrow_global=ndo_mo*nsg, ncol_global=ndo_mo)
2680 ALLOCATE (diag(ndo_mo))
2681 ALLOCATE (domo_op(ndo_mo, ndo_mo))
2682 ALLOCATE (sggs_block(ndo_mo, ndo_mo))
2688 ao_op_i => ao_op(i)%matrix
2695 CALL parallel_gemm(
'T',
'N', ndo_mo, ndo_mo, nao, 1.0_dp, gs_coeffs, vec_op, 0.0_dp, prod_fm)
2699 CALL parallel_gemm(
'T',
'N', ndo_mo*nsg, ndo_mo, nao, 1.0_dp, sg_coeffs, vec_op, 0.0_dp, sggs_fm)
2701 CALL cp_fm_get_submatrix(fm=sggs_fm, target_m=sggs_block, start_row=(isg - 1)*ndo_mo + 1, &
2702 start_col=1, n_rows=ndo_mo, n_cols=ndo_mo)
2704 op = sqrt2*sum(diag)
2710 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_sg, 0.0_dp, &
2711 dbcsr_work, filter_eps=eps_filter)
2712 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sg, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
2715 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, ao_op_i, dbcsr_sg, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2716 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sg, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2720 pref_overall=1.0_dp, pref_diags=gsgs_op(i), symmetric=.true.)
2724 s_firstrow=1, s_firstcol=1, t_firstrow=2, t_firstcol=2)
2728 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, matrix_s(1)%matrix, dbcsr_tp, 0.0_dp, &
2729 dbcsr_work, filter_eps=eps_filter)
2730 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_tp, dbcsr_work, 0.0_dp, dbcsr_ovlp, filter_eps=eps_filter)
2733 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, ao_op_i, dbcsr_sg, 0.0_dp, dbcsr_work, filter_eps=eps_filter)
2734 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, dbcsr_sg, dbcsr_work, 0.0_dp, dbcsr_prod, filter_eps=eps_filter)
2737 pref_overall=1.0_dp, pref_diags=gsgs_op(i), symmetric=.true.)
2742 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + 1, t_firstcol=1 + nsg + 1)
2745 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + ntp + 1, &
2746 t_firstcol=1 + nsg + ntp + 1)
2749 s_firstrow=1, s_firstcol=1, t_firstrow=1 + nsg + 2*ntp + 1, &
2750 t_firstcol=1 + nsg + 2*ntp + 1)
2758 CALL cp_fm_release(prod_fm)
2759 CALL cp_fm_release(work_fm)
2760 CALL cp_fm_release(tmp_fm)
2761 CALL cp_fm_release(vec_op)
2762 CALL cp_fm_release(sggs_fm)
2768 END SUBROUTINE get_rcs_amew_op
2791 SUBROUTINE os_amew_soc_elements(amew_soc, lr_soc, lr_overlap, domo_soc, pref_diaga, &
2792 pref_diagb, pref_tracea, pref_traceb, pref_diags, &
2793 symmetric, tracea_start, traceb_start)
2795 TYPE(dbcsr_type) :: amew_soc, lr_soc, lr_overlap
2796 REAL(
dp),
DIMENSION(:, :) :: domo_soc
2797 REAL(
dp) :: pref_diaga, pref_diagb, pref_tracea, &
2799 REAL(
dp),
OPTIONAL :: pref_diags
2800 LOGICAL,
OPTIONAL :: symmetric
2801 INTEGER,
DIMENSION(2),
OPTIONAL :: tracea_start, traceb_start
2803 INTEGER :: blk, iex, jex, ndo_mo, ndo_so
2804 INTEGER,
DIMENSION(2) :: tas, tbs
2805 LOGICAL :: do_diags, found, my_symm
2806 REAL(
dp) :: soc_elem
2807 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: diag
2808 REAL(
dp),
DIMENSION(:, :),
POINTER :: pblock
2809 TYPE(dbcsr_iterator_type) :: iter
2811 ndo_so =
SIZE(domo_soc, 1)
2813 ALLOCATE (diag(ndo_so))
2815 IF (
PRESENT(symmetric)) my_symm = symmetric
2817 IF (
PRESENT(pref_diags)) do_diags = .true.
2825 IF (
PRESENT(tracea_start)) tas = tracea_start
2826 IF (
PRESENT(traceb_start)) tbs = traceb_start
2828 CALL dbcsr_set(amew_soc, 0.0_dp)
2830 CALL dbcsr_iterator_start(iter, amew_soc)
2831 DO WHILE (dbcsr_iterator_blocks_left(iter))
2833 CALL dbcsr_iterator_next_block(iter, row=iex, column=jex, blk=blk)
2835 IF (my_symm .AND. iex > jex) cycle
2839 CALL dbcsr_get_block_p(lr_soc, iex, jex, pblock, found)
2842 soc_elem = soc_elem + pref_diaga*sum(diag(1:ndo_mo)) + pref_diagb*(sum(diag(ndo_mo + 1:ndo_so)))
2845 CALL dbcsr_get_block_p(lr_overlap, iex, jex, pblock, found)
2847 soc_elem = soc_elem &
2848 + pref_tracea*sum(pblock(tas(1):tas(1) + ndo_mo - 1, tas(2):tas(2) + ndo_mo - 1)* &
2849 domo_soc(tas(1):tas(1) + ndo_mo - 1, tas(2):tas(2) + ndo_mo - 1)) &
2850 + pref_traceb*sum(pblock(tbs(1):tbs(1) + ndo_mo - 1, tbs(2):tbs(2) + ndo_mo - 1)* &
2851 domo_soc(tbs(1):tbs(1) + ndo_mo - 1, tbs(2):tbs(2) + ndo_mo - 1))
2855 soc_elem = soc_elem + pref_diags*sum(diag)
2859 CALL dbcsr_get_block_p(amew_soc, iex, jex, pblock, found)
2863 CALL dbcsr_iterator_stop(iter)
2865 END SUBROUTINE os_amew_soc_elements
2882 pref_overall, pref_diags, symmetric)
2884 TYPE(dbcsr_type) :: amew_soc, lr_soc, lr_overlap
2885 REAL(
dp),
DIMENSION(:, :) :: domo_soc
2886 REAL(
dp) :: pref_trace, pref_overall
2887 REAL(
dp),
OPTIONAL :: pref_diags
2888 LOGICAL,
OPTIONAL :: symmetric
2890 INTEGER :: blk, iex, jex
2891 LOGICAL :: do_diags, found, my_symm
2892 REAL(
dp) :: soc_elem
2893 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: diag
2894 REAL(
dp),
DIMENSION(:, :),
POINTER :: pblock
2895 TYPE(dbcsr_iterator_type) :: iter
2897 ALLOCATE (diag(
SIZE(domo_soc, 1)))
2899 IF (
PRESENT(symmetric)) my_symm = symmetric
2901 IF (
PRESENT(pref_diags)) do_diags = .true.
2903 CALL dbcsr_set(amew_soc, 0.0_dp)
2905 CALL dbcsr_iterator_start(iter, amew_soc)
2906 DO WHILE (dbcsr_iterator_blocks_left(iter))
2908 CALL dbcsr_iterator_next_block(iter, row=iex, column=jex, blk=blk)
2910 IF (my_symm .AND. iex > jex) cycle
2914 CALL dbcsr_get_block_p(lr_soc, iex, jex, pblock, found)
2917 soc_elem = soc_elem + sum(diag)
2920 CALL dbcsr_get_block_p(lr_overlap, iex, jex, pblock, found)
2922 soc_elem = soc_elem + pref_trace*sum(pblock*transpose(domo_soc))
2926 soc_elem = soc_elem + pref_diags*sum(diag)
2930 CALL dbcsr_get_block_p(amew_soc, iex, jex, pblock, found)
2931 pblock = pref_overall*soc_elem
2934 CALL dbcsr_iterator_stop(iter)
2949 SUBROUTINE compute_soc_dipole_fosc(soc_evecs_cfm, dbcsr_soc_package, donor_state, xas_tdp_env, &
2950 xas_tdp_control, qs_env, gs_coeffs)
2952 TYPE(cp_cfm_type),
INTENT(IN) :: soc_evecs_cfm
2953 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
2954 TYPE(donor_state_type),
POINTER :: donor_state
2955 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
2956 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
2957 TYPE(qs_environment_type),
POINTER :: qs_env
2958 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: gs_coeffs
2960 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_soc_dipole_fosc'
2962 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:, :) :: transdip
2963 INTEGER :: handle, i, nosc, ntot
2964 LOGICAL :: do_os, do_rcs
2965 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: osc_xyz
2966 REAL(
dp),
DIMENSION(:),
POINTER :: soc_evals
2967 REAL(
dp),
DIMENSION(:, :),
POINTER :: osc_str
2968 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
2969 TYPE(cp_cfm_type) :: dip_cfm, work1_cfm, work2_cfm
2970 TYPE(cp_fm_struct_type),
POINTER :: dip_struct, full_struct
2971 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: amew_dip
2972 TYPE(mp_para_env_type),
POINTER :: para_env
2974 NULLIFY (para_env, blacs_env, dip_struct, full_struct, osc_str)
2977 CALL timeset(routinen, handle)
2980 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
2981 do_os = xas_tdp_control%do_spin_cons
2982 do_rcs = xas_tdp_control%do_singlet
2983 soc_evals => donor_state%soc_evals
2984 nosc =
SIZE(soc_evals)
2986 ALLOCATE (donor_state%soc_osc_str(nosc, 4))
2987 osc_str => donor_state%soc_osc_str
2988 osc_str(:, :) = 0.0_dp
2989 IF (do_os .AND. .NOT.
PRESENT(gs_coeffs)) cpabort(
"Need to pass gs_coeffs for open-shell")
2993 nrow_global=ntot, ncol_global=1)
2998 ALLOCATE (transdip(ntot, 1))
3002 CALL get_os_amew_op(amew_dip, xas_tdp_env%dipmat, gs_coeffs, dbcsr_soc_package, &
3003 donor_state, xas_tdp_control%eps_filter, qs_env)
3005 CALL get_rcs_amew_op(amew_dip, xas_tdp_env%dipmat, dbcsr_soc_package, donor_state, &
3006 xas_tdp_control%eps_filter, qs_env)
3009 ALLOCATE (osc_xyz(nosc))
3013 CALL cp_fm_to_cfm(msourcer=amew_dip(i), mtarget=work1_cfm)
3016 CALL parallel_gemm(
'C',
'N', ntot, ntot, ntot, (1.0_dp, 0.0_dp), soc_evecs_cfm, work1_cfm, &
3017 (0.0_dp, 0.0_dp), work2_cfm)
3018 CALL parallel_gemm(
'N',
'N', ntot, 1, ntot, (1.0_dp, 0.0_dp), work2_cfm, soc_evecs_cfm, &
3019 (0.0_dp, 0.0_dp), dip_cfm)
3024 osc_xyz(:) = real(transdip(2:ntot, 1))**2 + aimag(transdip(2:ntot, 1))**2
3025 osc_str(:, 4) = osc_str(:, 4) + osc_xyz(:)
3026 osc_str(:, i) = osc_xyz(:)
3032 IF (xas_tdp_control%dipole_form ==
xas_dip_len)
THEN
3033 osc_str(:, i) = 2.0_dp/3.0_dp*soc_evals(:)*osc_str(:, i)
3035 osc_str(:, i) = 2.0_dp/3.0_dp/soc_evals(:)*osc_str(:, i)
3045 CALL cp_fm_release(amew_dip(i))
3047 DEALLOCATE (amew_dip, transdip)
3049 CALL timestop(handle)
3051 END SUBROUTINE compute_soc_dipole_fosc
3064 SUBROUTINE compute_soc_quadrupole_fosc(soc_evecs_cfm, dbcsr_soc_package, donor_state, &
3065 xas_tdp_env, xas_tdp_control, qs_env, gs_coeffs)
3067 TYPE(cp_cfm_type),
INTENT(IN) :: soc_evecs_cfm
3068 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
3069 TYPE(donor_state_type),
POINTER :: donor_state
3070 TYPE(xas_tdp_env_type),
POINTER :: xas_tdp_env
3071 TYPE(xas_tdp_control_type),
POINTER :: xas_tdp_control
3072 TYPE(qs_environment_type),
POINTER :: qs_env
3073 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: gs_coeffs
3075 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_soc_quadrupole_fosc'
3077 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:) :: trace
3078 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:, :) :: transquad
3079 INTEGER :: handle, i, nosc, ntot
3080 LOGICAL :: do_os, do_rcs
3081 REAL(
dp),
DIMENSION(:),
POINTER :: osc_str, soc_evals
3082 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
3083 TYPE(cp_cfm_type) :: quad_cfm, work1_cfm, work2_cfm
3084 TYPE(cp_fm_struct_type),
POINTER :: full_struct, quad_struct
3085 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: amew_quad
3086 TYPE(mp_para_env_type),
POINTER :: para_env
3088 NULLIFY (para_env, blacs_env, quad_struct, full_struct, osc_str)
3091 CALL timeset(routinen, handle)
3094 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
3095 do_os = xas_tdp_control%do_spin_cons
3096 do_rcs = xas_tdp_control%do_singlet
3097 soc_evals => donor_state%soc_evals
3098 nosc =
SIZE(soc_evals)
3100 ALLOCATE (donor_state%soc_quad_osc_str(nosc))
3101 osc_str => donor_state%soc_quad_osc_str
3103 IF (do_os .AND. .NOT.
PRESENT(gs_coeffs)) cpabort(
"Need to pass gs_coeffs for open-shell")
3107 nrow_global=ntot, ncol_global=1)
3112 ALLOCATE (transquad(ntot, 1))
3113 ALLOCATE (trace(nosc))
3114 trace = (0.0_dp, 0.0_dp)
3118 CALL get_os_amew_op(amew_quad, xas_tdp_env%quadmat, gs_coeffs, dbcsr_soc_package, &
3119 donor_state, xas_tdp_control%eps_filter, qs_env)
3121 CALL get_rcs_amew_op(amew_quad, xas_tdp_env%quadmat, dbcsr_soc_package, donor_state, &
3122 xas_tdp_control%eps_filter, qs_env)
3128 CALL cp_fm_to_cfm(msourcer=amew_quad(i), mtarget=work1_cfm)
3131 CALL parallel_gemm(
'C',
'N', ntot, ntot, ntot, (1.0_dp, 0.0_dp), soc_evecs_cfm, work1_cfm, &
3132 (0.0_dp, 0.0_dp), work2_cfm)
3133 CALL parallel_gemm(
'N',
'N', ntot, 1, ntot, (1.0_dp, 0.0_dp), work2_cfm, soc_evecs_cfm, &
3134 (0.0_dp, 0.0_dp), quad_cfm)
3139 IF (i == 1 .OR. i == 4 .OR. i == 6)
THEN
3140 osc_str(:) = osc_str(:) + real(transquad(2:ntot, 1))**2 + aimag(transquad(2:ntot, 1))**2
3141 trace(:) = trace(:) + transquad(2:ntot, 1)
3145 osc_str(:) = osc_str(:) + 2.0_dp*(real(transquad(2:ntot, 1))**2 + aimag(transquad(2:ntot, 1))**2)
3151 osc_str(:) = osc_str(:) - 1._dp/3._dp*(real(trace(:))**2 + aimag(trace(:))**2)
3154 osc_str(:) = osc_str(:)*1._dp/20._dp*
a_fine**2*soc_evals(:)**3
3161 CALL cp_fm_release(amew_quad)
3162 DEALLOCATE (transquad, trace)
3164 CALL timestop(handle)
3166 END SUBROUTINE compute_soc_quadrupole_fosc
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
methods related to the blacs parallel environment
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
Extract a sub-matrix from the full matrix: op(target_m)(1:n_rows,1:n_cols) = fm(start_row:start_row+n...
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.
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_cholesky_decompose(matrix, n, para_env, blacs_env)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_dbcsr_cholesky_invert(matrix, n, para_env, blacs_env, upper_to_full)
used to replace the cholesky decomposition by the inverse
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_power(matrix, exponent, threshold, n_dependent, para_env, blacs_env, verbose, eigenvectors, eigenvalues)
...
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
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.
basic linear algebra operations for full matrices
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
subroutine, public cp_fm_upper_to_full(matrix, work)
given an upper triangular matrix computes the corresponding full matrix
subroutine, public cp_fm_scale(alpha, matrix_a)
scales a matrix matrix_a = alpha * matrix_b
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_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_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_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
subroutine, public cp_fm_set_element(matrix, irow_global, icol_global, alpha)
sets an element of a matrix
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 ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
Defines the basic variable types.
integer, parameter, public dp
Collection of simple mathematical functions and subroutines.
pure real(kind=dp) function, dimension(min(size(a, 1), size(a, 2))), public get_diag(a)
Return the diagonal elements of matrix a as a vector.
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Definition of physical constants:
real(kind=dp), parameter, public a_fine
subroutine, public init_preconditioner(preconditioner_env, para_env, blacs_env)
...
subroutine, public destroy_preconditioner(preconditioner_env)
...
computes preconditioners, and implements methods to apply them currently used in qs_ot
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, WannierCentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, rhs)
Get the QUICKSTEP environment.
collects routines that perform operations directly related to MOs
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kTS, mu, flexible_electron_count)
Get the components of a MO set data structure.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
All the kernel specific subroutines for XAS TDP calculations.
subroutine, public kernel_coulomb_xc(coul_ker, xc_ker, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
Computes, if asked for it, the Coulomb and XC kernel matrices, in the usuall matrix format.
subroutine, public kernel_exchange(ex_ker, donor_state, xas_tdp_env, xas_tdp_control, qs_env)
Computes the exact exchange kernel matrix using RI. Returns an array of 2 matrices,...
Define XAS TDP control type and associated create, release, etc subroutines, as well as XAS TDP envir...
Utilities for X-ray absorption spectroscopy using TDDFPT.
subroutine, public include_rcs_soc(donor_state, xas_tdp_env, xas_tdp_control, qs_env)
Includes the SOC effects on the precomputed restricted closed-shell singlet and triplet excitations....
subroutine, public setup_xas_tdp_prob(donor_state, qs_env, xas_tdp_env, xas_tdp_control)
Builds the matrix that defines the XAS TDDFPT generalized eigenvalue problem to be solved for excitat...
subroutine, public solve_xas_tdp_prob(donor_state, xas_tdp_control, xas_tdp_env, qs_env, ex_type)
Solves the XAS TDP generalized eigenvalue problem omega*C = matrix_tdp*C using standard full diagonal...
subroutine, public include_os_soc(donor_state, xas_tdp_env, xas_tdp_control, qs_env)
Includes the SOC effects on the precomputed spin-conserving and spin-flip excitations from an open-sh...
subroutine, public rcs_amew_soc_elements(amew_soc, lr_soc, lr_overlap, domo_soc, pref_trace, pref_overall, pref_diags, symmetric)
Computes the rcs SOC matrix elements between excited states AMEWs based on the LR orbitals.