Flow123d  DF_patch_fe_data_tables-6bd0dc8
eigen_tools.hh
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file eigen_tools.hh
15  * @brief Store finite element data on the actual patch
16  * such as shape function values, gradients, Jacobian
17  * of the mapping from the reference cell etc.
18  * @author David Flanderka
19  */
20 
21 #ifndef PATCH_DATA_TABLE_HH_
22 #define PATCH_DATA_TABLE_HH_
23 
24 #include "system/asserts.hh"
25 #include "fem/arena_resource.hh"
26 #include "fem/arena_vec.hh"
27 #include <armadillo>
28 #include <Eigen/Core>
29 #include <Eigen/Dense>
30 #include <unsupported/Eigen/MatrixFunctions>
31 
32 
33 /// Definitions of Eigen structures
34 typedef Eigen::Array<double,Eigen::Dynamic,1> ArrayDbl;
35 typedef Eigen::Array<uint,Eigen::Dynamic,1> ArrayInt;
36 typedef Eigen::Vector<ArrayDbl,Eigen::Dynamic> TableDbl;
37 typedef Eigen::Vector<ArrayInt,Eigen::Dynamic> TableInt;
38 
39 
40 namespace eigen_tools {
41 
42 /********************************************
43  * Matrix operations on ArrayDbl type *
44  ********************************************/
45 
46 /**
47  * @brief Calculates determinant of a rectangular matrix.
48  */
49 template<int m, int n>
50 ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,m,n> &A);
51 
52 
53 
54 inline Eigen::Matrix<ArrayDbl,1,1> normal_matrix(const Eigen::Matrix<ArrayDbl,1,2> &A) {
55  Eigen::Matrix<ArrayDbl,1,1> res;
56  res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
57  return res;
58 }
59 
60 inline Eigen::Matrix<ArrayDbl,1,1> normal_matrix(const Eigen::Matrix<ArrayDbl,2,1> &A) {
61  Eigen::Matrix<ArrayDbl,1,1> res;
62  res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
63  return res;
64 }
65 
66 inline Eigen::Matrix<ArrayDbl,1,1> normal_matrix(const Eigen::Matrix<ArrayDbl,1,3> &A) {
67  Eigen::Matrix<ArrayDbl,1,1> res;
68  res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
69  return res;
70 }
71 
72 inline Eigen::Matrix<ArrayDbl,1,1> normal_matrix(const Eigen::Matrix<ArrayDbl,3,1> &A) {
73  Eigen::Matrix<ArrayDbl,1,1> res;
74  res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
75  return res;
76 }
77 
78 inline Eigen::Matrix<ArrayDbl,2,2> normal_matrix(const Eigen::Matrix<ArrayDbl,2,3> &A) {
79  Eigen::Matrix<ArrayDbl,2,2> res;
80  res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
81  res(0,1) = A(0,0)*A(1,0)+A(0,1)*A(1,1)+A(0,2)*A(1,2);
82  res(1,0) = A(1,0)*A(0,0)+A(1,1)*A(0,1)+A(1,2)*A(0,2);
83  res(1,1) = A(1,0)*A(1,0)+A(1,1)*A(1,1)+A(1,2)*A(1,2);
84  return res;
85 }
86 
87 inline Eigen::Matrix<ArrayDbl,2,2> normal_matrix(const Eigen::Matrix<ArrayDbl,3,2> &A) {
88  Eigen::Matrix<ArrayDbl,2,2> res;
89  res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
90  res(0,1) = A(0,0)*A(0,1)+A(1,0)*A(1,1)+A(2,0)*A(2,1);
91  res(1,0) = A(0,1)*A(0,0)+A(1,1)*A(1,0)+A(2,1)*A(2,0);
92  res(1,1) = A(0,1)*A(0,1)+A(1,1)*A(1,1)+A(2,1)*A(2,1);
93  return res;
94 }
95 
96 
97 
98 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,1,1> &M)
99 {
100  return M(0,0);
101 }
102 
103 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,2,2> &M)
104 {
105  return M(0,0)*M(1,1) - M(1,0)*M(0,1);
106 }
107 
108 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,3,3> &M)
109 {
110  return ( M(0,0)*M(1,1)*M(2,2) + M(0,1)*M(1,2)*M(2,0) + M(0,2)*M(1,0)*M(2,1) )
111  - ( M(2,0)*M(1,1)*M(0,2) + M(2,1)*M(1,2)*M(0,0) + M(2,2)*M(1,0)*M(0,1) );
112 }
113 
114 template<> inline ArrayDbl determinant(FMT_UNUSED const Eigen::Matrix<ArrayDbl,0,3> &M)
115 {
116  return ArrayDbl();
117 }
118 
119 template<> inline ArrayDbl determinant(FMT_UNUSED const Eigen::Matrix<ArrayDbl,3,0> &M)
120 {
121  return ArrayDbl();
122 }
123 
124 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,1,2> &M)
125 {
126  return determinant(normal_matrix(M)).sqrt();
127 }
128 
129 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,2,1> &M)
130 {
131  return determinant(normal_matrix(M)).sqrt();
132 }
133 
134 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,1,3> &M)
135 {
136  return determinant(normal_matrix(M)).sqrt();
137 }
138 
139 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,3,1> &M)
140 {
141  return determinant(normal_matrix(M)).sqrt();
142 }
143 
144 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,2,3> &M)
145 {
146  return determinant(normal_matrix(M)).sqrt();
147 }
148 
149 template<> inline ArrayDbl determinant(const Eigen::Matrix<ArrayDbl,3,2> &M)
150 {
151  return determinant(normal_matrix(M)).sqrt();
152 }
153 
154 
155 /**
156  * @brief Calculates inverse of rectangular matrix or pseudoinverse of non-rectangular matrix.
157  */
158 template<int m, int n>
159 Eigen::Matrix<ArrayDbl,n,m> inverse(const Eigen::Matrix<ArrayDbl,m,n> &A) {
160  // only for cases m > n
161  return inverse(normal_matrix(A)) * A.transpose();
162 }
163 
164 
165 template<> inline Eigen::Matrix<ArrayDbl,1,1> inverse<1,1>(const Eigen::Matrix<ArrayDbl,1,1> &A)
166 {
167  Eigen::Matrix<ArrayDbl,1,1> B;
168  B(0,0) = A(0,0).inverse(); // 1/A(0,0)
169  return B;
170 }
171 
172 template<> inline Eigen::Matrix<ArrayDbl,2,2> inverse<2,2>(const Eigen::Matrix<ArrayDbl,2,2> &A)
173 {
174  Eigen::Matrix<ArrayDbl,2,2> B;
175  ArrayDbl det = determinant(A);
176 
177  B(0,0) = A(1,1) / det;
178  B(0,1) = A(0,1) / det * (-1);
179  B(1,0) = A(1,0) / det * (-1);
180  B(1,1) = A(0,0) / det;
181  return B;
182 }
183 
184 template<> inline Eigen::Matrix<ArrayDbl,3,3> inverse<3,3>(const Eigen::Matrix<ArrayDbl,3,3> &A)
185 {
186  Eigen::Matrix<ArrayDbl,3,3> B;
187 
188  B(0,0) = A(1,1)*A(2,2) - A(2,1)*A(1,2);
189  B(1,0) = A(2,0)*A(1,2) - A(1,0)*A(2,2);
190  B(2,0) = A(1,0)*A(2,1) - A(2,0)*A(1,1);
191 
192  ArrayDbl det = A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0);
193  B(0,0) = B(0,0) / det;
194  B(1,0) = B(1,0) / det;
195  B(2,0) = B(2,0) / det;
196 
197  B(0,1) = (A(2,1)*A(0,2) - A(0,1)*A(2,2)) / det;
198  B(1,1) = (A(0,0)*A(2,2) - A(2,0)*A(0,2)) / det;
199  B(2,1) = (A(2,0)*A(0,1) - A(0,0)*A(2,1)) / det;
200 
201  B(0,2) = (A(0,1)*A(1,2) - A(1,1)*A(0,2)) / det;
202  B(1,2) = (A(1,0)*A(0,2) - A(0,0)*A(1,2)) / det;
203  B(2,2) = (A(0,0)*A(1,1) - A(1,0)*A(0,1)) / det;
204 
205  return B;
206 }
207 
208 template<> inline Eigen::Matrix<ArrayDbl,2,1> inverse<1,2>(const Eigen::Matrix<ArrayDbl,1,2> &A)
209 {
210  return A.transpose() * inverse(normal_matrix(A));
211 }
212 
213 template<> inline Eigen::Matrix<ArrayDbl,3,1> inverse<1,3>(const Eigen::Matrix<ArrayDbl,1,3> &A)
214 {
215  return A.transpose() * inverse(normal_matrix(A));
216 }
217 
218 template<> inline Eigen::Matrix<ArrayDbl,3,2> inverse<2,3>(const Eigen::Matrix<ArrayDbl,2,3> &A)
219 {
220  return A.transpose() * inverse(normal_matrix(A));
221 }
222 
223 
224 /// Resize vector of Eigen::Array to given size
225 template<class ET>
226 void resize_table(typename Eigen::Vector<ET,Eigen::Dynamic> &table, uint size) {
227  for (uint i=0; i<table.rows(); ++i) {
228  table(i).resize(size);
229  table(i).setZero(size,1);
230  }
231 }
232 
233 
234 template<unsigned int spacedim, unsigned int dim>
235 Eigen::Matrix<ArrayDbl, spacedim, dim> jacobian(const Eigen::Matrix<ArrayDbl, spacedim, dim+1> &coords)
236 {
237  Eigen::Matrix<ArrayDbl, spacedim, dim> jac;
238  for (unsigned int i=0; i<spacedim; i++)
239  for (unsigned int j=0; j<dim; j++)
240  jac(i,j) = coords(i,j+1) - coords(i,0);
241  return jac;
242 }
243 
244 }
245 
246 namespace eigen_arena_tools {
247 /********************************************
248  * Matrix operations on ArenaVec type *
249  ********************************************/
250 
251 /**
252  * @brief Calculates determinant of a rectangular matrix.
253  */
254 template<int m, int n>
255 ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,m,n> &A);
256 
257 
258 
259 inline Eigen::Matrix<ArenaVec<double>,1,1> normal_matrix(const Eigen::Matrix<ArenaVec<double>,1,2> &A) {
260  Eigen::Matrix<ArenaVec<double>,1,1> res;
261  res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
262  return res;
263 }
264 
265 inline Eigen::Matrix<ArenaVec<double>,1,1> normal_matrix(const Eigen::Matrix<ArenaVec<double>,2,1> &A) {
266  Eigen::Matrix<ArenaVec<double>,1,1> res;
267  res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
268  return res;
269 }
270 
271 inline Eigen::Matrix<ArenaVec<double>,1,1> normal_matrix(const Eigen::Matrix<ArenaVec<double>,1,3> &A) {
272  Eigen::Matrix<ArenaVec<double>,1,1> res;
273  res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
274  return res;
275 }
276 
277 inline Eigen::Matrix<ArenaVec<double>,1,1> normal_matrix(const Eigen::Matrix<ArenaVec<double>,3,1> &A) {
278  Eigen::Matrix<ArenaVec<double>,1,1> res;
279  res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
280  return res;
281 }
282 
283 inline Eigen::Matrix<ArenaVec<double>,2,2> normal_matrix(const Eigen::Matrix<ArenaVec<double>,2,3> &A) {
284  Eigen::Matrix<ArenaVec<double>,2,2> res;
285  res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
286  res(0,1) = A(0,0)*A(1,0)+A(0,1)*A(1,1)+A(0,2)*A(1,2);
287  res(1,0) = A(1,0)*A(0,0)+A(1,1)*A(0,1)+A(1,2)*A(0,2);
288  res(1,1) = A(1,0)*A(1,0)+A(1,1)*A(1,1)+A(1,2)*A(1,2);
289  return res;
290 }
291 
292 inline Eigen::Matrix<ArenaVec<double>,2,2> normal_matrix(const Eigen::Matrix<ArenaVec<double>,3,2> &A) {
293  Eigen::Matrix<ArenaVec<double>,2,2> res;
294  res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
295  res(0,1) = A(0,0)*A(0,1)+A(1,0)*A(1,1)+A(2,0)*A(2,1);
296  res(1,0) = A(0,1)*A(0,0)+A(1,1)*A(1,0)+A(2,1)*A(2,0);
297  res(1,1) = A(0,1)*A(0,1)+A(1,1)*A(1,1)+A(2,1)*A(2,1);
298  return res;
299 }
300 
301 
302 
303 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,1,1> &M)
304 {
305  return M(0,0);
306 }
307 
308 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,2,2> &M)
309 {
310  return M(0,0)*M(1,1) - M(1,0)*M(0,1);
311 }
312 
313 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,3,3> &M)
314 {
315  return ( M(0,0)*M(1,1)*M(2,2) + M(0,1)*M(1,2)*M(2,0) + M(0,2)*M(1,0)*M(2,1) )
316  - ( M(2,0)*M(1,1)*M(0,2) + M(2,1)*M(1,2)*M(0,0) + M(2,2)*M(1,0)*M(0,1) );
317 }
318 
319 template<> inline ArenaVec<double> determinant(FMT_UNUSED const Eigen::Matrix<ArenaVec<double>,0,3> &M)
320 {
321  return ArenaVec<double>();
322 }
323 
324 template<> inline ArenaVec<double> determinant(FMT_UNUSED const Eigen::Matrix<ArenaVec<double>,3,0> &M)
325 {
326  return ArenaVec<double>();
327 }
328 
329 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,1,2> &M)
330 {
331  return determinant(normal_matrix(M)).sqrt();
332 }
333 
334 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,2,1> &M)
335 {
336  return determinant(normal_matrix(M)).sqrt();
337 }
338 
339 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,1,3> &M)
340 {
341  return determinant(normal_matrix(M)).sqrt();
342 }
343 
344 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,3,1> &M)
345 {
346  return determinant(normal_matrix(M)).sqrt();
347 }
348 
349 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,2,3> &M)
350 {
351  return determinant(normal_matrix(M)).sqrt();
352 }
353 
354 template<> inline ArenaVec<double> determinant(const Eigen::Matrix<ArenaVec<double>,3,2> &M)
355 {
356  return determinant(normal_matrix(M)).sqrt();
357 }
358 
359 
360 /**
361  * @brief Calculates inverse of rectangular matrix or pseudoinverse of non-rectangular matrix.
362  */
363 template<int m, int n>
364 Eigen::Matrix<ArenaVec<double>,n,m> inverse(const Eigen::Matrix<ArenaVec<double>,m,n> &A) {
365  // only for cases m > n
366  return inverse(normal_matrix(A)) * A.transpose();
367 }
368 
369 
370 template<> inline Eigen::Matrix<ArenaVec<double>,1,1> inverse<1,1>(const Eigen::Matrix<ArenaVec<double>,1,1> &A)
371 {
372  Eigen::Matrix<ArenaVec<double>,1,1> B;
373  B(0,0) = A(0,0).inverse(); // 1/A(0,0)
374  return B;
375 }
376 
377 template<> inline Eigen::Matrix<ArenaVec<double>,2,2> inverse<2,2>(const Eigen::Matrix<ArenaVec<double>,2,2> &A)
378 {
379  Eigen::Matrix<ArenaVec<double>,2,2> B;
380  ArenaVec<double> det = determinant(A);
381 
382  B(0,0) = A(1,1) / det;
383  B(0,1) = A(0,1) / det * (-1);
384  B(1,0) = A(1,0) / det * (-1);
385  B(1,1) = A(0,0) / det;
386  return B;
387 }
388 
389 template<> inline Eigen::Matrix<ArenaVec<double>,3,3> inverse<3,3>(const Eigen::Matrix<ArenaVec<double>,3,3> &A)
390 {
391  Eigen::Matrix<ArenaVec<double>,3,3> B;
392 
393  B(0,0) = A(1,1)*A(2,2) - A(2,1)*A(1,2);
394  B(1,0) = A(2,0)*A(1,2) - A(1,0)*A(2,2);
395  B(2,0) = A(1,0)*A(2,1) - A(2,0)*A(1,1);
396 
397  ArenaVec<double> det = A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0);
398  B(0,0) = B(0,0) / det;
399  B(1,0) = B(1,0) / det;
400  B(2,0) = B(2,0) / det;
401 
402  B(0,1) = (A(2,1)*A(0,2) - A(0,1)*A(2,2)) / det;
403  B(1,1) = (A(0,0)*A(2,2) - A(2,0)*A(0,2)) / det;
404  B(2,1) = (A(2,0)*A(0,1) - A(0,0)*A(2,1)) / det;
405 
406  B(0,2) = (A(0,1)*A(1,2) - A(1,1)*A(0,2)) / det;
407  B(1,2) = (A(1,0)*A(0,2) - A(0,0)*A(1,2)) / det;
408  B(2,2) = (A(0,0)*A(1,1) - A(1,0)*A(0,1)) / det;
409 
410  return B;
411 }
412 
413 template<> inline Eigen::Matrix<ArenaVec<double>,2,1> inverse<1,2>(const Eigen::Matrix<ArenaVec<double>,1,2> &A)
414 {
415  return A.transpose() * inverse(normal_matrix(A));
416 }
417 
418 template<> inline Eigen::Matrix<ArenaVec<double>,3,1> inverse<1,3>(const Eigen::Matrix<ArenaVec<double>,1,3> &A)
419 {
420  return A.transpose() * inverse(normal_matrix(A));
421 }
422 
423 template<> inline Eigen::Matrix<ArenaVec<double>,3,2> inverse<2,3>(const Eigen::Matrix<ArenaVec<double>,2,3> &A)
424 {
425  return A.transpose() * inverse(normal_matrix(A));
426 }
427 
428 
429 } // closing namespace eigen_tools
430 
431 //template <unsigned int size>
432 //class VectorCol {
433 //public:
434 // typename Eigen::Matrix<double,size,1> data;
435 //
436 // VectorCol() {}
437 //
438 // VectorCol(int n) {}
439 //
440 // inline double & operator[](std::size_t item) {
441 // return data[item];
442 // }
443 //
444 // inline double & operator()(std::size_t item) {
445 // return data[item];
446 // }
447 //
448 // inline VectorCol<size> operator+(const VectorCol<size> &other) const {
449 // VectorCol<size> res;
450 // res.data = this->data + other.data;
451 // return res;
452 // }
453 //
454 // inline VectorCol<size> operator-(const VectorCol<size> &other) const {
455 // VectorCol<size> res;
456 // res.data = this->data - other.data;
457 // return res;
458 // }
459 //
460 // inline VectorCol<size> operator*(const double &coef) const {
461 // VectorCol<size> res;
462 // res.data = this->data * coef;
463 // return res;
464 // }
465 //
466 // inline VectorCol<size> operator/(const double &coef) const {
467 // VectorCol<size> res;
468 // res.data = this->data / coef;
469 // return res;
470 // }
471 //
472 // inline VectorCol<size> operator*(const VectorCol<size> &other) const {
473 // VectorCol<size> res;
474 // for (unsigned int i=0; i<size; ++i)
475 // res.data[i] = this->data[i] * other.data[i];
476 // return res;
477 // }
478 //
479 // inline VectorCol<size> operator/(const VectorCol<size> &other) const {
480 // VectorCol<size> res;
481 // for (unsigned int i=0; i<size; ++i)
482 // res.data[i] = this->data[i] / other.data[i];
483 // return res;
484 // }
485 //
486 //};
487 
488 
489 #endif /* PATCH_DATA_TABLE_HH_ */
Definitions of ASSERTS.
Eigen::Vector< ArrayDbl, Eigen::Dynamic > TableDbl
Definition: eigen_tools.hh:36
Eigen::Array< uint, Eigen::Dynamic, 1 > ArrayInt
Definition: eigen_tools.hh:35
Eigen::Array< double, Eigen::Dynamic, 1 > ArrayDbl
Definitions of Eigen structures.
Definition: eigen_tools.hh:34
Eigen::Vector< ArrayInt, Eigen::Dynamic > TableInt
Definition: eigen_tools.hh:37
unsigned int uint
Eigen::Matrix< ArenaVec< double >, n, m > inverse(const Eigen::Matrix< ArenaVec< double >, m, n > &A)
Calculates inverse of rectangular matrix or pseudoinverse of non-rectangular matrix.
Definition: eigen_tools.hh:364
Eigen::Matrix< ArenaVec< double >, 3, 2 > inverse< 2, 3 >(const Eigen::Matrix< ArenaVec< double >, 2, 3 > &A)
Definition: eigen_tools.hh:423
Eigen::Matrix< ArenaVec< double >, 1, 1 > normal_matrix(const Eigen::Matrix< ArenaVec< double >, 1, 2 > &A)
Definition: eigen_tools.hh:259
Eigen::Matrix< ArenaVec< double >, 1, 1 > inverse< 1, 1 >(const Eigen::Matrix< ArenaVec< double >, 1, 1 > &A)
Definition: eigen_tools.hh:370
Eigen::Matrix< ArenaVec< double >, 2, 2 > inverse< 2, 2 >(const Eigen::Matrix< ArenaVec< double >, 2, 2 > &A)
Definition: eigen_tools.hh:377
ArenaVec< double > determinant(const Eigen::Matrix< ArenaVec< double >, m, n > &A)
Calculates determinant of a rectangular matrix.
Eigen::Matrix< ArenaVec< double >, 3, 3 > inverse< 3, 3 >(const Eigen::Matrix< ArenaVec< double >, 3, 3 > &A)
Definition: eigen_tools.hh:389
Eigen::Matrix< ArenaVec< double >, 3, 1 > inverse< 1, 3 >(const Eigen::Matrix< ArenaVec< double >, 1, 3 > &A)
Definition: eigen_tools.hh:418
Eigen::Matrix< ArenaVec< double >, 2, 1 > inverse< 1, 2 >(const Eigen::Matrix< ArenaVec< double >, 1, 2 > &A)
Definition: eigen_tools.hh:413
Eigen::Matrix< ArrayDbl, n, m > inverse(const Eigen::Matrix< ArrayDbl, m, n > &A)
Calculates inverse of rectangular matrix or pseudoinverse of non-rectangular matrix.
Definition: eigen_tools.hh:159
Eigen::Matrix< ArrayDbl, 2, 1 > inverse< 1, 2 >(const Eigen::Matrix< ArrayDbl, 1, 2 > &A)
Definition: eigen_tools.hh:208
Eigen::Matrix< ArrayDbl, 3, 3 > inverse< 3, 3 >(const Eigen::Matrix< ArrayDbl, 3, 3 > &A)
Definition: eigen_tools.hh:184
Eigen::Matrix< ArrayDbl, 1, 1 > normal_matrix(const Eigen::Matrix< ArrayDbl, 1, 2 > &A)
Definition: eigen_tools.hh:54
Eigen::Matrix< ArrayDbl, spacedim, dim > jacobian(const Eigen::Matrix< ArrayDbl, spacedim, dim+1 > &coords)
Definition: eigen_tools.hh:235
Eigen::Matrix< ArrayDbl, 3, 1 > inverse< 1, 3 >(const Eigen::Matrix< ArrayDbl, 1, 3 > &A)
Definition: eigen_tools.hh:213
Eigen::Matrix< ArrayDbl, 1, 1 > inverse< 1, 1 >(const Eigen::Matrix< ArrayDbl, 1, 1 > &A)
Definition: eigen_tools.hh:165
void resize_table(typename Eigen::Vector< ET, Eigen::Dynamic > &table, uint size)
Resize vector of Eigen::Array to given size.
Definition: eigen_tools.hh:226
Eigen::Matrix< ArrayDbl, 3, 2 > inverse< 2, 3 >(const Eigen::Matrix< ArrayDbl, 2, 3 > &A)
Definition: eigen_tools.hh:218
ArrayDbl determinant(const Eigen::Matrix< ArrayDbl, m, n > &A)
Calculates determinant of a rectangular matrix.
Eigen::Matrix< ArrayDbl, 2, 2 > inverse< 2, 2 >(const Eigen::Matrix< ArrayDbl, 2, 2 > &A)
Definition: eigen_tools.hh:172
#define FMT_UNUSED
Definition: posix.h:75