Skip to content

Commit 68e4df6

Browse files
authored
Merge pull request #517 from llaniewski/feature/autosym
Introducing `autosym2`
2 parents ac87c5f + f4c66ff commit 68e4df6

File tree

4 files changed

+102
-21
lines changed

4 files changed

+102
-21
lines changed

src/LatticeAccess.inc.cpp.Rt

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
#define real_to_storage_shift(x__,y__) real_to_storage(x__)
3535
#endif
3636

37+
#ifndef NODE_SYMZ
38+
#define NODE_SYMZ 0
39+
#endif
40+
3741
/// Get only type of node
3842
CudaDeviceFunction flag_t LatticeContainer::getType(int x, int y, int z) const
3943
{
@@ -417,21 +421,23 @@ public:
417421

418422
si = which(Fields$name == fn)
419423
sf = rows(Fields)[[si]]
420-
sd = d
421-
sd[i] = sd[i]*(-1)
424+
sd_plus = d
425+
sd_plus[i] = autosym_shift-sd_plus[i]
426+
sd_minus = d
427+
sd_minus[i] = -autosym_shift-sd_minus[i]
422428
?>
423429
template < class PARENT >
424430
template <class dx_t, class dy_t, class dz_t>
425431
CudaDeviceFunction real_t SymmetryAccess< PARENT >::<?%s paste0(this_fun, f$nicename) ?> (const dx_t & dx, const dy_t & dy, const dz_t & dz) const
426432
{
427433
<?R if (paste0("SYM",ch[i]) %in% NodeTypes$group) { ?>
428434
if (<?R C(d[i]) ?> > range_int<0>()) {
429-
if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_Symmetry<?%s ch[i] ?>_plus) {
430-
return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd,sep=", ") ?>);
435+
if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_<?%s autosym_name ?><?%s ch[i] ?>_plus) {
436+
return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd_plus,sep=", ",float=FALSE,wrap.const=range_int) ?>);
431437
}
432438
} else if (<?R C(d[i]) ?> < range_int<0>()) {
433-
if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_Symmetry<?%s ch[i] ?>_minus) {
434-
return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd,sep=", ") ?>);
439+
if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_<?%s autosym_name ?><?%s ch[i] ?>_minus) {
440+
return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd_minus,sep=", ",float=FALSE,wrap.const=range_int) ?>);
435441
}
436442
}
437443
<?R } ?>
@@ -444,9 +450,27 @@ CudaDeviceFunction real_t SymmetryAccess< PARENT >::<?%s paste0(this_fun, f$nice
444450
template < class PARENT >
445451
template <class N>
446452
CudaDeviceFunction void SymmetryAccess< PARENT >::pop<?%s s$suffix ?>(N & node) const
447-
{
448-
parent::pop<?%s s$suffix ?>(node);
449-
<?R resolve.symmetries(Density[s$load.densities,,drop=FALSE]) ?>
453+
{ <?R
454+
if (Options$autosym == 0) { ?>
455+
parent::pop<?%s s$suffix ?>(node); <?R
456+
} else if (Options$autosym == 1) { ?>
457+
parent::pop<?%s s$suffix ?>(node); <?R
458+
resolve.symmetries(Density[s$load.densities,,drop=FALSE])
459+
} else if (Options$autosym == 2) { ?>
460+
if (this->getNodeType() & (NODE_SYMX | NODE_SYMY | NODE_SYMZ)) { <?R
461+
dens = Density;
462+
dens$load = s$load.densities;
463+
for (d in rows(dens)) if (d$load) {
464+
f = rows(Fields)[[match(d$field, Fields$name)]]
465+
dp = c(-d$dx, -d$dy, -d$dz) ?>
466+
<?%s paste("node",d$name,sep=".") ?> = load_<?%s f$nicename ?>(range_int< <?%d dp[1] ?> >(),range_int< <?%d dp[2] ?> >(),range_int< <?%d dp[3] ?> >()); <?R
467+
} else if (!is.na(d$default)) { ?>
468+
<?%s paste("node",d$name,sep=".") ?> = <?%f d$default ?>; <?R
469+
} ?>
470+
} else {
471+
parent::pop<?%s s$suffix ?>(node);
472+
} <?R
473+
} else stop("Unknown autosym option") ?>
450474
}
451475
<?R } } ?>
452476

src/conf.R

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ if (! SYMALGEBRA) {
3333
library(symAlgebra,quietly=TRUE,warn.conflicts=FALSE)
3434
}
3535

36-
if (is.null(Options$autosym)) Options$autosym = FALSE
36+
if (is.null(Options$autosym)) Options$autosym = 0
3737

3838
#source("linemark.R")
3939

@@ -370,7 +370,7 @@ if (is.null(Description)) {
370370
}
371371

372372

