X-Git-Url: http://git.treefish.org/~alex/phys/heatbath.git/blobdiff_plain/628f4432052ed72944d5cf663c0cde4da9ac6d56..0f8b9f29fdcc92049803e88be1c9524d6d0d6fab:/obs_phip2_hist.hpp?ds=sidebyside diff --git a/obs_phip2_hist.hpp b/obs_phip2_hist.hpp new file mode 100644 index 0000000..64b82e8 --- /dev/null +++ b/obs_phip2_hist.hpp @@ -0,0 +1,71 @@ +#ifndef OBS_PHIP2_HIST_HPP +#define OBS_PHIP2_HIST_HPP + +#include "latlib/o815/o815.h" + +#include "latlib/writeout.h" + +#include "latlib/obstat.hpp" + +#include + +using namespace std; + +class obs_phip2_hist : public o815::obs { + +public: + struct obsmem { + double *phip2; + }; + obs_phip2_hist(o815 *_O815); + +private: + void _start() {} + void _meas(bool loadedobs, const int& nthmeas); + void _finish() {} + obsmem OM; + sim *Sim; +}; + +obs_phip2_hist::obs_phip2_hist(o815 *_O815) : o815::obs("phip2", + _O815->paraQ->getParaNames() + "nthstep:kpt:kpx:phip2", _O815, + sizeof(double)*(_O815->comargs.lsize[0]+1)*(_O815->comargs.lsize[1]+1), + "_hist") { + OM.phip2 = (double*)obsMem; + Sim = (sim*)O815->Sim; +} + +void obs_phip2_hist::_meas(bool loadedobs, const int& nthmeas) { + if (!loadedobs) { + for (int kpt = 0; kpt <= O815->comargs.lsize[0]; kpt++) + for (int kpx = 0; kpx <= O815->comargs.lsize[1]; kpx++) { + double ppt = 2.*M_PI/O815->comargs.lsize[0] * kpt; + double ppx = 2.*M_PI/O815->comargs.lsize[1] * kpx; + + OM.phip2[ kpt * ( O815->comargs.lsize[1] + 1 ) + kpx ] = 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[ kpt * ( O815->comargs.lsize[1] + 1 ) + kpx ] += 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[ kpt * ( O815->comargs.lsize[1] + 1 ) + kpx ] /= Sim->LSIZE2; + } + } + + for (int kpt = 0; kpt <= O815->comargs.lsize[0]; kpt++) + for (int kpx = 0; kpx <= O815->comargs.lsize[1]; kpx++) { + double ppt = 2.*M_PI/O815->comargs.lsize[0] * kpt; + double ppx = 2.*M_PI/O815->comargs.lsize[1] * kpx; + + *out << O815->paraQ->getParaVals(); + *out << "\t" << ( Sim->nequi + (nthmeas+1)*Sim->nskip ); + *out << "\t" << kpt << "\t" << kpx; + *out << "\t" << OM.phip2[ kpt * ( O815->comargs.lsize[1] + 1 ) + kpx ] - 1./(ppt*ppt + ppx*ppx + Sim->m*Sim->m) << endl; + } +}; + +#endif