Spin wave spectrum of LiNiPO4

Spin wave model from: T. Jensen, et al., PRB 79, 6 (2009) http://arxiv.org/abs/0902.2288 or http://prb.aps.org/abstract/PRB/v79/i9/e092413 We define only the magnetic atoms of LiNiPO4

Contents

Define the lattice

linipo = spinw;
linipo.genlattice('lat_const', [10.02 5.86 4.68],'sym','P n m a');
linipo.addatom('r',[1/4 1/4 0],'S',1,'label','MNi2','color','b')
linipo.gencoupling
plot(linipo)

Magnetic Hamiltonian

Fitted parameters of the Hamiltonian taken from the paper at T = 1.5 K (the anisotropy values are wrong in the paper, they are corrected from the thesis of T. Jensen).

Jbc =  1.036;
Jb  =  0.6701;
Jc  = -0.0469;
Jac = -0.1121;
Jab =  0.2977;
Da  =  0.1969;
Db  =  0.9097;
Dc  =  0;

linipo.addmatrix('label','Jbc','value',Jbc,'color','red')
linipo.addmatrix('label','Jb', 'value',Jb, 'color','green')
linipo.addmatrix('label','Jc', 'value',Jc, 'color','blue')
linipo.addmatrix('label','Jab','value',Jab,'color','Turquoise')
linipo.addmatrix('label','Jac','value',Jac,'color','orange')
linipo.addmatrix('label','D',  'value',diag([Da Db Dc]),'color','purple')

linipo.addcoupling('mat','Jbc','bond',1)
linipo.addcoupling('mat','Jc' ,'bond',2)
linipo.addcoupling('mat','Jb' ,'bond',7)
linipo.addcoupling('mat','Jab','bond',[5 6])
linipo.addcoupling('mat','Jac','bond',[3 4])

linipo.addaniso('D')
plot(linipo,'range',[2 2 1],'atomLegend',false)
swplot.zoom(1.4)

Magnetic structure

We define the antiferromagnetic structure along the c-axis by direct input of the moment components.

linipo.genmagstr('mode','direct','S',[0 0 0 0; 0 0 0 0; 1 -1 -1 1])

Spin wave spectrum

We calculate spin wave dispersion to compare with Figure 1 (a-c) in the paper. We use sw_omegasum() function to eliminate zero intensity spin wave modes from the lineplots.

linipoSpec = linipo.spinwave({[0 1 0] [2 1 0]});
linipoSpec = sw_egrid(linipoSpec);
linipoSpec = sw_omegasum(linipoSpec,'zeroint',1e-3);
figure
subplot(2,1,1)
sw_plotspec(linipoSpec,'mode','disp','axLim',[0 8],'colormap',[0 0 0],'colorbar',false)
subplot(2,1,2)
sw_plotspec(linipoSpec,'mode','int','axLim',[0 15],'colormap',[0 0 0],'colorbar',false)
swplot.subfigure(1,3,1)

linipoSpec = linipo.spinwave({[0 0 0] [0 2 0]});
linipoSpec = sw_egrid(linipoSpec);
linipoSpec = sw_omegasum(linipoSpec,'zeroint',1e-5);
figure
subplot(2,1,1)
sw_plotspec(linipoSpec,'mode','disp','axLim',[0 8],'colormap',[0 0 0],'colorbar',false)
subplot(2,1,2)
sw_plotspec(linipoSpec,'mode','int','axLim',[0 15],'colormap',[0 0 0],'colorbar',false)
swplot.subfigure(1,3,1)

linipoSpec = linipo.spinwave({[0 1 0] [0 1 2]});
linipoSpec = sw_egrid(linipoSpec);
linipoSpec = sw_omegasum(linipoSpec,'zeroint',1e-5);
figure
subplot(2,1,1)
sw_plotspec(linipoSpec,'mode','disp','axLim',[0 8],'colormap',[0 0 0],'colorbar',false)
subplot(2,1,2)
sw_plotspec(linipoSpec,'mode','int','axLim',[0 15],'colormap',[0 0 0],'colorbar',false)
swplot.subfigure(1,3,1)

Mode crossing

On the last figure, the two spin wave mode cross each other, where the order of the modes are reversed. This is a general feature of numercial eigenvalue calculations, where it is hard to follow the eigenvalues and eigenvectors through accidental degeneracy points. However at every Q point the physical quantities (mode+assigned intensity) are always right.

Written by
Sandor Toth
16-Jun-2014, 06-Feb-2017