21 #ifndef PATCH_DATA_TABLE_HH_
22 #define PATCH_DATA_TABLE_HH_
29 #include <Eigen/Dense>
30 #include <unsupported/Eigen/MatrixFunctions>
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;
50 template<
int m,
int n>
55 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,1,2> &A) {
56 Eigen::Matrix<ArrayDbl,1,1> res;
57 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
61 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,2,1> &A) {
62 Eigen::Matrix<ArrayDbl,1,1> res;
63 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
67 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,1,3> &A) {
68 Eigen::Matrix<ArrayDbl,1,1> res;
69 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
73 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,3,1> &A) {
74 Eigen::Matrix<ArrayDbl,1,1> res;
75 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
79 inline Eigen::Matrix<ArrayDbl,2,2>
normal_matrix(
const Eigen::Matrix<ArrayDbl,2,3> &A) {
80 Eigen::Matrix<ArrayDbl,2,2> res;
81 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
82 res(0,1) = A(0,0)*A(1,0)+A(0,1)*A(1,1)+A(0,2)*A(1,2);
83 res(1,0) = A(1,0)*A(0,0)+A(1,1)*A(0,1)+A(1,2)*A(0,2);
84 res(1,1) = A(1,0)*A(1,0)+A(1,1)*A(1,1)+A(1,2)*A(1,2);
88 inline Eigen::Matrix<ArrayDbl,2,2>
normal_matrix(
const Eigen::Matrix<ArrayDbl,3,2> &A) {
89 Eigen::Matrix<ArrayDbl,2,2> res;
90 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
91 res(0,1) = A(0,0)*A(0,1)+A(1,0)*A(1,1)+A(2,0)*A(2,1);
92 res(1,0) = A(0,1)*A(0,0)+A(1,1)*A(1,0)+A(2,1)*A(2,0);
93 res(1,1) = A(0,1)*A(0,1)+A(1,1)*A(1,1)+A(2,1)*A(2,1);
106 return M(0,0)*M(1,1) - M(1,0)*M(0,1);
111 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) )
112 - ( 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) );
159 template<
int m,
int n>
160 Eigen::Matrix<ArrayDbl,n,m>
inverse(
const Eigen::Matrix<ArrayDbl,m,n> &A) {
166 template<>
inline Eigen::Matrix<ArrayDbl,1,1>
inverse<1,1>(
const Eigen::Matrix<ArrayDbl,1,1> &A)
168 Eigen::Matrix<ArrayDbl,1,1> B;
169 B(0,0) = A(0,0).inverse();
173 template<>
inline Eigen::Matrix<ArrayDbl,2,2>
inverse<2,2>(
const Eigen::Matrix<ArrayDbl,2,2> &A)
175 Eigen::Matrix<ArrayDbl,2,2> B;
178 B(0,0) = A(1,1) / det;
179 B(0,1) = A(0,1) / det * (-1);
180 B(1,0) = A(1,0) / det * (-1);
181 B(1,1) = A(0,0) / det;
185 template<>
inline Eigen::Matrix<ArrayDbl,3,3>
inverse<3,3>(
const Eigen::Matrix<ArrayDbl,3,3> &A)
187 Eigen::Matrix<ArrayDbl,3,3> B;
189 B(0,0) = A(1,1)*A(2,2) - A(2,1)*A(1,2);
190 B(1,0) = A(2,0)*A(1,2) - A(1,0)*A(2,2);
191 B(2,0) = A(1,0)*A(2,1) - A(2,0)*A(1,1);
193 ArrayDbl det = A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0);
194 B(0,0) = B(0,0) / det;
195 B(1,0) = B(1,0) / det;
196 B(2,0) = B(2,0) / det;
198 B(0,1) = (A(2,1)*A(0,2) - A(0,1)*A(2,2)) / det;
199 B(1,1) = (A(0,0)*A(2,2) - A(2,0)*A(0,2)) / det;
200 B(2,1) = (A(2,0)*A(0,1) - A(0,0)*A(2,1)) / det;
202 B(0,2) = (A(0,1)*A(1,2) - A(1,1)*A(0,2)) / det;
203 B(1,2) = (A(1,0)*A(0,2) - A(0,0)*A(1,2)) / det;
204 B(2,2) = (A(0,0)*A(1,1) - A(1,0)*A(0,1)) / det;
209 template<>
inline Eigen::Matrix<ArrayDbl,2,1>
inverse<1,2>(
const Eigen::Matrix<ArrayDbl,1,2> &A)
214 template<>
inline Eigen::Matrix<ArrayDbl,3,1>
inverse<1,3>(
const Eigen::Matrix<ArrayDbl,1,3> &A)
219 template<>
inline Eigen::Matrix<ArrayDbl,3,2>
inverse<2,3>(
const Eigen::Matrix<ArrayDbl,2,3> &A)
228 for (
uint i=0; i<table.rows(); ++i) {
229 table(i).resize(size);
230 table(i).setZero(size,1);
235 template<
unsigned int spacedim,
unsigned int dim>
236 Eigen::Matrix<ArrayDbl, spacedim, dim>
jacobian(
const Eigen::Matrix<ArrayDbl, spacedim, dim+1> &coords)
238 Eigen::Matrix<ArrayDbl, spacedim, dim> jac;
239 for (
unsigned int i=0; i<spacedim; i++)
240 for (
unsigned int j=0; j<dim; j++)
241 jac(i,j) = coords(i,j+1) - coords(i,0);
255 template<
int m,
int n>
261 Eigen::Matrix<ArenaVec<double>,1,1> res;
262 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
267 Eigen::Matrix<ArenaVec<double>,1,1> res;
268 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
273 Eigen::Matrix<ArenaVec<double>,1,1> res;
274 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
279 Eigen::Matrix<ArenaVec<double>,1,1> res;
280 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
285 Eigen::Matrix<ArenaVec<double>,2,2> res;
286 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
287 res(0,1) = A(0,0)*A(1,0)+A(0,1)*A(1,1)+A(0,2)*A(1,2);
288 res(1,0) = A(1,0)*A(0,0)+A(1,1)*A(0,1)+A(1,2)*A(0,2);
289 res(1,1) = A(1,0)*A(1,0)+A(1,1)*A(1,1)+A(1,2)*A(1,2);
294 Eigen::Matrix<ArenaVec<double>,2,2> res;
295 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
296 res(0,1) = A(0,0)*A(0,1)+A(1,0)*A(1,1)+A(2,0)*A(2,1);
297 res(1,0) = A(0,1)*A(0,0)+A(1,1)*A(1,0)+A(2,1)*A(2,0);
298 res(1,1) = A(0,1)*A(0,1)+A(1,1)*A(1,1)+A(2,1)*A(2,1);
311 return M(0,0)*M(1,1) - M(1,0)*M(0,1);
316 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) )
317 - ( 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) );
364 template<
int m,
int n>
373 Eigen::Matrix<ArenaVec<double>,1,1> B;
374 B(0,0) = A(0,0).inverse();
380 Eigen::Matrix<ArenaVec<double>,2,2> B;
383 B(0,0) = A(1,1) / det;
384 B(0,1) = A(0,1) / det * (-1);
385 B(1,0) = A(1,0) / det * (-1);
386 B(1,1) = A(0,0) / det;
392 Eigen::Matrix<ArenaVec<double>,3,3> B;
394 B(0,0) = A(1,1)*A(2,2) - A(2,1)*A(1,2);
395 B(1,0) = A(2,0)*A(1,2) - A(1,0)*A(2,2);
396 B(2,0) = A(1,0)*A(2,1) - A(2,0)*A(1,1);
399 B(0,0) = B(0,0) / det;
400 B(1,0) = B(1,0) / det;
401 B(2,0) = B(2,0) / det;
403 B(0,1) = (A(2,1)*A(0,2) - A(0,1)*A(2,2)) / det;
404 B(1,1) = (A(0,0)*A(2,2) - A(2,0)*A(0,2)) / det;
405 B(2,1) = (A(2,0)*A(0,1) - A(0,0)*A(2,1)) / det;
407 B(0,2) = (A(0,1)*A(1,2) - A(1,1)*A(0,2)) / det;
408 B(1,2) = (A(1,0)*A(0,2) - A(0,0)*A(1,2)) / det;
409 B(2,2) = (A(0,0)*A(1,1) - A(1,0)*A(0,1)) / det;