OPAL (Object Oriented Parallel Accelerator Library) 2022.1
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
20template<class T1, class T2> struct TSV_MetaDotDot {};
21
23//
24// Specializations for Tenzor dot-dot Tenzor
25//
27
28template<class T1, class T2, unsigned D>
29struct 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
43template<class T1, class T2>
44struct 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
53template<class T1, class T2>
54struct 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
64template<class T1, class T2>
65struct 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
83template<class T1, class T2, unsigned D>
84struct 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
101template<class T1, class T2>
102struct 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
111template<class T1, class T2>
112struct 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
122template<class T1, class T2>
123struct 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
140template<class T1, class T2, unsigned D>
141struct 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
155template<class T1, class T2>
156struct 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
165template<class T1, class T2>
166struct 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
176template<class T1, class T2>
177struct 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
194template<class T1, class T2, unsigned D>
195struct 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
209template<class T1, class T2>
210struct 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
219template<class T1, class T2>
220struct 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
230template<class T1, class T2>
231struct 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
248template<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
261template<class T1, class T2>
263{
265 inline static T0
267 T0 sum = lhs[0]*rhs[0];
268 return sum+sum;
269 }
270};
271
272template<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
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
Definition: PETE.h:1111
Definition: Tenzor.h:35
Element_t HL(unsigned int hi, unsigned int lo) const
Definition: SymTenzor.h:215
static T0 apply(const Tenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
Definition: TSVMetaDotDot.h:33
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:31
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:46
static T0 apply(const Tenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)
Definition: TSVMetaDotDot.h:48
static T0 apply(const Tenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
Definition: TSVMetaDotDot.h:58
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:56
static T0 apply(const Tenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
Definition: TSVMetaDotDot.h:69
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:67
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
Definition: TSVMetaDotDot.h:86
static T0 apply(const SymTenzor< T1, D > &lhs, const SymTenzor< T2, D > &rhs)
Definition: TSVMetaDotDot.h:88
static T0 apply(const SymTenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
static T0 apply(const SymTenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const SymTenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
static T0 apply(const SymTenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
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
static T0 apply(const Tenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
static T0 apply(const Tenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const Tenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const AntiSymTenzor< T1, D > &lhs, const AntiSymTenzor< T2, D > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
static T0 apply(const AntiSymTenzor< T1, 2 > &lhs, const AntiSymTenzor< T2, 2 > &rhs)
static T0 apply(const AntiSymTenzor< T1, 3 > &lhs, const AntiSymTenzor< T2, 3 > &rhs)
PETEBinaryReturn< T1, T2, OpMultipply >::type T0
PETE_ComputeBinaryType< T1, T2, Op, Op::tag >::type type