373-
if (Options$autosym) { ## Automatic symmetries
373+
if (Options$autosym > 0) { ## Automatic symmetries
374374
symmetries = data.frame(symX=c(-1,1,1),symY=c(1,-1,1),symZ=c(1,1,-1))
375375

376376
for (g in unique(DensityAll$group)) {
@@ -399,15 +399,60 @@ if (Options$autosym) { ## Automatic symmetries
399399
Fields[sel,s] = Fields$name[sel]
400400
}
401401

402-
AddNodeType("SymmetryX_plus", group="SYMX")
403-
AddNodeType("SymmetryX_minus", group="SYMX")
404-
AddNodeType("SymmetryY_plus", group="SYMY")
405-
AddNodeType("SymmetryY_minus", group="SYMY")
402+
rownames(Fields) = Fields$name
403+
404+
if (Options$autosym == 1) {
405+
autosym_shift = 0
406+
autosym_name = "Symmetry"
407+
} else if (Options$autosym == 2) {
408+
autosym_shift = 1
409+
autosym_name = "SymmetryEdge"
410+
} else stop("unknown autosym value")
411+
412+
directions = lapply(rows(Fields), function(f) expand.grid(dx=f$minx:f$maxx,dy=f$miny:f$maxy,dz=f$minz:f$maxz))
413+
names(directions) = Fields$name
414+
dir.sort = function(d) {
415+
d = unique(d)
416+
d[order(d[,3],d[,2],d[,1]),]
417+
}
418+
directions = lapply(directions,dir.sort)
419+
tmp = NULL
420+
while (!identical(directions, tmp)) {
421+
tmp = directions
422+
for (f in rows(Fields)) {
423+
d = directions[[f$name]]
424+
for (i in 1:3) {
425+
nfn = f[[names(symmetries)[i]]]
426+
od = directions[[nfn]]
427+
cr = od
428+
nd = d[d[,i] < 0,, drop=FALSE]
429+
nd[,i] = -nd[,i] - autosym_shift
430+
cr = rbind(cr,nd)
431+
nd = d[d[,i] > 0,, drop=FALSE]
432+
nd[,i] = -nd[,i] + autosym_shift
433+
cr = rbind(cr,nd)
434+
directions[[nfn]] = cr
435+
}
436+
}
437+
directions = lapply(directions,dir.sort)
438+
}
439+
Fields$minx = sapply(directions, function(x) min(x$dx))
440+
Fields$maxx = sapply(directions, function(x) max(x$dx))
441+
Fields$miny = sapply(directions, function(x) min(x$dy))
442+
Fields$maxy = sapply(directions, function(x) max(x$dy))
443+
Fields$minz = sapply(directions, function(x) min(x$dz))
444+
Fields$maxz = sapply(directions, function(x) max(x$dz))
445+
446+
447+
AddNodeType(paste0(autosym_name, "X_plus"), group="SYMX")
448+
AddNodeType(paste0(autosym_name, "X_minus"), group="SYMX")
449+
AddNodeType(paste0(autosym_name, "Y_plus"), group="SYMY")
450+
AddNodeType(paste0(autosym_name, "Y_minus"), group="SYMY")
406451
if (all(range(Fields$minz,Fields$maxz) == c(0,0))) {
407452
# we're in 2D
408453
} else {
409-
AddNodeType("SymmetryZ_plus", group="SYMZ")
410-
AddNodeType("SymmetryZ_minus", group="SYMZ")
454+
AddNodeType(paste0(autosym_name, "Z_plus"), group="SYMZ")
455+
AddNodeType(paste0(autosym_name, "Z_minus"), group="SYMZ")
411456
}
412457
}
413458

src/makefile.main.Rt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ for (d in destinations) {
154154
paste0(" ",
155155
names(opts),
156156
" = ",
157-
ifelse(opts==0,"FALSE","TRUE"),
157+
opts,
158158
ifelse(seq_along(opts) != length(opts),",","")
159159
)
160160
)

src/models.R

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,23 @@ get.models = function() {
4747
opts_terms = terms(opts)
4848
opts = attr(opts_terms,"factors")
4949
opts = data.frame(t(opts))
50-
rownames(opts) = paste(name,gsub(":","_",rownames(opts)),sep="_")
50+
opts[] = opts > 0
5151
if (attr(opts_terms, "intercept") == 1) {
52-
opts[name,]=0
52+
opts = rbind(opts, FALSE)
5353
}
54-
# opts = apply(opts, 2, function(x) x > 0)
54+
if ("autosym" %in% names(opts)) {
55+
opts$autosym = ifelse(opts$autosym, 1, 0)
56+
x = opts[opts$autosym > 0,,drop=FALSE]
57+
x$autosym = 2
58+
opts = rbind(opts, x)
59+
}
60+
rownames(opts) = sapply(seq_len(nrow(opts)), function(i) {
61+
x = opts[i,]
62+
w = names(opts)
63+
w = paste0(w, ifelse(x>1,x,""))
64+
w = c(name, w[x>0])
65+
paste(w,collapse="_")
66+
})
5567
} else {
5668
opts = data.frame(row.names=name)
5769
}

0 commit comments

Comments
 (0)