Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/staging/src/include/Diderot/inline-tensor3.h
ViewVC logotype

Annotation of /branches/staging/src/include/Diderot/inline-tensor3.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1942 - (view) (download) (as text)

1 : jhr 1935 /*! \file inline-tensor3.h
2 :     *
3 :     * \author John Reppy
4 :     *
5 :     * Operations on third-order tensors.
6 :     */
7 :    
8 :     /*
9 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
10 :     * All rights reserved.
11 :     */
12 :    
13 :     #ifndef _DIDEROT_INLINE_TENSOR3_H_
14 :     #define _DIDEROT_INLINE_TENSOR3_H_
15 :    
16 :     #ifndef _DIDEROT_TYPES_H_
17 :     #include "types.h"
18 :     #endif
19 :     #ifndef _DIDEROT_INLINE_VEC2_H_
20 :     # include "inline-vec2.h"
21 :     #endif
22 :     #ifndef _DIDEROT_INLINE_VEC3_H_
23 :     # include "inline-vec3.h"
24 :     #endif
25 :     #ifndef _DIDEROT_INLINE_VEC4_H_
26 :     # include "inline-vec4.h"
27 :     #endif
28 :    
29 :     /********** 2x2x2 tensor functions **********/
30 :    
31 :     STATIC_INLINE void copyTen2x2x2 (Diderot_Ten2x2x2_t dst, Diderot_Ten2x2x2_t src)
32 :     {
33 :     dst[0][0].v = src[0][0].v;
34 :     dst[0][1].v = src[0][1].v;
35 :     dst[1][0].v = src[1][0].v;
36 :     dst[1][1].v = src[1][1].v;
37 :     }
38 :    
39 :     // vector times tensor contraction: [v dot T]_jk = v_i * T_ijk
40 :     STATIC_INLINE void mulVec2Ten2x2x2 (Diderot_Mat2x2_t dst, Diderot_vec2_t v, Diderot_Ten2x2x2_t T)
41 :     {
42 :     Diderot_union2_t u;
43 :     u.v = v;
44 :     dst[0].r[0] = u.r[0] * T[0][0].r[0] + u.r[1] * T[1][0].r[0];
45 :     dst[0].r[1] = u.r[0] * T[0][0].r[1] + u.r[1] * T[1][0].r[1];
46 :     dst[1].r[0] = u.r[0] * T[0][1].r[0] + u.r[1] * T[1][1].r[0];
47 :     dst[1].r[1] = u.r[0] * T[0][1].r[1] + u.r[1] * T[1][1].r[1];
48 :     }
49 :    
50 :     // tensor times vector contraction: [T dot v]_ij = T_ijk * v_k
51 :     STATIC_INLINE void mulTen2x2x2Vec2 (Diderot_Mat2x2_t dst, Diderot_Ten2x2x2_t T, Diderot_vec2_t v)
52 :     {
53 :     dst[0].v = vec2(dot2(T[0][0].v, v), dot2(T[0][1].v, v));
54 :     dst[1].v = vec2(dot2(T[1][0].v, v), dot2(T[1][1].v, v));
55 :     }
56 :    
57 : jhr 1942 // The Frobenius norm of a tensor
58 :     STATIC_INLINE Diderot_real_t normTen2x2x2 (Diderot_Ten2x2x2_t T)
59 :     {
60 :     Diderot_real_t sumSq =
61 :     dot2(T[0][0].v,T[0][0].v) + dot2(T[0][1].v,T[0][1].v) +
62 :     dot2(T[1][0].v,T[1][0].v) + dot2(T[1][1].v,T[1][1].v);
63 :     return SQRT(sumSq);
64 :     }
65 : jhr 1935
66 :     /********** 3x3x3 tensor functions **********/
67 :    
68 :     STATIC_INLINE void copyTen3x3x3 (Diderot_Ten3x3x3_t dst, Diderot_Ten3x3x3_t src)
69 :     {
70 :     dst[0][0].v = src[0][0].v;
71 :     dst[0][1].v = src[0][1].v;
72 :     dst[0][2].v = src[0][2].v;
73 :     dst[1][0].v = src[1][0].v;
74 :     dst[1][1].v = src[1][1].v;
75 :     dst[1][2].v = src[1][2].v;
76 :     dst[2][0].v = src[2][0].v;
77 :     dst[2][1].v = src[2][1].v;
78 :     dst[2][2].v = src[2][2].v;
79 :     }
80 :    
81 :     // vector times tensor contraction
82 :     STATIC_INLINE void mulVec3Ten3x3x3 (Diderot_Mat3x3_t dst, Diderot_vec3_t v, Diderot_Ten3x3x3_t T)
83 :     {
84 :     Diderot_union3_t u;
85 :     u.v = v;
86 :     dst[0].r[0] = u.r[0] * T[0][0].r[0] + u.r[1] * T[1][0].r[0] + u.r[2] * T[2][0].r[0];
87 :     dst[0].r[1] = u.r[0] * T[0][0].r[1] + u.r[1] * T[1][0].r[1] + u.r[2] * T[2][0].r[1];
88 :     dst[0].r[2] = u.r[0] * T[0][0].r[2] + u.r[1] * T[1][0].r[2] + u.r[2] * T[2][0].r[2];
89 :     dst[1].r[0] = u.r[0] * T[0][1].r[0] + u.r[1] * T[1][1].r[0] + u.r[2] * T[2][1].r[0];
90 :     dst[1].r[1] = u.r[0] * T[0][1].r[1] + u.r[1] * T[1][1].r[1] + u.r[2] * T[2][1].r[1];
91 :     dst[1].r[2] = u.r[0] * T[0][1].r[2] + u.r[1] * T[1][1].r[2] + u.r[2] * T[2][1].r[2];
92 :     dst[2].r[0] = u.r[0] * T[0][2].r[0] + u.r[1] * T[1][2].r[0] + u.r[2] * T[2][2].r[0];
93 :     dst[2].r[1] = u.r[0] * T[0][2].r[1] + u.r[1] * T[1][2].r[1] + u.r[2] * T[2][2].r[1];
94 :     dst[2].r[2] = u.r[0] * T[0][2].r[2] + u.r[1] * T[1][2].r[2] + u.r[2] * T[2][2].r[2];
95 :     }
96 :    
97 :     // tensor times vector contraction
98 :     STATIC_INLINE void mulTen3x3x3Vec3 (Diderot_Mat3x3_t dst, Diderot_Ten3x3x3_t T, Diderot_vec3_t v)
99 :     {
100 :     dst[0].v = vec3(dot3(T[0][0].v, v), dot3(T[0][1].v, v), dot3(T[0][2].v, v));
101 :     dst[1].v = vec3(dot3(T[1][0].v, v), dot3(T[1][1].v, v), dot3(T[1][2].v, v));
102 :     dst[2].v = vec3(dot3(T[2][0].v, v), dot3(T[2][1].v, v), dot3(T[2][2].v, v));
103 :     }
104 :    
105 : jhr 1942 // The Frobenius norm of a tensor
106 :     STATIC_INLINE Diderot_real_t normTen3x3x3 (Diderot_Ten3x3x3_t T)
107 :     {
108 :     Diderot_real_t sumSq =
109 :     dot3(T[0][0].v,T[0][0].v) + dot3(T[0][1].v,T[0][1].v) + dot3(T[0][2].v,T[0][2].v) +
110 :     dot3(T[1][0].v,T[1][0].v) + dot3(T[1][1].v,T[1][1].v) + dot3(T[1][2].v,T[1][2].v) +
111 :     dot3(T[2][0].v,T[2][0].v) + dot3(T[2][1].v,T[2][1].v) + dot3(T[2][2].v,T[2][2].v);
112 :     return SQRT(sumSq);
113 :     }
114 : jhr 1935
115 : jhr 1942
116 : jhr 1935 /********** 4x4x4 tensor functions **********/
117 :    
118 :     STATIC_INLINE void copyTen4x4x4 (Diderot_Ten4x4x4_t dst, Diderot_Ten4x4x4_t src)
119 :     {
120 :     for (int i = 0; i < 4; i++) {
121 :     dst[i][0].v = src[i][0].v;
122 :     dst[i][1].v = src[i][1].v;
123 :     dst[i][2].v = src[i][2].v;
124 :     dst[i][3].v = src[i][3].v;
125 :     }
126 :     }
127 :    
128 :     // vector times tensor contraction
129 :     STATIC_INLINE void mulVec4Ten4x4x4 (Diderot_Mat4x4_t dst, Diderot_vec4_t v, Diderot_Ten4x4x4_t T)
130 :     {
131 :     Diderot_union4_t u;
132 :     u.v = v;
133 :     dst[0].r[0] = u.r[0] * T[0][0].r[0] + u.r[1] * T[1][0].r[0] + u.r[2] * T[2][0].r[0] + u.r[3] * T[3][0].r[0];
134 :     dst[0].r[1] = u.r[0] * T[0][0].r[1] + u.r[1] * T[1][0].r[1] + u.r[2] * T[2][0].r[1] + u.r[3] * T[3][0].r[1];
135 :     dst[0].r[2] = u.r[0] * T[0][0].r[2] + u.r[1] * T[1][0].r[2] + u.r[2] * T[2][0].r[2] + u.r[3] * T[3][0].r[2];
136 :     dst[0].r[3] = u.r[0] * T[0][0].r[3] + u.r[1] * T[1][0].r[3] + u.r[2] * T[2][0].r[3] + u.r[3] * T[3][0].r[3];
137 :     dst[1].r[0] = u.r[0] * T[0][1].r[0] + u.r[1] * T[1][1].r[0] + u.r[2] * T[2][1].r[0] + u.r[3] * T[3][1].r[0];
138 :     dst[1].r[1] = u.r[0] * T[0][1].r[1] + u.r[1] * T[1][1].r[1] + u.r[2] * T[2][1].r[1] + u.r[3] * T[3][1].r[1];
139 :     dst[1].r[2] = u.r[0] * T[0][1].r[2] + u.r[1] * T[1][1].r[2] + u.r[2] * T[2][1].r[2] + u.r[3] * T[3][1].r[2];
140 :     dst[1].r[3] = u.r[0] * T[0][1].r[3] + u.r[1] * T[1][1].r[3] + u.r[2] * T[2][1].r[3] + u.r[3] * T[3][1].r[3];
141 :     dst[2].r[0] = u.r[0] * T[0][2].r[0] + u.r[1] * T[1][2].r[0] + u.r[2] * T[2][2].r[0] + u.r[3] * T[3][2].r[0];
142 :     dst[2].r[1] = u.r[0] * T[0][2].r[1] + u.r[1] * T[1][2].r[1] + u.r[2] * T[2][2].r[1] + u.r[3] * T[3][2].r[1];
143 :     dst[2].r[2] = u.r[0] * T[0][2].r[2] + u.r[1] * T[1][2].r[2] + u.r[2] * T[2][2].r[2] + u.r[3] * T[3][2].r[2];
144 :     dst[2].r[3] = u.r[0] * T[0][2].r[3] + u.r[1] * T[1][2].r[3] + u.r[2] * T[2][2].r[3] + u.r[3] * T[3][2].r[3];
145 :     dst[3].r[0] = u.r[0] * T[0][3].r[0] + u.r[1] * T[1][3].r[0] + u.r[2] * T[2][3].r[0] + u.r[3] * T[3][3].r[0];
146 :     dst[3].r[1] = u.r[0] * T[0][3].r[1] + u.r[1] * T[1][3].r[1] + u.r[2] * T[2][3].r[1] + u.r[3] * T[3][3].r[1];
147 :     dst[3].r[2] = u.r[0] * T[0][3].r[2] + u.r[1] * T[1][3].r[2] + u.r[2] * T[2][3].r[2] + u.r[3] * T[3][3].r[2];
148 :     dst[3].r[3] = u.r[0] * T[0][3].r[3] + u.r[1] * T[1][3].r[3] + u.r[2] * T[2][3].r[3] + u.r[3] * T[3][3].r[3];
149 :     }
150 :    
151 :     // tensor times vector contraction
152 :     STATIC_INLINE void mulTen4x4x4Vec4 (Diderot_Mat4x4_t dst, Diderot_Ten4x4x4_t T, Diderot_vec4_t v)
153 :     {
154 :     dst[0].v = vec4(dot4(T[0][0].v, v), dot4(T[0][1].v, v), dot4(T[0][2].v, v), dot4(T[0][3].v, v));
155 :     dst[1].v = vec4(dot4(T[1][0].v, v), dot4(T[1][1].v, v), dot4(T[1][2].v, v), dot4(T[1][3].v, v));
156 :     dst[2].v = vec4(dot4(T[2][0].v, v), dot4(T[2][1].v, v), dot4(T[2][2].v, v), dot4(T[2][3].v, v));
157 :     dst[3].v = vec4(dot4(T[3][0].v, v), dot4(T[3][1].v, v), dot4(T[3][2].v, v), dot4(T[3][3].v, v));
158 :     }
159 :    
160 : jhr 1942 // The Frobenius norm of a tensor
161 :     STATIC_INLINE Diderot_real_t normTen4x4x4 (Diderot_Ten4x4x4_t T)
162 :     {
163 :     Diderot_real_t sumSq =
164 :     dot4(T[0][0].v,T[0][0].v) + dot4(T[0][1].v,T[0][1].v) + dot4(T[0][2].v,T[0][2].v) + dot4(T[0][3].v,T[0][3].v) +
165 :     dot4(T[1][0].v,T[1][0].v) + dot4(T[1][1].v,T[1][1].v) + dot4(T[1][2].v,T[1][2].v) + dot4(T[1][3].v,T[1][3].v) +
166 :     dot4(T[2][0].v,T[2][0].v) + dot4(T[2][1].v,T[2][1].v) + dot4(T[2][2].v,T[2][2].v) + dot4(T[2][3].v,T[2][3].v) +
167 :     dot4(T[2][0].v,T[2][0].v) + dot4(T[2][1].v,T[2][1].v) + dot4(T[2][2].v,T[2][2].v) + dot4(T[3][3].v,T[3][3].v);
168 :     return SQRT(sumSq);
169 :     }
170 :    
171 : jhr 1935 #endif /*! _DIDEROT_INLINE_TENSOR_H_ */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0