From 7038df605cc036b36c85c027baeac726e17392de Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Wed, 15 Jan 2020 19:18:17 +0100 Subject: [PATCH] field:: quick distance computations in 3D --- cell.cpp | 2 +- fieldpattern.cpp | 33 ++++++++++++++++++++++++++------- pattern2.cpp | 3 ++- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/cell.cpp b/cell.cpp index 5ee179a4..a76ff566 100644 --- a/cell.cpp +++ b/cell.cpp @@ -983,7 +983,7 @@ EX int celldistance(cell *c1, cell *c2) { if(hybri) return hybrid::celldistance(c1, c2); #if CAP_FIELD - if(geometry == gFieldQuotient && !GOLDBERG && WDIM == 2) + if(geometry == gFieldQuotient && !GOLDBERG) return currfp.getdist(fieldpattern::fieldval(c1), fieldpattern::fieldval(c2)); #endif diff --git a/fieldpattern.cpp b/fieldpattern.cpp index 783335cb..80be1d1e 100644 --- a/fieldpattern.cpp +++ b/fieldpattern.cpp @@ -59,8 +59,12 @@ struct matrix : array, MAXMDIM> { }; #endif +EX int groupspin(int id, int d, int group) { + return group*(id/group) + (id + d) % group; + } + EX int btspin(int id, int d) { - return S7*(id/S7) + (id + d) % S7; + return groupspin(id, d, S7); } #if HDR @@ -688,7 +692,7 @@ int fpattern::getdist(pair a, pair b) { } int fpattern::dijkstra(vector& dists, vector indist[MAXDIST]) { - int N = connections.size(); + int N = isize(matrices); dists.resize(N); for(int i=0; i& dists, vector indist[MAXDIST]) { if(dists[at] <= i) continue; maxd = i; dists[at] = i; - for(int q=0; q& dists, vector indist[MAXDIST]) { void fpattern::analyze() { - if(WDIM == 3) return; - + if(MWDIM == 4) { + /* we need to compute inverses */ + int N = isize(matrices); + inverses.resize(N); + for(int i=0; i fieldval(cell *c) { - if(ctof(c)) return make_pair(int(c->master->fieldval), false); + if(WDIM == 3) return make_pair(int(c->master->fieldval) * currfp.local_group, false); + else if(ctof(c)) return make_pair(int(c->master->fieldval), false); else return make_pair(btspin(c->master->fieldval, c->c.spin(0)), true); }