DSQSS  1.1
exact_H.cc
説明を見る。
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 
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型の値 フレンド マクロ定義