46 use,
intrinsic :: iso_fortran_env
93 integer,
parameter :: &
94 CASIDA_EPS_DIFF = 1, &
100 integer,
parameter :: &
110 logical :: states_are_real
111 integer,
allocatable :: n_occ(:)
112 integer,
allocatable :: n_unocc(:)
116 integer :: el_per_state
117 character(len=80) :: trandens
118 character(len=80) :: print_exst
119 real(real64) :: weight_thresh
121 logical :: calc_forces
122 logical :: calc_forces_kernel
123 logical :: calc_forces_scf
125 type(restart_t) :: restart_load
126 type(restart_t) :: restart_dump
128 logical,
allocatable :: is_included(:,:,:)
130 type(states_pair_t),
allocatable :: pair(:)
131 integer,
allocatable :: index(:,:,:)
132 integer,
allocatable :: ind(:)
134 real(real64),
allocatable :: dmat(:,:)
135 real(real64),
allocatable :: dmat_save(:,:)
136 complex(real64),
allocatable :: zmat(:,:)
137 complex(real64),
allocatable :: zmat_save(:,:)
138 real(real64),
allocatable :: w(:)
139 real(real64),
allocatable :: dtm(:, :)
140 complex(real64),
allocatable :: ztm(:, :)
141 real(real64),
allocatable :: f(:)
142 real(real64),
allocatable :: s(:)
144 real(real64),
allocatable :: rho(:,:)
145 real(real64),
allocatable :: fxc(:,:,:)
146 real(real64) :: kernel_lrc_alpha
148 real(real64),
allocatable :: dmat2(:,:)
149 complex(real64),
allocatable :: zmat2(:,:)
150 real(real64),
allocatable :: dlr_hmat2(:,:)
151 complex(real64),
allocatable :: zlr_hmat2(:,:)
152 real(real64),
allocatable :: forces(:,:,:)
153 real(real64),
allocatable :: dw2(:)
154 real(real64),
allocatable :: zw2(:)
158 real(real64),
allocatable :: qvector(:)
159 real(real64),
allocatable :: qf(:)
160 real(real64),
allocatable :: qf_avg(:)
163 logical :: parallel_in_eh_pairs
164 logical :: parallel_in_domains
165 logical :: distributed_matrix
166 logical :: write_matrix
167 integer :: parallel_solver
168 type(mpi_grp_t) :: mpi_grp
169 logical :: fromScratch
170 logical :: has_photons
172 type(photon_mode_t),
pointer :: photon_modes => null()
174 integer :: n, nb_rows, nb_cols, block_size
175 type(blacs_proc_grid_t) :: proc_grid
176 integer :: desc(BLACS_DLEN)
177 type(MPI_Datatype) :: darray
185 real(real64),
allocatable :: dpot(:)
186 complex(real64),
allocatable :: zpot(:)
221 class(*),
intent(inout) :: system
222 logical,
intent(in) :: from_scratch
228 message(1) =
"CalculationMode = casida not implemented for multi-system calculations"
240 logical,
intent(in) :: fromscratch
244 integer :: idir, theorylevel, iatom, ierr, default_int
245 character(len=100) :: restart_filename
246 logical :: is_frac_occ
252 if (sys%hm%pcm%run_pcm)
then
256 if (sys%space%is_periodic())
then
257 message(1) =
"Casida oscillator strengths will be incorrect in periodic systems."
278 message(1) =
'Info: Starting Casida linear-response calculation.'
287 message(1) =
"Previous gs calculation is required."
291 cas%el_per_state = sys%st%smear%el_per_state
294 cas%space_dim = sys%space%dim
295 safe_allocate(cas%n_occ(1:sys%st%nik))
296 safe_allocate(cas%n_unocc(1:sys%st%nik))
298 call states_elec_count_pairs(sys%st, sys%namespace, cas%n_pairs, cas%n_occ, cas%n_unocc, cas%is_included, is_frac_occ)
299 if (is_frac_occ)
then
304 select case (sys%st%d%ispin)
306 write(
message(1),
'(a,i4,a)')
"Info: Found", cas%n_occ(1),
" occupied states."
307 write(
message(2),
'(a,i4,a)')
"Info: Found", cas%n_unocc(1),
" unoccupied states."
310 write(
message(1),
'(a,i4,a)')
"Info: Found", cas%n_occ(1),
" occupied states with spin up."
311 write(
message(2),
'(a,i4,a)')
"Info: Found", cas%n_unocc(1),
" unoccupied states with spin up."
312 write(
message(3),
'(a,i4,a)')
"Info: Found", cas%n_occ(2),
" occupied states with spin down."
313 write(
message(4),
'(a,i4,a)')
"Info: Found", cas%n_unocc(2),
" unoccupied states with spin down."
319 message(1) =
'Info: Setting up Hamiltonian.'
321 call v_ks_h_setup(sys%namespace, sys%space, sys%gr, sys%ions, sys%ext_partners, sys%st, sys%ks, &
322 sys%hm, calc_eigenval=.false.)
363 message(1) =
"Variational and full Casida theory levels do not apply to complex wavefunctions."
370 call parse_variable(sys%namespace,
'EnablePhotons', .false., cas%has_photons)
372 if (cas%has_photons)
then
374 cas%photon_modes => sys%photons%modes
376 write(
message(1),
'(a,i7,a)')
'INFO: Solving Casida equation with ', &
377 cas%photon_modes%nmodes,
' photon modes.'
378 write(
message(2),
'(a)')
'as described in ACS Photonics 2019, 6, 11, 2757-2778.'
380 cas%pt_nmodes = cas%photon_modes%nmodes
395 call parse_variable(sys%namespace,
'CasidaTransitionDensities',
"0", cas%trandens)
397 if (cas%trandens /=
"0")
then
399 sys%outp%how, sys%outp%output_interval)
412 safe_allocate(cas%qvector(1:cas%space_dim))
413 if (
parse_block(sys%namespace,
'CasidaMomentumTransfer', blk) == 0)
then
414 do idir = 1, cas%space_dim
420 message(1) =
"Info: Calculating IXS/EELS transition rates."
436 call parse_variable(sys%namespace,
'CasidaQuadratureOrder', 5, cas%avg_order)
452 call parse_variable(sys%namespace,
'CasidaCalcTriplet', .false., cas%triplet)
454 cas%triplet = .false.
457 if (cas%triplet)
then
458 message(1) =
"Info: Using triplet kernel. Oscillator strengths will be for spin magnetic-dipole field."
471 call parse_variable(sys%namespace,
'CasidaHermitianConjugate', .false., cas%herm_conj)
486 call parse_variable(sys%namespace,
'CasidaDistributedMatrix', .false., cas%distributed_matrix)
487#ifndef HAVE_SCALAPACK
488 if (cas%distributed_matrix)
then
489 message(1) =
"ScaLAPACK layout requested, but code not compiled with ScaLAPACK"
503 call parse_variable(sys%namespace,
'CasidaWriteDistributedMatrix', .false., cas%write_matrix)
504 if (.not. cas%distributed_matrix .and. cas%write_matrix)
then
505 message(1) =
"CasidaWriteDistributedMatrix con only be used with CasidaDistributedMatrix"
523 default_int = solver_elpa
527 call parse_variable(sys%namespace,
'CasidaParallelEigensolver', default_int, cas%parallel_solver)
532 if (cas%distributed_matrix .and. cas%parallel_solver == solver_elpa)
then
533 message(1) =
"ELPA solver requested, but code not compiled with ELPA"
548 call parse_variable(sys%namespace,
'CasidaPrintExcitations',
"all", cas%print_exst)
549 if (cas%distributed_matrix)
then
551 cas%print_exst =
"none"
552 message(1) =
"Using ScaLAPACK layout, thus disabling output of excited states."
553 message(2) =
"This options creates too many files for large Casida matrices."
569 if (cas%weight_thresh >
m_one)
then
570 message(1) =
'Casida coefficients have values between 0 and 1'
571 message(2) =
'Threshold values reset to default value'
573 cas%weight_thresh = -
m_one
583 call parse_variable(sys%namespace,
'CasidaCalcForces', .false., cas%calc_forces)
584 if (cas%calc_forces)
then
594 call parse_variable(sys%namespace,
'CasidaCalcForcesKernel', .
true., cas%calc_forces_kernel)
604 call parse_variable(sys%namespace,
'CasidaCalcForcesSCF', .false., cas%calc_forces_scf)
606 if (cas%distributed_matrix)
then
607 message(1) =
"Info: Forces calculation not compatible with ScaLAPACK layout."
608 message(2) =
"Using normal layout."
610 cas%distributed_matrix = .false.
617 cas%fromScratch = fromscratch
619 if (cas%fromScratch)
then
620 if (cas%triplet)
then
621 call restart_rm(cas%restart_dump,
'kernel_triplet')
626 if (cas%calc_forces)
then
627 do iatom = 1, sys%ions%natoms
628 do idir = 1, cas%space_dim
629 write(restart_filename,
'(a,i6.6,a,i1)')
'lr_kernel_', iatom,
'_', idir
630 if (cas%triplet) restart_filename = trim(restart_filename)//
'_triplet'
631 call restart_rm(cas%restart_dump, restart_filename)
633 write(restart_filename,
'(a,i6.6,a,i1)')
'lr_hmat1_', iatom,
'_', idir
634 call restart_rm(cas%restart_dump, restart_filename)
641 if (
bitand(theorylevel, casida_eps_diff) /= 0)
then
642 message(1) =
"Info: Approximating resonance energies through KS eigenvalue differences"
644 cas%type = casida_eps_diff
648 if (sys%st%d%ispin /=
spinors)
then
652 message(1) =
"Info: Calculating matrix elements in the Tamm-Dancoff approximation"
660 message(1) =
"Info: Calculating matrix elements with the CV(2)-DFT theory"
667 message(1) =
"Info: Calculating matrix elements with the full Casida method"
676 message(1) =
"Info: Calculating resonance energies via the Petersilka approximation"
693 type(
casida_t),
intent(inout) :: cas
696 integer :: ist, ast, jpair, ik, ierr
698 integer :: np, np_rows, np_cols, ii, info
703 cas%kernel_lrc_alpha = sys%ks%xc%kernel_lrc_alpha
705 if (cas%distributed_matrix .and. .not. cas%states_are_real)
then
709 write(
message(1),
'(a,i9)')
"Number of occupied-unoccupied pairs: ", cas%n_pairs
712 if (cas%n_pairs < 1)
then
713 message(1) =
"No Casida pairs -- maybe there are no unoccupied states?"
721 if (cas%parallel_in_eh_pairs)
then
728 if (cas%distributed_matrix .and. .not. cas%parallel_in_eh_pairs)
then
729 message(1) =
"ScaLAPACK layout requested, but 'Other' parallelization strategy not available."
730 message(2) =
"Please set ParOther to use the ScaLAPACK layout."
731 message(3) =
"Continuing without ScaLAPACK layout."
733 cas%distributed_matrix = .false.
737 cas%n = cas%n_pairs + cas%pt_nmodes
740 if (cas%distributed_matrix)
then
744 np = cas%mpi_grp%size
748 if (mod(np, ii) == 0)
then
754 np_rows = np / np_cols
758 cas%block_size = min(64, cas%n / np_rows)
760 cas%block_size = max(5, cas%block_size)
761 write(
message(1),
'(A,I5,A,I5,A,I5,A)')
'Parallel layout: using block size of ',&
762 cas%block_size,
' and a processor grid with ', np_rows,
'x', np_cols, &
763 ' processors (rows x cols)'
769 cas%nb_rows = numroc(cas%n, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
770 cas%nb_cols = numroc(cas%n, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
773 call descinit(cas%desc(1), cas%n, cas%n, cas%block_size, cas%block_size, 0, 0, &
774 cas%proc_grid%context, cas%nb_rows, info)
784 safe_allocate(cas%pair(1:cas%n))
785 if (cas%states_are_real)
then
786 safe_allocate( cas%dmat(1:cas%nb_rows, 1:cas%nb_cols))
787 safe_allocate( cas%dtm(1:cas%n, 1:cas%space_dim))
790 safe_allocate( cas%zmat(1:cas%nb_rows, 1:cas%nb_cols))
791 safe_allocate( cas%ztm(1:cas%n, 1:cas%space_dim))
793 safe_allocate( cas%f(1:cas%n))
794 safe_allocate( cas%s(1:cas%n_pairs))
795 safe_allocate( cas%w(1:cas%n))
796 safe_allocate( cas%index(1:maxval(cas%n_occ), cas%nst - maxval(cas%n_unocc) + 1:cas%nst, 1:cas%nik))
797 safe_allocate( cas%ind(1:cas%n))
799 if (cas%calc_forces)
then
800 if (cas%states_are_real)
then
801 safe_allocate(cas%dmat_save(1:cas%n_pairs, 1:cas%n_pairs))
803 safe_allocate(cas%zmat_save(1:cas%n_pairs, 1:cas%n_pairs))
805 safe_allocate(cas%forces(1:cas%space_dim, 1:sys%ions%natoms, 1:cas%n_pairs))
809 safe_allocate( cas%qf (1:cas%n_pairs))
810 safe_allocate( cas%qf_avg(1:cas%n_pairs))
818 do ast = cas%n_occ(ik) + 1, cas%nst
819 do ist = 1, cas%n_occ(ik)
820 if (cas%is_included(ist, ast, ik))
then
821 cas%index(ist, ast, ik) = jpair
822 cas%pair(jpair)%i = ist
823 cas%pair(jpair)%a = ast
824 cas%pair(jpair)%kk = ik
831 if (cas%has_photons)
then
833 do ik = 1, cas%pt_nmodes
834 cas%pair(cas%n_pairs + ik)%i = 1
835 cas%pair(cas%n_pairs + ik)%a = -ik
836 cas%pair(cas%n_pairs + ik)%kk = -ik
840 safe_deallocate_a(cas%is_included)
851 type(
casida_t),
intent(inout) :: cas
855 assert(
allocated(cas%pair))
856 safe_deallocate_a(cas%pair)
857 safe_deallocate_a(cas%index)
858 if (cas%states_are_real)
then
859 safe_deallocate_a(cas%dmat)
860 safe_deallocate_a(cas%dtm)
862 safe_deallocate_a(cas%zmat)
863 safe_deallocate_a(cas%ztm)
865 safe_deallocate_a(cas%s)
866 safe_deallocate_a(cas%f)
867 safe_deallocate_a(cas%w)
868 safe_deallocate_a(cas%ind)
871 safe_deallocate_a(cas%qf)
872 safe_deallocate_a(cas%qf_avg)
875 safe_deallocate_a(cas%n_occ)
876 safe_deallocate_a(cas%n_unocc)
878 if (cas%calc_forces)
then
879 if (cas%states_are_real)
then
880 safe_deallocate_a(cas%dmat_save)
882 safe_deallocate_a(cas%zmat_save)
884 safe_deallocate_a(cas%forces)
890 if (cas%distributed_matrix)
then
896 safe_deallocate_a(cas%qvector)
907 type(
casida_t),
intent(inout) :: cas
910 class(
mesh_t),
pointer :: mesh
912 real(real64),
allocatable :: rho_spin(:, :)
913 real(real64),
allocatable :: fxc_spin(:,:,:)
914 character(len=100) :: restart_filename
919 assert(cas%type >= casida_eps_diff .and. cas%type <=
casida_casida)
926 if (cas%states_are_real)
then
941 if (cas%type /= casida_eps_diff .or. cas%calc_forces)
then
943 safe_allocate(cas%rho(1:mesh%np, 1:st%d%nspin))
944 safe_allocate(cas%fxc(1:mesh%np, 1:st%d%nspin, 1:st%d%nspin))
948 if (cas%triplet)
then
949 safe_allocate(rho_spin(1:mesh%np, 1:2))
950 safe_allocate(fxc_spin(1:mesh%np, 1:2, 1:2))
953 rho_spin(:, 1) =
m_half * cas%rho(:, 1)
954 rho_spin(:, 2) =
m_half * cas%rho(:, 1)
957 cas%fxc(:, 1, 1) =
m_half * (fxc_spin(:, 1, 1) - fxc_spin(:, 1, 2))
959 safe_deallocate_a(rho_spin)
960 safe_deallocate_a(fxc_spin)
962 call xc_get_fxc(sys%ks%xc, mesh, sys%namespace, cas%rho, st%d%ispin, cas%fxc)
971 restart_filename =
'kernel'
972 if (cas%triplet) restart_filename = trim(restart_filename)//
'_triplet'
974 select case (cas%type)
975 case (casida_eps_diff)
978 if (cas%states_are_real)
then
979 call dcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, mesh, cas%dmat, cas%fxc, restart_filename)
982 call zcasida_get_matrix(cas, sys%namespace, sys%hm, st, sys%ks, mesh, cas%zmat, cas%fxc, restart_filename)
989 if (cas%states_are_real)
then
996 if (cas%calc_forces)
then
997 if (cas%states_are_real)
then
1004 if (cas%states_are_real)
then
1011 if (cas%type /= casida_eps_diff .or. cas%calc_forces)
then
1012 safe_deallocate_a(cas%fxc)
1013 safe_deallocate_a(cas%rho)
1024 real(real64),
allocatable :: w(:)
1031 do ia = 1, cas%n_pairs
1032 cas%w(ia) = st%eigenval(cas%pair(ia)%a, cas%pair(ia)%kk) - &
1033 st%eigenval(cas%pair(ia)%i, cas%pair(ia)%kk)
1035 message(1) =
"There is a negative unocc-occ KS eigenvalue difference for"
1036 write(
message(2),
'("states ",I5," and ",I5," of k-point ",I5,".")') cas%pair(ia)%i, cas%pair(ia)%a, cas%pair(ia)%kk
1037 message(3) =
"This indicates an inconsistency between gs, unocc, and/or casida calculations."
1043 safe_allocate(w(1:
size(cas%w)))
1045 call sort(w, cas%ind)
1046 safe_deallocate_a(w)
1056 type(
v_ks_t),
intent(in) :: ks
1058 type(
mesh_t),
intent(in) :: mesh
1059 type(
casida_t),
intent(inout) :: cas
1061 real(real64),
allocatable :: rho(:, :)
1062 real(real64),
allocatable :: fxc_sic(:,:,:)
1068 message(1) =
"Casida calculation with ADSIC not implemented for spin-polarized calculations."
1071 if (cas%triplet)
then
1072 message(1) =
"Casida calculation with ADSIC not implemented for triplet excitations."
1077 safe_allocate(fxc_sic(1:mesh%np, 1:2, 1:2))
1078 safe_allocate(rho(1:mesh%np, 1:2))
1080 rho(:, 1) = cas%rho(:, 1)/st%qtot
1085 cas%fxc = cas%fxc - fxc_sic(:, 1:1, 1:1)/st%qtot
1087 safe_deallocate_a(rho)
1088 safe_deallocate_a(fxc_sic)
1096 real(real64) function casida_matrix_factor(cas, sys)
1100 push_sub(casida_matrix_factor)
1102 casida_matrix_factor =
m_one
1105 casida_matrix_factor =
m_two * casida_matrix_factor
1109 casida_matrix_factor =
m_two * casida_matrix_factor
1112 pop_sub(casida_matrix_factor)
1119 type(namespace_t),
intent(in) :: namespace
1121 integer :: iunit, ia
1123 if (.not. mpi_grp_is_root(mpi_world))
return
1127 call io_mkdir(casida_dir, namespace)
1128 iunit = io_open(casida_dir//
'q'//trim(
theory_name(cas)), namespace, action=
'write')
1129 write(iunit,
'(a1,a14,1x,a24,1x,a24,1x,a10,3es15.8,a2)')
'#',
'E' ,
'|<f|exp(iq.r)|i>|^2', &
1130 '<|<f|exp(iq.r)|i>|^2>',
'; q = (',cas%qvector(1:cas%space_dim),
')'
1131 write(iunit,
'(a1,a14,1x,a24,1x,a24,1x,10x,a15)')
'#', trim(units_abbrev(units_out%energy)), &
1136 if (cas%avg_order == 0)
then
1137 do ia = 1, cas%n_pairs
1138 write(iunit,
'(es15.8,es15.8)') units_from_atomic(units_out%energy, cas%w(cas%ind(ia))), cas%qf(cas%ind(ia))
1141 do ia = 1, cas%n_pairs
1142 write(iunit,
'(3es15.8)') units_from_atomic(units_out%energy, cas%w(cas%ind(ia))), &
1143 cas%qf (cas%ind(ia)), &
1144 cas%qf_avg(cas%ind(ia))
1148 call io_close(iunit)
1155 character(len=80) pure function theory_name(cas)
1158 select case (cas%type)
1177 type(states_elec_t),
intent(in) :: st
1178 integer,
intent(in) :: ia
1179 integer,
intent(in) :: jb
1183 isnt_degenerate = (abs((st%eigenval(cas%pair(ia)%a, cas%pair(ia)%kk) - st%eigenval(cas%pair(ia)%i, cas%pair(ia)%kk)) &
1184 - (st%eigenval(cas%pair(jb)%a, cas%pair(jb)%kk) - st%eigenval(cas%pair(jb)%i, cas%pair(jb)%kk))) > 1e-8_real64)
1191 type(
casida_t),
intent(inout) :: cas
1192 integer,
intent(in) :: jb_local
1194 if (.not. cas%distributed_matrix)
then
1197#ifdef HAVE_SCALAPACK
1198 jb = indxl2g(jb_local, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1205 type(
casida_t),
intent(inout) :: cas
1206 integer,
intent(in) :: ia_local
1208 if (.not. cas%distributed_matrix)
then
1211#ifdef HAVE_SCALAPACK
1212 ia = indxl2g(ia_local, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1217 subroutine local_indices(cas, ia, jb, on_this_processor, ia_local, jb_local)
1220 integer,
intent(in) :: ia, jb
1221 logical,
intent(out) :: on_this_processor
1222 integer,
intent(out) :: ia_local, jb_local
1223#ifdef HAVE_SCALAPACK
1224 integer :: ia_proc, jb_proc
1227 if (.not. cas%distributed_matrix)
then
1228 on_this_processor = .
true.
1232#ifdef HAVE_SCALAPACK
1233 ia_proc = indxg2p(ia, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1234 jb_proc = indxg2p(jb, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1235 if (cas%proc_grid%mycol == ia_proc .and. cas%proc_grid%myrow == jb_proc)
then
1236 on_this_processor = .
true.
1237 ia_local = indxg2l(ia, cas%block_size, cas%proc_grid%mycol, 0, cas%proc_grid%npcol)
1238 jb_local = indxg2l(jb, cas%block_size, cas%proc_grid%myrow, 0, cas%proc_grid%nprow)
1240 on_this_processor = .false.
1250#include "casida_inc.F90"
1252#include "complex.F90"
1253#include "casida_inc.F90"
subroutine fxc_add_adsic(namespace, ks, st, mesh, 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_kpoints
parallelization in k-points
integer, parameter, public p_strategy_other
something else like e-h pairs
integer, parameter, public p_strategy_domains
parallelization in domains
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
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
subroutine, public casida_run_init()
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 zcasida_forces(cas, sys, mesh, st)
subroutine dcasida_forces(cas, sys, mesh, 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 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 zcasida_get_matrix(cas, namespace, hm, st, ks, mesh, matrix, xc, restart_file, is_forces)
subroutine casida_run_legacy(sys, fromScratch)
subroutine dcasida_get_matrix(cas, namespace, hm, st, ks, mesh, matrix, xc, restart_file, is_forces)
integer, parameter casida_tamm_dancoff
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.
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
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
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 hartree_fock
integer, parameter, public generalized_kohn_sham_dft
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_not_implemented(feature, namespace)
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)
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
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
subroutine, public restart_rm(restart, name)
Remove directory or file "name" that is located inside the current restart directory.
integer, parameter, public restart_gs
subroutine, public restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
Initializes a restart object.
integer, parameter, public restart_type_dump
integer, parameter, public restart_type_load
subroutine, public restart_end(restart)
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, fixed_occ, 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.
type(unit_system_t), public units_inp
the units systems for reading and writing
type(unit_t), public unit_one
some special units required for particular quantities
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, mesh, namespace, rho, ispin, fxc, zfxc)
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
integer, parameter, public sic_adsic
Averaged density SIC.
This class contains all parameters, needed for Casida calculations.
Class describing the electron system.
Describes mesh distribution to nodes.
Container class for lists of system_oct_m::system_t.
The states_elec_t class contains all electronic wave functions.