]> git.treefish.org Git - phys/heatbath.git/blobdiff - sim-1mr.hpp
Added 1mr+ algorithm.
[phys/heatbath.git] / sim-1mr.hpp
index aa305ff71abcaaec1e0e1a7f976e671ffe13d74d..beadd7d55bdcc626f735110277899a05c6d15761 100644 (file)
@@ -15,15 +15,14 @@ public:
   sim(o815 *_O815);
   siteconf* conf;
   unsigned int LSIZE2;
+  double M;
+  double m;
+  neigh *nb;
 
 private:
   void _makeSweep();
   void _newParas();
-
   gsl_rng* rangsl;
-
-  neigh *nb;
-
   void updatePhi (const int& x);
 };
 
@@ -44,15 +43,35 @@ sim::sim(o815 *_O815) : o815::sim( _O815,
 
 void sim::updatePhi (const int& x) 
 {
-  const double r = gsl_rng_uniform(rangsl);
   const double theta = gsl_rng_uniform(rangsl) * 2*M_PI;
+  complex<double> 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)
+    * complex<double>( cos(theta), sin(theta) )
+    + V / M;
 }
 
 void sim::_makeSweep() {  
+  for (int ichecker=0; ichecker<2; ichecker++)
+    for (int it=0; it<O815->comargs.lsize[0]; it++)
+      for (int iy=(it+ichecker)%2; iy<O815->comargs.lsize[1]; iy+=2)
+       updatePhi( it*O815->comargs.lsize[1] + iy );
 }
 
 void sim::_newParas() {
-  /* reset variables */
+  m = (*O815->paraQ)["mass"];
+  M = pow( (*O815->paraQ)["mass"], 2 ) + 4;
+  *log << "SIM: Resetting fields." << endl << flush;
+
+  for (int ix=0; ix<LSIZE2; ix++)
+    conf[ix].phi = 1;
 }
 
 #endif