DSQSS  1.1
measure_specific.cc
説明を見る。
00001 //======================================================================
00002 
00003 void Measurement::measure() {
00004 
00005   using namespace Specific;
00006   int NV = LAT.countVertices();
00007 
00008   ACC[NV1].accumulate( ((double)NV) );
00009 
00010   double* val = new double[ALG.NXMAX]; //edit sakakura
00011   //  double val[ALG.NXMAX];
00012 
00013   for (int i=0; i<ALG.NXMAX; i++) {
00014     val[i] = 0.5 * (double)(2 * i - ALG.NXMAX + 1);
00015   }
00016   double phase[2] = { 1.0 , -1.0 };
00017 
00018   double MZU  = 0.0;
00019   double MZUA = 0.0;
00020   double MZS  = 0.0;
00021   double MZSA = 0.0;
00022 
00023   for (int s=0; s<LAT.NSITE; s++) {
00024     Site& SITE = LAT.S(s);
00025     int mt = SITE.getMTYPE();
00026     double ph = phase[mt];
00027     Segment& S0 = SITE.first();
00028     double mz0 = val[S0.X()];
00029     Site::iterator p(SITE);
00030     double mza0 = 0.0;
00031     while ( ! (++p).atOrigin() ) {
00032       Segment& S = *p;
00033       double mz = val[S.X()];
00034       mza0 += mz * S.length();
00035     }
00036 
00037     MZU  +=      mz0;
00038     MZUA +=      mza0;
00039     MZS  += ph * mz0;
00040     MZSA += ph * mza0;
00041   }
00042 
00043   ACC[MZU1].accumulate(MZU);
00044   ACC[MZU2].accumulate(MZU * MZU);
00045   ACC[MZUA1].accumulate(MZUA);
00046   ACC[MZUA2].accumulate(MZUA * MZUA);
00047   ACC[MZS1].accumulate(MZS);
00048   ACC[MZS2].accumulate(MZS * MZS);
00049   ACC[MZSA1].accumulate(MZSA);
00050   ACC[MZSA2].accumulate(MZSA * MZSA);
00051 
00052   double EBSAMP = - (double) NV ;
00053 
00054   for (int b=0; b<LAT.NINT; b++) {
00055     Interaction& I = LAT.I(b);
00056     InteractionProperty& IP = I.property();
00057     //VertexProperty& VP = IP.getVertexProperty();
00058     int NBODY = IP.NBODY;
00059     double* tau = new double[NBODY];
00060     int* x = new int[NBODY];
00061     Site::iterator* p = new Site::iterator[NBODY];
00062     
00063     for (int i=0; i<NBODY; i++) {
00064       Site& S = I.site(i);
00065       p[i].init(S);
00066       p[i]++;
00067       tau[i] = p[i]->topTime();
00068       x[i] = p[i]->X();
00069     }
00070 
00071     double t  = 0.0;
00072     int it;
00073 
00074     // edit Suzuki
00075     // 逆温度に対する規格化
00076 #ifdef NORM
00077     while ( t < 1.0 ) {
00078 #else
00079       while ( t < LAT.BETA ) {
00080 #endif
00081         // end edit Suzuki
00082         it = imin( NBODY , tau ); //nbody=2 it=0
00083         // edit Suzuki
00084         // 逆温度に対する規格化
00085 #ifdef NORM
00086         EBSAMP -= (tau[it]-t) * IP.VertexDensity( x ) * LAT.BETA;
00087 #else
00088         EBSAMP -= (tau[it]-t) * IP.VertexDensity( x );
00089 #endif
00090         // end edit Suzuki
00091 
00092         if ( p[it]->top().isTerminal() ) break;
00093         t = tau[it];
00094         p[it]++;
00095         tau[it] = p[it]->topTime();
00096         x[it] = p[it]->X();
00097       }
00098 
00099       delete [] tau;
00100       delete [] x;
00101       delete [] p;
00102     
00103     }
00104 
00105     ACC[EB1].accumulate( EBSAMP );//kota n++; s1+=x; s2+=(x*x)
00106     ACC[EB2].accumulate( EBSAMP * EBSAMP );
00107 
00108     //+++++ edit sakakura +++++//
00109 
00110     if (P.RUNTYPE == 1){
00111       ediag = MZUA;
00112     }
00113     if (P.RUNTYPE == 2){
00114       ediag = EBSAMP + double(NV);
00115       nkink   = NV; //number of kink
00116     }
00117 
00118     //+++++ edit sakakura +++++//
00119     delete []val;
00120 
00121   }
00122 
00123   //======================================================================
00124   // === edit rep sakakura ===
00125   //void Measurement::setsummary() {
00126   void Measurement::setsummary(int index) {
00127     // === edit rep sakakura ===
00128 
00129     using namespace Specific;
00130 
00131     double* X = new double[NACC]; //edit sakakura
00132     //  double X[NACC];
00133 
00134     for (int i=0; i<NACC; i++) ACC[i].average();
00135     for (int i=0; i<NACC; i++) X[i] = ACC[i].value;
00136 
00137     double B = LAT.BETA;
00138     double V = (double)LAT.NSITE;
00139 
00140     Q[ANV]  = X[NV1]/V;
00141     Q[ENE]  = (EBASE + X[EB1]/B)/V;
00142 
00143     Q[SPE]  = (X[EB2]-X[EB1]*X[EB1]-X[NV1])/V;
00144 
00145     // edit Suzuki
00146     // 逆温度に対する規格化
00147 #ifdef NORM
00148     Q[LEN]  = X[LE1] * B ;
00149     Q[XMX]  = ALG.WDIAG * X[LE1] ;
00150 #else
00151     Q[LEN]  = X[LE1];
00152     Q[XMX]  = ALG.WDIAG * X[LE1] / B;
00153 #endif
00154     // end edit Suzuki
00155     //
00156     Q[AMZU] = X[MZU1]/V;
00157 
00158     // edit Suzuki
00159     // 逆温度に対する規格化
00160 #ifdef NORM
00161     Q[BMZU] = X[MZUA1]/V;
00162     Q[SMZU] = X[MZU2]/V;
00163     Q[XMZU] = X[MZUA2]/V;
00164 
00165     Q[AMZS] = X[MZS1]/V;
00166     Q[BMZS] = X[MZSA1]/V;
00167     Q[SMZS] = X[MZS2]/V;
00168     Q[XMZS] = X[MZSA2]/V;
00169 #else
00170     Q[BMZU] = X[MZUA1]/V/B;
00171     Q[SMZU] = X[MZU2]/V;
00172     Q[XMZU] = X[MZUA2]/V/B/B;
00173 
00174     Q[AMZS] = X[MZS1]/V;
00175     Q[BMZS] = X[MZSA1]/V/B;
00176     Q[SMZS] = X[MZS2]/V;
00177     Q[XMZS] = X[MZSA2]/V/B/B;
00178 #endif
00179     // end edit Suzuki
00180 
00181     // === edit rep sakakura ===
00182     if (P.RUNTYPE == 0)for (int i=0; i<NPHY; i++) PHY[i].accumulate(Q[i]);
00183     if (P.RUNTYPE >> 0)for (int i=0; i<NPHY; i++) PHYX[i][index].accumulate(Q[i]);
00184     // === edit rep sakakura ===
00185 
00186     delete []X;
00187   }
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型の値 フレンド マクロ定義