Spin wave spectrum of YIG

This script calculates the low temperature spin dynamics of yttrium iron garnet (YIG) to compare with the recently published calculation of J. Baker and G. E. W. Bauer, PRL 117, 217201 (2016). The published calculation is based on a classical spin dynamics described by the Landau-Lifshitz-Gilbert equation and a numerical integration in time. This method can be used to calculate spin dynamics at finite temperature. On the other hand SpinW can calculate the spin wave spectrum by diagonalizing the spin Hamiltonian that should be identical to the classical solution up to a finite zero point energy shift at low temperatures. Here we reproduce the low temperature spectrum to compare with the classical results of the paper.

Contents

Importing and plotting the YIG crystal

We get the crystal structure of YIG from a .cif file stored online. SpinW is able to download the file from a given link and create the crystal structure.

yig = spinw('https://raw.githubusercontent.com/SpinW/Models/master/cif/YIG_10K.cif');

% The imported .cif file contains all symmetry operators of its space
% group. SpinW will determine the generators of the space group and stores
% them in the yig.lattice.sym matrix that has dimensions of 3x4xnOp. Where
% the yig.lattice.sym(:,1:3,i) is the rotation operator of the ith symmetry
% operator, while the yig.lattice.sym(:,4,i) is the corresponding
% translation vector. The imported structure assigns automatically
% different colors for different atoms, thus the same color for the two Fe
% sublattice. Here we color differently the two sublattice:

yig.unit_cell.color(:,3) = swplot.color('red');
yig.unit_cell.color(:,2) = swplot.color('blue');

% spin quantum number of Fe3+ ions, determined automatically by SpinW
S0 = max(yig.unit_cell.S);

% normalize spins to S=1 as it is in the paper
yig.unit_cell.S = yig.unit_cell.S/S0;

hFig = plot(yig,'atomMode','mag');
swplot.plotchem('atom1','Fe1','atom2','O','limit',6)
swplot.plotchem('atom1','Fe2','atom2','O','limit',4,'replace',false)

Show the primitive cell

plot(yig,'atomMode','mag')

% new basis vectors in rows
pBV = [1/2 1/2 -1/2;-1/2 1/2 1/2;1/2 -1/2 1/2];
% lattice constant of YIG
lat = yig.abc(1);

swplot.plot('type','arrow','position',cat(3,zeros(3),pBV'))

Generate the bonds using centered cell

An interesting symmetry property of YIG in the "I a -3 d" space group is that the bonds type 3 and type 4 have the exact same length, however they are not related by symmetry. This can be easily seen by checking the center psition of the bonds:

yig.gencoupling('maxDistance',6);
yig.getmatrix('bond',3);
yig.getmatrix('bond',4);

% The (7/8,1/8,1/8) position belongs to the 48g Wyckoff position, while the
% (7/8,7/8,7/8) position is 16b. Thus the exchange interactions on the two
% bonds can be different, even though previous models of YIG assumed they
% are equal.

Create spin Hamiltonian

change from BCC to primitive cubic cell

T = yig.newcell('bvect',{pBV(1,:) pBV(2,:) pBV(3,:)});

% exchange values from the paper
Jad = sw_converter(9.60e-21,'J','THz','photon');
Jdd = sw_converter(3.24e-21,'J','THz','photon');
Jaa = sw_converter(0.92e-21,'J','THz','photon');

% scale the interactions from classical moment size to quantum model
Scl = sqrt(S0*(S0+1));
yig.quickham([Jad Jdd Jaa]/Scl)

% add external field and convert from the standard SpinW unit (meV) to THz
yig.field([0 0 0.01]*sw_converter(1,'meV','THz','photon'))
yig.optmagsteep('nRun',1e4)
yig.genmagstr('mode','rotate','n',[0 0 1])

if sum(yig.mag_str.F(3,:),2)<0
    yig.mag_str.F = -yig.mag_str.F;
end

plot(yig,'atomMode','mag','atomLegend',false,'baseShift',[-5;-5;0])
swplot.zoom(0.6)
Warning: Convergence was not reached! 

Spin wave dispersion to compare with the paper

To compare the results to the paper we extract the imaginary part of the spin-spin correlation function.

Q0  = T*[1 2 3]';
Q_N = T*[ 1/2  1/2    0]'+Q0;
Q_G = T*[   0    0    0]'+Q0;
Q_H = T*[   0    0    1]'+Q0;

qLabel = {'N' 'G' 'H'};

spec = yig.spinwave({Q_N Q_G Q_H 501});

spec = sw_egrid(spec,'component','Sxy-Syx','Evect',linspace(0,28,501));
spec = sw_instrument(spec,'dE',0.75);

figure
sw_plotspec(spec,'mode','disp','colormap',[0 0 0])
hold on
sw_plotspec(spec,'mode','color','imag',true,'qLabel',qLabel)
colormap(sw_cbrewer('RdBu'))
title('YIG low temperature spin wave spectrum')
ylabel('Energy (THz)')

legend off
colorbar off
caxis([-0.05 0.05])
Written by
Sandor Toth
06-Feb-2017