OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
TSVMetaDotDot.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 /***************************************************************************
3  *
4  * The IPPL Framework
5  *
6  *
7  * Visit http://people.web.psi.ch/adelmann/ for more details
8  *
9  ***************************************************************************/
10 
11 #ifndef TSV_META_DOT_DOT_H
12 #define TSV_META_DOT_DOT_H
13 
15 //
16 // Definition of the struct TSV_MetaDotDot.
17 //
19 
20 template<class T1, class T2> struct TSV_MetaDotDot {};
21 
23 //
24 // Specializations for Tenzor dot-dot Tenzor
25 //
27 
28 template<class T1, class T2, unsigned D>
29 struct TSV_MetaDotDot< Tenzor<T1,D> , Tenzor<T2,D> >
30 {
32  inline static T0
33  apply(const Tenzor<T1,D>& lhs, const Tenzor<T2,D>& rhs) {
34  T0 sum = 0.0;
35  for (unsigned int i=0; i<D; ++i)
36  for (unsigned int j=0; j<D; ++j)
37  sum += lhs(i,j) * rhs(i,j);
38 
39  return sum;
40  }
41 };
42 
43 template<class T1, class T2>
44 struct TSV_MetaDotDot< Tenzor<T1,1> , Tenzor<T2,1> >
45 {
47  inline static T0
48  apply(const Tenzor<T1,1>& lhs, const Tenzor<T2,1>& rhs) {
49  return lhs[0]*rhs[0];
50  }
51 };
52 
53 template<class T1, class T2>
54 struct TSV_MetaDotDot< Tenzor<T1,2> , Tenzor<T2,2> >
55 {
57  inline static T0
58  apply(const Tenzor<T1,2>& lhs, const Tenzor<T2,2>& rhs) {
59  return lhs[0] * rhs[0] + lhs[1] * rhs[1] +
60  lhs[2] * rhs[2] + lhs[3] * rhs[3];
61  }
62 };
63 
64 template<class T1, class T2>
65 struct TSV_MetaDotDot< Tenzor<T1,3> , Tenzor<T2,3> >
66 {
68  inline static T0
69  apply(const Tenzor<T1,3>& lhs, const Tenzor<T2,3>& rhs) {
70  return lhs[0] * rhs[0] + lhs[1] * rhs[1] +
71  lhs[2] * rhs[2] + lhs[3] * rhs[3] + lhs[4] * rhs[4] +
72  lhs[5] * rhs[5] + lhs[6] * rhs[6] + lhs[7] * rhs[7] +
73  lhs[8] * rhs[8];
74  }
75 };
76 
78 //
79 // Specializations for SymTenzor dot-dot SymTenzor
80 //
82 
83 template<class T1, class T2, unsigned D>
84 struct TSV_MetaDotDot< SymTenzor<T1,D> , SymTenzor<T2,D> >
85 {
87  inline static T0
88  apply(const SymTenzor<T1,D>& lhs, const SymTenzor<T2,D>& rhs) {
89  T0 sum = 0.0;
90  for (unsigned int i=0; i<D; ++i)
91  sum += lhs.HL(i, i) * rhs.HL(i, i);
92 
93  for (unsigned int i=0; i<D; ++i)
94  for (unsigned int j=i+1; j<D; ++j)
95  sum += 2.0 * lhs.HL(j, i) * rhs.HL(j, i);
96 
97  return sum;
98  }
99 };
100 
101 template<class T1, class T2>
102 struct TSV_MetaDotDot< SymTenzor<T1,1> , SymTenzor<T2,1> >
103 {
105  inline static T0
106  apply(const SymTenzor<T1,1>& lhs, const SymTenzor<T2,1>& rhs) {
107  return lhs[0] * rhs[0];
108  }
109 };
110 
111 template<class T1, class T2>
112 struct TSV_MetaDotDot< SymTenzor<T1,2> , SymTenzor<T2,2> >
113 {
115  inline static T0
116  apply(const SymTenzor<T1,2>& lhs, const SymTenzor<T2,2>& rhs) {
117  return lhs(0,0) * rhs(0,0) + lhs(1,1) * rhs(1,1) +
118  2.0 * lhs(0,1) * rhs(0,1);
119  }
120 };
121 
122 template<class T1, class T2>
123 struct TSV_MetaDotDot< SymTenzor<T1,3> , SymTenzor<T2,3> >
124 {
126  inline static T0
127  apply(const SymTenzor<T1,3>& lhs, const SymTenzor<T2,3>& rhs) {
128  return lhs(0,0) * rhs(0,0) + lhs(1,1) * rhs(1,1) + lhs(2,2) * rhs(2,2) +
129  2.0 * (lhs(0,1) * rhs(0,1) + lhs(0,2) * rhs(0,2) +
130  lhs(1,2) * rhs(1,2));
131  }
132 };
133 
135 //
136 // Specializations for SymTenzor dot-dot Tenzor
137 //
139 
140 template<class T1, class T2, unsigned D>
141 struct TSV_MetaDotDot< SymTenzor<T1,D> , Tenzor<T2,D> >
142 {
144  inline static T0
145  apply(const SymTenzor<T1,D>& lhs, const Tenzor<T2,D>& rhs) {
146  T0 sum = 0.0;
147  for (unsigned int i=0; i<D; ++i)
148  for (unsigned int j=0; j<D; ++j)
149  sum += lhs(i,j) * rhs(i,j);
150 
151  return sum;
152  }
153 };
154 
155 template<class T1, class T2>
156 struct TSV_MetaDotDot< SymTenzor<T1,1> , Tenzor<T2,1> >
157 {
159  inline static T0
160  apply(const SymTenzor<T1,1>& lhs, const Tenzor<T2,1>& rhs) {
161  return lhs[0]*rhs[0];
162  }
163 };
164 
165 template<class T1, class T2>
166 struct TSV_MetaDotDot< SymTenzor<T1,2> , Tenzor<T2,2> >
167 {
169  inline static T0
170  apply(const SymTenzor<T1,2>& lhs, const Tenzor<T2,2>& rhs) {
171  return lhs(0,0) * rhs(0,0) + lhs(0,1) * (rhs(0,1) + rhs(1,0)) +
172  lhs(1,1) * rhs(1,1);
173  }
174 };
175 
176 template<class T1, class T2>
177 struct TSV_MetaDotDot< SymTenzor<T1,3> , Tenzor<T2,3> >
178 {
180  inline static T0
181  apply(const SymTenzor<T1,3>& lhs, const Tenzor<T2,3>& rhs) {
182  return lhs(0,0) * rhs(0,0) + lhs(0,1) * (rhs(0,1) + rhs(1,0)) +
183  + lhs(0,2) * (rhs(0,2) + rhs(2,0)) + lhs(1,1) * rhs(1,1) +
184  lhs(1,2) * (rhs(1,2) + rhs(2,1)) + lhs(2,2) * rhs(2,2);
185  }
186 };
187 
189 //
190 // Specializations for Tenzor dot-dot SymTenzor
191 //
193 
194 template<class T1, class T2, unsigned D>
195 struct TSV_MetaDotDot< Tenzor<T1,D> , SymTenzor<T2,D> >
196 {
198  inline static T0
199  apply(const Tenzor<T1,D>& lhs, const SymTenzor<T2,D>& rhs) {
200  T0 sum = 0.0;
201  for (unsigned int i=0; i<D; ++i)
202  for (unsigned int j=0; j<D; ++j)
203  sum += lhs(i,j) * rhs(j,j);
204 
205  return sum;
206  }
207 };
208 
209 template<class T1, class T2>
210 struct TSV_MetaDotDot< Tenzor<T1,1> , SymTenzor<T2,1> >
211 {
213  inline static T0
214  apply(const Tenzor<T1,1>& lhs, const SymTenzor<T2,1>& rhs) {
215  return lhs[0]*rhs[0];
216  }
217 };
218 
219 template<class T1, class T2>
220 struct TSV_MetaDotDot< Tenzor<T1,2> , SymTenzor<T2,2> >
221 {
223  inline static T0
224  apply(const Tenzor<T1,2>& lhs, const SymTenzor<T2,2>& rhs) {
225  return lhs(0,0) * rhs(0,0) + (lhs(0,1) + lhs(1,0)) * rhs(0,1) +
226  lhs(1,1) * rhs(1,1);
227  }
228 };
229 
230 template<class T1, class T2>
231 struct TSV_MetaDotDot< Tenzor<T1,3> , SymTenzor<T2,3> >
232 {
234  inline static T0
235  apply(const Tenzor<T1,3>& lhs, const SymTenzor<T2,3>& rhs) {
236  return lhs(0,0) * rhs(0,0) + (lhs(0,1) + lhs(1,0)) * rhs(0,1) +
237  lhs(1,1) * rhs(1,1) + (lhs(0,2) + lhs(2,0)) * rhs(0,2) +
238  (lhs(1,2) + lhs(2,1)) * rhs(1,2) + lhs(2,2) * rhs(2,2);
239  }
240 };
241 
243 //
244 // Specializations for AntiSymTenzor dot-dot AntiSymTenzor
245 //
247 
248 template<class T1, class T2, unsigned D>
250 {
252  inline static T0
254  T0 sum = lhs[0]*rhs[0];
255  for ( int i=1; i<D*(D-1)/2; ++i)
256  sum += lhs[i]*rhs[i];
257  return sum+sum;
258  }
259 };
260 
261 template<class T1, class T2>
263 {
265  inline static T0
267  T0 sum = lhs[0]*rhs[0];
268  return sum+sum;
269  }
270 };
271 
272 template<class T1, class T2>
274 {
276  inline static T0
278  T0 sum = lhs[0]*rhs[0]+lhs[1]*rhs[1]+lhs[2]*rhs[2];
279  return sum+sum;
280  }
281 };
282 
284 
285 #endif // TSV_META_DOT_DOT_H
286 
287 /***************************************************************************
288  * $RCSfile: TSVMetaDotDot.h,v $
289  * $Revision: 1.1.1.1 $
290  * IPPL_VERSION_ID: $Id: TSVMetaDotDot.h,v 1.1.1.1 2003/01/23 07:40:24 adelmann Exp $
291  ***************************************************************************/
292 
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
static T0 apply(const SymTenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)
static T0 apply(const Tenzor< T1, D > &lhs, const SymTenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:56
static T0 apply(const SymTenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:67
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:31
static T0 apply(const SymTenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:46
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
Definition: PETE.h:1213
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const AntiSymTenzor< T1, 2 > &lhs, const AntiSymTenzor< T2, 2 > &rhs)
static T0 apply(const Tenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
Definition: TSVMetaDotDot.h:58
static T0 apply(const Tenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
static T0 apply(const AntiSymTenzor< T1, 3 > &lhs, const AntiSymTenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, D > &lhs, const SymTenzor< T2, D > &rhs)
Definition: TSVMetaDotDot.h:88
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Element_t HL(unsigned int hi, unsigned int lo) const
Definition: SymTenzor.h:215
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
Definition: TSVMetaDotDot.h:33
PETE_ComputeBinaryType< PETE_Type2Index< T1 >::val, PETE_Type2Index< T2 >::val, Op::tag >::type type
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:86
static T0 apply(const AntiSymTenzor< T1, D > &lhs, const AntiSymTenzor< T2, D > &rhs)
static T0 apply(const SymTenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
static T0 apply(const Tenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
Definition: TSVMetaDotDot.h:69
static T0 apply(const SymTenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)
Definition: TSVMetaDotDot.h:48
PETEBinaryReturn< T1, T2, OpMultipply >::type T0