From 90ae915b5a7961a36e6a33509b16229244c6615a Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Sun, 1 Jul 2018 00:52:31 -0400 Subject: fixed both the system for determining bond energy and how global state is tracked --- lib/cluster.c | 91 ----------------------------------------------------------- 1 file changed, 91 deletions(-) (limited to 'lib/cluster.c') diff --git a/lib/cluster.c b/lib/cluster.c index 7274eb9..96225a2 100644 --- a/lib/cluster.c +++ b/lib/cluster.c @@ -1,97 +1,6 @@ #include "cluster.h" -v_t flip_cluster(ising_state_t *s, v_t v0, q_t rot, gsl_rng *r) { - v_t nv = 0; - - ll_t *stack = NULL; // create a new stack - stack_push(&stack, v0); // push the initial vertex to the stack - - bool *marks = (bool *)calloc(s->g->nv, sizeof(bool)); - - while (stack != NULL) { - v_t v = stack_pop(&stack); - - if (!marks[v]) { - q_t s_old, s_new; - dihedral_t *R_new; - bool external_flipped; - - marks[v] = true; - - if (v == s->g->nv - 1) { - R_new = dihedral_compose(s->q, rot, s->R); - external_flipped = true; - } else { - s_old = s->spins[v]; - s_new = dihedral_act(s->q, rot, s_old); - external_flipped = false; - } - - v_t nn = s->g->v_i[v + 1] - s->g->v_i[v]; - - for (v_t i = 0; i < nn; i++) { - q_t sn; - double prob; - bool external_neighbor = false; - - v_t vn = s->g->v_adj[s->g->v_i[v] + i]; - - if (vn == s->g->nv - 1) { - external_neighbor = true; - } else { - sn = s->spins[vn]; - } - - if (external_flipped || external_neighbor) { - q_t rot_s_old, rot_s_new; - - if (external_neighbor) { - rot_s_old = dihedral_inverse_act(s->q, s->R, s_old); - rot_s_new = dihedral_inverse_act(s->q, s->R, s_new); - } else { - rot_s_old = dihedral_inverse_act(s->q, s->R, sn); - rot_s_new = dihedral_inverse_act(s->q, R_new, sn); - } - - prob = s->H_probs[rot_s_new * s->q + rot_s_old]; - - s->M[rot_s_old]--; - s->M[rot_s_new]++; - - s->E += - s->H[rot_s_new] + s->H[rot_s_old]; - } else { - q_t diff_old = (s_old + s->q - sn) % s->q; - q_t diff_new = (s_new + s->q - sn) % s->q; - - prob = s->J_probs[diff_new * s->q + diff_old]; - - s->E += - s->J[diff_new] + s->J[diff_old]; - } - - if (gsl_rng_uniform(r) < prob) { // and with probability ps[e]... - stack_push(&stack, vn); // push the neighboring vertex to the stack - } - } - - if (external_flipped) { - free(s->R); - s->R = R_new; - } else { - s->spins[v] = s_new; - } - - if (v != s->g->nv - 1) { // count the number of non-external sites that flip - nv++; - } - } - } - - free(marks); - - return nv; -} - v_t flip_cluster_dgm(dgm_state_t *s, v_t v0, h_t rot, gsl_rng *r) { v_t nv = 0; -- cgit v1.2.3-70-g09d2