35  use, 
intrinsic :: iso_fortran_env
 
   76    logical :: computepdos
 
   78    integer :: ldos_nenergies = -1
 
   79    real(real64), 
allocatable :: ldos_energies(:)
 
   87  subroutine dos_init(this, namespace, st, kpoints)
 
   88    type(dos_t),         
intent(out)   :: this
 
   89    type(namespace_t),   
intent(in)    :: namespace
 
   90    type(states_elec_t), 
intent(in)    :: st
 
   91    type(kpoints_t),     
intent(in)    :: kpoints
 
   93    real(real64) :: evalmin, evalmax, eextend
 
  101    npath = kpoints%nkpt_in_path()
 
  102    if (st%nik > npath) 
then 
  103      evalmin = minval(st%eigenval(1:st%nst, 1:(st%nik-npath)))
 
  104      evalmax = maxval(st%eigenval(1:st%nst, 1:(st%nik-npath)))
 
  106      evalmin = minval(st%eigenval(1:st%nst, 1:st%nik))
 
  107      evalmax = maxval(st%eigenval(1:st%nst, 1:st%nik))
 
  110    eextend  = (evalmax - evalmin) / 
m_four 
  139    call parse_variable(namespace, 
'DOSEnergyPoints', 500, this%epoints)
 
  148    call parse_variable(namespace, 
'DOSGamma', 0.008_real64, this%gamma)
 
  167    this%de = (this%emax - this%emin) / (this%epoints - 1)
 
  179      safe_allocate(this%ldos_energies(1:this%ldos_nenergies))
 
  180      do ie = 1, this%ldos_nenergies
 
  185      this%ldos_nenergies = -1
 
  193    type(
dos_t),  
intent(inout) :: this
 
  197    safe_deallocate_a(this%ldos_energies)
 
  198    this%ldos_nenergies = -1
 
  205  subroutine dos_write_dos(this, dir, st, box, ions, mesh, hm, namespace)
 
  206    type(
dos_t),                 
intent(in) :: this
 
  207    character(len=*),            
intent(in) :: dir
 
  209    class(
box_t),                
intent(in) :: box
 
  210    type(
ions_t),        
target, 
intent(in) :: ions
 
  211    class(
mesh_t),               
intent(in) :: mesh
 
  215    integer :: ie, ik, ist, is, ns, maxdos, ib, ind
 
  216    integer, 
allocatable :: iunit(:)
 
  217    real(real64)   :: energy
 
  218    real(real64), 
allocatable :: tdos(:)
 
  219    real(real64), 
allocatable :: dos(:,:,:)
 
  220    character(len=64)  :: filename,format_str
 
  223    integer :: ii, ll, mm, nn, work, norb, work2
 
  224    integer :: ia, iorb, idim
 
  225    real(real64)   :: threshold
 
  226    real(real64), 
allocatable :: ddot(:,:,:)
 
  227    complex(real64), 
allocatable :: zdot(:,:,:)
 
  228    real(real64), 
allocatable :: weight(:,:,:)
 
  236    if (st%d%nspin == 2) ns = 2
 
  240      safe_allocate(dos(1:this%epoints, 1:st%nst, 0:ns-1))
 
  241      safe_allocate(iunit(0:ns-1))
 
  248            write(filename, 
'(a,i4.4,a,i1.1,a)') 
'dos-', ist, 
'-', is+1,
'.dat' 
  250            write(filename, 
'(a,i4.4,a)') 
'dos-', ist, 
'.dat' 
  252          iunit(is) = 
io_open(trim(dir)//
'/'//trim(filename), namespace, action=
'write')
 
  257        do ie = 1, this%epoints
 
  258          energy = this%emin + (ie - 1) * this%de
 
  261          do ik = 1, st%nik, ns
 
  263              dos(ie, ist, is) = dos(ie, ist, is) + st%kweights(ik+is) * 
