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;
49 template<
int m,
int n>
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);
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);
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);
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);
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);
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);
105 return M(0,0)*M(1,1) - M(1,0)*M(0,1);
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) );
158 template<
int m,
int n>
159 Eigen::Matrix<ArrayDbl,n,m>
inverse(
const Eigen::Matrix<ArrayDbl,m,n> &A) {
165 template<>
inline Eigen::Matrix<ArrayDbl,1,1>
inverse<1,1>(
const Eigen::Matrix<ArrayDbl,1,1> &A)
167 Eigen::Matrix<ArrayDbl,1,1> B;
168 B(0,0) = A(0,0).inverse();
172 template<>
inline Eigen::Matrix<ArrayDbl,2,2>
inverse<2,2>(
const Eigen::Matrix<ArrayDbl,2,2> &A)
174 Eigen::Matrix<ArrayDbl,2,2> B;
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;
184 template<>
inline Eigen::Matrix<ArrayDbl,3,3>
inverse<3,3>(
const Eigen::Matrix<ArrayDbl,3,3> &A)
186 Eigen::Matrix<ArrayDbl,3,3> B;
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);
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;
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;
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;
208 template<>
inline Eigen::Matrix<ArrayDbl,2,1>
inverse<1,2>(
const Eigen::Matrix<ArrayDbl,1,2> &A)
213 template<>
inline Eigen::Matrix<ArrayDbl,3,1>
inverse<1,3>(
const Eigen::Matrix<ArrayDbl,1,3> &A)
218 template<>
inline Eigen::Matrix<ArrayDbl,3,2>
inverse<2,3>(
const Eigen::Matrix<ArrayDbl,2,3> &A)
227 for (
uint i=0; i<table.rows(); ++i) {
228 table(i).resize(size);
229 table(i).setZero(size,1);
234 template<
unsigned int spacedim,
unsigned int dim>
235 Eigen::Matrix<ArrayDbl, spacedim, dim>
jacobian(
const Eigen::Matrix<ArrayDbl, spacedim, dim+1> &coords)
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);
254 template<
int m,
int n>
260 Eigen::Matrix<ArenaVec<double>,1,1> res;
261 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
266 Eigen::Matrix<ArenaVec<double>,1,1> res;
267 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
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);
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);
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);
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);
310 return M(0,0)*M(1,1) - M(1,0)*M(0,1);
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) );
363 template<
int m,
int n>
372 Eigen::Matrix<ArenaVec<double>,1,1> B;
373 B(0,0) = A(0,0).inverse();
379 Eigen::Matrix<ArenaVec<double>,2,2> B;
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;
391 Eigen::Matrix<ArenaVec<double>,3,3> B;
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);
398 B(0,0) = B(0,0) / det;
399 B(1,0) = B(1,0) / det;
400 B(2,0) = B(2,0) / det;
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;
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;