QMCPACK
Blitz.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: Paul R. C. Kent, kentpr@ornl.gov, Oak Ridge National Laboratory
8 // Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
9 // Alfredo A. Correa, correaa@llnl.gov, Lawrence Livermore National Laboratory
10 //
11 // File created by: Paul R. C. Kent, kentpr@ornl.gov, Oak Ridge National Laboratory
12 //////////////////////////////////////////////////////////////////////////////////////
13 
14 
15 #ifndef MYBLITZ_H
16 #define MYBLITZ_H
17 
18 #include <algorithm> // transform
19 #include <array>
20 #include <complex>
21 #include <numeric> // inner_product
22 
23 #include <string.h>
24 
25 #include <multi/array.hpp>
26 
27 template<class T, std::size_t N, class base_type = std::array<T, N>>
28 struct TinyVector : base_type
29 {
30  TinyVector(T d = T(0)) { base_type::fill(d); }
31  T const& operator()(std::size_t n) const { return base_type::operator[](n); }
32  T& operator()(std::size_t n) { return base_type::operator[](n); }
33  template<class Scalar>
35  {
36  std::transform(v.begin(), v.end(), v.begin(), [&s](auto e) { return e * s; });
37  return v;
38  }
39 };
40 
41 template<class T, std::size_t N1, std::size_t N2, class base_type = std::array<std::array<T, N2>, N1>>
42 struct TinyMatrix : base_type
43 {
44  TinyMatrix& operator=(const T t)
45  {
46  std::array<T, N2> val;
47  val.fill(t);
48  base_type::fill(val);
49  return *this;
50  }
51  T const& operator()(std::size_t i, std::size_t j) const { return base_type::operator[](i)[j]; }
52  T& operator()(std::size_t i, std::size_t j) { return base_type::operator[](i)[j]; }
53  friend std::ostream& operator<<(std::ostream& os, TinyMatrix const& self)
54  {
55  for (auto i = 0; i != N1; ++i)
56  {
57  for (auto j = 0; j != N2; ++j)
58  os << self(i, j) << ',';
59  os << '\n';
60  }
61  return os;
62  }
63 };
64 
65 template<class T,
66  int D,
67  class base_type = boost::multi::array<T, D>> // needs to be *int* for matching template parameters in functions
68 struct Array : base_type
69 {
70  using base_type::base_type;
71  Array& operator=(const T t)
72  {
73  base_type::operator=(t);
74  return *this;
75  }
76  Array(int rs, int cs) : base_type({rs, cs}) {}
77  std::ptrdiff_t extent(int d) const
78  {
79  switch (d)
80  {
81  case 0:
82  return std::get<0>(base_type::sizes());
83  case 1:
84  return std::get<1>(base_type::sizes());
85  }
86  assert(false);
87  return 0;
88  }
89  auto rows() const { return std::get<0>(base_type::sizes()); }
90  auto cols() const { return std::get<1>(base_type::sizes()); }
91  void resize(int rs, int cs) { base_type::reextent({rs, cs}); }
92  using sizes_type = decltype(std::declval<base_type const&>().sizes());
93  sizes_type shape() const { return base_type::sizes(); }
94  void resize(sizes_type sizes) { resizeAndPreserve(sizes); }
95 
96  template<class... Ints>
97  void resizeAndPreserve(Ints... sizes)
98  {
99  base_type::reextent(sizes...);
100  }
101 
103  {
104  // explicit conversion due to failure with libc++ type automatic conversion
105  base_type::reextent(std::apply(
106  [](auto... ss) {
107  return typename base_type::extensions_type{static_cast<typename base_type::size_type>(ss)...};
108  },
109  sizes));
110  }
111  template<class... Ints>
112  void resize(Ints... ns)
113  {
114  base_type::reextent({ns...});
115  }
116  typename base_type::element_ptr data() { return base_type::data_elements(); }
117  typename base_type::element_const_ptr data() const { return base_type::data_elements(); }
118 };
119 
120 template<class T, class base_type>
121 struct Array<T, 1, base_type> : base_type
122 {
123  using base_type::base_type;
124  Array& operator=(const T t)
125  {
126  std::fill(base_type::begin(), base_type::end(), t);
127  return *this;
128  }
129  friend Array operator-(Array const& a, Array const& b)
130  {
131  assert(a.size() == b.size());
132  Array ret(a.size());
133  std::transform(a.begin(), a.end(), b.begin(), ret.begin(), [](auto a, auto b) { return a - b; });
134  return ret;
135  }
136  friend Array operator+(Array const& a, Array const& b)
137  {
138  assert(a.extensions() == b.extensions());
139  Array ret(a.extensions());
140  std::transform(a.begin(), a.end(), b.begin(), ret.begin(), [](auto a, auto b) { return a + b; });
141  return ret;
142  }
143  auto rows() const { return base_type::size(); }
144  using sizes_type = decltype(std::declval<base_type const&>().sizes());
145  sizes_type shape() const { return base_type::sizes(); }
146  void resize(sizes_type sizes) { resizeAndPreserve(sizes); }
147  void resizeAndPreserve(sizes_type sizes) { base_type::reextent(sizes); }
148  std::ptrdiff_t extent(int d) const
149  {
150  switch (d)
151  {
152  case 0:
153  return std::get<0>(base_type::sizes());
154  }
155  assert(false);
156  return 0;
157  }
158  template<class... Ints>
159  void resize(Ints... ns)
160  {
161  base_type::reextent(typename base_type::extensions_type({static_cast<typename base_type::size_type>(ns)...})); // std::make_tuple(ns...));
162  }
163  friend Array operator*(T const& t, Array const& a)
164  {
165  Array ret(a.extensions());
166  std::transform(a.begin(), a.end(), ret.begin(), [&](auto const& e) { return t * e; });
167  return ret;
168  }
169  typename base_type::element_ptr data() { return base_type::data_elements(); }
170  typename base_type::element_const_ptr data() const { return base_type::data_elements(); }
171 };
172 
173 struct Range : boost::multi::index_range
174 {
175  using boost::multi::index_range::index_range;
176  static auto all() { return boost::multi::ALL; }
177 };
178 
180 {};
181 
182 template<class... Args>
184 {};
185 
186 constexpr class neverDeleteData_t
187 {
189 
190 using scalar = double;
191 
196 
201 
202 //using dVec = TinyVector<scalar,NDIM>;
203 //using dVecInt = TinyVector<int,NDIM>;
204 
205 /* #ifdef MAC */
206 /* // extern "C" double isnan (double x); */
207 /* #define isnan(x) __isnand(x) */
208 /* #define fpclassify(x) __fpclassifyd(x) */
209 /* #define isnormal(x) __isnormald(x) */
210 /* #define isinf(x) __isinfd(x) */
211 /* #endif */
212 
213 template<class T, int size>
215 {
216  TinyVector<T, size> minusv;
217  for (int i = 0; i < size; i++)
218  minusv[i] = -v[i];
219  return (minusv);
220 }
221 
222 // template <class T, int size>
223 // inline bool operator==(TinyVector<T,size> v1,TinyVector<T,size> v2)
224 // {
225 // bool equals=true;
226 
227 
228 // for (int i=0; i<size; i++)
229 // equals = (v1[i]==v2[i]) && equals;
230 // return (equals);
231 // }
232 
233 inline Vec2 operator*(const Vec2& v, scalar s)
234 {
235  Vec2 result;
236  result[0] = s * v[0];
237  result[1] = s * v[1];
238  return (result);
239 }
240 
241 inline Vec2 operator*(scalar s, const Vec2& v) { return (v * s); }
242 
243 inline Vec2 operator+(const Vec2& v1, const Vec2& v2)
244 {
245  Vec2 result;
246  result[0] = v1[0] + v2[0];
247  result[1] = v1[1] + v2[1];
248  return (result);
249 }
250 
251 
252 inline Vec2 operator-(const Vec2& v1, const Vec2& v2)
253 {
254  Vec2 result;
255  result[0] = v1[0] - v2[0];
256  result[1] = v1[1] - v2[1];
257  return (result);
258 }
259 
260 
261 inline Vec3 operator*(scalar s, const Vec3& v)
262 {
263  Vec3 result;
264  result[0] = s * v[0];
265  result[1] = s * v[1];
266  result[2] = s * v[2];
267  return (result);
268 }
269 
270 inline Vec3 operator*(const Vec3& v, scalar s)
271 {
272  Vec3 result;
273  result[0] = s * v[0];
274  result[1] = s * v[1];
275  result[2] = s * v[2];
276  return (result);
277 }
278 
279 
280 inline Vec3 operator+(const Vec3& v1, const Vec3& v2)
281 {
282  Vec3 result;
283  result[0] = v1[0] + v2[0];
284  result[1] = v1[1] + v2[1];
285  result[2] = v1[2] + v2[2];
286  return (result);
287 }
288 
289 inline Vec3 operator-(const Vec3& v1, const Vec3& v2)
290 {
291  Vec3 result;
292  result[0] = v1[0] - v2[0];
293  result[1] = v1[1] - v2[1];
294  result[2] = v1[2] - v2[2];
295  return (result);
296 }
297 
298 
299 inline Vec4 operator*(scalar s, const Vec4& v)
300 {
301  Vec4 result;
302  result[0] = s * v[0];
303  result[1] = s * v[1];
304  result[2] = s * v[2];
305  result[3] = s * v[3];
306  return (result);
307 }
308 
309 inline Vec4 operator*(const Vec4& v, scalar s)
310 {
311  Vec4 result;
312  result[0] = s * v[0];
313  result[1] = s * v[1];
314  result[2] = s * v[2];
315  result[3] = s * v[3];
316  return (result);
317 }
318 
319 
320 inline Vec4 operator+(const Vec4& v1, const Vec4& v2)
321 {
322  Vec4 result;
323  result[0] = v1[0] + v2[0];
324  result[1] = v1[1] + v2[1];
325  result[2] = v1[2] + v2[2];
326  result[3] = v1[3] + v2[3];
327  return (result);
328 }
329 
330 inline Vec4 operator-(const Vec4& v1, const Vec4& v2)
331 {
332  Vec4 result;
333  result[0] = v1[0] - v2[0];
334  result[1] = v1[1] - v2[1];
335  result[2] = v1[2] - v2[2];
336  result[3] = v1[3] - v2[3];
337  return (result);
338 }
339 
340 
341 inline Mat3 operator*(scalar s, const Mat3& M)
342 {
343  Mat3 sM;
344  sM(0, 0) = s * M(0, 0);
345  sM(0, 1) = s * M(0, 1);
346  sM(0, 2) = s * M(0, 2);
347  sM(1, 0) = s * M(1, 0);
348  sM(1, 1) = s * M(1, 1);
349  sM(1, 2) = s * M(1, 2);
350  sM(2, 0) = s * M(2, 0);
351  sM(2, 1) = s * M(2, 1);
352  sM(2, 2) = s * M(2, 2);
353  return (sM);
354 }
355 
356 inline Mat3 operator*(const Mat3& A, const Mat3& B)
357 {
358  Mat3 C;
359  C(0, 0) = A(0, 0) * B(0, 0) + A(0, 1) * B(1, 0) + A(0, 2) * B(2, 0);
360  C(0, 1) = A(0, 0) * B(0, 1) + A(0, 1) * B(1, 1) + A(0, 2) * B(2, 1);
361  C(0, 2) = A(0, 0) * B(0, 2) + A(0, 1) * B(1, 2) + A(0, 2) * B(2, 2);
362  C(1, 0) = A(1, 0) * B(0, 0) + A(1, 1) * B(1, 0) + A(1, 2) * B(2, 0);
363  C(1, 1) = A(1, 0) * B(0, 1) + A(1, 1) * B(1, 1) + A(1, 2) * B(2, 1);
364  C(1, 2) = A(1, 0) * B(0, 2) + A(1, 1) * B(1, 2) + A(1, 2) * B(2, 2);
365  C(2, 0) = A(2, 0) * B(0, 0) + A(2, 1) * B(1, 0) + A(2, 2) * B(2, 0);
366  C(2, 1) = A(2, 0) * B(0, 1) + A(2, 1) * B(1, 1) + A(2, 2) * B(2, 1);
367  C(2, 2) = A(2, 0) * B(0, 2) + A(2, 1) * B(1, 2) + A(2, 2) * B(2, 2);
368  return C;
369 }
370 
371 inline Mat3 operator+(const Mat3& A, const Mat3& B)
372 {
373  Mat3 ApB;
374  for (int i = 0; i < 3; i++)
375  for (int j = 0; j < 3; j++)
376  ApB(i, j) = A(i, j) + B(i, j);
377  return (ApB);
378 }
379 
380 
381 inline Mat3 operator-(const Mat3& A, const Mat3& B)
382 {
383  Mat3 AmB;
384  for (int i = 0; i < 3; i++)
385  for (int j = 0; j < 3; j++)
386  AmB(i, j) = A(i, j) - B(i, j);
387  return (AmB);
388 }
389 
390 inline Vec3 operator*(const Mat3& A, const Vec3& v)
391 {
392  Vec3 Av;
393  Av[0] = A(0, 0) * v[0] + A(0, 1) * v[1] + A(0, 2) * v[2];
394  Av[1] = A(1, 0) * v[0] + A(1, 1) * v[1] + A(1, 2) * v[2];
395  Av[2] = A(2, 0) * v[0] + A(2, 1) * v[1] + A(2, 2) * v[2];
396  return Av;
397 }
398 
399 inline Vec3 operator*(const Vec3& v, const Mat3& A)
400 {
401  Vec3 vA;
402  vA[0] = A(0, 0) * v[0] + A(1, 0) * v[1] + A(2, 0) * v[2];
403  vA[1] = A(0, 1) * v[0] + A(1, 1) * v[1] + A(2, 1) * v[2];
404  vA[2] = A(0, 2) * v[0] + A(1, 2) * v[1] + A(2, 2) * v[2];
405  return vA;
406 }
407 
408 inline cMat3 operator+(const cMat3& A, const cMat3& B)
409 {
410  cMat3 ApB;
411  ApB(0, 0) = A(0, 0) + B(0, 0);
412  ApB(0, 1) = A(0, 1) + B(0, 1);
413  ApB(0, 2) = A(0, 2) + B(0, 2);
414  ApB(1, 0) = A(1, 0) + B(1, 0);
415  ApB(1, 1) = A(1, 1) + B(1, 1);
416  ApB(1, 2) = A(1, 2) + B(1, 2);
417  ApB(2, 0) = A(2, 0) + B(2, 0);
418  ApB(2, 1) = A(2, 1) + B(2, 1);
419  ApB(2, 2) = A(2, 2) + B(2, 2);
420  return ApB;
421 }
422 
423 inline cMat3 operator-(const cMat3& A, const cMat3& B)
424 {
425  cMat3 AmB;
426  AmB(0, 0) = A(0, 0) - B(0, 0);
427  AmB(0, 1) = A(0, 1) - B(0, 1);
428  AmB(0, 2) = A(0, 2) - B(0, 2);
429  AmB(1, 0) = A(1, 0) - B(1, 0);
430  AmB(1, 1) = A(1, 1) - B(1, 1);
431  AmB(1, 2) = A(1, 2) - B(1, 2);
432  AmB(2, 0) = A(2, 0) - B(2, 0);
433  AmB(2, 1) = A(2, 1) - B(2, 1);
434  AmB(2, 2) = A(2, 2) - B(2, 2);
435  return AmB;
436 }
437 
438 inline cMat3& operator+=(cMat3& A, const cMat3& B)
439 {
440  A(0, 0) += B(0, 0);
441  A(0, 1) += B(0, 1);
442  A(0, 2) += B(0, 2);
443  A(1, 0) += B(1, 0);
444  A(1, 1) += B(1, 1);
445  A(1, 2) += B(1, 2);
446  A(2, 0) += B(2, 0);
447  A(2, 1) += B(2, 1);
448  A(2, 2) += B(2, 2);
449  return A;
450 }
451 
452 inline cMat3& operator-=(cMat3& A, const cMat3& B)
453 {
454  A(0, 0) -= B(0, 0);
455  A(0, 1) -= B(0, 1);
456  A(0, 2) -= B(0, 2);
457  A(1, 0) -= B(1, 0);
458  A(1, 1) -= B(1, 1);
459  A(1, 2) -= B(1, 2);
460  A(2, 0) -= B(2, 0);
461  A(2, 1) -= B(2, 1);
462  A(2, 2) -= B(2, 2);
463  return A;
464 }
465 
466 inline double operator*(const Vec3& v1, const Vec3& v2) { return (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]); }
467 
468 inline cMat3 operator*(std::complex<double> z, const Mat3& A)
469 {
470  cMat3 zA;
471  zA(0, 0) = z * A(0, 0);
472  zA(0, 1) = z * A(0, 1);
473  zA(0, 2) = z * A(0, 2);
474  zA(1, 0) = z * A(1, 0);
475  zA(1, 1) = z * A(1, 1);
476  zA(1, 2) = z * A(1, 2);
477  zA(2, 0) = z * A(2, 0);
478  zA(2, 1) = z * A(2, 1);
479  zA(2, 2) = z * A(2, 2);
480  return zA;
481 }
482 
483 inline cMat3 operator*(const Mat3& A, std::complex<double> z) { return z * A; }
484 
485 inline cVec3 operator*(const cMat3& A, const cVec3& x)
486 {
487  cVec3 Ax;
488  Ax[0] = A(0, 0) * x[0] + A(0, 1) * x[1] + A(0, 2) * x[2];
489  Ax[1] = A(1, 0) * x[0] + A(1, 1) * x[1] + A(1, 2) * x[2];
490  Ax[2] = A(2, 0) * x[0] + A(2, 1) * x[1] + A(2, 2) * x[2];
491  return Ax;
492 }
493 
494 inline double distSqrd(Vec2 a, Vec2 b)
495 {
496  return std::inner_product(a.begin(), a.end(), b.begin(), 0., std::plus<>{},
497  [](auto ae, auto be) { return (ae - be) * (ae - be); });
498 }
499 
500 template<class T>
502 {
503 private:
505  int N;
506  inline int index(int row, int col) const
507  {
508  return ((row > col) ? ((row * (row + 1) >> 1) + col) : ((col * (col + 1) >> 1) + row));
509  }
510 
511 public:
512  inline void resize(int n)
513  {
514  N = (n * (n + 1)) >> 1;
515  A.resize(N);
516  }
517 
518  inline int rows() const { return N; }
519 
520  inline T operator()(int i, int j) const { return (A(index(i, j))); }
521 
522  inline T& operator()(int i, int j) { return (A(index(i, j))); }
523 
524  inline SymmArray<T>(const SymmArray<T>& B)
525  {
526  resize(B.N);
527  A = B.A;
528  }
530  {
531  A = B.A;
532  return *this;
533  }
534  inline SymmArray<T>() { N = 0; }
535 };
536 
537 
538 inline void Vec2Array(Array<Vec2, 1>& vec, Array<double, 1>& array)
539 {
540  assert(array.extent(0) == (2 * vec.size()));
541  memcpy(array.data(), vec.data(), array.size() * sizeof(double));
542 }
543 
544 inline void Vec2Array(Array<Vec3, 1>& vec, Array<double, 1>& array)
545 {
546  assert(array.extent(0) == (3 * vec.size()));
547  for (int i = 0; i < vec.size(); i++)
548  {
549  array(3 * i + 0) = vec(i)[0];
550  array(3 * i + 1) = vec(i)[1];
551  array(3 * i + 2) = vec(i)[2];
552  }
553  // memcpy(array.data(), vec.data(),
554  // array.size()*sizeof(double));
555 }
556 
557 inline void Array2Vec(Array<double, 1>& array, Array<Vec2, 1>& vec)
558 {
559  assert(array.extent(0) == (2 * vec.size()));
560  memcpy(vec.data(), array.data(), array.size() * sizeof(double));
561 }
562 
563 inline void Array2Vec(Array<double, 1>& array, Array<Vec3, 1>& vec)
564 {
565  assert(array.extent(0) == (3 * vec.size()));
566  memcpy(vec.data(), array.data(), array.size() * sizeof(double));
567 }
568 
569 
570 inline void Vec2Array(Array<Vec2, 1>& vec, Array<double, 2>& array)
571 {
572  assert(array.extent(0) == vec.size());
573  assert(array.extent(1) == 2);
574  memcpy(array.data(), vec.data(), array.size() * sizeof(double));
575 }
576 
577 inline void Vec2Array(Array<Vec3, 1>& vec, Array<double, 2>& array)
578 {
579  assert(array.extent(0) == vec.size());
580  assert(array.extent(1) == 3);
581  for (int i = 0; i < vec.size(); i++)
582  {
583  array(i, 0) = vec(i)[0];
584  array(i, 1) = vec(i)[1];
585  array(i, 2) = vec(i)[2];
586  }
587  // memcpy(array.data(), vec.data(),
588  // array.size()*sizeof(double));
589 }
590 
591 
592 inline void Array2Vec(Array<double, 2>& array, Array<Vec2, 1>& vec)
593 {
594  assert(array.extent(0) == vec.size());
595  assert(array.extent(1) == 2);
596  memcpy(vec.data(), array.data(), array.size() * sizeof(double));
597 }
598 
599 inline void Array2Vec(Array<double, 2>& array, Array<Vec3, 1>& vec)
600 {
601  assert(array.extent(0) == vec.size());
602  assert(array.extent(1) == 3);
603  memcpy(vec.data(), array.data(), array.size() * sizeof(double));
604 }
605 
606 inline Array<Vec3, 1> operator+(const Array<Vec3, 1>& array, Vec3 vec)
607 {
608  Array<Vec3, 1> result(array.size());
609  for (int i = 0; i < array.size(); i++)
610  result(i) = vec + array(i);
611  return result;
612 }
613 
614 inline Array<Vec3, 1> operator+(Vec3 vec, const Array<Vec3, 1>& array)
615 {
616  Array<Vec3, 1> result(array.size());
617  for (int i = 0; i < array.size(); i++)
618  result(i) = vec + array(i);
619  return result;
620 }
621 
622 template<typename T, int N>
623 inline bool operator==(const TinyVector<T, N>& a, const TinyVector<T, N>& b)
624 {
625  bool equals = true;
626  for (int i = 0; i < N; i++)
627  equals = equals && (a[i] == b[i]);
628  return equals;
629 }
630 
631 template<typename T, int N>
632 inline bool operator!=(const TinyVector<T, N>& a, const TinyVector<T, N>& b)
633 {
634  return !(a == b);
635 }
636 
637 
638 template<typename T1, typename T2>
639 inline void copy(const Array<T1, 3>& src, Array<T2, 3>& dest)
640 {
641  assert(src.shape() == dest.shape());
642  for (int ix = 0; ix < src.extent(0); ix++)
643  for (int iy = 0; iy < src.extent(1); iy++)
644  for (int iz = 0; iz < src.extent(2); iz++)
645  dest(ix, iy, iz) = src(ix, iy, iz);
646 }
647 
648 inline std::complex<float> operator+(std::complex<float> z, double r)
649 {
650  return std::complex<float>(z.real() + static_cast<float>(r), z.imag());
651 }
652 
653 
654 inline double det(const Mat3& A)
655 {
656  return (A(0, 0) * (A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)) - A(0, 1) * (A(1, 0) * A(2, 2) - A(1, 2) * A(2, 0)) +
657  A(0, 2) * (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0)));
658 }
659 
660 inline Mat3 Inverse(const Mat3& A)
661 {
662  Mat3 Ainv;
663  double dinv = 1.0 / det(A);
664  Ainv(0, 0) = dinv * (A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1));
665  Ainv(1, 0) = -dinv * (A(1, 0) * A(2, 2) - A(1, 2) * A(2, 0));
666  Ainv(2, 0) = dinv * (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0));
667  Ainv(0, 1) = -dinv * (A(0, 1) * A(2, 2) - A(0, 2) * A(2, 1));
668  Ainv(1, 1) = dinv * (A(0, 0) * A(2, 2) - A(0, 2) * A(2, 0));
669  Ainv(2, 1) = -dinv * (A(0, 0) * A(2, 1) - A(0, 1) * A(2, 0));
670  Ainv(0, 2) = dinv * (A(0, 1) * A(1, 2) - A(0, 2) * A(1, 1));
671  Ainv(1, 2) = -dinv * (A(0, 0) * A(1, 2) - A(0, 2) * A(1, 0));
672  Ainv(2, 2) = dinv * (A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0));
673  return Ainv;
674 }
675 
676 inline Mat3 Transpose(const Mat3& A)
677 {
678  Mat3 Atran;
679  Atran(0, 0) = A(0, 0);
680  Atran(0, 1) = A(1, 0);
681  Atran(0, 2) = A(2, 0);
682  Atran(1, 0) = A(0, 1);
683  Atran(1, 1) = A(1, 1);
684  Atran(1, 2) = A(2, 1);
685  Atran(2, 0) = A(0, 2);
686  Atran(2, 1) = A(1, 2);
687  Atran(2, 2) = A(2, 2);
688 
689  return Atran;
690 }
691 
692 
693 #ifndef NAN
694 #define NAN sqrt(-1.0)
695 #endif
696 
697 
698 #endif
void resize(sizes_type sizes)
Definition: Blitz.h:146
SymmArray< T > & operator=(const SymmArray< T > &B)
Definition: Blitz.h:529
sizes_type shape() const
Definition: Blitz.h:145
Array(int rs, int cs)
Definition: Blitz.h:76
void resizeAndPreserve(sizes_type sizes)
Definition: Blitz.h:102
int N
Definition: Blitz.h:505
Vec2 operator+(const Vec2 &v1, const Vec2 &v2)
Definition: Blitz.h:243
T & operator()(std::size_t n)
Definition: Blitz.h:32
void resizeAndPreserve(Ints... sizes)
Definition: Blitz.h:97
void resize(int rs, int cs)
Definition: Blitz.h:91
sizes_type shape() const
Definition: Blitz.h:93
base_type::element_ptr data()
Definition: Blitz.h:169
Definition: Scalar.h:49
bool operator!=(const TinyVector< T, N > &a, const TinyVector< T, N > &b)
Definition: Blitz.h:632
Array & operator=(const T t)
Definition: Blitz.h:71
TinyMatrix & operator=(const T t)
Definition: Blitz.h:44
Mat3 Transpose(const Mat3 &A)
Definition: Blitz.h:676
Type_t * data()
Definition: OhmmsArray.h:87
Mat3 Inverse(const Mat3 &A)
Definition: Blitz.h:660
bool operator==(const TinyVector< T, N > &a, const TinyVector< T, N > &b)
Definition: Blitz.h:623
decltype(std::declval< base_type const & >().sizes()) sizes_type
Definition: Blitz.h:144
cMat3 & operator-=(cMat3 &A, const cMat3 &B)
Definition: Blitz.h:452
base_type::element_const_ptr data() const
Definition: Blitz.h:117
void resize(const std::array< SIZET, D > &dims)
Resize the container.
Definition: OhmmsArray.h:65
std::ptrdiff_t extent(int d) const
Definition: Blitz.h:77
friend Array operator-(Array const &a, Array const &b)
Definition: Blitz.h:129
T const & operator()(std::size_t n) const
Definition: Blitz.h:31
friend TinyVector & operator*=(TinyVector &v, Scalar s)
Definition: Blitz.h:34
int rows() const
Definition: Blitz.h:518
T & operator()(std::size_t i, std::size_t j)
Definition: Blitz.h:52
void copy(const Array< T1, 3 > &src, Array< T2, 3 > &dest)
Definition: Blitz.h:639
void resize(Ints... ns)
Definition: Blitz.h:112
TinyVector(T d=T(0))
Definition: Blitz.h:30
int index(int row, int col) const
Definition: Blitz.h:506
void Vec2Array(Array< Vec2, 1 > &vec, Array< double, 1 > &array)
Definition: Blitz.h:538
T operator()(int i, int j) const
Definition: Blitz.h:520
T const & operator()(std::size_t i, std::size_t j) const
Definition: Blitz.h:51
void resize(Ints... ns)
Definition: Blitz.h:159
std::ptrdiff_t extent(int d) const
Definition: Blitz.h:148
TinyVector< T, size > operator-(TinyVector< T, size > v)
Definition: Blitz.h:214
Vec2 operator*(const Vec2 &v, scalar s)
Definition: Blitz.h:233
constexpr class neverDeleteData_t neverDeleteData
friend std::ostream & operator<<(std::ostream &os, TinyMatrix const &self)
Definition: Blitz.h:53
size_t size() const
Definition: OhmmsArray.h:57
base_type::element_ptr data()
Definition: Blitz.h:116
friend Array operator+(Array const &a, Array const &b)
Definition: Blitz.h:136
static auto all()
Definition: Blitz.h:176
auto cols() const
Definition: Blitz.h:90
friend Array operator*(T const &t, Array const &a)
Definition: Blitz.h:163
decltype(std::declval< base_type const &>().sizes()) sizes_type
Definition: Blitz.h:92
auto rows() const
Definition: Blitz.h:143
double scalar
Definition: Blitz.h:190
base_type::element_const_ptr data() const
Definition: Blitz.h:170
void resize(int n)
Definition: Blitz.h:512
Array & operator=(const T t)
Definition: Blitz.h:124
Array< T, 1 > A
Definition: Blitz.h:504
Definition: Blitz.h:173
Container_t::iterator begin()
Definition: OhmmsArray.h:80
void Array2Vec(Array< double, 1 > &array, Array< Vec2, 1 > &vec)
Definition: Blitz.h:557
auto rows() const
Definition: Blitz.h:89
double B(double x, int k, int i, const std::vector< double > &t)
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25
double distSqrd(Vec2 a, Vec2 b)
Definition: Blitz.h:494
cMat3 & operator+=(cMat3 &A, const cMat3 &B)
Definition: Blitz.h:438
void resizeAndPreserve(sizes_type sizes)
Definition: Blitz.h:147
T & operator()(int i, int j)
Definition: Blitz.h:522
void resize(sizes_type sizes)
Definition: Blitz.h:94
const std::array< size_t, D > & shape() const
Definition: OhmmsArray.h:56
double det(const Mat3 &A)
Definition: Blitz.h:654
Container_t::iterator end()
Definition: OhmmsArray.h:81