FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
congruency_trafo.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8#include <kernel/shape.hpp>
9#include <kernel/util/math.hpp>
10#include <kernel/util/tiny_algebra.hpp>
11
12namespace FEAT
13{
14 namespace Geometry
15 {
17 namespace Intern
18 {
26 template<typename Shape_>
27#ifndef DOXYGEN
28 class CongruencyTrafo;
29#else
30 class CongruencyTrafo
31 {
32 public:
45 template<typename DataType_, int sm_, int sn_, int sl_>
46 static void compute(Tiny::Matrix<DataType_, m, n, sm_, sn_>& a, Tiny::Vector<DataType_, n, sl_>& b, int orient);
47 };
48#endif // DOXYGEN
49
53 template<>
54 class CongruencyTrafo<Shape::Simplex<1>>
55 {
56 public:
57 template<typename DataType_, int sm_, int sn_, int sl_>
58 static void compute(Tiny::Matrix<DataType_, 1, 1, sm_, sn_>& a, Tiny::Vector<DataType_, 1, sl_>& b, int orient)
59 {
60 switch(orient)
61 {
62 case 0:
63 a(Index(0),Index(0)) = +DataType_(1);
64 b(Index(0)) = DataType_(0);
65 break;
66 case 1:
67 a(Index(0),Index(0)) = -DataType_(1);
68 b(Index(0)) = +DataType_(1);
69 break;
70 }
71 }
72 };
73
77 template<>
78 class CongruencyTrafo<Shape::Simplex<2>>
79 {
80 public:
81 template<typename DataType_, int sm_, int sn_, int sl_>
82 static void compute(Tiny::Matrix<DataType_, 2, 2, sm_, sn_>& a, Tiny::Vector<DataType_, 2, sl_>& b, int orient)
83 {
84 switch(orient)
85 {
86 case 0:
87 a(Index(0),Index(0)) = +DataType_(1);
88 a(Index(1),Index(0)) = DataType_(0);
89 a(Index(0),Index(1)) = DataType_(0);
90 a(Index(1),Index(1)) = +DataType_(1);
91 b(Index(0)) = DataType_(0);
92 b(Index(1)) = DataType_(0);
93 break;
94 case 1:
95 a(Index(0),Index(0)) = -DataType_(1);
96 a(Index(1),Index(0)) = +DataType_(1);
97 a(Index(0),Index(1)) = -DataType_(1);
98 a(Index(1),Index(1)) = DataType_(0);
99 b(Index(0)) = +DataType_(1);
100 b(Index(1)) = DataType_(0);
101 break;
102 case 2:
103 a(Index(0),Index(0)) = DataType_(0);
104 a(Index(1),Index(0)) = -DataType_(1);
105 a(Index(0),Index(1)) = DataType_(1);
106 a(Index(1),Index(1)) = -DataType_(1);
107 b(Index(0)) = DataType_(0);
108 b(Index(1)) = +DataType_(1);
109 break;
110 case 4:
111 a(Index(0),Index(0)) = DataType_(0);
112 a(Index(1),Index(0)) = +DataType_(1);
113 a(Index(0),Index(1)) = +DataType_(1);
114 a(Index(1),Index(1)) = DataType_(0);
115 b(Index(0)) = DataType_(0);
116 b(Index(1)) = DataType_(0);
117 break;
118 case 5:
119 a(Index(0),Index(0)) = -DataType_(1);
120 a(Index(1),Index(0)) = DataType_(0);
121 a(Index(0),Index(1)) = -DataType_(1);
122 a(Index(1),Index(1)) = +DataType_(1);
123 b(Index(0)) = +DataType_(1);
124 b(Index(1)) = DataType_(0);
125 break;
126 case 6:
127 a(Index(0),Index(0)) = +DataType_(1);
128 a(Index(1),Index(0)) = -DataType_(1);
129 a(Index(0),Index(1)) = DataType_(0);
130 a(Index(1),Index(1)) = -DataType_(1);
131 b(Index(0)) = DataType_(0);
132 b(Index(1)) = +DataType_(1);
133 break;
134 }
135 }
136 };
137
141 template<>
142 class CongruencyTrafo<Shape::Hypercube<1>>
143 {
144 public:
145 template<typename DataType_, int sm_, int sn_, int sl_>
146 static void compute(Tiny::Matrix<DataType_, 1, 1, sm_, sn_>& a, Tiny::Vector<DataType_, 1, sl_>& b, int orient)
147 {
148 switch(orient)
149 {
150 case 0:
151 a(Index(0),Index(0)) = +DataType_(1);
152 break;
153 case 1:
154 a(Index(0),Index(0)) = -DataType_(1);
155 break;
156 }
157 b(Index(0)) = DataType_(0);
158 }
159 };
160
164 template<>
165 class CongruencyTrafo<Shape::Hypercube<2>>
166 {
167 public:
168 template<typename DataType_, int sm_, int sn_, int sl_>
169 static void compute(Tiny::Matrix<DataType_, 2, 2, sm_, sn_>& a, Tiny::Vector<DataType_, 2, sl_>& b, int orient)
170 {
171 switch(orient)
172 {
173 case 0:
174 a(Index(0),Index(0)) = +DataType_(1);
175 a(Index(1),Index(0)) = DataType_(0);
176 a(Index(0),Index(1)) = DataType_(0);
177 a(Index(1),Index(1)) = +DataType_(1);
178 break;
179 case 1:
180 a(Index(0),Index(0)) = DataType_(0);
181 a(Index(1),Index(0)) = +DataType_(1);
182 a(Index(0),Index(1)) = -DataType_(1);
183 a(Index(1),Index(1)) = DataType_(0);
184 break;
185 case 2:
186 a(Index(0),Index(0)) = DataType_(0);
187 a(Index(1),Index(0)) = -DataType_(1);
188 a(Index(0),Index(1)) = +DataType_(1);
189 a(Index(1),Index(1)) = DataType_(0);
190 break;
191 case 3:
192 a(Index(0),Index(0)) = -DataType_(1);
193 a(Index(1),Index(0)) = DataType_(0);
194 a(Index(0),Index(1)) = DataType_(0);
195 a(Index(1),Index(1)) = -DataType_(1);
196 break;
197 case 4:
198 a(Index(0),Index(0)) = DataType_(0);
199 a(Index(1),Index(0)) = +DataType_(1);
200 a(Index(0),Index(1)) = +DataType_(1);
201 a(Index(1),Index(1)) = DataType_(0);
202 break;
203 case 5:
204 a(Index(0),Index(0)) = -DataType_(1);
205 a(Index(1),Index(0)) = DataType_(0);
206 a(Index(0),Index(1)) = DataType_(0);
207 a(Index(1),Index(1)) = +DataType_(1);
208 break;
209 case 6:
210 a(Index(0),Index(0)) = +DataType_(1);
211 a(Index(1),Index(0)) = DataType_(0);
212 a(Index(0),Index(1)) = DataType_(0);
213 a(Index(1),Index(1)) = -DataType_(1);
214 break;
215 case 7:
216 a(Index(0),Index(0)) = DataType_(0);
217 a(Index(1),Index(0)) = -DataType_(1);
218 a(Index(0),Index(1)) = -DataType_(1);
219 a(Index(1),Index(1)) = DataType_(0);
220 break;
221 }
222 b(Index(0)) = DataType_(0);
223 b(Index(0)) = DataType_(0);
224 }
225 };
226
227 } // namespace Intern
229 } // namespace Geometry
230} // namespace FEAT
FEAT namespace.
Definition: adjactor.hpp:12
std::uint64_t Index
Index data type.