From: Alexander Schmidt Date: Wed, 27 Nov 2013 21:42:18 +0000 (+0100) Subject: Renamed and redefined algorithms. X-Git-Url: http://git.treefish.org/~alex/phys/heatbath.git/commitdiff_plain/b29c28bcd466d938ffd95887abef67dc1491bd50 Renamed and redefined algorithms. --- diff --git a/.gitignore b/.gitignore index f851604..814f08c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,8 @@ heatbath-1mr+ heatbath-1mr- heatbath-r- heatbath-r+ +heatbath-AhbMhb +heatbath-AhbMor +heatbath-AorMor +heatbath-AorMhb +heatbath-metro diff --git a/CMakeLists.txt b/CMakeLists.txt index 4466417..d631271 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,30 +16,22 @@ SET(CMAKE_BUILD_TYPE Release) add_subdirectory(latlib) -add_executable(heatbath-nor heatbath.cpp) -set_target_properties(heatbath-nor PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_NOR") -target_link_libraries(heatbath-nor o815 gsl gslcblas lat_neigh) +add_executable(heatbath-metro heatbath.cpp) +set_target_properties(heatbath-metro PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_METRO") +target_link_libraries(heatbath-metro o815 gsl gslcblas lat_neigh) -add_executable(heatbath-r heatbath.cpp) -set_target_properties(heatbath-r PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_R") -target_link_libraries(heatbath-r o815 gsl gslcblas lat_neigh) +add_executable(heatbath-AhbMhb heatbath.cpp) +set_target_properties(heatbath-AhbMhb PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_AHBMHB") +target_link_libraries(heatbath-AhbMhb o815 gsl gslcblas lat_neigh) -add_executable(heatbath-1mr heatbath.cpp) -set_target_properties(heatbath-1mr PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_1MR") -target_link_libraries(heatbath-1mr o815 gsl gslcblas lat_neigh) +add_executable(heatbath-AhbMor heatbath.cpp) +set_target_properties(heatbath-AhbMor PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_AHBMOR") +target_link_libraries(heatbath-AhbMor o815 gsl gslcblas lat_neigh) -add_executable(heatbath-1mr+ heatbath.cpp) -set_target_properties(heatbath-1mr+ PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_1MRPLUS") -target_link_libraries(heatbath-1mr+ o815 gsl gslcblas lat_neigh) +add_executable(heatbath-AorMhb heatbath.cpp) +set_target_properties(heatbath-AorMhb PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_AORMHB") +target_link_libraries(heatbath-AorMhb o815 gsl gslcblas lat_neigh) -add_executable(heatbath-1mr- heatbath.cpp) -set_target_properties(heatbath-1mr- PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_1MRMINUS") -target_link_libraries(heatbath-1mr- o815 gsl gslcblas lat_neigh) - -add_executable(heatbath-r- heatbath.cpp) -set_target_properties(heatbath-r- PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_RMINUS") -target_link_libraries(heatbath-r- o815 gsl gslcblas lat_neigh) - -add_executable(heatbath-r+ heatbath.cpp) -set_target_properties(heatbath-r+ PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_RPLUS") -target_link_libraries(heatbath-r+ o815 gsl gslcblas lat_neigh) +add_executable(heatbath-AorMor heatbath.cpp) +set_target_properties(heatbath-AorMor PROPERTIES COMPILE_DEFINITIONS "ALGORITHM_AORMOR") +target_link_libraries(heatbath-AorMor o815 gsl gslcblas lat_neigh) diff --git a/heatbath.cpp b/heatbath.cpp index 6491da9..9744b33 100644 --- a/heatbath.cpp +++ b/heatbath.cpp @@ -2,31 +2,29 @@ #include "latlib/o815/o815.h" -#ifdef ALGORITHM_NOR -#define ALGORITHM "nor" -#include "sim-nor.hpp" -#elif ALGORITHM_R -#define ALGORITHM "r" -#include "sim-r.hpp" -#elif ALGORITHM_1MR -#define ALGORITHM "1mr" -#include "sim-1mr.hpp" -#elif ALGORITHM_1MRPLUS -#define ALGORITHM "1mr+" -#include "sim-1mr+.hpp" -#elif ALGORITHM_1MRMINUS -#define ALGORITHM "1mr-" -#include "sim-1mr-.hpp" -#elif ALGORITHM_RMINUS -#define ALGORITHM "r-" -#include "sim-r-.hpp" -#elif ALGORITHM_RPLUS -#define ALGORITHM "r+" -#include "sim-r+.hpp" +#ifdef ALGORITHM_METRO +#define ALGORITHM "metro" +#include "sim-metro.hpp" +#elif ALGORITHM_AHBMHB +#include "sim-nonmetro.hpp" +#define ALGORITHM "AhbMhb" +#elif ALGORITHM_AHBMOR +#include "sim-nonmetro.hpp" +#define ALGORITHM "AhbMor" +#elif ALGORITHM_AORMHB +#include "sim-nonmetro.hpp" +#define ALGORITHM "AorMhb" +#elif ALGORITHM_AORMOR +#include "sim-nonmetro.hpp" +#define ALGORITHM "AorMor" #else #error NO UPDATE-ALGORITHM DEFINED! #endif +#ifdef NONMETRO_A_HB +#error SADSADS +#endif + o815 *O815; sim *Sim; diff --git a/sim-1mr+.hpp b/sim-1mr+.hpp deleted file mode 100644 index e46a9ea..0000000 --- a/sim-1mr+.hpp +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef SIM_HPP -#define SIM_HPP - -#include -#include -#include - -#include "latlib/neigh.h" - -class sim : public o815::sim { -public: - struct siteconf { - complex phi; - }; - sim(o815 *_O815); - siteconf* conf; - unsigned int LSIZE2; - double M; - double m; - neigh *nb; - -private: - void _makeSweep(); - void _newParas(); - gsl_rng* rangsl; - void updatePhi (const int& x); -}; - - - -sim::sim(o815 *_O815) : o815::sim( _O815, - sizeof(siteconf)* - (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { - conf = (siteconf*)confMem; - - rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); - gsl_rng_set(rangsl, time(NULL)); - - LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; - - nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); -} - -void sim::updatePhi (const int& x) -{ - complex V=0; - - for (int nu=0; nu<4; nu++) - V += conf[ (*nb)[x*4+nu] ].phi; - - const double V2diff = pow(real(V), 2) - pow(imag(V), 2); - const double Vprod = real(V)*imag(V); - conf[x].phi = complex ( + real(conf[x].phi) * V2diff + 2 * imag(conf[x].phi) * Vprod, - - imag(conf[x].phi) * V2diff + 2 * real(conf[x].phi) * Vprod ) / norm(V); - - const double r = exp( - M * norm(conf[x].phi) - - 1./M * norm(V) - + 2 * real( conf[x].phi * conj(V) ) ); - - conf[x].phi = sqrt(std::log( 1./(1-r) )) / sqrt(M) - * polar( 1.0, gsl_rng_uniform(rangsl) * 2*M_PI ) - + V / M; -} - -void sim::_makeSweep() { - for (int ichecker=0; ichecker<2; ichecker++) - for (int it=0; itcomargs.lsize[0]; it++) - for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) - updatePhi( it*O815->comargs.lsize[1] + iy ); -} - -void sim::_newParas() { - m = (*O815->paraQ)["mass"]; - M = pow( (*O815->paraQ)["mass"], 2 ) + 4; - *log << "SIM: Resetting fields." << endl << flush; - - for (int ix=0; ix -#include -#include - -#include "latlib/neigh.h" - -class sim : public o815::sim { -public: - struct siteconf { - complex phi; - }; - sim(o815 *_O815); - siteconf* conf; - unsigned int LSIZE2; - double M; - double m; - neigh *nb; - -private: - void _makeSweep(); - void _newParas(); - gsl_rng* rangsl; - void updatePhi (const int& x); -}; - - - -sim::sim(o815 *_O815) : o815::sim( _O815, - sizeof(siteconf)* - (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { - conf = (siteconf*)confMem; - - rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); - gsl_rng_set(rangsl, time(NULL)); - - LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; - - nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); -} - -void sim::updatePhi (const int& x) -{ - complex V=0; - - for (int nu=0; nu<4; nu++) - V += conf[ (*nb)[x*4+nu] ].phi; - - const double r = exp( - M * norm(conf[x].phi) - - 1./M * norm(V) - + 2 * real( conf[x].phi * conj(V) ) ); - - conf[x].phi = sqrt(std::log( 1./(1-r) )) / sqrt(M) - * polar( 1.0, arg(conf[x].phi) ) - + V / M; -} - -void sim::_makeSweep() { - for (int ichecker=0; ichecker<2; ichecker++) - for (int it=0; itcomargs.lsize[0]; it++) - for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) - updatePhi( it*O815->comargs.lsize[1] + iy ); -} - -void sim::_newParas() { - m = (*O815->paraQ)["mass"]; - M = pow( (*O815->paraQ)["mass"], 2 ) + 4; - *log << "SIM: Resetting fields." << endl << flush; - - for (int ix=0; ix -#include -#include - -#include "latlib/neigh.h" - -class sim : public o815::sim { -public: - struct siteconf { - complex phi; - }; - sim(o815 *_O815); - siteconf* conf; - unsigned int LSIZE2; - double M; - double m; - neigh *nb; - -private: - void _makeSweep(); - void _newParas(); - gsl_rng* rangsl; - void updatePhi (const int& x); -}; - - - -sim::sim(o815 *_O815) : o815::sim( _O815, - sizeof(siteconf)* - (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { - conf = (siteconf*)confMem; - - rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); - gsl_rng_set(rangsl, time(NULL)); - - LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; - - nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); -} - -void sim::updatePhi (const int& x) -{ - const double theta = gsl_rng_uniform(rangsl) * 2*M_PI; - complex V=0; - - for (int nu=0; nu<4; nu++) - V += conf[ (*nb)[x*4+nu] ].phi; - - const double r = exp( - M * norm(conf[x].phi) - - 1./M * norm(V) - + 2 * real( conf[x].phi * conj(V) ) ); - - conf[x].phi = sqrt(std::log( 1./(1-r) )) / sqrt(M) - * polar(1.0, theta) - + V / M; -} - -void sim::_makeSweep() { - for (int ichecker=0; ichecker<2; ichecker++) - for (int it=0; itcomargs.lsize[0]; it++) - for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) - updatePhi( it*O815->comargs.lsize[1] + iy ); -} - -void sim::_newParas() { - m = (*O815->paraQ)["mass"]; - M = pow( (*O815->paraQ)["mass"], 2 ) + 4; - *log << "SIM: Resetting fields." << endl << flush; - - for (int ix=0; ix +#include +#include + +#include "latlib/neigh.h" + +#define EPSILONPHI 0.5 + +class sim : public o815::sim { +public: + struct siteconf { + complex phi; + }; + sim(o815 *_O815); + siteconf* conf; + unsigned int LSIZE2; + double M; + double m; + neigh *nb; + +private: + void _makeSweep(); + void _newParas(); + gsl_rng* rangsl; + int updatePhi (const int& x); + double SofPhi(const int& x, const complex& phix); + double rhoPhi(const int& x, const complex& phixCandidate); +}; + + + +sim::sim(o815 *_O815) : o815::sim( _O815, + sizeof(siteconf)* + (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { + conf = (siteconf*)confMem; + + rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); + gsl_rng_set(rangsl, time(NULL)); + + LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; + + nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); +} + +void sim::_makeSweep() { + for (int ichecker=0; ichecker<2; ichecker++) + for (int it=0; itcomargs.lsize[0]; it++) + for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) + updatePhi( it*O815->comargs.lsize[1] + iy ); +} + +void sim::_newParas() { + m = (*O815->paraQ)["mass"]; + M = pow( (*O815->paraQ)["mass"], 2 ) + 4; + *log << "SIM: Resetting fields." << endl << flush; + + for (int ix=0; ix phixCandidate = conf[x].phi + + complex ( 2*EPSILONPHI*( 0.5 - gsl_rng_uniform(rangsl) ), + 2*EPSILONPHI*( 0.5 - gsl_rng_uniform(rangsl) ) ); + + if ( gsl_rng_uniform(rangsl) < rhoPhi(x, phixCandidate) ) { + conf[x].phi = phixCandidate; + return 1; + } + + return 0; +} + +double sim::rhoPhi(const int& x, const complex& phixCandidate) { + return exp( SofPhi(x, conf[x].phi) - SofPhi(x, phixCandidate) ); +} + +double sim::SofPhi(const int& x, const complex& phix) { + double sofphi = M * norm(phix); + + for (int nu=0; nu<4; nu++) + sofphi -= 2 * real( conj(phix) * conf[ (*nb)[x*4+nu] ].phi ); + + return sofphi; +} + +#endif diff --git a/sim-nonmetro.hpp b/sim-nonmetro.hpp new file mode 100644 index 0000000..9eb818b --- /dev/null +++ b/sim-nonmetro.hpp @@ -0,0 +1,88 @@ +#ifndef SIM_HPP +#define SIM_HPP + +#include +#include +#include + +#include "latlib/neigh.h" + +class sim : public o815::sim { +public: + struct siteconf { + complex phi; + }; + sim(o815 *_O815); + siteconf* conf; + unsigned int LSIZE2; + double M; + double m; + neigh *nb; + +private: + void _makeSweep(); + void _newParas(); + gsl_rng* rangsl; + void updatePhi (const int& x); + static double magnYOfR (const double& r); +}; + +double sim::magnYOfR (const double& r) +{ + return sqrt( -std::log(1-r) ); +} + +sim::sim(o815 *_O815) : o815::sim( _O815, + sizeof(siteconf)* + (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { + conf = (siteconf*)confMem; + + rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); + gsl_rng_set(rangsl, time(NULL)); + + LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; + + nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); +} + +void sim::updatePhi (const int& x) +{ + complex V=0; + complex Y; + + for (int nu=0; nu<4; nu++) + V += conf[ (*nb)[x*4+nu] ].phi; + +#if defined(ALGORITHM_AHBMHB) || defined(ALGORITHM_AHBMOR) + Y = polar( abs(Y), gsl_rng_uniform(rangsl) * 2*M_PI ); +#elif defined(ALGORITHM_AORMHB) || defined(ALGORITHM_AORMOR) + const double V2diff = pow(real(V), 2) - pow(imag(V), 2); + const double Vprod = real(V)*imag(V); + Y = complex ( + real(Y) * V2diff + 2 * imag(Y) * Vprod, + - imag(Y) * V2diff + 2 * real(Y) * Vprod ) / norm(V); +#endif + +#if defined(ALGORITHM_AHBMHB) || defined(ALGORITHM_AORMHB) + Y = polar( magnYOfR( gsl_rng_uniform(rangsl) ), arg(Y) ); +#elif defined(ALGORITHM_AHBMOR) || defined(ALGORITHM_AORMOR) + Y = polar( magnYOfR( 1 - exp(-norm(Y)) ), arg(Y) ); //!!!! +#endif +} + +void sim::_makeSweep() { + for (int ichecker=0; ichecker<2; ichecker++) + for (int it=0; itcomargs.lsize[0]; it++) + for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) + updatePhi( it*O815->comargs.lsize[1] + iy ); +} + +void sim::_newParas() { + m = (*O815->paraQ)["mass"]; + M = pow( (*O815->paraQ)["mass"], 2 ) + 4; + *log << "SIM: Resetting fields." << endl << flush; + + for (int ix=0; ix -#include -#include - -#include "latlib/neigh.h" - -#define EPSILONPHI 0.5 - -class sim : public o815::sim { -public: - struct siteconf { - complex phi; - }; - sim(o815 *_O815); - siteconf* conf; - unsigned int LSIZE2; - double M; - double m; - neigh *nb; - -private: - void _makeSweep(); - void _newParas(); - gsl_rng* rangsl; - int updatePhi (const int& x); - double SofPhi(const int& x, const complex& phix); - double rhoPhi(const int& x, const complex& phixCandidate); -}; - - - -sim::sim(o815 *_O815) : o815::sim( _O815, - sizeof(siteconf)* - (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { - conf = (siteconf*)confMem; - - rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); - gsl_rng_set(rangsl, time(NULL)); - - LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; - - nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); -} - -void sim::_makeSweep() { - for (int ichecker=0; ichecker<2; ichecker++) - for (int it=0; itcomargs.lsize[0]; it++) - for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) - updatePhi( it*O815->comargs.lsize[1] + iy ); -} - -void sim::_newParas() { - m = (*O815->paraQ)["mass"]; - M = pow( (*O815->paraQ)["mass"], 2 ) + 4; - *log << "SIM: Resetting fields." << endl << flush; - - for (int ix=0; ix phixCandidate = conf[x].phi + - complex ( 2*EPSILONPHI*( 0.5 - gsl_rng_uniform(rangsl) ), - 2*EPSILONPHI*( 0.5 - gsl_rng_uniform(rangsl) ) ); - - if ( gsl_rng_uniform(rangsl) < rhoPhi(x, phixCandidate) ) { - conf[x].phi = phixCandidate; - return 1; - } - - return 0; -} - -double sim::rhoPhi(const int& x, const complex& phixCandidate) { - return exp( SofPhi(x, conf[x].phi) - SofPhi(x, phixCandidate) ); -} - -double sim::SofPhi(const int& x, const complex& phix) { - double sofphi = M * norm(phix); - - for (int nu=0; nu<4; nu++) - sofphi -= 2 * real( conj(phix) * conf[ (*nb)[x*4+nu] ].phi ); - - return sofphi; -} - -#endif diff --git a/sim-r+.hpp b/sim-r+.hpp deleted file mode 100644 index 87f719c..0000000 --- a/sim-r+.hpp +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef SIM_HPP -#define SIM_HPP - -#include -#include -#include - -#include "latlib/neigh.h" - -class sim : public o815::sim { -public: - struct siteconf { - complex phi; - }; - sim(o815 *_O815); - siteconf* conf; - unsigned int LSIZE2; - double M; - double m; - neigh *nb; - -private: - void _makeSweep(); - void _newParas(); - gsl_rng* rangsl; - void updatePhi (const int& x); -}; - - - -sim::sim(o815 *_O815) : o815::sim( _O815, - sizeof(siteconf)* - (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { - conf = (siteconf*)confMem; - - rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); - gsl_rng_set(rangsl, time(NULL)); - - LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; - - nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); -} - -void sim::updatePhi (const int& x) -{ - const double r = gsl_rng_uniform(rangsl); - complex V=0; - - for (int nu=0; nu<4; nu++) - V += conf[ (*nb)[x*4+nu] ].phi; - - const double V2diff = pow(real(V), 2) - pow(imag(V), 2); - const double Vprod = real(V)*imag(V); - conf[x].phi = complex ( + real(conf[x].phi) * V2diff + 2 * imag(conf[x].phi) * Vprod, - - imag(conf[x].phi) * V2diff + 2 * real(conf[x].phi) * Vprod ) / norm(V); - - conf[x].phi = sqrt(std::log( 1./(1-r) )) / sqrt(M) - * polar(1.0, gsl_rng_uniform(rangsl) * 2*M_PI) - + V / M; -} - -void sim::_makeSweep() { - for (int ichecker=0; ichecker<2; ichecker++) - for (int it=0; itcomargs.lsize[0]; it++) - for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) - updatePhi( it*O815->comargs.lsize[1] + iy ); -} - -void sim::_newParas() { - m = (*O815->paraQ)["mass"]; - M = pow( (*O815->paraQ)["mass"], 2 ) + 4; - *log << "SIM: Resetting fields." << endl << flush; - - for (int ix=0; ix -#include -#include - -#include "latlib/neigh.h" - -class sim : public o815::sim { -public: - struct siteconf { - complex phi; - }; - sim(o815 *_O815); - siteconf* conf; - unsigned int LSIZE2; - double M; - double m; - neigh *nb; - -private: - void _makeSweep(); - void _newParas(); - gsl_rng* rangsl; - void updatePhi (const int& x); -}; - - - -sim::sim(o815 *_O815) : o815::sim( _O815, - sizeof(siteconf)* - (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { - conf = (siteconf*)confMem; - - rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); - gsl_rng_set(rangsl, time(NULL)); - - LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; - - nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); -} - -void sim::updatePhi (const int& x) -{ - const double r = gsl_rng_uniform(rangsl); - complex V=0; - - for (int nu=0; nu<4; nu++) - V += conf[ (*nb)[x*4+nu] ].phi; - - conf[x].phi = sqrt(std::log( 1./(1-r) )) / sqrt(M) - * polar( 1.0, arg(conf[x].phi) ) - + V / M; -} - -void sim::_makeSweep() { - for (int ichecker=0; ichecker<2; ichecker++) - for (int it=0; itcomargs.lsize[0]; it++) - for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) - updatePhi( it*O815->comargs.lsize[1] + iy ); -} - -void sim::_newParas() { - m = (*O815->paraQ)["mass"]; - M = pow( (*O815->paraQ)["mass"], 2 ) + 4; - *log << "SIM: Resetting fields." << endl << flush; - - for (int ix=0; ix -#include -#include - -#include "latlib/neigh.h" - -class sim : public o815::sim { -public: - struct siteconf { - complex phi; - }; - sim(o815 *_O815); - siteconf* conf; - unsigned int LSIZE2; - double M; - double m; - neigh *nb; - -private: - void _makeSweep(); - void _newParas(); - gsl_rng* rangsl; - void updatePhi (const int& x); -}; - - - -sim::sim(o815 *_O815) : o815::sim( _O815, - sizeof(siteconf)* - (_O815->comargs.lsize[0]*_O815->comargs.lsize[1]) ) { - conf = (siteconf*)confMem; - - rangsl = gsl_rng_alloc(gsl_rng_ranlxs0); - gsl_rng_set(rangsl, time(NULL)); - - LSIZE2 = _O815->comargs.lsize[0] * _O815->comargs.lsize[1]; - - nb = new neigh(2, _O815->comargs.lsize[0], _O815->comargs.lsize[1]); -} - -void sim::updatePhi (const int& x) -{ - const double r = gsl_rng_uniform(rangsl); - const double theta = gsl_rng_uniform(rangsl) * 2*M_PI; - complex V=0; - - for (int nu=0; nu<4; nu++) - V += conf[ (*nb)[x*4+nu] ].phi; - - conf[x].phi = sqrt(std::log( 1./(1-r) )) / sqrt(M) - * polar(1.0, theta) - + V / M; -} - -void sim::_makeSweep() { - for (int ichecker=0; ichecker<2; ichecker++) - for (int it=0; itcomargs.lsize[0]; it++) - for (int iy=(it+ichecker)%2; iycomargs.lsize[1]; iy+=2) - updatePhi( it*O815->comargs.lsize[1] + iy ); -} - -void sim::_newParas() { - m = (*O815->paraQ)["mass"]; - M = pow( (*O815->paraQ)["mass"], 2 ) + 4; - *log << "SIM: Resetting fields." << endl << flush; - - for (int ix=0; ix