Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Environment type holding the work and accumulation arrays of the Floquet-Bloch
10 : !> band-structure calculation (floquet_main), plus the derived sizes.
11 : !> \par History
12 : !> \author Shridhar Shanbhag (27.01.2026)
13 : ! **************************************************************************************************
14 : MODULE floquet_types
15 : USE kinds, ONLY: dp
16 : USE post_scf_bandstructure_types, ONLY: post_scf_bandstructure_type
17 : #include "./base/base_uses.f90"
18 :
19 : IMPLICIT NONE
20 :
21 : PRIVATE
22 :
23 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'floquet_types'
24 :
25 : PUBLIC :: floquet_env_type, &
26 : floquet_env_create, &
27 : floquet_env_release
28 :
29 : ! **************************************************************************************************
30 : !> \brief Work and accumulation arrays for one Floquet-Bloch band-structure run, plus the derived
31 : !> sizes. The per-(k-point,spin) buffers are overwritten each iteration; the all_* arrays
32 : !> accumulate the results over all DOS k-points and spins.
33 : !> \param max_f_index Floquet truncation index M
34 : !> \param n_f_size size of the truncated Floquet Hamiltonian, nao*(1 + 2*M)
35 : !> \param n_E number of points on the DOS energy grid
36 : !> \param nkp_only_bs number of band-structure k-points (the k-points the Floquet loop runs over)
37 : !> \param nao number of atomic orbitals
38 : !> \param n_spin number of spin channels
39 : !> \param eigenvalues Floquet eigenvalues for the current (k-point,spin) (n_f_size)
40 : !> \param w0 central-sector weights (n_f_size)
41 : !> \param wE outermost-sector weights (n_f_size)
42 : !> \param a_k spectral function A(k,E) on the energy grid (n_E)
43 : !> \param quasi_energies quasi-energies (nao)
44 : !> \param m0_energies m=0 band energies (nao)
45 : !> \param m0_weights central-sector weight of each m=0 band (nao)
46 : !> \param e_k_kp_spin band energies for the current (k-point,spin) (nao)
47 : !> \param de_dk_kp_spin band-energy k-derivatives for the current (k-point,spin) (3, nao)
48 : !> \param dipole_kp_spin dipole matrix elements for the current (k-point,spin) (3, nao, nao)
49 : !> \param all_quasi_energies quasi-energies for every (band, spin, bs k-point) (nao, n_spin, nkp_only_bs)
50 : !> \param all_a_k spectral function for every (energy, spin, bs k-point) (n_E, n_spin, nkp_only_bs)
51 : !> \param all_m0_energies m=0 band energies for every (band, spin, bs k-point) (nao, n_spin, nkp_only_bs)
52 : !> \param all_m0_weights central-sector weights for every (band, spin, bs k-point) (nao, n_spin, nkp_only_bs)
53 : ! **************************************************************************************************
54 : TYPE floquet_env_type
55 : INTEGER :: max_f_index = -1, &
56 : n_f_size = -1, &
57 : n_E = -1, &
58 : nkp_only_bs = -1, &
59 : nao = -1, &
60 : n_spin = -1
61 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: eigenvalues, w0, wE, a_k, &
62 : quasi_energies, m0_energies, &
63 : m0_weights, e_k_kp_spin
64 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: de_dk_kp_spin
65 : COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: dipole_kp_spin
66 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: all_quasi_energies, all_a_k, &
67 : all_m0_energies, all_m0_weights
68 : END TYPE floquet_env_type
69 :
70 : CONTAINS
71 :
72 : ! **************************************************************************************************
73 : !> \brief Set the derived sizes from bs_env and allocate all work and accumulation arrays.
74 : !> \param floquet_env ...
75 : !> \param bs_env ...
76 : ! **************************************************************************************************
77 2 : SUBROUTINE floquet_env_create(floquet_env, bs_env)
78 : TYPE(floquet_env_type), INTENT(OUT) :: floquet_env
79 : TYPE(post_scf_bandstructure_type), POINTER :: bs_env
80 :
81 : CHARACTER(LEN=*), PARAMETER :: routineN = 'floquet_env_create'
82 :
83 : INTEGER :: handle, nao, nE, nf, nk, ns
84 :
85 2 : CALL timeset(routineN, handle)
86 :
87 2 : floquet_env%nao = bs_env%n_ao
88 2 : floquet_env%n_spin = bs_env%n_spin
89 2 : floquet_env%max_f_index = bs_env%max_floquet_index
90 2 : floquet_env%n_f_size = floquet_env%nao*(1 + 2*floquet_env%max_f_index)
91 2 : floquet_env%n_E = NINT(2*bs_env%energy_window_floquet/bs_env%energy_step_floquet)
92 2 : floquet_env%nkp_only_bs = bs_env%nkp_only_bs
93 :
94 2 : nao = floquet_env%nao
95 2 : nf = floquet_env%n_f_size
96 2 : nE = floquet_env%n_E
97 2 : ns = floquet_env%n_spin
98 2 : nk = floquet_env%nkp_only_bs
99 :
100 : ! per-(k-point,spin) work buffers
101 10 : ALLOCATE (floquet_env%eigenvalues(nf), floquet_env%w0(nf), floquet_env%wE(nf))
102 6 : ALLOCATE (floquet_env%a_k(nE))
103 0 : ALLOCATE (floquet_env%quasi_energies(nao), floquet_env%m0_energies(nao), &
104 10 : floquet_env%m0_weights(nao))
105 0 : ALLOCATE (floquet_env%e_k_kp_spin(nao), floquet_env%de_dk_kp_spin(3, nao), &
106 14 : floquet_env%dipole_kp_spin(3, nao, nao))
107 :
108 : ! per-(spin,k-point) accumulation arrays, filled once by the owning subgroup source and
109 : ! summed across the global communicator after the k-point loop
110 30 : ALLOCATE (floquet_env%all_quasi_energies(nao, ns, nk), source=0.0_dp)
111 18 : ALLOCATE (floquet_env%all_a_k(nE, ns, nk), source=0.0_dp)
112 28 : ALLOCATE (floquet_env%all_m0_energies(nao, ns, nk), source=0.0_dp)
113 28 : ALLOCATE (floquet_env%all_m0_weights(nao, ns, nk), source=0.0_dp)
114 :
115 2 : CALL timestop(handle)
116 :
117 2 : END SUBROUTINE floquet_env_create
118 :
119 : ! **************************************************************************************************
120 : !> \brief Deallocate all arrays held by floquet_env.
121 : !> \param floquet_env ...
122 : ! **************************************************************************************************
123 2 : SUBROUTINE floquet_env_release(floquet_env)
124 : TYPE(floquet_env_type), INTENT(INOUT) :: floquet_env
125 :
126 : CHARACTER(LEN=*), PARAMETER :: routineN = 'floquet_env_release'
127 :
128 : INTEGER :: handle
129 :
130 2 : CALL timeset(routineN, handle)
131 :
132 2 : IF (ALLOCATED(floquet_env%eigenvalues)) DEALLOCATE (floquet_env%eigenvalues)
133 2 : IF (ALLOCATED(floquet_env%w0)) DEALLOCATE (floquet_env%w0)
134 2 : IF (ALLOCATED(floquet_env%wE)) DEALLOCATE (floquet_env%wE)
135 2 : IF (ALLOCATED(floquet_env%a_k)) DEALLOCATE (floquet_env%a_k)
136 2 : IF (ALLOCATED(floquet_env%quasi_energies)) DEALLOCATE (floquet_env%quasi_energies)
137 2 : IF (ALLOCATED(floquet_env%m0_energies)) DEALLOCATE (floquet_env%m0_energies)
138 2 : IF (ALLOCATED(floquet_env%m0_weights)) DEALLOCATE (floquet_env%m0_weights)
139 2 : IF (ALLOCATED(floquet_env%e_k_kp_spin)) DEALLOCATE (floquet_env%e_k_kp_spin)
140 2 : IF (ALLOCATED(floquet_env%de_dk_kp_spin)) DEALLOCATE (floquet_env%de_dk_kp_spin)
141 2 : IF (ALLOCATED(floquet_env%dipole_kp_spin)) DEALLOCATE (floquet_env%dipole_kp_spin)
142 2 : IF (ALLOCATED(floquet_env%all_quasi_energies)) DEALLOCATE (floquet_env%all_quasi_energies)
143 2 : IF (ALLOCATED(floquet_env%all_a_k)) DEALLOCATE (floquet_env%all_a_k)
144 2 : IF (ALLOCATED(floquet_env%all_m0_energies)) DEALLOCATE (floquet_env%all_m0_energies)
145 2 : IF (ALLOCATED(floquet_env%all_m0_weights)) DEALLOCATE (floquet_env%all_m0_weights)
146 :
147 2 : CALL timestop(handle)
148 :
149 2 : END SUBROUTINE floquet_env_release
150 :
151 0 : END MODULE floquet_types
|