41 use,
intrinsic :: iso_fortran_env
76 type(electrons_t),
pointer :: sys
77 integer :: ik, nkpoints
78 type(restart_t) :: restart
80 type(cube_function_t) :: cf
82 type(lattice_vectors_t) :: pc
83 integer :: ierr, run_mode, file_gvec
85 integer :: nhighsympoints, nsegments
86 integer :: icol, idir, ncols
88 integer,
allocatable :: resolution(:)
89 real(real64),
allocatable :: highsympoints(:,:), coord_along_path(:)
90 type(kpoints_grid_t) :: path_kpoints_grid
113 if (sys%space%periodic_dim == 0)
then
114 message(1) =
"oct-unfold can only be used for periodic systems."
118 if (sys%st%parallel_in_states)
then
122 if (sys%st%d%ispin ==
spinors)
then
171 write(
message(1),
'(a)')
'Error while reading UnfoldPointsPath.'
178 if (nhighsympoints /= nsegments+1)
then
179 write(
message(1),
'(a,i3,a,i3)')
'The first row of UnfoldPointsPath is not compatible with the number of specified k-points.'
183 safe_allocate(resolution(1:nsegments))
184 do icol = 1, nsegments
188 nkpoints = sum(resolution) + 1
190 safe_allocate(highsympoints(1:sys%space%dim, 1:nhighsympoints))
191 do ik = 1, nhighsympoints
194 if (ncols /= sys%space%dim)
then
195 write(
message(1),
'(a,i8,a,i3)')
'UnfoldPointsPath row ', ik,
' has ', ncols,
' columns but must have ', sys%space%dim
199 do idir = 1, sys%space%dim
208 safe_allocate(coord_along_path(1:nkpoints))
211 highsympoints, path_kpoints_grid%point, coord_along_path)
213 safe_deallocate_a(resolution)
214 safe_deallocate_a(highsympoints)
217 do ik = 1, path_kpoints_grid%npoints
218 call kpoints_to_reduced(sys%kpoints%latt, path_kpoints_grid%point(:, ik), path_kpoints_grid%red_point(:, ik))
223 if (run_mode == option__unfoldmode__unfold_setup)
then
227 else if (run_mode == option__unfoldmode__unfold_run)
then
232 read(file_gvec, *) ik
233 if (ik /= path_kpoints_grid%npoints)
then
234 message(1) =
'There is an inconsistency between unfold_gvec.dat and the input file'
244 ierr=ierr, label =
": unfold")
247 message(1) =
'Unable to read unocc wavefunctions.'
266 message(1) =
"Unsupported or incorrect value of UnfoldMode."
270 safe_deallocate_a(coord_along_path)
274 safe_deallocate_p(sys)
288 integer :: file_gvec, file_kpts, idir
289 integer :: gvec(sys%space%dim)
296 write(file_kpts,
'(a)')
'%KpointsReduced'
297 write(file_gvec,
'(a)')
'#Created by oct-unfold'
298 write(file_gvec,
'(i5)') path_kpoints_grid%npoints
301 do ik = 1, path_kpoints_grid%npoints
302 gvec(:) = nint(path_kpoints_grid%red_point(:, ik) +
m_half * 1e-7_real64)
303 write(file_kpts,
'(a3)', advance=
'no')
' 1.'
304 write(file_kpts,
'(*(a3,f12.8))') &
305 (
' | ', path_kpoints_grid%red_point(idir, ik) - gvec(idir), idir = 1, sys%space%dim)
306 write(file_gvec,
'(*(i5))') (gvec(idir), idir = 1, sys%space%dim)
308 write(file_kpts,
'(a)')
'%'
318 class(
space_t),
intent(in) :: space
320 type(
grid_t),
intent(in) :: gr
321 type(
cube_t),
intent(inout) :: zcube
324 real(real64),
allocatable :: pkm(:,:), ake(:,:), eigs(:)
325 complex(real64),
allocatable :: zpsi(:), field_g(:)
326 integer :: file_ake, iq, ist, idim, nenergy
327 integer :: ig, ix, iy, iz, ik, ie, gmin, gmax
328 real(real64) :: eigmin, eigmax, de, norm
329 real(real64),
parameter :: tol = 1e-7_real64
330 integer,
parameter :: nextend = 10
331 real(real64) :: vec_pc(space%dim), vec_sc(space%dim)
333 character(len=MAX_PATH_LEN) :: filename
334 real(real64),
allocatable :: gvec_abs(:,:)
335 logical,
allocatable :: g_select(:)
339 assert(cf%batch_size == 1)
341 safe_allocate(zpsi(1:gr%np))
354 message(1) =
"UnfoldEnergyStep must be positive"
377 de = (eigmax - eigmin) / 1000_real64
381 nenergy = nint((eigmax - eigmin + 2 * nextend * de) / de)
382 safe_allocate(eigs(1:nenergy))
384 eigs(ie) = eigmin - nextend * de + (ie - 1) * de
387 safe_allocate(gvec_abs(1:sys%space%periodic_dim, 1:sys%kpoints%reduced%npoints))
392 do ik = 1, sys%kpoints%reduced%npoints
393 read(file_gvec,*) vec_sc(1:space%dim)
400 safe_allocate(ake(1:nenergy, 1:st%nik))
403 safe_allocate(pkm(st%d%kpt%start:st%d%kpt%end, 1:st%nst))
405 do ik = st%d%kpt%start, st%d%kpt%end
406 iq = st%d%get_kpoint_index(ik)
410 gmin = minval(shell%red_gvec(:,:))
411 gmax = maxval(shell%red_gvec(:,:))
413 safe_allocate(g_select(1:shell%ngvectors))
414 g_select(:) = .false.
416 select case (sys%space%periodic_dim)
418 do ig = 1, shell%ngvectors
423 vec_pc(1:3) = ix * pc%klattice(1:3,1) + iy * pc%klattice(1:3,2) + iz * pc%klattice(1:3,3)
424 if (abs(vec_sc(1) - vec_pc(1) - gvec_abs(1, iq)) < tol &
425 .and. abs(vec_sc(2) - vec_pc(2)-gvec_abs(2, iq)) < tol &
426 .and. abs(vec_sc(3) - vec_pc(3)-gvec_abs(3, iq)) < tol)
then
427 g_select(ig) = .
true.
436 do ig = 1, shell%ngvectors
440 vec_pc(1:2) = ix * pc%klattice(1:2,1) + iy * pc%klattice(1:2,2)
441 if (abs(vec_sc(1) - vec_pc(1) - gvec_abs(1, iq)) < tol &
442 .and. abs(vec_sc(2) - vec_pc(2) - gvec_abs(2, iq)) < tol)
then
443 g_select(ig) = .
true.
454 write(filename,
"(a,i3.3,a4)") trim(adjustl(
static_dir))//
"ake_",ik,
".dat"
456 write(file_ake,
'(a)')
'#Energy Ak(E)'
457 write(file_ake,
'(a, i5)')
'#Number of points in energy window ', nenergy
462 do idim = 1, st%d%dim
473 safe_allocate(field_g(1:shell%ngvectors))
475 do ig = 1, shell%ngvectors
476 field_g(ig) = cf%fs(shell%coords(1, ig), shell%coords(2, ig), shell%coords(3, ig), 1)
477 norm = norm + abs(field_g(ig))**2
479 field_g(:) = field_g(:) /
sqrt(norm)
482 do ig = 1, shell%ngvectors
483 if (.not. g_select(ig)) cycle
484 pkm(ik,ist) = pkm(ik,ist) + abs(field_g(ig))**2
487 safe_deallocate_a(field_g)
493 (st%d%kpt%end - st%d%kpt%start + 1) * st%nst)
501 ake(ie, ik) = ake(ie, ik) + pkm(ik, ist) * (
m_three * de /
m_pi) / &
502 ((eigs(ie) - st%eigenval(ist, ik))**2 + (
m_three * de)**2)
509 write(file_ake,
'(1es19.12,1x,1es19.12)') eigs(ie), ake(ie, ik)
516 safe_deallocate_a(g_select)
520 if (st%d%kpt%parallel)
then
526 write(file_ake,
'(a)')
'#Energy Ak(E)'
527 write(file_ake,
'(a, i5)')
'#Number of points in energy window ', nenergy
530 write(file_ake,fmt =
'(1es19.12,1x,1es19.12,1x,1es19.12)') coord_along_path(ik), &
531 eigs(ie), ake(ie, ik)
538 safe_deallocate_a(eigs)
539 safe_deallocate_a(ake)
541 safe_deallocate_a(gvec_abs)
542 safe_deallocate_a(pkm)
543 safe_deallocate_a(zpsi)
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
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
subroutine, public cube_function_free_fs(cube, cf)
Deallocates the Fourier space buffer of the cube function.
subroutine, public cube_function_alloc_fs(cube, cf, force_alloc)
Allocates the local part of the Fourier space grid on the cube function.
subroutine, public zcube_function_free_rs(cube, cf)
Deallocates the real space grid.
subroutine, public zcube_function_rs2fs(cube, cf)
Fourier transform a cube function from real space to Fourier space.
subroutine, public zcube_function_alloc_rs(cube, cf, in_device, force_alloc)
Allocates locally the real space grid, if PFFT library is not used. Otherwise, it assigns the PFFT re...
subroutine, public cube_end(cube)
subroutine, public cube_init(cube, nn, namespace, space, spacing, coord_system, fft_type, fft_library, dont_optimize, nn_out, mpi_grp, need_partition, tp_enlarge, blocksize, batch_size, nthreads, single)
subroutine, public cube_init_cube_map(cube, mesh)
integer, parameter, public spinors
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
integer, parameter, public fft_complex
subroutine, public fourier_shell_init(this, namespace, space, cube, mesh, kk)
subroutine, public fourier_shell_end(this)
subroutine, public global_end()
Finalise parser varinfo file, and MPI.
real(real64), parameter, public m_zero
real(real64), parameter, public m_pi
some mathematical constants
real(real64), parameter, public m_epsilon
character(len= *), parameter, public static_dir
subroutine, public global_init(communicator)
Initialise Octopus.
real(real64), parameter, public m_half
real(real64), parameter, public m_three
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_close(iunit, grp)
subroutine, public io_end()
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
subroutine, public kpoints_path_generate(dim, latt, nkpoints, nsegments, resolution, highsympoints, kpoints, coord)
Generate the k-point along a path.
subroutine, public kpoints_fold_to_1bz(grid, latt)
subroutine, public kpoints_grid_end(this)
subroutine, public kpoints_to_reduced(latt, kin, kout)
subroutine, public kpoints_to_absolute(latt, kin, kout)
subroutine, public kpoints_grid_init(dim, this, npoints, nshifts)
System information (time, memory, sysname)
subroutine, public loct_progress_bar(a, maxcount)
A wrapper around the progress bar, such that it can be silenced without needing to dress the call wit...
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_end()
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_init(output_dir)
subroutine, public print_date(str)
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)
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
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.
integer function, public parse_block(namespace, name, blk, check_varinfo_)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
subroutine, public profiling_end(namespace)
subroutine, public profiling_init(namespace)
Create profiling subdirectory.
integer, parameter, public restart_type_load
integer, parameter, public restart_unocc
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
This module handles reading and writing restart information for the states_elec_t.
subroutine, public states_elec_load(restart, namespace, space, st, mesh, kpoints, fixed_occ, ierr, iter, lr, lowest_missing, label, verbose, skip)
returns in ierr: <0 => Fatal error, or nothing read =0 => read all wavefunctions >0 => could only rea...
subroutine, public unfold_main()
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)
This module is intended to contain simple general-purpose utility functions and procedures.
subroutine, public print_header()
This subroutine prints the logo followed by information about the compilation and the system....
Class describing the electron system.
Description of the grid, containing information on derivatives, stencil, and symmetries.
The states_elec_t class contains all electronic wave functions.
subroutine unfold_setup()
subroutine wfs_extract_spec_fn(space, st, gr, zcube, cf)