42 use,
intrinsic :: iso_fortran_env
71 type(electrons_t),
pointer :: sys
72 integer :: ik, nkpoints
73 type(restart_t) :: restart
75 type(cube_function_t) :: cf
77 type(lattice_vectors_t) :: pc
78 integer :: ierr, run_mode, file_gvec
80 integer :: nhighsympoints, nsegments
81 integer :: icol, idir, ncols
83 integer,
allocatable :: resolution(:)
84 real(real64),
allocatable :: highsympoints(:,:), coord_along_path(:)
85 type(kpoints_grid_t) :: path_kpoints_grid
108 if (sys%space%periodic_dim == 0)
then
109 message(1) =
"oct-unfold can only be used for periodic systems."
113 if (sys%st%parallel_in_states)
then
117 if (sys%st%d%ispin ==
spinors)
then
166 write(
message(1),
'(a)')
'Error while reading UnfoldPointsPath.'
173 if (nhighsympoints /= nsegments+1)
then
174 write(
message(1),
'(a,i3,a,i3)')
'The first row of UnfoldPointsPath is not compatible with the number of specified k-points.'
178 safe_allocate(resolution(1:nsegments))
179 do icol = 1, nsegments
183 nkpoints = sum(resolution) + 1
185 safe_allocate(highsympoints(1:sys%space%dim, 1:nhighsympoints))
186 do ik = 1, nhighsympoints
189 if (ncols /= sys%space%dim)
then
190 write(
message(1),
'(a,i8,a,i3)')
'UnfoldPointsPath row ', ik,
' has ', ncols,
' columns but must have ', sys%space%dim
194 do idir = 1, sys%space%dim
203 safe_allocate(coord_along_path(1:nkpoints))
206 highsympoints, path_kpoints_grid%point, coord_along_path)
208 safe_deallocate_a(resolution)
209 safe_deallocate_a(highsympoints)
212 do ik = 1, path_kpoints_grid%npoints
213 call kpoints_to_reduced(sys%kpoints%latt, path_kpoints_grid%point(:, ik), path_kpoints_grid%red_point(:, ik))
218 if (run_mode == option__unfoldmode__unfold_setup)
then
222 else if (run_mode == option__unfoldmode__unfold_run)
then
227 read(file_gvec, *) ik
228 if (ik /= path_kpoints_grid%npoints)
then
229 message(1) =
'There is an inconsistency between unfold_gvec.dat and the input file'
239 ierr=ierr, label =
": unfold")
242 message(1) =
'Unable to read unocc wavefunctions.'
261 message(1) =
"Unsupported or incorrect value of UnfoldMode."
265 safe_deallocate_a(coord_along_path)
269 safe_deallocate_p(sys)
283 integer :: file_gvec, file_kpts, idir
284 integer :: gvec(sys%space%dim)
291 write(file_kpts,
'(a)')
'%KpointsReduced'
292 write(file_gvec,
'(a)')
'#Created by oct-unfold'
293 write(file_gvec,
'(i5)') path_kpoints_grid%npoints
296 do ik = 1, path_kpoints_grid%npoints
297 gvec(:) = nint(path_kpoints_grid%red_point(:, ik) +
m_half * 1e-7_real64)
298 write(file_kpts,
'(a3)', advance=
'no')
' 1.'
299 write(file_kpts,
'(*(a3,f12.8))') &
300 (
' | ', path_kpoints_grid%red_point(idir, ik) - gvec(idir), idir = 1, sys%space%dim)
301 write(file_gvec,
'(*(i5))') (gvec(idir), idir = 1, sys%space%dim)
303 write(file_kpts,
'(a)')
'%'
313 class(
space_t),
intent(in) :: space
315 type(
grid_t),
intent(in) :: gr
316 type(
cube_t),
intent(inout) :: zcube
319 real(real64),
allocatable :: pkm(:,:), ake(:,:), eigs(:)
320 complex(real64),
allocatable :: zpsi(:), field_g(:)
321 integer :: file_ake, iq, ist, idim, nenergy
322 integer :: ig, ix, iy, iz, ik, ie, gmin, gmax
323 real(real64) :: eigmin, eigmax, de, norm
324 real(real64),
parameter :: tol = 1e-7_real64
325 integer,
parameter :: nextend = 10
326 real(real64) :: vec_pc(space%dim), vec_sc(space%dim)
328 character(len=MAX_PATH_LEN) :: filename
329 real(real64),
allocatable :: gvec_abs(:,:)
330 logical,
allocatable :: g_select(:)
334 safe_allocate(zpsi(1:gr%np))
347 message(1) =
"UnfoldEnergyStep must be positive"
370 de = (eigmax - eigmin) / 1000_real64
374 nenergy = nint((eigmax - eigmin + 2 * nextend * de) / de)
375 safe_allocate(eigs(1:nenergy))
377 eigs(ie) = eigmin - nextend * de + (ie - 1) * de
380 safe_allocate(gvec_abs(1:sys%space%periodic_dim, 1:sys%kpoints%reduced%npoints))
385 do ik = 1, sys%kpoints%reduced%npoints
386 read(file_gvec,*) vec_sc(1:space%dim)
393 safe_allocate(ake(1:nenergy, 1:st%nik))
396 safe_allocate(pkm(st%d%kpt%start:st%d%kpt%end, 1:st%nst))
398 do ik = st%d%kpt%start, st%d%kpt%end
399 iq = st%d%get_kpoint_index(ik)
403 gmin = minval(shell%red_gvec(:,:))
404 gmax = maxval(shell%red_gvec(:,:))
406 safe_allocate(g_select(1:shell%ngvectors))
407 g_select(:) = .false.
409 select case (sys%space%periodic_dim)
411 do ig = 1, shell%ngvectors
416 vec_pc(1:3) = ix * pc%klattice(1:3,1) + iy * pc%klattice(1:3,2) + iz * pc%klattice(1:3,3)
417 if (abs(vec_sc(1) - vec_pc(1) - gvec_abs(1, iq)) < tol &
418 .and. abs(vec_sc(2) - vec_pc(2)-gvec_abs(2, iq)) < tol &
419 .and. abs(vec_sc(3) - vec_pc(3)-gvec_abs(3, iq)) < tol)
then
420 g_select(ig) = .
true.
429 do ig = 1, shell%ngvectors
433 vec_pc(1:2) = ix * pc%klattice(1:2,1) + iy * pc%klattice(1:2,2)
434 if (abs(vec_sc(1) - vec_pc(1) - gvec_abs(1, iq)) < tol &
435 .and. abs(vec_sc(2) - vec_pc(2) - gvec_abs(2, iq)) < tol)
then
436 g_select(ig) = .
true.
447 write(filename,
"(a,i3.3,a4)") trim(adjustl(
static_dir))//
"ake_",ik,
".dat"
449 write(file_ake,
'(a)')
'#Energy Ak(E)'
450 write(file_ake,
'(a, i5)')
'#Number of points in energy window ', nenergy
455 do idim = 1, st%d%dim
466 safe_allocate(field_g(1:shell%ngvectors))
468 do ig = 1, shell%ngvectors
469 field_g(ig) = cf%fs(shell%coords(1, ig), shell%coords(2, ig), shell%coords(3, ig))
470 norm = norm + abs(field_g(ig))**2
472 field_g(:) = field_g(:) /
sqrt(norm)
475 do ig = 1, shell%ngvectors
476 if (.not. g_select(ig)) cycle
477 pkm(ik,ist) = pkm(ik,ist) + abs(field_g(ig))**2
480 safe_deallocate_a(field_g)
486 (st%d%kpt%end - st%d%kpt%start + 1) * st%nst)
494 ake(ie, ik) = ake(ie, ik) + pkm(ik, ist) * (
m_three * de /
m_pi) / &
495 ((eigs(ie) - st%eigenval(ist, ik))**2 + (
m_three * de)**2)
502 write(file_ake,
'(1es19.12,1x,1es19.12)') eigs(ie), ake(ie, ik)
509 safe_deallocate_a(g_select)
513 if (st%d%kpt%parallel)
then
519 write(file_ake,
'(a)')
'#Energy Ak(E)'
520 write(file_ake,
'(a, i5)')
'#Number of points in energy window ', nenergy
523 write(file_ake,fmt =
'(1es19.12,1x,1es19.12,1x,1es19.12)') coord_along_path(ik), &
524 eigs(ie), ake(ie, ik)
531 safe_deallocate_a(eigs)
532 safe_deallocate_a(ake)
534 safe_deallocate_a(gvec_abs)
535 safe_deallocate_a(pkm)
536 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 zmesh_to_cube(mesh, mf, cube, cf)
Convert a function from the mesh to the cube.
subroutine, public zcube_function_free_rs(cube, cf)
Deallocates the real space grid.
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_init(cube, nn, namespace, space, spacing, coord_system, fft_type, fft_library, dont_optimize, nn_out, mpi_grp, need_partition, tp_enlarge, blocksize)
subroutine, public cube_end(cube)
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 cube_function_free_fs(cube, cf)
Deallocates the Fourier space grid.
subroutine, public zcube_function_rs2fs(cube, cf)
The following routines convert the function between real space and Fourier space Note that the dimens...
subroutine, public cube_function_alloc_fs(cube, cf, force_alloc)
Allocates locally the Fourier space grid, if PFFT library is not used. Otherwise, it assigns the PFFT...
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_)
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...
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)