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