21 #ifndef PATCH_DATA_TABLE_HH_
22 #define PATCH_DATA_TABLE_HH_
28 #include <Eigen/Dense>
29 #include <unsupported/Eigen/MatrixFunctions>
33 typedef Eigen::Array<double,Eigen::Dynamic,1>
ArrayDbl;
34 typedef Eigen::Array<uint,Eigen::Dynamic,1>
ArrayInt;
35 typedef Eigen::Vector<ArrayDbl,Eigen::Dynamic>
TableDbl;
36 typedef Eigen::Vector<ArrayInt,Eigen::Dynamic>
TableInt;
48 template<
int m,
int n>
53 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,1,2> &A) {
54 Eigen::Matrix<ArrayDbl,1,1> res;
55 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
59 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,2,1> &A) {
60 Eigen::Matrix<ArrayDbl,1,1> res;
61 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
65 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,1,3> &A) {
66 Eigen::Matrix<ArrayDbl,1,1> res;
67 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
71 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,3,1> &A) {
72 Eigen::Matrix<ArrayDbl,1,1> res;
73 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
77 inline Eigen::Matrix<ArrayDbl,2,2>
normal_matrix(
const Eigen::Matrix<ArrayDbl,2,3> &A) {
78 Eigen::Matrix<ArrayDbl,2,2> res;
79 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
80 res(0,1) = A(0,0)*A(1,0)+A(0,1)*A(1,1)+A(0,2)*A(1,2);
81 res(1,0) = A(1,0)*A(0,0)+A(1,1)*A(0,1)+A(1,2)*A(0,2);
82 res(1,1) = A(1,0)*A(1,0)+A(1,1)*A(1,1)+A(1,2)*A(1,2);
86 inline Eigen::Matrix<ArrayDbl,2,2>
normal_matrix(
const Eigen::Matrix<ArrayDbl,3,2> &A) {
87 Eigen::Matrix<ArrayDbl,2,2> res;
88 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
89 res(0,1) = A(0,0)*A(0,1)+A(1,0)*A(1,1)+A(2,0)*A(2,1);
90 res(1,0) = A(0,1)*A(0,0)+A(1,1)*A(1,0)+A(2,1)*A(2,0);
91 res(1,1) = A(0,1)*A(0,1)+A(1,1)*A(1,1)+A(2,1)*A(2,1);
104 return M(0,0)*M(1,1) - M(1,0)*M(0,1);
109 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) )
110 - ( 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) );
157 template<
int m,
int n>
158 Eigen::Matrix<ArrayDbl,n,m>
inverse(
const Eigen::Matrix<ArrayDbl,m,n> &A) {
164 template<>
inline Eigen::Matrix<ArrayDbl,1,1>
inverse<1,1>(
const Eigen::Matrix<ArrayDbl,1,1> &A)
166 Eigen::Matrix<ArrayDbl,1,1> B;
167 B(0,0) = A(0,0).inverse();
171 template<>
inline Eigen::Matrix<ArrayDbl,2,2>
inverse<2,2>(
const Eigen::Matrix<ArrayDbl,2,2> &A)
173 Eigen::Matrix<ArrayDbl,2,2> B;
176 B(0,0) = A(1,1) / det;
177 B(0,1) = A(0,1) / det * (-1);
178 B(1,0) = A(1,0) / det * (-1);
179 B(1,1) = A(0,0) / det;
183 template<>
inline Eigen::Matrix<ArrayDbl,3,3>
inverse<3,3>(
const Eigen::Matrix<ArrayDbl,3,3> &A)
185 Eigen::Matrix<ArrayDbl,3,3> B;
187 B(0,0) = A(1,1)*A(2,2) - A(2,1)*A(1,2);
188 B(1,0) = A(2,0)*A(1,2) - A(1,0)*A(2,2);
189 B(2,0) = A(1,0)*A(2,1) - A(2,0)*A(1,1);
191 ArrayDbl det = A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0);
192 B(0,0) = B(0,0) / det;
193 B(1,0) = B(1,0) / det;
194 B(2,0) = B(2,0) / det;
196 B(0,1) = (A(2,1)*A(0,2) - A(0,1)*A(2,2)) / det;
197 B(1,1) = (A(0,0)*A(2,2) - A(2,0)*A(0,2)) / det;
198 B(2,1) = (A(2,0)*A(0,1) - A(0,0)*A(2,1)) / det;
200 B(0,2) = (A(0,1)*A(1,2) - A(1,1)*A(0,2)) / det;
201 B(1,2) = (A(1,0)*A(0,2) - A(0,0)*A(1,2)) / det;
202 B(2,2) = (A(0,0)*A(1,1) - A(1,0)*A(0,1)) / det;
207 template<>
inline Eigen::Matrix<ArrayDbl,2,1>
inverse<1,2>(
const Eigen::Matrix<ArrayDbl,1,2> &A)
212 template<>
inline Eigen::Matrix<ArrayDbl,3,1>
inverse<1,3>(
const Eigen::Matrix<ArrayDbl,1,3> &A)
217 template<>
inline Eigen::Matrix<ArrayDbl,3,2>
inverse<2,3>(
const Eigen::Matrix<ArrayDbl,2,3> &A)
226 for (
uint i=0; i<table.rows(); ++i) {
227 table(i).resize(size);
228 table(i).setZero(size,1);
233 template<
unsigned int spacedim,
unsigned int dim>
234 Eigen::Matrix<ArrayDbl, spacedim, dim>
jacobian(
const Eigen::Matrix<ArrayDbl, spacedim, dim+1> &coords)
236 Eigen::Matrix<ArrayDbl, spacedim, dim> jac;
237 for (
unsigned int i=0; i<spacedim; i++)
238 for (
unsigned int j=0; j<dim; j++)
239 jac(i,j) = coords(i,j+1) - coords(i,0);
253 template<
int m,
int n>
259 Eigen::Matrix<ArenaVec<double>,1,1> res;
260 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
265 Eigen::Matrix<ArenaVec<double>,1,1> res;
266 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
271 Eigen::Matrix<ArenaVec<double>,1,1> res;
272 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
277 Eigen::Matrix<ArenaVec<double>,1,1> res;
278 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
283 Eigen::Matrix<ArenaVec<double>,2,2> res;
284 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
285 res(0,1) = A(0,0)*A(1,0)+A(0,1)*A(1,1)+A(0,2)*A(1,2);
286 res(1,0) = A(1,0)*A(0,0)+A(1,1)*A(0,1)+A(1,2)*A(0,2);
287 res(1,1) = A(1,0)*A(1,0)+A(1,1)*A(1,1)+A(1,2)*A(1,2);
292 Eigen::Matrix<ArenaVec<double>,2,2> res;
293 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
294 res(0,1) = A(0,0)*A(0,1)+A(1,0)*A(1,1)+A(2,0)*A(2,1);
295 res(1,0) = A(0,1)*A(0,0)+A(1,1)*A(1,0)+A(2,1)*A(2,0);
296 res(1,1) = A(0,1)*A(0,1)+A(1,1)*A(1,1)+A(2,1)*A(2,1);
309 return M(0,0)*M(1,1) - M(1,0)*M(0,1);
314 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) )
315 - ( 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) );
362 template<
int m,
int n>
371 Eigen::Matrix<ArenaVec<double>,1,1> B;
372 B(0,0) = A(0,0).inverse();
378 Eigen::Matrix<ArenaVec<double>,2,2> B;
381 B(0,0) = A(1,1) / det;
382 B(0,1) = A(0,1) / det * (-1);
383 B(1,0) = A(1,0) / det * (-1);
384 B(1,1) = A(0,0) / det;
390 Eigen::Matrix<ArenaVec<double>,3,3> B;
392 B(0,0) = A(1,1)*A(2,2) - A(2,1)*A(1,2);
393 B(1,0) = A(2,0)*A(1,2) - A(1,0)*A(2,2);
394 B(2,0) = A(1,0)*A(2,1) - A(2,0)*A(1,1);
397 B(0,0) = B(0,0) / det;
398 B(1,0) = B(1,0) / det;
399 B(2,0) = B(2,0) / det;
401 B(0,1) = (A(2,1)*A(0,2) - A(0,1)*A(2,2)) / det;
402 B(1,1) = (A(0,0)*A(2,2) - A(2,0)*A(0,2)) / det;
403 B(2,1) = (A(2,0)*A(0,1) - A(0,0)*A(2,1)) / det;
405 B(0,2) = (A(0,1)*A(1,2) - A(1,1)*A(0,2)) / det;
406 B(1,2) = (A(1,0)*A(0,2) - A(0,0)*A(1,2)) / det;
407 B(2,2) = (A(0,0)*A(1,1) - A(1,0)*A(0,1)) / det;