OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
TSVMetaAssign.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_ASSIGN_H
12 #define TSV_META_ASSIGN_H
13 
15 //
16 // Definition of structs TSV_MetaAssign and TSV_MetaAssignScalar
17 //
19 
20 template<class T1, class T2, class OP> struct TSV_MetaAssign {};
21 template<class T1, class T2, class OP> struct TSV_MetaAssignScalar {};
22 
24 //
25 // Specializations for Vektors of arbitrary size.
26 //
28 
29 template<class T1, class T2, class OP, unsigned D>
30 struct TSV_MetaAssign< Vektor<T1,D> , Vektor<T2,D> , OP >
31 {
32  inline static void
33  apply( Vektor<T1,D>& lhs, const Vektor<T2,D>& rhs) {
34  for (unsigned d=0; d<D; ++d)
35  PETE_apply( OP(), lhs[d] , rhs[d]);
36  }
37 };
38 
39 template<class T1, class T2, class OP, unsigned D>
40 struct TSV_MetaAssignScalar< Vektor<T1,D> , T2 , OP >
41 {
42  inline static void
43  apply( Vektor<T1,D>& lhs, T2 rhs ) {
44  for (unsigned d=0; d<D; ++d)
45  PETE_apply( OP(), lhs[d] , rhs);
46  }
47 };
48 
50 //
51 // Specializations for Vektors with D=1.
52 //
54 
55 template<class T1, class T2, class OP>
56 struct TSV_MetaAssign< Vektor<T1,1> , Vektor<T2,1> , OP >
57 {
58  inline static void
59  apply( Vektor<T1,1>& lhs, const Vektor<T2,1>& rhs) {
60  PETE_apply( OP(), lhs[0] , rhs[0] );
61  }
62 };
63 
64 template<class T1, class T2, class OP>
65 struct TSV_MetaAssignScalar< Vektor<T1,1> , T2 , OP >
66 {
67  inline static void
68  apply( Vektor<T1,1>& lhs, T2 rhs ) {
69  PETE_apply( OP(), lhs[0] , rhs );
70  }
71 };
72 
74 //
75 // Specializations for Vektors with D=2.
76 //
78 
79 template<class T1, class T2, class OP>
80 struct TSV_MetaAssign< Vektor<T1,2> , Vektor<T2,2> , OP >
81 {
82  inline static void
83  apply( Vektor<T1,2>& lhs, const Vektor<T2,2>& rhs) {
84  PETE_apply( OP(), lhs[0] , rhs[0] );
85  PETE_apply( OP(), lhs[1] , rhs[1] );
86  }
87 };
88 
89 template<class T1, class T2, class OP>
90 struct TSV_MetaAssignScalar< Vektor<T1,2> , T2 , OP >
91 {
92  inline static void
93  apply( Vektor<T1,2>& lhs, T2 rhs ) {
94  PETE_apply( OP(), lhs[0] , rhs );
95  PETE_apply( OP(), lhs[1] , rhs );
96  }
97 };
98 
100 //
101 // Specializations for Vektors with D=3.
102 //
104 
105 template<class T1, class T2, class OP>
106 struct TSV_MetaAssign< Vektor<T1,3> , Vektor<T2,3> , OP >
107 {
108  inline static void
109  apply( Vektor<T1,3>& lhs, const Vektor<T2,3>& rhs) {
110  PETE_apply( OP(), lhs[0] , rhs[0] );
111  PETE_apply( OP(), lhs[1] , rhs[1] );
112  PETE_apply( OP(), lhs[2] , rhs[2] );
113  }
114 };
115 
116 template<class T1, class T2, class OP>
117 struct TSV_MetaAssignScalar< Vektor<T1,3> , T2 , OP >
118 {
119  inline static void
120  apply( Vektor<T1,3>& lhs, T2 rhs ) {
121  PETE_apply( OP(), lhs[0] , rhs );
122  PETE_apply( OP(), lhs[1] , rhs );
123  PETE_apply( OP(), lhs[2] , rhs );
124  }
125 };
126 
128 //
129 // The default definitions for Tenzors of arbitrary size.
130 //
132 
133 template<class T1, class T2, class OP, unsigned D>
134 struct TSV_MetaAssign< Tenzor<T1,D> , Tenzor<T2,D> , OP >
135 {
136  inline static void
137  apply( Tenzor<T1,D>& lhs, const Tenzor<T2,D>& rhs) {
138  for (unsigned d=0; d<D*D; ++d)
139  PETE_apply( OP(), lhs[d] , rhs[d]);
140  }
141 };
142 
143 template<class T1, class T2, class OP, unsigned D>
144 struct TSV_MetaAssignScalar< Tenzor<T1,D> , T2 , OP >
145 {
146  inline static void
147  apply( Tenzor<T1,D>& lhs, T2 rhs ) {
148  for (unsigned d=0; d<D*D; ++d)
149  PETE_apply( OP(), lhs[d] , rhs);
150  }
151 };
152 
154 //
155 // Specializations for Tenzors with D=1.
156 //
158 
159 template<class T1, class T2, class OP>
160 struct TSV_MetaAssign< Tenzor<T1,1> , Tenzor<T2,1> , OP >
161 {
162  inline static void
163  apply( Tenzor<T1,1>& lhs, const Tenzor<T2,1>& rhs) {
164  PETE_apply( OP(), lhs[0] , rhs[0] );
165  }
166 };
167 
168 template<class T1, class T2, class OP>
169 struct TSV_MetaAssignScalar< Tenzor<T1,1> , T2 , OP >
170 {
171  inline static void
172  apply( Tenzor<T1,1>& lhs, T2 rhs ) {
173  PETE_apply( OP(), lhs[0] , rhs );
174  }
175 };
176 
178 //
179 // Specializations for Tenzors with D=2.
180 //
182 
183 template<class T1, class T2, class OP>
184 struct TSV_MetaAssign< Tenzor<T1,2> , Tenzor<T2,2> , OP >
185 {
186  inline static void
187  apply( Tenzor<T1,2>& lhs, const Tenzor<T2,2>& rhs) {
188  PETE_apply( OP(), lhs[0] , rhs[0] );
189  PETE_apply( OP(), lhs[1] , rhs[1] );
190  PETE_apply( OP(), lhs[2] , rhs[2] );
191  PETE_apply( OP(), lhs[3] , rhs[3] );
192  }
193 };
194 
195 template<class T1, class T2, class OP>
196 struct TSV_MetaAssignScalar< Tenzor<T1,2> , T2 , OP >
197 {
198  inline static void
199  apply( Tenzor<T1,2>& lhs, T2 rhs ) {
200  PETE_apply( OP(), lhs[0] , rhs );
201  PETE_apply( OP(), lhs[1] , rhs );
202  PETE_apply( OP(), lhs[2] , rhs );
203  PETE_apply( OP(), lhs[3] , rhs );
204  }
205 };
206 
208 //
209 // Specializations for Tenzors with D=3.
210 //
212 
213 template<class T1, class T2, class OP>
214 struct TSV_MetaAssign< Tenzor<T1,3> , Tenzor<T2,3> , OP >
215 {
216  inline static void
217  apply( Tenzor<T1,3>& lhs, const Tenzor<T2,3>& rhs) {
218  PETE_apply( OP(), lhs[0] , rhs[0] );
219  PETE_apply( OP(), lhs[1] , rhs[1] );
220  PETE_apply( OP(), lhs[2] , rhs[2] );
221  PETE_apply( OP(), lhs[3] , rhs[3] );
222  PETE_apply( OP(), lhs[4] , rhs[4] );
223  PETE_apply( OP(), lhs[5] , rhs[5] );
224  PETE_apply( OP(), lhs[6] , rhs[6] );
225  PETE_apply( OP(), lhs[7] , rhs[7] );
226  PETE_apply( OP(), lhs[8] , rhs[8] );
227  }
228 };
229 
230 template<class T1, class T2, class OP>
231 struct TSV_MetaAssignScalar< Tenzor<T1,3> , T2 , OP >
232 {
233  inline static void
234  apply( Tenzor<T1,3>& lhs, T2 rhs ) {
235  PETE_apply( OP(), lhs[0] , rhs );
236  PETE_apply( OP(), lhs[1] , rhs );
237  PETE_apply( OP(), lhs[2] , rhs );
238  PETE_apply( OP(), lhs[3] , rhs );
239  PETE_apply( OP(), lhs[4] , rhs );
240  PETE_apply( OP(), lhs[5] , rhs );
241  PETE_apply( OP(), lhs[6] , rhs );
242  PETE_apply( OP(), lhs[7] , rhs );
243  PETE_apply( OP(), lhs[8] , rhs );
244  }
245 };
246 
248 //
249 // The default definitions for SymTenzors of arbitrary size.
250 //
252 
253 template<class T1, class T2, class OP, unsigned D>
254 struct TSV_MetaAssign< SymTenzor<T1,D> , SymTenzor<T2,D> , OP >
255 {
256  inline static void
257  apply( SymTenzor<T1,D>& lhs, const SymTenzor<T2,D>& rhs) {
258  for (unsigned d=0; d<D*(D+1)/2; ++d)
259  PETE_apply( OP(), lhs[d] , rhs[d]);
260  }
261 };
262 
263 template<class T1, class T2, class OP, unsigned D>
264 struct TSV_MetaAssignScalar< SymTenzor<T1,D> , T2 , OP >
265 {
266  inline static void
267  apply( SymTenzor<T1,D>& lhs, T2 rhs ) {
268  for (unsigned d=0; d<D*(D+1)/2; ++d)
269  PETE_apply( OP(), lhs[d] , rhs);
270  }
271 };
272 
274 //
275 // Specializations for SymTenzors with D=1.
276 //
278 
279 template<class T1, class T2, class OP>
280 struct TSV_MetaAssign< SymTenzor<T1,1> , SymTenzor<T2,1> , OP >
281 {
282  inline static void
283  apply( SymTenzor<T1,1>& lhs, const SymTenzor<T2,1>& rhs) {
284  PETE_apply( OP(), lhs[0] , rhs[0] );
285  }
286 };
287 
288 template<class T1, class T2, class OP>
289 struct TSV_MetaAssignScalar< SymTenzor<T1,1> , T2 , OP >
290 {
291  inline static void
292  apply( SymTenzor<T1,1>& lhs, T2 rhs ) {
293  PETE_apply( OP(), lhs[0] , rhs );
294  }
295 };
296 
298 //
299 // Specializations for SymTenzors with D=2.
300 //
302 
303 template<class T1, class T2, class OP>
304 struct TSV_MetaAssign< SymTenzor<T1,2> , SymTenzor<T2,2> , OP >
305 {
306  inline static void
307  apply( SymTenzor<T1,2>& lhs, const SymTenzor<T2,2>& rhs) {
308  PETE_apply( OP(), lhs[0] , rhs[0] );
309  PETE_apply( OP(), lhs[1] , rhs[1] );
310  PETE_apply( OP(), lhs[2] , rhs[2] );
311  }
312 };
313 
314 template<class T1, class T2, class OP>
315 struct TSV_MetaAssignScalar< SymTenzor<T1,2> , T2 , OP >
316 {
317  inline static void
318  apply( SymTenzor<T1,2>& lhs, T2 rhs ) {
319  PETE_apply( OP(), lhs[0] , rhs );
320  PETE_apply( OP(), lhs[1] , rhs );
321  PETE_apply( OP(), lhs[2] , rhs );
322  }
323 };
324 
326 //
327 // Specializations for SymTenzors with D=3.
328 //
330 
331 template<class T1, class T2, class OP>
332 struct TSV_MetaAssign< SymTenzor<T1,3> , SymTenzor<T2,3> , OP >
333 {
334  inline static void
335  apply( SymTenzor<T1,3>& lhs, const SymTenzor<T2,3>& rhs) {
336  PETE_apply( OP(), lhs[0] , rhs[0] );
337  PETE_apply( OP(), lhs[1] , rhs[1] );
338  PETE_apply( OP(), lhs[2] , rhs[2] );
339  PETE_apply( OP(), lhs[3] , rhs[3] );
340  PETE_apply( OP(), lhs[4] , rhs[4] );
341  PETE_apply( OP(), lhs[5] , rhs[5] );
342  }
343 };
344 
345 template<class T1, class T2, class OP>
346 struct TSV_MetaAssignScalar< SymTenzor<T1,3> , T2 , OP >
347 {
348  inline static void
349  apply( SymTenzor<T1,3>& lhs, T2 rhs ) {
350  PETE_apply( OP(), lhs[0] , rhs );
351  PETE_apply( OP(), lhs[1] , rhs );
352  PETE_apply( OP(), lhs[2] , rhs );
353  PETE_apply( OP(), lhs[3] , rhs );
354  PETE_apply( OP(), lhs[4] , rhs );
355  PETE_apply( OP(), lhs[5] , rhs );
356  }
357 };
358 
360 //
361 // The default definitions for AntiSymTenzors of arbitrary size.
362 //
364 
365 template<class T1, class T2, class OP, unsigned D>
366 struct TSV_MetaAssign< AntiSymTenzor<T1,D> , AntiSymTenzor<T2,D> , OP >
367 {
368  inline static void
370  for (unsigned d=0; d<D*(D-1)/2; ++d)
371  PETE_apply( OP(), lhs[d] , rhs[d]);
372  }
373 };
374 
375 template<class T1, class T2, class OP, unsigned D>
376 struct TSV_MetaAssignScalar< AntiSymTenzor<T1,D> , T2 , OP >
377 {
378  inline static void
379  apply( AntiSymTenzor<T1,D>& lhs, T2 rhs ) {
380  for (unsigned d=0; d<D*(D-1)/2; ++d)
381  PETE_apply( OP(), lhs[d] , rhs);
382  }
383 };
384 
386 //
387 // Specializations for AntiSymTenzors with D=1.
388 //
390 
391 template<class T1, class T2, class OP>
392 struct TSV_MetaAssign< AntiSymTenzor<T1,1> , AntiSymTenzor<T2,1> , OP >
393 {
394  inline static void
396  }
397 };
398 
399 template<class T1, class T2, class OP>
400 struct TSV_MetaAssignScalar< AntiSymTenzor<T1,1> , T2 , OP >
401 {
402  inline static void
403  apply( AntiSymTenzor<T1,1>& lhs, T2 rhs ) {
404  }
405 };
406 
408 //
409 // Specializations for AntiSymTenzors with D=2.
410 //
412 
413 template<class T1, class T2, class OP>
414 struct TSV_MetaAssign< AntiSymTenzor<T1,2> , AntiSymTenzor<T2,2> , OP >
415 {
416  inline static void
418  PETE_apply( OP(), lhs[0] , rhs[0] );
419  }
420 };
421 
422 template<class T1, class T2, class OP>
423 struct TSV_MetaAssignScalar< AntiSymTenzor<T1,2> , T2 , OP >
424 {
425  inline static void
426  apply( AntiSymTenzor<T1,2>& lhs, T2 rhs ) {
427  PETE_apply( OP(), lhs[0] , rhs );
428  }
429 };
430 
432 //
433 // Specializations for AntiSymTenzors with D=3.
434 //
436 
437 template<class T1, class T2, class OP>
438 struct TSV_MetaAssign< AntiSymTenzor<T1,3> , AntiSymTenzor<T2,3> , OP >
439 {
440  inline static void
442  PETE_apply( OP(), lhs[0] , rhs[0] );
443  PETE_apply( OP(), lhs[1] , rhs[1] );
444  PETE_apply( OP(), lhs[2] , rhs[2] );
445  }
446 };
447 
448 template<class T1, class T2, class OP>
449 struct TSV_MetaAssignScalar< AntiSymTenzor<T1,3> , T2 , OP >
450 {
451  inline static void
452  apply( AntiSymTenzor<T1,3>& lhs, T2 rhs ) {
453  PETE_apply( OP(), lhs[0] , rhs );
454  PETE_apply( OP(), lhs[1] , rhs );
455  PETE_apply( OP(), lhs[2] , rhs );
456  }
457 };
458 
460 
461 #endif // TSV_META_ASSIGN_H
462 
463 /***************************************************************************
464  * $RCSfile: TSVMetaAssign.h,v $ $Author: adelmann $
465  * $Revision: 1.1.1.1 $ $Date: 2003/01/23 07:40:24 $
466  * IPPL_VERSION_ID: $Id: TSVMetaAssign.h,v 1.1.1.1 2003/01/23 07:40:24 adelmann Exp $
467  ***************************************************************************/
468 
static void apply(Vektor< T1, 1 > &lhs, const Vektor< T2, 1 > &rhs)
Definition: TSVMetaAssign.h:59
static void apply(Vektor< T1, 1 > &lhs, T2 rhs)
Definition: TSVMetaAssign.h:68
void PETE_apply(const OpPeriodic< T > &e, T &a, const T &b)
Definition: BCond.hpp:373
static void apply(SymTenzor< T1, 3 > &lhs, T2 rhs)
static void apply(Vektor< T1, 2 > &lhs, const Vektor< T2, 2 > &rhs)
Definition: TSVMetaAssign.h:83
static void apply(Tenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
static void apply(SymTenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
static void apply(AntiSymTenzor< T1, 2 > &lhs, T2 rhs)
static void apply(Vektor< T1, D > &lhs, const Vektor< T2, D > &rhs)
Definition: TSVMetaAssign.h:33
Definition: TSVMeta.h:24
static void apply(SymTenzor< T1, D > &lhs, T2 rhs)
static void apply(Tenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
static void apply(Vektor< T1, 2 > &lhs, T2 rhs)
Definition: TSVMetaAssign.h:93
static void apply(SymTenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
static void apply(SymTenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
static void apply(AntiSymTenzor< T1, 3 > &lhs, T2 rhs)
static void apply(AntiSymTenzor< T1, 1 > &lhs, const AntiSymTenzor< T2, 1 > &rhs)
static void apply(Tenzor< T1, 2 > &lhs, T2 rhs)
static void apply(Tenzor< T1, 3 > &lhs, T2 rhs)
static void apply(AntiSymTenzor< T1, D > &lhs, T2 rhs)
static void apply(SymTenzor< T1, 1 > &lhs, T2 rhs)
static void apply(AntiSymTenzor< T1, 1 > &lhs, T2 rhs)
static void apply(Vektor< T1, D > &lhs, T2 rhs)
Definition: TSVMetaAssign.h:43
static void apply(AntiSymTenzor< T1, 3 > &lhs, const AntiSymTenzor< T2, 3 > &rhs)
static void apply(Tenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
static void apply(Vektor< T1, 3 > &lhs, const Vektor< T2, 3 > &rhs)
static void apply(AntiSymTenzor< T1, D > &lhs, const AntiSymTenzor< T2, D > &rhs)
static void apply(AntiSymTenzor< T1, 2 > &lhs, const AntiSymTenzor< T2, 2 > &rhs)
static void apply(Vektor< T1, 3 > &lhs, T2 rhs)
static void apply(Tenzor< T1, D > &lhs, T2 rhs)
static void apply(Tenzor< T1, 1 > &lhs, T2 rhs)
static void apply(SymTenzor< T1, 2 > &lhs, T2 rhs)
static void apply(SymTenzor< T1, D > &lhs, const SymTenzor< T2, D > &rhs)
static void apply(Tenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)