summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaron Kent-Dobias <jaron@kent-dobias.com>2017-11-02 11:02:07 -0400
committerJaron Kent-Dobias <jaron@kent-dobias.com>2017-11-02 11:02:07 -0400
commit30534606d5690e176d168f640f55162fa15f0a19 (patch)
tree30a982262f062bd92a467b2b21b2142dbd90df97
parenta0db32c0ad05fbe2753d44b1e82f608d99bd9742 (diff)
downloadc++-30534606d5690e176d168f640f55162fa15f0a19.tar.gz
c++-30534606d5690e176d168f640f55162fa15f0a19.tar.bz2
c++-30534606d5690e176d168f640f55162fa15f0a19.zip
major changes (again) to the measurement of autocorrelation
-rw-r--r--lib/queue.c19
-rw-r--r--lib/queue.h7
-rw-r--r--lib/wolff.h2
-rw-r--r--lib/wolff_tools.c30
-rw-r--r--src/wolff.c19
5 files changed, 60 insertions, 17 deletions
diff --git a/lib/queue.c b/lib/queue.c
index aebbb2a..0823518 100644
--- a/lib/queue.c
+++ b/lib/queue.c
@@ -9,6 +9,14 @@ void stack_push(ll_t **q, uint32_t x) {
*q = nq;
}
+void stack_push_d(dll_t **q, double x) {
+ dll_t *nq = malloc(sizeof(dll_t));
+ nq->x = x;
+ nq->next = *q;
+
+ *q = nq;
+}
+
uint32_t stack_pop(ll_t **q) {
ll_t *old_q = *q;
@@ -20,6 +28,17 @@ uint32_t stack_pop(ll_t **q) {
return x;
}
+double stack_pop_d(dll_t **q) {
+ dll_t *old_q = *q;
+
+ *q = old_q->next;
+ double x = old_q->x;
+
+ free(old_q);
+
+ return x;
+}
+
bool stack_contains(const ll_t *q, uint32_t x) {
if (q == NULL) {
return false;
diff --git a/lib/queue.h b/lib/queue.h
index c7acec1..23834ba 100644
--- a/lib/queue.h
+++ b/lib/queue.h
@@ -11,8 +11,15 @@ typedef struct ll_tag {
struct ll_tag *next;
} ll_t;
+typedef struct dll_tag {
+ double x;
+ struct dll_tag *next;
+} dll_t;
+
void stack_push(ll_t **q, uint32_t x);
+void stack_push_d(dll_t **q, double x);
uint32_t stack_pop(ll_t **q);
+double stack_pop_d(dll_t **q);
bool stack_contains(const ll_t *q, uint32_t x);
diff --git a/lib/wolff.h b/lib/wolff.h
index cf24427..66ce493 100644
--- a/lib/wolff.h
+++ b/lib/wolff.h
@@ -54,7 +54,7 @@ typedef struct {
uint64_t n;
uint64_t W;
double *OO;
- double *Op;
+ dll_t *Op;
double O;
double O2;
} autocorr_t;
diff --git a/lib/wolff_tools.c b/lib/wolff_tools.c
index 92e8302..a417d4e 100644
--- a/lib/wolff_tools.c
+++ b/lib/wolff_tools.c
@@ -258,21 +258,31 @@ void update_autocorr(autocorr_t *OO, double O) {
OO->O = add_to_avg(OO->O, O, OO->n);
OO->O2 = add_to_avg(OO->O2, pow(O, 2), OO->n);
- uint64_t lim = OO->W;
-
- if (OO->n < OO->W) {
- lim = OO->n;
+ dll_t *Otmp = OO->Op;
+ dll_t *Osave;
+ uint64_t t = 0;
+
+ while (Otmp != NULL) {
+ OO->OO[t] = add_to_avg(OO->OO[t], O * (Otmp->x), OO->n - t - 1);
+ t++;
+ if (t == OO->W - 1) {
+ Osave = Otmp;
+ }
+ Otmp = Otmp->next;
}
- for (uint64_t t = 0; t < lim; t++) {
- OO->OO[t] = add_to_avg(OO->OO[t], O * OO->Op[t], OO->n - t - 1);
+ if (t == OO->W) {
+ if (OO->W == 1) {
+ free(OO->Op);
+ OO->Op = NULL;
+ } else {
+ free(Osave->next);
+ Osave->next = NULL;
+ }
}
- for (uint64_t t = 0; t < OO->W - 1; t++) {
- OO->Op[OO->W - 1 - t] = OO->Op[OO->W - 2 - t];
- }
+ stack_push_d(&(OO->Op), O);
- OO->Op[0] = O;
OO->n++;
}
diff --git a/src/wolff.c b/src/wolff.c
index 40a88e6..1e62c8c 100644
--- a/src/wolff.c
+++ b/src/wolff.c
@@ -8,13 +8,14 @@ int main(int argc, char *argv[]) {
lattice_t lat;
uint16_t L;
uint32_t min_runs, lattice_i, sim_i;
- uint64_t N, n, W;
+ uint64_t N, n, W, ac_skip;
double T, H, eps;
sim = WOLFF;
L = 128;
N = 100000000000000;
W = 10;
+ ac_skip = 1;
n = 3;
lat = SQUARE_LATTICE;
use_dual = false;
@@ -26,7 +27,7 @@ int main(int argc, char *argv[]) {
output_state = false;
min_runs = 10;
- while ((opt = getopt(argc, argv, "n:N:L:T:H:m:e:oq:DMas:W:")) != -1) {
+ while ((opt = getopt(argc, argv, "n:N:L:T:H:m:S:e:oq:DMas:W:")) != -1) {
switch (opt) {
case 'N':
N = (uint64_t)atof(optarg);
@@ -34,6 +35,9 @@ int main(int argc, char *argv[]) {
case 'W':
W = (uint64_t)atof(optarg);
break;
+ case 'S':
+ ac_skip = (uint64_t)atof(optarg);
+ break;
case 'n':
n = (uint64_t)atof(optarg);
break;
@@ -148,7 +152,6 @@ int main(int argc, char *argv[]) {
autocorr = (autocorr_t *)calloc(1, sizeof(autocorr_t));
autocorr->W = W;
autocorr->OO = (double *)calloc(W, sizeof(double));
- autocorr->Op = (double *)calloc(W, sizeof(double));
}
printf("\n");
@@ -167,7 +170,9 @@ int main(int argc, char *argv[]) {
n_steps++;
if (record_autocorrelation && n_runs > 0) {
- update_autocorr(autocorr, s->H);
+ if (n_steps % ac_skip == 0) {
+ update_autocorr(autocorr, s->H);
+ }
update_meas(clust, tmp_flips);
}
}
@@ -228,10 +233,12 @@ int main(int argc, char *argv[]) {
double dttau = sqrt(4.0 / autocorr->n * (pow(ttau, 2) * (W +(1+kappa)/(1-kappa)-0.5) + kappa * X / pow(1-kappa, 2) + pow(kappa, 2) * Y / pow(1-kappa, 4)));
free(autocorr->OO);
- free(autocorr->Op);
+ while (autocorr->Op != NULL) {
+ stack_pop_d(&(autocorr->Op));
+ }
free(autocorr);
- tau = ttau * clust->x / h->nv;
+ tau = ttau * ac_skip * clust->x / h->nv;
dtau = tau * sqrt(pow(dttau / ttau, 2) + pow(clust->dx / clust->x, 2));
}