QMCPACK
TinyVectorTensorOps.h
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
8 //
9 // File created by: Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 
13 #ifndef OHMMS_TINYVECTORTENSOR_OPERATORS_H
14 #define OHMMS_TINYVECTORTENSOR_OPERATORS_H
15 
16 namespace qmcplusplus
17 {
18 //////////////////////////////////////////////////////////////////////
19 // Definition of the struct OTDot.
20 // template<class T1, class T2> struct OTDot {};
21 //////////////////////////////////////////////////////////////////////
22 
23 //////////////////////////////////////////////////////////////////////
24 //
25 // Specializations for Tensor dot TinyVector
26 //
27 //////////////////////////////////////////////////////////////////////
28 
29 template<class T1, class T2, unsigned D>
30 struct OTDot<Tensor<T1, D>, TinyVector<T2, D>>
31 {
33  inline static TinyVector<Type_t, D> apply(const Tensor<T1, D>& lhs, const TinyVector<T2, D>& rhs)
34  {
36  for (unsigned int i = 0; i < D; ++i)
37  {
38  Type_t sum = lhs(i, 0) * rhs[0];
39  for (unsigned int j = 1; j < D; ++j)
40  sum += lhs(i, j) * rhs[j];
41  ret[i] = sum;
42  }
43  return ret;
44  }
45 };
46 
47 
48 template<class T1, class T2>
49 struct OTDot<Tensor<T1, 1>, TinyVector<T2, 1>>
50 {
52  inline static TinyVector<Type_t, 1> apply(const Tensor<T1, 1>& lhs, const TinyVector<T2, 1>& rhs)
53  {
54  return TinyVector<Type_t, 1>(lhs[0] * rhs[0]);
55  }
56 };
57 
58 template<class T1, class T2>
59 struct OTDot<Tensor<T1, 2>, TinyVector<T2, 2>>
60 {
62  inline static TinyVector<Type_t, 2> apply(const Tensor<T1, 2>& lhs, const TinyVector<T2, 2>& rhs)
63  {
64  return TinyVector<Type_t, 2>(lhs[0] * rhs[0] + lhs[1] * rhs[1], lhs[2] * rhs[0] + lhs[3] * rhs[1]);
65  }
66 };
67 
68 template<class T1, class T2>
69 struct OTDot<Tensor<T1, 3>, TinyVector<T2, 3>>
70 {
72  inline static TinyVector<Type_t, 3> apply(const Tensor<T1, 3>& lhs, const TinyVector<T2, 3>& rhs)
73  {
74  return TinyVector<Type_t, 3>(lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2],
75  lhs[3] * rhs[0] + lhs[4] * rhs[1] + lhs[5] * rhs[2],
76  lhs[6] * rhs[0] + lhs[7] * rhs[1] + lhs[8] * rhs[2]);
77  }
78 };
79 
80 template<class T1, class T2>
81 struct OTDot<Tensor<T1, 4>, TinyVector<T2, 4>>
82 {
84  inline static TinyVector<Type_t, 4> apply(const Tensor<T1, 4>& lhs, const TinyVector<T2, 4>& rhs)
85  {
86  return TinyVector<Type_t, 4>(lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2] + lhs[3] * rhs[3],
87  lhs[4] * rhs[0] + lhs[5] * rhs[1] + lhs[6] * rhs[2] + lhs[7] * rhs[3],
88  lhs[8] * rhs[0] + lhs[9] * rhs[1] + lhs[10] * rhs[2] + lhs[11] * rhs[3],
89  lhs[12] * rhs[0] + lhs[13] * rhs[1] + lhs[14] * rhs[2] + lhs[15] * rhs[3]);
90  }
91 };
92 
93 //////////////////////////////////////////////////////////////////////
94 //
95 // Specializations for TinyVector dot Tensor
96 //
97 //////////////////////////////////////////////////////////////////////
98 
99 template<class T1, class T2, unsigned D>
100 struct OTDot<TinyVector<T1, D>, Tensor<T2, D>>
101 {
103  inline static TinyVector<Type_t, D> apply(const TinyVector<T2, D>& lhs, const Tensor<T1, D>& rhs)
104  {
106  for (unsigned int i = 0; i < D; ++i)
107  {
108  Type_t sum = lhs[0] * rhs(0, i);
109  for (unsigned int j = 1; j < D; ++j)
110  sum += lhs[j] * rhs(j, i);
111  ret[i] = sum;
112  }
113  return ret;
114  }
115 };
116 
117 
118 template<class T1, class T2>
119 struct OTDot<TinyVector<T1, 1>, Tensor<T2, 1>>
120 {
122  inline static TinyVector<Type_t, 1> apply(const TinyVector<T1, 1>& lhs, const Tensor<T2, 1>& rhs)
123  {
124  return TinyVector<Type_t, 1>(lhs[0] * rhs[0]);
125  }
126 };
127 
128 template<class T1, class T2>
129 struct OTDot<TinyVector<T1, 2>, Tensor<T2, 2>>
130 {
132  inline static TinyVector<Type_t, 2> apply(const TinyVector<T1, 2>& lhs, const Tensor<T2, 2>& rhs)
133  {
134  return TinyVector<Type_t, 2>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0), lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1));
135  }
136 };
137 
138 template<class T1, class T2>
139 struct OTDot<TinyVector<T1, 3>, Tensor<T2, 3>>
140 {
142  inline static TinyVector<Type_t, 3> apply(const TinyVector<T1, 3>& lhs, const Tensor<T2, 3>& rhs)
143  {
144  return TinyVector<Type_t, 3>(lhs[0] * rhs[0] + lhs[1] * rhs[3] + lhs[2] * rhs[6],
145  lhs[0] * rhs[1] + lhs[1] * rhs[4] + lhs[2] * rhs[7],
146  lhs[0] * rhs[2] + lhs[1] * rhs[5] + lhs[2] * rhs[8]);
147  }
148 };
149 
150 template<class T1, class T2>
151 struct OTDot<TinyVector<T1, 4>, Tensor<T2, 4>>
152 {
154  inline static TinyVector<Type_t, 4> apply(const TinyVector<T1, 4>& lhs, const Tensor<T2, 4>& rhs)
155  {
156  return TinyVector<Type_t, 4>(lhs[0] * rhs[0] + lhs[1] * rhs[4] + lhs[2] * rhs[8] + lhs[3] * rhs[12],
157  lhs[0] * rhs[1] + lhs[1] * rhs[5] + lhs[2] * rhs[9] + lhs[3] * rhs[13],
158  lhs[0] * rhs[2] + lhs[1] * rhs[6] + lhs[2] * rhs[10] + lhs[3] * rhs[14],
159  lhs[0] * rhs[3] + lhs[1] * rhs[7] + lhs[2] * rhs[11] + lhs[3] * rhs[15]);
160  }
161 };
162 
163 //////////////////////////////////////////////////////////////////////
164 //
165 // Specializations for SymTensor dot TinyVector
166 //
167 //////////////////////////////////////////////////////////////////////
168 
169 template<class T1, class T2, unsigned D>
170 struct OTDot<SymTensor<T1, D>, TinyVector<T2, D>>
171 {
173  inline static TinyVector<Type_t, D> apply(const SymTensor<T1, D>& lhs, const TinyVector<T2, D>& rhs)
174  {
176  for (unsigned int i = 0; i < D; ++i)
177  {
178  Type_t sum = lhs.HL(i, 0) * rhs[0];
179  unsigned int j = 1;
180  for (; j < i; ++j)
181  sum += lhs.HL(i, j) * rhs[j];
182  for (; j < D; ++j)
183  sum += lhs.HL(j, i) * rhs[j];
184  ret[i] = sum;
185  }
186  return ret;
187  }
188 };
189 
190 
191 template<class T1, class T2>
192 struct OTDot<SymTensor<T1, 1>, TinyVector<T2, 1>>
193 {
195  inline static TinyVector<Type_t, 1> apply(const SymTensor<T1, 1>& lhs, const TinyVector<T2, 1>& rhs)
196  {
197  return TinyVector<Type_t, 1>(lhs[0] * rhs[0]);
198  }
199 };
200 
201 template<class T1, class T2>
202 struct OTDot<SymTensor<T1, 2>, TinyVector<T2, 2>>
203 {
205  inline static TinyVector<Type_t, 2> apply(const SymTensor<T1, 2>& lhs, const TinyVector<T2, 2>& rhs)
206  {
207  return TinyVector<Type_t, 2>(lhs(0, 0) * rhs[0] + lhs(0, 1) * rhs[1], lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1]);
208  }
209 };
210 
211 template<class T1, class T2>
212 struct OTDot<SymTensor<T1, 3>, TinyVector<T2, 3>>
213 {
215  inline static TinyVector<Type_t, 3> apply(const SymTensor<T1, 3>& lhs, const TinyVector<T2, 3>& rhs)
216  {
217  return TinyVector<Type_t, 3>(lhs(0, 0) * rhs[0] + lhs(0, 1) * rhs[1] + lhs(0, 2) * rhs[2],
218  lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1] + lhs(1, 2) * rhs[2],
219  lhs(2, 0) * rhs[0] + lhs(2, 1) * rhs[1] + lhs(2, 2) * rhs[2]);
220  }
221 };
222 
223 //////////////////////////////////////////////////////////////////////
224 //
225 // Specializations for TinyVector dot SymTensor
226 //
227 //////////////////////////////////////////////////////////////////////
228 
229 template<class T1, class T2, unsigned D>
230 struct OTDot<TinyVector<T1, D>, SymTensor<T2, D>>
231 {
233  inline static TinyVector<Type_t, D> apply(const TinyVector<T2, D>& lhs, const SymTensor<T1, D>& rhs)
234  {
236  for (unsigned int i = 0; i < D; ++i)
237  {
238  Type_t sum = lhs[0] * rhs[i * (i + 1) / 2];
239  unsigned int j = 1;
240  for (; j < i; ++j)
241  sum += lhs[j] * rhs[i * (i + 1) / 2 + j];
242  for (; j < D; ++j)
243  sum += lhs[j] * rhs[j * (j + 1) / 2 + i];
244  ret[i] = sum;
245  }
246  return ret;
247  }
248 };
249 
250 
251 template<class T1, class T2>
252 struct OTDot<TinyVector<T1, 1>, SymTensor<T2, 1>>
253 {
255  inline static TinyVector<Type_t, 1> apply(const TinyVector<T1, 1>& lhs, const SymTensor<T2, 1>& rhs)
256  {
257  return TinyVector<Type_t, 1>(lhs[0] * rhs[0]);
258  }
259 };
260 
261 template<class T1, class T2>
262 struct OTDot<TinyVector<T1, 2>, SymTensor<T2, 2>>
263 {
265  inline static TinyVector<Type_t, 2> apply(const TinyVector<T1, 2>& lhs, const SymTensor<T2, 2>& rhs)
266  {
267  return TinyVector<Type_t, 2>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0), lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1));
268  }
269 };
270 
271 template<class T1, class T2>
272 struct OTDot<TinyVector<T1, 3>, SymTensor<T2, 3>>
273 {
275  inline static TinyVector<Type_t, 3> apply(const TinyVector<T1, 3>& lhs, const SymTensor<T2, 3>& rhs)
276  {
277  return TinyVector<Type_t, 3>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0) + lhs[2] * rhs(2, 0),
278  lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1) + lhs[2] * rhs(2, 1),
279  lhs[0] * rhs(0, 2) + lhs[1] * rhs(1, 2) + lhs[2] * rhs(2, 2));
280  }
281 };
282 
283 //////////////////////////////////////////////////////////////////////
284 //
285 // Specializations for SymTensor dot Tensor
286 //
287 //////////////////////////////////////////////////////////////////////
288 
289 template<class T1, class T2, unsigned D>
290 struct OTDot<SymTensor<T1, D>, Tensor<T2, D>>
291 {
293  inline static Tensor<Type_t, D> apply(const SymTensor<T1, D>& lhs, const Tensor<T2, D>& rhs)
294  {
296  for (unsigned int i = 0; i < D; ++i)
297  for (unsigned int j = 0; j < D; ++j)
298  {
299  Type_t sum = lhs.HL(i, 0) * rhs(0, j);
300  unsigned int k = 1;
301  for (; k < i; ++k)
302  sum += lhs.HL(i, k) * rhs(k, j);
303  for (; k < D; ++k)
304  sum += lhs.HL(k, i) * rhs(k, j);
305  res(i, j) = sum;
306  }
307  return res;
308  }
309 };
310 
311 template<class T1, class T2>
312 struct OTDot<SymTensor<T1, 1>, Tensor<T2, 1>>
313 {
315  inline static Tensor<Type_t, 1> apply(const SymTensor<T1, 1>& lhs, const Tensor<T2, 1>& rhs)
316  {
317  return Tensor<Type_t, 1>(lhs[0] * rhs[0]);
318  }
319 };
320 
321 template<class T1, class T2>
322 struct OTDot<SymTensor<T1, 2>, Tensor<T2, 2>>
323 {
325  inline static Tensor<Type_t, 2> apply(const SymTensor<T1, 2>& lhs, const Tensor<T2, 2>& rhs)
326  {
327  return Tensor<Type_t, 2>(lhs(0, 0) * rhs(0, 0) + lhs(0, 1) * rhs(1, 0),
328  lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1),
329  lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0),
330  lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1));
331  }
332 };
333 
334 template<class T1, class T2>
335 struct OTDot<SymTensor<T1, 3>, Tensor<T2, 3>>
336 {
338  inline static Tensor<Type_t, 3> apply(const SymTensor<T1, 3>& lhs, const Tensor<T2, 3>& rhs)
339  {
340  return Tensor<Type_t, 3>(lhs(0, 0) * rhs(0, 0) + lhs(0, 1) * rhs(1, 0) + lhs(0, 2) * rhs(2, 0),
341  lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1) + lhs(0, 2) * rhs(2, 1),
342  lhs(0, 0) * rhs(0, 2) + lhs(0, 1) * rhs(1, 2) + lhs(0, 2) * rhs(2, 2),
343  lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0) + lhs(1, 2) * rhs(2, 0),
344  lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1) + lhs(1, 2) * rhs(2, 1),
345  lhs(1, 0) * rhs(0, 2) + lhs(1, 1) * rhs(1, 2) + lhs(1, 2) * rhs(2, 2),
346  lhs(2, 0) * rhs(0, 0) + lhs(2, 1) * rhs(1, 0) + lhs(2, 2) * rhs(2, 0),
347  lhs(2, 0) * rhs(0, 1) + lhs(2, 1) * rhs(1, 1) + lhs(2, 2) * rhs(2, 1),
348  lhs(2, 0) * rhs(0, 2) + lhs(2, 1) * rhs(1, 2) + lhs(2, 2) * rhs(2, 2));
349  }
350 };
351 
352 //////////////////////////////////////////////////////////////////////
353 //
354 // Specializations for Tensor dot SymTensor
355 //
356 //////////////////////////////////////////////////////////////////////
357 
358 template<class T1, class T2, unsigned D>
359 struct OTDot<Tensor<T1, D>, SymTensor<T2, D>>
360 {
362  inline static Tensor<Type_t, D> apply(const Tensor<T1, D>& lhs, const SymTensor<T2, D>& rhs)
363  {
365  for (unsigned int i = 0; i < D; ++i)
366  for (unsigned int j = 0; j < D; ++j)
367  {
368  Type_t sum = lhs(i, 0) * rhs.HL(j, 0);
369  unsigned int k = 1;
370  for (; k < j; ++k)
371  sum += lhs(i, k) * rhs.HL(j, k);
372  for (; k < D; ++k)
373  sum += lhs(i, k) * rhs.HL(k, j);
374  res[i * D + j] = sum;
375  }
376  return res;
377  }
378 };
379 
380 template<class T1, class T2>
381 struct OTDot<Tensor<T1, 1>, SymTensor<T2, 1>>
382 {
384  inline static Tensor<Type_t, 1> apply(const Tensor<T1, 1>& lhs, const SymTensor<T2, 1>& rhs)
385  {
386  return Tensor<Type_t, 1>(lhs[0] * rhs[0]);
387  }
388 };
389 
390 template<class T1, class T2>
391 struct OTDot<Tensor<T1, 2>, SymTensor<T2, 2>>
392 {
394  inline static Tensor<Type_t, 2> apply(const Tensor<T1, 2>& lhs, const SymTensor<T2, 2>& rhs)
395  {
396  return Tensor<Type_t, 2>(lhs(0, 0) * rhs(0, 0) + lhs(0, 1) * rhs(1, 0),
397  lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1),
398  lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0),
399  lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1));
400  }
401 };
402 
403 template<class T1, class T2>
404 struct OTDot<Tensor<T1, 3>, SymTensor<T2, 3>>
405 {
407  inline static Tensor<Type_t, 3> apply(const Tensor<T1, 3>& lhs, const SymTensor<T2, 3>& rhs)
408  {
409  return Tensor<Type_t, 3>(lhs(0, 0) * rhs(0, 0) + lhs(0, 1) * rhs(1, 0) + lhs(0, 2) * rhs(2, 0),
410  lhs(0, 0) * rhs(0, 1) + lhs(0, 1) * rhs(1, 1) + lhs(0, 2) * rhs(2, 1),
411  lhs(0, 0) * rhs(0, 2) + lhs(0, 1) * rhs(1, 2) + lhs(0, 2) * rhs(2, 2),
412  lhs(1, 0) * rhs(0, 0) + lhs(1, 1) * rhs(1, 0) + lhs(1, 2) * rhs(2, 0),
413  lhs(1, 0) * rhs(0, 1) + lhs(1, 1) * rhs(1, 1) + lhs(1, 2) * rhs(2, 1),
414  lhs(1, 0) * rhs(0, 2) + lhs(1, 1) * rhs(1, 2) + lhs(1, 2) * rhs(2, 2),
415  lhs(2, 0) * rhs(0, 0) + lhs(2, 1) * rhs(1, 0) + lhs(2, 2) * rhs(2, 0),
416  lhs(2, 0) * rhs(0, 1) + lhs(2, 1) * rhs(1, 1) + lhs(2, 2) * rhs(2, 1),
417  lhs(2, 0) * rhs(0, 2) + lhs(2, 1) * rhs(1, 2) + lhs(2, 2) * rhs(2, 2));
418  }
419 };
420 
421 //////////////////////////////////////////////////////////////////////
422 //
423 // Specializations for TinyVector dot AntiSymTensor
424 //
425 //////////////////////////////////////////////////////////////////////
426 
427 template<class T1, class T2, unsigned D>
428 struct OTDot<TinyVector<T1, D>, AntiSymTensor<T2, D>>
429 {
432  {
434  for (unsigned int j = 0; j < D; ++j)
435  {
436  Type_t sum = 0;
437  for (int i = 0; i < j; i++)
438  sum -= lhs[i] * rhs[((j - 1) * j / 2) + i];
439  for (int i = j + 1; i < D; ++i)
440  sum += lhs[i] * rhs[((i - 1) * i / 2) + j];
441  ret[j] = sum;
442  }
443  return ret;
444  }
445 };
446 
447 template<class T1, class T2>
448 struct OTDot<TinyVector<T1, 2>, AntiSymTensor<T2, 2>>
449 {
452  {
453  return TinyVector<Type_t, 2>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0), lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1));
454  }
455 };
456 
457 template<class T1, class T2>
458 struct OTDot<TinyVector<T1, 3>, AntiSymTensor<T2, 3>>
459 {
462  {
463  return TinyVector<Type_t, 3>(lhs[0] * rhs(0, 0) + lhs[1] * rhs(1, 0) + lhs[2] * rhs(2, 0),
464  lhs[0] * rhs(0, 1) + lhs[1] * rhs(1, 1) + lhs[2] * rhs(2, 1),
465  lhs[0] * rhs(0, 2) + lhs[1] * rhs(1, 2) + lhs[2] * rhs(2, 2));
466  }
467 };
468 
469 //////////////////////////////////////////////////////////////////////
470 //
471 // Specializations for AntiSymTensor dot TinyVector
472 //
473 //////////////////////////////////////////////////////////////////////
474 
475 template<class T1, class T2, unsigned D>
476 struct OTDot<AntiSymTensor<T1, D>, TinyVector<T2, D>>
477 {
480  {
482  for (unsigned int i = 0; i < D; ++i)
483  {
484  Type_t sum = 0;
485  for (unsigned int j = 0; j < i; ++j)
486  sum += lhs[((i - 1) * i / 2) + j] * rhs[j];
487  for (unsigned int j = i + 1; j < D; ++j)
488  sum -= lhs[((j - 1) * j / 2) + i] * rhs[j];
489  ret[i] = sum;
490  }
491  return ret;
492  }
493 };
494 
495 
496 template<class T1, class T2>
497 struct OTDot<AntiSymTensor<T1, 1>, TinyVector<T2, 1>>
498 {
501  {
502  return TinyVector<Type_t, 1>(lhs[0] * rhs[0]);
503  }
504 };
505 
506 template<class T1, class T2>
507 struct OTDot<AntiSymTensor<T1, 2>, TinyVector<T2, 2>>
508 {
511  {
512  return TinyVector<Type_t, 2>(lhs(0, 0) * rhs[0] + lhs(0, 1) * rhs[1], lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1]);
513  }
514 };
515 
516 template<class T1, class T2>
517 struct OTDot<AntiSymTensor<T1, 3>, TinyVector<T2, 3>>
518 {
521  {
522  return TinyVector<Type_t, 3>(lhs(0, 0) * rhs[0] + lhs(0, 1) * rhs[1] + lhs(0, 2) * rhs[2],
523  lhs(1, 0) * rhs[0] + lhs(1, 1) * rhs[1] + lhs(1, 2) * rhs[2],
524  lhs(2, 0) * rhs[0] + lhs(2, 1) * rhs[1] + lhs(2, 2) * rhs[2]);
525  }
526 };
527 
528 
529 /*
530 //////////////////////////////////////////////////////////////////////
531 //
532 // Specializations for TinyMatrix x TinyMatrix matrix multiplication
533 // Matrix(D1,D2)* Matrix(D2,D3) = Matrix(D1,D3)
534 //
535 //////////////////////////////////////////////////////////////////////
536 template<class T1, class T2, unsigned D1, unsigned D2, unsigned D3>
537 struct OTDot< TinyMatrix<T1,D1,D2> , TinyMatrix<T2,D2,D3> >
538 {
539  using Type_t = typename BinaryReturn<T1,T2,OpMultiply>::Type_t;
540  using Return_t = TinyMatrix<Type_t, D1, D3>;
541  inline static Return_t
542  apply(const TinyMatrix<T1,D1,D2>& lhs, const TinyMatrix<T2,D2,D3>& rhs) {
543  Return_t res;
544  for(int i=0; i<D1; i++)
545  for(int j=0; j<D3; j++) {
546  Type_t tmp = 0.0e0;
547  for(int k=0; k<D2; k++)
548  tmp += lhs(i,k)*rhs(k,j);
549  res(i,j) = tmp;
550  }
551  return res;
552  }
553 };
554 
555 template<class T1, class T2>
556 struct OTDot< TinyMatrix<T1,3,3> , TinyMatrix<T2,3,3> >
557 {
558  using Type_t = typename BinaryReturn<T1,T2,OpMultiply>::Type_t;
559  using Return_t = TinyMatrix<Type_t, 3, 3>;
560  inline static Return_t
561  apply(const TinyMatrix<T1,3,3>& lhs, const TinyMatrix<T2,3,3>& rhs) {
562  return Return_t(lhs(0,0)*rhs(0,0)+lhs(0,1)*rhs(1,0)+lhs(0,2)*rhs(2,0),
563  lhs(0,0)*rhs(0,1)+lhs(0,1)*rhs(1,1)+lhs(0,2)*rhs(2,1),
564  lhs(0,0)*rhs(0,2)+lhs(0,1)*rhs(1,2)+lhs(0,2)*rhs(2,2),
565  lhs(1,0)*rhs(0,0)+lhs(1,1)*rhs(1,0)+lhs(1,2)*rhs(2,0),
566  lhs(1,0)*rhs(0,1)+lhs(1,1)*rhs(1,1)+lhs(1,2)*rhs(2,1),
567  lhs(1,0)*rhs(0,2)+lhs(1,1)*rhs(1,2)+lhs(1,2)*rhs(2,2),
568  lhs(2,0)*rhs(0,0)+lhs(2,1)*rhs(1,0)+lhs(2,2)*rhs(2,0),
569  lhs(2,0)*rhs(0,1)+lhs(2,1)*rhs(1,1)+lhs(2,2)*rhs(2,1),
570  lhs(2,0)*rhs(0,2)+lhs(2,1)*rhs(1,2)+lhs(2,2)*rhs(2,2));
571  }
572 };
573 template<class T1, class T2>
574 struct OTDot< TinyMatrix<T1,4,4> , TinyMatrix<T2,4,4> >
575 {
576  using Type_t = typename BinaryReturn<T1,T2,OpMultiply>::Type_t;
577  using Return_t = TinyMatrix<Type_t, 4, 4>;
578  inline static Return_t
579  apply(const TinyMatrix<T1,4,4>& lhs, const TinyMatrix<T2,4,4>& rhs) {
580  return Return_t(lhs(0,0)*rhs(0,0)+lhs(0,1)*rhs(1,0)+lhs(0,2)*rhs(2,0)+lhs(0,3)*rhs(3,0),
581  lhs(0,0)*rhs(0,1)+lhs(0,1)*rhs(1,1)+lhs(0,2)*rhs(2,1)+lhs(0,3)*rhs(3,1),
582  lhs(0,0)*rhs(0,2)+lhs(0,1)*rhs(1,2)+lhs(0,2)*rhs(2,2)+lhs(0,3)*rhs(3,2),
583  lhs(0,0)*rhs(0,3)+lhs(0,1)*rhs(1,3)+lhs(0,2)*rhs(2,3)+lhs(0,3)*rhs(3,3),
584  lhs(1,0)*rhs(0,0)+lhs(1,1)*rhs(1,0)+lhs(1,2)*rhs(2,0)+lhs(1,3)*rhs(3,0),
585  lhs(1,0)*rhs(0,1)+lhs(1,1)*rhs(1,1)+lhs(1,2)*rhs(2,1)+lhs(1,3)*rhs(3,1),
586  lhs(1,0)*rhs(0,2)+lhs(1,1)*rhs(1,2)+lhs(1,2)*rhs(2,2)+lhs(1,3)*rhs(3,2),
587  lhs(1,0)*rhs(0,3)+lhs(1,1)*rhs(1,3)+lhs(1,2)*rhs(2,3)+lhs(1,3)*rhs(3,3),
588  lhs(2,0)*rhs(0,0)+lhs(2,1)*rhs(1,0)+lhs(2,2)*rhs(2,0)+lhs(2,3)*rhs(3,0),
589  lhs(2,0)*rhs(0,1)+lhs(2,1)*rhs(1,1)+lhs(2,2)*rhs(2,1)+lhs(2,3)*rhs(3,1),
590  lhs(2,0)*rhs(0,2)+lhs(2,1)*rhs(1,2)+lhs(2,2)*rhs(2,2)+lhs(2,3)*rhs(3,2),
591  lhs(2,0)*rhs(0,3)+lhs(2,1)*rhs(1,3)+lhs(2,2)*rhs(2,3)+lhs(2,3)*rhs(3,3),
592  lhs(3,0)*rhs(0,0)+lhs(3,1)*rhs(1,0)+lhs(3,2)*rhs(2,0)+lhs(3,3)*rhs(3,0),
593  lhs(3,0)*rhs(0,1)+lhs(3,1)*rhs(1,1)+lhs(3,2)*rhs(2,1)+lhs(3,3)*rhs(3,1),
594  lhs(3,0)*rhs(0,2)+lhs(3,1)*rhs(1,2)+lhs(3,2)*rhs(2,2)+lhs(3,3)*rhs(3,2),
595  lhs(3,0)*rhs(0,3)+lhs(3,1)*rhs(1,3)+lhs(3,2)*rhs(2,3)+lhs(3,3)*rhs(3,3));
596  }
597 };
598 */
599 //////////////////////////////////////////////////////////////////////
600 //
601 // Definition of the struct OuterProduct
602 //
603 //////////////////////////////////////////////////////////////////////
604 
605 template<class T1, class T2>
607 {};
608 
609 //////////////////////////////////////////////////////////////////////
610 //
611 // Specializations for TinyVector cross TinyVector
612 //
613 //////////////////////////////////////////////////////////////////////
614 
615 template<class T1, class T2, unsigned D>
616 struct OuterProduct<TinyVector<T1, D>, TinyVector<T2, D>>
617 {
620  inline static Return_t apply(const TinyVector<T1, D>& a, const TinyVector<T2, D>& b) { return Return_t(); }
621 };
622 
623 template<class T1, class T2>
624 struct OuterProduct<TinyVector<T1, 2>, TinyVector<T2, 2>>
625 {
628  inline static Return_t apply(const TinyVector<T1, 2>& a, const TinyVector<T2, 2>& b)
629  {
630  return Return_t(a[0] * b[0], a[0] * b[1], a[1] * b[0], a[1] * b[1]);
631  }
632 };
633 
634 template<class T1, class T2>
635 struct OuterProduct<TinyVector<T1, 3>, TinyVector<T2, 3>>
636 {
639  inline static Return_t apply(const TinyVector<T1, 3>& a, const TinyVector<T2, 3>& b)
640  {
641  return Return_t(a[0] * b[0], a[0] * b[1], a[0] * b[2], a[1] * b[0], a[1] * b[1], a[1] * b[2], a[2] * b[0],
642  a[2] * b[1], a[2] * b[2]);
643  }
644 };
645 
646 } // namespace qmcplusplus
647 #endif // OHMMS_TINYVECTOR_DOTCROSS_H
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, D > apply(const AntiSymTensor< T1, D > &lhs, const TinyVector< T2, D > &rhs)
typename Promote< T1, T2 >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
Fixed-size array.
Definition: OhmmsTinyMeta.h:30
static TinyVector< Type_t, 1 > apply(const AntiSymTensor< T1, 1 > &lhs, const TinyVector< T2, 1 > &rhs)
static TinyVector< Type_t, 2 > apply(const SymTensor< T1, 2 > &lhs, const TinyVector< T2, 2 > &rhs)
static TinyVector< Type_t, 1 > apply(const SymTensor< T1, 1 > &lhs, const TinyVector< T2, 1 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 2 > apply(const AntiSymTensor< T1, 2 > &lhs, const TinyVector< T2, 2 > &rhs)
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Tensor< Type_t, 2 > apply(const SymTensor< T1, 2 > &lhs, const Tensor< T2, 2 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const TinyVector< T1, 3 > &lhs, const SymTensor< T2, 3 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Return_t apply(const TinyVector< T1, 3 > &a, const TinyVector< T2, 3 > &b)
static TinyVector< Type_t, D > apply(const SymTensor< T1, D > &lhs, const TinyVector< T2, D > &rhs)
static TinyVector< Type_t, 2 > apply(const Tensor< T1, 2 > &lhs, const TinyVector< T2, 2 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 4 > apply(const Tensor< T1, 4 > &lhs, const TinyVector< T2, 4 > &rhs)
static TinyVector< Type_t, 3 > apply(const TinyVector< T1, 3 > &lhs, const AntiSymTensor< T2, 3 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Tensor< Type_t, 3 > apply(const Tensor< T1, 3 > &lhs, const SymTensor< T2, 3 > &rhs)
static TinyVector< Type_t, D > apply(const TinyVector< T2, D > &lhs, const Tensor< T1, D > &rhs)
static Tensor< Type_t, 1 > apply(const Tensor< T1, 1 > &lhs, const SymTensor< T2, 1 > &rhs)
static TinyVector< Type_t, 3 > apply(const SymTensor< T1, 3 > &lhs, const TinyVector< T2, 3 > &rhs)
static Tensor< Type_t, 3 > apply(const SymTensor< T1, 3 > &lhs, const Tensor< T2, 3 > &rhs)
static Tensor< Type_t, D > apply(const SymTensor< T1, D > &lhs, const Tensor< T2, D > &rhs)
static TinyVector< Type_t, D > apply(const Tensor< T1, D > &lhs, const TinyVector< T2, D > &rhs)
Tensor<T,D> class for D by D tensor.
Definition: OhmmsTinyMeta.h:32
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Return_t apply(const TinyVector< T1, 2 > &a, const TinyVector< T2, 2 > &b)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const Tensor< T1, 3 > &lhs, const TinyVector< T2, 3 > &rhs)
static TinyVector< Type_t, D > apply(const TinyVector< T2, D > &lhs, const SymTensor< T1, D > &rhs)
static TinyVector< Type_t, 1 > apply(const TinyVector< T1, 1 > &lhs, const Tensor< T2, 1 > &rhs)
static Tensor< Type_t, D > apply(const Tensor< T1, D > &lhs, const SymTensor< T2, D > &rhs)
static TinyVector< Type_t, 2 > apply(const TinyVector< T1, 2 > &lhs, const SymTensor< T2, 2 > &rhs)
static TinyVector< Type_t, 1 > apply(const TinyVector< T1, 1 > &lhs, const SymTensor< T2, 1 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static Tensor< Type_t, 1 > apply(const SymTensor< T1, 1 > &lhs, const Tensor< T2, 1 > &rhs)
static TinyVector< Type_t, 1 > apply(const Tensor< T1, 1 > &lhs, const TinyVector< T2, 1 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 2 > apply(const TinyVector< T1, 2 > &lhs, const Tensor< T2, 2 > &rhs)
static TinyVector< Type_t, D > apply(const TinyVector< T2, D > &lhs, const AntiSymTensor< T1, D > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
Type_t HL(unsigned int hi, unsigned int lo) const
Definition: SymTensor.h:243
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const TinyVector< T1, 3 > &lhs, const Tensor< T2, 3 > &rhs)
static TinyVector< Type_t, 4 > apply(const TinyVector< T1, 4 > &lhs, const Tensor< T2, 4 > &rhs)
static Tensor< Type_t, 2 > apply(const Tensor< T1, 2 > &lhs, const SymTensor< T2, 2 > &rhs)
static Return_t apply(const TinyVector< T1, D > &a, const TinyVector< T2, D > &b)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 2 > apply(const TinyVector< T1, 2 > &lhs, const AntiSymTensor< T2, 2 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
BareKineticEnergy::Return_t Return_t
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t
static TinyVector< Type_t, 3 > apply(const AntiSymTensor< T1, 3 > &lhs, const TinyVector< T2, 3 > &rhs)
typename BinaryReturn< T1, T2, OpMultiply >::Type_t Type_t