15
15
#include "CartLatticeContainer.h"
16
16
#include "StorageConversions.h"
17
17
18
+ #ifndef NODE_SYMZ
19
+ #define NODE_SYMZ 0
20
+ #endif
21
+
18
22
/// Push all densities
19
23
20
24
<?R
@@ -398,21 +402,23 @@ public:
398
402
399
403
si = which(Fields$name == fn)
400
404
sf = rows(Fields)[[si]]
401
- sd = d
402
- sd[i] = sd[i]*(-1)
405
+ sd_plus = d
406
+ sd_plus[i] = autosym_shift-sd_plus[i]
407
+ sd_minus = d
408
+ sd_minus[i] = -autosym_shift-sd_minus[i]
403
409
?>
404
410
template < class PARENT >
405
411
template <class dx_t, class dy_t, class dz_t>
406
412
CudaDeviceFunction real_t SymmetryAccess< PARENT >::<?%s paste0(this_fun, f$nicename) ?> (const dx_t & dx, const dy_t & dy, const dz_t & dz) const
407
413
{
408
414
<?R if (paste0("SYM",ch[i]) %in% NodeTypes$group) { ?>
409
415
if (<?R C(d[i]) ?> > range_int<0>()) {
410
- if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_Symmetry <?%s ch[i] ?>_plus) {
411
- return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd ,sep=", ") ?>);
416
+ if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_<?%s autosym_name ?> <?%s ch[i] ?>_plus) {
417
+ return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd_plus ,sep=", ",float=FALSE,wrap.const=range_int ) ?>);
412
418
}
413
419
} else if (<?R C(d[i]) ?> < range_int<0>()) {
414
- if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_Symmetry <?%s ch[i] ?>_minus) {
415
- return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd ,sep=", ") ?>);
420
+ if ((this->getNodeType() & NODE_SYM<?%s ch[i] ?>) == NODE_<?%s autosym_name ?> <?%s ch[i] ?>_minus) {
421
+ return <?%s paste0(sig, next_fun, sf$nicename) ?>(<?R C(sd_minus ,sep=", ",float=FALSE,wrap.const=range_int ) ?>);
416
422
}
417
423
}
418
424
<?R } ?>
@@ -425,9 +431,27 @@ CudaDeviceFunction real_t SymmetryAccess< PARENT >::<?%s paste0(this_fun, f$nice
425
431
template < class PARENT >
426
432
template <class N>
427
433
CudaDeviceFunction void SymmetryAccess< PARENT >::pop<?%s s$suffix ?>(N & node) const
428
- {
429
- parent::pop<?%s s$suffix ?>(node);
430
- <?R resolve.symmetries(Density[s$load.densities,,drop=FALSE]) ?>
434
+ { <?R
435
+ if (Options$autosym == 0) { ?>
436
+ parent::pop<?%s s$suffix ?>(node); <?R
437
+ } else if (Options$autosym == 1) { ?>
438
+ parent::pop<?%s s$suffix ?>(node); <?R
439
+ resolve.symmetries(Density[s$load.densities,,drop=FALSE])
440
+ } else if (Options$autosym == 2) { ?>
441
+ if (this->getNodeType() & (NODE_SYMX | NODE_SYMY | NODE_SYMZ)) { <?R
442
+ dens = Density;
443
+ dens$load = s$load.densities;
444
+ for (d in rows(dens)) if (d$load) {
445
+ f = rows(Fields)[[match(d$field, Fields$name)]]
446
+ dp = c(-d$dx, -d$dy, -d$dz) ?>
447
+ <?%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
448
+ } else if (!is.na(d$default)) { ?>
449
+ <?%s paste("node",d$name,sep=".") ?> = <?%f d$default ?>; <?R
450
+ } ?>
451
+ } else {
452
+ parent::pop<?%s s$suffix ?>(node);
453
+ } <?R
454
+ } else stop("Unknown autosym option") ?>
431
455
}
432
456
<?R } } ?>
433
457
0 commit comments