48 use,
intrinsic :: iso_fortran_env
95 integer,
parameter :: &
96 CASIDA_EPS_DIFF = 1, &
102 integer,
parameter :: &
112 logical :: states_are_real
113 integer,
allocatable :: n_occ(:)
114 integer,
allocatable :: n_unocc(:)
118 integer :: el_per_state
119 character(len=80) :: trandens
120 character(len=80) :: print_exst
121 real(real64) :: weight_thresh
123 logical :: calc_forces
124 logical :: calc_forces_kernel
125 logical :: calc_forces_scf
127 type(restart_t) :: restart_load
128 type(restart_t) :: restart_dump
130 logical,
allocatable :: is_included(:,:,:)
132 type(states_pair_t),
allocatable :: pair(:)
133 integer,
allocatable :: index(:,:,:)
134 integer,
allocatable :: ind(:)
136 real(real64),
allocatable :: dmat(:,:)
137 real(real64),
allocatable :: dmat_save(:,:)
138 complex(real64),
allocatable :: zmat(:,:)
139 complex(real64),
allocatable :: zmat_save(:,:)
140 real(real64),
allocatable :: w(:)
141 real(real64),
allocatable :: dtm(:, :)
142 complex(real64),
allocatable :: ztm(:, :)
143 real(real64),
allocatable :: f(:)
144 real(real64),
allocatable :: s(:)
146 real(real64),
allocatable :: rho(:,:)
147 real(real64),
allocatable :: fxc(:,:,:)
148 real(real64) :: kernel_lrc_alpha
150 real(real64),
allocatable :: fxc_grad(:,:,:,:,:)
151 real(real64),
allocatable :: fxc_grad_spin(:,:,:,:)
153 real(real64),
allocatable :: dmat2(:,:)
154 complex(real64),
allocatable :: zmat2(:,:)
155 real(real64),
allocatable :: dlr_hmat2(:,:)
156 complex(real64),
allocatable :: zlr_hmat2(:,:)
157 real(real64),
allocatable :: forces(:,:,:)
158 real(real64),
allocatable :: dw2(:)
159 real(real64),
allocatable :: zw2(:)
163 real(real64),
allocatable :: qvector(:)
164 real(real64),
allocatable :: qf(:)
165 real(real64),
allocatable :: qf_avg(:)
168 logical :: parallel_in_eh_pairs
169 logical :: parallel_in_domains
170 logical :: distributed_matrix
171 logical :: write_matrix
172 integer :: parallel_solver
173 type(mpi_grp_t) :: mpi_grp
174 logical :: fromScratch
175 logical :: has_photons
177 type(photon_mode_t),
pointer :: photon_modes => null()
179 integer :: n, nb_rows, nb_cols, block_size
180 type(blacs_proc_grid_t) :: proc_grid
181 integer :: desc(BLACS_DLEN)
182 type(MPI_Datatype) :: darray
190 real(real64),
allocatable :: dpot(:)
191 complex(real64),
allocatable :: zpot(:)
197 class(*),
intent(inout) :: system
198 logical,
intent(in) :: from_scratch
204 message(1) =
"CalculationMode = casida not implemented for multi-system calculations"
216 logical,
intent(in) :: fromscratch
220 integer :: idir, theorylevel, iatom, ierr, default_int
221 character(len=100) :: restart_filename
222 logical :: is_frac_occ
228 if (sys%hm%pcm%run_pcm)
then
232 if (sys%space%is_periodic())
then
233 message(1) =
"Casida oscillator strengths will be incorrect in periodic systems."
254 message(1) =
'Info: Starting Casida linear-response calculation.'
266 call gs_restart%end()
268 message(1) =
"Previous gs calculation is required."
272 cas%el_per_state = sys%st%smear%el_per_state
275 cas%space_dim = sys%space%dim
276 safe_allocate(cas%n_occ(1:sys%st%nik))
277 safe_allocate(cas%n_unocc(1:sys%st%nik))
279 call states_elec_count_pairs(sys%st, sys%namespace, cas%n_pairs, cas%n_occ, cas%n_unocc, cas%is_included, is_frac_occ)
280 if (is_frac_occ)
then
285 select case (sys%st%d%ispin)
287 write(
message(1),
'(a,i4,a)')
"Info: Found", cas%n_occ(1),
" occupied states."
288 write(
message(2),
'(a,i4,a)')
"Info: Found", cas%n_unocc(1),
" unoccupied states."
291 write(
message(1),
'(a,i4,a)')
"Info: Found", cas%n_occ(1),
" occupied states with spin up."
292 write(
message(2),
'(a,i4,a)')
"Info: Found", cas%n_unocc(1),
" unoccupied states with spin up."
293 write(
message(3),
'(a,i4,a)')
"Info: Found", cas%n_occ(2),
" occupied states with spin down."
294 write(
message(4),
'(a,i4,a)')
"Info: Found", cas%n_unocc(2),
" unoccupied states with spin down."
300 message(1) =
'Info: Setting up Hamiltonian.'
302 call v_ks_h_setup(sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st, sys%ks, &
303 sys%hm, calc_eigenval=.false.)
344 message(1) =
"Variational and full Casida theory levels do not apply to complex wavefunctions."
351 call parse_variable(sys%namespace,
'EnablePhotons', .false., cas%has_photons)
353 if (cas%has_photons)
then
355 cas%photon_modes => sys%photons%modes
357 write(
message(1),
'(a,i7,a)')
'INFO: Solving Casida equation with ', &
358 cas%photon_modes%nmodes,
' photon modes.'
359 write(
message(2),
'(a)')
'as described in ACS Photonics 2019, 6, 11, 2757-2778.'
361 cas%pt_nmodes = cas%photon_modes%nmodes
376 call parse_variable(sys%namespace,
'CasidaTransitionDensities',
"0", cas%trandens)
378 if (cas%trandens /=
"0")
then
380 sys%outp%how, sys%outp%output_interval)
393 safe_allocate(cas%qvector(1:cas%space_dim))
394 if (
parse_block(sys%namespace,
'CasidaMomentumTransfer', blk) == 0)
then
395 do idir = 1, cas%space_dim
400 message(1) =
"Info: Calculating IXS/EELS transition rates."
416 call parse_variable(sys%namespace,
'CasidaQuadratureOrder', 5, cas%avg_order)
432 call parse_variable(sys%namespace,
'CasidaCalcTriplet', .false., cas%triplet)
434 cas%triplet = .false.
437 if (cas%triplet)
then
438 message(1) =
"Info: Using triplet kernel. Oscillator strengths will be for spin magnetic-dipole field."
451 call parse_variable(sys%namespace,
'CasidaHermitianConjugate', .false., cas%herm_conj)
466 call parse_variable(sys%namespace,
'CasidaDistributedMatrix', .false., cas%distributed_matrix)
467#ifndef HAVE_SCALAPACK
468 if (cas%distributed_matrix)
then
469 message(1) =
"ScaLAPACK layout requested, but code not compiled with ScaLAPACK"
483 call parse_variable(sys%namespace,
'CasidaWriteDistributedMatrix', .false., cas%write_matrix)
484 if (.not. cas%distributed_matrix .and. cas%write_matrix)
then
485 message(1) =
"CasidaWriteDistributedMatrix con only be used with CasidaDistributedMatrix"
503 default_int = solver_elpa
507 call parse_variable(sys%namespace,
'CasidaParallelEigensolver', default_int, cas%parallel_solver)
512 if (cas%distributed_matrix .and. cas%parallel_solver == solver_elpa)
then
513 message(1) =
"ELPA solver requested, but code not compiled with ELPA"
528 call parse_variable(sys%namespace,
'CasidaPrintExcitations',
"all", cas%print_exst)
529 if (cas%distributed_matrix)
then
531 cas%print_exst =
"none"
532 message(1) =
"Using ScaLAPACK layout, thus disabling output of excited states."
533 message(2) =
"This options creates too many files for large Casida matrices."
549 if (cas%weight_thresh >
m_one)
then
550 message(1) =
'Casida coefficients have values between 0 and 1'
551 message(2) =
'Threshold values reset to default value'
553 cas%weight_thresh = -
m_one
563 call parse_variable(sys%namespace,
'CasidaCalcForces', .false., cas%calc_forces)
564 if (cas%calc_forces)
then
574 call parse_variable(sys%namespace,
'CasidaCalcForcesKernel', .
true., cas%calc_forces_kernel)
584 call parse_variable(sys%namespace,
'CasidaCalcForcesSCF', .false., cas%calc_forces_scf)
586 if (cas%distributed_matrix)
then
587 message(1) =
"Info: Forces calculation not compatible with ScaLAPACK layout."
588 message(2) =
"Using normal layout."
590 cas%distributed_matrix = .false.
597 cas%fromScratch = fromscratch
599 if (cas%fromScratch)
then
600 if (cas%triplet)
then
601 call cas%restart_dump%rm(
'kernel_triplet')
603 call cas%restart_dump%rm(
'kernel')
606 if (cas%calc_forces)
then
607 do iatom = 1, sys%ions%natoms
608 do idir = 1, cas%space_dim
609 write(restart_filename,
'(a,i6.6,a,i1)')
'lr_kernel_', iatom,
'_', idir
610 if (cas%triplet) restart_filename = trim(restart_filename)//
'_triplet'
611 call cas%restart_dump%rm(restart_filename)
613 write(restart_filename,
'(a,i6.6,a,i1)')
'lr_hmat1_', iatom,
'_', idir
614 call cas%restart_dump%rm(restart_filename)
621 if (
bitand(theorylevel, casida_eps_diff) /= 0)
then
622 message(1) =
"Info: Approximating resonance energies through KS eigenvalue differences"
624 cas%type = casida_eps_diff
628 if (sys%st%d%ispin /=
spinors)
then
632 message(1) =
"Info: Calculating matrix elements in the Tamm-Dancoff approximation"
640 message(1) =
"Info: Calculating matrix elements with the CV(2)-DFT theory"
647 message(1) =
"Info: Calculating matrix elements with the full Casida method"
656 message(1) =
"Info: Calculating resonance energies via the Petersilka approximation"
673 type(
casida_t),
intent(inout) :: cas
676 integer :: ist, ast, jpair, ik, ierr
678 integer :: np, np_rows, np_cols, ii, info
683 cas%kernel_lrc_alpha = sys%ks%xc%kernel_lrc_alpha
685 if (cas%distributed_matrix .and. .not. cas%states_are_real)
then
689 write(
message(1),
'(a,i9)')
"Number of occupied-unoccupied pairs: ", cas%n_pairs
692 if (cas%n_pairs < 1)
then
693 message(1) =
"No Casida pairs -- maybe there are no unoccupied states?"
697 if (
mpi_world%is_root())
write(*,
"(1x)")
701 if (cas%parallel_in_eh_pairs)
then
708 if (cas%distributed_matrix .and. .not. cas%parallel_in_eh_pairs)
then
709 message(1) =
"ScaLAPACK layout requested, but 'Other' parallelization strategy not available."
710 message(2) =
"Please set ParOther to use the ScaLAPACK layout."
711 message(3) =
"Continuing without ScaLAPACK layout."
713 cas%distributed_matrix = .false.
717 cas%n = cas%n_pairs + cas%pt_nmodes
720 if (cas%distributed_matrix)
then
724 np = cas%mpi_grp%size
728 if (mod(np, ii) == 0)
then
734 np_rows = np / np_cols
738 cas%block_size = min(64, cas%n / np_rows)
740 cas%block_size = max(5, cas%block_size)
741 write(
message(1),
'(A,I5,A,I5,A,I5,A)')
'Parallel layout: using block size of ',&
742 cas%block_size,
' and a processor grid with ', np_rows,
'x', np_cols, &
743 ' processors (rows x cols)'
749 cas%nb_rows = numroc(cas%n, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
750 cas%nb_cols = numroc(cas%n, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
753 call descinit(cas%desc(1), cas%n, cas%n, cas%block_size, cas%block_size, 0, 0, &
754 cas%proc_grid%context, cas%nb_rows, info)
764 safe_allocate(cas%pair(1:cas%n))
765 if (cas%states_are_real)
then
766 safe_allocate( cas%dmat(1:cas%nb_rows, 1:cas%nb_cols))
767 safe_allocate( cas%dtm(1:cas%n, 1:cas%space_dim))
770 safe_allocate( cas%zmat(1:cas%nb_rows, 1:cas%nb_cols))
771 safe_allocate( cas%ztm(1:cas%n, 1:cas%space_dim))
773 safe_allocate( cas%f(1:cas%n))
774 safe_allocate( cas%s(1:cas%n_pairs))
775 safe_allocate( cas%w(1:cas%n))
776 safe_allocate( cas%index(1:maxval(cas%n_occ), cas%nst - maxval(cas%n_unocc) + 1:cas%nst, 1:cas%nik))
777 safe_allocate( cas%ind(1:cas%n))
779 if (cas%calc_forces)
then
780 if (cas%states_are_real)
then
781 safe_allocate(cas%dmat_save(1:cas%n_pairs, 1:cas%n_pairs))
783 safe_allocate(cas%zmat_save(1:cas%n_pairs, 1:cas%n_pairs))
785 safe_allocate(cas%forces(1:cas%space_dim, 1:sys%ions%natoms, 1:cas%n_pairs))
789 safe_allocate( cas%qf (1:cas%n_pairs))
790 safe_allocate( cas%qf_avg(1:cas%n_pairs))
798 do ast = cas%n_occ(ik) + 1, cas%nst
799 do ist = 1, cas%n_occ(ik)
800 if (cas%is_included(ist, ast, ik))
then
801 cas%index(ist, ast, ik) = jpair
802 cas%pair(jpair)%i = ist
803 cas%pair(jpair)%a = ast
804 cas%pair(jpair)%kk = ik
811 if (cas%has_photons)
then
813 do ik = 1, cas%pt_nmodes
814 cas%pair(cas%n_pairs + ik)%i = 1
815 cas%pair(cas%n_pairs + ik)%a = -ik
816 cas%pair(cas%n_pairs + ik)%kk = -ik
820 safe_deallocate_a(cas%is_included)
831 type(
casida_t),
intent(inout) :: cas
835 assert(
allocated(cas%pair))
836 safe_deallocate_a(cas%pair)
837 safe_deallocate_a(cas%index)
838 if (cas%states_are_real)
then
839 safe_deallocate_a(cas%dmat)
840 safe_deallocate_a(cas%dtm)
842 safe_deallocate_a(cas%zmat)
843 safe_deallocate_a(cas%ztm)
845 safe_deallocate_a(cas%s)
846 safe_deallocate_a(cas%f)
847 safe_deallocate_a(cas%w)
848 safe_deallocate_a(cas%ind)
851 safe_deallocate_a(cas%qf)
852 safe_deallocate_a(cas%qf_avg)
855 safe_deallocate_a(cas%n_occ)
856 safe_deallocate_a(cas%n_unocc)
858 if (cas%calc_forces)
then
859 if (cas%states_are_real)
then
860 safe_deallocate_a(cas%dmat_save)
862 safe_deallocate_a(cas%zmat_save)
864 safe_deallocate_a(cas%forces)
867 call cas%restart_dump%end()
868 call cas%restart_load%end()
870 if (cas%distributed_matrix)
then
876 safe_deallocate_a(cas%qvector)
887 type(
casida_t),
intent(inout) :: cas
890 type(
grid_t),
pointer :: gr
892 real(real64),
allocatable :: rho_spin(:, :)
893 real(real64),
allocatable :: fxc_spin(:,:,:)
894 character(len=100) :: restart_filename
899 assert(cas%type >= casida_eps_diff .and. cas%type <=
casida_casida)
906 if (cas%states_are_real)
then
921 if (cas%type /= casida_eps_diff .or. cas%calc_forces)
then
923 safe_allocate(cas%rho(1:gr%np_part, 1:st%d%nspin))
924 safe_allocate(cas%fxc(1:gr%np, 1:st%d%nspin, 1:st%d%nspin))
925 cas%gga =
in_family(sys%ks%xc%family, [xc_family_gga])
927 safe_allocate(cas%fxc_grad(1:gr%np, 1:gr%der%dim, 1:gr%der%dim, 1:st%d%nspin, 1:st%d%nspin))
929 safe_allocate(cas%fxc_grad_spin(1:gr%np, 1:gr%der%dim, 1:st%d%nspin, 1:st%d%nspin))
931 safe_allocate(cas%fxc_grad_spin(0, 0, 0, 0))
934 safe_allocate(cas%fxc_grad(0, 0, 0, 0, 0))
935 safe_allocate(cas%fxc_grad_spin(0, 0, 0, 0))
939 if (cas%triplet)
then
940 safe_allocate(rho_spin(1:gr%np_part, 1:2))
941 safe_allocate(fxc_spin(1:gr%np, 1:2, 1:2))
943 rho_spin(:, 1) =
m_half * cas%rho(:, 1)
944 rho_spin(:, 2) =
m_half * cas%rho(:, 1)
947 cas%fxc(:, 1, 1) =
m_half * (fxc_spin(:, 1, 1) - fxc_spin(:, 1, 2))
949 safe_deallocate_a(rho_spin)
950 safe_deallocate_a(fxc_spin)
953 call xc_get_fxc(sys%ks%xc, gr, sys%namespace, cas%rho, st%d%ispin, cas%fxc, cas%fxc_grad, &
956 call xc_get_fxc(sys%ks%xc, gr, sys%namespace, cas%rho, st%d%ispin, cas%fxc)
966 restart_filename =
'kernel'
967 if (cas%triplet) restart_filename = trim(restart_filename)//
'_triplet'
969 select case (cas%type)
970 case (casida_eps_diff)
973 if (cas%states_are_real)
then
974 call dcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, gr, cas%dmat, cas%fxc, &
975 cas%fxc_grad, cas%fxc_grad_spin, restart_filename)
978 call zcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, gr, cas%zmat, cas%fxc, &
979 cas%fxc_grad, cas%fxc_grad_spin, restart_filename)
985 if (cas%mpi_grp%is_root() .or. cas%distributed_matrix)
then
986 if (cas%states_are_real)
then
993 if (cas%calc_forces)
then
994 if (cas%states_are_real)
then
1001 if (cas%states_are_real)
then
1008 if (cas%type /= casida_eps_diff .or. cas%calc_forces)
then
1009 safe_deallocate_a(cas%fxc)
1010 safe_deallocate_a(cas%fxc_grad)
1011 safe_deallocate_a(cas%fxc_grad_spin)
1012 safe_deallocate_a(cas%rho)
1023 real(real64),
allocatable :: w(:)
1030 do ia = 1, cas%n_pairs
1031 cas%w(ia) = st%eigenval(cas%pair(ia)%a, cas%pair(ia)%kk) - &
1032 st%eigenval(cas%pair(ia)%i, cas%pair(ia)%kk)
1034 message(1) =
"There is a negative unocc-occ KS eigenvalue difference for"
1035 write(
message(2),
'("states ",I5," and ",I5," of k-point ",I5,".")') cas%pair(ia)%i, cas%pair(ia)%a, cas%pair(ia)%kk
1036 message(3) =
"This indicates an inconsistency between gs, unocc, and/or casida calculations."
1042 safe_allocate(w(1:cas%n_pairs))
1044 call sort(w, cas%ind)
1045 safe_deallocate_a(w)
1047 if (
mpi_world%is_root())
write(*,
"(1x)")
1055 type(
v_ks_t),
intent(in) :: ks
1057 type(
grid_t),
intent(in) :: gr
1058 type(
casida_t),
intent(inout) :: cas
1060 real(real64),
allocatable :: rho(:, :)
1061 real(real64),
allocatable :: fxc_sic(:,:,:)
1067 message(1) =
"Casida calculation with ADSIC not implemented for spin-polarized calculations."
1070 if (cas%triplet)
then
1071 message(1) =
"Casida calculation with ADSIC not implemented for triplet excitations."
1075 message(1) =
"Casida calculation with ADSIC not implemented with GGAs."
1080 safe_allocate(fxc_sic(1:gr%np, 1:2, 1:2))
1081 safe_allocate(rho(1:gr%np, 1:2))
1083 rho(:, 1) = cas%rho(:, 1)/st%qtot
1088 cas%fxc = cas%fxc - fxc_sic(:, 1:1, 1:1)/st%qtot
1090 safe_deallocate_a(rho)
1091 safe_deallocate_a(fxc_sic)
1099 real(real64) function casida_matrix_factor(cas, sys)
1103 push_sub(casida_matrix_factor)
1105 casida_matrix_factor =
m_one
1108 casida_matrix_factor =
m_two * casida_matrix_factor
1112 casida_matrix_factor =
m_two * casida_matrix_factor
1115 pop_sub(casida_matrix_factor)
1122 type(namespace_t),
intent(in) :: namespace
1124 integer :: iunit, ia
1126 if (.not. mpi_world%is_root())
return
1130 call io_mkdir(casida_dir, namespace)
1131 iunit = io_open(casida_dir//
'q'//trim(
theory_name(cas)), namespace, action=
'write')
1132 write(iunit,
'(a1,a14,1x,a24,1x,a24,1x,a10,3es15.8,a2)')
'#',
'E' ,
'|<f|exp(iq.r)|i>|^2', &
1133 '<|<f|exp(iq.r)|i>|^2>',
'; q = (',cas%qvector(1:cas%space_dim),
')'
1134 write(iunit,
'(a1,a14,1x,a24,1x,a24,1x,10x,a15)')
'#', trim(units_abbrev(units_out%energy)), &
1139 if (cas%avg_order == 0)
then
1140 do ia = 1, cas%n_pairs
1141 write(iunit,
'(es15.8,es15.8)') units_from_atomic(units_out%energy, cas%w(cas%ind(ia))), cas%qf(cas%ind(ia))
1144 do ia = 1, cas%n_pairs
1145 write(iunit,
'(3es15.8)') units_from_atomic(units_out%energy, cas%w(cas%ind(ia))), &
1146 cas%qf (cas%ind(ia)), &
1147 cas%qf_avg(cas%ind(ia))
1151 call io_close(iunit)
1158 character(len=80) pure function theory_name(cas)
1161 select case (cas%type)
1180 type(states_elec_t),
intent(in) :: st
1181 integer,
intent(in) :: ia
1182 integer,
intent(in) :: jb
1186 isnt_degenerate = (abs((st%eigenval(cas%pair(ia)%a, cas%pair(ia)%kk) - st%eigenval(cas%pair(ia)%i, cas%pair(ia)%kk)) &
1187 - (st%eigenval(cas%pair(jb)%a, cas%pair(jb)%kk) - st%eigenval(cas%pair(jb)%i, cas%pair(jb)%kk))) > 1e-8_real64)
1194 type(
casida_t),
intent(inout) :: cas
1195 integer,
intent(in) :: jb_local
1197 if (.not. cas%distributed_matrix)
then
1200#ifdef HAVE_SCALAPACK
1201 jb = indxl2g(jb_local, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1208 type(
casida_t),
intent(inout) :: cas
1209 integer,
intent(in) :: ia_local
1211 if (.not. cas%distributed_matrix)
then
1214#ifdef HAVE_SCALAPACK
1215 ia = indxl2g(ia_local, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1220 subroutine local_indices(cas, ia, jb, on_this_processor, ia_local, jb_local)
1223 integer,
intent(in) :: ia, jb
1224 logical,
intent(out) :: on_this_processor
1225 integer,
intent(out) :: ia_local, jb_local
1226#ifdef HAVE_SCALAPACK
1227 integer :: ia_proc, jb_proc
1230 if (.not. cas%distributed_matrix)
then
1231 on_this_processor = .
true.
1235#ifdef HAVE_SCALAPACK
1236 ia_proc = indxg2p(ia, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1237 jb_proc = indxg2p(jb, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1238 if (cas%proc_grid%mycol == ia_proc .and. cas%proc_grid%myrow == jb_proc)
then
1240 ia_local = indxg2l(ia, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1241 jb_local = indxg2l(jb, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1243 on_this_processor = .false.
1253#include "casida_inc.F90"
1255#include "complex.F90"
1256#include "casida_inc.F90"
subroutine fxc_add_adsic(namespace, ks, st, gr, cas)
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)
integer, parameter solver_scalapack
subroutine zoscillator_strengths(cas, mesh, st)
integer, parameter casida_petersilka
integer, parameter casida_casida
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 dcasida_get_matrix(cas, namespace, hm, st, ks, gr, matrix, fxc, fxc_grad, fxc_grad_spin, restart_file, is_forces)
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....
subroutine zcasida_get_matrix(cas, namespace, hm, st, ks, gr, matrix, fxc, fxc_grad, fxc_grad_spin, restart_file, is_forces)
integer, parameter casida_variational
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 doscillator_strengths(cas, mesh, st)
subroutine dcasida_write(cas, sys)
real(real64) function casida_matrix_factor(cas, sys)
subroutine casida_run_legacy(sys, fromScratch)
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
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)
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:
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 states_elec_count_pairs(st, namespace, n_pairs, n_occ, n_unocc, is_included, is_frac_occ)
number of occupied-unoccupied pairs for Casida
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, is_complex, packed)
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
This module defines the unit system, used for input and output.
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)
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
subroutine, public xc_get_fxc(xcs, gr, namespace, rho, ispin, fxc, fxc_grad, fxc_grad_spin)
Returns the exchange-correlation kernel.
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.
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.
Container class for lists of system_oct_m::system_t.
The states_elec_t class contains all electronic wave functions.