68 use,
intrinsic :: iso_fortran_env
117 integer,
parameter :: &
118 CASIDA_EPS_DIFF = 1, &
124 integer,
parameter :: &
134 logical :: states_are_real
135 integer,
allocatable :: n_occ(:)
136 integer,
allocatable :: n_unocc(:)
140 integer :: el_per_state
141 character(len=80) :: trandens
142 character(len=80) :: print_exst
143 real(real64) :: weight_thresh
145 logical :: calc_forces
146 logical :: calc_forces_kernel
147 logical :: calc_forces_scf
149 type(restart_t) :: restart_load
150 type(restart_t) :: restart_dump
152 logical,
allocatable :: is_included(:,:,:)
154 type(states_pair_t),
allocatable :: pair(:)
156 integer,
allocatable :: index(:,:,:)
157 integer,
allocatable :: ind(:)
159 real(real64),
allocatable :: dmat(:,:)
160 real(real64),
allocatable :: dmat_save(:,:)
161 complex(real64),
allocatable :: zmat(:,:)
162 complex(real64),
allocatable :: zmat_save(:,:)
165 real(real64),
allocatable :: dmatB(:,:)
166 complex(real64),
allocatable :: zmatB(:,:)
167 real(real64),
allocatable :: w(:)
168 real(real64),
allocatable :: dtm(:, :)
169 complex(real64),
allocatable :: ztm(:, :)
170 real(real64),
allocatable :: f(:)
171 real(real64),
allocatable :: s(:)
173 real(real64),
allocatable :: rho(:,:)
174 real(real64),
allocatable :: fxc(:,:,:)
175 real(real64) :: kernel_lrc_alpha
177 real(real64),
allocatable :: fxc_grad(:,:,:,:,:)
178 real(real64),
allocatable :: fxc_grad_spin(:,:,:,:)
180 real(real64),
allocatable :: dmat2(:,:)
181 complex(real64),
allocatable :: zmat2(:,:)
182 real(real64),
allocatable :: dlr_hmat2(:,:)
183 complex(real64),
allocatable :: zlr_hmat2(:,:)
184 real(real64),
allocatable :: forces(:,:,:)
185 real(real64),
allocatable :: dw2(:)
186 real(real64),
allocatable :: zw2(:)
190 real(real64),
allocatable :: qvector(:)
191 real(real64),
allocatable :: qf(:)
192 real(real64),
allocatable :: qf_avg(:)
195 logical :: parallel_in_eh_pairs
196 logical :: parallel_in_domains
197 logical :: distributed_matrix
198 logical :: write_matrix
199 integer :: parallel_solver
201 logical :: fromScratch
202 logical :: has_photons
206 integer :: n, nb_rows, nb_cols, block_size
208 integer :: desc(blacs_dlen)
209 type(mpi_datatype) :: darray
217 real(real64),
allocatable :: dpot(:)
218 complex(real64),
allocatable :: zpot(:)
224 class(*),
intent(inout) :: system
225 logical,
intent(in) :: from_scratch
231 message(1) =
"CalculationMode = casida not implemented for multi-system calculations"
243 logical,
intent(in) :: fromscratch
247 integer :: idir, theorylevel, iatom, ierr, default_int
248 character(len=100) :: restart_filename
249 logical :: is_frac_occ
255 if (sys%hm%pcm%run_pcm)
then
259 if (sys%space%is_periodic())
then
260 message(1) =
"Casida oscillator strengths will be incorrect in periodic systems."
285 if (sys%hm%ep%requires_generalized_overlap)
then
296 message(1) =
"Casida with ultrasoft/PAW: eps_diff energies are exact and the oscillator"
297 message(2) =
"strengths include the augmentation term, but for theory levels beyond eps_diff"
298 message(3) =
"the kernel neglects the augmentation of the transition density (approximate)."
302 message(1) =
'Info: Starting Casida linear-response calculation.'
314 call gs_restart%end()
316 message(1) =
"Previous gs calculation is required."
320 cas%el_per_state = sys%st%smear%el_per_state
323 cas%space_dim = sys%space%dim
324 safe_allocate(cas%n_occ(1:sys%st%nik))
325 safe_allocate(cas%n_unocc(1:sys%st%nik))
327 call casida_count_pairs(sys%st, sys%namespace, cas%n_pairs, cas%n_occ, cas%n_unocc, cas%is_included, is_frac_occ)
328 select case (sys%st%d%ispin)
330 write(
message(1),
'(a,i4,a)')
"Info: Found", cas%n_occ(1),
" occupied states."
331 write(
message(2),
'(a,i4,a)')
"Info: Found", cas%n_unocc(1),
" unoccupied states."
334 write(
message(1),
'(a,i4,a)')
"Info: Found", cas%n_occ(1),
" occupied states with spin up."
335 write(
message(2),
'(a,i4,a)')
"Info: Found", cas%n_unocc(1),
" unoccupied states with spin up."
336 write(
message(3),
'(a,i4,a)')
"Info: Found", cas%n_occ(2),
" occupied states with spin down."
337 write(
message(4),
'(a,i4,a)')
"Info: Found", cas%n_unocc(2),
" unoccupied states with spin down."
343 message(1) =
'Info: Setting up Hamiltonian.'
345 call v_ks_h_setup(sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st, sys%ks, &
346 sys%hm, calc_eigenval=.false.)
387 message(1) =
"Variational and full Casida theory levels do not apply to complex wavefunctions."
394 call parse_variable(sys%namespace,
'EnablePhotons', .false., cas%has_photons)
396 if (cas%has_photons)
then
398 cas%photon_modes => sys%photons%modes
400 write(
message(1),
'(a,i7,a)')
'INFO: Solving Casida equation with ', &
401 cas%photon_modes%nmodes,
' photon modes.'
402 write(
message(2),
'(a)')
'as described in ACS Photonics 2019, 6, 11, 2757-2778.'
404 cas%pt_nmodes = cas%photon_modes%nmodes
419 call parse_variable(sys%namespace,
'CasidaTransitionDensities',
"0", cas%trandens)
421 if (cas%trandens /=
"0")
then
423 sys%outp%how, sys%outp%output_interval)
436 safe_allocate(cas%qvector(1:cas%space_dim))
437 if (
parse_block(sys%namespace,
'CasidaMomentumTransfer', blk) == 0)
then
438 do idir = 1, cas%space_dim
442 if (sys%hm%ep%requires_generalized_overlap)
then
447 "Casida momentum transfer with ultrasoft/PAW", namespace=sys%namespace)
450 message(1) =
"Info: Calculating IXS/EELS transition rates."
466 call parse_variable(sys%namespace,
'CasidaQuadratureOrder', 5, cas%avg_order)
482 call parse_variable(sys%namespace,
'CasidaCalcTriplet', .false., cas%triplet)
484 cas%triplet = .false.
487 if (cas%triplet)
then
488 message(1) =
"Info: Using triplet kernel. Oscillator strengths will be for spin magnetic-dipole field."
501 call parse_variable(sys%namespace,
'CasidaHermitianConjugate', .false., cas%herm_conj)
516 call parse_variable(sys%namespace,
'CasidaDistributedMatrix', .false., cas%distributed_matrix)
517#ifndef HAVE_SCALAPACK
518 if (cas%distributed_matrix)
then
519 message(1) =
"ScaLAPACK layout requested, but code not compiled with ScaLAPACK"
533 call parse_variable(sys%namespace,
'CasidaWriteDistributedMatrix', .false., cas%write_matrix)
534 if (.not. cas%distributed_matrix .and. cas%write_matrix)
then
535 message(1) =
"CasidaWriteDistributedMatrix con only be used with CasidaDistributedMatrix"
553 default_int = solver_elpa
557 call parse_variable(sys%namespace,
'CasidaParallelEigensolver', default_int, cas%parallel_solver)
562 if (cas%distributed_matrix .and. cas%parallel_solver == solver_elpa)
then
563 message(1) =
"ELPA solver requested, but code not compiled with ELPA"
578 call parse_variable(sys%namespace,
'CasidaPrintExcitations',
"all", cas%print_exst)
579 if (cas%distributed_matrix)
then
581 cas%print_exst =
"none"
582 message(1) =
"Using ScaLAPACK layout, thus disabling output of excited states."
583 message(2) =
"This options creates too many files for large Casida matrices."
599 if (cas%weight_thresh >
m_one)
then
600 message(1) =
'Casida coefficients have values between 0 and 1'
601 message(2) =
'Threshold values reset to default value'
603 cas%weight_thresh = -
m_one
613 call parse_variable(sys%namespace,
'CasidaCalcForces', .false., cas%calc_forces)
614 if (cas%calc_forces .and. sys%hm%ep%requires_generalized_overlap)
then
616 "Casida excited-state forces with ultrasoft/PAW", namespace=sys%namespace)
618 if (cas%calc_forces)
then
631 call parse_variable(sys%namespace,
'CasidaCalcForcesKernel', .
true., cas%calc_forces_kernel)
641 call parse_variable(sys%namespace,
'CasidaCalcForcesSCF', .false., cas%calc_forces_scf)
643 if (cas%distributed_matrix)
then
644 message(1) =
"Info: Forces calculation not compatible with ScaLAPACK layout."
645 message(2) =
"Using normal layout."
647 cas%distributed_matrix = .false.
655 cas%fromScratch = fromscratch
657 if (cas%fromScratch)
then
658 if (cas%triplet)
then
659 call cas%restart_dump%rm(
'kernel_triplet')
661 call cas%restart_dump%rm(
'kernel')
664 if (cas%calc_forces)
then
665 do iatom = 1, sys%ions%natoms
666 do idir = 1, cas%space_dim
667 write(restart_filename,
'(a,i6.6,a,i1)')
'lr_kernel_', iatom,
'_', idir
668 if (cas%triplet) restart_filename = trim(restart_filename)//
'_triplet'
669 call cas%restart_dump%rm(restart_filename)
671 write(restart_filename,
'(a,i6.6,a,i1)')
'lr_hmat1_', iatom,
'_', idir
672 call cas%restart_dump%rm(restart_filename)
679 if (
bitand(theorylevel, casida_eps_diff) /= 0)
then
680 message(1) =
"Info: Approximating resonance energies through KS eigenvalue differences"
682 cas%type = casida_eps_diff
686 if (sys%st%d%ispin /=
spinors)
then
688 if (sys%hm%theory_level ==
hartree_fock .and. cas%distributed_matrix)
then
690 namespace=sys%namespace)
695 message(1) =
"Info: Calculating matrix elements in the Tamm-Dancoff approximation"
706 message(1) =
"Info: Calculating matrix elements with the CV(2)-DFT theory"
714 message(1) =
"Info: Calculating matrix elements with the full Casida method"
726 message(1) =
"Info: Calculating resonance energies via the Petersilka approximation"
744 subroutine casida_count_pairs(st, namespace, n_pairs, n_occ, n_unocc, is_included, is_frac_occ)
747 integer,
intent(out) :: n_pairs
748 integer,
contiguous,
intent(out) :: n_occ(:)
749 integer,
contiguous,
intent(out) :: n_unocc(:)
750 logical,
allocatable,
intent(out) :: is_included(:,:,:)
752 logical,
intent(out) :: is_frac_occ
754 integer :: ik, ist, ast, n_filled, n_partially_filled, n_half_filled
755 character(len=80) :: nst_string, default, wfn_list
756 real(real64) :: energy_window
757 real(real64) :: fdiff, delta_e
758 real(real64) :: fdiff_tol
759 real(real64) :: delta_e_tol
763 is_frac_occ = .false.
765 call occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled)
766 if (n_partially_filled > 0 .or. n_half_filled > 0) is_frac_occ = .
true.
767 n_occ(ik) = n_filled + n_partially_filled + n_half_filled
768 n_unocc(ik) = st%nst - n_filled
791 call parse_variable(namespace,
'CasidaThresholdOccupation', 1.0e-12_real64, fdiff_tol)
824 safe_allocate(is_included(st%nst, st%nst , st%nik))
825 is_included(:,:,:) = .false.
827 if (energy_window <
m_zero)
then
828 write(nst_string,
'(i6)') st%nst
829 write(default,
'(a,a)')
"1-", trim(adjustl(nst_string))
830 call parse_variable(namespace,
'CasidaKohnShamStates', default, wfn_list)
832 write(
message(1),
'(a,a)')
"Info: States that form the basis: ", trim(wfn_list)
842 fdiff = st%occ(ist,ik) - st%occ(ast,ik)
843 if (fdiff <= fdiff_tol) cycle
844 n_pairs = n_pairs + 1
845 is_included(ist, ast, ik) = .
true.
852 write(
message(1),
'(a,f12.6,a)')
"Info: including transitions with energy < ", &
861 fdiff = st%occ(ist,ik) - st%occ(ast,ik)
862 if (fdiff <= fdiff_tol) cycle
863 delta_e = st%eigenval(ast, ik) - st%eigenval(ist, ik)
864 if (delta_e <= delta_e_tol) cycle
865 if (delta_e >= energy_window) cycle
866 n_pairs = n_pairs + 1
867 is_included(ist, ast, ik) = .
true.
880 type(
casida_t),
intent(inout) :: cas
883 integer :: ist, ast, jpair, ik, ierr
885 integer :: np, np_rows, np_cols, ii, info
891 cas%kernel_lrc_alpha = sys%ks%xc%lrc%alpha
893 if (cas%distributed_matrix .and. .not. cas%states_are_real)
then
897 write(
message(1),
'(a,i9)')
"Number of occupied-unoccupied pairs: ", cas%n_pairs
900 if (cas%n_pairs < 1)
then
901 message(1) =
"No Casida pairs -- maybe there are no unoccupied states?"
905 if (
mpi_world%is_root())
write(*,
"(1x)")
909 if (cas%parallel_in_eh_pairs)
then
916 if (cas%distributed_matrix .and. .not. cas%parallel_in_eh_pairs)
then
917 message(1) =
"ScaLAPACK layout requested, but 'Other' parallelization strategy not available."
918 message(2) =
"Please set ParOther to use the ScaLAPACK layout."
919 message(3) =
"Continuing without ScaLAPACK layout."
921 cas%distributed_matrix = .false.
925 cas%n = cas%n_pairs + cas%pt_nmodes
928 if (cas%distributed_matrix)
then
932 np = cas%mpi_grp%size
936 if (mod(np, ii) == 0)
then
942 np_rows = np / np_cols
946 cas%block_size = min(64, cas%n / np_rows)
948 cas%block_size = max(5, cas%block_size)
949 write(
message(1),
'(A,I5,A,I5,A,I5,A)')
'Parallel layout: using block size of ',&
950 cas%block_size,
' and a processor grid with ', np_rows,
'x', np_cols, &
951 ' processors (rows x cols)'
957 cas%nb_rows = numroc(cas%n, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
958 cas%nb_cols = numroc(cas%n, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
961 call descinit(cas%desc(1), cas%n, cas%n, cas%block_size, cas%block_size, 0, 0, &
962 cas%proc_grid%context, cas%nb_rows, info)
971 safe_allocate(cas%pair(1:cas%n))
972 if (cas%states_are_real)
then
973 safe_allocate( cas%dmat(1:cas%nb_rows, 1:cas%nb_cols))
974 safe_allocate( cas%dtm(1:cas%n, 1:cas%space_dim))
977 safe_allocate( cas%zmat(1:cas%nb_rows, 1:cas%nb_cols))
978 safe_allocate( cas%ztm(1:cas%n, 1:cas%space_dim))
980 safe_allocate( cas%f(1:cas%n))
981 safe_allocate( cas%s(1:cas%n_pairs))
982 safe_allocate( cas%w(1:cas%n))
983 safe_allocate( cas%index(1:cas%nst, 1:cas%nst, 1:cas%nik))
984 safe_allocate( cas%ind(1:cas%n))
986 if (cas%calc_forces)
then
987 if (cas%states_are_real)
then
988 safe_allocate(cas%dmat_save(1:cas%n_pairs, 1:cas%n_pairs))
990 safe_allocate(cas%zmat_save(1:cas%n_pairs, 1:cas%n_pairs))
992 safe_allocate(cas%forces(1:cas%space_dim, 1:sys%ions%natoms, 1:cas%n_pairs))
996 safe_allocate( cas%qf (1:cas%n_pairs))
997 safe_allocate( cas%qf_avg(1:cas%n_pairs))
1000 cas%index(:,:,:) = 0
1007 if (.not. cas%is_included(ist, ast, ik)) cycle
1008 cas%index(ist, ast, ik) = jpair
1009 cas%pair(jpair)%i = ist
1010 cas%pair(jpair)%a = ast
1011 cas%pair(jpair)%kk = ik
1016 if (jpair - 1 /= cas%n_pairs)
then
1017 message(1) =
"Mismatch in Casida pair counting"
1021 if (cas%has_photons)
then
1023 do ik = 1, cas%pt_nmodes
1024 cas%pair(cas%n_pairs + ik)%i = 1
1025 cas%pair(cas%n_pairs + ik)%a = -ik
1026 cas%pair(cas%n_pairs + ik)%kk = -ik
1030 safe_deallocate_a(cas%is_included)
1041 type(
casida_t),
intent(inout) :: cas
1045 assert(
allocated(cas%pair))
1046 safe_deallocate_a(cas%pair)
1047 safe_deallocate_a(cas%index)
1048 if (cas%states_are_real)
then
1049 safe_deallocate_a(cas%dmat)
1050 safe_deallocate_a(cas%dtm)
1051 safe_deallocate_a(cas%dmatB)
1053 safe_deallocate_a(cas%zmat)
1054 safe_deallocate_a(cas%ztm)
1055 safe_deallocate_a(cas%zmatB)
1057 safe_deallocate_a(cas%s)
1058 safe_deallocate_a(cas%f)
1059 safe_deallocate_a(cas%w)
1060 safe_deallocate_a(cas%ind)
1063 safe_deallocate_a(cas%qf)
1064 safe_deallocate_a(cas%qf_avg)
1067 safe_deallocate_a(cas%n_occ)
1068 safe_deallocate_a(cas%n_unocc)
1070 if (cas%calc_forces)
then
1071 if (cas%states_are_real)
then
1072 safe_deallocate_a(cas%dmat_save)
1074 safe_deallocate_a(cas%zmat_save)
1076 safe_deallocate_a(cas%forces)
1079 call cas%restart_dump%end()
1080 call cas%restart_load%end()
1082 if (cas%distributed_matrix)
then
1083#ifdef HAVE_SCALAPACK
1088 safe_deallocate_a(cas%qvector)
1099 type(
casida_t),
intent(inout) :: cas
1102 type(
grid_t),
pointer :: gr
1104 real(real64),
allocatable :: rho_spin(:, :)
1105 real(real64),
allocatable :: fxc_spin(:,:,:), fxc_grad(:,:,:,:,:), fxc_grad_spin(:,:,:,:)
1106 character(len=100) :: restart_filename
1111 assert(cas%type >= casida_eps_diff .and. cas%type <=
casida_casida)
1118 if (cas%states_are_real)
then
1121 if (
allocated(cas%dmatB)) cas%dmatB =
m_zero
1125 if (
allocated(cas%zmatB)) cas%zmatB =
m_zero
1135 if (cas%type /= casida_eps_diff .or. cas%calc_forces)
then
1137 safe_allocate(cas%rho(1:gr%np_part, 1:st%d%nspin))
1138 safe_allocate(cas%fxc(1:gr%np, 1:st%d%nspin, 1:st%d%nspin))
1139 cas%gga =
in_family(sys%ks%xc%kernel_family, [xc_family_gga])
1142 if (sys%hm%theory_level ==
hartree_fock) cas%gga = .false.
1144 safe_allocate(cas%fxc_grad(1:gr%np, 1:gr%der%dim, 1:gr%der%dim, 1:st%d%nspin, 1:st%d%nspin))
1146 safe_allocate(cas%fxc_grad_spin(1:gr%np, 1:gr%der%dim, 1:st%d%nspin, 1:st%d%nspin))
1148 safe_allocate(cas%fxc_grad_spin(0, 0, 0, 0))
1151 safe_allocate(cas%fxc_grad(0, 0, 0, 0, 0))
1152 safe_allocate(cas%fxc_grad_spin(0, 0, 0, 0))
1159 else if (cas%triplet)
then
1160 safe_allocate(rho_spin(1:gr%np_part, 1:2))
1161 safe_allocate(fxc_spin(1:gr%np, 1:2, 1:2))
1163 rho_spin(:, 1) =
m_half * cas%rho(:, 1)
1164 rho_spin(:, 2) =
m_half * cas%rho(:, 1)
1167 safe_allocate(fxc_grad(1:gr%np, 1:gr%der%dim, 1:gr%der%dim, 1:2, 1:2))
1168 safe_allocate(fxc_grad_spin(1:gr%np, 1:gr%der%dim, 1:2, 1:2))
1170 cas%fxc_grad(:, :, :, 1, 1) =
m_half * (fxc_grad(:, :, :, 1, 1) - fxc_grad(:, :, :, 1, 2))
1172 safe_deallocate_a(fxc_grad)
1173 safe_deallocate_a(fxc_grad_spin)
1177 cas%fxc(:, 1, 1) =
m_half * (fxc_spin(:, 1, 1) - fxc_spin(:, 1, 2))
1179 safe_deallocate_a(rho_spin)
1180 safe_deallocate_a(fxc_spin)
1183 call xc_get_fxc(sys%ks%xc, gr, sys%namespace, cas%rho, st%d%ispin, cas%fxc, cas%fxc_grad, &
1186 call xc_get_fxc(sys%ks%xc, gr, sys%namespace, cas%rho, st%d%ispin, cas%fxc)
1191 call xc_sic_add_fxc_adsic(sys%namespace, sys%ks%xc, st, gr, cas%rho, cas%fxc, cas%fxc_grad, cas%fxc_grad_spin, cas%triplet)
1196 restart_filename =
'kernel'
1197 if (cas%triplet) restart_filename = trim(restart_filename)//
'_triplet'
1200 if (cas%pt_nmodes > 0)
then
1203 if (cas%states_are_real)
then
1204 safe_allocate(cas%dmatB(1:cas%n_pairs, 1:cas%n_pairs))
1206 safe_allocate(cas%zmatB(1:cas%n_pairs, 1:cas%n_pairs))
1210 select case (cas%type)
1211 case (casida_eps_diff)
1214 if (cas%states_are_real)
then
1215 if (
allocated(cas%dmatB))
then
1216 call dcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, gr, cas%dmat, cas%fxc, &
1217 cas%fxc_grad, cas%fxc_grad_spin, restart_filename, matrixb=cas%dmatB)
1219 call dcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, gr, cas%dmat, cas%fxc, &
1220 cas%fxc_grad, cas%fxc_grad_spin, restart_filename)
1224 if (
allocated(cas%zmatB))
then
1225 call zcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, gr, cas%zmat, cas%fxc, &
1226 cas%fxc_grad, cas%fxc_grad_spin, restart_filename, matrixb=cas%zmatB)
1228 call zcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, gr, cas%zmat, cas%fxc, &
1229 cas%fxc_grad, cas%fxc_grad_spin, restart_filename)
1236 if (cas%mpi_grp%is_root() .or. cas%distributed_matrix)
then
1237 if (cas%states_are_real)
then
1244 if (cas%calc_forces)
then
1245 if (cas%states_are_real)
then
1252 if (cas%states_are_real)
then
1258 safe_deallocate_a(cas%dmatB)
1259 safe_deallocate_a(cas%zmatB)
1262 if (cas%type /= casida_eps_diff .or. cas%calc_forces)
then
1263 safe_deallocate_a(cas%fxc)
1264 safe_deallocate_a(cas%fxc_grad)
1265 safe_deallocate_a(cas%fxc_grad_spin)
1266 safe_deallocate_a(cas%rho)
1277 real(real64),
allocatable :: w(:)
1284 do ia = 1, cas%n_pairs
1285 cas%w(ia) = st%eigenval(cas%pair(ia)%a, cas%pair(ia)%kk) - &
1286 st%eigenval(cas%pair(ia)%i, cas%pair(ia)%kk)
1288 message(1) =
"There is a negative unocc-occ KS eigenvalue difference for"
1289 write(
message(2),
'("states ",I5," and ",I5," of k-point ",I5,".")') cas%pair(ia)%i, cas%pair(ia)%a, cas%pair(ia)%kk
1290 message(3) =
"This indicates an inconsistency between gs, unocc, and/or casida calculations."
1296 safe_allocate(w(1:
size(cas%w)))
1298 call sort(w, cas%ind)
1299 safe_deallocate_a(w)
1301 if (
mpi_world%is_root())
write(*,
"(1x)")
1309 real(real64) function casida_matrix_factor(cas, sys)
1313 push_sub(casida_matrix_factor)
1315 casida_matrix_factor =
m_one
1318 casida_matrix_factor =
m_two * casida_matrix_factor
1322 casida_matrix_factor =
m_two * casida_matrix_factor
1325 pop_sub(casida_matrix_factor)
1332 type(namespace_t),
intent(in) :: namespace
1334 integer :: iunit, ia
1336 if (.not. mpi_world%is_root())
return
1340 call io_mkdir(casida_dir, namespace)
1341 iunit = io_open(casida_dir//
'q'//trim(
theory_name(cas)), namespace, action=
'write')
1342 write(iunit,
'(a1,a14,1x,a24,1x,a24,1x,a10,3es15.8,a2)')
'#',
'E' ,
'|<f|exp(iq.r)|i>|^2', &
1343 '<|<f|exp(iq.r)|i>|^2>',
'; q = (',cas%qvector(1:cas%space_dim),
')'
1344 write(iunit,
'(a1,a14,1x,a24,1x,a24,1x,10x,a15)')
'#', trim(units_abbrev(units_out%energy)), &
1349 if (cas%avg_order == 0)
then
1350 do ia = 1, cas%n_pairs
1351 write(iunit,
'(es15.8,es15.8)') units_from_atomic(units_out%energy, cas%w(cas%ind(ia))), cas%qf(cas%ind(ia))
1354 do ia = 1, cas%n_pairs
1355 write(iunit,
'(3es15.8)') units_from_atomic(units_out%energy, cas%w(cas%ind(ia))), &
1356 cas%qf (cas%ind(ia)), &
1357 cas%qf_avg(cas%ind(ia))
1361 call io_close(iunit)
1368 character(len=80) pure function theory_name(cas)
1371 select case (cas%type)
1390 type(states_elec_t),
intent(in) :: st
1391 integer,
intent(in) :: ia
1392 integer,
intent(in) :: jb
1396 isnt_degenerate = (abs((st%eigenval(cas%pair(ia)%a, cas%pair(ia)%kk) - st%eigenval(cas%pair(ia)%i, cas%pair(ia)%kk)) &
1397 - (st%eigenval(cas%pair(jb)%a, cas%pair(jb)%kk) - st%eigenval(cas%pair(jb)%i, cas%pair(jb)%kk))) > 1e-8_real64)
1404 type(
casida_t),
intent(inout) :: cas
1405 integer,
intent(in) :: jb_local
1407 if (.not. cas%distributed_matrix)
then
1410#ifdef HAVE_SCALAPACK
1411 jb = indxl2g(jb_local, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1418 type(
casida_t),
intent(inout) :: cas
1419 integer,
intent(in) :: ia_local
1421 if (.not. cas%distributed_matrix)
then
1424#ifdef HAVE_SCALAPACK
1425 ia = indxl2g(ia_local, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1430 subroutine local_indices(cas, ia, jb, on_this_processor, ia_local, jb_local)
1433 integer,
intent(in) :: ia, jb
1434 logical,
intent(out) :: on_this_processor
1435 integer,
intent(out) :: ia_local, jb_local
1436#ifdef HAVE_SCALAPACK
1437 integer :: ia_proc, jb_proc
1440 if (.not. cas%distributed_matrix)
then
1441 on_this_processor = .
true.
1445#ifdef HAVE_SCALAPACK
1446 ia_proc = indxg2p(ia, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1447 jb_proc = indxg2p(jb, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1448 if (cas%proc_grid%mycol == ia_proc .and. cas%proc_grid%myrow == jb_proc)
then
1449 on_this_processor = .
true.
1450 ia_local = indxg2l(ia, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1451 jb_local = indxg2l(jb, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1453 on_this_processor = .false.
1463#include "casida_inc.F90"
1465#include "complex.F90"
1466#include "casida_inc.F90"
subroutine solve_eps_diff
This is the common interface to a sorting routine. It performs the shell algorithm,...
double floor(double __x) __attribute__((__nothrow__
This module implements batches of mesh functions.
This module provides the BLACS processor grid.
subroutine, public blacs_proc_grid_init(this, mpi_grp, procdim)
Initializes a blacs context from an MPI communicator with topological information.
subroutine, public blacs_proc_grid_end(this)
This module handles the calculation mode.
integer, parameter, public p_strategy_other
something else like e-h pairs
integer, parameter, public p_strategy_domains
parallelization in domains
This module implements the Casida equations for excited states.
integer function get_global_col(cas, ia_local)
subroutine zcasida_get_matrix(cas, namespace, hm, st, ks, gr, matrix, fxc, fxc_grad, fxc_grad_spin, restart_file, is_forces, matrixB)
integer, parameter solver_scalapack
subroutine casida_count_pairs(st, namespace, n_pairs, n_occ, n_unocc, is_included, is_frac_occ)
number of occupied-unoccupied pairs for Casida
integer, parameter casida_petersilka
integer, parameter casida_casida
subroutine doscillator_strengths(cas, mesh, st, hm)
subroutine casida_type_init(cas, sys)
allocates stuff, and constructs the arrays pair_i and pair_j
integer function get_global_row(cas, jb_local)
integer, parameter casida_eps_diff
character(len=80) pure function theory_name(cas)
subroutine dcasida_forces(cas, sys, gr, st)
subroutine local_indices(cas, ia, jb, on_this_processor, ia_local, jb_local)
subroutine zcasida_solve(cas, sys)
subroutine casida_work(sys, cas)
this subroutine calculates electronic excitation energies using the matrix formulation of M....
integer, parameter casida_variational
subroutine dcasida_get_matrix(cas, namespace, hm, st, ks, gr, matrix, fxc, fxc_grad, fxc_grad_spin, restart_file, is_forces, matrixB)
subroutine qcasida_write(cas, namespace)
subroutine zcasida_write(cas, sys)
logical function isnt_degenerate(cas, st, ia, jb)
subroutine, public casida_run(system, from_scratch)
subroutine dcasida_write(cas, sys)
real(real64) function casida_matrix_factor(cas, sys)
subroutine casida_run_legacy(sys, fromScratch)
subroutine zoscillator_strengths(cas, mesh, st, hm)
integer, parameter casida_tamm_dancoff
subroutine zcasida_forces(cas, sys, gr, st)
subroutine casida_type_end(cas)
subroutine dcasida_solve(cas, sys)
This module implements a calculator for the density and defines related functions.
subroutine, public states_elec_total_density(st, mesh, total_rho)
This routine calculates the total electronic density.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
integer, parameter, public spin_polarized
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
integer, parameter, public hartree_fock
integer, parameter, public generalized_kohn_sham_dft
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public io_function_read_what_how_when(namespace, space, what, how, output_interval, what_tag_in, how_tag_in, output_interval_tag_in, ignore_error)
integer pure function, public kpoints_number(this)
A module to handle KS potential, without the external potential.
integer, parameter, public dft_u_none
System information (time, memory, sysname)
logical function, public loct_isinstringlist(a, s)
subroutine, public loct_progress_bar(a, maxcount)
A wrapper around the progress bar, such that it can be silenced without needing to dress the call wit...
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
type(mpi_comm), parameter, public mpi_comm_undefined
used to indicate a communicator has not been initialized
type(mpi_grp_t), public mpi_world
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
This module handles the communicators for the various parallelization strategies.
logical pure function, public multicomm_strategy_is_parallel(mc, level)
This module implements the basic mulsisystem class, a container system for other systems.
integer function, public parse_block(namespace, name, blk, check_varinfo_)
subroutine, public photon_mode_set_n_electrons(this, qtot)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
integer, parameter, public restart_casida
integer, parameter, public restart_gs
integer, parameter, public restart_type_dump
integer, parameter, public restart_type_load
This module contains interfaces for ScaLAPACK routines Interfaces are from http://www....
This module is intended to contain "only mathematical" functions and procedures.
pure logical function, public states_are_complex(st)
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, filled, partially_filled, half_filled)
return information about occupied orbitals in many-body state
This module handles reading and writing restart information for the states_elec_t.
subroutine, public states_elec_look_and_load(restart, namespace, space, st, mesh, kpoints, fixed_occ, is_complex, packed)
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
character(len=20) pure function, public units_abbrev(this)
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
type(unit_system_t), public units_inp
the units systems for reading and writing
This module is intended to contain simple general-purpose utility functions and procedures.
subroutine, public v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
subroutine, public xc_get_fxc(xcs, gr, namespace, rho, ispin, fxc, fxc_grad, fxc_grad_spin)
Returns the exchange-correlation kernel.
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
logical pure function, public family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
pure logical function, public in_family(family, xc_families)
subroutine, public xc_write_fxc_info(xcs, iunit, namespace)
subroutine, public xc_sic_write_info(sic, iunit, namespace)
integer, parameter, public sic_adsic
Averaged density SIC.
subroutine, public xc_sic_add_fxc_adsic(namespace, xc, st, gr, rho, fxc, fxc_grad, fxc_grad_spin, triplet)
Adds to fxc the ADSIC contribution.
This class contains all parameters, needed for Casida calculations.
Class describing the electron system.
Description of the grid, containing information on derivatives, stencil, and symmetries.
This is defined even when running serial.
Container class for lists of system_oct_m::system_t.
The states_elec_t class contains all electronic wave functions.