DSQSS
1.1
|
00001 00002 //============================================================================ 00003 // Computation of Canonical Averages 00004 //============================================================================ 00005 00006 dgematrix DensityMatrix( double B, vector<double>& V, dgematrix& U) { 00007 int DIM = V.size(); 00008 dgematrix UT(DIM,DIM); 00009 dgematrix W(DIM,DIM); 00010 UT = t(U); 00011 W.zero(); 00012 double emin = V[0]; 00013 for (int i=0; i<DIM; i++) if ( emin > V[i] ) emin = V[i]; 00014 for (int i=0; i<DIM; i++) W(i,i) = exp( - B * (V[i] - emin) ); 00015 return U * W * UT; 00016 } 00017 00018 //---------------------------------------------------------------------------- 00019 00020 double chi(double B, double E1, double E0) { 00021 if ( fabs(E1-E0) < 1.0e-12 ) { 00022 return B * exp( -B*E0 ); 00023 } else { 00024 return - ( exp( -B*E1 ) - exp( -B*E0 ) ) / ( E1 - E0 ); 00025 } 00026 } 00027 00028 //---------------------------------------------------------------------------- 00029 00030 // 00031 // ans = (\beta)^{-1} \int_0^{\beta} dt ( <Q(t)Q(0)> - <Q(t)Q(0)> ) 00032 // --> <Q^2>-<Q>^2 (in the classical or the high-T limit) 00033 // 00034 double Susceptibility( 00035 double B , vector<double>& V , dgematrix& U , dgematrix& Q ) { 00036 00037 int DIM = V.size(); 00038 double* E = new double[DIM]; 00039 double emin = V[0]; 00040 for (int i=0; i<DIM; i++) if ( V[i] < emin ) emin = V[i]; 00041 for (int i=0; i<DIM; i++) E[i] = V[i]-emin; 00042 00043 dgematrix UT(DIM,DIM); 00044 dgematrix W(DIM,DIM); 00045 UT = t(U); 00046 W = UT * Q * U; 00047 00048 double Z0 = 0.0; 00049 double Z1 = 0.0; 00050 double ZX = 0.0; 00051 for (int i=0; i<DIM; i++) { 00052 Z0 += exp( -B * E[i] ); 00053 Z1 += exp( -B * E[i] ) * W(i,i); 00054 for (int j=0; j<DIM; j++) { 00055 ZX += chi(B,E[j],E[i]) * W(j,i) * W(i,j); 00056 } 00057 } 00058 00059 double ave = Z1 / Z0; 00060 double ans = ZX / Z0 / B - ave * ave ; 00061 delete [] E; 00062 return ans; 00063 } 00064 00065 //---------------------------------------------------------------------------- 00066 00067 double CanonicalAverage( dgematrix& R, dgematrix& Q) { 00068 double z0 = 0.0; 00069 double z1 = 0.0; 00070 int n = R.n; 00071 dgematrix W(n,n); 00072 W = R * Q; 00073 for (int i=0; i<n; i++) { 00074 z0 += R(i,i); 00075 z1 += W(i,i); 00076 } 00077 return z1/z0; 00078 }