Following this example you will calculate the phonon dispersion relations and the phonon spectral function of fcc Al. I assume everything is installed, and that the tdep/bin
folder is added to your path. Navigate to tests/test_1_fcc_al
. There you will find
which are prepared input files. Copy these to a new folder and work from there (not a reuqirement, but makes it easy to start over in case you mess up). First, we are interested in the phonon frequencies, and for that we need second order force constants. We use
extract_forceconstants -rc2 5
This means we want forceconstants including all neighbours within 5Å. Hopefully, a new file should appear: outfile.forceconstant
, along with some other files we ignore for now. Files named infile.something
will not get overwritten, but those named outfile.something
might. For files to be read by other programs, you need to rename it, preferably like this:
ln -s outfile.forceconstant infile.forceconstant
To get the phonon dispersion relations we use
phonon_dispersion_relations
Frequency as a function of q-vector is written to outfile.dispersion_relations
. If gnuplot is properly set up (if gnuplot just flashes, it's probably because it is missing the --persist
option), you can run
gnuplot outfile.dispersion_relations.gnuplot
And you should see something like this:
If we want to know something about the broadening we need third order force constants. To get these, we rerun
extract_forceconstants -rc2 5 -rc3 3
And it will produce a new forceconstant file, outfile.forceconstant_thirdorder
. Again, we need to copy (or link) it to an infile:
ln -s outfile.forceconstant_thirdorder infile.forceconstant_thirdorder
Once this is set up, we use the lineshape code to produce the phonon spectral function:
mpirun lineshape --path -qg 7 7 7 -ne 600 --temperature 800
and this produces, among other things, an outfile.sqe
(and the hdf5 version of the same data, outfile.sqe.hdf5
). I read this into matlab and plotted it with a logarithmic intensity scale, and the results look something like this:
This is a sample matlab code snippet to produce this plot:
% read everything from file fn=('outfile.sqe.hdf5'); x=h5read(fn,'/q_values'); y=h5read(fn,'/energy_values'); gz=h5read(fn,'/intensity'); xtck=h5read(fn,'/q_ticks'); xtcklabel=strsplit(h5readatt(fn,'/','q_tick_labels')); energyunit=h5readatt(fn,'/','energy_unit'); % plot the results figure(1); clf; hold on; box on; [gy,gx]=meshgrid(y,x); s=pcolor(gx,gy,log10(gz+1E-2)); set(s,'edgecolor','none','facecolor','interp') set(gca,'xtick',xtck,'xticklabel',xtcklabel) ylabel(['Energy (' energyunit ')']) xlim([0 max(x)]) ylim([0 max(y)])
And an equivalent snippet using matplotlib
import matplotlib.pyplot as plt import numpy as np import h5py as h5 from matplotlib.colors import LogNorm # open the sqe file f = h5.File('outfile.sqe.hdf5','r') # get axes and intensity x = np.array(f.get('q_values')) y = np.array(f.get('energy_values')) gz = np.array(f.get('intensity')) # add a little bit so that the logscale does not go nuts gz=gz+1E-2 # for plotting, turn the axes into 2d arrays gx, gy = np.meshgrid(x,y) # x-ticks xt = np.array(f.get('q_ticks')) # labels for the x-ticks xl = f.attrs.get('q_tick_labels').split() # label for y-axis yl = "Energy ("+f.attrs.get('energy_unit')+")" plt.pcolormesh(gx, gy, gz, norm=LogNorm(vmin=gz.min(), vmax=gz.max()), cmap='viridis') # set the limits of the plot to the limits of the data plt.axis([x.min(), x.max(), y.min(), y.max()]) plt.xticks(xt,xl) plt.ylabel(yl) plt.show()
Read the documentation for the codes used, and familiarize yourself with their capabilities before moving on. A couple of things that should be very easy, and a final one that requires some thought: