DSQSS
1.1
|
00001 00002 //============================================================================ 00003 // Spin Matrices 00004 //============================================================================ 00005 00006 class HeisenbergSpin { 00007 public: 00008 int K; 00009 int D; 00010 cmatrix I; 00011 cmatrix UP; 00012 cmatrix DN; 00013 cmatrix X; 00014 cmatrix Y; 00015 cmatrix Z; 00016 HeisenbergSpin( int ); 00017 ~HeisenbergSpin() {}; 00018 }; 00019 00020 //---------------------------------------------------------------------------- 00021 00022 HeisenbergSpin::HeisenbergSpin( int K0 ) { 00023 K = K0; // K = 2 * S 00024 D = K0+1; 00025 I.resize(D,D); 00026 UP.resize(D,D); 00027 DN.resize(D,D); 00028 X.resize(D,D); 00029 Y.resize(D,D); 00030 Z.resize(D,D); 00031 I.zero(); 00032 UP.zero(); 00033 DN.zero(); 00034 X.zero(); 00035 Y.zero(); 00036 Z.zero(); 00037 for (int i=0; i<D-1; i++) { 00038 UP.re(i+1,i) = sqrt((double)((i+1)*(K-i))); 00039 } 00040 DN = t(UP); 00041 // X = 0.5 * (UP + DN); 00042 cmatrix temp = UP + DN; 00043 X = 0.5 * temp; 00044 Y = ((-0.5) * IUNIT) * (UP - DN); 00045 for (int i=0; i<D; i++) { 00046 I.re(i,i) = 1.0; 00047 Z.re(i,i) = - 0.5*(double)K + (double)i; 00048 } 00049 } 00050 00051 //---------------------------------------------------------------------------- 00052 00053 class HeisenbergSpinSet { 00054 00055 public: 00056 00057 int DS; // the dimension of the 1-spin Hilbert space 00058 int N; // "N" in SU(N) 00059 int K; // the number of bosons on each site 00060 int NSITE; // the number of spins 00061 int DIM; // the dimension of the whole Hilbert space 00062 00063 cmatrix* X; 00064 cmatrix* Y; 00065 cmatrix* Z; 00066 cmatrix I; 00067 00068 HeisenbergSpinSet( int K0 , int NSITE0 ) { 00069 00070 printf("SpinSet> start.\n"); 00071 00072 K = K0; 00073 NSITE = NSITE0; 00074 00075 HeisenbergSpin S( K ); 00076 00077 DS = S.D; 00078 X = new cmatrix[NSITE]; 00079 Y = new cmatrix[NSITE]; 00080 Z = new cmatrix[NSITE]; 00081 00082 printf(" definig spins ...\n"); 00083 DIM = 1; 00084 for (int i=0; i<NSITE; i++) { 00085 DIM *= (DS); 00086 cmatrix x; 00087 cmatrix y; 00088 cmatrix z; 00089 x.unity(); 00090 y.unity(); 00091 z.unity(); 00092 for (int j=0; j<NSITE; j++) { 00093 if ( i == j ) { 00094 x = (S.X)^x; 00095 y = (S.Y)^y; 00096 z = (S.Z)^z; 00097 } else { 00098 x = (S.I)^x; 00099 y = (S.I)^y; 00100 z = (S.I)^z; 00101 } 00102 X[i] = x; 00103 Y[i] = y; 00104 Z[i] = z; 00105 } 00106 printf(" ... done.\n"); 00107 00108 I.resize(DIM); 00109 I.identity(); 00110 00111 printf("SpinSet> end.\n"); 00112 00113 }; 00114 }; 00115 }; 00116