X-Git-Url: http://git.treefish.org/~alex/phys/heatbath.git/blobdiff_plain/dca762861c66d8782be31811822812d347ee4577..6904681ba189aa86cb486a357ba2124f463d6101:/obs_phip2_hist.hpp?ds=sidebyside diff --git a/obs_phip2_hist.hpp b/obs_phip2_hist.hpp index 60c86b8..350c213 100644 --- a/obs_phip2_hist.hpp +++ b/obs_phip2_hist.hpp @@ -8,6 +8,7 @@ #include "latlib/obstat.hpp" #include +#include using namespace std; @@ -17,7 +18,7 @@ public: struct obsmem { double phip2[4]; }; - obs_phip2_hist(o815 *_O815); + obs_phip2_hist(o815 *_O815, const int& avgmany=2); private: void _start() {} @@ -25,14 +26,25 @@ private: void _finish() {} obsmem *OM; sim *Sim; + double avgphip2[4]; + static string intToStr(const int& number); + int avgmany; }; -obs_phip2_hist::obs_phip2_hist(o815 *_O815) : o815::obs("phip2", - _O815->paraQ->getParaNames() + "nthstep:imode:kt:kx:phip2absdiffequi", _O815, - sizeof(obsmem), - "_hist") { +string obs_phip2_hist::intToStr(const int& number) +{ + stringstream ss; + ss << number; + return ss.str(); +} + +obs_phip2_hist::obs_phip2_hist(o815 *_O815, const int& _avgmany) : o815::obs("phip2", + _O815->paraQ->getParaNames() + "nthstep:imode:kt:kx:phip2absdiffequi", _O815, + sizeof(obsmem), + "_hist_avg" + intToStr(_avgmany) ) { OM = (obsmem*)obsMem; Sim = (sim*)O815->Sim; + avgmany = _avgmany; } void obs_phip2_hist::_meas(bool loadedobs, const int& nthmeas) { @@ -41,25 +53,29 @@ void obs_phip2_hist::_meas(bool loadedobs, const int& nthmeas) { const double ppx = 2.*M_PI/O815->comargs.lsize[1] * ( 0 + int( kpimode/4. * O815->comargs.lsize[1] ) ); if (!loadedobs) { - OM->phip2[ kpimode ] = 0; - - for (int ixt = 0; ixt < O815->comargs.lsize[0]; ixt++) - for (int ixx = 0; ixx < O815->comargs.lsize[1]; ixx++) - for (int ixpt = 0; ixpt < O815->comargs.lsize[0]; ixpt++) - for (int ixpx = 0; ixpx < O815->comargs.lsize[1]; ixpx++) - OM->phip2[ kpimode ] += real( conj( Sim->conf[ ixt*O815->comargs.lsize[1] + ixx ].phi ) - * Sim->conf[ ixpt*O815->comargs.lsize[1] + ixpx ].phi - * exp ( _i_*(double)ppx*(double)(ixx-ixpx) + _i_*(double)ppt*(double)(ixt-ixpt) ) ); - - OM->phip2[ kpimode ] /= Sim->LSIZE2; + complex phitildepp = 0; + + for (int ixpt = 0; ixpt < O815->comargs.lsize[0]; ixpt++) + for (int ixpx = 0; ixpx < O815->comargs.lsize[1]; ixpx++) + phitildepp += Sim->conf[ ixpt*O815->comargs.lsize[1] + ixpx ].phi + * exp ( - _i_*(double)ppx*(double)ixpx - _i_*(double)ppt*(double)ixpt ); + + OM->phip2[ kpimode ] = norm( phitildepp) / Sim->LSIZE2; } + + if ( nthmeas%avgmany == 0 ) + avgphip2[kpimode] = 0; - *out << O815->paraQ->getParaVals(); - *out << "\t" << ( Sim->nequi + (nthmeas+1)*Sim->nskip ); - *out << "\t" << kpimode; - *out << "\t" << 0 + int( kpimode/4. * O815->comargs.lsize[0] ); - *out << "\t" << 0 + int( kpimode/4. * O815->comargs.lsize[1] ); - *out << "\t" << abs( OM->phip2[ kpimode ] - 1./(ppt*ppt + ppx*ppx + Sim->m*Sim->m) ) << endl; + avgphip2[kpimode] += OM->phip2[ kpimode ]; + + if ( (nthmeas+1)%avgmany == 0 ) { + *out << O815->paraQ->getParaVals(); + *out << "\t" << ( Sim->nequi + (nthmeas+1)*Sim->nskip ); + *out << "\t" << kpimode; + *out << "\t" << 0 + int( kpimode/4. * O815->comargs.lsize[0] ); + *out << "\t" << 0 + int( kpimode/4. * O815->comargs.lsize[1] ); + *out << "\t" << abs( avgphip2[kpimode] / (double)avgmany - 1./(ppt*ppt + ppx*ppx + Sim->m*Sim->m) ) << endl; + } } };