DSQSS
1.1
|
00001 00002 #include <stdio.h> 00003 #include <iostream> 00004 #include <string> 00005 using namespace std; 00006 #include "matrix.h" 00007 #include "spin_H.h" 00008 #include "canonical.h" 00009 00010 //---------------------------------------------------------------------- 00011 00012 // Heisenberg Model 00013 00014 class HeisenbergModel { 00015 public: 00016 int M; // Number of bosons ( [M]-representaion ) 00017 int NSITE; 00018 double J; // the bilinear coupling 00019 double F; // the field 00020 int DIM; // dimension of the Hilbert space 00021 dgematrix H; 00022 dgematrix MXU; 00023 dgematrix MZU; 00024 dgematrix MXS; 00025 dgematrix MZS; 00026 dgematrix I; 00027 00028 HeisenbergModel( int M0, int NSITE0, double J0, double F0) { 00029 M = M0; 00030 NSITE = NSITE0; 00031 J = J0; 00032 F = F0; 00033 00034 HeisenbergSpinSet S( M , NSITE ); 00035 00036 DIM = S.DIM; 00037 cmatrix h(DIM); 00038 h.zero(); 00039 printf(" defining the hamiltonian...\n"); 00040 for (int k=0; k<NSITE; k++) { 00041 int l = (k+1) % NSITE; 00042 printf(" k= %d\n", k); 00043 h += (- J) * ( S.X[k] * S.X[l] + S.Y[k] * S.Y[l] + S.Z[k] * S.Z[l] ); 00044 } 00045 for (int k=0; k<NSITE; k++) { 00046 h += (- 2.0*F) * ( S.Z[k] ); // z = 2 for a ring 00047 } 00048 printf(" ... done.\n"); 00049 00050 printf(" defining the magnetizations...\n"); 00051 cmatrix mxu(DIM); 00052 cmatrix mzu(DIM); 00053 cmatrix mxs(DIM); 00054 cmatrix mzs(DIM); 00055 mxu.zero(); 00056 mzu.zero(); 00057 mxs.zero(); 00058 mzs.zero(); 00059 for (int k=0; k<NSITE; k++) { 00060 printf(" k= %d\n", k); 00061 double sgn = 1.0; 00062 if ( k % 2 == 1 ) sgn = -1.0; 00063 mxu += ( 1.0 * S.X[k] ); 00064 mzu += ( 1.0 * S.Z[k] ); 00065 mxs += ( sgn * S.X[k] ); 00066 mzs += ( sgn * S.Z[k] ); 00067 } 00068 printf(" ... done.\n"); 00069 00070 H = h.re; 00071 MXU = mxu.re; 00072 MZU = mzu.re; 00073 MXS = mxs.re; 00074 MZS = mzs.re; 00075 I = S.I.re; 00076 00077 }; 00078 }; 00079 00080 //============================================================================ 00081 00082 void Average( 00083 int DIM , dgematrix& R , dgematrix& Q , double& Ave , double& Var ) { 00084 dgematrix W(DIM,DIM); 00085 W = Q * Q; 00086 Ave = CanonicalAverage( R , Q ); 00087 Var = CanonicalAverage( R , W ); 00088 Var = Var - Ave * Ave; 00089 } 00090 00091 //============================================================================ 00092 00093 void WriteXML(int M, dgematrix& Q, dgematrix& H) { 00094 00095 FILE* FOUT = fopen("hamiltonian.xml","w"); 00096 int D = M + 1; 00097 int DD = D * D ; 00098 fprintf(FOUT,"<Hamiltonian>\n"); 00099 fprintf(FOUT," <General>\n"); 00100 fprintf(FOUT," <Comment> SU(2) Heisenberg model with S=%d/2 </Comment>\n", 00101 M); 00102 fprintf(FOUT," <NSTYPE> 1 </NSTYPE>\n"); 00103 fprintf(FOUT," <NITYPE> 1 </NITYPE>\n"); 00104 fprintf(FOUT," <NXMAX> %d </NXMAX>\n", D ); 00105 fprintf(FOUT," </General>\n"); 00106 fprintf(FOUT,"\n"); 00107 fprintf(FOUT," <Site>\n"); 00108 fprintf(FOUT," <STYPE> 0 </STYPE>\n"); 00109 fprintf(FOUT," <TTYPE> 0 </TTYPE>\n"); 00110 fprintf(FOUT," <NX> %d </NX>\n", D); 00111 fprintf(FOUT," </Site>\n"); 00112 fprintf(FOUT,"\n"); 00113 fprintf(FOUT," <Source>\n"); 00114 fprintf(FOUT," <TTYPE> 0 </TTYPE>\n"); 00115 fprintf(FOUT," <STYPE> 0 </STYPE>\n"); 00116 for (int i=0; i<D; i++) { 00117 for (int j=0; j<D; j++) { 00118 double x = Q(i,j); 00119 if ( abs( x ) > 1.0e-8 ) { 00120 fprintf(FOUT, " <Weight> %d %d %24.16f </Weight>\n", i, j, x ); 00121 } 00122 } 00123 } 00124 fprintf(FOUT," </Source>\n"); 00125 fprintf(FOUT,"\n"); 00126 fprintf(FOUT," <Interaction>\n"); 00127 fprintf(FOUT," <ITYPE> 0 </ITYPE>\n"); 00128 fprintf(FOUT," <NBODY> 2 </NBODY>\n"); 00129 fprintf(FOUT," <STYPE> 0 0 </STYPE>\n"); 00130 for (int i=0; i<DD; i++) { 00131 int i0 = i % D; 00132 int i1 = i / D; 00133 for (int j=0; j<DD; j++) { 00134 int j0 = j % D; 00135 int j1 = j / D; 00136 double x = -H(i,j); 00137 if ( abs( x ) > 1.0e-8 ) { 00138 if ( i != j ) x = abs(x); 00139 fprintf(FOUT, " <Weight> %d %d %d %d %24.16f </Weight>\n", 00140 i0, j0, i1, j1, x ); 00141 } 00142 } 00143 } 00144 fprintf(FOUT," </Interaction>\n"); 00145 fprintf(FOUT,"</Hamiltonian>\n"); 00146 } 00147 00148 //============================================================================ 00149 // Main 00150 //============================================================================ 00151 00152 int main(int argc, char** argv) { 00153 00154 using namespace CPPL; 00155 00156 int NARG; 00157 00158 string name = argv[0]; 00159 00160 // if ( name == "./hamgen_H" ) { 00161 00162 NARG = 3; 00163 if ( argc != NARG+1 ) { 00164 printf("usage: $ %s [ M , J , F ]\n", argv[0]); 00165 printf(" M ... the number of bosons on each site \n"); 00166 printf(" ( M= 1, 2, 3, ... for S= 1/2, 1, 3/2, ... ) \n"); 00167 printf(" J ... the coupling constant (positive for ferromagnets)\n"); 00168 printf(" F ... the magnetic field in the pair Hamiltonian\n"); 00169 printf(" ( = H/z if the field H is shared equally by all\n"); 00170 printf(" pairs, where z = 2 for a ring geometry. )\n"); 00171 exit(0); 00172 } 00173 int M = atoi(argv[1]); 00174 double J = (double)atof(argv[2]); 00175 double F = (double)atof(argv[3]); 00176 printf(" M = %4d\n", M ); 00177 printf(" J = %8.3f\n", J ); 00178 printf(" F = %8.3f\n", F ); 00179 HeisenbergSpin S( M ); 00180 HeisenbergModel MDL( M , 2 , 0.5 * J , F ); 00181 WriteXML( M, S.X.re, MDL.H); 00182 exit(0); 00183 00184 // } 00185 00186 // -- comment out -- // edit sakakura 00187 //NARG = 5; 00188 //if ( argc != NARG+1 ) { 00189 // printf("usage: \n"); 00190 // printf(" $ %s [ M, NSITE , J , F , B ]\n", argv[0]); 00191 // printf(" M ... the number of bosons on each site \n"); 00192 // printf(" ( M= 1, 2, 3, ... for S= 1/2, 1, 3/2, ... ) \n"); 00193 // printf(" NSITE ... the number of sites ( the length of the ring ) \n"); 00194 // printf(" J ... the coupling constant (positive for ferromagnets)\n"); 00195 // printf(" F ... the magnetic field in the pair Hamiltonian\n"); 00196 // printf(" ( = H/z if the field H is shared equally by all\n"); 00197 // printf(" pairs, where z = 2 for a ring geometry. )\n"); 00198 // printf(" B ... the inverse temperature\n"); 00199 // printf("\n"); 00200 // printf(" CAUTION: NSITE=2 means a ring with length 2,\n"); 00201 // printf(" which is a 2-site system of \n"); 00202 // printf(" *DOUBLY* coupled spins. \n"); 00203 // exit(0); 00204 //} 00205 00206 //int M = atoi(argv[1]); 00207 //int NSITE = atoi(argv[2]); 00208 //double J = (double)atof(argv[3]); 00209 //double F = (double)atof(argv[4]); 00210 //double B = (double)atof(argv[5]); 00211 00212 //printf(" M = %4d\n", M ); 00213 //printf(" NSITE = %4d\n", NSITE ); 00214 //printf(" J = %8.3f\n", J ); 00215 //printf(" F = %8.3f\n", F ); 00216 //printf(" B = %8.3f\n", B ); 00217 00218 //HeisenbergModel Model( M , NSITE , J , F ); 00219 00220 //int DIM = Model.DIM; 00221 00222 //vector<double> V(DIM); 00223 //dgematrix U(DIM,DIM); 00224 00225 //printf(" diagonalizing the hamiltonian...\n"); 00226 //diagonalize( Model.H, V, U); 00227 00228 //dump(Model.H); 00229 00230 //double emin = V[0]; 00231 //for (int i=0; i<DIM; i++) if ( emin > V[i] ) emin = V[i]; 00232 //emin /= (double)NSITE; 00233 // 00234 //printf(" ... done. (emin = %16.6f)\n", emin); 00235 00236 //dgematrix R(DIM,DIM); 00237 00238 //R = DensityMatrix( B, V, U); 00239 00241 00242 //double AVE, VAR; 00243 //double aen, spe; 00244 //double amxu, smxu, xmxu; 00245 //double amzu, smzu, xmzu; 00246 //double amxs, smxs, xmxs; 00247 //double amzs, smzs, xmzs; 00248 00249 //Average( DIM , R , Model.H , AVE , VAR ); 00250 //aen = AVE / (double)Model.NSITE; 00251 //spe = VAR * B * B / (double)Model.NSITE; 00252 00253 //Average( DIM , R , Model.MXU , AVE , VAR ); 00254 //amxu = AVE / (double)Model.NSITE; 00255 //smxu = VAR / (double)Model.NSITE; 00256 //xmxu = Susceptibility( B , V , U , Model.MXU ) / (double)Model.NSITE; 00257 00258 //Average( DIM , R , Model.MZU , AVE , VAR ); 00259 //amzu = AVE / (double)Model.NSITE; 00260 //smzu = VAR / (double)Model.NSITE; 00261 //xmzu = Susceptibility( B , V , U , Model.MZU ) / (double)Model.NSITE; 00262 00263 //Average( DIM , R , Model.MXS , AVE , VAR ); 00264 //amxs = AVE / (double)Model.NSITE; 00265 //smxs = VAR / (double)Model.NSITE; 00266 //xmxs = Susceptibility( B , V , U , Model.MXS ) / (double)Model.NSITE; 00267 00268 //Average( DIM , R , Model.MZS , AVE , VAR ); 00269 //amzs = AVE / (double)Model.NSITE; 00270 //smzs = VAR / (double)Model.NSITE; 00271 //xmzs = Susceptibility( B , V , U , Model.MZS ) / (double)Model.NSITE; 00272 00273 //printf("\n"); 00274 //printf("================ RESULT ===============\n"); 00275 //printf("\n"); 00276 //printf("M = %4d\n", M ); 00277 //printf("NSITE = %4d\n", NSITE ); 00278 //printf("J = %8.3f\n", J ); 00279 //printf("F = %8.3f\n", F ); 00280 //printf("B = %8.3f\n", B ); 00281 //printf("\n"); 00282 //printf("emin = %16.6f\n",emin); 00283 //printf("aen = %16.6f\n",aen); 00284 //printf("spe = %16.6f\n",spe); 00285 //printf("\n"); 00286 //printf("amxu = %16.6f\n",amxu); 00287 //printf("smxu = %16.6f\n",smxu); 00288 //printf("xmxu = %16.6f\n",xmxu); 00289 //printf("\n"); 00290 //printf("amzu = %16.6f\n",amzu); 00291 //printf("smzu = %16.6f\n",smzu); 00292 //printf("xmzu = %16.6f\n",xmzu); 00293 //printf("\n"); 00294 //printf("amxs = %16.6f\n",amxs); 00295 //printf("smxs = %16.6f\n",smxs); 00296 //printf("xmxs = %16.6f\n",xmxs); 00297 //printf("\n"); 00298 //printf("amzs = %16.6f\n",amzs); 00299 //printf("smzs = %16.6f\n",smzs); 00300 //printf("xmzs = %16.6f\n",xmzs); 00301 00302 //FILE* FOUT = fopen("res_exact.dat","w"); 00303 00304 //fprintf(FOUT, " M = %4d\n", M ); 00305 //fprintf(FOUT, " NSITE = %4d\n", NSITE ); 00306 //fprintf(FOUT, " J = %8.3f\n", J ); 00307 //fprintf(FOUT, " F = %8.3f\n", F ); 00308 //fprintf(FOUT, " B = %8.3f\n", B ); 00309 //fprintf(FOUT, "emin = %16.6f\n",emin); 00310 //fprintf(FOUT, "aen = %16.6f\n",aen); 00311 //fprintf(FOUT, "spe = %16.6f\n",spe); 00312 //fprintf(FOUT,"\n"); 00313 //fprintf(FOUT, "amxu = %16.6f\n",amxu); 00314 //fprintf(FOUT, "smxu = %16.6f\n",smxu); 00315 //fprintf(FOUT, "xmxu = %16.6f\n",xmxu); 00316 //fprintf(FOUT,"\n"); 00317 //fprintf(FOUT, "amzu = %16.6f\n",amzu); 00318 //fprintf(FOUT, "smzu = %16.6f\n",smzu); 00319 //fprintf(FOUT, "xmzu = %16.6f\n",xmzu); 00320 //fprintf(FOUT,"\n"); 00321 //fprintf(FOUT, "amxs = %16.6f\n",amxs); 00322 //fprintf(FOUT, "smxs = %16.6f\n",smxs); 00323 //fprintf(FOUT, "xmxs = %16.6f\n",xmxs); 00324 //fprintf(FOUT,"\n"); 00325 //fprintf(FOUT, "amzs = %16.6f\n",amzs); 00326 //fprintf(FOUT, "smzs = %16.6f\n",smzs); 00327 //fprintf(FOUT, "xmzs = %16.6f\n",xmzs); 00328 00329 // -- comment out -- // edit sakakura 00330 return 0; 00331 } 00332