summaryrefslogtreecommitdiff
path: root/soft_spheres.cpp
blob: e438362fb29453dce65519b8cac32e233ce2ec36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "animation.hpp"

template <int D, int n> class SoftSphere : public Sphere<D> {
private:
  const double c0 = -pow(2, 2*n-3) * pow(5, -n) * (8 + 6*n + pow(n, 2));
  const double c2 =  pow(2, 2+2*n) * pow(5, -n-2) * n * (4+n);
  const double c4 = -pow(2, 5+2*n) * pow(5, -n-4) * n * (2+n);
public:
  using Sphere<D>::Sphere;

  double U(const Position<D>& y, double ry) const {
    double r2 = Sphere<D>::regularizedDistanceSquared(y, ry);
    if (r2 < pow(1.25, 2)) {
      return pow(1 / r2, n / 2) + c0 + c2 * r2 + c4 * pow(r2, 2);
    } else {
      return 0;
    }
  }
};

int main(int argc, char* argv[]) {
  const unsigned n = 24;

  unsigned N = 1000;
  double R = 0.025;
  double ε = 0.005;
  unsigned steps = 1e3;
  double β = 0.5;

  initializeAnimation(argc, argv);

  Rng r;

  Model<2, SoftSphere<2, n>> m(N, 2 * R * 1.25, gContinuousPolydisperse(R), r);

  for (unsigned i = 0; i < steps; i++) {
    for (unsigned j = 0; j < N; j++) {
      m.randomMove(β, ε, r);
      m.randomSwap(β, r);
    }

//    std::cout << m.randomClusterSwap(β, r) << std::endl;

    if (i % 3 == 0)
      draw(m);
  }

  for (unsigned i = 0; i < 10 * steps; i++) {
    for (unsigned j = 0; j < N; j++) {
      m.randomMove(β, ε, r);
    }

    unsigned k = m.randomCluster(β, r);

    if (k > 2 && k < N - 2) {
      draw(m);
      getchar();
    }

    for (SoftSphere<2, n>& p : m.particles) {
      p.m = false;
    }

    if (i % 3 == 0)
      draw(m);
  }

  return 0;
}