// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2015 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "crouzeix_raviart_massmatrix.h" #include "unique_simplices.h" #include "oriented_facets.h" #include "is_edge_manifold.h" #include "doublearea.h" #include "volume.h" #include #include template void igl::crouzeix_raviart_massmatrix( const Eigen::MatrixBase & V, const Eigen::MatrixBase & F, Eigen::SparseMatrix & M, Eigen::PlainObjectBase & E, Eigen::PlainObjectBase & EMAP) { // All occurrences of directed "facets" Eigen::MatrixXi allE; oriented_facets(F,allE); Eigen::VectorXi _1; unique_simplices(allE,E,_1,EMAP); return crouzeix_raviart_massmatrix(V,F,E,EMAP,M); } template void igl::crouzeix_raviart_massmatrix( const Eigen::MatrixBase & V, const Eigen::MatrixBase & F, const Eigen::MatrixBase & E, const Eigen::MatrixBase & EMAP, Eigen::SparseMatrix & M) { using namespace Eigen; using namespace std; // Mesh should be edge-manifold (TODO: replace `is_edge_manifold` with // `is_facet_manifold`) assert(F.cols() != 3 || is_edge_manifold(F)); // number of elements (triangles) const int m = F.rows(); // Get triangle areas/volumes VectorXd TA; // Element simplex size const int ss = F.cols(); switch(ss) { default: assert(false && "Unsupported simplex size"); case 3: doublearea(V,F,TA); TA *= 0.5; break; case 4: volume(V,F,TA); break; } vector > MIJV(ss*m); assert(EMAP.size() == m*ss); for(int f = 0;f(EMAP(f+m*c),EMAP(f+m*c),TA(f)/(double)(ss)); } } M.resize(E.rows(),E.rows()); M.setFromTriplets(MIJV.begin(),MIJV.end()); } #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation // generated by autoexplicit.sh template void igl::crouzeix_raviart_massmatrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::SparseMatrix&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::crouzeix_raviart_massmatrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::SparseMatrix&); template void igl::crouzeix_raviart_massmatrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::SparseMatrix&); #endif