pwtools.pydos.pdos¶
- pwtools.pydos.pdos(vel, dt=1.0, m=None, full_out=False, area=1.0, window=True, npad=None, tonext=False, mirr=False, method='direct')[source]¶
Phonon DOS by FFT of the VACF or direct FFT of atomic velocities.
Integral area is normalized to area. It is possible (and recommended) to zero-padd the velocities (see npad).
- Parameters:
vel (3d array (nstep, natoms, 3)) – atomic velocities
dt (time step)
m (1d array (natoms,),) – atomic mass array, if None then mass=1.0 for all atoms is used
full_out (bool)
area (float) – normalize area under frequency-PDOS curve to this value
window (bool) – use Welch windowing on data before FFT (reduces leaking effect, recommended)
npad ({None, int}) – method=’direct’ only: Length of zero padding along axis. npad=None = no padding, npad > 0 = pad by a length of
(nstep-1)*npad
. npad > 5 usually results in sufficient interpolation.tonext (bool) – method=’direct’ only: Pad vel with zeros along axis up to the next power of two after the array length determined by npad. This gives you speed, but variable (better) frequency resolution.
mirr (bool) – method=’vacf’ only: mirror one-sided VACF at t=0 before fft
- Returns:
if full_out = False – |
(faxis, pdos)
| faxis : 1d array [1/unit(dt)] | pdos : 1d array, the phonon DOS, normalized to areaif full_out = True – | if method == ‘direct’: |
(faxis, pdos, (full_faxis, full_pdos, split_idx))
| if method == ‘vavcf’: |(faxis, pdos, (full_faxis, full_pdos, split_idx, vacf, fft_vacf))
| fft_vacf : 1d complex array, result of fft(vacf) or fft(mirror(vacf)) | vacf : 1d array, the VACF
Examples
>>> from pwtools.constants import fs,rcm_to_Hz >>> tr = Trajectory(...) >>> # freq in [Hz] if timestep in [s] >>> freq,dos = pdos(tr.velocity, m=tr.mass, dt=tr.timestep*fs, >>> method='direct', npad=1) >>> # frequency in [1/cm] >>> plot(freq/rcm_to_Hz, dos)
Notes
padding (only method=’direct’): With npad we pad the velocities vel with
npad*(nstep-1)
zeros along axis (the time axis) before FFT b/c the signal is not periodic. For npad=1, this gives us the exact same spectrum and frequency resolution as withpdos(..., method='vacf',mirr=True)
b/c the array to be fft’ed has length2*nstep-1
along the time axis in both cases (remember that the array length = length of the time axis influences the freq. resolution). FFT is only fast for arrays with length = a power of two. Therefore, you may get very different fft speeds depending on whether2*nstep-1
is a power of two or not (in most cases it won’t). Try using tonext but remember that you get another (better) frequency resolution.References
[1] Phys Rev B 47(9) 4863, 1993