OPAL (Object Oriented Parallel Accelerator Library) 2022.1
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
20template<class T1, class T2, class OP> struct TSV_MetaAssign {};
21template<class T1, class T2, class OP> struct TSV_MetaAssignScalar {};
22
24//
25// Specializations for Vektors of arbitrary size.
26//
28
29template<class T1, class T2, class OP, unsigned D>
30struct 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
39template<class T1, class T2, class OP, unsigned D>
40struct 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
55template<class T1, class T2, class OP>
56struct 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
64template<class T1, class T2, class OP>
65struct 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
79template<class T1, class T2, class OP>
80struct 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
89template<class T1, class T2, class OP>
90struct 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
105template<class T1, class T2, class OP>
106struct 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
116template<class T1, class T2, class OP>
117struct 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
133template<class T1, class T2, class OP, unsigned D>
134struct 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
143template<class T1, class T2, class OP, unsigned D>
144struct 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
159template<class T1, class T2, class OP>
160struct 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
168template<class T1, class T2, class OP>
169struct 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
183template<class T1, class T2, class OP>
184struct 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
195template<class T1, class T2, class OP>
196struct 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
213template<class T1, class T2, class OP>
214struct 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
230template<class T1, class T2, class OP>
231struct 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
253template<class T1, class T2, class OP, unsigned D>
254struct TSV_MetaAssign< SymTenzor<T1,D> , SymTenzor<T2,D> , OP >
255{
256 inline static void
258 for (unsigned d=0; d<D*(D+1)/2; ++d)
259 PETE_apply( OP(), lhs[d] , rhs[d]);
260 }
261};
262
263template<class T1, class T2, class OP, unsigned D>
264struct 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
279template<class T1, class T2, class OP>
280struct TSV_MetaAssign< SymTenzor<T1,1> , SymTenzor<T2,1> , OP >
281{
282 inline static void
284 PETE_apply( OP(), lhs[0] , rhs[0] );
285 }
286};
287
288template<class T1, class T2, class OP>
289struct 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
303template<class T1, class T2, class OP>
304struct TSV_MetaAssign< SymTenzor<T1,2> , SymTenzor<T2,2> , OP >
305{
306 inline static void
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
314template<class T1, class T2, class OP>
315struct 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
331template<class T1, class T2, class OP>
332struct TSV_MetaAssign< SymTenzor<T1,3> , SymTenzor<T2,3> , OP >
333{
334 inline static void
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
345template<class T1, class T2, class OP>
346struct 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
365template<class T1, class T2, class OP, unsigned D>
366struct 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
375template<class T1, class T2, class OP, unsigned D>
376struct 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
391template<class T1, class T2, class OP>
392struct TSV_MetaAssign< AntiSymTenzor<T1,1> , AntiSymTenzor<T2,1> , OP >
393{
394 inline static void
395 apply( AntiSymTenzor<T1,1>& /*lhs*/, const AntiSymTenzor<T2,1>& /*rhs*/) {
396 }
397};
398
399template<class T1, class T2, class OP>
400struct 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
413template<class T1, class T2, class OP>
414struct 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
422template<class T1, class T2, class OP>
423struct 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
437template<class T1, class T2, class OP>
438struct 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
448template<class T1, class T2, class OP>
449struct 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
void PETE_apply(const OpPeriodic< T > &, T &a, const T &b)
Definition: BCond.hpp:353
Definition: Tenzor.h:35
Definition: Vektor.h:32
static void apply(Vektor< T1, D > &lhs, const Vektor< T2, D > &rhs)
Definition: TSVMetaAssign.h:33
static void apply(Vektor< T1, D > &lhs, T2 rhs)
Definition: TSVMetaAssign.h:43
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
static void apply(Vektor< T1, 2 > &lhs, const Vektor< T2, 2 > &rhs)
Definition: TSVMetaAssign.h:83
static void apply(Vektor< T1, 2 > &lhs, T2 rhs)
Definition: TSVMetaAssign.h:93
static void apply(Vektor< T1, 3 > &lhs, const Vektor< T2, 3 > &rhs)
static void apply(Vektor< T1, 3 > &lhs, T2 rhs)
static void apply(Tenzor< T1, D > &lhs, const Tenzor< T2, D > &rhs)
static void apply(Tenzor< T1, D > &lhs, T2 rhs)
static void apply(Tenzor< T1, 1 > &lhs, const Tenzor< T2, 1 > &rhs)
static void apply(Tenzor< T1, 1 > &lhs, T2 rhs)
static void apply(Tenzor< T1, 2 > &lhs, const Tenzor< T2, 2 > &rhs)
static void apply(Tenzor< T1, 2 > &lhs, T2 rhs)
static void apply(Tenzor< T1, 3 > &lhs, const Tenzor< T2, 3 > &rhs)
static void apply(Tenzor< T1, 3 > &lhs, T2 rhs)
static void apply(SymTenzor< T1, D > &lhs, const SymTenzor< T2, D > &rhs)
static void apply(SymTenzor< T1, D > &lhs, T2 rhs)
static void apply(SymTenzor< T1, 1 > &lhs, const SymTenzor< T2, 1 > &rhs)
static void apply(SymTenzor< T1, 1 > &lhs, T2 rhs)
static void apply(SymTenzor< T1, 2 > &lhs, const SymTenzor< T2, 2 > &rhs)
static void apply(SymTenzor< T1, 2 > &lhs, T2 rhs)
static void apply(SymTenzor< T1, 3 > &lhs, const SymTenzor< T2, 3 > &rhs)
static void apply(SymTenzor< T1, 3 > &lhs, T2 rhs)
static void apply(AntiSymTenzor< T1, D > &lhs, const AntiSymTenzor< T2, D > &rhs)
static void apply(AntiSymTenzor< T1, D > &lhs, T2 rhs)
static void apply(AntiSymTenzor< T1, 1 > &, const AntiSymTenzor< T2, 1 > &)
static void apply(AntiSymTenzor< T1, 1 > &, T2)
static void apply(AntiSymTenzor< T1, 2 > &lhs, const AntiSymTenzor< T2, 2 > &rhs)
static void apply(AntiSymTenzor< T1, 2 > &lhs, T2 rhs)
static void apply(AntiSymTenzor< T1, 3 > &lhs, const AntiSymTenzor< T2, 3 > &rhs)
static void apply(AntiSymTenzor< T1, 3 > &lhs, T2 rhs)