double GreenStrain_LIMSolver3D::computeFunction(const Eigen::Matrix<double,Eigen::Dynamic,1>& x) { // green strain energy double shape = 0; Eigen::Matrix3d I = Eigen::Matrix3d::Identity(); 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; Eigen::Matrix3d F = V*Ms.block<4,3>(0,3*t); Eigen::Matrix3d E = (F.transpose()*F - I); shape += E.squaredNorm()*Divider; } return shape; }