21 #ifndef PATCH_DATA_TABLE_HH_
22 #define PATCH_DATA_TABLE_HH_
27 #include <Eigen/Dense>
31 typedef Eigen::Array<double,Eigen::Dynamic,1>
ArrayDbl;
32 typedef Eigen::Array<uint,Eigen::Dynamic,1>
ArrayInt;
33 typedef Eigen::Vector<ArrayDbl,Eigen::Dynamic>
TableDbl;
34 typedef Eigen::Vector<ArrayInt,Eigen::Dynamic>
TableInt;
42 for (
uint i=0; i<table.rows(); ++i) {
43 table(i).resize(size);
44 table(i).setZero(size,1);
57 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,1,2> &A) {
58 Eigen::Matrix<ArrayDbl,1,1> res;
59 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1);
63 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,2,1> &A) {
64 Eigen::Matrix<ArrayDbl,1,1> res;
65 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0);
69 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,1,3> &A) {
70 Eigen::Matrix<ArrayDbl,1,1> res;
71 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
75 inline Eigen::Matrix<ArrayDbl,1,1>
normal_matrix(
const Eigen::Matrix<ArrayDbl,3,1> &A) {
76 Eigen::Matrix<ArrayDbl,1,1> res;
77 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
81 inline Eigen::Matrix<ArrayDbl,2,2>
normal_matrix(
const Eigen::Matrix<ArrayDbl,2,3> &A) {
82 Eigen::Matrix<ArrayDbl,2,2> res;
83 res(0,0) = A(0,0)*A(0,0)+A(0,1)*A(0,1)+A(0,2)*A(0,2);
84 res(0,1) = A(0,0)*A(1,0)+A(0,1)*A(1,1)+A(0,2)*A(1,2);
85 res(1,0) = A(1,0)*A(0,0)+A(1,1)*A(0,1)+A(1,2)*A(0,2);
86 res(1,1) = A(1,0)*A(1,0)+A(1,1)*A(1,1)+A(1,2)*A(1,2);
90 inline Eigen::Matrix<ArrayDbl,2,2>
normal_matrix(
const Eigen::Matrix<ArrayDbl,3,2> &A) {
91 Eigen::Matrix<ArrayDbl,2,2> res;
92 res(0,0) = A(0,0)*A(0,0)+A(1,0)*A(1,0)+A(2,0)*A(2,0);
93 res(0,1) = A(0,0)*A(0,1)+A(1,0)*A(1,1)+A(2,0)*A(2,1);
94 res(1,0) = A(0,1)*A(0,0)+A(1,1)*A(1,0)+A(2,1)*A(2,0);
95 res(1,1) = A(0,1)*A(0,1)+A(1,1)*A(1,1)+A(2,1)*A(2,1);
108 return M(0,0)*M(1,1) - M(1,0)*M(0,1);
113 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) )
114 - ( 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) );
161 template<
int m,
int n>
162 Eigen::Matrix<ArrayDbl,n,m>
inverse(
const Eigen::Matrix<ArrayDbl,m,n> &A) {
168 template<>
inline Eigen::Matrix<ArrayDbl,1,1>
inverse<1,1>(
const Eigen::Matrix<ArrayDbl,1,1> &A)
170 Eigen::Matrix<ArrayDbl,1,1> B;
171 B(0,0) = A(0,0).inverse();
175 template<>
inline Eigen::Matrix<ArrayDbl,2,2>
inverse<2,2>(
const Eigen::Matrix<ArrayDbl,2,2> &A)
177 Eigen::Matrix<ArrayDbl,2,2> B;
180 B(0,0) = A(1,1) / det;
181 B(0,1) = -A(0,1) / det;
182 B(1,0) = -A(1,0) / det;
183 B(1,1) = A(0,0) / det;
187 template<>
inline Eigen::Matrix<ArrayDbl,3,3>
inverse<3,3>(
const Eigen::Matrix<ArrayDbl,3,3> &A)
189 Eigen::Matrix<ArrayDbl,3,3> B;
191 B(0,0) = A(1,1)*A(2,2) - A(2,1)*A(1,2);
192 B(1,0) = A(2,0)*A(1,2) - A(1,0)*A(2,2);
193 B(2,0) = A(1,0)*A(2,1) - A(2,0)*A(1,1);
195 ArrayDbl det = A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0);
196 B(0,0) = B(0,0) / det;
197 B(1,0) = B(1,0) / det;
198 B(2,0) = B(2,0) / det;
200 B(0,1) = (A(2,1)*A(0,2) - A(0,1)*A(2,2)) / det;
201 B(1,1) = (A(0,0)*A(2,2) - A(2,0)*A(0,2)) / det;
202 B(2,1) = (A(2,0)*A(0,1) - A(0,0)*A(2,1)) / det;
204 B(0,2) = (A(0,1)*A(1,2) - A(1,1)*A(0,2)) / det;
205 B(1,2) = (A(1,0)*A(0,2) - A(0,0)*A(1,2)) / det;
206 B(2,2) = (A(0,0)*A(1,1) - A(1,0)*A(0,1)) / det;
211 template<>
inline Eigen::Matrix<ArrayDbl,2,1>
inverse<1,2>(
const Eigen::Matrix<ArrayDbl,1,2> &A)
216 template<>
inline Eigen::Matrix<ArrayDbl,3,1>
inverse<1,3>(
const Eigen::Matrix<ArrayDbl,1,3> &A)
221 template<>
inline Eigen::Matrix<ArrayDbl,3,2>
inverse<2,3>(
const Eigen::Matrix<ArrayDbl,2,3> &A)
227 template<
unsigned int spacedim,
unsigned int dim>
228 Eigen::Matrix<ArrayDbl, spacedim, dim>
jacobian(
const Eigen::Matrix<ArrayDbl, spacedim, dim+1> &coords)
230 Eigen::Matrix<ArrayDbl, spacedim, dim> jac;
231 for (
unsigned int i=0; i<spacedim; i++)
232 for (
unsigned int j=0; j<dim; j++)
233 jac(i,j) = coords(i,j+1) - coords(i,0);