Hamiltonian matrix labeling

General forum for EasySpin: questions, how to's, etc.
Post Reply
marius
Newbie
Posts: 5
Joined: Tue Jun 02, 2015 11:21 pm

Hamiltonian matrix labeling

Post 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.
Last edited by marius on Thu Jun 04, 2015 10:37 am, edited 1 time in total.
ThomasMCasey
User
Posts: 34
Joined: Tue May 26, 2015 1:50 pm

Re: Hamiltonian matrix labeling

Post by ThomasMCasey »

On the EasySpin website, go to Documentation > Functions > and check out the documentation for the function called "sop"
Stefan Stoll
EasySpin Creator
Posts: 1073
Joined: Mon Jul 21, 2014 10:11 pm
Location: University of Washington

Re: Hamiltonian matrix labeling

Post 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.
marius
Newbie
Posts: 5
Joined: Tue Jun 02, 2015 11:21 pm

Re: Hamiltonian matrix labeling

Post 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)?
Stefan Stoll
EasySpin Creator
Posts: 1073
Joined: Mon Jul 21, 2014 10:11 pm
Location: University of Washington

Re: Hamiltonian matrix labeling

Post 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.
Stefan Stoll
EasySpin Creator
Posts: 1073
Joined: Mon Jul 21, 2014 10:11 pm
Location: University of Washington

Re: Hamiltonian matrix labeling

Post by Stefan Stoll »

The next version, EasySpin 5, will have a function called cgmatrix that constructs this transformation matrix.
marius
Newbie
Posts: 5
Joined: Tue Jun 02, 2015 11:21 pm

Re: Hamiltonian matrix labeling

Post 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
marius
Newbie
Posts: 5
Joined: Tue Jun 02, 2015 11:21 pm

Re: Hamiltonian matrix labeling

Post 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.
Stefan Stoll
EasySpin Creator
Posts: 1073
Joined: Mon Jul 21, 2014 10:11 pm
Location: University of Washington

Re: Hamiltonian matrix labeling

Post 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?
marius
Newbie
Posts: 5
Joined: Tue Jun 02, 2015 11:21 pm

Re: Hamiltonian matrix labeling

Post 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
Post Reply