Alamo
Matrix4_Major.H
Go to the documentation of this file.
1 #ifndef SET_MATRIX4_MAJOR_H
2 #define SET_MATRIX4_MAJOR_H
3 
4 #include "Base.H"
5 
6 namespace Set
7 {
8 
9 template <>
10 class Matrix4<2, Sym::Major>
11 {
12  Scalar data[10] = {NAN, NAN, NAN, NAN, NAN,
13  NAN, NAN, NAN, NAN, NAN};
14 
15 public:
16  AMREX_GPU_HOST_DEVICE Matrix4(){};
17 
18  #if AMREX_SPACEDIM == 2
20  {
21  // TODO: very inefficient, need to optimize
22  for (int i = 0; i < 2; i++)
23  for (int j = 0; j < 2; j++)
24  for (int k = 0; k < 2; k++)
25  for (int l = 0; l < 2; l++)
26  (*this)(i,j,k,l) = in(i,j,k,l);
27  }
28  Matrix4(const Matrix4<2,Sym::Diagonal> &in)
29  {
30  // TODO: very inefficient, need to optimize
31  for (int i = 0; i < 2; i++)
32  for (int j = 0; j < 2; j++)
33  for (int k = 0; k < 2; k++)
34  for (int l = 0; l < 2; l++)
35  (*this)(i,j,k,l) = in(i,j,k,l);
36  }
37  Matrix4(const Matrix4<2,Sym::MajorMinor> &in)
38  {
39  // TODO: very inefficient, need to optimize
40  for (int i = 0; i < 2; i++)
41  for (int j = 0; j < 2; j++)
42  for (int k = 0; k < 2; k++)
43  for (int l = 0; l < 2; l++)
44  (*this)(i,j,k,l) = in(i,j,k,l);
45  }
46  #endif
47 
48  AMREX_FORCE_INLINE
49  const Scalar &operator()(const int i, const int j, const int k, const int l) const
50  {
51  int uid = i + 2 * j + 4 * k + 8 * l;
52  if (uid==0 ) return data[0]; // [0000]
53  else if (uid==8 || uid==2 ) return data[1]; // [0001] [0100]
54  else if (uid==4 || uid==1 ) return data[2]; // [0010] [1000]
55  else if (uid==12 || uid==3 ) return data[3]; // [0011] [1100]
56  else if (uid==10 ) return data[4]; // [0101]
57  else if (uid==6 || uid==9 ) return data[5]; // [0110] [1001]
58  else if (uid==14 || uid==11 ) return data[6]; // [0111] [1101]
59  else if (uid==5 ) return data[7]; // [1010]
60  else if (uid==13 || uid==7 ) return data[8]; // [1011] [1110]
61  else if (uid==15 ) return data[9]; // [1111]
62  else
63  Util::Abort(INFO, "Index out of range");
64  return Set::Garbage;
65  }
66 
67  AMREX_FORCE_INLINE
68  Scalar &operator()(const int i, const int j, const int k, const int l)
69  {
70  int uid = i + 2 * j + 4 * k + 8 * l;
71  if (uid==0 ) return data[0]; // [0000]
72  else if (uid==8 || uid==2 ) return data[1]; // [0001] [0100]
73  else if (uid==4 || uid==1 ) return data[2]; // [0010] [1000]
74  else if (uid==12 || uid==3 ) return data[3]; // [0011] [1100]
75  else if (uid==10 ) return data[4]; // [0101]
76  else if (uid==6 || uid==9 ) return data[5]; // [0110] [1001]
77  else if (uid==14 || uid==11 ) return data[6]; // [0111] [1101]
78  else if (uid==5 ) return data[7]; // [1010]
79  else if (uid==13 || uid==7 ) return data[8]; // [1011] [1110]
80  else if (uid==15 ) return data[9]; // [1111]
81  else
82  Util::Abort(INFO, "Index out of range");
83  return Set::Garbage;
84  }
85  void Print(std::ostream &os)
86  {
87  os.precision(4);
88  for (int k = 0; k < 2; k++)
89  {
90  for (int i = -1; i < 3; i++)
91  {
92  for (int l = 0; l < 2; l++)
93  {
94  if (i == -1)
95  os << "┌ ┐ ";
96  else if (i == 2)
97  os << "└ ┘ ";
98  else
99  {
100  os << "│ ";
101  for (int j = 0; j < 2; j++)
102  {
103  const Set::Scalar &val = (*this)(i, j, k, l);
104  os << std::scientific << std::setw(11) << val; //(fabs(val)>1E-10 ? val : 0);
105  os << " ";
106  }
107  os << "│ ";
108  }
109  }
110  os << std::endl;
111  }
112  }
113  }
114  //AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
115  //void operator=(const Matrix4<2, Sym::Major> &a) { for (int i = 0; i < 10; i++) data[i] = a.data[i]; }
116  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
117  void operator+=(const Matrix4<2, Sym::Major> &a) { for (int i = 0; i < 10; i++) data[i] += a.data[i]; }
118  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
119  void operator-=(const Matrix4<2, Sym::Major> &a) { for (int i = 0; i < 10; i++) data[i] -= a.data[i]; }
120  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
121  void operator*=(const Matrix4<2, Sym::Major> &a) { for (int i = 0; i < 10; i++) data[i] *= a.data[i]; }
122  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
123  void operator/=(const Matrix4<2, Sym::Major> &a) { for (int i = 0; i < 10; i++) data[i] /= a.data[i]; }
124  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
125  void operator*=(const Set::Scalar &alpha) { for (int i = 0; i < 10; i++) data[i] *= alpha; }
126  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
127  void operator/=(const Set::Scalar &alpha) { for (int i = 0; i < 10; i++) data[i] /= alpha; }
128 
130  {
132  for (int i = 0; i < 10; i++) ret.data[i] = (Set::Scalar)i;
133  return ret;
134  }
136  {
138  for (int i = 0; i < 10; i++) ret.data[i] = (Util::Random());
139  return ret;
140  }
142  {
144  for (int i = 0; i < 10; i++) ret.data[i] = 0.0;
145  return ret;
146  }
148  {
149  Set::Scalar normsq = 0.0;
150  for (int i = 0; i < 10; i++) normsq += data[i]*data[i];
151  return std::sqrt(normsq);
152  }
153  bool contains_nan() const
154  {
155  if (std::isnan(data[ 0])) return true;
156  if (std::isnan(data[ 1])) return true;
157  if (std::isnan(data[ 2])) return true;
158  if (std::isnan(data[ 3])) return true;
159  if (std::isnan(data[ 4])) return true;
160  if (std::isnan(data[ 5])) return true;
161  if (std::isnan(data[ 6])) return true;
162  if (std::isnan(data[ 7])) return true;
163  if (std::isnan(data[ 8])) return true;
164  if (std::isnan(data[ 9])) return true;
165  return false;
166  }
167 
173  friend Set::Matrix operator*(const Matrix4<2, Sym::Major> &a, const Set::Matrix &b);
174 };
175 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
177 {
179  for (int i = 0; i < 10; i++) ret.data[i] = a.data[i] + b.data[i];
180  return ret;
181 }
182 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
184 {
186  for (int i = 0; i < 10; i++) ret.data[i] = a.data[i] - b.data[i];
187  return ret;
188 }
189 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
191 {
193  for (int i = 0; i < 10; i++) ret.data[i] = a.data[i] * b;
194  return ret;
195 }
196 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
198 {
199  return a*b;
200 }
201 
202 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
204 {
206  for (int i = 0; i < 10; i++) ret.data[i] = a.data[i] / b;
207  return ret;
208 }
209 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
211 {
212  Set::Matrix ret;
213  ret(0,0) = a.data[0]*b(0,0) + a.data[1]*b(0,1) + a.data[2]*b(1,0) + a.data[3]*b(1,1);
214  ret(0,1) = a.data[1]*b(0,0) + a.data[4]*b(0,1) + a.data[5]*b(1,0) + a.data[6]*b(1,1);
215  ret(1,0) = a.data[2]*b(0,0) + a.data[5]*b(0,1) + a.data[7]*b(1,0) + a.data[8]*b(1,1);
216  ret(1,1) = a.data[3]*b(0,0) + a.data[6]*b(0,1) + a.data[8]*b(1,0) + a.data[9]*b(1,1);
217  return ret;
218 }
219 
220 
221 
222 template <>
223 class Matrix4<3, Sym::Major>
224 {
225  Scalar data[45] = {NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN,
226  NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN,
227  NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN,
228  NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN,
229  NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN};
230 
231 public:
232  AMREX_GPU_HOST_DEVICE Matrix4(){};
233 
234  #if AMREX_SPACEDIM == 3
236  {
237  // TODO: very inefficient, need to optimize
238  for (int i = 0; i < 3; i++)
239  for (int j = 0; j < 3; j++)
240  for (int k = 0; k < 3; k++)
241  for (int l = 0; l < 3; l++)
242  (*this)(i,j,k,l) = in(i,j,k,l);
243  }
244  Matrix4(const Matrix4<3,Sym::Diagonal> &in)
245  {
246  // TODO: very inefficient, need to optimize
247  for (int i = 0; i < 3; i++)
248  for (int j = 0; j < 3; j++)
249  for (int k = 0; k < 3; k++)
250  for (int l = 0; l < 3; l++)
251  (*this)(i,j,k,l) = in(i,j,k,l);
252  }
253  Matrix4(const Matrix4<3,Sym::MajorMinor> &in)
254  {
255  // TODO: very inefficient, need to optimize
256  for (int i = 0; i < 3; i++)
257  for (int j = 0; j < 3; j++)
258  for (int k = 0; k < 3; k++)
259  for (int l = 0; l < 3; l++)
260  (*this)(i,j,k,l) = in(i,j,k,l);
261  }
262  #endif
263 
264  AMREX_FORCE_INLINE
265  Scalar &operator()(const int i, const int j, const int k, const int l)
266  {
267  int uid = i + 3 * j + 9 * k + 27 * l;
268 
269  if (uid == 0) return data[0]; // [0000]
270  else if (uid == 27 || uid == 3) return data[1]; // [0001] [0100]
271  else if (uid == 54 || uid == 6) return data[2]; // [0002] [0200]
272  else if (uid == 9 || uid == 1) return data[3]; // [0010] [1000]
273  else if (uid == 36 || uid == 4) return data[4]; // [0011] [1100]
274  else if (uid == 63 || uid == 7) return data[5]; // [0012] [1200]
275  else if (uid == 18 || uid == 2) return data[6]; // [0020] [2000]
276  else if (uid == 45 || uid == 5) return data[7]; // [0021] [2100]
277  else if (uid == 72 || uid == 8) return data[8]; // [0022] [2200]
278  else if (uid == 30) return data[9]; // [0101]
279  else if (uid == 57 || uid == 33) return data[10]; // [0102] [0201]
280  else if (uid == 12 || uid == 28) return data[11]; // [0110] [1001]
281  else if (uid == 39 || uid == 31) return data[12]; // [0111] [1101]
282  else if (uid == 66 || uid == 34) return data[13]; // [0112] [1201]
283  else if (uid == 21 || uid == 29) return data[14]; // [0120] [2001]
284  else if (uid == 48 || uid == 32) return data[15]; // [0121] [2101]
285  else if (uid == 75 || uid == 35) return data[16]; // [0122] [2201]
286  else if (uid == 60) return data[17]; // [0202]
287  else if (uid == 15 || uid == 55) return data[18]; // [0210] [1002]
288  else if (uid == 42 || uid == 58) return data[19]; // [0211] [1102]
289  else if (uid == 69 || uid == 61) return data[20]; // [0212] [1202]
290  else if (uid == 24 || uid == 56) return data[21]; // [0220] [2002]
291  else if (uid == 51 || uid == 59) return data[22]; // [0221] [2102]
292  else if (uid == 78 || uid == 62) return data[23]; // [0222] [2202]
293  else if (uid == 10) return data[24]; // [1010]
294  else if (uid == 37 || uid == 13) return data[25]; // [1011] [1110]
295  else if (uid == 64 || uid == 16) return data[26]; // [1012] [1210]
296  else if (uid == 19 || uid == 11) return data[27]; // [1020] [2010]
297  else if (uid == 46 || uid == 14) return data[28]; // [1021] [2110]
298  else if (uid == 73 || uid == 17) return data[29]; // [1022] [2210]
299  else if (uid == 40) return data[30]; // [1111]
300  else if (uid == 67 || uid == 43) return data[31]; // [1112] [1211]
301  else if (uid == 22 || uid == 38) return data[32]; // [1120] [2011]
302  else if (uid == 49 || uid == 41) return data[33]; // [1121] [2111]
303  else if (uid == 76 || uid == 44) return data[34]; // [1122] [2211]
304  else if (uid == 70) return data[35]; // [1212]
305  else if (uid == 25 || uid == 65) return data[36]; // [1220] [2012]
306  else if (uid == 52 || uid == 68) return data[37]; // [1221] [2112]
307  else if (uid == 79 || uid == 71) return data[38]; // [1222] [2212]
308  else if (uid == 20) return data[39]; // [2020]
309  else if (uid == 47 || uid == 23) return data[40]; // [2021] [2120]
310  else if (uid == 74 || uid == 26) return data[41]; // [2022] [2220]
311  else if (uid == 50) return data[42]; // [2121]
312  else if (uid == 77 || uid == 53) return data[43]; // [2122] [2221]
313  else if (uid == 80) return data[44]; // [2222]
314  else
315  Util::Abort(INFO, "Index out of range");
316  return Set::Garbage;
317  }
318 
319 
320  AMREX_FORCE_INLINE
321  const Scalar &operator()(const int i, const int j, const int k, const int l) const
322  {
323  int uid = i + 3 * j + 9 * k + 27 * l;
324 
325  if (uid == 0) return data[0]; // [0000]
326  else if (uid == 27 || uid == 3) return data[1]; // [0001] [0100]
327  else if (uid == 54 || uid == 6) return data[2]; // [0002] [0200]
328  else if (uid == 9 || uid == 1) return data[3]; // [0010] [1000]
329  else if (uid == 36 || uid == 4) return data[4]; // [0011] [1100]
330  else if (uid == 63 || uid == 7) return data[5]; // [0012] [1200]
331  else if (uid == 18 || uid == 2) return data[6]; // [0020] [2000]
332  else if (uid == 45 || uid == 5) return data[7]; // [0021] [2100]
333  else if (uid == 72 || uid == 8) return data[8]; // [0022] [2200]
334  else if (uid == 30) return data[9]; // [0101]
335  else if (uid == 57 || uid == 33) return data[10]; // [0102] [0201]
336  else if (uid == 12 || uid == 28) return data[11]; // [0110] [1001]
337  else if (uid == 39 || uid == 31) return data[12]; // [0111] [1101]
338  else if (uid == 66 || uid == 34) return data[13]; // [0112] [1201]
339  else if (uid == 21 || uid == 29) return data[14]; // [0120] [2001]
340  else if (uid == 48 || uid == 32) return data[15]; // [0121] [2101]
341  else if (uid == 75 || uid == 35) return data[16]; // [0122] [2201]
342  else if (uid == 60) return data[17]; // [0202]
343  else if (uid == 15 || uid == 55) return data[18]; // [0210] [1002]
344  else if (uid == 42 || uid == 58) return data[19]; // [0211] [1102]
345  else if (uid == 69 || uid == 61) return data[20]; // [0212] [1202]
346  else if (uid == 24 || uid == 56) return data[21]; // [0220] [2002]
347  else if (uid == 51 || uid == 59) return data[22]; // [0221] [2102]
348  else if (uid == 78 || uid == 62) return data[23]; // [0222] [2202]
349  else if (uid == 10) return data[24]; // [1010]
350  else if (uid == 37 || uid == 13) return data[25]; // [1011] [1110]
351  else if (uid == 64 || uid == 16) return data[26]; // [1012] [1210]
352  else if (uid == 19 || uid == 11) return data[27]; // [1020] [2010]
353  else if (uid == 46 || uid == 14) return data[28]; // [1021] [2110]
354  else if (uid == 73 || uid == 17) return data[29]; // [1022] [2210]
355  else if (uid == 40) return data[30]; // [1111]
356  else if (uid == 67 || uid == 43) return data[31]; // [1112] [1211]
357  else if (uid == 22 || uid == 38) return data[32]; // [1120] [2011]
358  else if (uid == 49 || uid == 41) return data[33]; // [1121] [2111]
359  else if (uid == 76 || uid == 44) return data[34]; // [1122] [2211]
360  else if (uid == 70) return data[35]; // [1212]
361  else if (uid == 25 || uid == 65) return data[36]; // [1220] [2012]
362  else if (uid == 52 || uid == 68) return data[37]; // [1221] [2112]
363  else if (uid == 79 || uid == 71) return data[38]; // [1222] [2212]
364  else if (uid == 20) return data[39]; // [2020]
365  else if (uid == 47 || uid == 23) return data[40]; // [2021] [2120]
366  else if (uid == 74 || uid == 26) return data[41]; // [2022] [2220]
367  else if (uid == 50) return data[42]; // [2121]
368  else if (uid == 77 || uid == 53) return data[43]; // [2122] [2221]
369  else if (uid == 80) return data[44]; // [2222]
370  else
371  Util::Abort(INFO, "Index out of range");
372  return Set::Garbage;
373  }
374 
376  {
377  Set::Scalar retsq = 0;
378  for (int i = 0; i < 45; i++) retsq += data[i]*data[i];
379  return std::sqrt(retsq);
380  }
381 
382 
383  void Print(std::ostream &os)
384  {
385  for (int i = 0; i < 45; i++)
386  os << "i = " << i << " " << data[i] << std::endl;
387 
388  os.precision(4);
389  for (int k = 0; k < 3; k++)
390  {
391  for (int i = -1; i < 4; i++)
392  {
393  for (int l = 0; l < 3; l++)
394  {
395  if (i == -1)
396  os << "┌ ┐ ";
397  else if (i == 3)
398  os << "└ ┘ ";
399  else
400  {
401  os << "│ ";
402  for (int j = 0; j < 3; j++)
403  {
404  const Set::Scalar &val = (*this)(i, j, k, l);
405  os << std::scientific << std::setw(11) << val; //(fabs(val)>1E-10 ? val : 0);
406  os << " ";
407  }
408  os << "│ ";
409  }
410  }
411  os << std::endl;
412  }
413  }
414  }
415  //AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
416  //void operator=(const Matrix4<3, Sym::Major> &a) { for (int i = 0; i < 45; i++) data[i] = a.data[i]; }
417  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
418  void operator+=(const Matrix4<3, Sym::Major> &a) { for (int i = 0; i < 45; i++) data[i] += a.data[i]; }
419  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
420  void operator-=(const Matrix4<3, Sym::Major> &a) { for (int i = 0; i < 45; i++) data[i] -= a.data[i]; }
421  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
422  void operator*=(const Matrix4<3, Sym::Major> &a) { for (int i = 0; i < 45; i++) data[i] *= a.data[i]; }
423  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
424  void operator/=(const Matrix4<3, Sym::Major> &a) { for (int i = 0; i < 45; i++) data[i] /= a.data[i]; }
425  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
426  void operator*=(const Set::Scalar &alpha) { for (int i = 0; i < 45; i++) data[i] *= alpha; }
427  AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
428  void operator/=(const Set::Scalar &alpha) { for (int i = 0; i < 45; i++) data[i] /= alpha; }
429 
431  {
433  for (int i = 0; i < 45; i++) ret.data[i] = (Set::Scalar)i;
434  return ret;
435  }
437  {
439  for (int i = 0; i < 45; i++) ret.data[i] = (Util::Random());
440  return ret;
441  }
443  {
445  for (int i = 0; i < 45; i++) ret.data[i] = 0.0;
446  return ret;
447  }
449  {
450  Set::Scalar normsq = 0.0;
451  for (int i = 0; i < 45; i++) normsq += data[i]*data[i];
452  return std::sqrt(normsq);
453  }
454  bool contains_nan() const
455  {
456  for (int i = 0; i < 45; i++)
457  if (std::isnan(data[i])) return true;
458  return false;
459  }
460 
463  friend Set::Matrix operator*(const Matrix4<3, Sym::Major> &a, const Set::Matrix &b);
467 };
468 
469 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
471 {
473  for (int i = 0; i < 45; i++) ret.data[i] = a.data[i] + b.data[i];
474  return ret;
475 }
476 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
478 {
480  for (int i = 0; i < 45; i++) ret.data[i] = a.data[i] - b.data[i];
481  return ret;
482 }
483 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
485 {
487  for (int i = 0; i < 45; i++) ret.data[i] = a.data[i] * b;
488  return ret;
489 }
490 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
492 {
493  return a*b;
494 }
495 
496 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
498 {
500  for (int i = 0; i < 45; i++) ret.data[i] = a.data[i] / b;
501  return ret;
502 }
503 
504 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
506 {
507  Set::Matrix ret;
508  ret(0,0) = a.data[ 0]*b(0,0) + a.data[ 1]*b(0,1) + a.data[ 2]*b(0,2) + a.data[ 3]*b(1,0) + a.data[ 4]*b(1,1) + a.data[ 5]*b(1,2) + a.data[ 6]*b(2,0) + a.data[ 7]*b(2,1) + a.data[ 8]*b(2,2);
509  ret(0,1) = a.data[ 1]*b(0,0) + a.data[ 9]*b(0,1) + a.data[10]*b(0,2) + a.data[11]*b(1,0) + a.data[12]*b(1,1) + a.data[13]*b(1,2) + a.data[14]*b(2,0) + a.data[15]*b(2,1) + a.data[16]*b(2,2);
510  ret(0,2) = a.data[ 2]*b(0,0) + a.data[10]*b(0,1) + a.data[17]*b(0,2) + a.data[18]*b(1,0) + a.data[19]*b(1,1) + a.data[20]*b(1,2) + a.data[21]*b(2,0) + a.data[22]*b(2,1) + a.data[23]*b(2,2);
511  ret(1,0) = a.data[ 3]*b(0,0) + a.data[11]*b(0,1) + a.data[18]*b(0,2) + a.data[24]*b(1,0) + a.data[25]*b(1,1) + a.data[26]*b(1,2) + a.data[27]*b(2,0) + a.data[28]*b(2,1) + a.data[29]*b(2,2);
512  ret(1,1) = a.data[ 4]*b(0,0) + a.data[12]*b(0,1) + a.data[19]*b(0,2) + a.data[25]*b(1,0) + a.data[30]*b(1,1) + a.data[31]*b(1,2) + a.data[32]*b(2,0) + a.data[33]*b(2,1) + a.data[34]*b(2,2);
513  ret(1,2) = a.data[ 5]*b(0,0) + a.data[13]*b(0,1) + a.data[20]*b(0,2) + a.data[26]*b(1,0) + a.data[31]*b(1,1) + a.data[35]*b(1,2) + a.data[36]*b(2,0) + a.data[37]*b(2,1) + a.data[38]*b(2,2);
514  ret(2,0) = a.data[ 6]*b(0,0) + a.data[14]*b(0,1) + a.data[21]*b(0,2) + a.data[27]*b(1,0) + a.data[32]*b(1,1) + a.data[36]*b(1,2) + a.data[39]*b(2,0) + a.data[40]*b(2,1) + a.data[41]*b(2,2);
515  ret(2,1) = a.data[ 7]*b(0,0) + a.data[15]*b(0,1) + a.data[22]*b(0,2) + a.data[28]*b(1,0) + a.data[33]*b(1,1) + a.data[37]*b(1,2) + a.data[40]*b(2,0) + a.data[42]*b(2,1) + a.data[43]*b(2,2);
516  ret(2,2) = a.data[ 8]*b(0,0) + a.data[16]*b(0,1) + a.data[23]*b(0,2) + a.data[29]*b(1,0) + a.data[34]*b(1,1) + a.data[38]*b(1,2) + a.data[41]*b(2,0) + a.data[43]*b(2,1) + a.data[44]*b(2,2);
517  return ret;
518 }
519 
520 AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE
522 {
523  // TODO: improve efficiency of this method
524  Set::Vector ret = Set::Vector::Zero();
525  for (int i = 0; i < AMREX_SPACEDIM; i++)
526  {
527  for (int J = 0; J < AMREX_SPACEDIM; J++)
528  for (int k = 0; k < AMREX_SPACEDIM; k++)
529  for (int L = 0; L < AMREX_SPACEDIM; L++)
530  ret(i) += a(i,J,k,L) * b(k,L,J);
531  }
532  return ret;
533 }
534 
535 }
536 #endif
Set::Matrix4< 2, Sym::Major >::operator/=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator/=(const Matrix4< 2, Sym::Major > &a)
Definition: Matrix4_Major.H:123
Set::Garbage
static Scalar Garbage
Definition: Base.H:118
Set::operator+
AMREX_FORCE_INLINE Quaternion operator+(const Quaternion a, const Quaternion b)
Definition: Base.H:92
Set::operator-
AMREX_FORCE_INLINE Quaternion operator-(const Quaternion a, const Quaternion b)
Definition: Base.H:100
Set::Matrix4< 3, Sym::Major >::norm
Set::Scalar norm()
Definition: Matrix4_Major.H:448
Set::Matrix4< 3, Sym::Major >::data
Scalar data[45]
Definition: Matrix4_Major.H:225
Set::Sym
Sym
Definition: Base.H:197
Set::Matrix4< 3, Sym::Major >::Randomize
static Matrix4< 3, Sym::Major > Randomize()
Definition: Matrix4_Major.H:436
Set::Matrix4< 3, Sym::Major >::Increment
static Matrix4< 3, Sym::Major > Increment()
Definition: Matrix4_Major.H:430
Set::Major
@ Major
Definition: Base.H:197
Set::Matrix4< 2, Sym::Major >::operator-=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator-=(const Matrix4< 2, Sym::Major > &a)
Definition: Matrix4_Major.H:119
Set::Matrix4< 2, Sym::Major >::Norm
Set::Scalar Norm()
Definition: Matrix4_Major.H:147
Set::Matrix4< 2, Sym::Major >::data
Scalar data[10]
Definition: Matrix4_Major.H:12
Set::Matrix4< 3, Sym::Major >::operator*=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator*=(const Matrix4< 3, Sym::Major > &a)
Definition: Matrix4_Major.H:422
Set::Matrix4< 2, Sym::Major >::contains_nan
bool contains_nan() const
Definition: Matrix4_Major.H:153
Base.H
Set::Vector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition: Base.H:20
Set::operator*
AMREX_FORCE_INLINE Quaternion operator*(const Set::Scalar alpha, const Quaternion b)
Definition: Base.H:78
Set::Matrix4< 2, Sym::Major >::Matrix4
AMREX_GPU_HOST_DEVICE Matrix4()
Definition: Matrix4_Major.H:16
Set::Matrix4< 2, Sym::Major >::Zero
static Matrix4< 2, Sym::Major > Zero()
Definition: Matrix4_Major.H:141
Set::Matrix4< 2, Sym::Major >::operator*=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator*=(const Matrix4< 2, Sym::Major > &a)
Definition: Matrix4_Major.H:121
Util::Random
Set::Scalar Random()
Definition: Set.cpp:9
Set::Scalar
amrex::Real Scalar
Definition: Base.H:19
Set
A collection of data types and symmetry-reduced data structures.
Definition: Base.H:17
Set::Matrix4< 3, Sym::Major >::operator()
AMREX_FORCE_INLINE Scalar & operator()(const int i, const int j, const int k, const int l)
Definition: Matrix4_Major.H:265
Set::Matrix3
Definition: Matrix3.H:8
Set::Matrix
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition: Base.H:23
Set::Matrix4< 2, Sym::Major >::Increment
static Matrix4< 2, Sym::Major > Increment()
Definition: Matrix4_Major.H:129
Set::Matrix4< 2, Sym::Major >
Definition: Matrix4_Major.H:10
Set::Matrix4< 3, Sym::Major >::Print
void Print(std::ostream &os)
Definition: Matrix4_Major.H:383
Set::Matrix4< 3, Sym::Major >::operator+=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator+=(const Matrix4< 3, Sym::Major > &a)
Definition: Matrix4_Major.H:418
Set::Matrix4< 3, Sym::Major >::Matrix4
AMREX_GPU_HOST_DEVICE Matrix4()
Definition: Matrix4_Major.H:232
Set::Matrix4< 3, Sym::Major >::operator/=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator/=(const Matrix4< 3, Sym::Major > &a)
Definition: Matrix4_Major.H:424
Set::Matrix4< 3, Sym::Major >::operator()
const AMREX_FORCE_INLINE Scalar & operator()(const int i, const int j, const int k, const int l) const
Definition: Matrix4_Major.H:321
Set::Matrix4< 3, Sym::Major >
Definition: Matrix4_Major.H:223
Set::Matrix4< 3, Sym::Major >::operator-=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator-=(const Matrix4< 3, Sym::Major > &a)
Definition: Matrix4_Major.H:420
Set::Matrix4< 3, Sym::Major >::operator*=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator*=(const Set::Scalar &alpha)
Definition: Matrix4_Major.H:426
Util::Abort
void Abort(const char *msg)
Definition: Util.cpp:165
Set::operator/
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE Matrix4< AMREX_SPACEDIM, Sym::Diagonal > operator/(const Matrix4< AMREX_SPACEDIM, Sym::Diagonal > &a, const Set::Scalar &b)
Definition: Matrix4_Diagonal.H:130
Set::Matrix4
Definition: Base.H:198
Set::Matrix4< 3, Sym::Major >::operator/=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator/=(const Set::Scalar &alpha)
Definition: Matrix4_Major.H:428
Set::Matrix4< 3, Sym::Major >::Zero
static Matrix4< 3, Sym::Major > Zero()
Definition: Matrix4_Major.H:442
Set::Matrix4< 2, Sym::Major >::operator*=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator*=(const Set::Scalar &alpha)
Definition: Matrix4_Major.H:125
Set::Matrix4< 2, Sym::Major >::Print
void Print(std::ostream &os)
Definition: Matrix4_Major.H:85
Set::Matrix4< 2, Sym::Major >::operator+=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator+=(const Matrix4< 2, Sym::Major > &a)
Definition: Matrix4_Major.H:117
Set::Matrix4< 2, Sym::Major >::operator()
const AMREX_FORCE_INLINE Scalar & operator()(const int i, const int j, const int k, const int l) const
Definition: Matrix4_Major.H:49
INFO
#define INFO
Definition: Util.H:20
Set::Matrix4< 3, Sym::Major >::contains_nan
bool contains_nan() const
Definition: Matrix4_Major.H:454
Set::Matrix4< 2, Sym::Major >::operator()
AMREX_FORCE_INLINE Scalar & operator()(const int i, const int j, const int k, const int l)
Definition: Matrix4_Major.H:68
Set::Matrix4< 2, Sym::Major >::Randomize
static Matrix4< 2, Sym::Major > Randomize()
Definition: Matrix4_Major.H:135
Set::Matrix4< 2, Sym::Major >::operator/=
AMREX_FORCE_INLINE AMREX_GPU_HOST_DEVICE void operator/=(const Set::Scalar &alpha)
Definition: Matrix4_Major.H:127
Set::Matrix4< 3, Sym::Major >::Norm
Set::Scalar Norm()
Definition: Matrix4_Major.H:375