Page 1 of 1

Hamiltonian matrix labeling

Posted: Wed Jun 03, 2015 12:09 am
by marius
I would like to further analyze the eigenvalues and eigenvectors of a spin Hamiltonian, but to do this I need to know how are the base states ordered. For example, in a S=1/2 and I=3/2 system, at zero field, does the labeling go |-1/2 -3/2>, |-1/2 -1/2> or in a different way? Thanks.

Re: Hamiltonian matrix labeling

Posted: Wed Jun 03, 2015 11:17 am
by ThomasMCasey
On the EasySpin website, go to Documentation > Functions > and check out the documentation for the function called "sop"

Re: Hamiltonian matrix labeling

Posted: Wed Jun 03, 2015 2:55 pm
by Stefan Stoll
In EasySpin, all spin matrices are represented in a conventional high-field Zeeman basis. For a single spin, the states are ordered in descending m. For a spin-1/2, the order is |+1/2> (first row, first column), |-1/2> (second row, second column). For a spin-1, the order is |+1>, |0>, |-1>.

For a multi-spin system, the representation is in the product basis |m1,m2,m3,...>, with the basis functions again in descending m order, left to right. E.g. for a system with one electron-1/2 and one nucleus with spin-1 the states are in the following order: |1/2,+1>, |1/2,0>, |1/2,-1>, |-1/2,+1>, |-1/2,0>, |-1/2,-1>.

Of course, these are the Zeeman states and are generally not the eigenstates of a spin system.

Re: Hamiltonian matrix labeling

Posted: Wed Jun 17, 2015 12:05 pm
by marius
What about a system containing two coupled electron spins and a nuclear spin? If I consider your example and add a second spin 3/2, would the states be |1/2, 3/2, 1>, |1/2, 3/2, 0>, |1/2, 3/2, -1>, |1/2, 1/2, 1> etc.

While it might be a very borderline usage scenario for EasySpin, I was wondering if there is a way to go from the uncoupled basis to a coupled basis for the previous Hamiltonian. To continue with my previous example is there a quick way to represent the Hamiltonian in a basis where the electron spins are antiferromagnetically coupled, e.g. |2, 1>, |2, 0>, |2,-1>, |1, 1> (the first index is the coupled electron spin)?

Re: Hamiltonian matrix labeling

Posted: Sun Jun 21, 2015 12:39 am
by Stefan Stoll
The easiest is to assemble the matrix of Clebsch-Gordan coefficients needed for the transformation, using EasySpin's clebschgordan function.

Here is how I would do it:

Code: Select all

S1 = 1/2;
S2 = 1;

idxu = 1; % index of uncoupled basis funtion
clear C
for mS1 = S1:-1:-S1
  for mS2 = S2:-1:-S2
    idxc = 1; % index of coupled basis function
    for Stot = S1+S2:-1:abs(S1-S2)
      for mStot = Stot:-1:-Stot
        C(idxc,idxu) = clebschgordan(S1,S2,Stot,mS1,mS2,mStot);
        idxc = idxc + 1;
      end
    end
    idxu = idxu + 1;
  end
end
C
Then, to transform states, use psi_c = C*psi_u. To transform operators like the spin Hamiltonian, use H_c = C*H_u*C'. c means coupled, and u means uncoupled.

Re: Hamiltonian matrix labeling

Posted: Sun Jun 21, 2015 11:38 pm
by Stefan Stoll
The next version, EasySpin 5, will have a function called cgmatrix that constructs this transformation matrix.

Re: Hamiltonian matrix labeling

Posted: Sun Jun 28, 2015 2:42 pm
by marius
I used the code that you posted for a more complex system. The goal is to transform the states of a system containing three spins: two electron and one nuclear. If the electron spins couple ferromagnetically, the eigenvectors of the states resulted from the coupling of this spin state to the nuclear spin look fine, but if the electron spins couple antiferromagnetically they are almost zero. Any ideas what might be the problem? Thank you.

Code: Select all

clear all; clc;
cm_to_MHz = 29979.2;

sys.S = [2.5, 2.0];
sys.g = [2.0, 2.0];
sys.Nucs = '55Mn';

sys.A = [[0, 0, 0; 0, 0, 0; 0, 0, 0], [-90, 0, 0; 0, -90, 0; 0, 0, -90]];
sys.ee = -2 * -10 * cm_to_MHz;
St = 1/2;

Hu = sham(sys, [0, 0, 0]);
X = spinvec(sys); S1 = X(1); S2 = X(2); I = X(3);

iu = 1;
for mS1 = S1:-1:-S1
  for mS2 = S2:-1:-S2
    for mI = I:-1:-I
      ic = 1;
      for S12 = S1+S2:-1:abs(S1-S2)
        if S12 == St
          for StI = S12+I:-1:abs(S12-I)
            for mStI = StI:-1:-StI
              C(ic,iu) = ...
                clebschgordan([S1,mS1], [S2,mS2], [S1+S2,mS1+mS2]) * ...
                clebschgordan([S1+S2,mS1+mS2], [I,mI], [StI,mStI]);
              ic = ic + 1;
            end
          end
        end
      end
      iu = iu + 1;      
    end
  end
end

[Huvec, Huval] = eig(Hu);

% States resulted from the coupling of the total electron spin to the nuclear spin.
idx = (2*St+1)*(2*I+1);
Hvec = C * Huvec(:,1:idx);
Hvec

Re: Hamiltonian matrix labeling

Posted: Thu Jul 02, 2015 2:25 am
by marius
Maybe my previous post was poorly stated. A better question is whether is possible to extend the cgmatrix to work with three (or more) spins or just take as argument the vector returned by the spinvec function.

Re: Hamiltonian matrix labeling

Posted: Fri Jul 03, 2015 10:16 am
by Stefan Stoll
In principle, this is possible. However, for more than two spins, there are always several possible ways of coupling them. How would you suggest the interface should look like, say for 4 spins?

Re: Hamiltonian matrix labeling

Posted: Sat Jul 04, 2015 3:01 pm
by marius
The final result however should not depend on the coupling order of the spins. The code that I posted previously to calculate the CG coefficient matrix for a three spins system was wrong, and that's why the results were not good if the first two spins are coupled antiferromagneticaly. The code below should do the job for this case, but it is true that a simple generalization to an arbitrary number of spins is not that straight forward.

Code: Select all

iu = 1;
for mS1 = S1:-1:-S1
  for mS2 = S2:-1:-S2
    for mI = I:-1:-I
      ic = 1;
      for S12 = S1+S2:-1:abs(S1-S2)
        for mStI = StI:-1:-StI
          if abs(mS1 + mS2) <= abs(S12)
            C(ic,iu) = ...
              clebschgordan([S1,mS1], [S2,mS2], [S12,mS1+mS2]) * ...
              clebschgordan([S12,mS1+mS2], [I,mI], [StI,mStI]);
          else
            C(ic,iu) = 0.0;
          end
          ic = ic + 1;
        end
      end
      iu = iu + 1;
    end
  end
end