Hello developers,
There is a bug in the way SIESTA reads the ProjectedDensityOfStates
block
which can cause the number of energy points to be read
incorrectly. The
energy range and broadening are read as the first three values on
the line,
but the number of energy points is read as the first integer on the
line.
Therefore, if any other value of the line is written as an integer,
then
that will be incorrectly taken as the number of energy points. If
this
value happens to be negative a number of MPI errors are generated
as the
code attempts to deal with an array with a negative size, which is
how I
noticed this problem. The code should be changed to read the
fourth value
on the line, not the first integer, so that it conforms to the
specifications in the manual.
Consider below the following pairs of FDF input and standard output
showing
what I mean. The first example is correct behavior; the rest are
wrong.
Also at the bottom is the section of code that reads and writes the
values
from the PDOS block, and I believe "nhist = integers(p,1)" is the
line that
needs to be fixed.
David Strubbe
UC Berkeley
===============
%block ProjectedDensityOfStates
20.0 30.0 0.01 10 eV
%endblock ProjectedDensityOfStates
siesta: PDOS info:
siesta: e1, e2, sigma, nhist: 20.00 eV 30.00 eV 0.01 eV
10
---
%block ProjectedDensityOfStates
-30 -0 0.01 6000 eV
%endblock ProjectedDensityOfStates
siesta: PDOS info:
siesta: e1, e2, sigma, nhist: -30.00 eV 0.00 eV 0.01 eV
-30
---
%block ProjectedDensityOfStates
-30 -20 0.01 100 eV
%endblock ProjectedDensityOfStates
siesta: PDOS info:
siesta: e1, e2, sigma, nhist: -30.00 eV -20.00 eV 0.01 eV
-30
---
%block ProjectedDensityOfStates
-20 10 0.01 100 eV
%endblock ProjectedDensityOfStates
siesta: PDOS info:
siesta: e1, e2, sigma, nhist: -20.00 eV 10.00 eV 0.01 eV
-20
---
%block ProjectedDensityOfStates
20 30 0.05 10 eV
%endblock ProjectedDensityOfStates
siesta: PDOS info:
siesta: e1, e2, sigma, nhist: 20.00 eV 30.00 eV 0.05 eV
20
---
%block ProjectedDensityOfStates
20 30 0.01 10 eV
%endblock ProjectedDensityOfStates
siesta: PDOS info:
siesta: e1, e2, sigma, nhist: 20.00 eV 30.00 eV 0.01 eV
20
============================
siesta.F:
C Find the desired energy range
if (IOnode) then
read(iu,'(a)') line
p=>digest(line)
if (nvalues(p).lt.3 .or. nnames(p).ne.1)
$ call die("Wrong format in PDOS block")
factor = fdf_convfac( names(p,1), 'Ry' )
e1 = values(p,1) * factor
e2 = values(p,2) * factor
sigma = values(p,3) * factor
nhist = integers(p,1)
write(6,'(a)') 'siesta: PDOS info: '
write(6,'(a,3(f8.2,a),2x,i5)')
$ 'siesta: e1, e2, sigma, nhist: ',
$ e1/eV,' eV',e2/eV,' eV',sigma/eV,' eV', nhist
endif