13 use,
intrinsic :: iso_fortran_env
45 use w90_library_extra,
only:overlaps
49 type(namespace_t) :: namespace
50 type(electrons_t),
pointer :: sys
51 type(wan_opts_t) :: wan_opts
52 integer,
allocatable :: band_index(:)
54 type(lib_common_type) :: w90main
56 complex(real64),
allocatable :: m_matrix(:, :, :, :)
57 complex(real64),
allocatable :: u_matrix(:, :, :)
58 complex(real64),
allocatable :: u_matrix_opt(:, :, :)
59 real(real64),
allocatable :: eigenvals(:,:)
61 integer,
allocatable :: nnkp(:,:), gkpb(:,:,:)
62 logical,
allocatable :: exclude_list(:)
65 integer :: idir, ii, itemp, ik, ist
68 real(real64) :: factor(3)
85 assert(sys%space%dim == 3)
88 if (sys%kpoints%use_symmetries)
then
89 message(1) =
'oct-wannier90: k-points symmetries are not allowed'
92 if (sys%kpoints%use_time_reversal)
then
93 message(1) =
'oct-wannier90: time-reversal symmetry is not allowed'
96 if (sys%kpoints%reduced%nshifts > 1)
then
97 message(1) =
'oct-wannier90: Wannier90 does not allow for multiple shifts of the k-point grid'
100 if (sys%st%d%nspin == 4)
then
107 do idir = sys%space%periodic_dim+1, sys%space%dim
108 factor(idir) =
m_two * sys%gr%box%bounding_box_l(idir)
110 call sys%ions%latt%scale(factor)
117 wan_opts, w90main, stdout, stderr, ierr)
119 write(
message(1),
'(a,i0)')
'Error initializing wannier90 library: ', ierr
126 elseif(sys%st%d%ispin ==
unpolarized .and. w90main%wvfn_read%spin_channel == 2)
then
127 w90main%wvfn_read%spin_channel = 1
128 message(1) =
"octopus was run with SpinComponents == unpolarized. Ignoring wannier90 spin input variable"
136 safe_allocate(band_index(1:sys%st%nst))
137 safe_allocate(exclude_list(1:sys%st%nst))
138 exclude_list(1:sys%st%nst) = .false.
140 if (
allocated(w90main%exclude_bands))
then
141 do itemp = 1,
size(w90main%exclude_bands)
142 exclude_list(w90main%exclude_bands(itemp)) = .
true.
147 do ii = 1, sys%st%nst
148 if (exclude_list(ii)) cycle
150 band_index(ii) = itemp
154 call w90_get_nn(w90main, nn, stdout, stderr, ierr)
155 safe_allocate(nnkp(w90main%num_kpts, nn))
156 safe_allocate(gkpb(3, w90main%num_kpts, nn))
157 call w90_get_nnkp(w90main, nnkp, stdout, stderr, ierr)
158 call w90_get_gkpb(w90main, gkpb, stdout, stderr, ierr)
161 safe_allocate(m_matrix(wan_opts%num_bands, wan_opts%num_bands, nn, w90main%num_kpts))
162 safe_allocate(u_matrix_opt(wan_opts%num_bands, wan_opts%num_wann, w90main%num_kpts))
163 safe_allocate(eigenvals(wan_opts%num_bands, w90main%num_kpts))
164 safe_allocate(u_matrix(wan_opts%num_wann, wan_opts%num_wann, w90main%num_kpts))
165 call w90_set_m_local(w90main, m_matrix)
166 call w90_set_u_opt(w90main, u_matrix_opt)
167 call w90_set_u_matrix(w90main, u_matrix)
170 do ik = 1, w90main%num_kpts
171 do ist = 1, sys%st%nst
172 if (exclude_list(ist)) cycle
176 eigenvals(band_index(ist), ik) =
units_from_atomic(
unit_ev, sys%st%eigenval(ist, (ik-1)*2+w90main%wvfn_read%spin_channel))
180 call w90_set_eigval(w90main, eigenvals)
183 if (wan_opts%calc_overlaps)
then
186 sys%gr, sys%ions%latt, sys%st, sys%kpoints, u_matrix_opt)
191 call overlaps(w90main, stdout, stderr, ierr)
193 write(
message(1),
'(a,i0)')
'Error while reading overlaps with wannier90: ', ierr
199 if (wan_opts%wannierize)
then
200 call w90_disentangle(w90main, stdout, stderr, ierr)
202 write(
message(1),
'(a,i0)')
'Error in w90_disentangle: ', ierr
205 call w90_project_overlap(w90main, stdout, stderr, ierr)
209 write(
message(1),
'(a,i0)')
'Error in w90_project_overlap: ', ierr
212 call w90_wannierise(w90main, stdout, stderr, ierr)
214 write(
message(1),
'(a,i0)')
'Error in w90_wannierise: ', ierr
218 w90main%w90_calculation%wannier_plot = .false.
220 call w90_plot(w90main, stdout, stderr, ierr)
222 write(
message(1),
'(a,i0)')
'Error in w90_plot: ', ierr
235 safe_deallocate_a(m_matrix)
236 safe_deallocate_a(u_matrix)
237 safe_deallocate_a(u_matrix_opt)
238 safe_deallocate_a(eigenvals)
239 safe_deallocate_a(exclude_list)
240 safe_deallocate_a(band_index)
241 safe_deallocate_a(nnkp)
242 safe_deallocate_a(gkpb)
243 safe_deallocate_p(sys)
This module handles the calculation mode.
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
integer, parameter, public p_strategy_states
parallelization in states
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spin_polarized
Fast Fourier Transform module. This module provides a single interface that works with different FFT ...
subroutine, public fft_all_init(namespace)
initialize the table
subroutine, public fft_all_end()
delete all plans
real(real64), parameter, public m_two
subroutine, public global_end()
Finalise parser varinfo file, and MPI.
subroutine, public global_init(communicator)
Initialise Octopus.
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public io_init(defaults)
If the argument defaults is present and set to true, then the routine will not try to read anything f...
subroutine, public io_end()
This module defines the meshes, which are used in Octopus.
subroutine, public messages_end()
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_init(output_dir)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
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_experimental(name, namespace)
type(mpi_grp_t), public mpi_world
This module handles the communicators for the various parallelization strategies.
type(namespace_t), public global_namespace
subroutine, public parser_init()
Initialise the Octopus parser.
subroutine, public parser_end()
End the Octopus parser.
subroutine, public profiling_end(namespace)
subroutine, public profiling_init(namespace)
Create profiling subdirectory.
integer, parameter, public restart_gs
integer, parameter, public restart_td
This module defines routines to write information about states.
This module handles reading and writing restart information for the states_elec_t.
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.
subroutine, public unit_system_init(namespace)
type(unit_t), public unit_ev
For output energies in eV.
Interface module to Wannier 90 library.
subroutine, public wannier90lib_init_w90main(namespace, space, mesh, ions, kpoints, st, wannier_opts, w90main, stdout, stderr, ierr)
Initialize wannier90 library data.
subroutine, public wannier90lib_create_wannier90_mmn(w90main, exclude_list, band_index, mesh, st, ions, overlap)
Kohn-Sham State Overlap Matrix.
subroutine, public wannier90lib_create_wannier90_amn(w90main, wan_opts, exclude_list, band_index, space, mesh, latt, st, kpoints, projection)
Calculate wannier90 Projection Matrix.
subroutine, public wan_opts_parse(namespace, wannier_opts)
subroutine, public wannier_load_restart(namespace, mc, space, st, gr, kpoints, restart_states)
Load Octopus restart data from disk.
Class describing the electron system.
program wannier
Construct maximally-localised Wannier functions through API calls to Wannier90 library.