m_one/
m_pi * &
 
  264                this%gamma / ((energy - st%eigenval(ist, ik+is))**2 + this%gamma**2)
 
  279      safe_allocate(tdos(1))
 
  284          write(filename, 
'(a,i1.1,a)') 
'total-dos-', is+1,
'.dat' 
  285          iunit(is) = 
io_open(trim(dir)//
'/'//trim(filename), namespace, action=
'write')
 
  289          do ie = 1, this%epoints
 
  290            energy = this%emin + (ie - 1) * this%de
 
  293              tdos(1) = tdos(1) + dos(ie, ist, is)
 
  305      iunit(0) = 
io_open(trim(dir)//
'/'//
'total-dos.dat', namespace, action=
'write')
 
  309      do ie = 1, this%epoints
 
  310        energy = this%emin + (ie - 1) * this%de
 
  314            tdos(1) = tdos(1) + dos(ie, ist, is)
 
  324      safe_deallocate_a(tdos)
 
  328      iunit(0) = 
io_open(trim(dir)//
'/'//
'total-dos-efermi.dat', namespace, action=
'write')
 
  330        '] in a format compatible with total-dos.dat' 
  333      maxdos = st%smear%el_per_state * st%nst
 
  343    if (this%computepdos) 
then 
  346      call parse_variable(namespace, 
'AOThreshold', 0.01_real64, threshold)
 
  349      do ia = 1, ions%natoms
 
  356          os%spec => ions%atom(ia)%species
 
  360          do iorb = 1, os%spec%get_niwfs()
 
  361            call os%spec%get_iwf_ilm(iorb, 1, ii, ll, mm)
 
  362            call os%spec%get_iwf_n(iorb, 1, nn)
 
  368                option__aotruncation__ao_full, threshold)
 
  374          os%use_submesh = .false.
 
  375          os%allocated_on_mesh = .
true.
 
  376          os%spec => ions%atom(ia)%species
 
  378          do work = 1, os%norbs
 
  382                ions%atom(ia)%species, mesh, os%sphere, os%ii, os%ll, os%jj, &
 
  383                os, work, os%radius, os%ndim, use_mesh=.not.os%use_submesh, &
 
  384                normalize = normalize)
 
  387                ions%atom(ia)%species, mesh, os%sphere, os%ii, os%ll, os%jj, &
 
  388                os, work, os%radius, os%ndim, &
 
  389                use_mesh = .not. hm%phase%is_allocated() .and. .not. os%use_submesh, &
 
  390                normalize = normalize)
 
  394          if (hm%phase%is_allocated()) 
then 
  396            safe_allocate(os%phase(1:os%sphere%np, st%d%kpt%start:st%d%kpt%end))
 
  399            if (.not. os%use_submesh) 
then 
  400              safe_allocate(os%eorb_mesh(1:mesh%np, 1:os%norbs, 1:os%ndim, st%d%kpt%start:st%d%kpt%end))
 
  401              os%eorb_mesh(:,:,:,:) = 
m_zero 
  403              safe_allocate(os%eorb_submesh(1:os%sphere%np, 1:os%ndim, 1:os%norbs, st%d%kpt%start:st%d%kpt%end))
 
  404              os%eorb_submesh(:,:,:,:) = 
m_zero 
  408              os%ldorbs_eorb = max(
pad_pow2(os%sphere%np), 1)
 
  409              if(.not. os%use_submesh) os%ldorbs_eorb = max(
pad_pow2(os%sphere%mesh%np), 1)
 
  411              safe_allocate(os%buff_eorb(st%d%kpt%start:st%d%kpt%end))
 
  412              do ik= st%d%kpt%start, st%d%kpt%end
 
  418              vec_pot = hm%hm_base%uniform_vector_potential, &
 
  419              vec_pot_var = hm%hm_base%vector_potential)
 
  424              write(filename,
'(a, i3.3, a1, a, i1.1, a1,a)') 
'pdos-at', ia, 
'-', trim(os%spec%get_label()), &
 
  427              write(filename,
'(a,  i3.3, a1, a, a1,a)') 
'pdos-at', ia, 
'-', trim(os%spec%get_label()), &
 
  431            iunit(0) = 
io_open(trim(dir)//
'/'//trim(filename), namespace, action=
'write')
 
  434              '], projected DOS (total and orbital resolved)' 
  438            safe_allocate(ddot(1:st%d%dim, 1:os%norbs, 1:st%block_size))
 
  440            safe_allocate(zdot(1:st%d%dim, 1:os%norbs, 1:st%block_size))
 
  443          safe_allocate(weight(1:os%norbs,1:st%nik,1:st%nst))
 
  444          weight(1:os%norbs,1:st%nik,1:st%nst) = 
m_zero 
  446          do ik = st%d%kpt%start, st%d%kpt%end
 
  447            do ib = st%group%block_start, st%group%block_end
 
  449              if (hm%phase%is_allocated()) 
then 
  451                call st%group%psib(ib, ik)%copy_to(epsib)
 
  452                call hm%phase%apply_to(mesh, mesh%np, .false., epsib, src = st%group%psib(ib, ik))
 
  454                epsib => st%group%psib(ib, ik)
 
  459                do ist = 1, st%group%psib(ib, ik)%nst
 
  460                  ind = st%group%psib(ib, ik)%ist(ist)
 
  461                  do iorb = 1, os%norbs
 
  462                    do idim = 1, st%d%dim
 
  463                      weight(iorb, ik, ind) = weight(iorb, ik, ind) + st%kweights(ik) * abs(ddot(idim, iorb, ist))**2
 
  469                do ist = 1, st%group%psib(ib, ik)%nst
 
  470                  ind = st%group%psib(ib, ik)%ist(ist)
 
  471                  do iorb = 1, os%norbs
 
  472                    do idim = 1, st%d%dim
 
  473                      weight(iorb, ik, ind) = weight(iorb, ik, ind) + st%kweights(ik) * abs(zdot(idim, iorb, ist))**2
 
  479              if (hm%phase%is_allocated()) 
then 
  480                call epsib%end(copy=.false.)
 
  481                safe_deallocate_p(epsib)
 
  487          if (st%parallel_in_states .or. st%d%kpt%parallel) 
then 
  491          safe_deallocate_a(ddot)
 
  492          safe_deallocate_a(zdot)
 
  495            write(format_str,
'(a,i2,a)') 
'(', os%norbs+2, 
'f12.6)' 
  496            safe_allocate(tdos(1:os%norbs))
 
  497            do ie = 1, this%epoints
 
  498              energy = this%emin + (ie - 1) * this%de
 
  499              do iorb = 1, os%norbs
 
  503                    tdos(iorb) = tdos(iorb) + weight(iorb,ik,ist) * 
m_one/
m_pi * &
 
  504                      this%gamma / ((energy - st%eigenval(ist, ik))**2 + this%gamma**2)
 
  513            safe_deallocate_a(tdos)
 
  518          safe_deallocate_a(weight)
 
  526    safe_deallocate_a(iunit)
 
  527    safe_deallocate_a(dos)
 
  535    type(
dos_t),               
intent(in) :: this
 
  536    character(len=*),         
intent(in) :: dir
 
  538    type(
ions_t),     
target, 
intent(in) :: ions
 
  542    integer :: ie, ik, val, cond, is, ns
 
  543    integer, 
allocatable :: iunit(:)
 
  544    real(real64) :: energy
 
  545    real(real64) :: tjdos(1)
 
  546    real(real64), 
