55#include "./base/base_uses.f90"
61 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_band_structure'
77 LOGICAL :: do_kpoints, explicit
85 CALL do_calculate_band_structure(qs_env)
90 CALL do_calculate_band_structure(qs_env_kp)
92 DEALLOCATE (qs_env_kp)
104 SUBROUTINE do_calculate_band_structure(qs_env)
105 TYPE(qs_environment_type),
POINTER :: qs_env
107 CHARACTER(LEN=default_string_length) :: filename, ustr
108 CHARACTER(LEN=default_string_length), &
109 DIMENSION(:),
POINTER :: spname, strptr
110 CHARACTER(LEN=max_line_length) :: error_message
111 INTEGER :: bs_data_unit, i, i_rep, ik, ikk, ikpgr, &
112 imo, ip, ispin, n_ptr, n_rep, nadd, &
113 nkp, nmo, npline, npoints, nspins, &
115 INTEGER,
DIMENSION(2) :: kp_range
116 LOGICAL :: explicit, io_default, my_kpgrp
117 REAL(kind=dp) :: t1, t2
118 REAL(kind=dp),
DIMENSION(3) :: kpptr
119 REAL(kind=dp),
DIMENSION(:),
POINTER :: eigenvalues, eigval, occnum, &
120 occupation_numbers, wkp
121 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: kpgeneral, kspecial, xkp
122 TYPE(cell_type),
POINTER :: cell
123 TYPE(dft_control_type),
POINTER :: dft_control
124 TYPE(kpoint_env_type),
POINTER :: kp
125 TYPE(kpoint_type),
POINTER :: kpoint
126 TYPE(mp_para_env_type),
POINTER :: para_env
127 TYPE(section_vals_type),
POINTER :: bs_input, kpset
129 bs_input => section_vals_get_subs_vals(qs_env%input,
"DFT%PRINT%BAND_STRUCTURE")
130 CALL section_vals_get(bs_input, explicit=explicit)
132 CALL section_vals_val_get(bs_input,
"FILE_NAME", c_val=filename)
133 CALL section_vals_val_get(bs_input,
"ADDED_MOS", i_val=nadd)
134 unit_nr = cp_logger_get_default_io_unit()
135 CALL get_qs_env(qs_env=qs_env, para_env=para_env)
136 CALL get_qs_env(qs_env, cell=cell)
137 kpset => section_vals_get_subs_vals(bs_input,
"KPOINT_SET")
138 CALL section_vals_get(kpset, n_repetition=n_rep)
139 IF (unit_nr > 0)
THEN
140 WRITE (unit_nr, fmt=
"(/,T2,A)")
"KPOINTS| Band Structure Calculation"
141 WRITE (unit_nr, fmt=
"(T2,A,T71,I10)")
"KPOINTS| Number of k-point sets", n_rep
143 WRITE (unit_nr, fmt=
"(T2,A,T71,I10)")
"KPOINTS| Number of added MOs/bands", nadd
146 IF (filename ==
"")
THEN
148 bs_data_unit = unit_nr
152 IF (para_env%is_source())
THEN
153 CALL open_file(filename, unit_number=bs_data_unit, file_status=
"UNKNOWN", file_action=
"WRITE", &
154 file_position=
"APPEND")
161 CALL section_vals_val_get(kpset,
"NPOINTS", i_rep_section=i_rep, i_val=npline)
162 CALL section_vals_val_get(kpset,
"UNITS", i_rep_section=i_rep, c_val=ustr)
164 CALL section_vals_val_get(kpset,
"SPECIAL_POINT", i_rep_section=i_rep, n_rep_val=n_ptr)
165 ALLOCATE (kspecial(3, n_ptr))
166 ALLOCATE (spname(n_ptr))
168 CALL section_vals_val_get(kpset,
"SPECIAL_POINT", i_rep_section=i_rep, i_rep_val=ip, c_vals=strptr)
169 IF (
SIZE(strptr(:), 1) == 4)
THEN
170 spname(ip) = strptr(1)
172 CALL read_float_object(strptr(i + 1), kpptr(i), error_message)
173 IF (len_trim(error_message) > 0) cpabort(trim(error_message))
175 ELSE IF (
SIZE(strptr(:), 1) == 3)
THEN
176 spname(ip) =
"not specified"
178 CALL read_float_object(strptr(i), kpptr(i), error_message)
179 IF (len_trim(error_message) > 0) cpabort(trim(error_message))
182 cpabort(
"Input SPECIAL_POINT invalid")
186 kspecial(1:3, ip) = kpptr(1:3)
187 CASE (
"CART_ANGSTROM")
188 kspecial(1:3, ip) = (kpptr(1)*cell%hmat(1, 1:3) + &
189 kpptr(2)*cell%hmat(2, 1:3) + &
190 kpptr(3)*cell%hmat(3, 1:3))/twopi*angstrom
192 kspecial(1:3, ip) = (kpptr(1)*cell%hmat(1, 1:3) + &
193 kpptr(2)*cell%hmat(2, 1:3) + &
194 kpptr(3)*cell%hmat(3, 1:3))/twopi
196 cpabort(
"Unknown unit <"//trim(ustr)//
"> specified for k-point definition")
199 npoints = (n_ptr - 1)*npline + 1
200 cpassert(npoints >= 1)
203 ALLOCATE (kpgeneral(3, npoints))
204 kpgeneral(1:3, 1) = kspecial(1:3, 1)
209 kpgeneral(1:3, ikk) = kspecial(1:3, ik - 1) + &
210 REAL(ip, kind=dp)/real(npline, kind=dp)* &
211 (kspecial(1:3, ik) - kspecial(1:3, ik - 1))
216 DEALLOCATE (kpgeneral)
218 CALL get_qs_env(qs_env, dft_control=dft_control)
219 nspins = dft_control%nspins
220 kp => kpoint%kp_env(1)%kpoint_env
221 CALL get_mo_set(kp%mos(1, 1), nmo=nmo)
222 ALLOCATE (eigval(nmo), occnum(nmo))
223 CALL get_kpoint_info(kpoint, nkp=nkp, kp_range=kp_range, xkp=xkp, wkp=wkp)
225 IF (unit_nr > 0)
THEN
226 WRITE (unit=unit_nr, fmt=
"(T2,A,I4,T71,I10)") &
227 "KPOINTS| Number of k-points in set ", i_rep, npoints
228 WRITE (unit=unit_nr, fmt=
"(T2,A)") &
229 "KPOINTS| In units of b-vector [2pi/Bohr]"
231 WRITE (unit=unit_nr, fmt=
"(T2,A,I5,1X,A11,3(1X,F12.6))") &
232 "KPOINTS| Special point ", ip, adjustl(trim(spname(ip))), kspecial(1:3, ip)
235 IF (bs_data_unit > 0 .AND. (bs_data_unit /= unit_nr))
THEN
236 WRITE (unit=bs_data_unit, fmt=
"(4(A,I0),A)") &
237 "# Set ", i_rep,
": ", n_ptr,
" special points, ", npoints,
" k-points, ", nmo,
" bands"
239 WRITE (unit=bs_data_unit, fmt=
"(A,I0,T20,T24,3(1X,F14.8),2X,A)") &
240 "# Special point ", ip, kspecial(1:3, ip), adjustl(trim(spname(ip)))
245 my_kpgrp = (ik >= kp_range(1) .AND. ik <= kp_range(2))
248 ikpgr = ik - kp_range(1) + 1
249 kp => kpoint%kp_env(ikpgr)%kpoint_env
250 CALL get_mo_set(kp%mos(1, ispin), eigenvalues=eigenvalues, occupation_numbers=occupation_numbers)
251 eigval(1:nmo) = eigenvalues(1:nmo)
252 occnum(1:nmo) = occupation_numbers(1:nmo)
254 eigval(1:nmo) = 0.0_dp
255 occnum(1:nmo) = 0.0_dp
257 CALL kpoint%para_env_inter_kp%sum(eigval)
258 CALL kpoint%para_env_inter_kp%sum(occnum)
259 IF (bs_data_unit > 0)
THEN
260 WRITE (unit=bs_data_unit, fmt=
"(A,I0,T15,A,I0,A,T24,3(1X,F14.8),3X,F14.8)") &
261 "# Point ", ik,
" Spin ", ispin,
":", xkp(1:3, ik), wkp(ik)
262 WRITE (unit=bs_data_unit, fmt=
"(A)") &
263 "# Band Energy [eV] Occupation"
265 WRITE (unit=bs_data_unit, fmt=
"(T2,I7,2(1X,F14.8))") &
266 imo, eigval(imo)*evolt, occnum(imo)
272 DEALLOCATE (kspecial, spname)
273 DEALLOCATE (eigval, occnum)
274 CALL kpoint_release(kpoint)
276 IF (unit_nr > 0)
THEN
277 WRITE (unit=unit_nr, fmt=
"(T2,A,T67,F14.3)")
"KPOINTS| Time for k-point line ", t2 - t1
283 IF (.NOT. io_default)
THEN
284 IF (para_env%is_source())
CALL close_file(bs_data_unit)
289 END SUBROUTINE do_calculate_band_structure
303 TYPE(qs_environment_type),
POINTER :: qs_env
304 TYPE(kpoint_type),
POINTER :: kpoint
305 CHARACTER(LEN=*),
INTENT(IN) :: scheme
306 INTEGER,
INTENT(IN) :: nadd
307 INTEGER,
DIMENSION(3),
INTENT(IN),
OPTIONAL :: mp_grid
308 REAL(kind=dp),
DIMENSION(:, :),
INTENT(IN), &
309 OPTIONAL :: kpgeneral
310 INTEGER,
INTENT(IN),
OPTIONAL :: group_size_ext
313 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
314 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
315 TYPE(dft_control_type),
POINTER :: dft_control
316 TYPE(mp_para_env_type),
POINTER :: para_env
317 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
319 TYPE(qs_scf_env_type),
POINTER :: scf_env
320 TYPE(scf_control_type),
POINTER :: scf_control
324 CALL get_qs_env(qs_env=qs_env, para_env=para_env, blacs_env=blacs_env)
325 CALL kpoint_env_initialize(kpoint, para_env, blacs_env)
327 CALL kpoint_initialize_mos(kpoint, qs_env%mos, nadd)
328 CALL kpoint_initialize_mo_set(kpoint)
330 CALL get_qs_env(qs_env, sab_kp=sab_nl, dft_control=dft_control)
331 CALL kpoint_init_cell_index(kpoint, sab_nl, para_env, dft_control)
333 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s, &
334 scf_env=scf_env, scf_control=scf_control)
335 CALL do_general_diag_kp(matrix_ks, matrix_s, kpoint, scf_env, scf_control, .false., diis_step)
349 TYPE(kpoint_type),
POINTER :: kpoint
350 CHARACTER(LEN=*),
INTENT(IN) :: scheme
351 INTEGER,
INTENT(IN),
OPTIONAL :: group_size_ext
352 INTEGER,
DIMENSION(3),
INTENT(IN),
OPTIONAL :: mp_grid
353 REAL(kind=dp),
DIMENSION(:, :),
INTENT(IN), &
354 OPTIONAL :: kpgeneral
356 INTEGER :: i, ix, iy, iz, npoints
358 cpassert(.NOT.
ASSOCIATED(kpoint))
360 CALL kpoint_create(kpoint)
362 kpoint%kp_scheme = scheme
363 kpoint%symmetry = .false.
364 kpoint%verbose = .false.
365 kpoint%full_grid = .false.
366 kpoint%use_real_wfn = .false.
367 kpoint%eps_geo = 1.e-6_dp
368 IF (
PRESENT(group_size_ext))
THEN
369 kpoint%parallel_group_size = group_size_ext
371 kpoint%parallel_group_size = -1
376 ALLOCATE (kpoint%xkp(3, 1), kpoint%wkp(1))
377 kpoint%xkp(1:3, 1) = 0.0_dp
378 kpoint%wkp(1) = 1.0_dp
379 kpoint%symmetry = .true.
380 ALLOCATE (kpoint%kp_sym(1))
381 NULLIFY (kpoint%kp_sym(1)%kpoint_sym)
382 CALL kpoint_sym_create(kpoint%kp_sym(1)%kpoint_sym)
383 CASE (
"MONKHORST-PACK")
384 cpassert(
PRESENT(mp_grid))
385 npoints = mp_grid(1)*mp_grid(2)*mp_grid(3)
386 kpoint%nkp_grid(1:3) = mp_grid(1:3)
387 kpoint%full_grid = .true.
389 ALLOCATE (kpoint%xkp(3, npoints), kpoint%wkp(npoints))
390 kpoint%wkp(:) = 1._dp/real(npoints, kind=dp)
392 DO ix = 1, mp_grid(1)
393 DO iy = 1, mp_grid(2)
394 DO iz = 1, mp_grid(3)
396 kpoint%xkp(1, i) = real(2*ix - mp_grid(1) - 1, kind=dp)/(2._dp*real(mp_grid(1), kind=dp))
397 kpoint%xkp(2, i) = real(2*iy - mp_grid(2) - 1, kind=dp)/(2._dp*real(mp_grid(2), kind=dp))
398 kpoint%xkp(3, i) = real(2*iz - mp_grid(3) - 1, kind=dp)/(2._dp*real(mp_grid(3), kind=dp))
403 ALLOCATE (kpoint%kp_sym(kpoint%nkp))
405 NULLIFY (kpoint%kp_sym(i)%kpoint_sym)
406 CALL kpoint_sym_create(kpoint%kp_sym(i)%kpoint_sym)
409 cpabort(
"MACDONALD not implemented")
411 cpassert(
PRESENT(kpgeneral))
412 npoints =
SIZE(kpgeneral, 2)
414 ALLOCATE (kpoint%xkp(3, npoints), kpoint%wkp(npoints))
415 kpoint%wkp(:) = 1._dp/real(npoints, kind=dp)
416 kpoint%xkp(1:3, 1:npoints) = kpgeneral(1:3, 1:npoints)
418 ALLOCATE (kpoint%kp_sym(kpoint%nkp))
420 NULLIFY (kpoint%kp_sym(i)%kpoint_sym)
421 CALL kpoint_sym_create(kpoint%kp_sym(i)%kpoint_sym)
424 cpabort(
"Unknown kpoint scheme requested")
Handles all functions related to the CELL.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
Utility routines to read data from files. Kept as close as possible to the old parser because.
elemental subroutine, public read_float_object(string, object, error_message)
Returns a floating point number read from a string including fraction like z1/z2.
Defines the basic variable types.
integer, parameter, public max_line_length
integer, parameter, public dp
integer, parameter, public default_string_length
Routines needed for kpoint calculation.
subroutine, public kpoint_initialize_mo_set(kpoint)
...
subroutine, public kpoint_initialize_mos(kpoint, mos, added_mos, for_aux_fit)
Initialize a set of MOs and density matrix for each kpoint (kpoint group)
subroutine, public kpoint_init_cell_index(kpoint, sab_nl, para_env, dft_control)
Generates the mapping of cell indices and linear RS index CELL (0,0,0) is always mapped to index 1.
subroutine, public kpoint_env_initialize(kpoint, para_env, blacs_env, with_aux_fit)
Initialize the kpoint environment.
Types and basic routines needed for a kpoint calculation.
subroutine, public kpoint_sym_create(kp_sym)
Create a single kpoint symmetry environment.
subroutine, public kpoint_release(kpoint)
Release a kpoint environment, deallocate all data.
subroutine, public kpoint_create(kpoint)
Create a kpoint environment.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
Calculation of band structures.
subroutine, public calculate_kp_orbitals(qs_env, kpoint, scheme, nadd, mp_grid, kpgeneral, group_size_ext)
diagonalize KS matrices at a set of kpoints
subroutine, public calculate_kpoints_for_bs(kpoint, scheme, group_size_ext, mp_grid, kpgeneral)
...
subroutine, public calculate_band_structure(qs_env)
Main routine for band structure calculation.
subroutine, public qs_env_release(qs_env)
releases the given qs_env (see doc/ReferenceCounting.html)
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
Initialize a qs_env for kpoint calculations starting from a gamma point qs_env.
subroutine, public create_kp_from_gamma(qs_env, qs_env_kp, with_xc_terms)
...
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
module that contains the definitions of the scf types
parameters that control an scf iteration
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment