61 INTEGER :: max_f_index = -1, &
68 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: n_lo, n_hi
69 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues, w0, we, a_k, &
70 quasi_energies, m0_energies, &
71 m0_weights, e_k_kp_spin
72 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: p_k_kp_spin
73 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: all_quasi_energies, all_a_k, &
74 all_m0_energies, all_m0_weights
109 INTEGER,
INTENT(IN) :: ispin
110 INTEGER,
INTENT(OUT) :: n_lo, n_hi
112 INTEGER :: homo, max_nmo, n_mo_full
114 n_mo_full = bs_env%n_ao
115 max_nmo = bs_env%max_nmo_floquet
117 IF (max_nmo <= 0 .OR. max_nmo >= n_mo_full)
THEN
121 homo = bs_env%n_occ(ispin)
122 n_lo = max(1, homo - (max_nmo - 1)/2)
123 n_hi = min(n_mo_full, n_lo + max_nmo - 1)
126 n_lo = max(1, n_hi - max_nmo + 1)
140 CHARACTER(LEN=*),
PARAMETER :: routinen =
'floquet_env_create'
142 INTEGER :: handle, ispin, n_mo, ne, nf, nk, ns
144 CALL timeset(routinen, handle)
146 floquet_env%n_spin = bs_env%n_spin
147 floquet_env%n_mo_full = bs_env%n_ao
151 floquet_env%max_f_index = bs_env%max_floquet_index
152 floquet_env%n_f_size = floquet_env%n_mo*(1 + 2*floquet_env%max_f_index)
153 floquet_env%n_E = nint(2*bs_env%energy_window_floquet/bs_env%energy_step_floquet)
154 floquet_env%nkp_only_bs = bs_env%nkp_only_bs
157 ALLOCATE (floquet_env%n_lo(floquet_env%n_spin), floquet_env%n_hi(floquet_env%n_spin))
158 DO ispin = 1, floquet_env%n_spin
162 n_mo = floquet_env%n_mo
163 nf = floquet_env%n_f_size
165 ns = floquet_env%n_spin
166 nk = floquet_env%nkp_only_bs
169 ALLOCATE (floquet_env%eigenvalues(nf), floquet_env%w0(nf), floquet_env%wE(nf))
170 ALLOCATE (floquet_env%a_k(ne))
171 ALLOCATE (floquet_env%quasi_energies(n_mo), floquet_env%m0_energies(n_mo), &
172 floquet_env%m0_weights(n_mo))
173 ALLOCATE (floquet_env%e_k_kp_spin(n_mo), floquet_env%p_k_kp_spin(3, n_mo, n_mo))
177 ALLOCATE (floquet_env%all_quasi_energies(n_mo, ns, nk), source=0.0_dp)
178 ALLOCATE (floquet_env%all_a_k(ne, ns, nk), source=0.0_dp)
179 ALLOCATE (floquet_env%all_m0_energies(n_mo, ns, nk), source=0.0_dp)
180 ALLOCATE (floquet_env%all_m0_weights(n_mo, ns, nk), source=0.0_dp)
182 CALL timestop(handle)
193 CHARACTER(LEN=*),
PARAMETER :: routinen =
'floquet_env_release'
197 CALL timeset(routinen, handle)
199 IF (
ALLOCATED(floquet_env%n_lo))
DEALLOCATE (floquet_env%n_lo)
200 IF (
ALLOCATED(floquet_env%n_hi))
DEALLOCATE (floquet_env%n_hi)
201 IF (
ALLOCATED(floquet_env%eigenvalues))
DEALLOCATE (floquet_env%eigenvalues)
202 IF (
ALLOCATED(floquet_env%w0))
DEALLOCATE (floquet_env%w0)
203 IF (
ALLOCATED(floquet_env%wE))
DEALLOCATE (floquet_env%wE)
204 IF (
ALLOCATED(floquet_env%a_k))
DEALLOCATE (floquet_env%a_k)
205 IF (
ALLOCATED(floquet_env%quasi_energies))
DEALLOCATE (floquet_env%quasi_energies)
206 IF (
ALLOCATED(floquet_env%m0_energies))
DEALLOCATE (floquet_env%m0_energies)
207 IF (
ALLOCATED(floquet_env%m0_weights))
DEALLOCATE (floquet_env%m0_weights)
208 IF (
ALLOCATED(floquet_env%e_k_kp_spin))
DEALLOCATE (floquet_env%e_k_kp_spin)
209 IF (
ALLOCATED(floquet_env%p_k_kp_spin))
DEALLOCATE (floquet_env%p_k_kp_spin)
210 IF (
ALLOCATED(floquet_env%all_quasi_energies))
DEALLOCATE (floquet_env%all_quasi_energies)
211 IF (
ALLOCATED(floquet_env%all_a_k))
DEALLOCATE (floquet_env%all_a_k)
212 IF (
ALLOCATED(floquet_env%all_m0_energies))
DEALLOCATE (floquet_env%all_m0_energies)
213 IF (
ALLOCATED(floquet_env%all_m0_weights))
DEALLOCATE (floquet_env%all_m0_weights)
215 CALL timestop(handle)
subroutine, public floquet_band_window(bs_env, ispin, n_lo, n_hi)
Full-band index bounds [n_lo, n_hi] of the active window for one spin, selecting the MAX_NMO Kohn-Sha...