allocatable :: jdos(:,:)
 
  547    character(len=64)  :: filename
 
  553    if (st%d%nspin == 2) ns = 2
 
  557      safe_allocate(jdos(1:this%epoints, 0:ns-1))
 
  558      safe_allocate(iunit(0:ns-1))
 
  563        do cond = val, st%nst
 
  564          do ik = 1, st%nik, ns
 
  567              if(st%occ(cond, ik+is) > 
m_epsilon) cycle
 
  568              do ie = 1, this%epoints
 
  569                energy = (ie - 1) * this%de
 
  571                jdos(ie, is) = jdos(ie, is) + st%kweights(ik+is) * 
m_one/
m_pi * &
 
  572                  this%gamma / ((energy - (st%eigenval(cond, ik+is)-st%eigenval(val, ik+is)))**2 + this%gamma**2)
 
  580      if (st%d%nspin > 1) 
then 
  582          write(filename, 
'(a,i1.1,a)') 
'total-jdos-', is+1,
'.dat' 
  583          iunit(is) = 
io_open(trim(dir)//
'/'//trim(filename), namespace, action=
'write')
 
  585          write(iunit(is), 
'(3a)') 
'# energy [', trim(
units_abbrev(
units_out%energy)), 
'], total JDOS (spin-resolved)' 
  587          do ie = 1, this%epoints
 
  588            energy = (ie - 1) * this%de
 
  599      iunit(0) = 
io_open(trim(dir)//
'/'//
'total-jdos.dat', namespace, action=
'write')
 
  603      do ie = 1, this%epoints
 
  604        energy = (ie - 1) * this%de
 
  607          tjdos(1) = tjdos(1) + jdos(ie, is)
 
  617    safe_deallocate_a(iunit)
 
  618    safe_deallocate_a(jdos)
 
  626  subroutine dos_write_ldos(this, dir, st, ions, mesh, how, namespace)
 
  627    type(
dos_t),               
intent(in) :: this
 
  628    character(len=*),         
intent(in) :: dir
 
  630    type(
ions_t),     
target, 
intent(in) :: ions
 
  631    class(
mesh_t),            
intent(in) :: mesh
 
  632    integer(int64),           
intent(in) :: how
 
  635    integer :: ie, ik, ist, is, ns, ip, ierr
 
  636    character(len=MAX_PATH_LEN)  :: fname, name
 
  637    real(real64) :: weight
 
  638    real(real64), 
allocatable :: ldos(:,:,:), dpsi(:,:), abs_psi2(:)
 
  639    complex(real64), 
allocatable :: zpsi(:,:)
 
  644    if (this%ldos_nenergies < 1) 
then 
  645      message(1) = 
"LDOSEnergies must be defined for Output=ldos" 
  651    if (st%d%nspin == 2) ns = 2
 
  656    safe_allocate(ldos(1:mesh%np, 1:this%ldos_nenergies, 1:ns))
 
  659    safe_allocate(abs_psi2(1:mesh%np))
 
  661      safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
 
  663      safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
 
  667    do ik = st%d%kpt%start, st%d%kpt%end
 
  668      is = st%d%get_spin_index(ik)
 
  669      do ist = st%st_start, st%st_end
 
  675            abs_psi2(ip) = dpsi(ip, 1)**2
 
  677          if (st%d%dim > 1) 
then 
  678            abs_psi2(ip) =  abs_psi2(ip) + dpsi(ip, 2)**2
 
  683            abs_psi2(ip) = real(conjg(zpsi(ip, 1)) * zpsi(ip, 1), real64)
 
  685          if (st%d%dim > 1) 
then 
  686            abs_psi2(ip) =  abs_psi2(ip) + real(conjg(zpsi(ip, 2)) * zpsi(ip, 2), real64)
 
  691        do ie = 1, this%ldos_nenergies
 
  692          weight = st%kweights(ik) * 
m_one/
m_pi * &
 
  693            this%gamma / ((this%ldos_energies(ie) - st%eigenval(ist, ik))**2 + this%gamma**2)
 
  695          call lalg_axpy(mesh%np, weight, abs_psi2, ldos(:, ie, is))
 
  700    safe_deallocate_a(dpsi)
 
  701    safe_deallocate_a(zpsi)
 
  702    safe_deallocate_a(abs_psi2)
 
  704    if (st%parallel_in_states .or. st%d%kpt%parallel) 
