void GreenStrain_LIMSolver2D::computeHessian(const Eigen::Matrix<double,Eigen::Dynamic,1>& x, const Eigen::Matrix<double*,Eigen::Dynamic,1>& hess) { // green strain tensor energy Eigen::Matrix<double,2,3> S; for(int t=0;t<mesh->Triangles->rows();t++) { Eigen::Vector2d A(x[TriangleVertexIdx.coeff(0,t)],x[TriangleVertexIdx.coeff(1,t)]); Eigen::Vector2d B(x[TriangleVertexIdx.coeff(2,t)],x[TriangleVertexIdx.coeff(3,t)]); Eigen::Vector2d C(x[TriangleVertexIdx.coeff(4,t)],x[TriangleVertexIdx.coeff(5,t)]); Eigen::Matrix<double,2,3> V; V.col(0) = A; V.col(1) = B; V.col(2) = C; // hessian(E) = 4*r_x'*((SMM'V'V+VMM'*(V'S+SV))*MM' - SMM')*c_x Eigen::Matrix3d VTV = V.transpose()*V; Eigen::Matrix3d MMT = MMTs.block<3,3>(0,3*t); Eigen::Matrix<double,2,3> VMMT = V*MMT; Eigen::Matrix3d MMTVTV = MMT*VTV; int numElem = 0; for(int r=0;r<6;r++) { S = Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>::Zero(2,3); S.coeffRef(r) = 1; Eigen::Matrix<double,2,3> Temp = 4*((S*MMTVTV + VMMT*(V.transpose()*S+S.transpose()*V))*MMT - S*MMT); for(int c=r;c<6;c++) *denseHessianCoeffs(numElem++,t) += Temp.coeff(c)*Divider; } } }
void GreenStrain_LIMSolver3D::computeHessian(const Eigen::Matrix<double,Eigen::Dynamic,1>& x, const Eigen::Matrix<double*,Eigen::Dynamic,1>& hess) { // green strain tensor energy Eigen::Matrix<double,3,4> S; for(int t=0;t<mesh->Tetrahedra->rows();t++) { Eigen::Vector3d A(x[TetrahedronVertexIdx.coeff(0,t)],x[TetrahedronVertexIdx.coeff(1,t)],x[TetrahedronVertexIdx.coeff(2,t)]); Eigen::Vector3d B(x[TetrahedronVertexIdx.coeff(3,t)],x[TetrahedronVertexIdx.coeff(4,t)],x[TetrahedronVertexIdx.coeff(5,t)]); Eigen::Vector3d C(x[TetrahedronVertexIdx.coeff(6,t)],x[TetrahedronVertexIdx.coeff(7,t)],x[TetrahedronVertexIdx.coeff(8,t)]); Eigen::Vector3d D(x[TetrahedronVertexIdx.coeff(9,t)],x[TetrahedronVertexIdx.coeff(10,t)],x[TetrahedronVertexIdx.coeff(11,t)]); Eigen::Matrix<double,3,4> V; V.col(0) = A; V.col(1) = B; V.col(2) = C; V.col(3) = D; // hessian(E) = 4*r_x'*((SMM'V'V+VMM'*(V'S+SV))*MM' - SMM')*c_x Eigen::Matrix<double,4,4> VTV = V.transpose()*V; Eigen::Matrix<double,4,4> MMT = MMTs.block<4,4>(0,4*t); Eigen::Matrix<double,3,4> VMMT = V*MMT; Eigen::Matrix<double,4,4> MMTVTV = MMT*VTV; int numElem = 0; for(int r=0;r<12;r++) { S = Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic>::Zero(3,4); S.coeffRef(r) = 1; Eigen::Matrix<double,3,4> Temp = 4*((S*MMTVTV + VMMT*(V.transpose()*S+S.transpose()*V))*MMT - S*MMT); for(int c=r;c<12;c++) *denseHessianCoeffs(numElem++,t) += Temp.coeff(c)*Divider; } } }