18 #ifndef OHMMS_FAST_PARTICLE_OPERATORS_H 19 #define OHMMS_FAST_PARTICLE_OPERATORS_H 30 template<
class T1,
class T2,
unsigned D>
44 T x00 = X[0], x01 = X[1], x02 = X[2], x10 = X[3], x11 = X[4], x12 = X[5], x20 = X[6], x21 = X[7], x22 = X[8];
46 for (
int i = first; i < last; i++)
48 pout[i][0] = pin[i][0] * x00 + pin[i][1] * x10 + pin[i][2] * x20;
49 pout[i][1] = pin[i][0] * x01 + pin[i][1] * x11 + pin[i][2] * x21;
50 pout[i][2] = pin[i][0] * x02 + pin[i][1] * x12 + pin[i][2] * x22;
56 T x00 = X[0], x01 = X[1], x02 = X[2], x10 = X[3], x11 = X[4], x12 = X[5], x20 = X[6], x21 = X[7], x22 = X[8];
58 for (
int i = first; i < last; i++)
60 pout[i][0] = pin[i][0] * x00 + pin[i][1] * x01 + pin[i][2] * x02;
61 pout[i][1] = pin[i][0] * x10 + pin[i][1] * x11 + pin[i][2] * x12;
62 pout[i][2] = pin[i][0] * x20 + pin[i][1] * x21 + pin[i][2] * x22;
68 T x00 = X[0], x01 = X[1], x02 = X[2], x10 = X[3], x11 = X[4], x12 = X[5], x20 = X[6], x21 = X[7], x22 = X[8];
70 for (
int i = first; i < last; i++)
72 T _x(pinout[i][0]), _y(pinout[i][1]), _z(pinout[i][2]);
73 pinout[i][0] = _x * x00 + _y * x10 + _z * x20;
74 pinout[i][1] = _x * x01 + _y * x11 + _z * x21;
75 pinout[i][2] = _x * x02 + _y * x12 + _z * x22;
81 T x00 = X[0], x01 = X[1], x02 = X[2], x10 = X[3], x11 = X[4], x12 = X[5], x20 = X[6], x21 = X[7], x22 = X[8];
83 for (
int i = first; i < last; i++)
85 T _x(pinout[i][0]), _y(pinout[i][1]), _z(pinout[i][2]);
86 pinout[i][0] = _x * x00 + _y * x01 + _z * x02;
87 pinout[i][1] = _x * x10 + _y * x11 + _z * x12;
88 pinout[i][2] = _x * x20 + _y * x21 + _z * x22;
104 T x00 = X[0], x01 = X[1], x10 = X[2], x11 = X[3];
106 for (
int i = first; i < last; i++)
108 pout[i][0] = pin[i][0] * x00 + pin[i][1] * x10;
109 pout[i][1] = pin[i][0] * x01 + pin[i][1] * x11;
115 T x00 = X[0], x01 = X[1], x10 = X[2], x11 = X[3];
117 for (
int i = first; i < last; i++)
119 pout[i][0] = pin[i][0] * x00 + pin[i][1] * x01;
120 pout[i][1] = pin[i][0] * x10 + pin[i][1] * x11;
126 T x00 = X[0], x01 = X[1], x10 = X[2], x11 = X[3];
128 for (
int i = first; i < last; i++)
130 T _x(pinout[i][0]), _y(pinout[i][1]);
131 pinout[i][0] = _x * x00 + _y * x10;
132 pinout[i][1] = _x * x01 + _y * x11;
138 T x00 = X[0], x01 = X[1], x10 = X[2], x11 = X[3];
140 for (
int i = first; i < last; i++)
142 T _x(pinout[i][0]), _y(pinout[i][1]);
143 pinout[i][0] = _x * x00 + _y * x01;
144 pinout[i][1] = _x * x10 + _y * x11;
149 #define SUPERCELL_BOUNDARY_LIMITS(T) \ 150 const T epsilon = -std::numeric_limits<T>::epsilon(); \ 151 const T plus_one = 1.0 154 #define THREE_DIM_BOUNDARY_BLOCK(X, Y, Z, EPS, PLUSONE) \ 157 else if (X >= PLUSONE) \ 161 else if (Y >= PLUSONE) \ 165 else if (Z >= PLUSONE) \ 168 #define TWO_DIM_BOUNDARY_BLOCK(X, Y, EPS, PLUSONE) \ 171 else if (X >= PLUSONE) \ 175 else if (Y >= PLUSONE) \ 180 template<
class T1,
class T2,
unsigned D>
199 T g00 = G[0], g01 = G[1], g02 = G[2], g10 = G[3], g11 = G[4], g12 = G[5], g20 = G[6], g21 = G[7], g22 = G[8];
200 T r00 = R[0], r01 = R[1], r02 = R[2], r10 = R[3], r11 = R[4], r12 = R[5], r20 = R[6], r21 = R[7], r22 = R[8];
202 for (
int i = first; i < last; i++)
204 T x(pin[i][0] * g00 + pin[i][1] * g10 + pin[i][2] * g20);
205 T y(pin[i][0] * g01 + pin[i][1] * g11 + pin[i][2] * g21);
206 T z(pin[i][0] * g02 + pin[i][1] * g12 + pin[i][2] * g22);
208 pout[i][0] = x * r00 + y * r10 + z * r20;
209 pout[i][1] = x * r01 + y * r11 + z * r21;
210 pout[i][2] = x * r02 + y * r12 + z * r22;
217 T g00 = G[0], g01 = G[1], g02 = G[2], g10 = G[3], g11 = G[4], g12 = G[5], g20 = G[6], g21 = G[7], g22 = G[8];
219 for (
int i = first; i < last; i++)
221 T x(pin[i][0] * g00 + pin[i][1] * g10 + pin[i][2] * g20);
222 T y(pin[i][0] * g01 + pin[i][1] * g11 + pin[i][2] * g21);
223 T z(pin[i][0] * g02 + pin[i][1] * g12 + pin[i][2] * g22);
234 T r00 = R[0], r01 = R[1], r02 = R[2], r10 = R[3], r11 = R[4], r12 = R[5], r20 = R[6], r21 = R[7], r22 = R[8];
236 for (
int i = first; i < last; i++)
238 T x(pin[i][0]), y(pin[i][1]), z(pin[i][2]);
240 pout[i][0] = x * r00 + y * r10 + z * r20;
241 pout[i][1] = x * r01 + y * r11 + z * r21;
242 pout[i][2] = x * r02 + y * r12 + z * r22;
250 for (
int i = first; i < last; i++)
252 T x(pin[i][0]), y(pin[i][1]), z(pin[i][2]);
264 for (
int i = first; i < last; i++)
266 T x(pinout[i][0]), y(pinout[i][1]), z(pinout[i][2]);
277 T g00 = G[0], g01 = G[1], g02 = G[2], g10 = G[3], g11 = G[4], g12 = G[5], g20 = G[6], g21 = G[7], g22 = G[8];
278 T r00 = R[0], r01 = R[1], r02 = R[2], r10 = R[3], r11 = R[4], r12 = R[5], r20 = R[6], r21 = R[7], r22 = R[8];
280 for (
int i = first; i < last; i++)
282 T x(pinout[i][0] * g00 + pinout[i][1] * g10 + pinout[i][2] * g20);
283 T y(pinout[i][0] * g01 + pinout[i][1] * g11 + pinout[i][2] * g21);
284 T z(pinout[i][0] * g02 + pinout[i][1] * g12 + pinout[i][2] * g22);
286 pinout[i][0] = x * r00 + y * r10 + z * r20;
287 pinout[i][1] = x * r01 + y * r11 + z * r21;
288 pinout[i][2] = x * r02 + y * r12 + z * r22;
295 T x(pos[0]), y(pos[1]), z(pos[2]);
303 T x(pos[0] * G[0] + pos[1] * G[3] + pos[2] * G[6]), y(pos[0] * G[1] + pos[1] * G[4] + pos[2] * G[7]),
304 z(pos[0] * G[2] + pos[1] * G[5] + pos[2] * G[8]);
312 T x(pos[0]), y(pos[1]), z(pos[2]);
314 return Component_t(x * R[0] + y * R[3] + z * R[6], x * R[1] + y * R[4] + z * R[7], x * R[2] + y * R[5] + z * R[8]);
320 T x(pos[0] * G[0] + pos[1] * G[3] + pos[2] * G[6]), y(pos[0] * G[1] + pos[1] * G[4] + pos[2] * G[7]),
321 z(pos[0] * G[2] + pos[1] * G[5] + pos[2] * G[8]);
323 return Component_t(x * R[0] + y * R[3] + z * R[6], x * R[1] + y * R[4] + z * R[7], x * R[2] + y * R[5] + z * R[8]);
331 template<
typename T,
unsigned D>
339 template<
typename T,
unsigned D>
static Component_t Unit2Unit(const Component_t &pos)
static void apply(const Transformer_t &X, const Array_t &pin, Array_t &pout, int first, int last)
helper functions for EinsplineSetBuilder
Dummy template class to be specialized.
static void Unit2Unit(Array_t &pinout, int first, int last)
static void Cart2Cart(const Array_t &pin, const Transformer_t &G, const Transformer_t &R, Array_t &pout, int first, int last)
static void apply(Array_t &pinout, const Transformer_t &X, int first, int last)
Dummy template class to apply boundary conditions.
static void apply(Array_t &pinout, const Transformer_t &X, int first, int last)
static void Cart2Unit(const Array_t &pin, const Transformer_t &G, Array_t &pout, int first, int last)
static void apply(const Transformer_t &X, Array_t &pinout, int first, int last)
Attaches a unit to a Vector for IO.
#define SUPERCELL_BOUNDARY_LIMITS(T)
typename Array_t::Type_t Component_t
Tensor<T,D> class for D by D tensor.
static Component_t Unit2Cart(const Component_t &pos, const Transformer_t &R)
#define THREE_DIM_BOUNDARY_BLOCK(X, Y, Z, EPS, PLUSONE)
static void apply(const Transformer_t &X, Array_t &pinout, int first, int last)
static void Unit2Unit(const Array_t &pin, Array_t &pout, int first, int last)
static Component_t Cart2Unit(const Component_t &pos, const Transformer_t &G)
void put2box(ParticleAttrib< TinyVector< T, D >> &inout)
inout[i]=inout[i]-floor(inout[i])
static void apply(const Array_t &pin, const Transformer_t &X, Array_t &pout, int first, int last)
void remainder(const T *restrict in, T *restrict out, SIZET n)
mod on an array out[i]=in[i]-floor(in[i])
static void Unit2Cart(const Array_t &pin, const Transformer_t &R, Array_t &pout, int first, int last)
static void apply(const Array_t &pin, const Transformer_t &X, Array_t &pout, int first, int last)
static Component_t Cart2Cart(const Component_t &pos, const Transformer_t &G, const Transformer_t &R)
static void Cart2Cart(Array_t &pinout, const Transformer_t &G, const Transformer_t &R, int first, int last)
static void apply(const Transformer_t &X, const Array_t &pin, Array_t &pout, int first, int last)