then 
  709      do ie = 1, this%ldos_nenergies
 
  710        write(name, 
'(a,i3.3)') 
'ldos_en-', ie
 
  714          ldos(:, ie, is), fn_unit, ierr, pos=ions%pos, atoms=ions%atom, grp = st%dom_st_kpt_mpi_grp)
 
  718    safe_deallocate_a(ldos)
 
constant times a vector plus a vector
 
pure logical function, public accel_is_enabled()
 
integer, parameter, public accel_mem_read_only
 
subroutine, public zget_atomic_orbital(namespace, space, latt, pos, species, mesh, sm, ii, ll, jj, os, orbind, radius, d_dim, use_mesh, normalize, index_shift)
This routine returns the atomic orbital basis – provided by the pseudopotential structure in geo.
 
character(len=1), dimension(0:3), parameter, public l_notation
 
real(real64) function, public atomic_orbital_get_radius(species, mesh, iorb, ispin, truncation, threshold)
 
subroutine, public dget_atomic_orbital(namespace, space, latt, pos, species, mesh, sm, ii, ll, jj, os, orbind, radius, d_dim, use_mesh, normalize, index_shift)
This routine returns the atomic orbital basis – provided by the pseudopotential structure in geo.
 
Module that handles computing and output of various density of states.
 
subroutine dos_end(this)
Finalizer for the dos_t object.
 
subroutine, public dos_write_dos(this, dir, st, box, ions, mesh, hm, namespace)
Computes and output the DOS and the projected DOS (PDOS)
 
subroutine, public dos_write_jdos(this, dir, st, ions, hm, namespace)
Computes and output the joint DOS (LDOS)
 
subroutine, public dos_init(this, namespace, st, kpoints)
Initializes the dot_t object.
 
subroutine, public dos_write_ldos(this, dir, st, ions, mesh, how, namespace)
Computes and output the local DOS (LDOS)
 
integer, parameter, public spin_polarized
 
real(real64), parameter, public m_zero
 
real(real64), parameter, public m_four
 
real(real64), parameter, public m_pi
some mathematical constants
 
real(real64), parameter, public m_epsilon
 
real(real64), parameter, public m_one
 
subroutine, public dio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
 
subroutine, public io_close(iunit, grp)
 
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
 
This module is intended to contain "only mathematical" functions and procedures.
 
integer pure function, public pad_pow2(size)
create array size, which is padded to powers of 2
 
This module defines the meshes, which are used in Octopus.
 
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_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
 
type(mpi_grp_t), public mpi_world
 
type(namespace_t), public global_namespace
 
subroutine, public orbitalset_init(this)
 
subroutine, public orbitalset_end(this)
 
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
 
subroutine, public dorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
 
subroutine, public zorbitalset_get_coeff_batch(os, ndim, psib, dot, reduce)
 
integer function, public orbitalset_utils_count(species, iselect)
Count the number of orbital sets we have for a given atom.
 
this module contains the low-level part of the output system
 
character(len=max_path_len) function, public get_filename_with_spin(output, nspin, spin_index)
Returns the filame as output, or output-spX is spin polarized.
 
integer function, public parse_block(namespace, name, blk, check_varinfo_)
 
pure logical function, public states_are_real(st)
 
type(type_t), public type_cmplx
 
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
 
character(len=20) pure function, public units_abbrev(this)
 
This module defines the unit system, used for input and output.
 
type(unit_system_t), public units_out
 
type(unit_system_t), public units_inp
the units systems for reading and writing
 
type(unit_t), public unit_one
some special units required for particular quantities
 
class to tell whether a point is inside or outside
 
Describes mesh distribution to nodes.
 
The states_elec_t class contains all electronic wave functions.
 
batches of electronic states