I am coming back to this question after doing some tests:
I managed to get things to work according to Joscha's advice. To sum up, the code I am using is:
Code: Select all
cm = 100*clight/1e6; % Conversion constant from cm-1 to MHz
Si = 1/2; % = 1/2, 3/2, 5/2
J12 = -20; J13 = -20; J23 = -25; % Isotropic exchange
dzz = 1.0; % Antisymmetric exchange z-component
Gx = 0; Gy = 0; Gz = dzz; % Antisymmetric tensor elements
GG = [0 Gz -Gy; -Gz 0 Gx; Gy -Gx 0]; % Antisymettric exchange tensor
Sys.S = [Si Si Si];
Sys.g = [gxy gz; gxy gz; gxy gz];
Sys.ee = cm*[-2*J12(i)*eye(3) - 2*GG; -2*J13(i)*eye(3) + 2*GG; -2*J23(i)*eye(3) - 2*GG];
H = sham(Sys(i),[0,0,0.1]); % Generate the Hamiltonian matrix of the system
[Vt,E]=eig(H); % Generate the right-hand vectors (Vt = |>) and the energy eigenvalues (E) of the Hamiltonian
strxyz ={'x','y','z'};
s2t = zeros((2*Sys(i).S(1)+1)*(2*Sys(i).S(2)+1)*(2*Sys(i).S(3)+1));
for l=3:-1:1 % Cycle trhough x (l = 1) / y (l = 2) / z (l = 3)
for m=3:-1:1 % Cycle through spins 1/2/3
str = [strxyz{l}, num2str(m)]; % Concatenate a string like x1, x2, x3, y1,...
op(m,l,:,:)=sop(Sys(i),str);
end
opt(l,:,:) = squeeze(op(1,l,:,:)+op(2,l,:,:)+op(3,l,:,:));
s2t = s2t + squeeze(opt(l,:,:))*squeeze(opt(l,:,:));
end
[S1x,S1y,S1z,S2x,S2y,S2z,S3x,S3y,S3z] = sop(Sys,'x1','y1','z1','x2','y2','z2','x3','y3','z3');
S1zvalue = Vt(:,1).'*S1z*Vt(:,1);
S2zvalue = Vt(:,1).'*S2z*Vt(:,1);
S3zvalue = Vt(:,1).'*S3z*Vt(:,1);
As you may see, this is a triangle of half-integer spins with an antisymmetric exchange dzz parallel component.
In the special case where dzz = 0, the <Siz> values are all reals and their sum is -1/2, equal to the Ms value of the ground state. However, when I tried to introduce AE, I observed that the expectation values were becoming complex numbers.
Also, when I tried:
Code: Select all
S1xvalue = Vt(:,1).'*S1x*Vt(:,1);
S2xvalue = Vt(:,1).'*S2x*Vt(:,1);
S3xvalue = Vt(:,1).'*S3x*Vt(:,1);
S1yvalue = Vt(:,1).'*S1y*Vt(:,1);
S2yvalue = Vt(:,1).'*S2y*Vt(:,1);
S3yvalue = Vt(:,1).'*S3y*Vt(:,1);
I also got complex numbers even if dzz = 0.
Then I went to brush up my quantum mechanics and remembered that the <Six>, <Siy> and <Siz> are <GS|S2t|GS>, where <GS| is the complex conjugate.
So, I changed to:
Code: Select all
[S1x,S1y,S1z,S2x,S2y,S2z,S3x,S3y,S3z] = sop(Sys(i),'x1','y1','z1','x2','y2','z2','x3','y3','z3');
S1zvalue(i) = conj(Vt(:,1).')*S1z*Vt(:,1);
S2zvalue(i) = conj(Vt(:,1).')*S2z*Vt(:,1);
S3zvalue(i) = conj(Vt(:,1).')*S3z*Vt(:,1);
S1xvalue(i) = conj(Vt(:,1).')*S1x*Vt(:,1);
S2xvalue(i) = conj(Vt(:,1).')*S2x*Vt(:,1);
S3xvalue(i) = conj(Vt(:,1).')*S3x*Vt(:,1);
S1yvalue(i) = conj(Vt(:,1).')*S1y*Vt(:,1);
S2yvalue(i) = conj(Vt(:,1).')*S2y*Vt(:,1);
S3yvalue(i) = conj(Vt(:,1).')*S3y*Vt(:,1);
Now all expectation values are real numbers, as expected. Have I got it correct?
Also, I would like to note that when I apply a minute magn. field along the z-axis, <Six> and <Siy> are 12 to 13 orders of magnitude smaller than <Siz>. I was expecting that AE would cant the spins a little further away from the z-axis. What do you think?