From 520d8b25abc0e743e9b3f4c9a7650bd0ffab2942 Mon Sep 17 00:00:00 2001 From: Lieunoir Date: Tue, 4 Jun 2024 19:04:12 +0200 Subject: [PATCH 01/11] Add Corrected calculus and FEM --- src/DGtal/dec/InterpolatedCorrectedCalculus.h | 737 ++++++++++++++++++ src/DGtal/dec/NormalCorrectedFEM.h | 404 ++++++++++ src/DGtal/dec/SurfaceDEC.h | 99 +++ tests/dec/CMakeLists.txt | 5 +- tests/dec/testCorrectedFEM.cpp | 185 +++++ .../dec/testInterpolatedCorrectedCalculus.cpp | 229 ++++++ tests/dec/testPolygonalCalculus.cpp | 72 +- 7 files changed, 1693 insertions(+), 38 deletions(-) create mode 100644 src/DGtal/dec/InterpolatedCorrectedCalculus.h create mode 100644 src/DGtal/dec/NormalCorrectedFEM.h create mode 100644 src/DGtal/dec/SurfaceDEC.h create mode 100644 tests/dec/testCorrectedFEM.cpp create mode 100644 tests/dec/testInterpolatedCorrectedCalculus.cpp diff --git a/src/DGtal/dec/InterpolatedCorrectedCalculus.h b/src/DGtal/dec/InterpolatedCorrectedCalculus.h new file mode 100644 index 0000000000..d1ebb2f9c7 --- /dev/null +++ b/src/DGtal/dec/InterpolatedCorrectedCalculus.h @@ -0,0 +1,737 @@ +#pragma once + +#include "DGtal/base/Common.h" +#include "DGtal/dec/SurfaceDEC.h" +#include "DGtal/shapes/SurfaceMesh.h" + +namespace DGtal +{ + + template + class InterpolatedCorrectedCalculus + : public SurfaceDEC, + TLinearAlgebraBackend> + { + friend class SurfaceDEC; + + public: + typedef TLinearAlgebraBackend LinearAlgebraBackend; + typedef TRealPoint RealPoint; + typedef TRealVector RealVector; + typedef typename LinearAlgebraBackend::DenseVector::Index Index; + typedef typename LinearAlgebraBackend::DenseVector::Scalar Scalar; + typedef typename LinearAlgebraBackend::SparseMatrix LinearOperator; + typedef typename LinearAlgebraBackend::DenseMatrix DenseMatrix; + typedef typename LinearAlgebraBackend::DenseVector DenseVector; + typedef SurfaceMesh Mesh; + typedef typename Mesh::Vertex Vertex; + typedef typename Mesh::Edge Edge; + typedef typename Mesh::Face Face; + typedef typename Mesh::Face Corner; + typedef typename Mesh::Size Size; + + /// A triplet (row, col, value), useful for initializaing sparse matrices. + typedef typename LinearAlgebraBackend::Triplet Triplet; + /// A range of triplets (row,col,value). + typedef std::vector Triplets; + + private: + const Mesh * myMesh; + bool use2ndOrder = false; + double lambda = 1.; + + DenseMatrix quadrangleSharpLocalMatrix( Face f ) const + { + DenseMatrix Basis = DenseMatrix::Zero( 3, 3 ); + DenseMatrix Gavg = DenseMatrix::Zero( 3, 4 ); + DenseMatrix Gedge = DenseMatrix::Zero( 3, 4 ); + DenseMatrix S = DenseMatrix::Zero( 3, 4 ); + const auto vtcs = myMesh->incidentVertices( f ); + const auto i = vtcs[ 0 ]; + const auto j = vtcs[ 1 ]; + const auto k = vtcs[ 2 ]; + const auto l = vtcs[ 3 ]; + const auto dxij = myMesh->position( j ) - myMesh->position( i ); + const auto dxjk = myMesh->position( k ) - myMesh->position( j ); + const auto xij = dxij.getNormalized(); + const auto xjk = dxjk.getNormalized(); + + const RealVector n = xij.crossProduct( xjk ); + const Dimension x = fabs( xij[ 0 ] ) > fabs( xij[ 1 ] ) + ? ( fabs( xij[ 0 ] ) > fabs( xij[ 2 ] ) ? 0 : 2 ) + : ( fabs( xij[ 1 ] ) > fabs( xij[ 2 ] ) ? 1 : 2 ); + const Dimension y = fabs( xjk[ 0 ] ) > fabs( xjk[ 1 ] ) + ? ( fabs( xjk[ 0 ] ) > fabs( xjk[ 2 ] ) ? 0 : 2 ) + : ( fabs( xjk[ 1 ] ) > fabs( xjk[ 2 ] ) ? 1 : 2 ); + const Dimension z = fabs( n[ 0 ] ) > fabs( n[ 1 ] ) + ? ( fabs( n[ 0 ] ) > fabs( n[ 2 ] ) ? 0 : 2 ) + : ( fabs( n[ 1 ] ) > fabs( n[ 2 ] ) ? 1 : 2 ); + if ( ( x == y ) || ( x == z ) || ( y == z ) || ( x + y + z > 3 ) ) + trace.warning() << "Bad basis: " << x << y << z << std::endl; + const Scalar sign_x = xij[ x ] > 0.0 ? 1.0 : -1.0; + const Scalar sign_y = xjk[ y ] > 0.0 ? 1.0 : -1.0; + const Scalar sign_z = n[ z ] > 0.0 ? 1.0 : -1.0; + + if ( use2ndOrder == false ) + { + const auto ui = myMesh->vertexNormal( i ); + const auto uj = myMesh->vertexNormal( j ); + const auto uk = myMesh->vertexNormal( k ); + const auto ul = myMesh->vertexNormal( l ); + const auto u0 = 0.5 * ( ui + uj ); + const auto u1 = 0.5 * ( uj + uk ); + const auto u2 = 0.5 * ( uk + ul ); + const auto u3 = 0.5 * ( ul + ui ); + const auto u = 0.5 * ( u0 + u2 ); + // We put u into the "natural" frame of the surfel + const auto ux = xij.dot( u ); + const auto uy = xjk.dot( u ); + const auto uz = n.dot( u ); + Gavg.coeffRef( 0, 0 ) = uz; + Gavg.coeffRef( 0, 2 ) = -uz; + Gavg.coeffRef( 1, 1 ) = uz; + Gavg.coeffRef( 1, 3 ) = -uz; + Gavg.coeffRef( 2, 0 ) = -ux; + Gavg.coeffRef( 2, 1 ) = -uy; + Gavg.coeffRef( 2, 2 ) = ux; + Gavg.coeffRef( 2, 3 ) = uy; + Gavg /= 3.0; + Gedge.coeffRef( 0, 0 ) = n.dot( u0 ); // u0[z]; + Gedge.coeffRef( 0, 2 ) = -n.dot( u2 ); // -u2[z]; + Gedge.coeffRef( 1, 1 ) = n.dot( u1 ); // u1[z]; + Gedge.coeffRef( 1, 3 ) = -n.dot( u3 ); // -u3[z]; + Gedge.coeffRef( 2, 0 ) = -xij.dot( u0 ); // -u0[x]; + Gedge.coeffRef( 2, 1 ) = -xjk.dot( u1 ); // -u1[y]; + Gedge.coeffRef( 2, 2 ) = xij.dot( u2 ); // u2[x]; + Gedge.coeffRef( 2, 3 ) = xjk.dot( u3 ); // u3[y]; + Gedge /= 6.0; + // We compute the change of basis to come back to the canonic frame of + // R3. + S = Gavg + Gedge; + } + else + { // use2ndOrder + const auto u00 = myMesh->vertexNormal( i ); + const auto u10 = myMesh->vertexNormal( j ); + const auto u11 = myMesh->vertexNormal( k ); + const auto u01 = myMesh->vertexNormal( l ); + const auto ux00 = xij.dot( u00 ); + const auto ux10 = xij.dot( u10 ); + const auto ux11 = xij.dot( u11 ); + const auto ux01 = xij.dot( u01 ); + const auto uy00 = xjk.dot( u00 ); + const auto uy10 = xjk.dot( u10 ); + const auto uy11 = xjk.dot( u11 ); + const auto uy01 = xjk.dot( u01 ); + const auto uz00 = n.dot( u00 ); + const auto uz10 = n.dot( u10 ); + const auto uz11 = n.dot( u11 ); + const auto uz01 = n.dot( u01 ); + const auto a = 1.0 / ( u00 + u10 ).norm(); + const auto b = 1.0 / ( u10 + u11 ).norm(); + const auto c = 1.0 / ( u11 + u01 ).norm(); + const auto d = 1.0 / ( u01 + u00 ).norm(); + const auto e = 1.0 / ( u00 + u10 + u11 + u01 ).norm(); + S.coeffRef( 0, 0 ) = + ( 4 * a + 2 * d + 8 * e + 1 ) * uz00 + 2 * ( d + 4 * e ) * uz01 + + ( 4 * a + 2 * b + 8 * e + 1 ) * uz10 + 2 * ( b + 4 * e ) * uz11; + S.coeffRef( 0, 2 ) = + -2 * ( d + 4 * e ) * uz00 - ( 4 * c + 2 * d + 8 * e + 1 ) * uz01 - + 2 * ( b + 4 * e ) * uz10 - ( 2 * b + 4 * c + 8 * e + 1 ) * uz11; + S.coeffRef( 1, 1 ) = 2 * ( a + 4 * e ) * uz00 + + 2 * ( c + 4 * e ) * uz01 + + ( 2 * a + 4 * b + 8 * e + 1 ) * uz10 + + ( 4 * b + 2 * c + 8 * e + 1 ) * uz11; + S.coeffRef( 1, 3 ) = -( 2 * a + 4 * d + 8 * e + 1 ) * uz00 - + ( 2 * c + 4 * d + 8 * e + 1 ) * uz01 - + 2 * ( a + 4 * e ) * uz10 - + 2 * ( c + 4 * e ) * uz11; + S.coeffRef( 2, 0 ) = + -( 4 * a + 2 * d + 8 * e + 1 ) * ux00 - 2 * ( d + 4 * e ) * ux01 - + ( 4 * a + 2 * b + 8 * e + 1 ) * ux10 - 2 * ( b + 4 * e ) * ux11; + S.coeffRef( 2, 1 ) = -2 * ( a + 4 * e ) * uy00 - + 2 * ( c + 4 * e ) * uy01 - + ( 2 * a + 4 * b + 8 * e + 1 ) * uy10 - + ( 4 * b + 2 * c + 8 * e + 1 ) * uy11; + S.coeffRef( 2, 2 ) = + 2 * ( d + 4 * e ) * ux00 + ( 4 * c + 2 * d + 8 * e + 1 ) * ux01 + + 2 * ( b + 4 * e ) * ux10 + ( 2 * b + 4 * c + 8 * e + 1 ) * ux11; + S.coeffRef( 2, 3 ) = ( 2 * a + 4 * d + 8 * e + 1 ) * uy00 + + ( 2 * c + 4 * d + 8 * e + 1 ) * uy01 + + 2 * ( a + 4 * e ) * uy10 + + 2 * ( c + 4 * e ) * uy11; + S /= 36.0; + } + const Scalar h = fabs( dxij[ x ] ); + Basis.coeffRef( 0, x ) = sign_x * h; + Basis.coeffRef( 1, y ) = sign_y * h; + Basis.coeffRef( 2, z ) = sign_z * h; + const auto a_f = quadrangleArea( f ); + return ( Basis.transpose() / a_f ) * S; + } + + DenseMatrix quadrangleFlatLocalMatrix( Face f ) const + { + DenseMatrix Basis = DenseMatrix::Zero( 3, 3 ); + DenseMatrix V = DenseMatrix::Zero( 4, 3 ); + const auto vtcs = myMesh->incidentVertices( f ); + if ( vtcs.size() != 4 ) + { + trace.error() + << "[SurfaceMeshDEC::quadrangleCorrectedDigitalFlatLocalMatrix]" + << " restricted to quadrangle faces." << std::endl; + return V; + } + const auto i = vtcs[ 0 ]; + const auto j = vtcs[ 1 ]; + const auto k = vtcs[ 2 ]; + const auto l = vtcs[ 3 ]; + const auto dxij = myMesh->position( j ) - myMesh->position( i ); + const auto dxjk = myMesh->position( k ) - myMesh->position( j ); + const auto xij = dxij.getNormalized(); + const auto xjk = dxjk.getNormalized(); + + const RealVector n = xij.crossProduct( xjk ); + const Dimension x = fabs( xij[ 0 ] ) > fabs( xij[ 1 ] ) + ? ( fabs( xij[ 0 ] ) > fabs( xij[ 2 ] ) ? 0 : 2 ) + : ( fabs( xij[ 1 ] ) > fabs( xij[ 2 ] ) ? 1 : 2 ); + const Dimension y = fabs( xjk[ 0 ] ) > fabs( xjk[ 1 ] ) + ? ( fabs( xjk[ 0 ] ) > fabs( xjk[ 2 ] ) ? 0 : 2 ) + : ( fabs( xjk[ 1 ] ) > fabs( xjk[ 2 ] ) ? 1 : 2 ); + const Dimension z = fabs( n[ 0 ] ) > fabs( n[ 1 ] ) + ? ( fabs( n[ 0 ] ) > fabs( n[ 2 ] ) ? 0 : 2 ) + : ( fabs( n[ 1 ] ) > fabs( n[ 2 ] ) ? 1 : 2 ); + if ( ( x == y ) || ( x == z ) || ( y == z ) || ( x + y + z > 3 ) ) + trace.warning() << "Bad basis: " << x << y << z << std::endl; + const Scalar sign_x = xij[ x ] > 0.0 ? 1.0 : -1.0; + const Scalar sign_y = xjk[ y ] > 0.0 ? 1.0 : -1.0; + const Scalar sign_z = n[ z ] > 0.0 ? 1.0 : -1.0; + const auto ui = myMesh->vertexNormal( i ); + const auto uj = myMesh->vertexNormal( j ); + const auto uk = myMesh->vertexNormal( k ); + const auto ul = myMesh->vertexNormal( l ); + // We put all the u into the "natural" frame of the surfel + const auto uix = xij.dot( ui ); + const auto uiy = xjk.dot( ui ); + const auto uiz = n.dot( ui ); + const auto ujx = xij.dot( uj ); + const auto ujy = xjk.dot( uj ); + const auto ujz = n.dot( uj ); + const auto ukx = xij.dot( uk ); + const auto uky = xjk.dot( uk ); + const auto ukz = n.dot( uk ); + const auto ulx = xij.dot( ul ); + const auto uly = xjk.dot( ul ); + const auto ulz = n.dot( ul ); + if ( !use2ndOrder ) + { + V.coeffRef( 0, 0 ) = + 6.0 - 2.0 * ( 2 * uix + ujx ) * uix - 2.0 * ( uix + 2 * ujx ) * ujx; + V.coeffRef( 0, 1 ) = + -2.0 * ( 2 * uix + ujx ) * uiy - 2.0 * ( uix + 2 * ujx ) * ujy; + V.coeffRef( 0, 2 ) = + -2.0 * ( 2 * uix + ujx ) * uiz - 2.0 * ( uix + 2 * ujx ) * ujz; + V.coeffRef( 1, 0 ) = + -2.0 * ( 2 * ujy + uky ) * ujx - 2.0 * ( ujy + 2 * uky ) * ukx; + V.coeffRef( 1, 1 ) = + 6.0 - 2.0 * ( 2 * ujy + uky ) * ujy - 2.0 * ( ujy + 2 * uky ) * uky; + V.coeffRef( 1, 2 ) = + -2.0 * ( 2 * ujy + uky ) * ujz - 2.0 * ( ujy + 2 * uky ) * ukz; + V.coeffRef( 2, 0 ) = + -6.0 + 2.0 * ( 2 * ukx + ulx ) * ukx + 2.0 * ( ukx + 2 * ulx ) * ulx; + V.coeffRef( 2, 1 ) = + 2.0 * ( 2 * ukx + ulx ) * uky + 2.0 * ( ukx + 2 * ulx ) * uly; + V.coeffRef( 2, 2 ) = + 2.0 * ( 2 * ukx + ulx ) * ukz + 2.0 * ( ukx + 2 * ulx ) * ulz; + V.coeffRef( 3, 0 ) = + 2.0 * ( 2 * uly + uiy ) * ulx + 2.0 * ( uly + 2 * uiy ) * uix; + V.coeffRef( 3, 1 ) = + -6.0 + 2.0 * ( 2 * uly + uiy ) * uly + 2.0 * ( uly + 2 * uiy ) * uiy; + V.coeffRef( 3, 2 ) = + 2.0 * ( 2 * uly + uiy ) * ulz + 2.0 * ( uly + 2 * uiy ) * uiz; + V /= 6.0; + } + else + { + const auto a = 1.0 / ( ui + uj ).norm(); + const auto b = 1.0 / ( uj + uk ).norm(); + const auto c = 1.0 / ( uk + ul ).norm(); + const auto d = 1.0 / ( ul + ui ).norm(); + const auto e = 1.0 / ( ui + uj + uk + ul ).norm(); + const auto ap = 4 * a * a + a + 1; + const auto app = 16 * a * a + 4 * a - 1; + const auto bp = 4 * b * b + b + 1; + const auto bpp = 16 * b * b + 4 * b - 1; + const auto cp = 4 * c * c + c + 1; + const auto cpp = 16 * c * c + 4 * c - 1; + const auto dp = 4 * d * d + d + 1; + const auto dpp = 16 * d * d + 4 * d - 1; + V.coeffRef( 0, 0 ) = + -4 * ap * uix * uix - 2 * app * uix * ujx - 4 * ap * ujx * ujx + 30.0; + V.coeffRef( 0, 1 ) = -( 4 * ap * uix + app * ujx ) * uiy - + ( app * uix + 4 * ap * ujx ) * ujy; + V.coeffRef( 0, 2 ) = -( 4 * ap * uix + app * ujx ) * uiz - + ( app * uix + 4 * ap * ujx ) * ujz; + V.coeffRef( 1, 0 ) = -( 4 * bp * ujx + bpp * ukx ) * ujy - + ( bpp * ujx + 4 * bp * ukx ) * uky; + V.coeffRef( 1, 1 ) = + -4 * bp * ujy * ujy - 2 * bpp * ujy * uky - 4 * bp * uky * uky + 30.0; + V.coeffRef( 1, 2 ) = -( 4 * bp * ujy + bpp * uky ) * ujz - + ( bpp * ujy + 4 * bp * uky ) * ukz; + V.coeffRef( 2, 0 ) = + 4 * cp * ulx * ulx + 2 * cpp * ulx * ukx + 4 * cp * ukx * ukx - 30.0; + V.coeffRef( 2, 1 ) = + ( 4 * cp * ulx + cpp * ukx ) * uly + ( cpp * ulx + 4 * cp * ukx ) * uky; + V.coeffRef( 2, 2 ) = + ( 4 * cp * ulx + cpp * ukx ) * ulz + ( cpp * ulx + 4 * cp * ukx ) * ukz; + V.coeffRef( 3, 0 ) = + ( 4 * dp * uix + dpp * ulx ) * uiy + ( dpp * uix + 4 * dp * ulx ) * uly; + V.coeffRef( 3, 1 ) = + 4 * dp * uiy * uiy + 2 * dpp * uiy * uly + 4 * dp * uly * uly - 30.0; + V.coeffRef( 3, 2 ) = + ( 4 * dp * uiy + dpp * uly ) * uiz + ( dpp * uiy + 4 * dp * uly ) * ulz; + V /= 30.0; + } + + // We compute the change of basis to come back to the canonic frame of R3. + const Scalar h = fabs( dxij[ x ] ); + Basis.coeffRef( 0, x ) = sign_x * h; + Basis.coeffRef( 1, y ) = sign_y * h; + Basis.coeffRef( 2, z ) = sign_z * h; + return V * Basis; + } + + //----------------------------------------------------------------------------- + DenseMatrix quadrangleInnerProduct0( Face f ) const + { + const auto vtcs = myMesh->incidentVertices( f ); + const auto i = vtcs[ 0 ]; + const auto j = vtcs[ 1 ]; + const auto k = vtcs[ 2 ]; + const auto l = vtcs[ 3 ]; + const auto xij = myMesh->position( j ) - myMesh->position( i ); + const auto xil = myMesh->position( l ) - myMesh->position( i ); + const auto xlk = myMesh->position( k ) - myMesh->position( l ); + const auto xjk = myMesh->position( k ) - myMesh->position( j ); + const RealVector nn[ 4 ] = { /* ni */ xij.crossProduct( xil ), + /* nj */ xij.crossProduct( xjk ), + /* nk */ xlk.crossProduct( xjk ), + /* nl */ xlk.crossProduct( xil ) }; + const Scalar factor = 1.0 / 3600.0; + const Vertex id[ 4 ] = { i, j, k, l }; + DenseMatrix M = DenseMatrix::Zero( 4, 4 ); + if ( !use2ndOrder ) + { + // All coefs are computed from polynomial of the form: + // s^a (1-s)^a t^b (1-t)^b + // Indices are 0,1,2,3 == i,j,k,l + const int pa[ 4 ] = { 0, 1, 1, 0 }; + const int pb[ 4 ] = { 0, 0, 1, 1 }; + const double co[ 5 ][ 5 ] = { { 144.0, 36.0, 24.0, 36.0, 144.0 }, + { 36.0, 9.0, 6.0, 9.0, 36.0 }, + { 24.0, 6.0, 4.0, 6.0, 24.0 }, + { 36.0, 9.0, 6.0, 9.0, 36.0 }, + { 144.0, 36.0, 24.0, 36.0, 144.0 } }; + for ( int g = 0; g < 4; ++g ) // left 0-form at vertex + for ( int h = 0; h < 4; ++h ) // right 0-form at vertex + { // Computing coefficients for ( id[ g ], id[ h ] ) + for ( int u = 0; u < 4; ++u ) // corrected normal at vertex + for ( int n = 0; n < 4; ++n ) // naive normal at vertex + { + const int a = pa[ g ] + pa[ h ] + pa[ u ] + pa[ n ]; + const int b = pb[ g ] + pb[ h ] + pb[ u ] + pb[ n ]; + const double coeff = + factor * co[ a ][ b ] * + myMesh->vertexNormal( id[ u ] ).dot( nn[ n ] ); + M( g, h ) += coeff; + } + } + } + else + { // use2ndOrder + // # 1ere ligne de M0 (avec kle facteur 3600*) + const auto ui = myMesh->vertexNormal( i ); + const auto uj = myMesh->vertexNormal( j ); + const auto uk = myMesh->vertexNormal( k ); + const auto ul = myMesh->vertexNormal( l ); + // formula is theoretically valid for constant geometric normals nn + const auto uiz = nn[ 0 ].dot( myMesh->vertexNormal( i ) ); + const auto ujz = nn[ 1 ].dot( myMesh->vertexNormal( j ) ); + const auto ukz = nn[ 2 ].dot( myMesh->vertexNormal( k ) ); + const auto ulz = nn[ 3 ].dot( myMesh->vertexNormal( l ) ); + const auto a = 1.0 / ( ui + uj ).norm(); + const auto b = 1.0 / ( uj + uk ).norm(); + const auto c = 1.0 / ( uk + ul ).norm(); + const auto d = 1.0 / ( ul + ui ).norm(); + const auto e = 1.0 / ( ui + uj + uk + ul ).norm(); + M.coeffRef( 0, 0 ) = ( 108 * a + 108 * d + 144 * e + 81 ) * uiz + + ( 108 * a - 12 * b + 144 * e - 9 ) * ujz + + ( -12 * b - 12 * c + 144 * e + 1 ) * ukz + + ( -12 * c + 108 * d + 144 * e - 9 ) * ulz; + M.coeffRef( 0, 1 ) = ( 72 * a + 12 * d + 96 * e + 9 ) * uiz + + ( 72 * a + 12 * b + 96 * e + 9 ) * ujz + + ( 12 * b - 8 * c + 96 * e - 1 ) * ukz + + ( -8 * c + 12 * d + 96 * e - 1 ) * ulz; + M.coeffRef( 0, 2 ) = ( 8 * a + 8 * d + 64 * e + 1 ) * uiz + + ( 8 * a + 8 * b + 64 * e + 1 ) * ujz + + ( 8 * b + 8 * c + 64 * e + 1 ) * ukz + + ( 8 * c + 8 * d + 64 * e + 1 ) * ulz; + M.coeffRef( 0, 3 ) = ( 12 * a + 72 * d + 96 * e + 9 ) * uiz + + ( 12 * a - 8 * b + 96 * e - 1 ) * ujz + + ( -8 * b + 12 * c + 96 * e - 1 ) * ukz + + ( 12 * c + 72 * d + 96 * e + 9 ) * ulz; + M.coeffRef( 1, 0 ) = M( 0, 1 ); + M.coeffRef( 1, 1 ) = ( 108 * a - 12 * d + 144 * e - 9 ) * uiz + + ( 108 * a + 108 * b + 144 * e + 81 ) * ujz + + ( 108 * b - 12 * c + 144 * e - 9 ) * ukz + + ( -12 * c - 12 * d + 144 * e + 1 ) * ulz; + M.coeffRef( 1, 2 ) = ( 12 * a - 8 * d + 96 * e - 1 ) * uiz + + ( 12 * a + 72 * b + 96 * e + 9 ) * ujz + + ( 72 * b + 12 * c + 96 * e + 9 ) * ukz + + ( 12 * c - 8 * d + 96 * e - 1 ) * ulz; + M.coeffRef( 1, 3 ) = ( 8 * a + 8 * d + 64 * e + 1 ) * uiz + + ( 8 * a + 8 * b + 64 * e + 1 ) * ujz + + ( 8 * b + 8 * c + 64 * e + 1 ) * ukz + + ( 8 * c + 8 * d + 64 * e + 1 ) * ulz; + M.coeffRef( 2, 0 ) = M( 0, 2 ); + M.coeffRef( 2, 1 ) = M( 1, 2 ); + M.coeffRef( 2, 2 ) = ( -12 * a - 12 * d + 144 * e + 1 ) * uiz + + ( -12 * a + 108 * b + 144 * e - 9 ) * ujz + + ( 108 * b + 108 * c + 144 * e + 81 ) * ukz + + ( 108 * c - 12 * d + 144 * e - 9 ) * ulz; + M.coeffRef( 2, 3 ) = ( -8 * a + 12 * d + 96 * e - 1 ) * uiz + + ( -8 * a + 12 * b + 96 * e - 1 ) * ujz + + ( 12 * b + 72 * c + 96 * e + 9 ) * ukz + + ( 72 * c + 12 * d + 96 * e + 9 ) * ulz; + M.coeffRef( 3, 0 ) = M( 0, 3 ); + M.coeffRef( 3, 1 ) = M( 1, 3 ); + M.coeffRef( 3, 2 ) = M( 2, 3 ); + M.coeffRef( 3, 3 ) = ( -12 * a + 108 * d + 144 * e - 9 ) * uiz + + ( -12 * a - 12 * b + 144 * e + 1 ) * ujz + + ( -12 * b + 108 * c + 144 * e - 9 ) * ukz + + ( 108 * c + 108 * d + 144 * e + 81 ) * ulz; + M *= factor; + } + return M; + } + + Scalar quadrangleArea( Face f ) const + { + const auto vtcs = myMesh->incidentVertices( f ); + ASSERT( vtcs.size() == 4 ); + const auto i = vtcs[ 0 ]; + const auto j = vtcs[ 1 ]; + const auto k = vtcs[ 2 ]; + const auto l = vtcs[ 3 ]; + const auto xij = myMesh->position( j ) - myMesh->position( i ); + const auto xil = myMesh->position( l ) - myMesh->position( i ); + const auto xlk = myMesh->position( k ) - myMesh->position( l ); + const auto xjk = myMesh->position( k ) - myMesh->position( j ); + const RealVector ni = xij.crossProduct( xil ); + const RealVector nj = xij.crossProduct( xjk ); + const RealVector nk = xlk.crossProduct( xjk ); + const RealVector nl = xlk.crossProduct( xil ); + const auto & ui = myMesh->vertexNormal( i ); + const auto & uj = myMesh->vertexNormal( j ); + const auto & uk = myMesh->vertexNormal( k ); + const auto & ul = myMesh->vertexNormal( l ); + const Scalar factor = 1.0 / 36.0; + if ( !use2ndOrder ) + return factor * ( ni.dot( 4 * ui + 2 * uj + uk + 2 * ul ) + + nj.dot( 2 * ui + 4 * uj + 2 * uk + ul ) + + nk.dot( ui + 2 * uj + 4 * uk + 2 * ul ) + + nl.dot( 2 * ui + uj + 2 * uk + 4 * ul ) ); + else + { + // Works only for surfels ! i.e. xij==xlk and xjk==xil + // If we assume f00=f10=f01=f11=1, the corrected area of a surfel is, + // after *36 factor A = (4*a+4*d+16*e+1) < u00 | n > + // + (4*a+4*b+16*e+1) < u10 | n > + // + (4*b+4*c+16*e+1) < u11 | n > + // + (4*c+4*d+16*e+1) < u01 | n > + const auto a = 1.0 / ( ui + uj ).norm(); + const auto b = 1.0 / ( uj + uk ).norm(); + const auto c = 1.0 / ( uk + ul ).norm(); + const auto d = 1.0 / ( ul + ui ).norm(); + const auto e = 1.0 / ( ui + uj + uk + ul ).norm(); + return factor * ( ( 4 * a + 4 * d + 16 * e + 1 ) * ni.dot( ui ) + + ( 4 * a + 4 * b + 16 * e + 1 ) * nj.dot( uj ) + + ( 4 * b + 4 * c + 16 * e + 1 ) * nk.dot( uk ) + + ( 4 * c + 4 * d + 16 * e + 1 ) * nl.dot( ul ) ); + } + } + + public: + InterpolatedCorrectedCalculus( const ConstAlias smesh, + bool use2ndOrder = false, + double lambda = 0.1 ) + : myMesh( &smesh ), use2ndOrder( use2ndOrder ), lambda( lambda ) + { + if ( myMesh->vertexNormals().empty() ) + { + trace.error() << "[InterpolatedCorrectedCalculus::init]" + << " vertex normals should be provided." << std::endl; + return; + } + } + + private: + DenseMatrix buildLocalM0( Index f ) const + { + if ( myMesh->incidentVertices( f ).size() == 4 ) + return quadrangleInnerProduct0( f ); + else + { + trace.error() << "[InterpolatedCorrectedCalculus::buildLocalM0]" + << " face should be quadrangles" << std::endl; + return DenseMatrix(); + } + } + + LinearOperator buildM0() const + { + Triplets triplets; + LinearOperator myM0 = + LinearOperator( myMesh->nbVertices(), myMesh->nbVertices() ); + DenseMatrix values; + for ( Face f = 0; f < myMesh->nbFaces(); ++f ) + { + const auto vtcs = myMesh->incidentVertices( f ); + const auto nv = vtcs.size(); + if ( nv == 4 ) + values = quadrangleInnerProduct0( f ); + else + { + trace.error() << "[InterpolatedCorrectedCalculus::init]" + << " faces should be quadrangles" << std::endl; + return myM0; + } + for ( int i = 0; i < values.rows(); i++ ) + for ( int j = 0; j < values.cols(); j++ ) + triplets.push_back( { vtcs[ i ], vtcs[ j ], values( i, j ) } ); + } + myM0.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return myM0; + } + + LinearOperator buildLumpedM0() const + { + return buildM0(); + } + + DenseMatrix buildLocalM1( Index f ) const + { + const auto a_f = quadrangleArea( f ); + DenseMatrix CA = DenseMatrix::Identity( 3, 3 ) * a_f; + DenseMatrix sharp = buildLocalSharp( f ); + DenseMatrix Id = DenseMatrix::Identity( 4, 4 ); + DenseMatrix P = Id - buildLocalFlat( f ) * sharp; + // Compute inner product for 1-forms + DenseMatrix myM1 = + sharp.transpose() * CA * sharp + lambda * P.transpose() * P; + return myM1; + } + + LinearOperator buildM1() const + { + + LinearOperator CA( 3 * myMesh->nbFaces(), 3 * myMesh->nbFaces() ); + Triplets triplets; + for ( Face f = 0; f < myMesh->nbFaces(); ++f ) + { + const auto a_f = quadrangleArea( f ); + if ( a_f <= 1e-8 ) + trace.warning() << "Bad corrected area " << f << " " << a_f + << std::endl; + triplets.push_back( { 3 * f, 3 * f, a_f } ); + triplets.push_back( { 3 * f + 1, 3 * f + 1, a_f } ); + triplets.push_back( { 3 * f + 2, 3 * f + 2, a_f } ); + } + CA.setFromTriplets( triplets.cbegin(), triplets.cend() ); + // Compute projection operator + LinearOperator mySharp = buildSharp(); + LinearOperator Id1( myMesh->nbEdges(), myMesh->nbEdges() ); + Id1.setIdentity(); + LinearOperator P = Id1 - buildFlat() * mySharp; + // Compute inner product for 1-forms + LinearOperator myM1 = + mySharp.transpose() * CA * mySharp + lambda * P.transpose() * P; + return myM1; + } + + DenseMatrix buildLocalM2( Index f ) const + { + const auto nv = myMesh->incidentVertices( f ).size(); + DenseMatrix res; + if ( nv == 4 ) + res = DenseMatrix::Identity( 4, 4 ) * quadrangleArea( f ); + else + { + trace.error() << "[InterpolatedCorrectedCalculus::buildLocalM2]" + << " face should be quadrangles" << std::endl; + } + return res; + } + + LinearOperator buildM2() const + { + Triplets triplets, triplets2; + LinearOperator myM2 = + LinearOperator( myMesh->nbFaces(), myMesh->nbFaces() ); + for ( Face f = 0; f < myMesh->nbFaces(); ++f ) + { + const auto vtcs = myMesh->incidentVertices( f ); + double area = 0.; + if ( vtcs.size() == 4 ) + area = quadrangleArea( f ); + else + { + trace.error() << "[InterpolatedCorrectedCalculus::buildM2]" + << " faces should be quadrangular." << std::endl; + } + triplets.push_back( { f, f, 1.0 / area } ); + triplets2.push_back( { f, f, area } ); + } + myM2.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return myM2; + } + + DenseMatrix buildLocalSharp( Index f ) const + { + if ( myMesh->incidentVertices( f ).size() != 4 ) + { + trace.error() << "[InterpolatedCorrectedCalculus::buildLocalSharp]" + << " restricted to quadrangle faces." << std::endl; + return DenseMatrix(); + } + return quadrangleSharpLocalMatrix( f ); + } + + LinearOperator buildSharp() const + { + Triplets triplets; + LinearOperator mySharp = + LinearOperator( 3 * myMesh->nbFaces(), myMesh->nbEdges() ); + for ( Face f = 0; f < myMesh->nbFaces(); ++f ) + { + // std::cout << "Face " << f << std::endl; + const auto vtcs = myMesh->incidentVertices( f ); + const auto nc = vtcs.size(); + if ( nc != 4 ) + { + trace.error() << "[InterpolatedCorrectedCalculus::buildSharp]" + << " restricted to quadrangle faces." << std::endl; + return mySharp; + } + Edge edge_idcs[ 4 ]; + Scalar edge_sign[ 4 ]; + for ( Size i = 0; i < nc; i++ ) + { + edge_idcs[ i ] = + myMesh->makeEdge( vtcs[ i ], vtcs[ ( i + 1 ) % nc ] ); + edge_sign[ i ] = vtcs[ i ] < vtcs[ ( i + 1 ) % nc ] ? 1.0 : -1.0; + } + const auto G_f = buildLocalSharp( f ); + for ( Dimension x = 0; x < 3; ++x ) + for ( Dimension n = 0; n < nc; ++n ) + triplets.push_back( + { 3 * f + x, edge_idcs[ n ], edge_sign[ n ] * G_f( x, n ) } ); + } + mySharp.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return mySharp; + } + + DenseMatrix buildLocalFlat( Index f ) const + { + if ( myMesh->incidentVertices( f ).size() != 4 ) + { + trace.error() << "[InterpolatedCorrectedCalculus::buildLocalFlat]" + << " restricted to quadrangle faces." << std::endl; + return DenseMatrix(); + } + return quadrangleFlatLocalMatrix( f ); + } + + LinearOperator buildFlat() const + { + Triplets triplets; + LinearOperator myFlat = + LinearOperator( myMesh->nbEdges(), 3 * myMesh->nbFaces() ); + for ( Face f = 0; f < myMesh->nbFaces(); ++f ) + { + const auto vtcs = myMesh->incidentVertices( f ); + const auto nc = vtcs.size(); + if ( nc != 4 ) + { + trace.error() << "[InterpolatedCorrectedCalculus::buildFlat]" + << " restricted to quadrangle faces." << std::endl; + return myFlat; + } + Edge edge_idcs[ 4 ]; + Scalar edge_sign[ 4 ]; + for ( Size i = 0; i < nc; i++ ) + { + edge_idcs[ i ] = + myMesh->makeEdge( vtcs[ i ], vtcs[ ( i + 1 ) % nc ] ); + edge_sign[ i ] = vtcs[ i ] < vtcs[ ( i + 1 ) % nc ] ? 1.0 : -1.0; + } + const auto V_f = buildLocalFlat( f ); + for ( Dimension x = 0; x < 3; ++x ) + for ( Dimension n = 0; n < nc; ++n ) + { + const double nbFaces = myMesh->edgeFaces( edge_idcs[ n ] ).size(); + triplets.push_back( { edge_idcs[ n ], 3 * f + x, + edge_sign[ n ] * V_f( n, x ) / nbFaces } ); + } + } + myFlat.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return myFlat; + } + + DenseMatrix buildLocalD0( Index f ) const + { + const auto nc = myMesh->incidentVertices(f).size(); + DenseMatrix res = DenseMatrix::Zero(nc, nc); + for(int i = 0; i < nc; i++) { + res((i-1+nc)%nc, i) = 1; + res(i, i) = -1; + } + return res; + } + + LinearOperator buildD0() const + { + Triplets triplets; + // trace.beginBlock( "Init derivative operator D0" ); + Edge e = 0; + for ( auto && vtcs : myMesh->allEdgeVertices() ) + { + triplets.push_back( { e, vtcs.first, -1 } ); + triplets.push_back( { e, vtcs.second, 1 } ); + e++; + } + LinearOperator myD0 = + LinearOperator( myMesh->nbEdges(), myMesh->nbVertices() ); + myD0.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return myD0; + } + + DenseMatrix buildLocalL0( Index f ) const + { + DenseMatrix D0 = buildLocalD0( f ); + DenseMatrix M1 = buildLocalM1( f ); + return -1.0 * D0.transpose() * M1 * D0; + } + + LinearOperator buildL0() const + { + LinearOperator myD0 = buildD0(); + LinearOperator myM1 = buildM1(); + return -1.0 * myD0.transpose() * myM1 * myD0; + } + }; + +} // namespace DGtal diff --git a/src/DGtal/dec/NormalCorrectedFEM.h b/src/DGtal/dec/NormalCorrectedFEM.h new file mode 100644 index 0000000000..b28fb4a77c --- /dev/null +++ b/src/DGtal/dec/NormalCorrectedFEM.h @@ -0,0 +1,404 @@ + + +#if !defined SurfaceMeshMFE_h +/** Prevents repeated inclusion of headers. */ +#define SurfaceMeshMFE_h + +////////////////////////////////////////////////////////////////////////////// +// Inclusions +#include "DGtal/base/Common.h" +#include "DGtal/helpers/StdDefs.h" +#include "DGtal/shapes/SurfaceMesh.h" +#include +#include +#include + +namespace DGtal +{ + ///////////////////////////////////////////////////////////////////////////// + // template class CorrectedFEM + /** + Description of template class 'CorrectedFEM'

\brief Aim: + Provides methods for building a stiffness and mass matrix to solve + Poisson problems using the Finite Element Method using a + corrected normal field. + + * @tparam TLinearAlgebraBackend linear algebra backend used (i.e. + EigenSparseLinearAlgebraBackend). + @tparam TRealPoint an arbitrary model of 3D RealPoint. + @tparam TRealVector an arbitrary model of 3D RealVector. + */ + template + struct NormalCorrectedFEM + { + typedef TLinearAlgebraBackend LinearAlgebraBackend; + typedef TRealPoint RealPoint; + typedef TRealVector RealVector; + typedef typename LinearAlgebraBackend::SparseMatrix LinearOperator; + typedef typename LinearAlgebraBackend::DenseMatrix DenseMatrix; + typedef SurfaceMesh Mesh; + typedef typename Mesh::Vertex Vertex; + typedef typename Mesh::Edge Edge; + typedef typename Mesh::Face Face; + typedef typename Mesh::Face Corner; + typedef typename Mesh::Size Size; + + /// A triplet (row, col, value), useful for initializaing sparse matrices. + typedef typename LinearAlgebraBackend::Triplet Triplet; + /// A range of triplets (row,col,value). + typedef std::vector Triplets; + + private: + // ------------------------- Initialization services + // ---------------------------- + + void buildTriangleFaceMass( Triplets & triplets, Triplets & lumpedTriplets, + Face f ) const + { + const auto vtcs = myMesh->incidentVertices( f ); + const auto v0 = vtcs[ 0 ]; + const auto v1 = vtcs[ 1 ]; + const auto v2 = vtcs[ 2 ]; + const auto xij = myMesh->position( v1 ) - myMesh->position( v0 ); + const auto xik = myMesh->position( v2 ) - myMesh->position( v0 ); + const auto n = xij.crossProduct( xik ); + const auto nn = n.getNormalized(); + const auto face_n = myMesh->faceNormal( f ); + const double z = face_n.dot( nn ); + const double doubleArea = n.norm(); + triplets.push_back( { v0, v0, 1. / 12. * z * doubleArea } ); + triplets.push_back( { v0, v1, 1. / 24. * z * doubleArea } ); + triplets.push_back( { v0, v2, 1. / 24. * z * doubleArea } ); + triplets.push_back( { v1, v0, 1. / 24. * z * doubleArea } ); + triplets.push_back( { v1, v1, 1. / 12. * z * doubleArea } ); + triplets.push_back( { v1, v2, 1. / 24. * z * doubleArea } ); + triplets.push_back( { v2, v0, 1. / 24. * z * doubleArea } ); + triplets.push_back( { v2, v1, 1. / 24. * z * doubleArea } ); + triplets.push_back( { v2, v2, 1. / 12. * z * doubleArea } ); + lumpedTriplets.push_back( { v0, v0, 1. / 6. * z * doubleArea } ); + lumpedTriplets.push_back( { v1, v1, 1. / 6. * z * doubleArea } ); + lumpedTriplets.push_back( { v2, v2, 1. / 6. * z * doubleArea } ); + } + + void buildQuadrangleFaceMass( Triplets & triplets, + Triplets & lumpedTriplets, Face f ) const + { + const auto vtcs = myMesh->incidentVertices( f ); + const auto v0 = vtcs[ 0 ]; + const auto v1 = vtcs[ 1 ]; + const auto v2 = vtcs[ 2 ]; + const auto v3 = vtcs[ 3 ]; + const auto xij = myMesh->position( v1 ) - myMesh->position( v0 ); + const auto xil = myMesh->position( v3 ) - myMesh->position( v0 ); + const auto nn = xij.crossProduct( xil ).getNormalized(); + const auto face_n = myMesh->faceNormal( f ); + const double z = nn.dot( face_n ); + if ( z < 0. ) + { + trace.warning() << "Bad corrected normals at face " << f << std::endl; + } + + double area = xij.crossProduct( xil ).norm(); + int v[ 2 ][ 2 ] = { { (int)v0, (int)v1 }, { (int)v3, (int)v2 } }; + for ( int i = 0; i < 2; i++ ) + { + for ( int j = 0; j < 2; j++ ) + { + for ( int i2 = 0; i2 < 2; i2++ ) + { + for ( int j2 = 0; j2 < 2; j2++ ) + { + int v_i = v[ i ][ j ]; + int v_j = v[ i2 ][ j2 ]; + if ( i == i2 && j == j2 ) + { + triplets.push_back( { v_i, v_j, area * z * 1. / 9. } ); + lumpedTriplets.push_back( { v_i, v_j, 1. / 4. * z * area } ); + } + else if ( i == i2 && j == 1 - j2 ) + { + triplets.push_back( { v_i, v_j, area * z * 1. / 18. } ); + } + else if ( j == j2 && i == 1 - i2 ) + { + triplets.push_back( { v_i, v_j, area * z * 1. / 18. } ); + } + else + { + triplets.push_back( { v_i, v_j, area * z * 1. / 36. } ); + } + } + } + } + } + } + + DenseMatrix buildTriangleFaceStiffness( Face f ) const + { + DenseMatrix res = DenseMatrix( 3, 3 ); + const auto vtcs = myMesh->incidentVertices( f ); + const auto v0 = vtcs[ 0 ]; + const auto v1 = vtcs[ 1 ]; + const auto v2 = vtcs[ 2 ]; + const auto xij = myMesh->position( v1 ) - myMesh->position( v0 ); + const auto xik = myMesh->position( v2 ) - myMesh->position( v0 ); + const auto n = xij.crossProduct( xik ); + const auto nn = n.getNormalized(); + const auto xil = nn.crossProduct( xij ).getNormalized(); + const auto face_n = myMesh->faceNormal( f ); + const double x = face_n.dot( xij.getNormalized() ); + const double y = face_n.dot( xil ); + const double z = face_n.dot( nn ); + const double l1 = xij.norm(); + const double l2 = xik.norm(); + const double cos_t = xij.dot( xik ) / ( l1 * l2 ); + const double sin_t = n.norm() / ( l1 * l2 ); + const double x2 = x * x; + const double y2 = y * y; + const double z2 = z * z; + const double l12 = l1 * l1; + const double l22 = l2 * l2; + const double cos_t2 = cos_t * cos_t; + const double sin_t2 = sin_t * sin_t; + res( 0, 0 ) = + 1. / 2 * + ( 2 * ( l1 * l2 - cos_t * l22 ) * sin_t * x * y - 2 * cos_t * l1 * l2 + + l22 * sin_t2 * z2 - l22 * sin_t2 + + ( 2 * cos_t * l1 * l2 + 2 * l22 * sin_t2 - l12 - l22 ) * x2 + l12 + + l22 ) / + ( l1 * l2 * sin_t * z ); + res( 1, 0 ) = + 1. / 2 * + ( ( 2 * cos_t * l2 - l1 ) * sin_t * x * y + l2 * sin_t2 * y2 + + cos_t * l1 - ( cos_t * l1 + l2 * sin_t2 - l2 ) * x2 - l2 ) / + ( l1 * sin_t * z ); + res( 2, 0 ) = + -1. / 2 * + ( l2 * sin_t * x * y - cos_t * l2 + ( cos_t * l2 - l1 ) * x2 + l1 ) / + ( l2 * sin_t * z ); + res( 0, 1 ) = + 1. / 2 * + ( ( 2 * cos_t * l2 - l1 ) * sin_t * x * y + l2 * sin_t2 * y2 + + cos_t * l1 - ( cos_t * l1 + l2 * sin_t2 - l2 ) * x2 - l2 ) / + ( l1 * sin_t * z ); + res( 1, 1 ) = -1. / 2 * + ( 2 * cos_t * l2 * sin_t * x * y + cos_t2 * l2 * x2 - + ( cos_t2 - 1 ) * l2 * y2 - l2 ) / + ( l1 * sin_t * z ); + res( 2, 1 ) = + 1. / 2 * ( sin_t * x * y + cos_t * x2 - cos_t ) / ( sin_t * z ); + res( 0, 2 ) = + -1. / 2 * + ( l2 * sin_t * x * y - cos_t * l2 + ( cos_t * l2 - l1 ) * x2 + l1 ) / + ( l2 * sin_t * z ); + res( 1, 2 ) = + 1. / 2 * ( sin_t * x * y + cos_t * x2 - cos_t ) / ( sin_t * z ); + res( 2, 2 ) = -1. / 2 * ( l1 * x2 - l1 ) / ( l2 * sin_t * z ); + return res; + } + + DenseMatrix buildQuadrangleFaceStiffness( Face f ) const + { + DenseMatrix res = DenseMatrix( 4, 4 ); + const auto vtcs = myMesh->incidentVertices( f ); + const auto v0 = vtcs[ 0 ]; + const auto v1 = vtcs[ 1 ]; + const auto v2 = vtcs[ 2 ]; + const auto v3 = vtcs[ 3 ]; + const auto xij = myMesh->position( v1 ) - myMesh->position( v0 ); + const auto xil = myMesh->position( v3 ) - myMesh->position( v0 ); + const auto nn = xij.crossProduct( xil ).getNormalized(); + const auto face_n = myMesh->faceNormal( f ); + const double x = face_n.dot( xij.getNormalized() ); + const double y = face_n.dot( xil.getNormalized() ); + const double z = face_n.dot( nn ); + if ( z < 0. ) + { + trace.warning() << "Bad corrected normals at face " << f << std::endl; + } + const double lap = 0.5 * ( x * y / z ); + const double sqx = 1. - x * x; + const double sqy = 1. - y * y; + const double self = lap + 1. / 3. * ( sqx + sqy ) / z; + const double op1 = -1. / 3. * sqy / z + 1. / 6. * sqx / z; + const double op2 = -1. / 3. * sqx / z + 1. / 6. * sqy / z; + const double op = -lap - 1. / 6. * ( sqx + sqy ) / z; + res( 0, 0 ) = self; + res( 0, 1 ) = op1; + res( 0, 2 ) = op; + res( 0, 3 ) = op2; + + res( 1, 0 ) = op1; + res( 1, 1 ) = self - 2. * lap; + res( 1, 2 ) = op2; + res( 1, 3 ) = op + 2. * lap; + + res( 2, 0 ) = op; + res( 2, 1 ) = op2; + res( 2, 2 ) = self; + res( 2, 3 ) = op1; + + res( 3, 0 ) = op2; + res( 3, 1 ) = op + 2. * lap; + res( 3, 2 ) = op1; + res( 3, 3 ) = self - 2. * lap; + return res; + } + + LinearOperator buildMass() + { + return true; + } + + bool init( const Mesh * pMesh ) + { + myMesh = pMesh; + if ( order != 1 ) + { + trace.error() << "[NormalCorrectedFEM::init]" + << " order should be 1" << std::endl; + return false; + } + if ( myMesh->faceNormals().empty() ) + { + trace.error() << "[NormalCorrectedFEM::init]" + << " face normals should be provided." << std::endl; + return false; + } + return true; + } + + LinearOperator buildL0() const + { + LinearOperator L( myMesh->nbVertices(), myMesh->nbVertices() ); + Triplets triplets; + DenseMatrix values; + for ( Face f = 0; f < myMesh->nbFaces(); f++ ) + { + const auto vtcs = myMesh->incidentVertices( f ); + if ( vtcs.size() == 3 ) + values = buildTriangleFaceStiffness( f ); + else if ( vtcs.size() == 4 ) + values = buildQuadrangleFaceStiffness( f ); + else + { + trace.error() << "[NormalCorrectedFEM::init]" + << " faces should be triangle or quadrangles" + << std::endl; + + return L; + } + for ( int i = 0; i < values.rows(); i++ ) + for ( int j = 0; j < values.cols(); j++ ) + triplets.push_back( { vtcs[ i ], vtcs[ j ], values( i, j ) } ); + } + L.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return -L; + } + + LinearOperator buildM0() const + { + LinearOperator M( myMesh->nbVertices(), myMesh->nbVertices() ); + + Triplets triplets; + Triplets lumpedTriplets; + for ( Face f = 0; f < myMesh->nbFaces(); f++ ) + { + const auto vtcs = myMesh->incidentVertices( f ); + if ( vtcs.size() == 3 ) + buildTriangleFaceMass( triplets, lumpedTriplets, f ); + else if ( vtcs.size() == 4 ) + buildQuadrangleFaceMass( triplets, lumpedTriplets, f ); + else + { + trace.error() << "[NormalCorrectedFEM::buildM0]" + << " faces should be triangles or quadrangles" + << std::endl; + return M; + } + } + M.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return M; + } + + LinearOperator buildLumpedM0() const + { + LinearOperator lumpedM( myMesh->nbVertices(), myMesh->nbVertices() ); + + Triplets triplets; + Triplets lumpedTriplets; + for ( Face f = 0; f < myMesh->nbFaces(); f++ ) + { + const auto vtcs = myMesh->incidentVertices( f ); + if ( vtcs.size() == 3 ) + buildTriangleFaceMass( triplets, lumpedTriplets, f ); + else if ( vtcs.size() == 4 ) + buildQuadrangleFaceMass( triplets, lumpedTriplets, f ); + else + { + trace.error() << "[NormalCorrectedFEM::buildLumpedM0]" + << " faces should be triangles or quadrangles" + << std::endl; + return lumpedM; + } + } + lumpedM.setFromTriplets( lumpedTriplets.cbegin(), lumpedTriplets.cend() ); + return lumpedM; + } + + private: + const Mesh * myMesh; + int order; + + public: + /// @name Initialization services + /// @{ + + /// Default constructor. The object is invalid. + NormalCorrectedFEM() : myMesh( nullptr ) + { + } + + /// Constructor from surface mesh \a smesh. + /// @param smesh any surface mesh + NormalCorrectedFEM( ConstAlias smesh, int order = 1 ) + : myMesh( nullptr ), order( order ) + { + init( &smesh ); + } + + DenseMatrix localL0( Face f ) const + { + const auto vtcs = myMesh->incidentVertices( f ); + if ( vtcs.size() == 3 ) + return -buildTriangleFaceStiffness( f ); + else if ( vtcs.size() == 4 ) + return -buildQuadrangleFaceStiffness( f ); + else + { + trace.error() << "[NormalCorrectedFEM::buildLocalL0]" + << " faces should be triangles or quadrangles" + << std::endl; + return DenseMatrix(); + } + } + + LinearOperator L0() const + { + return buildL0(); + } + + LinearOperator M0() const + { + return buildM0(); + } + + LinearOperator lumpedM0() const + { + return buildLumpedM0(); + } + }; +} // namespace DGtal + +#endif diff --git a/src/DGtal/dec/SurfaceDEC.h b/src/DGtal/dec/SurfaceDEC.h new file mode 100644 index 0000000000..66100fb16d --- /dev/null +++ b/src/DGtal/dec/SurfaceDEC.h @@ -0,0 +1,99 @@ +#pragma once + +#include "DGtal/math/linalg/EigenSupport.h" +namespace DGtal +{ + + /** + Description of template class 'SurfaceMeshDEC'

\brief Aim: + Provides methods and operators that builds different variants of + discrete calculii onto a surface mesh. + + * @tparam TRealPoint an arbitrary model of 3D RealPoint. + @tparam TRealVector an arbitrary model of 3D RealVector. + */ + template + class SurfaceDEC + { + typedef typename EigenLinearAlgebraBackend::DenseVector::Index Index; + typedef typename EigenLinearAlgebraBackend::DenseMatrix DenseMatrix; + typedef typename EigenLinearAlgebraBackend::SparseMatrix LinearOperator; + + public: + DenseMatrix localD0( Index f ) const + { + return static_cast( this )->buildLocalD0( f ); + } + + LinearOperator D0() const + { + return static_cast( this )->buildD0(); + } + + DenseMatrix localL0( Index f ) const + { + return static_cast( this )->buildLocalL0( f ); + } + + LinearOperator L0() const + { + return static_cast( this )->buildL0(); + } + + DenseMatrix localM0( Index f ) const + { + return static_cast( this )->buildLocalM0( f ); + } + + LinearOperator M0() const + { + return static_cast( this )->buildM0(); + } + + LinearOperator lumpedM0() const + { + return static_cast( this )->buildLumpedM0(); + } + + DenseMatrix localM1( Index f ) const + { + return static_cast( this )->buildLocalM1( f ); + } + + LinearOperator M1() const + { + return static_cast( this )->buildM1(); + } + + DenseMatrix localM2( Index f ) const + { + return static_cast( this )->buildLocalM2( f ); + } + + LinearOperator M2() const + { + return static_cast( this )->buildM2(); + } + + DenseMatrix localSharp( Index f ) const + { + return static_cast( this )->buildLocalSharp( f ); + } + + LinearOperator Sharp() const + { + return static_cast( this )->buildSharp(); + } + + DenseMatrix localFlat( Index f ) const + { + return static_cast( this )->buildLocalFlat( f ); + } + + LinearOperator Flat() const + { + return static_cast( this )->buildFlat(); + } + }; + +} // namespace DGtal diff --git a/tests/dec/CMakeLists.txt b/tests/dec/CMakeLists.txt index ddeb51b911..cef4a4b324 100644 --- a/tests/dec/CMakeLists.txt +++ b/tests/dec/CMakeLists.txt @@ -1,10 +1,12 @@ set(DGTAL_TESTS_SRC - testDiscreteExteriorCalculus + testDiscreteExteriorCalculus testEmbedding testHeatLaplace testPolygonalCalculus testGeodesicsInHeat testVectorsInHeat + testInterpolatedCorrectedCalculus + testCorrectedFEM ) # add_test is disabled for the following sources @@ -21,4 +23,3 @@ if(WITH_EIGEN) DGtal_add_test(${FILE} ONLY_ADD_EXECUTABLE) endforeach() endif() - diff --git a/tests/dec/testCorrectedFEM.cpp b/tests/dec/testCorrectedFEM.cpp new file mode 100644 index 0000000000..c68ae8e4cb --- /dev/null +++ b/tests/dec/testCorrectedFEM.cpp @@ -0,0 +1,185 @@ + +/////////////////////////////////////////////////////////////////////////////// +#include +#include "DGtal/base/Common.h" +#include "ConfigTest.h" +#include "DGtal/geometry/helpers/PlaneProbingEstimatorHelper.h" +#include "DGtalCatch.h" +#include "DGtal/helpers/StdDefs.h" + +#include "DGtal/dec/NormalCorrectedFEM.h" +#include "DGtal/shapes/SurfaceMesh.h" +#include "DGtal/shapes/MeshHelpers.h" +#include "DGtal/helpers/Shortcuts.h" +#include "DGtal/math/linalg/DirichletConditions.h" +#include "DGtal/math/linalg/EigenSupport.h" +/////////////////////////////////////////////////////////////////////////////// + +using namespace std; +using namespace DGtal; +using namespace Z3i; + +/////////////////////////////////////////////////////////////////////////////// +// Functions for testing class InterpolatedCorrectedCalculus. +/////////////////////////////////////////////////////////////////////////////// + +TEST_CASE( "Testing PolygonalCalculus" ) +{ + typedef SurfaceMesh< RealPoint,RealPoint > Mesh; + typedef NormalCorrectedFEM CFEM; + std::vector positions = { RealPoint( 0, 0, 0 ) , + RealPoint( 1, 0, 0 ) , + RealPoint( 0, 1, 0 ) , + RealPoint( 1, 1, 0 ) , + RealPoint( 0, 0, 1 ) , + RealPoint( 1, 0, 1 ) , + RealPoint( 0, 1, 1 ) , + RealPoint( 1, 1, 1 ) , + RealPoint( 1, 0, 2 ) , + RealPoint( 0, 0, 2 ) }; + std::vector faces = { { 1, 0, 2, 3 }, + { 0, 1, 5, 4 } , + { 1, 3, 7, 5 } , + { 3, 2, 6, 7 } , + { 2, 0, 4, 6 } , + { 4, 5, 8, 9 } }; + + Mesh box(positions.cbegin(), positions.cend(), + faces.cbegin(), faces.cend()); + + box.computeFaceNormalsFromPositions(); + CFEM boxCalculus(box); + SECTION("Local Laplace-Beltrami") + { + CFEM::Face f = 0; + auto nf = box.incidentVertices(f).size(); + + auto L = boxCalculus.localL0(f); + CFEM::LinearAlgebraBackend::DenseVector phi(nf),expected(nf); + phi << 1.0, 1.0, 1.0, 1.0; + expected << 0,0,0,0; + auto lphi = L*phi; + for(int i = 0; i < nf; i++) { + REQUIRE(abs(lphi(i)) < 1e-15); + } + } + + /* + SECTION("Check lumped mass matrix") + { + PolygonalCalculus< RealPoint,RealVector >::SparseMatrix M = boxCalculus.globalLumpedMassMatrix(); + double a=0.0; + for( PolygonalCalculus< RealPoint,RealVector >::MySurfaceMesh::Index v=0; v < box.nbVertices(); ++v ) + a += M.coeffRef(v,v); + + double fa=0.0; + for( PolygonalCalculus< RealPoint,RealVector >::MySurfaceMesh::Index f=0; f < box.nbFaces(); ++f ) + fa += box.faceArea(f); + REQUIRE( a == fa ); + } + */ +} + +TEST_CASE( "Testing PolygonalCalculus and DirichletConditions" ) +{ + typedef Shortcuts< KSpace > SH3; + typedef SurfaceMesh< RealPoint,RealPoint > Mesh; + typedef Mesh::Index Index; + typedef NormalCorrectedFEM CFEM; + typedef CFEM::LinearAlgebraBackend::DenseVector DenseVector; + typedef DirichletConditions< EigenLinearAlgebraBackend > DC; + + // Build a more complex surface. + auto params = SH3::defaultParameters(); + + params( "polynomial", "0.1*y*y -0.1*x*x - 2.0*z" )( "gridstep", 2.0 ); + auto implicit_shape = SH3::makeImplicitShape3D ( params ); + auto digitized_shape = SH3::makeDigitizedImplicitShape3D( implicit_shape, params ); + auto K = SH3::getKSpace( params ); + auto binary_image = SH3::makeBinaryImage( digitized_shape, params ); + auto surface = SH3::makeDigitalSurface( binary_image, K, params ); + auto primalSurface = SH3::makePrimalSurfaceMesh(surface); + + std::vector > faces; + std::vector positions = primalSurface->positions(); + for( Index face= 0 ; face < primalSurface->nbFaces(); ++face) + faces.push_back(primalSurface->incidentVertices( face )); + + Mesh surfmesh = Mesh( positions.begin(), positions.end(), + faces.begin(), faces.end() ); + auto boundaryEdges = surfmesh.computeManifoldBoundaryEdges(); + surfmesh.computeFaceNormalsFromPositions(); + + SECTION("Check surface") + { + REQUIRE( surfmesh.nbVertices() == 1364 ); + REQUIRE( surfmesh.nbFaces() == 1279 ); + REQUIRE( boundaryEdges.size() == 168 ); + } + + // Builds calculus and solve a Poisson problem with Dirichlet boundary conditions + CFEM calculus( surfmesh ); + // Laplace opeartor + CFEM::LinearOperator L = calculus.L0(); + // value on boundary + CFEM::LinearAlgebraBackend::DenseVector g = CFEM::LinearAlgebraBackend::DenseVector::Zero(surfmesh.nbVertices()); + // characteristic set of boundary + DC::IntegerVector b = DC::IntegerVector::Zero( g.rows() ); + + SECTION("Solve Poisson problem with boundary Dirichlet conditions") + { + for ( double scale = 0.1; scale < 2.0; scale *= 2.0 ) + { + std::cout << "scale=" << scale << std::endl; + auto phi = [&]( Index v) + { + return cos(scale*(surfmesh.position(v)[0])) + * (scale*surfmesh.position(v)[1]); + }; + + for(auto &e: boundaryEdges) + { + auto adjVertices = surfmesh.edgeVertices(e); + auto v1 = adjVertices.first; + auto v2 = adjVertices.second; + g(v1) = phi(v1); + g(v2) = phi(v2); + b(v1) = 1; + b(v2) = 1; + } + // Solve Δu=0 with g as boundary conditions + EigenLinearAlgebraBackend::SolverSimplicialLDLT solver; + CFEM::LinearOperator L_dirichlet = DC::dirichletOperator( L, b ); + solver.compute( L_dirichlet ); + REQUIRE( solver.info() == Eigen::Success ); + DenseVector g_dirichlet = DC::dirichletVector( L, g, b, g ); + DenseVector x_dirichlet = solver.solve( g_dirichlet ); + REQUIRE( solver.info() == Eigen::Success ); + DenseVector u = DC::dirichletSolution( x_dirichlet, b, g ); + double min_phi = 0.0; + double max_phi = 0.0; + double min_u = 0.0; + double max_u = 0.0; + double min_i_u = 0.0; + double max_i_u = 0.0; + for ( Index v = 0; v < surfmesh.nbVertices(); ++v ) + { + min_phi = std::min( min_phi, phi( v ) ); + max_phi = std::max( max_phi, phi( v ) ); + min_u = std::min( min_u , u ( v ) ); + max_u = std::max( max_u , u ( v ) ); + if ( b( v ) == 0.0 ) + { + min_i_u = std::min( min_i_u, u ( v ) ); + max_i_u = std::max( max_i_u, u ( v ) ); + } + } + REQUIRE( min_phi <= min_u ); + REQUIRE( max_phi >= max_u ); + REQUIRE( min_phi < min_i_u ); + REQUIRE( max_phi > max_i_u ); + } // for ( double scale = 0.1; scale < 2.0; scale *= 2.0 ) + } +}; + +/** @ingroup Tests **/ diff --git a/tests/dec/testInterpolatedCorrectedCalculus.cpp b/tests/dec/testInterpolatedCorrectedCalculus.cpp new file mode 100644 index 0000000000..01ae077f8d --- /dev/null +++ b/tests/dec/testInterpolatedCorrectedCalculus.cpp @@ -0,0 +1,229 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + **/ + +/** + * @file testPolygonalCalculus.cpp + * @ingroup Tests + * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) + * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * @author Jacques-Olivier Lachaud (\c jacques-olivier.lachaud@univ-savoie.fr ) + * Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France + * + * @date 2021/09/02 + * + * Functions for testing class PolygonalCalculus. + * + * This file is part of the DGtal library. + */ + +/////////////////////////////////////////////////////////////////////////////// +#include +#include "DGtal/base/Common.h" +#include "ConfigTest.h" +#include "DGtalCatch.h" +#include "DGtal/helpers/StdDefs.h" + +#include "DGtal/dec/InterpolatedCorrectedCalculus.h" +#include "DGtal/shapes/SurfaceMesh.h" +#include "DGtal/shapes/MeshHelpers.h" +#include "DGtal/helpers/Shortcuts.h" +#include "DGtal/math/linalg/DirichletConditions.h" +#include "DGtal/math/linalg/EigenSupport.h" +/////////////////////////////////////////////////////////////////////////////// + +using namespace std; +using namespace DGtal; +using namespace Z3i; + +/////////////////////////////////////////////////////////////////////////////// +// Functions for testing class InterpolatedCorrectedCalculus. +/////////////////////////////////////////////////////////////////////////////// + +TEST_CASE( "Testing PolygonalCalculus" ) +{ + typedef SurfaceMesh< RealPoint,RealPoint > Mesh; + typedef InterpolatedCorrectedCalculus CC; + std::vector positions = { RealPoint( 0, 0, 0 ) , + RealPoint( 1, 0, 0 ) , + RealPoint( 0, 1, 0 ) , + RealPoint( 1, 1, 0 ) , + RealPoint( 0, 0, 1 ) , + RealPoint( 1, 0, 1 ) , + RealPoint( 0, 1, 1 ) , + RealPoint( 1, 1, 1 ) , + RealPoint( 1, 0, 2 ) , + RealPoint( 0, 0, 2 ) }; + std::vector faces = { { 1, 0, 2, 3 }, + { 0, 1, 5, 4 } , + { 1, 3, 7, 5 } , + { 3, 2, 6, 7 } , + { 2, 0, 4, 6 } , + { 4, 5, 8, 9 } }; + + Mesh box(positions.cbegin(), positions.cend(), + faces.cbegin(), faces.cend()); + + box.computeFaceNormalsFromPositions(); + box.computeVertexNormalsFromFaceNormals(); + CC boxCalculus(box); + + SECTION("Derivatives") + { + CC::Face f = 0; + auto d = boxCalculus.localD0(f); + + auto nf = box.incidentVertices(f).size(); + CC::DenseVector phi(nf),expected(nf); + phi << 1.0, 3.0, 2.0, 6.0; + expected << 2,-1,4,-5; + auto dphi = d*phi; // n_f x 1 matrix + REQUIRE(dphi == expected); + + } + + SECTION("Local Laplace-Beltrami") + { + CC::Face f = 0; + auto nf = box.incidentVertices(f).size(); + + auto L = boxCalculus.localL0(f); + CC::DenseVector phi(nf),expected(nf); + phi << 1.0, 1.0, 1.0, 1.0; + expected << 0,0,0,0; + auto lphi = L*phi; + for(int i = 0; i < nf; i++) { + REQUIRE(abs(lphi(i)) < 1e-15); + } + } + /* + SECTION("Check lumped mass matrix") + { + PolygonalCalculus< RealPoint,RealVector >::SparseMatrix M = boxCalculus.globalLumpedMassMatrix(); + double a=0.0; + for( PolygonalCalculus< RealPoint,RealVector >::MySurfaceMesh::Index v=0; v < box.nbVertices(); ++v ) + a += M.coeffRef(v,v); + + double fa=0.0; + for( PolygonalCalculus< RealPoint,RealVector >::MySurfaceMesh::Index f=0; f < box.nbFaces(); ++f ) + fa += box.faceArea(f); + REQUIRE( a == fa ); + } + */ +} + +TEST_CASE( "Testing PolygonalCalculus and DirichletConditions" ) +{ + typedef Shortcuts< KSpace > SH3; + typedef SurfaceMesh< RealPoint,RealPoint > Mesh; + typedef Mesh::Index Index; + typedef InterpolatedCorrectedCalculus CC; + typedef DirichletConditions< EigenLinearAlgebraBackend > DC; + + // Build a more complex surface. + auto params = SH3::defaultParameters(); + + params( "polynomial", "0.1*y*y -0.1*x*x - 2.0*z" )( "gridstep", 2.0 ); + auto implicit_shape = SH3::makeImplicitShape3D ( params ); + auto digitized_shape = SH3::makeDigitizedImplicitShape3D( implicit_shape, params ); + auto K = SH3::getKSpace( params ); + auto binary_image = SH3::makeBinaryImage( digitized_shape, params ); + auto surface = SH3::makeDigitalSurface( binary_image, K, params ); + auto primalSurface = SH3::makePrimalSurfaceMesh(surface); + + std::vector > faces; + std::vector positions = primalSurface->positions(); + for( Index face= 0 ; face < primalSurface->nbFaces(); ++face) + faces.push_back(primalSurface->incidentVertices( face )); + + Mesh surfmesh = Mesh( positions.begin(), positions.end(), + faces.begin(), faces.end() ); + auto boundaryEdges = surfmesh.computeManifoldBoundaryEdges(); + surfmesh.computeFaceNormalsFromPositions(); + surfmesh.computeVertexNormalsFromFaceNormals(); + + SECTION("Check surface") + { + REQUIRE( surfmesh.nbVertices() == 1364 ); + REQUIRE( surfmesh.nbFaces() == 1279 ); + REQUIRE( boundaryEdges.size() == 168 ); + } + + // Builds calculus and solve a Poisson problem with Dirichlet boundary conditions + CC calculus( surfmesh ); + // Laplace opeartor + CC::LinearOperator L = calculus.L0(); + // value on boundary + CC::DenseVector g = CC::DenseVector::Zero(surfmesh.nbVertices()); + // characteristic set of boundary + DC::IntegerVector b = DC::IntegerVector::Zero( g.rows() ); + + SECTION("Solve Poisson problem with boundary Dirichlet conditions") + { + for ( double scale = 0.1; scale < 2.0; scale *= 2.0 ) + { + std::cout << "scale=" << scale << std::endl; + auto phi = [&]( Index v) + { + return cos(scale*(surfmesh.position(v)[0])) + * (scale*surfmesh.position(v)[1]); + }; + + for(auto &e: boundaryEdges) + { + auto adjVertices = surfmesh.edgeVertices(e); + auto v1 = adjVertices.first; + auto v2 = adjVertices.second; + g(v1) = phi(v1); + g(v2) = phi(v2); + b(v1) = 1; + b(v2) = 1; + } + // Solve Δu=0 with g as boundary conditions + EigenLinearAlgebraBackend::SolverSimplicialLDLT solver; + CC::LinearOperator L_dirichlet = DC::dirichletOperator( L, b ); + solver.compute( L_dirichlet ); + REQUIRE( solver.info() == Eigen::Success ); + CC::DenseVector g_dirichlet = DC::dirichletVector( L, g, b, g ); + CC::DenseVector x_dirichlet = solver.solve( g_dirichlet ); + REQUIRE( solver.info() == Eigen::Success ); + CC::DenseVector u = DC::dirichletSolution( x_dirichlet, b, g ); + double min_phi = 0.0; + double max_phi = 0.0; + double min_u = 0.0; + double max_u = 0.0; + double min_i_u = 0.0; + double max_i_u = 0.0; + for ( Index v = 0; v < surfmesh.nbVertices(); ++v ) + { + min_phi = std::min( min_phi, phi( v ) ); + max_phi = std::max( max_phi, phi( v ) ); + min_u = std::min( min_u , u ( v ) ); + max_u = std::max( max_u , u ( v ) ); + if ( b( v ) == 0.0 ) + { + min_i_u = std::min( min_i_u, u ( v ) ); + max_i_u = std::max( max_i_u, u ( v ) ); + } + } + REQUIRE( min_phi <= min_u ); + REQUIRE( max_phi >= max_u ); + REQUIRE( min_phi < min_i_u ); + REQUIRE( max_phi > max_i_u ); + } // for ( double scale = 0.1; scale < 2.0; scale *= 2.0 ) + } +}; + +/** @ingroup Tests **/ diff --git a/tests/dec/testPolygonalCalculus.cpp b/tests/dec/testPolygonalCalculus.cpp index c0a4adf149..5ba78c6abb 100644 --- a/tests/dec/testPolygonalCalculus.cpp +++ b/tests/dec/testPolygonalCalculus.cpp @@ -75,12 +75,12 @@ TEST_CASE( "Testing PolygonalCalculus" ) { 3, 2, 6, 7 } , { 2, 0, 4, 6 } , { 4, 5, 8, 9 } }; - + Mesh box(positions.cbegin(), positions.cend(), faces.cbegin(), faces.cend()); - + PolygonalCalculus< RealPoint,RealVector > boxCalculus(box); - + SECTION("Construction and basic operators") { REQUIRE( boxCalculus.isValid() ); @@ -90,7 +90,7 @@ TEST_CASE( "Testing PolygonalCalculus" ) auto x = boxCalculus.X(f); auto d = boxCalculus.D(f); auto a = boxCalculus.A(f); - + //Checking X PolygonalCalculus< RealPoint,RealVector >::Vector vec = x.row(0); REQUIRE( vecToRealPoint(vec ) == positions[1]); @@ -102,7 +102,7 @@ TEST_CASE( "Testing PolygonalCalculus" ) REQUIRE( vecToRealPoint(vec ) == positions[3]); trace.info()<< boxCalculus <::Face f = 0; auto d = boxCalculus.D(f); - + auto nf = boxCalculus.faceDegree(f); PolygonalCalculus< RealPoint,RealVector >::Vector phi(nf),expected(nf); phi << 1.0, 3.0, 2.0, 6.0; expected << 2,-1,4,-5; auto dphi = d*phi; // n_f x 1 matrix REQUIRE(dphi == expected); - + } - + SECTION("Structural propertes") { PolygonalCalculus< RealPoint,RealVector >::Face f = 0; auto nf = boxCalculus.faceDegree(f); PolygonalCalculus< RealPoint,RealVector >::Vector phi(nf); phi << 1.0, 3.0, 2.0, 6.0; - + auto G = boxCalculus.gradient(f); auto gphi = G*phi; auto coG = boxCalculus.coGradient(f); auto cogphi = coG*phi; - + // grad . cograd == 0 REQUIRE( gphi.dot(cogphi) == 0.0); - + // Gf = Uf Df REQUIRE( G == boxCalculus.sharp(f)*boxCalculus.D(f)); - + // UV = I - nn^t (lemma4) PolygonalCalculus< RealPoint,RealVector >::Vector n = boxCalculus.faceNormal(f); REQUIRE( boxCalculus.sharp(f)*boxCalculus.flat(f) == PolygonalCalculus< RealPoint,RealVector >::DenseMatrix::Identity(3,3) - n*n.transpose() ); - + // P^2 = P (lemma6) auto P = boxCalculus.P(f); REQUIRE( P*P == P); - + // PV=0 (lemma5) REQUIRE( (P*boxCalculus.flat(f)).norm() == 0.0); } - + SECTION("Div / Curl") { PolygonalCalculus< RealPoint,RealVector >::Face f = 0; @@ -182,12 +182,12 @@ TEST_CASE( "Testing PolygonalCalculus" ) //Not a great test BTW REQUIRE(curl.norm() == 2.0); } - + SECTION("Local Laplace-Beltrami") { PolygonalCalculus< RealPoint,RealVector >::Face f = 0; auto nf = box.incidentVertices(f).size(); - + auto L = boxCalculus.laplaceBeltrami(f); PolygonalCalculus< RealPoint,RealVector >::Vector phi(nf),expected(nf); phi << 1.0, 1.0, 1.0, 1.0; @@ -212,7 +212,7 @@ TEST_CASE( "Testing PolygonalCalculus" ) REQUIRE( det == Approx(1.0)); REQUIRE( lphi[2] == Approx(-3.683)); } - + SECTION("Covariant Operators") { PolygonalCalculus< RealPoint,RealVector >::Face f = 0; @@ -238,33 +238,33 @@ TEST_CASE( "Testing PolygonalCalculus" ) double a=0.0; for( PolygonalCalculus< RealPoint,RealVector >::MySurfaceMesh::Index v=0; v < box.nbVertices(); ++v ) a += M.coeffRef(v,v); - + double fa=0.0; for( PolygonalCalculus< RealPoint,RealVector >::MySurfaceMesh::Index f=0; f < box.nbFaces(); ++f ) fa += box.faceArea(f); REQUIRE( a == fa ); } - + SECTION("Checking cache") { auto cacheU = boxCalculus.getOperatorCacheMatrix( [&](const PolygonalCalculus< RealPoint,RealVector >::Face f){ return boxCalculus.sharp(f);} ); REQUIRE( cacheU.size() == 6 ); - + auto cacheC = boxCalculus.getOperatorCacheVector( [&](const PolygonalCalculus< RealPoint,RealVector >::Face f){ return boxCalculus.centroid(f);} ); REQUIRE( cacheC.size() == 6 ); } - + SECTION("Internal cache") { PolygonalCalculus< RealPoint,RealVector > boxCalculusCached(box,true); trace.info()<< boxCalculusCached <::SparseMatrix L(box.nbVertices(),box.nbVertices()); for(auto i=0; i < 1000 ; ++i) L += i*boxCalculus.globalLaplaceBeltrami(); auto tps = trace.endBlock(); - + trace.beginBlock("With cache"); PolygonalCalculus< RealPoint,RealVector >::SparseMatrix LC(box.nbVertices(),box.nbVertices()); for(auto i=0; i < 1000 ; ++i) @@ -272,9 +272,9 @@ TEST_CASE( "Testing PolygonalCalculus" ) auto tpsC = trace.endBlock(); REQUIRE(tpsC < tps); REQUIRE(L.norm() == Approx(LC.norm())); - + } - + } TEST_CASE( "Testing PolygonalCalculus and DirichletConditions" ) @@ -287,7 +287,7 @@ TEST_CASE( "Testing PolygonalCalculus and DirichletConditions" ) // Build a more complex surface. auto params = SH3::defaultParameters(); - + params( "polynomial", "0.1*y*y -0.1*x*x - 2.0*z" )( "gridstep", 2.0 ); auto implicit_shape = SH3::makeImplicitShape3D ( params ); auto digitized_shape = SH3::makeDigitizedImplicitShape3D( implicit_shape, params ); @@ -295,16 +295,16 @@ TEST_CASE( "Testing PolygonalCalculus and DirichletConditions" ) auto binary_image = SH3::makeBinaryImage( digitized_shape, params ); auto surface = SH3::makeDigitalSurface( binary_image, K, params ); auto primalSurface = SH3::makePrimalSurfaceMesh(surface); - + std::vector > faces; std::vector positions = primalSurface->positions(); for( PolygonalCalculus< RealPoint,RealVector >::MySurfaceMesh::Index face= 0 ; face < primalSurface->nbFaces(); ++face) faces.push_back(primalSurface->incidentVertices( face )); - + Mesh surfmesh = Mesh( positions.begin(), positions.end(), faces.begin(), faces.end() ); auto boundaryEdges = surfmesh.computeManifoldBoundaryEdges(); - + // Builds calculus and solve a Poisson problem with Dirichlet boundary conditions PolyDEC calculus( surfmesh ); // Laplace opeartor @@ -324,7 +324,7 @@ TEST_CASE( "Testing PolygonalCalculus and DirichletConditions" ) return cos(scale*(surfmesh.position(v)[0])) * (scale*surfmesh.position(v)[1]); }; - + for(auto &e: boundaryEdges) { auto adjVertices = surfmesh.edgeVertices(e); From 65315fddeb66d8c79f7b4c999ae331623e88fdf5 Mon Sep 17 00:00:00 2001 From: Lieunoir Date: Wed, 5 Jun 2024 18:13:39 +0200 Subject: [PATCH 02/11] Add example --- examples/polyscope-examples/CMakeLists.txt | 5 +- .../polyscope-examples/dgtalFEM-poisson.cpp | 136 ++++++++++++++++++ 2 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 examples/polyscope-examples/dgtalFEM-poisson.cpp diff --git a/examples/polyscope-examples/CMakeLists.txt b/examples/polyscope-examples/CMakeLists.txt index 81d4065344..84707104b1 100644 --- a/examples/polyscope-examples/CMakeLists.txt +++ b/examples/polyscope-examples/CMakeLists.txt @@ -39,11 +39,12 @@ set(POLYSCOPE_SRCS exampleBunnyHead tangency-explorer tangency-reconstruction + dgtalFEM-poisson ) if(WITH_LIBIGL) - set(POLYSCOPE_SRCS - ${POLYSCOPE_SRCS} + set(POLYSCOPE_SRCS + ${POLYSCOPE_SRCS} windingNumbersShape ) endif() diff --git a/examples/polyscope-examples/dgtalFEM-poisson.cpp b/examples/polyscope-examples/dgtalFEM-poisson.cpp new file mode 100644 index 0000000000..303a41bf3a --- /dev/null +++ b/examples/polyscope-examples/dgtalFEM-poisson.cpp @@ -0,0 +1,136 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/** + * @file + * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) + * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * + * @date 2021/09/02 + * + * This file is part of the DGtal library. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +#include +#include + +using namespace DGtal; +using namespace Z3i; + +// Using standard 3D digital space. +typedef Shortcuts SH3; +typedef ShortcutsGeometry SHG3; +// The following typedefs are useful +typedef SurfaceMesh< RealPoint, RealVector > SurfMesh; +typedef std::size_t Index; +//Polyscope global +polyscope::SurfaceMesh *psMesh; +SurfMesh surfmesh; +float scale = 0.1; + +void computeLaplace() +{ + //! [FEM-init] + typedef NormalCorrectedFEM ncFEM; + typedef DirichletConditions< EigenLinearAlgebraBackend > DC; + ncFEM calculus(surfmesh); + ncFEM::LinearOperator L = calculus.L0(); + ncFEM::DenseVector g = ncFEM::DenseVector::Zero(surfmesh.nbVertices()); + DC::IntegerVector b = DC::IntegerVector::Zero( g.rows() ); + + //We set values on the boundary + auto boundaryEdges = surfmesh.computeManifoldBoundaryEdges(); + std::cout<< "Number of boundary edges= "<addVertexScalarQuantity("g", g); + psMesh->addVertexScalarQuantity("u", u); +} + +void myCallback() +{ + ImGui::SliderFloat("Phi scale", &scale, 0., 10.); + if(ImGui::Button("Compute Laplace problem")) + computeLaplace(); +} + +int main() +{ + auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); + + auto h=.7 ; //gridstep + params( "polynomial", "0.1*y*y -0.1*x*x - 2.0*z" )( "gridstep", h ); + auto implicit_shape = SH3::makeImplicitShape3D ( params ); + auto digitized_shape = SH3::makeDigitizedImplicitShape3D( implicit_shape, params ); + auto K = SH3::getKSpace( params ); + auto binary_image = SH3::makeBinaryImage( digitized_shape, params ); + auto surface = SH3::makeDigitalSurface( binary_image, K, params ); + auto primalSurface = SH3::makePrimalSurfaceMesh(surface); + + //Need to convert the faces + std::vector> faces; + std::vector positions = primalSurface->positions(); + for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) + faces.push_back(primalSurface->incidentVertices( face )); + + surfmesh = SurfMesh(positions.begin(), + positions.end(), + faces.begin(), + faces.end()); + surfmesh.computeFaceNormalsFromPositions(); + psMesh = polyscope::registerSurfaceMesh("digital surface", positions, faces); + + // Initialize polyscope + polyscope::init(); + + // Set the callback function + polyscope::state::userCallback = myCallback; + polyscope::show(); + return EXIT_SUCCESS; +} From 03d0dcee2d6c64cd6ae96b732e6cc5c7a9ae70e6 Mon Sep 17 00:00:00 2001 From: Lieunoir Date: Wed, 5 Jun 2024 18:15:04 +0200 Subject: [PATCH 03/11] Add documentation --- src/DGtal/dec/InterpolatedCorrectedCalculus.h | 70 +++++++- src/DGtal/dec/NormalCorrectedFEM.h | 59 ++++++- src/DGtal/dec/SurfaceDEC.h | 149 ++++++++++++----- .../dec/doc/images/fem/poisson-fem-g.png | Bin 0 -> 76694 bytes .../dec/doc/images/fem/poisson-fem-surf.png | Bin 0 -> 75234 bytes .../dec/doc/images/fem/poisson-fem-u.png | Bin 0 -> 93581 bytes .../dec/doc/moduleNormalCorrectedFEM.dox | 153 ++++++++++++++++++ src/DGtal/dec/doc/packageDEC.dox | 2 + 8 files changed, 382 insertions(+), 51 deletions(-) create mode 100644 src/DGtal/dec/doc/images/fem/poisson-fem-g.png create mode 100644 src/DGtal/dec/doc/images/fem/poisson-fem-surf.png create mode 100644 src/DGtal/dec/doc/images/fem/poisson-fem-u.png create mode 100644 src/DGtal/dec/doc/moduleNormalCorrectedFEM.dox diff --git a/src/DGtal/dec/InterpolatedCorrectedCalculus.h b/src/DGtal/dec/InterpolatedCorrectedCalculus.h index d1ebb2f9c7..84e78fe9e3 100644 --- a/src/DGtal/dec/InterpolatedCorrectedCalculus.h +++ b/src/DGtal/dec/InterpolatedCorrectedCalculus.h @@ -1,5 +1,24 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + **/ #pragma once +#if !defined InterpolatedCorrectedCalculus_h +/** Prevents repeated inclusion of headers. */ +#define InterpolatedCorrectedCalculus_h + #include "DGtal/base/Common.h" #include "DGtal/dec/SurfaceDEC.h" #include "DGtal/shapes/SurfaceMesh.h" @@ -7,6 +26,24 @@ namespace DGtal { + ///////////////////////////////////////////////////////////////////////////// + // template class InterpolatedCorrectedCalculus + /** + Description of template class 'InterpolatedCorrectedCalculus'

+ \brief Implement differential operators on digital surfaces with + a vertex normal field. + + Works digital surfaces. + + Requires vertex normals on attached surface mesh. + + Implements SurfaceDEC methods. Use them to access the corresponding operators. + + * @tparam TLinearAlgebraBackend linear algebra backend used (i.e. + EigenSparseLinearAlgebraBackend). + @tparam TRealPoint an arbitrary model of 3D RealPoint. + @tparam TRealVector an arbitrary model of 3D RealVector. + */ template class InterpolatedCorrectedCalculus @@ -465,6 +502,18 @@ namespace DGtal } public: + /// @name Initialization services + /// @{ + + /// Default constructor. The object is invalid. + InterpolatedCorrectedCalculus() : myMesh( nullptr ) + { + } + + /// Constructor from surface mesh \a smesh. + /// @param smesh any surface mesh + /// @param use2ndOrder wether to use 2nd order method for interpolating normals (slightly more precise) + /// @param lambda value used for M1 positive definitness following @cite degoes2020discrete InterpolatedCorrectedCalculus( const ConstAlias smesh, bool use2ndOrder = false, double lambda = 0.1 ) @@ -477,6 +526,7 @@ namespace DGtal return; } } + ///@} private: DenseMatrix buildLocalM0( Index f ) const @@ -500,7 +550,7 @@ namespace DGtal for ( Face f = 0; f < myMesh->nbFaces(); ++f ) { const auto vtcs = myMesh->incidentVertices( f ); - const auto nv = vtcs.size(); + const auto nv = vtcs.size(); if ( nv == 4 ) values = quadrangleInnerProduct0( f ); else @@ -564,6 +614,7 @@ namespace DGtal DenseMatrix buildLocalM2( Index f ) const { + /* const auto nv = myMesh->incidentVertices( f ).size(); DenseMatrix res; if ( nv == 4 ) @@ -574,6 +625,8 @@ namespace DGtal << " face should be quadrangles" << std::endl; } return res; + */ + return DenseMatrix(); } LinearOperator buildM2() const @@ -693,12 +746,13 @@ namespace DGtal DenseMatrix buildLocalD0( Index f ) const { - const auto nc = myMesh->incidentVertices(f).size(); - DenseMatrix res = DenseMatrix::Zero(nc, nc); - for(int i = 0; i < nc; i++) { - res((i-1+nc)%nc, i) = 1; - res(i, i) = -1; - } + const auto nc = myMesh->incidentVertices( f ).size(); + DenseMatrix res = DenseMatrix::Zero( nc, nc ); + for ( int i = 0; i < nc; i++ ) + { + res( ( i - 1 + nc ) % nc, i ) = 1; + res( i, i ) = -1; + } return res; } @@ -735,3 +789,5 @@ namespace DGtal }; } // namespace DGtal + +#endif diff --git a/src/DGtal/dec/NormalCorrectedFEM.h b/src/DGtal/dec/NormalCorrectedFEM.h index b28fb4a77c..36d6653f43 100644 --- a/src/DGtal/dec/NormalCorrectedFEM.h +++ b/src/DGtal/dec/NormalCorrectedFEM.h @@ -1,8 +1,23 @@ - - -#if !defined SurfaceMeshMFE_h +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + **/ + #pragma once + +#if !defined NormalCorrectedFEM_h /** Prevents repeated inclusion of headers. */ -#define SurfaceMeshMFE_h +#define NormalCorrectedFEM_h ////////////////////////////////////////////////////////////////////////////// // Inclusions @@ -18,11 +33,15 @@ namespace DGtal ///////////////////////////////////////////////////////////////////////////// // template class CorrectedFEM /** - Description of template class 'CorrectedFEM'

\brief Aim: + Description of template class 'NormalCorrectedFEM'

\brief Aim: Provides methods for building a stiffness and mass matrix to solve Poisson problems using the Finite Element Method using a corrected normal field. + Works with triangular and quadrangular surfaces. + + Requires face normals on attached surface mesh. + * @tparam TLinearAlgebraBackend linear algebra backend used (i.e. EigenSparseLinearAlgebraBackend). @tparam TRealPoint an arbitrary model of 3D RealPoint. @@ -37,6 +56,7 @@ namespace DGtal typedef TRealVector RealVector; typedef typename LinearAlgebraBackend::SparseMatrix LinearOperator; typedef typename LinearAlgebraBackend::DenseMatrix DenseMatrix; + typedef typename LinearAlgebraBackend::DenseVector DenseVector; typedef SurfaceMesh Mesh; typedef typename Mesh::Vertex Vertex; typedef typename Mesh::Edge Edge; @@ -368,6 +388,13 @@ namespace DGtal init( &smesh ); } + /// @} + /// @name Standard services + /// @{ + + /// Return the stiffness matrix degree x degree of the face. + /// @param f a face + /// @return the degree x degree stiffness matrix DenseMatrix localL0( Face f ) const { const auto vtcs = myMesh->incidentVertices( f ); @@ -384,20 +411,42 @@ namespace DGtal } } + /// Return the global stiffness matrix n_v x n_v. + /// @return the n_v x n_v stiffness matrix + /// + /// @note The sign convention for the divergence and the Laplacian + /// operator is opposite to the one of @cite degoes2020discrete . + /// This is to match the usual mathematical + /// convention that the Laplacian (and the Laplacian-Beltrami) has + /// negative eigenvalues (and is the sum of second derivatives in + /// the cartesian grid). It also follows the formal adjointness of + /// exterior derivative and opposite of divergence as relation \f$ + /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v + /// \rangle \f$. See also + /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator LinearOperator L0() const { return buildL0(); } + /// Return the global mass matrix n_v x n_v. + /// This matrix is not diagonal. To obtain a (less precise) + /// diagonal version use lumpedM0() + /// @return the n_v x n_v mass matrix LinearOperator M0() const { return buildM0(); } + /// Return the global lumped mass matrix n_v x n_v. + /// This matrix is diagonal. To obtain a (more precise) + /// non diagonal version use M0() + /// @return the n_v x n_v mass matrix LinearOperator lumpedM0() const { return buildLumpedM0(); } + /// @} }; } // namespace DGtal diff --git a/src/DGtal/dec/SurfaceDEC.h b/src/DGtal/dec/SurfaceDEC.h index 66100fb16d..44968e204e 100644 --- a/src/DGtal/dec/SurfaceDEC.h +++ b/src/DGtal/dec/SurfaceDEC.h @@ -1,99 +1,170 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + **/ #pragma once +#if !defined SurfaceDEC_h +/** Prevents repeated inclusion of headers. */ +#define SurfaceDEC_h + #include "DGtal/math/linalg/EigenSupport.h" namespace DGtal { /** - Description of template class 'SurfaceMeshDEC'

\brief Aim: - Provides methods and operators that builds different variants of - discrete calculii onto a surface mesh. + Description of template class 'SurfaceDEC'

\brief + Provides methods and operators definitions for DEC. - * @tparam TRealPoint an arbitrary model of 3D RealPoint. - @tparam TRealVector an arbitrary model of 3D RealVector. + * @tparam T An implementation that also inherit `SurfaceDEC` + @tparam TLinearAlgebraBackend linear algebra backend used (i.e. + EigenSparseLinearAlgebraBackend). */ - template + template class SurfaceDEC { - typedef typename EigenLinearAlgebraBackend::DenseVector::Index Index; - typedef typename EigenLinearAlgebraBackend::DenseMatrix DenseMatrix; - typedef typename EigenLinearAlgebraBackend::SparseMatrix LinearOperator; + typedef typename TLinearAlgebraBackend::DenseVector::Index Index; + typedef typename TLinearAlgebraBackend::DenseMatrix DenseMatrix; + typedef typename TLinearAlgebraBackend::SparseMatrix LinearOperator; public: - DenseMatrix localD0( Index f ) const - { - return static_cast( this )->buildLocalD0( f ); - } + /// @name Global operators + /// @{ + /// Global differential + /// @return the n_e x n_v diffential matrix LinearOperator D0() const { return static_cast( this )->buildD0(); } - DenseMatrix localL0( Index f ) const - { - return static_cast( this )->buildLocalL0( f ); - } - + /// Global Laplace-Beltrami + /// @return the n_v x n_v striffness matrix LinearOperator L0() const { return static_cast( this )->buildL0(); } - DenseMatrix localM0( Index f ) const - { - return static_cast( this )->buildLocalM0( f ); - } - + /// Global inner product between 0 forms + /// For a diagonal version see lumpedM0() + /// @return the n_v x n_v mass matrix LinearOperator M0() const { return static_cast( this )->buildM0(); } + /// Global diagonal inner product between 0 forms + /// + /// @param f a face + /// @return the n_v x n_v diagonal mass matrix LinearOperator lumpedM0() const { return static_cast( this )->buildLumpedM0(); } - DenseMatrix localM1( Index f ) const + /// Global inner product between 1 forms + /// @return the n_e x n_e mass matrix + LinearOperator M1() const { - return static_cast( this )->buildLocalM1( f ); + return static_cast( this )->buildM1(); } - LinearOperator M1() const + /// Global inner product between 2 forms + /// @return the n_f x n_f mass matrix + LinearOperator M2() const { - return static_cast( this )->buildM1(); + return static_cast( this )->buildM2(); } - DenseMatrix localM2( Index f ) const + /// Global Sharp operator + /// @return a 3*n_f x n_e matrix + LinearOperator Sharp() const { - return static_cast( this )->buildLocalM2( f ); + return static_cast( this )->buildSharp(); } - LinearOperator M2() const + /// Global Flat operator + /// @return a n_e x 3*n_f matrix + LinearOperator Flat() const { - return static_cast( this )->buildM2(); + return static_cast( this )->buildFlat(); } - DenseMatrix localSharp( Index f ) const + /// @} + + /// @name Per face operators + /// @{ + + /// Differential inside a face + /// @param f a face + /// @return the degree x degree differential matrix + DenseMatrix localD0( Index f ) const { - return static_cast( this )->buildLocalSharp( f ); + return static_cast( this )->buildLocalD0( f ); } - LinearOperator Sharp() const + /// Laplace-Beltrami inside a face + /// @param f a face + /// @return the degree x degree stiffness matrix + DenseMatrix localL0( Index f ) const { - return static_cast( this )->buildSharp(); + return static_cast( this )->buildLocalL0( f ); } - DenseMatrix localFlat( Index f ) const + /// Inner product between 0 forms inside a face + /// @param f a face + /// @return the degree x degree mass matrix + DenseMatrix localM0( Index f ) const { - return static_cast( this )->buildLocalFlat( f ); + return static_cast( this )->buildLocalM0( f ); } - LinearOperator Flat() const + /// Inner product between 1 forms inside a face + /// @param f a face + /// @return the degree x degree mass matrix + DenseMatrix localM1( Index f ) const { - return static_cast( this )->buildFlat(); + return static_cast( this )->buildLocalM1( f ); } + + /// Inner product between 2 forms inside a face + /// @param f a face + /// @return the 1 x 1 mass matrix + DenseMatrix localM2( Index f ) const + { + return static_cast( this )->buildLocalM2( f ); + } + + /// Sharp operator for inside a face + /// @param f a face + /// @return a 3 x degree matrix + DenseMatrix localSharp( Index f ) const + { + return static_cast( this )->buildLocalSharp( f ); + } + + /// Flat operator inside a face + /// @param f a face + /// @return a degree x 3 matrix + DenseMatrix localFlat( Index f ) const + { + return static_cast( this )->buildLocalFlat( f ); + } + + /// @} }; } // namespace DGtal + +#endif diff --git a/src/DGtal/dec/doc/images/fem/poisson-fem-g.png b/src/DGtal/dec/doc/images/fem/poisson-fem-g.png new file mode 100644 index 0000000000000000000000000000000000000000..e00722508bac95659ecb94cebf97b033b2c7cca5 GIT binary patch literal 76694 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 literal 0 HcmV?d00001 diff --git a/src/DGtal/dec/doc/images/fem/poisson-fem-surf.png b/src/DGtal/dec/doc/images/fem/poisson-fem-surf.png new file mode 100644 index 0000000000000000000000000000000000000000..3a7a6131774166d11bd7775b0d7cb3e7a86ef7f7 GIT binary patch literal 75234 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

lnzBqO@-CO!E~y&-Jki6T-w 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%0Al&k2Ntsi6NL>>i% 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 +using SurfMesh = SurfaceMesh; +using namespace Z3i; + +//Vertices +std::vector positions={ {0,0,0},{1,0,0},{1,1,0},{0,0,1} }; +//Single face +std::vector> faces={{ 0,1,2,3 }}; + +mesh = SurfMesh(positions.begin(),positions.end(),faces.begin(),faces.end()); +// We require normal at faces. For digital surfaces, prefer using a convergent estimator +mesh.computeFaceNormalsFromPositions(); + +ncFEM calculus(mesh); +@endcode + +we obtain a SurfaceMesh instance with a unique face, we add the naturally defined normal +to it and we define its associated NormalCorrectedFEM object. + +Let us add a scalar function on vertices. For instance, using Eigen syntax, we can use; + +@code +ncFEM::DenseVector phi(4); //5 vertices +phi << 1.0, 2.0, 0.0, 5.0; +@endcode + +\subsection sublap Mass matrix and stiffness matrix + +The expression for the integral of the product of two functions @f$f@f$ and @f$g@f$ inside a surfel is given by the following expression : +@f[ \int_{\square} \sqrt{det(G)}fg @f] + +The expression for the integral of the dot product of the gradient of two functions @f$f@f$ and @f$g@f$ inside a surfel is given by the following expression : +@f[ \int_{\square} \sqrt{det(G)} \nabla f^T G^{-1} \nabla g \rangle @f] + +By evaluating this expression with a linear basis, we can build matrices letting us evaluate these integrals for any two linear functions inside a face. +The results can be obtained in the following way : + +Operator | Output | Description +------------- | ------------- | ---- +`calculus.localM0(f)` | \f$ n_v\times n_v\f$ | mass matrix (corresponds to the inner product between 0 forms in @cite degoes2020discrete) +`calculus.localL0(f)`| \f$ n_v \times n_v\f$ | stiffness matrix (corresponds to Laplace-Beltrami operator in @cite degoes2020discrete), the matrix is PSD + +\section sectPolygonalCalculusGlo Global operators + +Given a scalar function defined on a generic surface mesh vertices, all previously mentioned operators can be applied to obtain consistent quantities on the overall mesh. + + +Operator | Output | Description +------------- | ------------- | ---- +`calculus.M0()` | \f$ n_v \times n_v\f$ | global mass matrix (PD) +`calculus.lumpedM0()` | \f$ n_v \times n_v\f$ | global lumped mass matrix (Diagonal, positive) +`calculus.L0()`| \f$ n_v \times n_v\f$ | global stiffness matrix (SPD) + + +\section secLap Example: Solving a Laplace problem + +Let suppose we want to solve the following Laplace problem for data interpolation: +\f{eqnarray*}{ + \Delta_\Omega u& = 0 \\ + & s.t. u = g \text{ on } \partial\Omega +\f} + +We want to solve that problem on a digital surface @f$\Omega@f$ + with a boundary and some scalar values attached +to boundary vertices, or sampled on the object surface. + +Furthermore, the discrete version of the Laplace problem boils down to +a simple linear problem using on the discrete Laplace-Beltrami sparse +matrix. + +We also use class DirichletConditions to enforce Dirichlet boundary +conditions on the system. + +The overall code is: +\snippet dgtalFEM-poisson.cpp FEM-init + +Leading to the following results (see \ref dgtalFEM-poisson.cpp): + +Surface | Boundary condition @f$ g@f$ | Solution @f$ u @f$ +--|--|-- +@image html images/fem/poisson-fem-surf.png "" | @image html images/fem/poisson-fem-g.png "" | @image html images/fem/poisson-fem-u.png "" + +*/ + +} diff --git a/src/DGtal/dec/doc/packageDEC.dox b/src/DGtal/dec/doc/packageDEC.dox index 2ac3f05596..0edb3347f6 100644 --- a/src/DGtal/dec/doc/packageDEC.dox +++ b/src/DGtal/dec/doc/packageDEC.dox @@ -62,6 +62,7 @@ Basic operators, such as Hodge duality operator or exterior derivative, can be c - \subpage modulePolygonalCalculus (David Coeurjolly, Jacques-Olivier Lachaud, Baptiste Genest) - \subpage moduleGeodesicsInHeat (David Coeurjolly, Jacques-Olivier Lachaud) - \subpage moduleVectorsInHeat (Baptiste Genest, David Coeurjolly) +- \subpage moduleNormalCorrectedFEM (Colin Weill--Duflos) @b Package @b Concepts @b Overview - \subpage packageDECConcepts @@ -83,6 +84,7 @@ Basic operators, such as Hodge duality operator or exterior derivative, can be c - exampleVectorHeatMethod.cpp - exampleHarmonicParametrization.cpp - exampleBunnyHead.cpp +- dgtalFEM-poisson.cpp */ From b5d7b41bc798fd794cb14a142300725df92c173b Mon Sep 17 00:00:00 2001 From: Deploy from CI <> Date: Fri, 21 Jun 2024 12:56:12 +0200 Subject: [PATCH 04/11] Add calculus doc, examples --- examples/polyscope-examples/CMakeLists.txt | 1 + .../polyscope-examples/dgtalCC-poisson.cpp | 137 + .../polyscope-examples/dgtalFEM-poisson.cpp | 6 +- src/DGtal/dec/InterpolatedCorrectedCalculus.h | 17 +- src/DGtal/dec/PolygonalCalculus.h | 2539 +++++++++-------- src/DGtal/dec/SurfaceDEC.h | 31 +- src/DGtal/dec/doc/images/cc/poisson-cc-g.png | Bin 0 -> 104050 bytes .../dec/doc/images/cc/poisson-cc-surf.png | Bin 0 -> 80713 bytes src/DGtal/dec/doc/images/cc/poisson-cc-u.png | Bin 0 -> 175551 bytes .../moduleInterpolatedCorrectedCalculus.dox | 192 ++ .../dec/doc/moduleNormalCorrectedFEM.dox | 20 +- src/DGtal/dec/doc/modulePolygonalCalculus.dox | 94 +- src/DGtal/dec/doc/packageDEC.dox | 2 + 13 files changed, 1795 insertions(+), 1244 deletions(-) create mode 100644 examples/polyscope-examples/dgtalCC-poisson.cpp create mode 100644 src/DGtal/dec/doc/images/cc/poisson-cc-g.png create mode 100644 src/DGtal/dec/doc/images/cc/poisson-cc-surf.png create mode 100644 src/DGtal/dec/doc/images/cc/poisson-cc-u.png create mode 100644 src/DGtal/dec/doc/moduleInterpolatedCorrectedCalculus.dox diff --git a/examples/polyscope-examples/CMakeLists.txt b/examples/polyscope-examples/CMakeLists.txt index 84707104b1..61efc5da47 100644 --- a/examples/polyscope-examples/CMakeLists.txt +++ b/examples/polyscope-examples/CMakeLists.txt @@ -40,6 +40,7 @@ set(POLYSCOPE_SRCS tangency-explorer tangency-reconstruction dgtalFEM-poisson + dgtalCC-poisson ) if(WITH_LIBIGL) diff --git a/examples/polyscope-examples/dgtalCC-poisson.cpp b/examples/polyscope-examples/dgtalCC-poisson.cpp new file mode 100644 index 0000000000..f05b29e492 --- /dev/null +++ b/examples/polyscope-examples/dgtalCC-poisson.cpp @@ -0,0 +1,137 @@ +/** + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +/** + * @file + * @author Colin Weill--Duflos (\c colin.weill-duflos@univ-smb.fr ) + * Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France + * + * @date 2024/06/05 + * + * This file is part of the DGtal library. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +#include +#include + +using namespace DGtal; +using namespace Z3i; + +// Using standard 3D digital space. +typedef Shortcuts SH3; +typedef ShortcutsGeometry SHG3; +// The following typedefs are useful +typedef SurfaceMesh< RealPoint, RealVector > SurfMesh; +typedef std::size_t Index; +//Polyscope global +polyscope::SurfaceMesh *psMesh; +SurfMesh surfmesh; +float scale = 0.1; + +void computeLaplace() +{ + //! [CC-init] + typedef InterpolatedCorrectedCalculus CC; + typedef DirichletConditions< EigenLinearAlgebraBackend > DC; + CC calculus(surfmesh); + CC::LinearOperator L = calculus.L0(); + CC::DenseVector g = CC::DenseVector::Zero(surfmesh.nbVertices()); + DC::IntegerVector b = DC::IntegerVector::Zero( g.rows() ); + + //We set values on the boundary + auto boundaryEdges = surfmesh.computeManifoldBoundaryEdges(); + std::cout<< "Number of boundary edges= "<addVertexScalarQuantity("g", g); + psMesh->addVertexScalarQuantity("u", u); +} + +void myCallback() +{ + ImGui::SliderFloat("Phi scale", &scale, 0., 10.); + if(ImGui::Button("Compute Laplace problem")) + computeLaplace(); +} + +int main() +{ + auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); + + auto h=.7 ; //gridstep + params( "polynomial", "0.1*y*y -0.1*x*x - 2.0*z" )( "gridstep", h ); + auto implicit_shape = SH3::makeImplicitShape3D ( params ); + auto digitized_shape = SH3::makeDigitizedImplicitShape3D( implicit_shape, params ); + auto K = SH3::getKSpace( params ); + auto binary_image = SH3::makeBinaryImage( digitized_shape, params ); + auto surface = SH3::makeDigitalSurface( binary_image, K, params ); + auto primalSurface = SH3::makePrimalSurfaceMesh(surface); + + //Need to convert the faces + std::vector> faces; + std::vector positions = primalSurface->positions(); + for(auto face= 0 ; face < primalSurface->nbFaces(); ++face) + faces.push_back(primalSurface->incidentVertices( face )); + + surfmesh = SurfMesh(positions.begin(), + positions.end(), + faces.begin(), + faces.end()); + surfmesh.computeFaceNormalsFromPositions(); + surfmesh.computeVertexNormalsFromFaceNormals(); + psMesh = polyscope::registerSurfaceMesh("digital surface", positions, faces); + + // Initialize polyscope + polyscope::init(); + + // Set the callback function + polyscope::state::userCallback = myCallback; + polyscope::show(); + return EXIT_SUCCESS; +} diff --git a/examples/polyscope-examples/dgtalFEM-poisson.cpp b/examples/polyscope-examples/dgtalFEM-poisson.cpp index 303a41bf3a..2b7ca749af 100644 --- a/examples/polyscope-examples/dgtalFEM-poisson.cpp +++ b/examples/polyscope-examples/dgtalFEM-poisson.cpp @@ -15,10 +15,10 @@ */ /** * @file - * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) - * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * @author Colin Weill--Duflos (\c colin.weill-duflos@univ-smb.fr ) + * Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France * - * @date 2021/09/02 + * @date 2024/06/05 * * This file is part of the DGtal library. */ diff --git a/src/DGtal/dec/InterpolatedCorrectedCalculus.h b/src/DGtal/dec/InterpolatedCorrectedCalculus.h index 84e78fe9e3..b9cd5ffc75 100644 --- a/src/DGtal/dec/InterpolatedCorrectedCalculus.h +++ b/src/DGtal/dec/InterpolatedCorrectedCalculus.h @@ -37,7 +37,8 @@ namespace DGtal Requires vertex normals on attached surface mesh. - Implements SurfaceDEC methods. Use them to access the corresponding operators. + Implements SurfaceDEC methods. Use them to access the corresponding + operators. * @tparam TLinearAlgebraBackend linear algebra backend used (i.e. EigenSparseLinearAlgebraBackend). @@ -512,8 +513,10 @@ namespace DGtal /// Constructor from surface mesh \a smesh. /// @param smesh any surface mesh - /// @param use2ndOrder wether to use 2nd order method for interpolating normals (slightly more precise) - /// @param lambda value used for M1 positive definitness following @cite degoes2020discrete + /// @param use2ndOrder wether to use 2nd order method for interpolating + /// normals (slightly more precise) + /// @param lambda value used for M1 positive definitness following @cite + /// degoes2020discrete InterpolatedCorrectedCalculus( const ConstAlias smesh, bool use2ndOrder = false, double lambda = 0.1 ) @@ -614,24 +617,21 @@ namespace DGtal DenseMatrix buildLocalM2( Index f ) const { - /* const auto nv = myMesh->incidentVertices( f ).size(); DenseMatrix res; if ( nv == 4 ) - res = DenseMatrix::Identity( 4, 4 ) * quadrangleArea( f ); + res = DenseMatrix::Identity( 1, 1 ) / quadrangleArea( f ); else { trace.error() << "[InterpolatedCorrectedCalculus::buildLocalM2]" << " face should be quadrangles" << std::endl; } return res; - */ - return DenseMatrix(); } LinearOperator buildM2() const { - Triplets triplets, triplets2; + Triplets triplets; LinearOperator myM2 = LinearOperator( myMesh->nbFaces(), myMesh->nbFaces() ); for ( Face f = 0; f < myMesh->nbFaces(); ++f ) @@ -646,7 +646,6 @@ namespace DGtal << " faces should be quadrangular." << std::endl; } triplets.push_back( { f, f, 1.0 / area } ); - triplets2.push_back( { f, f, area } ); } myM2.setFromTriplets( triplets.cbegin(), triplets.cend() ); return myM2; diff --git a/src/DGtal/dec/PolygonalCalculus.h b/src/DGtal/dec/PolygonalCalculus.h index 116a29d2ae..6823bbbfc5 100644 --- a/src/DGtal/dec/PolygonalCalculus.h +++ b/src/DGtal/dec/PolygonalCalculus.h @@ -19,7 +19,8 @@ /** * @file * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) - * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, + * UMR 5205), CNRS, France * * @date 2021/09/02 * @@ -38,6 +39,7 @@ #include "DGtal/base/ConstAlias.h" #include "DGtal/base/Common.h" #include "DGtal/shapes/SurfaceMesh.h" +#include "DGtal/dec/SurfaceDEC.h" #include "DGtal/math/linalg/EigenSupport.h" ////////////////////////////////////////////////////////////////////////////// @@ -68,9 +70,9 @@ namespace DGtal typedef typename MySurfaceMesh::Face Face; ///Position type typedef typename MySurfaceMesh::RealPoint Real3dPoint; - + EmbedderFromNormalVectors() = delete; - + /// Constructor from an array of normal vectors and a surface mesh instance. /// @param normals a vector of per face normal vectors (same ordering as the SurfaceMesh face indicies). /// @param surfmesh an instance of SurfaceMesh @@ -80,7 +82,7 @@ namespace DGtal myNormals = &normals; mySurfaceMesh = &surfmesh; } - + /// Project a face vertex onto its tangent plane (given by the per-face estimated /// normal vector). /// @@ -92,1219 +94,1436 @@ namespace DGtal Real3dPoint p = mySurfaceMesh->position(v); return p - nn.dot(p)*nn; } - + ///Alias to the normal vectors const std::vector *myNormals; ///Alias to the surface mesh const MySurfaceMesh *mySurfaceMesh; }; } - - - -///////////////////////////////////////////////////////////////////////////// -// template class PolygonalCalculus -/** - * Description of template class 'PolygonalCalculus'

- * \brief Implements differential operators on polygonal surfaces from - * @cite degoes2020discrete - * - * See @ref modulePolygonalCalculus for details. - * - * @note The sign convention for the divergence and the Laplacian - * operator is opposite to the one of @cite degoes2020discrete. This - * is to match the usual mathematical convention that the Laplacian - * (and the Laplacian-Beltrami) has negative eigenvalues (and is the - * sum of second derivatives in the cartesian grid). It also follows - * the formal adjointness of exterior derivative and opposite of - * divergence as relation \f$ \langle \mathrm{d} u, v \rangle = - - * \langle u, \mathrm{div} v \rangle \f$. See also - * https://en.wikipedia.org/wiki/Laplace–Beltrami_operator - * - * @tparam TRealPoint a model of points @f$\mathbb{R}^3@f$ (e.g. PointVector). - * @tparam TRealVector a model of vectors in @f$\mathbb{R}^3@f$ (e.g. PointVector). - */ -template -class PolygonalCalculus -{ - // ----------------------- Standard services ------------------------------ -public: - - ///Concept checking - static const Dimension dimension = TRealPoint::dimension; - BOOST_STATIC_ASSERT( ( dimension == 3 ) ); - - ///Self type - typedef PolygonalCalculus Self; - - ///Type of SurfaceMesh - typedef SurfaceMesh MySurfaceMesh; - ///Vertex type - typedef typename MySurfaceMesh::Vertex Vertex; - ///Face type - typedef typename MySurfaceMesh::Face Face; - ///Position type - typedef typename MySurfaceMesh::RealPoint Real3dPoint; - ///Real vector type - typedef typename MySurfaceMesh::RealVector Real3dVector; - - ///Linear Algebra Backend from Eigen - typedef EigenLinearAlgebraBackend LinAlg; - ///Type of Vector - typedef LinAlg::DenseVector Vector; - ///Global 0-form, 1-form, 2-form are Vector - typedef Vector Form; - ///Type of dense matrix - typedef LinAlg::DenseMatrix DenseMatrix; - ///Type of sparse matrix - typedef LinAlg::SparseMatrix SparseMatrix; - ///Type of sparse matrix triplet - typedef LinAlg::Triplet Triplet; - - ///Type of a sparse matrix solver - typedef LinAlg::SolverSimplicialLDLT Solver; - - /// @name Standard services - /// @{ - - /// Create a Polygonal DEC structure from a surface mesh (@a surf) - /// using an default identity embedder. - /// @param surf an instance of SurfaceMesh - /// @param globalInternalCacheEnabled enable the internal cache for all operators (default: false) - PolygonalCalculus(const ConstAlias surf, - bool globalInternalCacheEnabled = false): - mySurfaceMesh(&surf), myGlobalCacheEnabled(globalInternalCacheEnabled) - { - myEmbedder =[&](Face f,Vertex v){ (void)f; return mySurfaceMesh->position(v);}; - myVertexNormalEmbedder = [&](Vertex v){ return toReal3dVector(computeVertexNormal(v));}; - init(); - }; - - /// Create a Polygonal DEC structure from a surface mesh (@a surf) - /// and an embedder for the vertex position: function with two parameters, a face and a vertex - /// which outputs the embedding in R^3 of the vertex w.r.t. to the face. - /// @param surf an instance of SurfaceMesh - /// @param embedder an embedder for the vertex position - /// @param globalInternalCacheEnabled if true, the global operator cache is enabled - PolygonalCalculus(const ConstAlias surf, - const std::function &embedder, - bool globalInternalCacheEnabled = false): - mySurfaceMesh(&surf), myEmbedder(embedder), myGlobalCacheEnabled(globalInternalCacheEnabled) - { - myVertexNormalEmbedder = [&](Vertex v){ return toReal3dVector(computeVertexNormal(v)); }; - init(); - }; - - /// Create a Polygonal DEC structure from a surface mesh (@a surf) - /// and an embedder for the vertex normal: function with a vertex as - /// parameter which outputs the embedding in R^3 of the vertex normal. - /// @param surf an instance of SurfaceMesh - /// @param embedder an embedder for the vertex position - /// @param globalInternalCacheEnabled if true, the global operator cache is enabled - PolygonalCalculus(const ConstAlias surf, - const std::function &embedder, - bool globalInternalCacheEnabled = false): - mySurfaceMesh(&surf), myVertexNormalEmbedder(embedder), - myGlobalCacheEnabled(globalInternalCacheEnabled) - { - myEmbedder = [&](Face f,Vertex v){(void)f; return mySurfaceMesh->position(v); }; - init(); - }; - - /// Create a Polygonal DEC structure from a surface mesh (@a surf) - /// and an embedder for the vertex position: function with two parameters, a - /// face and a vertex which outputs the embedding in R^3 of the vertex - /// w.r.t. to the face. and an embedder for the vertex normal: function with - /// a vertex as parameter which outputs the embedding in R^3 of the vertex - /// normal. - /// @param surf an instance of SurfaceMesh - /// @param pos_embedder an embedder for the position - /// @param normal_embedder an embedder for the position - /// @param globalInternalCacheEnabled - PolygonalCalculus(const ConstAlias surf, - const std::function &pos_embedder, - const std::function &normal_embedder, - bool globalInternalCacheEnabled = false) : - mySurfaceMesh(&surf), myEmbedder(pos_embedder), - myVertexNormalEmbedder(normal_embedder), - myGlobalCacheEnabled(globalInternalCacheEnabled) - { - init(); - }; + + + ///////////////////////////////////////////////////////////////////////////// + // template class PolygonalCalculus /** - * Deleted default constructor. - */ - PolygonalCalculus() = delete; - - /** - * Destructor (default). - */ - ~PolygonalCalculus() = default; - - /** - * Deleted copy constructor. - * @param other the object to clone. - */ - PolygonalCalculus ( const PolygonalCalculus & other ) = delete; - - /** - * Deleted move constructor. - * @param other the object to move. - */ - PolygonalCalculus ( PolygonalCalculus && other ) = delete; - - /** - * Deleted copy assignment operator. - * @param other the object to copy. - * @return a reference on 'this'. - */ - PolygonalCalculus & operator= ( const PolygonalCalculus & other ) = delete; - - /** - * Deleted move assignment operator. - * @param other the object to move. - * @return a reference on 'this'. + * Description of template class 'PolygonalCalculus'

+ * \brief Implements differential operators on polygonal surfaces from + * @cite degoes2020discrete + * + * See @ref modulePolygonalCalculus for details. + * + * @note The sign convention for the divergence and the Laplacian + * operator is opposite to the one of @cite degoes2020discrete. This + * is to match the usual mathematical convention that the Laplacian + * (and the Laplacian-Beltrami) has negative eigenvalues (and is the + * sum of second derivatives in the cartesian grid). It also follows + * the formal adjointness of exterior derivative and opposite of + * divergence as relation \f$ \langle \mathrm{d} u, v \rangle = - + * \langle u, \mathrm{div} v \rangle \f$. See also + * https://en.wikipedia.org/wiki/Laplace–Beltrami_operator + * + * @tparam TRealPoint a model of points @f$\mathbb{R}^3@f$ (e.g. PointVector). + * @tparam TRealVector a model of vectors in @f$\mathbb{R}^3@f$ (e.g. + * PointVector). */ - PolygonalCalculus & operator= ( PolygonalCalculus && other ) = delete; - - /// @} - - // ----------------------- embedding services -------------------------- - //MARK: Embedding services - /// @name Embedding services - /// @{ - - /// Update the embedding function. - /// @param externalFunctor a new embedding functor (Face,Vertex)->RealPoint. - void setEmbedder(const std::function &externalFunctor) - { - myEmbedder = externalFunctor; - } - /// @} - - // ----------------------- Per face operators -------------------------------------- - //MARK: Per face operator on scalars - /// @name Per face operators on scalars - /// @{ - - /// Return the vertex position matrix degree x 3 of the face. - /// @param f a face - /// @return the n_f x 3 position matrix - DenseMatrix X(const Face f) const + template + class PolygonalCalculus + : public SurfaceDEC, + EigenLinearAlgebraBackend> { - if (checkCache(X_,f)) - return myGlobalCache[X_][f]; - - const auto vertices = mySurfaceMesh->incidentVertices(f); - const auto nf = myFaceDegree[f]; - DenseMatrix Xt(nf,3); - size_t cpt=0; - for(auto v: vertices) - { - Xt(cpt,0) = myEmbedder(f,v)[0]; - Xt(cpt,1) = myEmbedder(f,v)[1]; - Xt(cpt,2) = myEmbedder(f,v)[2]; - ++cpt; - } - - setInCache(X_,f,Xt); - return Xt; - } - + friend class SurfaceDEC; - /// Derivative operator (d_0) of a face. - /// @param f the face - /// @return a degree x degree matrix - DenseMatrix D(const Face f) const - { - if (checkCache(D_,f)) - return myGlobalCache[D_][f]; - - const auto nf = myFaceDegree[f]; - DenseMatrix d = DenseMatrix::Zero(nf ,nf); - for(auto i=0u; i < nf; ++i) - { - d(i,i) = -1.; - d(i, (i+1)%nf) = 1.; - } - - setInCache(D_,f,d); - return d; - } - - /// Edge vector operator per face. - /// @param f the face - /// @return degree x 3 matrix - DenseMatrix E(const Face f) const - { - if (checkCache(E_,f)) - return myGlobalCache[E_][f]; + // ----------------------- Standard services ------------------------------ + public: + /// Concept checking + static const Dimension dimension = TRealPoint::dimension; + BOOST_STATIC_ASSERT( ( dimension == 3 ) ); - DenseMatrix op = D(f)*X(f); - - setInCache(E_,f,op); - return op; - } - - /// Average operator to average, per edge, its vertex values. - /// @param f the face - /// @return a degree x degree matrix - DenseMatrix A(const Face f) const - { - if (checkCache(A_,f)) - return myGlobalCache[A_][f]; - - const auto nf = myFaceDegree[f]; - DenseMatrix a = DenseMatrix::Zero(nf ,nf); - for(auto i=0u; i < nf; ++i) + /// Self type + typedef PolygonalCalculus Self; + + /// Type of SurfaceMesh + typedef SurfaceMesh MySurfaceMesh; + /// Vertex type + typedef typename MySurfaceMesh::Vertex Vertex; + /// Face type + typedef typename MySurfaceMesh::Face Face; + /// Position type + typedef typename MySurfaceMesh::RealPoint Real3dPoint; + /// Real vector type + typedef typename MySurfaceMesh::RealVector Real3dVector; + + /// Linear Algebra Backend from Eigen + typedef EigenLinearAlgebraBackend LinAlg; + /// Type of Vector + typedef LinAlg::DenseVector Vector; + /// Global 0-form, 1-form, 2-form are Vector + typedef Vector Form; + /// Type of dense matrix + typedef LinAlg::DenseMatrix DenseMatrix; + /// Type of sparse matrix + typedef LinAlg::SparseMatrix SparseMatrix; + /// Type of sparse matrix triplet + typedef LinAlg::Triplet Triplet; + + /// Type of a sparse matrix solver + typedef LinAlg::SolverSimplicialLDLT Solver; + + /// @name Standard services + /// @{ + + /// Create a Polygonal DEC structure from a surface mesh (@a surf) + /// using an default identity embedder. + /// @param surf an instance of SurfaceMesh + /// @param globalInternalCacheEnabled enable the internal cache for all + /// operators (default: false) + PolygonalCalculus( const ConstAlias surf, + bool globalInternalCacheEnabled = false ) + : mySurfaceMesh( &surf ) + , myGlobalCacheEnabled( globalInternalCacheEnabled ) + { + myEmbedder = [ & ]( Face f, Vertex v ) + { + (void)f; + return mySurfaceMesh->position( v ); + }; + myVertexNormalEmbedder = [ & ]( Vertex v ) + { return toReal3dVector( computeVertexNormal( v ) ); }; + init(); + }; + + /// Create a Polygonal DEC structure from a surface mesh (@a surf) + /// and an embedder for the vertex position: function with two parameters, a + /// face and a vertex which outputs the embedding in R^3 of the vertex + /// w.r.t. to the face. + /// @param surf an instance of SurfaceMesh + /// @param embedder an embedder for the vertex position + /// @param globalInternalCacheEnabled if true, the global operator cache is + /// enabled + PolygonalCalculus( + const ConstAlias surf, + const std::function & embedder, + bool globalInternalCacheEnabled = false ) + : mySurfaceMesh( &surf ) + , myEmbedder( embedder ) + , myGlobalCacheEnabled( globalInternalCacheEnabled ) + { + myVertexNormalEmbedder = [ & ]( Vertex v ) + { return toReal3dVector( computeVertexNormal( v ) ); }; + init(); + }; + + /// Create a Polygonal DEC structure from a surface mesh (@a surf) + /// and an embedder for the vertex normal: function with a vertex as + /// parameter which outputs the embedding in R^3 of the vertex normal. + /// @param surf an instance of SurfaceMesh + /// @param embedder an embedder for the vertex position + /// @param globalInternalCacheEnabled if true, the global operator cache is + /// enabled + PolygonalCalculus( const ConstAlias surf, + const std::function & embedder, + bool globalInternalCacheEnabled = false ) + : mySurfaceMesh( &surf ) + , myVertexNormalEmbedder( embedder ) + , myGlobalCacheEnabled( globalInternalCacheEnabled ) { - a(i, (i+1)%nf) = 0.5; - a(i,i) = 0.5; + myEmbedder = [ & ]( Face f, Vertex v ) + { + (void)f; + return mySurfaceMesh->position( v ); + }; + init(); + }; + + /// Create a Polygonal DEC structure from a surface mesh (@a surf) + /// and an embedder for the vertex position: function with two parameters, a + /// face and a vertex which outputs the embedding in R^3 of the vertex + /// w.r.t. to the face. and an embedder for the vertex normal: function with + /// a vertex as parameter which outputs the embedding in R^3 of the vertex + /// normal. + /// @param surf an instance of SurfaceMesh + /// @param pos_embedder an embedder for the position + /// @param normal_embedder an embedder for the position + /// @param globalInternalCacheEnabled + PolygonalCalculus( + const ConstAlias surf, + const std::function & pos_embedder, + const std::function & normal_embedder, + bool globalInternalCacheEnabled = false ) + : mySurfaceMesh( &surf ) + , myEmbedder( pos_embedder ) + , myVertexNormalEmbedder( normal_embedder ) + , myGlobalCacheEnabled( globalInternalCacheEnabled ) + { + init(); + }; + + /** + * Deleted default constructor. + */ + PolygonalCalculus() = delete; + + /** + * Destructor (default). + */ + ~PolygonalCalculus() = default; + + /** + * Deleted copy constructor. + * @param other the object to clone. + */ + PolygonalCalculus( const PolygonalCalculus & other ) = delete; + + /** + * Deleted move constructor. + * @param other the object to move. + */ + PolygonalCalculus( PolygonalCalculus && other ) = delete; + + /** + * Deleted copy assignment operator. + * @param other the object to copy. + * @return a reference on 'this'. + */ + PolygonalCalculus & operator=( const PolygonalCalculus & other ) = delete; + + /** + * Deleted move assignment operator. + * @param other the object to move. + * @return a reference on 'this'. + */ + PolygonalCalculus & operator=( PolygonalCalculus && other ) = delete; + + /// @} + + // ----------------------- embedding services -------------------------- + // MARK: Embedding services + /// @name Embedding services + /// @{ + + /// Update the embedding function. + /// @param externalFunctor a new embedding functor (Face,Vertex)->RealPoint. + void setEmbedder( + const std::function & externalFunctor ) + { + myEmbedder = externalFunctor; } + /// @} - setInCache(A_,f,a); - return a; - } - - - /// Polygonal (corrected) vector area. - /// @param f the face - /// @return a vector oriented in the (corrected) normal direction and with length equal to the (corrected) area of the face \a f. - Vector vectorArea(const Face f) const - { - Real3dPoint af(0.0,0.0,0.0); - const auto vertices = mySurfaceMesh->incidentVertices(f); - auto it = vertices.cbegin(); - auto itnext = vertices.cbegin(); - ++itnext; - while (it != vertices.cend()) - { - auto xi = myEmbedder(f,*it); - auto xip = myEmbedder(f,*itnext); - af += xi.crossProduct(xip); - ++it; + // ----------------------- Per face operators + // -------------------------------------- + // MARK: Per face operator on scalars + /// @name Per face operators on scalars + /// @{ + + /// Return the vertex position matrix degree x 3 of the face. + /// @param f a face + /// @return the n_f x 3 position matrix + DenseMatrix X( const Face f ) const + { + if ( checkCache( X_, f ) ) + return myGlobalCache[ X_ ][ f ]; + + const auto vertices = mySurfaceMesh->incidentVertices( f ); + const auto nf = myFaceDegree[ f ]; + DenseMatrix Xt( nf, 3 ); + size_t cpt = 0; + for ( auto v : vertices ) + { + Xt( cpt, 0 ) = myEmbedder( f, v )[ 0 ]; + Xt( cpt, 1 ) = myEmbedder( f, v )[ 1 ]; + Xt( cpt, 2 ) = myEmbedder( f, v )[ 2 ]; + ++cpt; + } + + setInCache( X_, f, Xt ); + return Xt; + } + + /// Derivative operator (d_0) of a face. + /// @param f the face + /// @return a degree x degree matrix + DenseMatrix D( const Face f ) const + { + if ( checkCache( D_, f ) ) + return myGlobalCache[ D_ ][ f ]; + + const auto nf = myFaceDegree[ f ]; + DenseMatrix d = DenseMatrix::Zero( nf, nf ); + for ( auto i = 0u; i < nf; ++i ) + { + d( i, i ) = -1.; + d( i, ( i + 1 ) % nf ) = 1.; + } + + setInCache( D_, f, d ); + return d; + } + + /// Edge vector operator per face. + /// @param f the face + /// @return degree x 3 matrix + DenseMatrix E( const Face f ) const + { + if ( checkCache( E_, f ) ) + return myGlobalCache[ E_ ][ f ]; + + DenseMatrix op = D( f ) * X( f ); + + setInCache( E_, f, op ); + return op; + } + + /// Average operator to average, per edge, its vertex values. + /// @param f the face + /// @return a degree x degree matrix + DenseMatrix A( const Face f ) const + { + if ( checkCache( A_, f ) ) + return myGlobalCache[ A_ ][ f ]; + + const auto nf = myFaceDegree[ f ]; + DenseMatrix a = DenseMatrix::Zero( nf, nf ); + for ( auto i = 0u; i < nf; ++i ) + { + a( i, ( i + 1 ) % nf ) = 0.5; + a( i, i ) = 0.5; + } + + setInCache( A_, f, a ); + return a; + } + + /// Polygonal (corrected) vector area. + /// @param f the face + /// @return a vector oriented in the (corrected) normal direction and with + /// length equal to the (corrected) area of the face \a f. + Vector vectorArea( const Face f ) const + { + Real3dPoint af( 0.0, 0.0, 0.0 ); + const auto vertices = mySurfaceMesh->incidentVertices( f ); + auto it = vertices.cbegin(); + auto itnext = vertices.cbegin(); ++itnext; - if (itnext == vertices.cend()) - itnext = vertices.cbegin(); + while ( it != vertices.cend() ) + { + auto xi = myEmbedder( f, *it ); + auto xip = myEmbedder( f, *itnext ); + af += xi.crossProduct( xip ); + ++it; + ++itnext; + if ( itnext == vertices.cend() ) + itnext = vertices.cbegin(); + } + Eigen::Vector3d output = { af[ 0 ], af[ 1 ], af[ 2 ] }; + return 0.5 * output; } - Eigen::Vector3d output = {af[0],af[1],af[2]}; - return 0.5*output; - } - - /// Area of a face from the vector area. - /// @param f the face - /// @return the corrected area of the face - double faceArea(const Face f) const - { - return vectorArea(f).norm(); - } - - /// Corrected normal vector of a face. - /// @param f the face - /// @return a vector (Eigen vector) - Vector faceNormal(const Face f) const - { - Vector v = vectorArea(f); - v.normalize(); - return v; - } - - /// Corrected normal vector of a face. - /// @param f the face - /// @return a vector (DGtal RealVector/RealPoint) - Real3dVector faceNormalAsDGtalVector(const Face f) const - { - Vector v = faceNormal(f); - return {v(0),v(1),v(2)}; - } - - /// co-Gradient operator of the face - /// @param f the face - /// @return a 3 x degree matrix - DenseMatrix coGradient(const Face f) const - { - if (checkCache(COGRAD_,f)) - return myGlobalCache[COGRAD_][f]; - DenseMatrix op = E(f).transpose() * A(f); - setInCache(COGRAD_, f, op); - return op; - } - - ///Return [n] as the 3x3 operator such that [n]q = n x q - ///@param n a vector - DenseMatrix bracket(const Vector &n) const - { - DenseMatrix brack(3,3); - brack << 0.0 , -n(2), n(1), - n(2), 0.0 , -n(0), - -n(1) , n(0),0.0 ; - return brack; - } - - /// Gradient operator of the face. - /// @param f the face - /// @return 3 x degree matrix - DenseMatrix gradient(const Face f) const - { - if (checkCache(GRAD_,f)) - return myGlobalCache[GRAD_][f]; - - DenseMatrix op = -1.0/faceArea(f) * bracket( faceNormal(f) ) * coGradient(f); - - setInCache(GRAD_,f,op); - return op; - } - - /// Flat operator for the face. - /// @param f the face - /// @return a degree x 3 matrix - DenseMatrix flat(const Face f) const - { - if (checkCache(FLAT_,f)) - return myGlobalCache[FLAT_][f]; - DenseMatrix n = faceNormal(f); - DenseMatrix op = E(f)*( DenseMatrix::Identity(3,3) - n*n.transpose()); - setInCache(FLAT_,f,op); - return op; - } - - /// Edge mid-point operator of the face. - /// @param f the face - /// @return a degree x 3 matrix - DenseMatrix B(const Face f) const - { - if (checkCache(B_,f)) - return myGlobalCache[B_][f]; - DenseMatrix res = A(f) * X(f); - setInCache(B_,f,res); - return res; - } - - /// @returns the centroid of the face - /// @param f the face - Vector centroid(const Face f) const - { - const auto nf = myFaceDegree[f]; - return 1.0/(double)nf * X(f).transpose() * Vector::Ones(nf); - } - - /// @returns the centroid of the face as a DGtal RealPoint - /// @param f the face - Real3dPoint centroidAsDGtalPoint(const Face f) const - { - const Vector c = centroid(f); - return {c(0),c(1),c(2)}; - } - - /// Sharp operator for the face. - /// @param f the face - /// @return a 3 x degree matrix - DenseMatrix sharp(const Face f) const - { - if (checkCache(SHARP_,f)) - return myGlobalCache[SHARP_][f]; - const auto nf = myFaceDegree[f]; - DenseMatrix op = 1.0/faceArea(f) * bracket(faceNormal(f)) * - ( B(f).transpose() - centroid(f)* Vector::Ones(nf).transpose() ); + /// Area of a face from the vector area. + /// @param f the face + /// @return the corrected area of the face + double faceArea( const Face f ) const + { + return vectorArea( f ).norm(); + } - setInCache(SHARP_,f,op); - return op; - } - - /// Projection operator for the face. - /// @param f the face - /// @return a degree x degree matrix - DenseMatrix P(const Face f) const - { - if (checkCache(P_,f)) - return myGlobalCache[P_][f]; - - const auto nf = myFaceDegree[f]; - DenseMatrix op = DenseMatrix::Identity(nf,nf) - flat(f)*sharp(f); - - setInCache(P_, f, op); - return op; - } - - /// Inner product on 1-forms associated with the face - /// @param f the face - /// @param lambda the regularization parameter - /// @return a degree x degree matrix - DenseMatrix M(const Face f, const double lambda=1.0) const - { - if (checkCache(M_,f)) - return myGlobalCache[M_][f]; - - DenseMatrix Uf = sharp(f); - DenseMatrix Pf = P(f); - DenseMatrix op = faceArea(f) * Uf.transpose()*Uf + lambda * Pf.transpose()*Pf; - - setInCache(M_,f,op); - return op; - } - - /// Divergence operator of a one-form. - /// @param f the face - /// @return a degree x degree matrix - /// - /// @note The sign convention for the divergence and the Laplacian - /// operator is opposite to the one of @cite degoes2020discrete . - /// This is to match the usual mathematical - /// convention that the Laplacian (and the Laplacian-Beltrami) has - /// negative eigenvalues (and is the sum of second derivatives in - /// the cartesian grid). It also follows the formal adjointness of - /// exterior derivative and opposite of divergence as relation \f$ - /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v - /// \rangle \f$. See also - /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator - DenseMatrix divergence(const Face f) const - { - if (checkCache(DIVERGENCE_,f)) - return myGlobalCache[DIVERGENCE_][f]; - - DenseMatrix op = -1.0 * D(f).transpose() * M(f); - setInCache(DIVERGENCE_,f,op); - - return op; - } - - /// Curl operator of a one-form (identity matrix). - /// @param f the face - /// @return a degree x degree matrix - DenseMatrix curl(const Face f) const - { - if (checkCache(CURL_,f)) - return myGlobalCache[CURL_][f]; - - DenseMatrix op = DenseMatrix::Identity(myFaceDegree[f],myFaceDegree[f]); + /// Corrected normal vector of a face. + /// @param f the face + /// @return a vector (Eigen vector) + Vector faceNormal( const Face f ) const + { + Vector v = vectorArea( f ); + v.normalize(); + return v; + } - setInCache(CURL_,f,op); - return op; - } - - - /// (weak) Laplace-Beltrami operator for the face. - /// @param f the face - /// @param lambda the regularization parameter - /// @return a degree x degree matrix - /// - /// @note The sign convention for the divergence and the Laplacian - /// operator is opposite to the one of @cite degoes2020discrete . - /// This is to match the usual mathematical - /// convention that the Laplacian (and the Laplacian-Beltrami) has - /// negative eigenvalues (and is the sum of second derivatives in - /// the cartesian grid). It also follows the formal adjointness of - /// exterior derivative and opposite of divergence as relation \f$ - /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v - /// \rangle \f$. See also https://en.wikipedia.org/wiki/Laplace–Beltrami_operator - DenseMatrix laplaceBeltrami(const Face f, const double lambda=1.0) const - { - if (checkCache(L_,f)) - return myGlobalCache[L_][f]; - - DenseMatrix Df = D(f); - // Laplacian is a negative operator. - DenseMatrix op = -1.0 * Df.transpose() * M(f,lambda) * Df; - - setInCache(L_, f, op); - return op; - } - ///@} - - // ----------------------- Vector calculus---------------------------------- - //MARK: Vector Field Calculus - ///@name Per face operators on vector fields - ///@{ - -public: - ///@return 3x2 matrix defining the tangent space at vertex v, with basis - ///vectors in columns - DenseMatrix Tv(const Vertex & v) const - { - Eigen::Vector3d nv = n_v(v); - ASSERT(std::abs(nv.norm() - 1.0) < 0.001); - const auto & N = getSurfaceMeshPtr()->neighborVertices(v); - auto neighbor = *N.begin(); - Real3dPoint tangentVector = getSurfaceMeshPtr()->position(v) - - getSurfaceMeshPtr()->position(neighbor); - Eigen::Vector3d w = toVec3(tangentVector); - Eigen::Vector3d uu = project(w,nv).normalized(); - Eigen::Vector3d vv = nv.cross(uu); - - DenseMatrix tanB(3,2); - tanB.col(0) = uu; - tanB.col(1) = vv; - return tanB; - } + /// Corrected normal vector of a face. + /// @param f the face + /// @return a vector (DGtal RealVector/RealPoint) + Real3dVector faceNormalAsDGtalVector( const Face f ) const + { + Vector v = faceNormal( f ); + return { v( 0 ), v( 1 ), v( 2 ) }; + } - ///@return 3x2 matrix defining the tangent space at face f, with basis - ///vectors in columns - DenseMatrix Tf(const Face & f) const - { - Eigen::Vector3d nf = faceNormal(f); - ASSERT(std::abs(nf.norm() - 1.0) < 0.001); - const auto & N = getSurfaceMeshPtr()->incidentVertices(f); - auto v1 = *(N.begin()); - auto v2 = *(N.begin() + 1); - Real3dPoint tangentVector = - getSurfaceMeshPtr()->position(v2) - getSurfaceMeshPtr()->position(v1); - Eigen::Vector3d w = toVec3(tangentVector); - Eigen::Vector3d uu = project(w,nf).normalized(); - Eigen::Vector3d vv = nf.cross(uu); - - DenseMatrix tanB(3,2); - tanB.col(0) = uu; - tanB.col(1) = vv; - return tanB; - } + /// co-Gradient operator of the face + /// @param f the face + /// @return a 3 x degree matrix + DenseMatrix coGradient( const Face f ) const + { + if ( checkCache( COGRAD_, f ) ) + return myGlobalCache[ COGRAD_ ][ f ]; + DenseMatrix op = E( f ).transpose() * A( f ); + setInCache( COGRAD_, f, op ); + return op; + } - /// \brief toExtrinsicVector - /// \param v the vertex - /// \param I the intrinsic vector at Tv - /// \return 3D extrinsic vector from intrinsic 2D vector I expressed from - /// tangent frame at vertex v - Vector toExtrinsicVector(const Vertex v, const Vector & I) const - { - DenseMatrix T = Tv(v); - return T.col(0) * I(0) + T.col(1) * I(1); - } + /// Return [n] as the 3x3 operator such that [n]q = n x q + ///@param n a vector + DenseMatrix bracket( const Vector & n ) const + { + DenseMatrix brack( 3, 3 ); + brack << 0.0, -n( 2 ), n( 1 ), n( 2 ), 0.0, -n( 0 ), -n( 1 ), n( 0 ), 0.0; + return brack; + } - /// \param I set of intrinsic vectors, vectors indices must be the same as - /// their associated vertex - ///@return converts a set of intrinsic vectors to their extrinsic - ///equivalent, expressed in correponding tangent frame - std::vector toExtrinsicVectors(const std::vector & I) const - { - std::vector ext(mySurfaceMesh->nbVertices()); - for (auto v = 0; v < mySurfaceMesh->nbVertices(); v++) - ext[v] = toExtrinsicVector(v,I[v]); - return ext; - } + /// Gradient operator of the face. + /// @param f the face + /// @return 3 x degree matrix + DenseMatrix gradient( const Face f ) const + { + if ( checkCache( GRAD_, f ) ) + return myGlobalCache[ GRAD_ ][ f ]; - /// https://math.stackexchange.com/questions/180418/calculate-rotation-matrix-to-align-vector-a-to-vector-b-in-3d - ///@return 3x3 Rotation matrix to align n_v to n_f - DenseMatrix Qvf(const Vertex & v, const Face & f) const - { - Eigen::Vector3d nf = faceNormal(f); - Eigen::Vector3d nv = n_v(v); - double c = nv.dot(nf); - ASSERT(std::abs( c + 1.0) > 0.0001); - //Special case for opposite nv and nf vectors. - if (std::abs( c + 1.0) < 0.00001) - return -Eigen::Matrix3d::Identity(); - - auto vv = nv.cross(nf); - DenseMatrix skew = bracket(vv); - return Eigen::Matrix3d::Identity() + skew + - 1.0 / (1.0 + c) * skew * skew; - } + DenseMatrix op = + -1.0 / faceArea( f ) * bracket( faceNormal( f ) ) * coGradient( f ); - ///@return Levi-Civita connection from vertex v tangent space to face f - ///tangent space (2x2 rotation matrix) - DenseMatrix Rvf(const Vertex & v, const Face & f) const - { - return Tf(f).transpose() * Qvf(v,f) * Tv(v); - } + setInCache( GRAD_, f, op ); + return op; + } - /// Shape operator on the face @a f (2x2 operator). - ///@return the shape operator at face f - DenseMatrix shapeOperator(const Face f) const - { - DenseMatrix N(myFaceDegree[f],3); - uint cpt = 0; - for (Vertex v : mySurfaceMesh->incidentVertices(f)) + /// Flat operator for the face. + /// @param f the face + /// @return a degree x 3 matrix + DenseMatrix flat( const Face f ) const { - N.block(cpt,0,3,1) = n_v(v).transpose(); - cpt++; + if ( checkCache( FLAT_, f ) ) + return myGlobalCache[ FLAT_ ][ f ]; + DenseMatrix n = faceNormal( f ); + DenseMatrix op = + E( f ) * ( DenseMatrix::Identity( 3, 3 ) - n * n.transpose() ); + setInCache( FLAT_, f, op ); + return op; } - DenseMatrix GN = gradient(f) * N, Tf = T_f(f); - return 0.5 * Tf.transpose() * (GN + GN.transpose()) * Tf; - } + /// Edge mid-point operator of the face. + /// @param f the face + /// @return a degree x 3 matrix + DenseMatrix B( const Face f ) const + { + if ( checkCache( B_, f ) ) + return myGlobalCache[ B_ ][ f ]; + DenseMatrix res = A( f ) * X( f ); + setInCache( B_, f, res ); + return res; + } - /// @return to fit @cite degoes2020discrete paper's notations, - /// this function maps all the per vertex vectors (expressed in the (2*nf) - /// vector form) into the nfx2 matrix with transported vectors (to face f) in - /// each row. - /// @note Unlike the rest of the per face operators, the - /// covariant operators need to be applied directly to the restriction of - /// the vector field to the face, - DenseMatrix transportAndFormatVectorField(const Face f, const Vector & uf) - { - DenseMatrix uf_nabla(myFaceDegree[f], 2); - size_t cpt = 0; - for (auto v : mySurfaceMesh->incidentVertices(f)) + /// @returns the centroid of the face + /// @param f the face + Vector centroid( const Face f ) const { - uf_nabla.block(cpt,0,1,2) = - (Rvf(v,f) * uf.block(2 * cpt,0,2,1)).transpose(); - ++cpt; + const auto nf = myFaceDegree[ f ]; + return 1.0 / (double)nf * X( f ).transpose() * Vector::Ones( nf ); } - return uf_nabla; - } - /// Covarient gradient at a face a @a f of intrinsic vectors @a uf. - /// @param uf list of all intrinsic vectors per vertex concatenated in a - /// column vector - /// @param f the face - /// @return the covariant gradient of the given vector field uf (expressed - /// in corresponding vertex tangent frames), wrt face f - /// @note Unlike the rest of the per face operators, the - /// covariant operators need to be applied directly to the restriction of - /// the vector field to the face, - DenseMatrix covariantGradient(const Face f, const Vector & uf) - { - return Tf(f).transpose() * gradient(f) * - transportAndFormatVectorField(f,uf); - } + /// @returns the centroid of the face as a DGtal RealPoint + /// @param f the face + Real3dPoint centroidAsDGtalPoint( const Face f ) const + { + const Vector c = centroid( f ); + return { c( 0 ), c( 1 ), c( 2 ) }; + } - /// Compute the covariance projection at a face @a f of intrinsic vectors @a uf. - /// @param uf list of all intrinsic vectors per vertex concatenated in a - /// column vector - /// @param f the face - /// @return the covariant projection of the given vector field uf ( - /// restricted to face f and expressed in corresponding vertex tangent - /// frames) - /// @note Unlike the rest of the per face operators, the - /// covariant operators need to be applied directly to the restriction of - /// the vector field to the face - DenseMatrix covariantProjection(const Face f, const Vector & uf) - { - return P(f) * D(f) * transportAndFormatVectorField(f,uf); - } - - /// @return Covariant Gradient Operator, returns the operator that acts on - /// the concatenated vectors. When applied, gives the associated 2x2 matrix - /// in the isomorphic vector form (a b c d)^t to be used in the dirichlet - /// energy (vector laplacian) G∇_f. - /// Used to define the connection Laplacian. - DenseMatrix covariantGradient_f(const Face & f) const - { - return kroneckerWithI2(Tf(f).transpose() * gradient(f)) * blockConnection(f); - } - - /// @return Projection Gradient Operator, returns the operator that acts on - /// the concatenated vectors. When applied, gives the associated nfx2 matrix - /// in the isomorphic vector form (a b c d ...)^t to be used in the - /// dirichlet energy (vector laplacian) P∇_f. - /// Used to define the connection Laplacian. - DenseMatrix covariantProjection_f(const Face & f) const - { - return kroneckerWithI2(P(f) * D(f)) * blockConnection(f); - ; - } - - /// L∇ := -(afG∇tG∇+λP∇tP∇) - /// @return Connection/Vector laplacian at face f - /// @note The sign convention for the divergence and the Laplacian - /// operator is opposite to the one of @cite degoes2020discrete. - /// This is to match the usual mathematical - /// convention that the laplacian (and the Laplacian-Beltrami) has - /// negative eigenvalues (and is the sum of second derivatives in - /// the cartesian grid). It also follows the formal adjointness of - /// exterior derivative and opposite of divergence as relation \f$ - /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v - /// \rangle \f$. See also - /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator - DenseMatrix connectionLaplacian(const Face & f, double lambda = 1.0) const - { - if (checkCache(CON_L_,f)) - return myGlobalCache[CON_L_][f]; - DenseMatrix G = covariantGradient_f(f); - DenseMatrix P = covariantProjection_f(f); - DenseMatrix L = -(faceArea(f) * G.transpose() * G + lambda * P.transpose() * P); - setInCache(CON_L_,f,L); - return L; - } - /// @} - - // ----------------------- Global operators -------------------------------------- - //MARK: Global Operators - /// @name Global operators - /// @{ - - /// @return a 0-form initialized to zero - Form form0() const - { - return Form::Zero( nbVertices() ); - } - /// @return the identity linear operator for 0-forms - SparseMatrix identity0() const - { - SparseMatrix Id0( nbVertices(), nbVertices() ); - Id0.setIdentity(); - return Id0; - } - - /// Computes the global Laplace-Beltrami operator by assembling the - /// per face operators. - /// - /// @param lambda the regularization parameter for the local Laplace-Beltrami operators - /// @return a sparse nbVertices x nbVertices matrix - /// - /// @note The sign convention for the divergence is opposite to the - /// one of @cite degoes2020discrete. This is also true for the - /// Laplacian operator. This is to match the usual mathematical - /// convention that the Laplacian (and the Laplacian-Beltrami) has - /// negative eigenvalues (and is the sum of second derivatives in - /// the cartesian grid). It also follows the formal adjointness of - /// exterior derivative and opposite of divergence as relation \f$ - /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v - /// \rangle \f$. See also https://en.wikipedia.org/wiki/Laplace–Beltrami_operator - SparseMatrix globalLaplaceBeltrami(const double lambda=1.0) const - { - SparseMatrix lapGlobal(mySurfaceMesh->nbVertices(), mySurfaceMesh->nbVertices()); - std::vector triplets; - for( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); ++f ) - { - auto nf = myFaceDegree[f]; - DenseMatrix Lap = this->laplaceBeltrami(f,lambda); - const auto vertices = mySurfaceMesh->incidentVertices(f); - for(auto i=0u; i < nf; ++i) - for(auto j=0u; j < nf; ++j) - { - auto v = Lap(i,j); - if (v!= 0.0) - triplets.emplace_back( Triplet( (SparseMatrix::StorageIndex)vertices[ i ], (SparseMatrix::StorageIndex)vertices[ j ], - Lap( i, j ) ) ); - } + /// Sharp operator for the face. + /// @param f the face + /// @return a 3 x degree matrix + DenseMatrix sharp( const Face f ) const + { + if ( checkCache( SHARP_, f ) ) + return myGlobalCache[ SHARP_ ][ f ]; + + const auto nf = myFaceDegree[ f ]; + DenseMatrix op = + 1.0 / faceArea( f ) * bracket( faceNormal( f ) ) * + ( B( f ).transpose() - centroid( f ) * Vector::Ones( nf ).transpose() ); + + setInCache( SHARP_, f, op ); + return op; } - lapGlobal.setFromTriplets(triplets.begin(), triplets.end()); - return lapGlobal; - } - - /// Compute and returns the global lumped mass matrix - /// (diagonal matrix with Max's weights for each vertex). - /// M(i,i) = ∑_{adjface f} faceArea(f)/degree(f) ; - /// - /// @return the global lumped mass matrix. - SparseMatrix globalLumpedMassMatrix() const - { - SparseMatrix M(mySurfaceMesh->nbVertices(), mySurfaceMesh->nbVertices()); - std::vector triplets; - for ( typename MySurfaceMesh::Index v = 0; v < mySurfaceMesh->nbVertices(); ++v ) + + /// Projection operator for the face. + /// @param f the face + /// @return a degree x degree matrix + DenseMatrix P( const Face f ) const + { + if ( checkCache( P_, f ) ) + return myGlobalCache[ P_ ][ f ]; + + const auto nf = myFaceDegree[ f ]; + DenseMatrix op = DenseMatrix::Identity( nf, nf ) - flat( f ) * sharp( f ); + + setInCache( P_, f, op ); + return op; + } + + /// Inner product on 1-forms associated with the face + /// @param f the face + /// @param lambda the regularization parameter + /// @return a degree x degree matrix + DenseMatrix M( const Face f, const double lambda = 1.0 ) const + { + if ( checkCache( M_, f ) ) + return myGlobalCache[ M_ ][ f ]; + + DenseMatrix Uf = sharp( f ); + DenseMatrix Pf = P( f ); + DenseMatrix op = + faceArea( f ) * Uf.transpose() * Uf + lambda * Pf.transpose() * Pf; + + setInCache( M_, f, op ); + return op; + } + + /// Divergence operator of a one-form. + /// @param f the face + /// @return a degree x degree matrix + /// + /// @note The sign convention for the divergence and the Laplacian + /// operator is opposite to the one of @cite degoes2020discrete . + /// This is to match the usual mathematical + /// convention that the Laplacian (and the Laplacian-Beltrami) has + /// negative eigenvalues (and is the sum of second derivatives in + /// the cartesian grid). It also follows the formal adjointness of + /// exterior derivative and opposite of divergence as relation \f$ + /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v + /// \rangle \f$. See also + /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator + DenseMatrix divergence( const Face f ) const + { + if ( checkCache( DIVERGENCE_, f ) ) + return myGlobalCache[ DIVERGENCE_ ][ f ]; + + DenseMatrix op = -1.0 * D( f ).transpose() * M( f ); + setInCache( DIVERGENCE_, f, op ); + + return op; + } + + /// Curl operator of a one-form (identity matrix). + /// @param f the face + /// @return a degree x degree matrix + DenseMatrix curl( const Face f ) const + { + if ( checkCache( CURL_, f ) ) + return myGlobalCache[ CURL_ ][ f ]; + + DenseMatrix op = + DenseMatrix::Identity( myFaceDegree[ f ], myFaceDegree[ f ] ); + + setInCache( CURL_, f, op ); + return op; + } + + /// (weak) Laplace-Beltrami operator for the face. + /// @param f the face + /// @param lambda the regularization parameter + /// @return a degree x degree matrix + /// + /// @note The sign convention for the divergence and the Laplacian + /// operator is opposite to the one of @cite degoes2020discrete . + /// This is to match the usual mathematical + /// convention that the Laplacian (and the Laplacian-Beltrami) has + /// negative eigenvalues (and is the sum of second derivatives in + /// the cartesian grid). It also follows the formal adjointness of + /// exterior derivative and opposite of divergence as relation \f$ + /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v + /// \rangle \f$. See also + /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator + DenseMatrix laplaceBeltrami( const Face f, const double lambda = 1.0 ) const + { + if ( checkCache( L_, f ) ) + return myGlobalCache[ L_ ][ f ]; + + DenseMatrix Df = D( f ); + // Laplacian is a negative operator. + DenseMatrix op = -1.0 * Df.transpose() * M( f, lambda ) * Df; + + setInCache( L_, f, op ); + return op; + } + ///@} + + // ----------------------- Vector calculus---------------------------------- + // MARK: Vector Field Calculus + ///@name Per face operators on vector fields + ///@{ + + public: + ///@return 3x2 matrix defining the tangent space at vertex v, with basis + /// vectors in columns + DenseMatrix Tv( const Vertex & v ) const + { + Eigen::Vector3d nv = n_v( v ); + ASSERT( std::abs( nv.norm() - 1.0 ) < 0.001 ); + const auto & N = getSurfaceMeshPtr()->neighborVertices( v ); + auto neighbor = *N.begin(); + Real3dPoint tangentVector = getSurfaceMeshPtr()->position( v ) - + getSurfaceMeshPtr()->position( neighbor ); + Eigen::Vector3d w = toVec3( tangentVector ); + Eigen::Vector3d uu = project( w, nv ).normalized(); + Eigen::Vector3d vv = nv.cross( uu ); + + DenseMatrix tanB( 3, 2 ); + tanB.col( 0 ) = uu; + tanB.col( 1 ) = vv; + return tanB; + } + + ///@return 3x2 matrix defining the tangent space at face f, with basis + /// vectors in columns + DenseMatrix Tf( const Face & f ) const + { + Eigen::Vector3d nf = faceNormal( f ); + ASSERT( std::abs( nf.norm() - 1.0 ) < 0.001 ); + const auto & N = getSurfaceMeshPtr()->incidentVertices( f ); + auto v1 = *( N.begin() ); + auto v2 = *( N.begin() + 1 ); + Real3dPoint tangentVector = + getSurfaceMeshPtr()->position( v2 ) - getSurfaceMeshPtr()->position( v1 ); + Eigen::Vector3d w = toVec3( tangentVector ); + Eigen::Vector3d uu = project( w, nf ).normalized(); + Eigen::Vector3d vv = nf.cross( uu ); + + DenseMatrix tanB( 3, 2 ); + tanB.col( 0 ) = uu; + tanB.col( 1 ) = vv; + return tanB; + } + + /// \brief toExtrinsicVector + /// \param v the vertex + /// \param I the intrinsic vector at Tv + /// \return 3D extrinsic vector from intrinsic 2D vector I expressed from + /// tangent frame at vertex v + Vector toExtrinsicVector( const Vertex v, const Vector & I ) const + { + DenseMatrix T = Tv( v ); + return T.col( 0 ) * I( 0 ) + T.col( 1 ) * I( 1 ); + } + + /// \param I set of intrinsic vectors, vectors indices must be the same as + /// their associated vertex + ///@return converts a set of intrinsic vectors to their extrinsic + /// equivalent, expressed in correponding tangent frame + std::vector + toExtrinsicVectors( const std::vector & I ) const + { + std::vector ext( mySurfaceMesh->nbVertices() ); + for ( auto v = 0; v < mySurfaceMesh->nbVertices(); v++ ) + ext[ v ] = toExtrinsicVector( v, I[ v ] ); + return ext; + } + + /// https://math.stackexchange.com/questions/180418/calculate-rotation-matrix-to-align-vector-a-to-vector-b-in-3d + ///@return 3x3 Rotation matrix to align n_v to n_f + DenseMatrix Qvf( const Vertex & v, const Face & f ) const + { + Eigen::Vector3d nf = faceNormal( f ); + Eigen::Vector3d nv = n_v( v ); + double c = nv.dot( nf ); + ASSERT( std::abs( c + 1.0 ) > 0.0001 ); + // Special case for opposite nv and nf vectors. + if ( std::abs( c + 1.0 ) < 0.00001 ) + return -Eigen::Matrix3d::Identity(); + + auto vv = nv.cross( nf ); + DenseMatrix skew = bracket( vv ); + return Eigen::Matrix3d::Identity() + skew + + 1.0 / ( 1.0 + c ) * skew * skew; + } + + ///@return Levi-Civita connection from vertex v tangent space to face f + /// tangent space (2x2 rotation matrix) + DenseMatrix Rvf( const Vertex & v, const Face & f ) const + { + return Tf( f ).transpose() * Qvf( v, f ) * Tv( v ); + } + + /// Shape operator on the face @a f (2x2 operator). + ///@return the shape operator at face f + DenseMatrix shapeOperator( const Face f ) const + { + DenseMatrix N( myFaceDegree[ f ], 3 ); + uint cpt = 0; + for ( Vertex v : mySurfaceMesh->incidentVertices( f ) ) + { + N.block( cpt, 0, 3, 1 ) = n_v( v ).transpose(); + cpt++; + } + DenseMatrix GN = gradient( f ) * N, Tf = T_f( f ); + + return 0.5 * Tf.transpose() * ( GN + GN.transpose() ) * Tf; + } + + /// @return to fit @cite degoes2020discrete paper's notations, + /// this function maps all the per vertex vectors (expressed in the (2*nf) + /// vector form) into the nfx2 matrix with transported vectors (to face f) + /// in each row. + /// @note Unlike the rest of the per face operators, the + /// covariant operators need to be applied directly to the restriction of + /// the vector field to the face, + DenseMatrix transportAndFormatVectorField( const Face f, const Vector & uf ) + { + DenseMatrix uf_nabla( myFaceDegree[ f ], 2 ); + size_t cpt = 0; + for ( auto v : mySurfaceMesh->incidentVertices( f ) ) { - auto faces = mySurfaceMesh->incidentFaces(v); + uf_nabla.block( cpt, 0, 1, 2 ) = + ( Rvf( v, f ) * uf.block( 2 * cpt, 0, 2, 1 ) ).transpose(); + ++cpt; + } + return uf_nabla; + } + + /// Covarient gradient at a face a @a f of intrinsic vectors @a uf. + /// @param uf list of all intrinsic vectors per vertex concatenated in a + /// column vector + /// @param f the face + /// @return the covariant gradient of the given vector field uf (expressed + /// in corresponding vertex tangent frames), wrt face f + /// @note Unlike the rest of the per face operators, the + /// covariant operators need to be applied directly to the restriction of + /// the vector field to the face, + DenseMatrix covariantGradient( const Face f, const Vector & uf ) + { + return Tf( f ).transpose() * gradient( f ) * + transportAndFormatVectorField( f, uf ); + } + + /// Compute the covariance projection at a face @a f of intrinsic vectors @a + /// uf. + /// @param uf list of all intrinsic vectors per vertex concatenated in a + /// column vector + /// @param f the face + /// @return the covariant projection of the given vector field uf ( + /// restricted to face f and expressed in corresponding vertex tangent + /// frames) + /// @note Unlike the rest of the per face operators, the + /// covariant operators need to be applied directly to the restriction of + /// the vector field to the face + DenseMatrix covariantProjection( const Face f, const Vector & uf ) + { + return P( f ) * D( f ) * transportAndFormatVectorField( f, uf ); + } + + /// @return Covariant Gradient Operator, returns the operator that acts on + /// the concatenated vectors. When applied, gives the associated 2x2 matrix + /// in the isomorphic vector form (a b c d)^t to be used in the dirichlet + /// energy (vector laplacian) G∇_f. + /// Used to define the connection Laplacian. + DenseMatrix covariantGradient_f( const Face & f ) const + { + return kroneckerWithI2( Tf( f ).transpose() * gradient( f ) ) * + blockConnection( f ); + } + + /// @return Projection Gradient Operator, returns the operator that acts on + /// the concatenated vectors. When applied, gives the associated nfx2 matrix + /// in the isomorphic vector form (a b c d ...)^t to be used in the + /// dirichlet energy (vector laplacian) P∇_f. + /// Used to define the connection Laplacian. + DenseMatrix covariantProjection_f( const Face & f ) const + { + return kroneckerWithI2( P( f ) * D( f ) ) * blockConnection( f ); + ; + } + + /// L∇ := -(afG∇tG∇+λP∇tP∇) + /// @return Connection/Vector laplacian at face f + /// @note The sign convention for the divergence and the Laplacian + /// operator is opposite to the one of @cite degoes2020discrete. + /// This is to match the usual mathematical + /// convention that the laplacian (and the Laplacian-Beltrami) has + /// negative eigenvalues (and is the sum of second derivatives in + /// the cartesian grid). It also follows the formal adjointness of + /// exterior derivative and opposite of divergence as relation \f$ + /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v + /// \rangle \f$. See also + /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator + DenseMatrix connectionLaplacian( const Face & f, double lambda = 1.0 ) const + { + if ( checkCache( CON_L_, f ) ) + return myGlobalCache[ CON_L_ ][ f ]; + DenseMatrix G = covariantGradient_f( f ); + DenseMatrix P = covariantProjection_f( f ); + DenseMatrix L = + -( faceArea( f ) * G.transpose() * G + lambda * P.transpose() * P ); + setInCache( CON_L_, f, L ); + return L; + } + /// @} + + // ----------------------- Global operators + // -------------------------------------- + // MARK: Global Operators + /// @name Global operators + /// @{ + + /// @return a 0-form initialized to zero + Form form0() const + { + return Form::Zero( nbVertices() ); + } + /// @return the identity linear operator for 0-forms + SparseMatrix identity0() const + { + SparseMatrix Id0( nbVertices(), nbVertices() ); + Id0.setIdentity(); + return Id0; + } + + /// Computes the global Laplace-Beltrami operator by assembling the + /// per face operators. + /// + /// @param lambda the regularization parameter for the local + /// Laplace-Beltrami operators + /// @return a sparse nbVertices x nbVertices matrix + /// + /// @note The sign convention for the divergence is opposite to the + /// one of @cite degoes2020discrete. This is also true for the + /// Laplacian operator. This is to match the usual mathematical + /// convention that the Laplacian (and the Laplacian-Beltrami) has + /// negative eigenvalues (and is the sum of second derivatives in + /// the cartesian grid). It also follows the formal adjointness of + /// exterior derivative and opposite of divergence as relation \f$ + /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v + /// \rangle \f$. See also + /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator + SparseMatrix globalLaplaceBeltrami( const double lambda = 1.0 ) const + { + SparseMatrix lapGlobal( mySurfaceMesh->nbVertices(), + mySurfaceMesh->nbVertices() ); + std::vector triplets; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + { + auto nf = myFaceDegree[ f ]; + DenseMatrix Lap = this->laplaceBeltrami( f, lambda ); + const auto vertices = mySurfaceMesh->incidentVertices( f ); + for ( auto i = 0u; i < nf; ++i ) + for ( auto j = 0u; j < nf; ++j ) + { + auto v = Lap( i, j ); + if ( v != 0.0 ) + triplets.emplace_back( Triplet( + (SparseMatrix::StorageIndex)vertices[ i ], + (SparseMatrix::StorageIndex)vertices[ j ], Lap( i, j ) ) ); + } + } + lapGlobal.setFromTriplets( triplets.begin(), triplets.end() ); + return lapGlobal; + } + + /// Compute and returns the global lumped mass matrix + /// (diagonal matrix with Max's weights for each vertex). + /// M(i,i) = ∑_{adjface f} faceArea(f)/degree(f) ; + /// + /// @return the global lumped mass matrix. + SparseMatrix globalLumpedMassMatrix() const + { + SparseMatrix M( mySurfaceMesh->nbVertices(), + mySurfaceMesh->nbVertices() ); + std::vector triplets; + for ( typename MySurfaceMesh::Index v = 0; + v < mySurfaceMesh->nbVertices(); ++v ) + { + auto faces = mySurfaceMesh->incidentFaces( v ); auto varea = 0.0; - for(auto f: faces) - varea += faceArea(f) /(double)myFaceDegree[f]; - triplets.emplace_back(Triplet(v,v,varea)); + for ( auto f : faces ) + varea += faceArea( f ) / (double)myFaceDegree[ f ]; + triplets.emplace_back( Triplet( v, v, varea ) ); } - M.setFromTriplets(triplets.begin(),triplets.end()); - return M; - } + M.setFromTriplets( triplets.begin(), triplets.end() ); + return M; + } - /// Compute and returns the inverse of the global lumped mass matrix - /// (diagonal matrix with Max's weights for each vertex). - /// - /// @return the inverse of the global lumped mass matrix. - SparseMatrix globalInverseLumpedMassMatrix() const - { - SparseMatrix iM0 = globalLumpedMassMatrix(); - for ( int k = 0; k < iM0.outerSize(); ++k ) - for ( typename SparseMatrix::InnerIterator it( iM0, k ); it; ++it ) - it.valueRef() = 1.0 / it.value(); - return iM0; - } + /// Compute and returns the inverse of the global lumped mass matrix + /// (diagonal matrix with Max's weights for each vertex). + /// + /// @return the inverse of the global lumped mass matrix. + SparseMatrix globalInverseLumpedMassMatrix() const + { + SparseMatrix iM0 = globalLumpedMassMatrix(); + for ( int k = 0; k < iM0.outerSize(); ++k ) + for ( typename SparseMatrix::InnerIterator it( iM0, k ); it; ++it ) + it.valueRef() = 1.0 / it.value(); + return iM0; + } - /// Computes the global Connection-Laplace-Beltrami operator by accumulating - /// the per face operators. - /// - /// @param lambda the regualrization parameter for the local - /// Connection-Laplace-Beltrami operators - /// @return a sparse 2*nbVertices x 2*nbVertices matrix - /// - /// @note The sign convention for the divergence is opposite to the - /// one of @cite degoes2020discrete. This is also true for the - /// Laplacian operator. This is to match the usual mathematical - /// convention that the Laplacian (and the Laplacian-Beltrami) has - /// negative eigenvalues (and is the sum of second derivatives in - /// the cartesian grid). It also follows the formal adjointness of - /// exterior derivative and opposite of divergence as relation \f$ - /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v - /// \rangle \f$. See also - /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator - SparseMatrix globalConnectionLaplace(const double lambda = 1.0) const - { - auto nv = mySurfaceMesh->nbVertices(); - SparseMatrix lapGlobal(2 * nv, 2 * nv); - SparseMatrix local(2 * nv, 2 * nv); - std::vector triplets; - for (typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); f++) - { - auto nf = degree(f); - DenseMatrix Lap = connectionLaplacian(f,lambda); - const auto vertices = mySurfaceMesh->incidentVertices(f); - for (auto i = 0u; i < nf; ++i) - for (auto j = 0u; j < nf; ++j) - for (short k1 = 0; k1 < 2; k1++) - for (short k2 = 0; k2 < 2; k2++) - { - auto v = Lap(2 * i + k1, 2 * j + k2); - if (v != 0.0) - triplets.emplace_back(Triplet(2 * vertices[i] + k1, - 2 * vertices[j] + k2, v)); - } - } - lapGlobal.setFromTriplets(triplets.begin(), triplets.end()); - return lapGlobal; - } + /// Computes the global Connection-Laplace-Beltrami operator by accumulating + /// the per face operators. + /// + /// @param lambda the regualrization parameter for the local + /// Connection-Laplace-Beltrami operators + /// @return a sparse 2*nbVertices x 2*nbVertices matrix + /// + /// @note The sign convention for the divergence is opposite to the + /// one of @cite degoes2020discrete. This is also true for the + /// Laplacian operator. This is to match the usual mathematical + /// convention that the Laplacian (and the Laplacian-Beltrami) has + /// negative eigenvalues (and is the sum of second derivatives in + /// the cartesian grid). It also follows the formal adjointness of + /// exterior derivative and opposite of divergence as relation \f$ + /// \langle \mathrm{d} u, v \rangle = - \langle u, \mathrm{div} v + /// \rangle \f$. See also + /// https://en.wikipedia.org/wiki/Laplace–Beltrami_operator + SparseMatrix globalConnectionLaplace( const double lambda = 1.0 ) const + { + auto nv = mySurfaceMesh->nbVertices(); + SparseMatrix lapGlobal( 2 * nv, 2 * nv ); + SparseMatrix local( 2 * nv, 2 * nv ); + std::vector triplets; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + f++ ) + { + auto nf = degree( f ); + DenseMatrix Lap = connectionLaplacian( f, lambda ); + const auto vertices = mySurfaceMesh->incidentVertices( f ); + for ( auto i = 0u; i < nf; ++i ) + for ( auto j = 0u; j < nf; ++j ) + for ( short k1 = 0; k1 < 2; k1++ ) + for ( short k2 = 0; k2 < 2; k2++ ) + { + auto v = Lap( 2 * i + k1, 2 * j + k2 ); + if ( v != 0.0 ) + triplets.emplace_back( Triplet( 2 * vertices[ i ] + k1, + 2 * vertices[ j ] + k2, v ) ); + } + } + lapGlobal.setFromTriplets( triplets.begin(), triplets.end() ); + return lapGlobal; + } - /// Compute and returns the global lumped mass matrix tensorized with Id_2 - /// (used for connection laplacian) (diagonal matrix with Max's weights for - /// each vertex). - /// M(2*i,2*i) = ∑_{adjface f} faceArea(f)/degree(f) ; - /// M(2*i+1,2*i+1) = M(2*i,2*i) - /// @return the global lumped mass matrix. - SparseMatrix doubledGlobalLumpedMassMatrix() const - { - auto nv = mySurfaceMesh->nbVertices(); - SparseMatrix M(2 * nv, 2 * nv); - std::vector triplets; - for (typename MySurfaceMesh::Index v = 0; v < mySurfaceMesh->nbVertices(); ++v) - { - auto faces = mySurfaceMesh->incidentFaces(v); - auto varea = 0.0; - for (auto f : faces) - varea += faceArea(f) / (double)myFaceDegree[f]; - triplets.emplace_back(Triplet(2 * v, 2 * v, varea)); - triplets.emplace_back(Triplet(2 * v + 1, 2 * v + 1, varea)); - } - M.setFromTriplets(triplets.begin(), triplets.end()); - return M; - } - /// @} - - // ----------------------- Cache mechanism -------------------------------------- - /// @name Cache mechanism - /// @{ - - /// Generic method to compute all the per face DenseMatrices and store them in an - /// indexed container. - /// - /// Usage example: - /// @code - ///auto opM = [&](const PolygonalCalculus::Face f){ return calculus.M(f);}; - ///auto cacheM = boxCalculus.getOperatorCacheMatrix(opM); - ///... - /////Now you have access to the cached values and mixed them with un-cached ones - /// Face f = ...; - /// auto res = cacheM[f] * calculus.D(f) * phi; - /// ... - ///@endcode - /// - /// @param perFaceOperator the per face operator - /// @return an indexed container of all DenseMatrix operators (indexed per Face). - std::vector getOperatorCacheMatrix(const std::function &perFaceOperator) const - { - std::vector cache; - for( typename MySurfaceMesh::Index f=0; f < mySurfaceMesh->nbFaces(); ++f) - cache.push_back(perFaceOperator(f)); - return cache; - } - - /// Generic method to compute all the per face Vector and store them in an - /// indexed container. - /// - /// Usage example: - /// @code - ///auto opCentroid = [&](const PolygonalCalculus::Face f){ return calculus.centroid(f);}; - ///auto cacheCentroid = boxCalculus.getOperatorCacheVector(opCentroid); - ///... - /////Now you have access to the cached values and mixed them with un-cached ones - /// Face f = ...; - /// auto res = calculus.P(f) * cacheCentroid[f] ; - /// ... - ///@endcode - /// - /// @param perFaceVectorOperator the per face operator - /// @return an indexed container of all Vector quantities (indexed per Face). - std::vector getOperatorCacheVector(const std::function &perFaceVectorOperator) const - { - std::vector cache; - for( typename MySurfaceMesh::Index f=0; f < mySurfaceMesh->nbFaces(); ++f) - cache.push_back(perFaceVectorOperator(f)); - return cache; - } + /// Compute and returns the global lumped mass matrix tensorized with Id_2 + /// (used for connection laplacian) (diagonal matrix with Max's weights for + /// each vertex). + /// M(2*i,2*i) = ∑_{adjface f} faceArea(f)/degree(f) ; + /// M(2*i+1,2*i+1) = M(2*i,2*i) + /// @return the global lumped mass matrix. + SparseMatrix doubledGlobalLumpedMassMatrix() const + { + auto nv = mySurfaceMesh->nbVertices(); + SparseMatrix M( 2 * nv, 2 * nv ); + std::vector triplets; + for ( typename MySurfaceMesh::Index v = 0; + v < mySurfaceMesh->nbVertices(); ++v ) + { + auto faces = mySurfaceMesh->incidentFaces( v ); + auto varea = 0.0; + for ( auto f : faces ) + varea += faceArea( f ) / (double)myFaceDegree[ f ]; + triplets.emplace_back( Triplet( 2 * v, 2 * v, varea ) ); + triplets.emplace_back( Triplet( 2 * v + 1, 2 * v + 1, varea ) ); + } + M.setFromTriplets( triplets.begin(), triplets.end() ); + return M; + } + /// @} - /// Enable the internal global cache for operators. - /// - void enableInternalGlobalCache() - { - myGlobalCacheEnabled = true; - } - - /// Disable the internal global cache for operators. - /// This method will also clean up the - void disableInternalGlobalCache() - { - myGlobalCacheEnabled = false; - myGlobalCache.clear(); - } + // ----------------------- Cache mechanism + // -------------------------------------- + /// @name Cache mechanism + /// @{ - /// @} - - // ----------------------- Common -------------------------------------- -public: - /// @name Common services - /// @{ - - /// Update the internal cache structures - /// (e.g. degree of each face). - void init() - { - updateFaceDegree(); - } - - /// Helper to retrieve the degree of the face from the cache. - /// @param f the face - /// @return the number of vertices of the face. - size_t faceDegree(Face f) const - { - return myFaceDegree[f]; - } - - /// @return the number of vertices of the underlying surface mesh. - size_t nbVertices() const - { - return mySurfaceMesh->nbVertices(); - } - - /// @return the number of faces of the underlying surface mesh. - size_t nbFaces() const - { - return mySurfaceMesh->nbFaces(); - } - - /// @returns the degree of the face f (number of vertices) - /// @param f the face - size_t degree(const Face f) const - { - return myFaceDegree[f]; - } - - /// @returns an pointer to the underlying SurfaceMash object. - const MySurfaceMesh * getSurfaceMeshPtr() const - { - return mySurfaceMesh; - } - - /** - * Writes/Displays the object on an output stream. - * @param out the output stream where the object is written. - */ - void selfDisplay ( std::ostream & out ) const - { - out << "[PolygonalCalculus]: "; - if (myGlobalCacheEnabled) - out<< "internal cache enabled, "; - else - out<<"internal cache disabled, "; - out <<"SurfaceMesh="<<*mySurfaceMesh; - } - - /** - * Checks the validity/consistency of the object. - * @return 'true' if the object is valid, 'false' otherwise. - */ - bool isValid() const - { - return true; - } + /// Generic method to compute all the per face DenseMatrices and store them + /// in an indexed container. + /// + /// Usage example: + /// @code + /// auto opM = [&](const PolygonalCalculus::Face f){ return + /// calculus.M(f);}; auto cacheM = boxCalculus.getOperatorCacheMatrix(opM); + ///... + /////Now you have access to the cached values and mixed them with un-cached + /// ones + /// Face f = ...; + /// auto res = cacheM[f] * calculus.D(f) * phi; + /// ... + ///@endcode + /// + /// @param perFaceOperator the per face operator + /// @return an indexed container of all DenseMatrix operators (indexed per + /// Face). + std::vector getOperatorCacheMatrix( + const std::function & perFaceOperator ) const + { + std::vector cache; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + cache.push_back( perFaceOperator( f ) ); + return cache; + } - /// @} - - // ------------------------- Protected Datas ------------------------------ - //MARK: Protected - -protected: - /// @name Protected services and types - /// @{ - - ///Enum for operators in the internal cache strategy - enum OPERATOR { X_, D_, E_, A_, COGRAD_, GRAD_, FLAT_, B_, SHARP_, P_, M_, DIVERGENCE_, CURL_, L_,CON_L_}; - - /// Update the face degree cache - void updateFaceDegree() - { - myFaceDegree.resize(mySurfaceMesh->nbFaces()); - for(typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); ++f) + /// Generic method to compute all the per face Vector and store them in an + /// indexed container. + /// + /// Usage example: + /// @code + /// auto opCentroid = [&](const PolygonalCalculus::Face f){ return + /// calculus.centroid(f);}; auto cacheCentroid = + /// boxCalculus.getOperatorCacheVector(opCentroid); + ///... + /////Now you have access to the cached values and mixed them with un-cached + /// ones + /// Face f = ...; + /// auto res = calculus.P(f) * cacheCentroid[f] ; + /// ... + ///@endcode + /// + /// @param perFaceVectorOperator the per face operator + /// @return an indexed container of all Vector quantities (indexed per + /// Face). + std::vector getOperatorCacheVector( + const std::function & perFaceVectorOperator ) const { - auto vertices = mySurfaceMesh->incidentVertices(f); - auto nf = vertices.size(); - myFaceDegree[f] = nf; + std::vector cache; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + cache.push_back( perFaceVectorOperator( f ) ); + return cache; } - } - - /// Check internal cache if enabled. - /// @param key the operator name - /// @param f the face - /// @returns true if the operator "key" for the face f has been computed. - bool checkCache(OPERATOR key, const Face f) const - { - if (myGlobalCacheEnabled) - if (myGlobalCache[key].find(f) != myGlobalCache[key].end()) - return true; - return false; - } - /// Set an operator in the internal cache. - /// @param key the operator name - /// @param f the face - /// @param ope the operator to store - void setInCache(OPERATOR key, const Face f, - const DenseMatrix &ope) const - { - if (myGlobalCacheEnabled) - myGlobalCache[key][f] = ope; - } - - /// Project u on the orthgonal of n - /// \param u vector to project - /// \param n vector to build orthogonal space from - /// \return projected vector - static Vector project(const Vector & u, const Vector & n) - { - return u - (u.dot(n) / n.squaredNorm()) * n; - } - - /// Conversion routines. - /// \brief toVector convert Real3dPoint to Eigen::VectorXd - /// \param x the vector - /// \return the same vector in eigen type - static Vector toVector(const Eigen::Vector3d & x) - { - Vector X(3); - for (int i = 0; i < 3; i++) - X(i) = x(i); - return X; - } - - /// \brief toVec3 convert Real3dPoint to Eigen::Vector3d - /// \param x the vector - /// \return the same vector in eigen type - static Eigen::Vector3d toVec3(const Real3dPoint & x) - { - return Eigen::Vector3d(x(0),x(1),x(2)); - } - - /// Conversion routines. + /// Enable the internal global cache for operators. + /// + void enableInternalGlobalCache() + { + myGlobalCacheEnabled = true; + } + + /// Disable the internal global cache for operators. + /// This method will also clean up the + void disableInternalGlobalCache() + { + myGlobalCacheEnabled = false; + myGlobalCache.clear(); + } + + /// @} + + // ----------------------- Common -------------------------------------- + public: + /// @name Common services + /// @{ + + /// Update the internal cache structures + /// (e.g. degree of each face). + void init() + { + updateFaceDegree(); + } + + /// Helper to retrieve the degree of the face from the cache. + /// @param f the face + /// @return the number of vertices of the face. + size_t faceDegree( Face f ) const + { + return myFaceDegree[ f ]; + } + + /// @return the number of vertices of the underlying surface mesh. + size_t nbVertices() const + { + return mySurfaceMesh->nbVertices(); + } + + /// @return the number of faces of the underlying surface mesh. + size_t nbFaces() const + { + return mySurfaceMesh->nbFaces(); + } + + /// @returns the degree of the face f (number of vertices) + /// @param f the face + size_t degree( const Face f ) const + { + return myFaceDegree[ f ]; + } + + /// @returns an pointer to the underlying SurfaceMash object. + const MySurfaceMesh * getSurfaceMeshPtr() const + { + return mySurfaceMesh; + } + + /** + * Writes/Displays the object on an output stream. + * @param out the output stream where the object is written. + */ + void selfDisplay( std::ostream & out ) const + { + out << "[PolygonalCalculus]: "; + if ( myGlobalCacheEnabled ) + out << "internal cache enabled, "; + else + out << "internal cache disabled, "; + out << "SurfaceMesh=" << *mySurfaceMesh; + } + + /** + * Checks the validity/consistency of the object. + * @return 'true' if the object is valid, 'false' otherwise. + */ + bool isValid() const + { + return true; + } + + /// @} + + // ------------------------- Protected Datas ------------------------------ + // MARK: Protected + + protected: + /// @name Protected services and types + /// @{ + + /// Enum for operators in the internal cache strategy + enum OPERATOR + { + X_, + D_, + E_, + A_, + COGRAD_, + GRAD_, + FLAT_, + B_, + SHARP_, + P_, + M_, + DIVERGENCE_, + CURL_, + L_, + CON_L_ + }; + + /// Update the face degree cache + void updateFaceDegree() + { + myFaceDegree.resize( mySurfaceMesh->nbFaces() ); + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + { + auto vertices = mySurfaceMesh->incidentVertices( f ); + auto nf = vertices.size(); + myFaceDegree[ f ] = nf; + } + } + + /// Check internal cache if enabled. + /// @param key the operator name + /// @param f the face + /// @returns true if the operator "key" for the face f has been computed. + bool checkCache( OPERATOR key, const Face f ) const + { + if ( myGlobalCacheEnabled ) + if ( myGlobalCache[ key ].find( f ) != myGlobalCache[ key ].end() ) + return true; + return false; + } + + /// Set an operator in the internal cache. + /// @param key the operator name + /// @param f the face + /// @param ope the operator to store + void setInCache( OPERATOR key, const Face f, const DenseMatrix & ope ) const + { + if ( myGlobalCacheEnabled ) + myGlobalCache[ key ][ f ] = ope; + } + + /// Project u on the orthgonal of n + /// \param u vector to project + /// \param n vector to build orthogonal space from + /// \return projected vector + static Vector project( const Vector & u, const Vector & n ) + { + return u - ( u.dot( n ) / n.squaredNorm() ) * n; + } + + /// Conversion routines. + /// \brief toVector convert Real3dPoint to Eigen::VectorXd + /// \param x the vector + /// \return the same vector in eigen type + static Vector toVector( const Eigen::Vector3d & x ) + { + Vector X( 3 ); + for ( int i = 0; i < 3; i++ ) + X( i ) = x( i ); + return X; + } + + /// \brief toVec3 convert Real3dPoint to Eigen::Vector3d + /// \param x the vector + /// \return the same vector in eigen type + static Eigen::Vector3d toVec3( const Real3dPoint & x ) + { + return Eigen::Vector3d( x( 0 ), x( 1 ), x( 2 ) ); + } + + /// Conversion routines. /// \brief toReal3dVector converts Eigen::Vector3d to Real3dVector. /// \param x the vector /// \return the same vector in DGtal type - static Real3dVector toReal3dVector(const Eigen::Vector3d & x) - { - return { x(0), x(1), x(2)}; - } - - - /// Compute the (normalized) normal vector at a Vertex by averaging - /// the adjacent face normal vectors. - /// \param v the vertex to compute the normal from - /// \return 3D normal vector at vertex v - /// - Vector computeVertexNormal(const Vertex & v) const - { - Vector n(3); - n(0) = 0.; - n(1) = 0.; - n(2) = 0.; - /* for (auto f : mySurfaceMesh->incidentFaces(v)) - n += vectorArea(f); - return n.normalized(); - */ - auto faces = mySurfaceMesh->incidentFaces(v); - for (auto f : faces) - n += vectorArea(f); - - if (fabs(n.norm() - 0.0) < 0.00001) - { - //On non-manifold edges touching the boundary, n may be null. - trace.warning()<<"[PolygonalCalculus] Trying to compute the normal vector at a boundary vertex incident to pnon-manifold edge, we return a random vector."<incidentVertices(f)) + /// Compute the (normalized) normal vector at a Vertex by averaging + /// the adjacent face normal vectors. + /// \param v the vertex to compute the normal from + /// \return 3D normal vector at vertex v + /// + Vector computeVertexNormal( const Vertex & v ) const { - auto Rv = Rvf(v,f); - RU_fO.block<2,2>(2 * cpt,2 * cpt) = Rv; - ++cpt; + Vector n( 3 ); + n( 0 ) = 0.; + n( 1 ) = 0.; + n( 2 ) = 0.; + /* for (auto f : mySurfaceMesh->incidentFaces(v)) + n += vectorArea(f); + return n.normalized(); + */ + auto faces = mySurfaceMesh->incidentFaces( v ); + for ( auto f : faces ) + n += vectorArea( f ); + + if ( fabs( n.norm() - 0.0 ) < 0.00001 ) + { + // On non-manifold edges touching the boundary, n may be null. + trace.warning() << "[PolygonalCalculus] Trying to compute the normal " + "vector at a boundary vertex incident to " + "pnon-manifold edge, we return a random vector." + << std::endl; + n << Vector::Random( 3 ); + } + n = n.normalized(); + return n; } - return RU_fO; - } - - /// @return the tensor-kronecker product of M with 2x2 identity matrix - DenseMatrix kroneckerWithI2(const DenseMatrix & M) const - { - size_t h = M.rows(); - size_t w = M.cols(); - DenseMatrix MK = DenseMatrix::Zero(h * 2,w * 2); - for (size_t j = 0; j < h; j++) - for (size_t i = 0; i < w; i++) + + ///@return the normal vector at vertex v, if no normal vertex embedder is + /// set, the normal will be computed + Eigen::Vector3d n_v( const Vertex & v ) const + { + return toVec3( myVertexNormalEmbedder( v ) ); + } + + // Covariant operators routines + /// @return Block Diagonal matrix with Rvf for each vertex v in face f + DenseMatrix blockConnection( const Face & f ) const + { + auto nf = degree( f ); + DenseMatrix RU_fO = DenseMatrix::Zero( nf * 2, nf * 2 ); + size_t cpt = 0; + for ( auto v : getSurfaceMeshPtr()->incidentVertices( f ) ) { - MK(2 * j, 2 * i) = M(j, i); - MK(2 * j + 1, 2 * i + 1) = M(j, i); + auto Rv = Rvf( v, f ); + RU_fO.block<2, 2>( 2 * cpt, 2 * cpt ) = Rv; + ++cpt; } - return MK; - } + return RU_fO; + } - - - /// @} - - // ------------------------- Internals ------------------------------------ - //MARK: Internals -private: - - ///Underlying SurfaceMesh - const MySurfaceMesh *mySurfaceMesh; - - ///Embedding function (face,vertex)->R^3 for the vertex position wrt. the face. - std::function myEmbedder; - - ///Embedding function (vertex)->R^3 for the vertex normal. - std::function myVertexNormalEmbedder; - - ///Cache containing the face degree - std::vector myFaceDegree; - - ///Global cache - bool myGlobalCacheEnabled; - mutable std::array, 15> myGlobalCache; - -}; // end of class PolygonalCalculus + /// @return the tensor-kronecker product of M with 2x2 identity matrix + DenseMatrix kroneckerWithI2( const DenseMatrix & M ) const + { + size_t h = M.rows(); + size_t w = M.cols(); + DenseMatrix MK = DenseMatrix::Zero( h * 2, w * 2 ); + for ( size_t j = 0; j < h; j++ ) + for ( size_t i = 0; i < w; i++ ) + { + MK( 2 * j, 2 * i ) = M( j, i ); + MK( 2 * j + 1, 2 * i + 1 ) = M( j, i ); + } + return MK; + } -/** - * Overloads 'operator<<' for displaying objects of class 'PolygonalCalculus'. - * @param out the output stream where the object is written. - * @param object the object of class 'PolygonalCalculus' to write. - * @return the output stream after the writing. - */ -template -std::ostream& -operator<< ( std::ostream & out, const PolygonalCalculus & object ) -{ - object.selfDisplay( out ); - return out; -} + /// @} + + // ------------------------- Internals ------------------------------------ + // MARK: Internals + private: + /// Underlying SurfaceMesh + const MySurfaceMesh * mySurfaceMesh; + + /// Embedding function (face,vertex)->R^3 for the vertex position wrt. the + /// face. + std::function myEmbedder; + + /// Embedding function (vertex)->R^3 for the vertex normal. + std::function myVertexNormalEmbedder; + + /// Cache containing the face degree + std::vector myFaceDegree; + + /// Global cache + bool myGlobalCacheEnabled; + mutable std::array, 15> myGlobalCache; + + DenseMatrix buildLocalD0( Face f ) const + { + return D( f ); + } + + DenseMatrix buildLocalM0( Face f ) const + { + auto nf = degree( f ); + return DenseMatrix::Identity( nf, nf ) * faceArea( f ) / nf; + } + + DenseMatrix buildLocalM1( Face f ) const + { + return M( f ); + } + + DenseMatrix buildLocalM2( Face f ) const + { + return DenseMatrix::Identity( 1, 1 ) / faceArea( f ); + } + + DenseMatrix buildLocalSharp( Face f ) const + { + return sharp( f ); + } + + DenseMatrix buildLocalFlat( Face f ) const + { + return flat( f ); + } + + DenseMatrix buildLocalL0( Face f ) const + { + return laplaceBeltrami( f ); + } + + SparseMatrix buildM0() const + { + return globalLumpedMassMatrix(); + } + + SparseMatrix buildM1() const + { + SparseMatrix mGlobal( mySurfaceMesh->nbEdges(), + mySurfaceMesh->nbEdges() ); + std::vector triplets; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + { + auto nf = myFaceDegree[ f ]; + DenseMatrix M = this->M( f ); + const auto vertices = mySurfaceMesh->incidentVertices( f ); + for ( auto i = 0u; i < nf; ++i ) + for ( auto j = 0u; j < nf; ++j ) + { + auto v = M( i, j ); + auto edge_i = + mySurfaceMesh->makeEdge( vertices[ i ], vertices[ ( i + 1 ) % nf ] ); + auto edge_j = + mySurfaceMesh->makeEdge( vertices[ j ], vertices[ ( j + 1 ) % nf ] ); + if ( v != 0.0 ) + triplets.emplace_back( + Triplet( (SparseMatrix::StorageIndex)edge_i, + (SparseMatrix::StorageIndex)edge_j, M( i, j ) ) ); + } + } + mGlobal.setFromTriplets( triplets.begin(), triplets.end() ); + return mGlobal; + } + + SparseMatrix buildM2() const + { + SparseMatrix mGlobal( mySurfaceMesh->nbFaces(), + mySurfaceMesh->nbFaces() ); + std::vector triplets; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + { + triplets.emplace_back( + Triplet( (SparseMatrix::StorageIndex) f, + (SparseMatrix::StorageIndex) f, this->faceArea(f) )); + } + mGlobal.setFromTriplets( triplets.begin(), triplets.end() ); + return mGlobal; + } + + SparseMatrix buildSharp() const + { + SparseMatrix mySharp( 3 * mySurfaceMesh->nbFaces(), + mySurfaceMesh->nbEdges() ); + + std::vector triplets; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + { + auto nf = myFaceDegree[ f ]; + DenseMatrix sharp = this->sharp( f ); + const auto vertices = mySurfaceMesh->incidentVertices( f ); + for ( auto i = 0u; i < nf; ++i ) + for ( auto j = 0; j < 3; ++j ) + { + auto v = sharp( j, i ); + auto edge_i = + mySurfaceMesh->makeEdge( vertices[ i ], vertices[ ( i + 1 ) % nf ] ); + if ( v != 0.0 ) + triplets.emplace_back( Triplet( + (SparseMatrix::StorageIndex)f + j * mySurfaceMesh->nbFaces(), + (SparseMatrix::StorageIndex)edge_i, v ) ); + } + } + mySharp.setFromTriplets( triplets.begin(), triplets.end() ); + return mySharp; + } + + SparseMatrix buildFlat() const + { + SparseMatrix myFlat( mySurfaceMesh->nbEdges(), + 3 * mySurfaceMesh->nbFaces() ); + std::vector triplets; + for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); + ++f ) + { + auto nf = myFaceDegree[ f ]; + DenseMatrix flat = this->flat( f ); + const auto vertices = mySurfaceMesh->incidentVertices( f ); + for ( auto i = 0u; i < nf; ++i ) + for ( auto j = 0; j < 3; ++j ) + { + auto v = flat( i, j ); + auto edge_i = + mySurfaceMesh->makeEdge( vertices[ i ], vertices[ ( i + 1 ) % nf ] ); + if ( v != 0.0 ) + triplets.emplace_back( Triplet( + (SparseMatrix::StorageIndex)edge_i, + (SparseMatrix::StorageIndex)f + j * mySurfaceMesh->nbFaces(), + v ) ); + } + } + myFlat.setFromTriplets( triplets.begin(), triplets.end() ); + return myFlat; + } + + SparseMatrix buildL0() const + { + return globalLaplaceBeltrami(); + } + + }; // end of class PolygonalCalculus + + /** + * Overloads 'operator<<' for displaying objects of class 'PolygonalCalculus'. + * @param out the output stream where the object is written. + * @param object the object of class 'PolygonalCalculus' to write. + * @return the output stream after the writing. + */ + template + std::ostream & operator<<( std::ostream & out, + const PolygonalCalculus & object ) + { + object.selfDisplay( out ); + return out; + } } // namespace DGtal /////////////////////////////////////////////////////////////////////////////// diff --git a/src/DGtal/dec/SurfaceDEC.h b/src/DGtal/dec/SurfaceDEC.h index 44968e204e..7b77d0ff7b 100644 --- a/src/DGtal/dec/SurfaceDEC.h +++ b/src/DGtal/dec/SurfaceDEC.h @@ -42,21 +42,22 @@ namespace DGtal /// @name Global operators /// @{ - /// Global differential + /// \brief Global differential /// @return the n_e x n_v diffential matrix LinearOperator D0() const { return static_cast( this )->buildD0(); } - /// Global Laplace-Beltrami + /// \brief Global Laplace-Beltrami /// @return the n_v x n_v striffness matrix LinearOperator L0() const { return static_cast( this )->buildL0(); } - /// Global inner product between 0 forms + /// \brief Global inner product between 0 forms + /// /// For a diagonal version see lumpedM0() /// @return the n_v x n_v mass matrix LinearOperator M0() const @@ -64,7 +65,7 @@ namespace DGtal return static_cast( this )->buildM0(); } - /// Global diagonal inner product between 0 forms + /// \brief Global diagonal inner product between 0 forms /// /// @param f a face /// @return the n_v x n_v diagonal mass matrix @@ -73,28 +74,28 @@ namespace DGtal return static_cast( this )->buildLumpedM0(); } - /// Global inner product between 1 forms + /// \brief Global inner product between 1 forms /// @return the n_e x n_e mass matrix LinearOperator M1() const { return static_cast( this )->buildM1(); } - /// Global inner product between 2 forms + /// \brief Global inner product between 2 forms /// @return the n_f x n_f mass matrix LinearOperator M2() const { return static_cast( this )->buildM2(); } - /// Global Sharp operator + /// \brief Global Sharp operator /// @return a 3*n_f x n_e matrix LinearOperator Sharp() const { return static_cast( this )->buildSharp(); } - /// Global Flat operator + /// \brief Global Flat operator /// @return a n_e x 3*n_f matrix LinearOperator Flat() const { @@ -106,7 +107,7 @@ namespace DGtal /// @name Per face operators /// @{ - /// Differential inside a face + /// \brief Differential inside a face /// @param f a face /// @return the degree x degree differential matrix DenseMatrix localD0( Index f ) const @@ -114,7 +115,7 @@ namespace DGtal return static_cast( this )->buildLocalD0( f ); } - /// Laplace-Beltrami inside a face + /// \brief Laplace-Beltrami inside a face /// @param f a face /// @return the degree x degree stiffness matrix DenseMatrix localL0( Index f ) const @@ -122,7 +123,7 @@ namespace DGtal return static_cast( this )->buildLocalL0( f ); } - /// Inner product between 0 forms inside a face + /// \brief Inner product between 0 forms inside a face /// @param f a face /// @return the degree x degree mass matrix DenseMatrix localM0( Index f ) const @@ -130,7 +131,7 @@ namespace DGtal return static_cast( this )->buildLocalM0( f ); } - /// Inner product between 1 forms inside a face + /// \brief Inner product between 1 forms inside a face /// @param f a face /// @return the degree x degree mass matrix DenseMatrix localM1( Index f ) const @@ -138,7 +139,7 @@ namespace DGtal return static_cast( this )->buildLocalM1( f ); } - /// Inner product between 2 forms inside a face + /// \brief Inner product between 2 forms inside a face /// @param f a face /// @return the 1 x 1 mass matrix DenseMatrix localM2( Index f ) const @@ -146,7 +147,7 @@ namespace DGtal return static_cast( this )->buildLocalM2( f ); } - /// Sharp operator for inside a face + /// \brief Sharp operator for inside a face /// @param f a face /// @return a 3 x degree matrix DenseMatrix localSharp( Index f ) const @@ -154,7 +155,7 @@ namespace DGtal return static_cast( this )->buildLocalSharp( f ); } - /// Flat operator inside a face + /// \brief Flat operator inside a face /// @param f a face /// @return a degree x 3 matrix DenseMatrix localFlat( Index f ) const diff --git a/src/DGtal/dec/doc/images/cc/poisson-cc-g.png b/src/DGtal/dec/doc/images/cc/poisson-cc-g.png new file mode 100644 index 0000000000000000000000000000000000000000..550826970213fe9fd79bec17eee56b846875d3ec GIT binary patch literal 104050 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

Ji@8q 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�~T17YEGe(bu95^1%CuE>f2~ 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

X8=1lQu^1Ox&uEA#QtYD&6e*GmOxe( zZrds)Whxbp29uJfdvAx&6bySQj1USjPEP)^CNf<67-^O z1Hwajnv<`GiZ2r&Lu8gl&hqq>>G=x6v zVCJL@YrPstc`%W%PXX>VT(mkw0V3m@gnSXLsebl-!d5$fa;xFz**sQ2KH*D05?CQ8 z2E`QQo;VcnYbfte+NvdMvx5Ds3B#p>6@Q?K&jq309-7h`)MtCnfpXn$CS0sj8`U(U z1e{XY<+{`<=yfgNYwu){V+5<%meRnS-CUW{+K-n)Y8)$HsxGAq>kI_W)BkXiKLSFy+Xf@L_dg8(hNAo57 zdbCo0U~RlTx{y`!)XO=!6&eYtlGZ_aJy*bS#Ko~EPyyz5K`f9!soXGj~WF92V;;1iUzq*XVq$-0RL`^_o^9lB1=gp+U>R+A{p$3dd zXMNKcq-o?XpE0jXIw9_>TGQi1h?jw*UY(+(g)QBo7DjVY555*k|jtg@P zjST}oDpr5 n)IwZ1J?vy$Fg@mf>)1Qutrr{7PJZVK>Zt5>_aaog1*QEP(v7)t literal 0 HcmV?d00001 diff --git a/src/DGtal/dec/doc/images/cc/poisson-cc-u.png b/src/DGtal/dec/doc/images/cc/poisson-cc-u.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0bf50b02840fd676a9b458a5dc1752af2ecf31 GIT binary patch literal 175551 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 +using SurfMesh = SurfaceMesh; +using namespace Z3i; + +//Vertices +std::vector positions={ {0,0,0},{1,0,0},{1,1,0},{0,0,1} }; +//Single face +std::vector> faces={{ 0,1,2,3 }}; + +mesh = SurfMesh(positions.begin(),positions.end(),faces.begin(),faces.end()); +// We require normal at vertices. For digital surfaces, prefer using a convergent estimator +mesh.computeFaceNormalsFromPositions(); +mesh.computeVertexNormalsFromFaceNormals(); + +CC calculus(mesh); +@endcode + +we obtain a SurfaceMesh instance with a unique face, we add the naturally defined normal +to it and we define its associated InterpolatedCorrectedCalculus object. + +\subsection sectInterpolatedCorrectedLambda Second order normal interpolation, regularization parameter + +Note that the constructor takes two optional parameters : wether or not to use second order normal interpolation (defaults to false), +and a regularization parameter lambda (defaults to 0.1). + +Second normal interpolation uses average values of normals, normalized, at edge midpoints to use a second order +normal interpolation instead of the bilinear interpolation used in computations. This does not require more +values of normals and thus the normal field used is not, in itself, more precise, but this avoid interpolated +values of normal with a norm too far from 1. + +Lambda is the same regularization parameter that appears in +\cite degoes2020discrete when building the product between 1 forms and the Lapalce-Beltrami operator. + +We can use second order interpolation as well as a different value for this lambda, here 0.5 : +@code +CC calculus(mesh, true, 0.5); +@endcode + +\subsection sectInterpolatedCorrectedbuildingop Building the operators + +The following operators can be built, both using local (per face) or global variants. Here @f$ n_v@f$, @f$ n_e @f$ and @f$ n_f @f$ +denote the number of vertices, edges and faces of the surface and @f$ deg(f) @f$ the degree of face f. + +Operator | Local Variant | Local shape | Global variant | Global shape +--|--|--|--|-- +D0 : differential for 0 forms | `calculus.localD0(f);` | @f$ deg(f) \times deg(f) @f$ | `calculus.D0()` | @f$ n_e \times n_v @f$ +M0 : inner product between 0 forms | `calculus.localM0(f);` | @f$ deg(f) \times deg(f) @f$ | `calculus.M0()` | @f$ n_v \times n_v @f$ +lumpedM0 : diagonal version of M0 (less accurate, easier to inverse) | | | `calculus.lumpedM0()`| @f$ n_v \times n_v @f$ +M1 : inner product between 1 forms | `calculus.localM1(f);` | @f$ deg(f) \times deg(f) @f$ | `calculus.M1()` | @f$ n_e \times n_e @f$ +M2 : inner product between 2 forms | `calculus.localM2(f);` | @f$ 1 \times 1 @f$ | `calculus.M2()` | @f$ n_f \times n_f @f$ +Sharp | `calculus.localSharp(f);` | @f$ 3 \times deg(f) @f$ | `calculus.Sharp()` | @f$ 3n_f \times n_e @f$ +Flat | `calculus.localFlat(f);` | @f$ deg(f) \times 3 @f$ | `calculus.Flat()` | @f$ n_e \times 3n_f @f$ +L0 : integrated Laplace-Beltrami | `calculus.localL0(f);` | @f$ deg(f) \times deg(f) @f$ | `calculus.L0()` | @f$ n_v \times n_v @f$ + +Vectors fields are represented by one vector of size @f$ 3 n_f @f$ (for a field defined at faces), whith the first +@f$n_f@f$ values containing the x coordinates, then the next @f$n_f@f$ the y coordinates and the last @f$n_f@f$ the z +coordinates. + +Let us add a scalar function on vertices. For instance, using Eigen syntax, we can use; + +@code +CC::DenseVector phi(4); //4 vertices +phi << 1.0, 2.0, 0.0, 5.0; +@endcode + +We can compute the gradient of this function using DEC formulas : @f$\nabla f = (d f)^\sharp @f$. + +Since we have a unique face, we can compute it locally or globally and obtain the same result. + +The local approach would be : +@code +CC::DenseVector localGrad = calculus.localSharp(0) * calculus.localD0(0) * phi; +@endcode + +The global approach would be : +@code +CC::DenseVector grad = calculus.Sharp() * calculus.D0() * phi; +@endcode + +In a similar manner, we can compute the (integrated) divergence of this gradient either locally or globally, using @f$\nabla . \mathbf(u) = *d*\mathbf(u)^\flat @f$. +Since we use the integrated version (to havoid having to inverse M0), we only have to compute @f$ d*\mathbf(u)^\flat @f$ + +Locally : +@code +CC::DenseVector localDiv = calculus.localD0(0).transpose() * calculus.localM1(0) * calculus.localFlat(0) * localGrad; +@endcode + +Globally : +@code +CC::DenseVector div = calculus.D0().transpose() * calculus.M1() * calculus.Flat() * localGrad; +@endcode + +\section sectInterpolatedCorrectedCalcPoisson Example: Solving a Laplace problem + +Let suppose we want to solve the following Laplace problem for data interpolation: +\f{eqnarray*}{ + \Delta_\Omega u& = 0 \\ + & s.t. u = g \text{ on } \partial\Omega +\f} + +We want to solve that problem on a digital surface @f$\Omega@f$ + with a boundary and some scalar values attached +to boundary vertices, or sampled on the object surface. + +Furthermore, the discrete version of the Laplace problem boils down to +a simple linear problem using on the discrete Laplace-Beltrami sparse +matrix. + +We also use class DirichletConditions to enforce Dirichlet boundary +conditions on the system. + +The overall code is: +\snippet dgtalCC-poisson.cpp CC-init + +Leading to the following results (see \ref dgtalCC-poisson.cpp): + +Surface | Boundary condition @f$ g@f$ | Solution @f$ u @f$ +--|--|-- +@image html images/cc/poisson-cc-surf.png "" | @image html images/cc/poisson-cc-g.png "" | @image html images/cc/poisson-cc-u.png "" + +*/ + +} diff --git a/src/DGtal/dec/doc/moduleNormalCorrectedFEM.dox b/src/DGtal/dec/doc/moduleNormalCorrectedFEM.dox index 8a428e146d..06c3ea6084 100644 --- a/src/DGtal/dec/doc/moduleNormalCorrectedFEM.dox +++ b/src/DGtal/dec/doc/moduleNormalCorrectedFEM.dox @@ -2,7 +2,7 @@ /** * @file * @author Colin Weill--Duflos (\c colin.weill-duflos@univ-smb.fr ) - * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France + * Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France * * @date 2024/06/05 * @@ -23,12 +23,13 @@ namespace DGtal { [TOC] -@since 1.4 +@since 1.5 Part of package \ref packageDEC. In this documentation page, we detail a laplacian operator - computations on surface mesh equipped with faces normals. + computations on surface mesh equipped with faces normals provided by the + NormalCorrectedFEM class. @note The sign convention for the divergence and the Laplacian operator is opposite to the one of @cite degoes2020discrete. This is @@ -41,8 +42,7 @@ relation \f$ \langle \mathrm{d} u, v \rangle = - \langle u, https://en.wikipedia.org/wiki/Laplace–Beltrami_operator @note All illustrations below have been obtained using the -DGtal+[polyscope](https://polyscope.run) examples \ref -dgtalCalculus.cpp, \ref dgtalCalculus-single.cpp and \ref dgtalCalculus-poisson.cpp. To build these examples, enable the `BUILD_POLYSCOPE_EXAMPLES` variable (e.g. `cmake .. -DBUILD_POLYSCOPE_EXAMPLES=ON`). +DGtal+[polyscope](https://polyscope.run) example dgtalFEM-poisson.cpp. To build these examples, enable the `BUILD_POLYSCOPE_EXAMPLES` variable (e.g. `cmake .. -DBUILD_POLYSCOPE_EXAMPLES=ON`). @warning The implementation heavily relies on implicit operators with many Eigen based small matrice constructions, which has a huge overhead in Debug mode. Please consider to build the examples in Release (*e.g.* `CMAKE_BUILD_TYPE` variable) for high performance on large geometrical objects. @@ -63,7 +63,7 @@ for a surfel in the natural coordinate surface of the surfel. \section sectNormalCorrectedFEMface Per face operators -Let us consider a single square face example. Using +Let us consider a single face digital surface (i.e. : a square). Using : @code using ncFEM = NormalCorrectedFEM; @@ -88,11 +88,11 @@ to it and we define its associated NormalCorrectedFEM object. Let us add a scalar function on vertices. For instance, using Eigen syntax, we can use; @code -ncFEM::DenseVector phi(4); //5 vertices +ncFEM::DenseVector phi(4); //4 vertices phi << 1.0, 2.0, 0.0, 5.0; @endcode -\subsection sublap Mass matrix and stiffness matrix +\subsection sectNormalCorrectedMMstiff Mass matrix and stiffness matrix The expression for the integral of the product of two functions @f$f@f$ and @f$g@f$ inside a surfel is given by the following expression : @f[ \int_{\square} \sqrt{det(G)}fg @f] @@ -108,7 +108,7 @@ Operator | Output | Description `calculus.localM0(f)` | \f$ n_v\times n_v\f$ | mass matrix (corresponds to the inner product between 0 forms in @cite degoes2020discrete) `calculus.localL0(f)`| \f$ n_v \times n_v\f$ | stiffness matrix (corresponds to Laplace-Beltrami operator in @cite degoes2020discrete), the matrix is PSD -\section sectPolygonalCalculusGlo Global operators +\section sectNormalCorrectedFEMGlo Global operators Given a scalar function defined on a generic surface mesh vertices, all previously mentioned operators can be applied to obtain consistent quantities on the overall mesh. @@ -120,7 +120,7 @@ Operator | Output | Description `calculus.L0()`| \f$ n_v \times n_v\f$ | global stiffness matrix (SPD) -\section secLap Example: Solving a Laplace problem +\section secNormalCorrectedFEMLap Example: Solving a Laplace problem Let suppose we want to solve the following Laplace problem for data interpolation: \f{eqnarray*}{ diff --git a/src/DGtal/dec/doc/modulePolygonalCalculus.dox b/src/DGtal/dec/doc/modulePolygonalCalculus.dox index 643ee65900..cf34205ed7 100644 --- a/src/DGtal/dec/doc/modulePolygonalCalculus.dox +++ b/src/DGtal/dec/doc/modulePolygonalCalculus.dox @@ -1,5 +1,5 @@ /** - * @file + * @file * @author David Coeurjolly (\c david.coeurjolly@liris.cnrs.fr ) * Laboratoire d'InfoRmatique en Image et Systemes d'information - LIRIS (CNRS, UMR 5205), CNRS, France * @@ -52,8 +52,8 @@ DGtal+[polyscope](https://polyscope.run) examples \ref dgtalCalculus.cpp, \ref dgtalCalculus-single.cpp and \ref dgtalCalculus-poisson.cpp. To build these examples, enable the `BUILD_POLYSCOPE_EXAMPLES` variable (e.g. `cmake .. -DBUILD_POLYSCOPE_EXAMPLES=ON`). @warning The implementation heavily relies on implicit operators with many Eigen based small matrice constructions, which has a huge overhead in Debug mode. Please consider to build the examples in Release (*e.g.* `CMAKE_BUILD_TYPE` variable) for high performance on large geometrical objects. - - + + \section sectPolygonalCalculusIntro Introduction @@ -84,13 +84,13 @@ std::vector positions={ {0,0,0},{20,0,0},{20,10,0},{10,8,5}, {0,15,1} std::vector> faces={{ 0,1,2,3,4 }}; mesh = SurfMesh(positions.begin(),positions.end(),faces.begin(),faces.end()); - + PolygonalCalculus calculus(mesh); @endcode we obtain a SurfaceMesh instance with a unique face and its associated PolygonalCalculus object. - Example| Example + Example| Example --|-- @image html images/poly/face.png "" | @image html images/poly/face_rot.png "" @@ -114,17 +114,17 @@ default, the positions of the surface mesh vertices (@a positions @a in the previous example) is used. If you want to update the embedding (could be useful on digital surfaces), the user can specify the mapping `(Face,Vertex)->RealPoint`. Please refer to -PolygonalCalculus::setEmbedder for an example. +PolygonalCalculus::setEmbedder for an example. @note As the Face id is a parameter of the embedder, a given vertex can have different embeddings for all its incident faces. - + \subsection susub1 Basic operators - - - + + + We first describe some standard per face operators. Note that for all extrinsic operators that require the vertex position in @f$ @@ -148,7 +148,7 @@ Operator | Output | Description \subsubsection subderiv Derivative operators -Derivative operators act on a scalar field defined on the vertex of the face. +Derivative operators act on a scalar field defined on the vertex of the face. Operator | Output | Description @@ -160,7 +160,7 @@ Operator | Output | Description A*phi | D*phi (discrete 1-form) --| -- -@image html images/poly/A_phi.png "" | @image html images/poly/D_phi.png "" +@image html images/poly/A_phi.png "" | @image html images/poly/D_phi.png "" gradient | co-gradient | corrected normal @@ -194,10 +194,10 @@ a vector in @f$\mathbb{R}^3@f$ | a vector in @f$\mathbb{R}^3@f$ | Flat (1-form) -\subsection sublap Inner Product and Laplace-Beltrami Operators +\subsection subdlap Inner Product and Laplace-Beltrami Operators -For 0-forms, the inner product is the classical one induced by the @f$ l_2@f$ norm. For 1-forms, the inner product is given by PolygonalCalculus::M() (useful to define the Laplace-Beltrami operator). +For 0-forms, the inner product is the classical one induced by the @f$ l_2@f$ norm. For 1-forms, the inner product is given by PolygonalCalculus::M() (useful to define the Laplace-Beltrami operator). Operator | Output | Description ------------- | ------------- | ---- @@ -208,15 +208,15 @@ Operator | Output | Description In this section, we describe operators acting on directional fields (Levi-Civita connection, covariant gradient of a vector field --first-order derivative on VF--, and connection laplacian). Pleas refer to @cite degoes2020discrete, section 5, for details. - + As an example, these operators can be used to interpolate vector fields as illustrated in @ref moduleVectorsInHeat. - + @image html images/poly/transport_to_face.png "Transport of a vertex based vector field to face tangent plane" \subsubsection sectcovOP Covariant Gradient and Projection Since these operators are themselves matrices they cannot be constructed in the same way as the others ( Operator builder Matrix * function restricted to face Vector ), you need the specify the local vector field as well, in the same format as in @cite degoes2020discrete, -i.e. +i.e. \f{eqnarray*}{ u_{f} = [u_{v_1}^t \ldots u_{v_{nf}}^t]^t \f} @@ -232,7 +232,7 @@ Operator | Output | Description Using the same format for vector fields as above, we can define a Vector Laplacian operator per face. Operator | Output | Description ------------- | ------------- | ---- -`calculus.connectionLaplacian(f,lambda)` | \f$ 2n_f\times 2n_f\f$ | Vector Laplacian defined as the associated Matrix with the Dirichlet energy for vector valued 0-forms (lambda is a regularization parameter, see @cite degoes2020discrete) at face f, PSD matrix +`calculus.connectionLaplacian(f,lambda)` | \f$ 2n_f\times 2n_f\f$ | Vector Laplacian defined as the associated Matrix with the Dirichlet energy for vector valued 0-forms (lambda is a regularization parameter, see @cite degoes2020discrete) at face f, PSD matrix \section sectPolygonalCalculusGlo Global calculus @@ -240,12 +240,12 @@ Operator | Output | Description Given a scalar function defined on a generic surface mesh vertices, all previously mentioned operators can be applied to obtain consistent quantities on the overall mesh. For instance, from the \ref dgtalCalculus.cpp example using Shortcuts and ShortcutsGeometry to set up the surface: -Surface | Phi | Gradient | Gradient+co-gradient +Surface | Phi | Gradient | Gradient+co-gradient --|--|--|-- @image html images/poly/init.png "" | @image html images/poly/goursat_phi.png "" | @image html images/poly/goursat_grad.png "" | @image html images/poly/goursat_gradcograd.png "" -To solve some global PDE (e.g. Laplace/Poisson problems, see below), one can combine the local operators into a global one, gathering the contributions of each face. +To solve some global PDE (e.g. Laplace/Poisson problems, see below), one can combine the local operators into a global one, gathering the contributions of each face. For example, the PolygonalCalculus::globalLaplaceBeltrami() method outputs a global (sparse) Laplace-Beltrami operator which can later be used for diffusion. @@ -257,9 +257,9 @@ used when one solves a weak problem and wishes to get a pointwise per-vertex solution. - + \section sectCorrected Corrected Calculus using Estimated Normal Vectors - + On digital surfaces, solving PDE on original embedding with axis aligned quad surfaces may fail to correctly capture the surface metric. As discussed in @cite coeurjolly2022simple, given an estimation of the tangent bundle of the discrete surface (for instance using estimated normal vectors from @ref moduleIntegralInvariant, or @ref moduleVCM, cf @ref moduleShortcuts), @@ -269,16 +269,16 @@ Geodesic distances without correction | Geodesic distances with correction --|-- @image html images/poly/corrected-without.png "" | @image html images/poly/corrected-with.png "" - + The functor functors::EmbedderFromNormalVectors can be used to implicitly project Face vertices onto the prescribed tangent plane. A classical usage is the following one: - + @code //A surface mesh. Eg. primal surface of a digital surface SurfaceMesh< Z3i::RealPoint, Z3i::RealVector > surfmesh(...); //Per face normal vector estimation std::vector ii_normals = .... - + //New embedder using tangent plane projection of face vertices functors::EmbedderFromNormalVectors embedderFromNormals(ii_normals,surfmesh); @@ -287,58 +287,58 @@ The functor functors::EmbedderFromNormalVectors can be used to implicitly projec calculus->setEmbedder( embedderFromNormals ); @endcode A complete code is given in the @ref dgtalCalculus-geodesic.cpp example. - + \section secLap Example: Solving a Laplace problem - + Let suppose we want to solve the following Laplace problem for data interpolation: \f{eqnarray*}{ \Delta_\Omega u& = 0 \\ & s.t. u = g \text{ on } \partial\Omega \f} - + We want to solve that problem on a polygonal mesh @f$\Omega@f$ (digital surface here) with a boundary and some scalar values attached to boundary vertices, or sampled on the object surface. - + Furthermore, the discrete version of the Laplace problem boils down to a simple linear problem using on the discrete Laplace-Beltrami sparse matrix. - + We also use class DirichletConditions to enforce Dirichlet boundary conditions on the system. - + The overall code is: \snippet dgtalCalculus-poisson.cpp PolyDEC-init - + Leading to the following results (see \ref dgtalCalculus-poisson.cpp): - + Surface | Boundary condition @f$ g@f$ | Solution @f$ u @f$ --|--|-- @image html images/poly/poisson-surf.png "" | @image html images/poly/poisson-g.png "" | @image html images/poly/poisson-u.png "" @image html images/poly/bunny-init.png "" | @image html images/poly/bunny-g.png "" | @image html images/poly/bunny-u.png "" @image html images/poly/cat-init.png "" | @image html images/poly/cat-g.png "" | @image html images/poly/cat-u.png "" - + \subsection Global Vector Calculus - + Global Vector Laplace/Poisson problems can also be solved by the same way, using instead PolygonalCalculus::globalConnectionLaplace() and PolygonalCalculus::doubledGlobalLumpedMassMatrix(). One can find examples of such use in the \ref VectorsInHeat class. - - - - - + + + + + \section sectMisc Miscellaneous \subsection sectPolygonalCalculusHP Cache mechanisms and high-performance computing The PolygonalCalculus class has two cache mechanisms: - + - An external cache strategy to store a given operator into a compact container. Typical use case is when the user wants to precompute a given operator, store it and efficiently reuse it while iterating over the faces. We detail this construction below. - The second one is a global internal cache strategy that will store @b all per face operators on the fly. In that case, each operator returning a DenseMatrix is stored in a cache the first time the `calculus.operator(f)` is called. Typical use case is when the user wants to use many times a large set of different operators. To enable this strategy, you can use the `calculus.enableInternalGlobalCache()`, or from the last parameter of the class constructor (boolean set to true). E.g. @code PolygonalCalculus calculus(surfmesh,true); //global internal cache enabled. @endcode By default, this behavior is disabled as it is memory expensive (all operators are explicitly stored when used for the first time), and may not have a huge running time impact for some applications. An example is given in the \ref dgtalCalculus-bunny.cpp. Once enabled, the class API remains the same, everything is transperent to the user. - + We describe here the first external cache strategy. For the sake of readability, each operator has been implemented implicitly. For example, the @e M @e operator per face is given by @code DenseMatrix M(const Face f, const double lambda=1.0) const @@ -347,12 +347,12 @@ DenseMatrix M(const Face f, const double lambda=1.0) const auto Pf=P(f); return faceArea(f) * Uf.transpose()*Uf + lambda * Pf.transpose()*Pf; } -@endcode -which could be time consuming as the internal operators may be computed several times. +@endcode +which could be time consuming as the internal operators may be computed several times. For high performance computations, we provide a generic cache mechanism to explicitly store all per face operators of a surface mesh (stored in a random access container). -A typical usage is +A typical usage is @code auto cacheSharp = getOperatorCacheMatrix( [&](Face f){ return(calculus.sharp(f);} ); auto cachefaceArea = getOperatorCacheMatrix( [&](Face f){ return(calculus.faceArea(f);} ); @@ -362,9 +362,9 @@ auto cacheP = getOperatorCacheMatrix( [&](Face f){ return(calculus.P(f);} Then, cached operators can be accessed and combined: @code auto Mf = cachefaceArea[f] * cacheU[f].transpose()*cacheU[f] + lambda * cacheP[f].transpose() * cacheP[f]; -@endcode +@endcode + - */ diff --git a/src/DGtal/dec/doc/packageDEC.dox b/src/DGtal/dec/doc/packageDEC.dox index 0edb3347f6..cc17e3316b 100644 --- a/src/DGtal/dec/doc/packageDEC.dox +++ b/src/DGtal/dec/doc/packageDEC.dox @@ -63,6 +63,7 @@ Basic operators, such as Hodge duality operator or exterior derivative, can be c - \subpage moduleGeodesicsInHeat (David Coeurjolly, Jacques-Olivier Lachaud) - \subpage moduleVectorsInHeat (Baptiste Genest, David Coeurjolly) - \subpage moduleNormalCorrectedFEM (Colin Weill--Duflos) +- \subpage moduleInterpolatedCorrectedCalculus (Colin Weill--Duflos) @b Package @b Concepts @b Overview - \subpage packageDECConcepts @@ -85,6 +86,7 @@ Basic operators, such as Hodge duality operator or exterior derivative, can be c - exampleHarmonicParametrization.cpp - exampleBunnyHead.cpp - dgtalFEM-poisson.cpp +- dgtalCC-poisson.cpp */ From 6ba4f679720eff4f2ccbfe5c8415748de79d11c8 Mon Sep 17 00:00:00 2001 From: Deploy from CI <> Date: Fri, 21 Jun 2024 13:35:20 +0200 Subject: [PATCH 05/11] Add missing differential --- src/DGtal/dec/PolygonalCalculus.h | 112 ++++++++++++++++++------------ 1 file changed, 67 insertions(+), 45 deletions(-) diff --git a/src/DGtal/dec/PolygonalCalculus.h b/src/DGtal/dec/PolygonalCalculus.h index 6823bbbfc5..331c970fd3 100644 --- a/src/DGtal/dec/PolygonalCalculus.h +++ b/src/DGtal/dec/PolygonalCalculus.h @@ -46,63 +46,68 @@ namespace DGtal { - namespace functors { + namespace functors + { /** * - * \brief Functor that projects a face vertex of a surface mesh onto the tangent plane - * given by a per-face normal vector. - * This functor can be used in PolygonalCalculus to correct the embedding of - * digital surfaces using an estimated normal vector field (see @cite coeurjolly2022simple). + * \brief Functor that projects a face vertex of a surface mesh onto the + * tangent plane given by a per-face normal vector. This functor can be used + * in PolygonalCalculus to correct the embedding of digital surfaces using + * an estimated normal vector field (see @cite coeurjolly2022simple). * - * @note when used in PolygonalCalculus, all operators being invariant by translation, all - * tangent planes pass through the origin (0,0,0) (no offest). + * @note when used in PolygonalCalculus, all operators being invariant by + * translation, all tangent planes pass through the origin (0,0,0) (no + * offest). * - * @tparam TRealPoint a model of points @f$\mathbb{R}^3@f$ (e.g. PointVector). - * @tparam TRealVector a model of vectors in @f$\mathbb{R}^3@f$ (e.g. PointVector). - */ template + * @tparam TRealPoint a model of points @f$\mathbb{R}^3@f$ (e.g. + * PointVector). + * @tparam TRealVector a model of vectors in @f$\mathbb{R}^3@f$ (e.g. + * PointVector). + */ + template struct EmbedderFromNormalVectors { - ///Type of SurfaceMesh + /// Type of SurfaceMesh typedef SurfaceMesh MySurfaceMesh; - ///Vertex type + /// Vertex type typedef typename MySurfaceMesh::Vertex Vertex; - ///Face type + /// Face type typedef typename MySurfaceMesh::Face Face; - ///Position type + /// Position type typedef typename MySurfaceMesh::RealPoint Real3dPoint; EmbedderFromNormalVectors() = delete; - /// Constructor from an array of normal vectors and a surface mesh instance. - /// @param normals a vector of per face normal vectors (same ordering as the SurfaceMesh face indicies). + /// Constructor from an array of normal vectors and a surface mesh + /// instance. + /// @param normals a vector of per face normal vectors (same ordering as + /// the SurfaceMesh face indicies). /// @param surfmesh an instance of SurfaceMesh - EmbedderFromNormalVectors(ConstAlias> normals, - ConstAlias surfmesh) + EmbedderFromNormalVectors( ConstAlias> normals, + ConstAlias surfmesh ) { myNormals = &normals; mySurfaceMesh = &surfmesh; } - /// Project a face vertex onto its tangent plane (given by the per-face estimated - /// normal vector). + /// Project a face vertex onto its tangent plane (given by the per-face + /// estimated normal vector). /// /// @param f the face that contains the vertex /// @param v the vertex to project - Real3dPoint operator()(const Face &f,const Vertex &v) + Real3dPoint operator()( const Face & f, const Vertex & v ) { - const auto nn = (*myNormals)[f]; - Real3dPoint p = mySurfaceMesh->position(v); - return p - nn.dot(p)*nn; + const auto nn = ( *myNormals )[ f ]; + Real3dPoint p = mySurfaceMesh->position( v ); + return p - nn.dot( p ) * nn; } - ///Alias to the normal vectors - const std::vector *myNormals; - ///Alias to the surface mesh - const MySurfaceMesh *mySurfaceMesh; + /// Alias to the normal vectors + const std::vector * myNormals; + /// Alias to the surface mesh + const MySurfaceMesh * mySurfaceMesh; }; - } - - + } // namespace functors ///////////////////////////////////////////////////////////////////////////// // template class PolygonalCalculus @@ -1398,6 +1403,23 @@ namespace DGtal return laplaceBeltrami( f ); } + SparseMatrix buildD0() const + { + std::vector triplets; + // trace.beginBlock( "Init derivative operator D0" ); + typename MySurfaceMesh::Index e = 0; + for ( auto && vtcs : mySurfaceMesh->allEdgeVertices() ) + { + triplets.push_back( { e, vtcs.first, -1 } ); + triplets.push_back( { e, vtcs.second, 1 } ); + e++; + } + SparseMatrix myD0 = + SparseMatrix( mySurfaceMesh->nbEdges(), mySurfaceMesh->nbVertices() ); + myD0.setFromTriplets( triplets.cbegin(), triplets.cend() ); + return myD0; + } + SparseMatrix buildM0() const { return globalLumpedMassMatrix(); @@ -1417,11 +1439,11 @@ namespace DGtal for ( auto i = 0u; i < nf; ++i ) for ( auto j = 0u; j < nf; ++j ) { - auto v = M( i, j ); - auto edge_i = - mySurfaceMesh->makeEdge( vertices[ i ], vertices[ ( i + 1 ) % nf ] ); - auto edge_j = - mySurfaceMesh->makeEdge( vertices[ j ], vertices[ ( j + 1 ) % nf ] ); + auto v = M( i, j ); + auto edge_i = mySurfaceMesh->makeEdge( vertices[ i ], + vertices[ ( i + 1 ) % nf ] ); + auto edge_j = mySurfaceMesh->makeEdge( vertices[ j ], + vertices[ ( j + 1 ) % nf ] ); if ( v != 0.0 ) triplets.emplace_back( Triplet( (SparseMatrix::StorageIndex)edge_i, @@ -1440,9 +1462,9 @@ namespace DGtal for ( typename MySurfaceMesh::Index f = 0; f < mySurfaceMesh->nbFaces(); ++f ) { - triplets.emplace_back( - Triplet( (SparseMatrix::StorageIndex) f, - (SparseMatrix::StorageIndex) f, this->faceArea(f) )); + triplets.emplace_back( Triplet( (SparseMatrix::StorageIndex)f, + (SparseMatrix::StorageIndex)f, + this->faceArea( f ) ) ); } mGlobal.setFromTriplets( triplets.begin(), triplets.end() ); return mGlobal; @@ -1463,9 +1485,9 @@ namespace DGtal for ( auto i = 0u; i < nf; ++i ) for ( auto j = 0; j < 3; ++j ) { - auto v = sharp( j, i ); - auto edge_i = - mySurfaceMesh->makeEdge( vertices[ i ], vertices[ ( i + 1 ) % nf ] ); + auto v = sharp( j, i ); + auto edge_i = mySurfaceMesh->makeEdge( vertices[ i ], + vertices[ ( i + 1 ) % nf ] ); if ( v != 0.0 ) triplets.emplace_back( Triplet( (SparseMatrix::StorageIndex)f + j * mySurfaceMesh->nbFaces(), @@ -1490,9 +1512,9 @@ namespace DGtal for ( auto i = 0u; i < nf; ++i ) for ( auto j = 0; j < 3; ++j ) { - auto v = flat( i, j ); - auto edge_i = - mySurfaceMesh->makeEdge( vertices[ i ], vertices[ ( i + 1 ) % nf ] ); + auto v = flat( i, j ); + auto edge_i = mySurfaceMesh->makeEdge( vertices[ i ], + vertices[ ( i + 1 ) % nf ] ); if ( v != 0.0 ) triplets.emplace_back( Triplet( (SparseMatrix::StorageIndex)edge_i, From 4b02043d9084cf89a4f5a04d45eed4f52eeed5c3 Mon Sep 17 00:00:00 2001 From: Deploy from CI <> Date: Fri, 21 Jun 2024 13:59:42 +0200 Subject: [PATCH 06/11] Fix triplets warnings --- src/DGtal/dec/InterpolatedCorrectedCalculus.h | 27 +++++++++----- src/DGtal/dec/NormalCorrectedFEM.h | 37 ++++++++++--------- src/DGtal/dec/PolygonalCalculus.h | 4 +- 3 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/DGtal/dec/InterpolatedCorrectedCalculus.h b/src/DGtal/dec/InterpolatedCorrectedCalculus.h index b9cd5ffc75..c48a393f19 100644 --- a/src/DGtal/dec/InterpolatedCorrectedCalculus.h +++ b/src/DGtal/dec/InterpolatedCorrectedCalculus.h @@ -62,6 +62,8 @@ namespace DGtal typedef typename LinearAlgebraBackend::DenseVector::Index Index; typedef typename LinearAlgebraBackend::DenseVector::Scalar Scalar; typedef typename LinearAlgebraBackend::SparseMatrix LinearOperator; + typedef + typename LinearAlgebraBackend::SparseMatrix::StorageIndex StorageIndex; typedef typename LinearAlgebraBackend::DenseMatrix DenseMatrix; typedef typename LinearAlgebraBackend::DenseVector DenseVector; typedef SurfaceMesh Mesh; @@ -564,7 +566,8 @@ namespace DGtal } for ( int i = 0; i < values.rows(); i++ ) for ( int j = 0; j < values.cols(); j++ ) - triplets.push_back( { vtcs[ i ], vtcs[ j ], values( i, j ) } ); + triplets.push_back( { (StorageIndex)vtcs[ i ], + (StorageIndex)vtcs[ j ], values( i, j ) } ); } myM0.setFromTriplets( triplets.cbegin(), triplets.cend() ); return myM0; @@ -599,9 +602,11 @@ namespace DGtal if ( a_f <= 1e-8 ) trace.warning() << "Bad corrected area " << f << " " << a_f << std::endl; - triplets.push_back( { 3 * f, 3 * f, a_f } ); - triplets.push_back( { 3 * f + 1, 3 * f + 1, a_f } ); - triplets.push_back( { 3 * f + 2, 3 * f + 2, a_f } ); + triplets.push_back( { (StorageIndex)3 * f, (StorageIndex)3 * f, a_f } ); + triplets.push_back( + { (StorageIndex)3 * f + 1, (StorageIndex)3 * f + 1, a_f } ); + triplets.push_back( + { (StorageIndex)3 * f + 2, (StorageIndex)3 * f + 2, a_f } ); } CA.setFromTriplets( triplets.cbegin(), triplets.cend() ); // Compute projection operator @@ -645,7 +650,7 @@ namespace DGtal trace.error() << "[InterpolatedCorrectedCalculus::buildM2]" << " faces should be quadrangular." << std::endl; } - triplets.push_back( { f, f, 1.0 / area } ); + triplets.push_back( { (StorageIndex)f, (StorageIndex)f, 1.0 / area } ); } myM2.setFromTriplets( triplets.cbegin(), triplets.cend() ); return myM2; @@ -689,8 +694,9 @@ namespace DGtal const auto G_f = buildLocalSharp( f ); for ( Dimension x = 0; x < 3; ++x ) for ( Dimension n = 0; n < nc; ++n ) - triplets.push_back( - { 3 * f + x, edge_idcs[ n ], edge_sign[ n ] * G_f( x, n ) } ); + triplets.push_back( { (StorageIndex)3 * f + x, + (StorageIndex)edge_idcs[ n ], + edge_sign[ n ] * G_f( x, n ) } ); } mySharp.setFromTriplets( triplets.cbegin(), triplets.cend() ); return mySharp; @@ -735,7 +741,8 @@ namespace DGtal for ( Dimension n = 0; n < nc; ++n ) { const double nbFaces = myMesh->edgeFaces( edge_idcs[ n ] ).size(); - triplets.push_back( { edge_idcs[ n ], 3 * f + x, + triplets.push_back( { (StorageIndex)edge_idcs[ n ], + (StorageIndex)3 * f + x, edge_sign[ n ] * V_f( n, x ) / nbFaces } ); } } @@ -762,8 +769,8 @@ namespace DGtal Edge e = 0; for ( auto && vtcs : myMesh->allEdgeVertices() ) { - triplets.push_back( { e, vtcs.first, -1 } ); - triplets.push_back( { e, vtcs.second, 1 } ); + triplets.push_back( { (StorageIndex)e, (StorageIndex)vtcs.first, -1 } ); + triplets.push_back( { (StorageIndex)e, (StorageIndex)vtcs.second, 1 } ); e++; } LinearOperator myD0 = diff --git a/src/DGtal/dec/NormalCorrectedFEM.h b/src/DGtal/dec/NormalCorrectedFEM.h index 36d6653f43..a6682d8382 100644 --- a/src/DGtal/dec/NormalCorrectedFEM.h +++ b/src/DGtal/dec/NormalCorrectedFEM.h @@ -55,6 +55,7 @@ namespace DGtal typedef TRealPoint RealPoint; typedef TRealVector RealVector; typedef typename LinearAlgebraBackend::SparseMatrix LinearOperator; + typedef typename LinearAlgebraBackend::SparseMatrix::StorageIndex StorageIndex; typedef typename LinearAlgebraBackend::DenseMatrix DenseMatrix; typedef typename LinearAlgebraBackend::DenseVector DenseVector; typedef SurfaceMesh Mesh; @@ -87,18 +88,18 @@ namespace DGtal const auto face_n = myMesh->faceNormal( f ); const double z = face_n.dot( nn ); const double doubleArea = n.norm(); - triplets.push_back( { v0, v0, 1. / 12. * z * doubleArea } ); - triplets.push_back( { v0, v1, 1. / 24. * z * doubleArea } ); - triplets.push_back( { v0, v2, 1. / 24. * z * doubleArea } ); - triplets.push_back( { v1, v0, 1. / 24. * z * doubleArea } ); - triplets.push_back( { v1, v1, 1. / 12. * z * doubleArea } ); - triplets.push_back( { v1, v2, 1. / 24. * z * doubleArea } ); - triplets.push_back( { v2, v0, 1. / 24. * z * doubleArea } ); - triplets.push_back( { v2, v1, 1. / 24. * z * doubleArea } ); - triplets.push_back( { v2, v2, 1. / 12. * z * doubleArea } ); - lumpedTriplets.push_back( { v0, v0, 1. / 6. * z * doubleArea } ); - lumpedTriplets.push_back( { v1, v1, 1. / 6. * z * doubleArea } ); - lumpedTriplets.push_back( { v2, v2, 1. / 6. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v0, (StorageIndex)v0, 1. / 12. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v0, (StorageIndex)v1, 1. / 24. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v0, (StorageIndex)v2, 1. / 24. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v1, (StorageIndex)v0, 1. / 24. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v1, (StorageIndex)v1, 1. / 12. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v1, (StorageIndex)v2, 1. / 24. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v2, (StorageIndex)v0, 1. / 24. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v2, (StorageIndex)v1, 1. / 24. * z * doubleArea } ); + triplets.push_back( { (StorageIndex)v2, (StorageIndex)v2, 1. / 12. * z * doubleArea } ); + lumpedTriplets.push_back( { (StorageIndex)v0, (StorageIndex)v0, 1. / 6. * z * doubleArea } ); + lumpedTriplets.push_back( { (StorageIndex)v1, (StorageIndex)v1, 1. / 6. * z * doubleArea } ); + lumpedTriplets.push_back( { (StorageIndex)v2, (StorageIndex)v2, 1. / 6. * z * doubleArea } ); } void buildQuadrangleFaceMass( Triplets & triplets, @@ -133,20 +134,20 @@ namespace DGtal int v_j = v[ i2 ][ j2 ]; if ( i == i2 && j == j2 ) { - triplets.push_back( { v_i, v_j, area * z * 1. / 9. } ); - lumpedTriplets.push_back( { v_i, v_j, 1. / 4. * z * area } ); + triplets.push_back( { (StorageIndex)v_i, (StorageIndex)v_j, area * z * 1. / 9. } ); + lumpedTriplets.push_back( { (StorageIndex)v_i, (StorageIndex)v_j, 1. / 4. * z * area } ); } else if ( i == i2 && j == 1 - j2 ) { - triplets.push_back( { v_i, v_j, area * z * 1. / 18. } ); + triplets.push_back( { (StorageIndex)v_i, (StorageIndex)v_j, area * z * 1. / 18. } ); } else if ( j == j2 && i == 1 - i2 ) { - triplets.push_back( { v_i, v_j, area * z * 1. / 18. } ); + triplets.push_back( { (StorageIndex)v_i, (StorageIndex)v_j, area * z * 1. / 18. } ); } else { - triplets.push_back( { v_i, v_j, area * z * 1. / 36. } ); + triplets.push_back( { (StorageIndex)v_i, (StorageIndex)v_j, area * z * 1. / 36. } ); } } } @@ -311,7 +312,7 @@ namespace DGtal } for ( int i = 0; i < values.rows(); i++ ) for ( int j = 0; j < values.cols(); j++ ) - triplets.push_back( { vtcs[ i ], vtcs[ j ], values( i, j ) } ); + triplets.push_back( { (StorageIndex)vtcs[ i ], (StorageIndex)vtcs[ j ], values( i, j ) } ); } L.setFromTriplets( triplets.cbegin(), triplets.cend() ); return -L; diff --git a/src/DGtal/dec/PolygonalCalculus.h b/src/DGtal/dec/PolygonalCalculus.h index 331c970fd3..e6cac56c2b 100644 --- a/src/DGtal/dec/PolygonalCalculus.h +++ b/src/DGtal/dec/PolygonalCalculus.h @@ -1410,8 +1410,8 @@ namespace DGtal typename MySurfaceMesh::Index e = 0; for ( auto && vtcs : mySurfaceMesh->allEdgeVertices() ) { - triplets.push_back( { e, vtcs.first, -1 } ); - triplets.push_back( { e, vtcs.second, 1 } ); + triplets.push_back( {(SparseMatrix::StorageIndex)e,(SparseMatrix::StorageIndex)vtcs.first, -1 } ); + triplets.push_back( {(SparseMatrix::StorageIndex)e,(SparseMatrix::StorageIndex)vtcs.second, 1 } ); e++; } SparseMatrix myD0 = From 7cc31a3d1cba6bd642dea72a1c90186f3f437963 Mon Sep 17 00:00:00 2001 From: Deploy from CI <> Date: Fri, 21 Jun 2024 14:13:55 +0200 Subject: [PATCH 07/11] Add changelog --- ChangeLog.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index bf3410d839..a21213ad0b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,9 @@ +# DGtal 1.5beta +## New features / critical changes +## Changes +- *DEC* Add normal corrected FEM calculus for Poisson problem and Interpolated Calculus variant of DEC (Colin Weill--Duflos, PULL_REQUEST) +## Bug fixes + # DGtal 1.4 ## New features / critical changes @@ -8,8 +14,8 @@ conan.io, especially on Windows, new `ENABLE_CONAN` cmake option to activate this. (David Coeurjolly, [#1689](https://github.com/DGtal-team/DGtal/pull/1689)) - - Faster build using CPM for dependency download and ccache with the cmake `USE_CCACHE=YES`option - (ccache must be installed). (David Coeurjolly, [#1696](https://github.com/DGtal-team/DGtal/pull/1696)) + - Faster build using CPM for dependency download and ccache with the cmake `USE_CCACHE=YES`option + (ccache must be installed). (David Coeurjolly, [#1696](https://github.com/DGtal-team/DGtal/pull/1696)) - Better documentation style using doxygen-awesome.css. (David Coeurjolly, [#1697](https://github.com/DGtal-team/DGtal/pull/1697)) @@ -25,8 +31,8 @@ [#1721](https://github.com/DGtal-team/DGtal/pull/1721)) - Add CMake option DGTAL_WRAP_PYTHON (Pablo Hernandez-Cerdan, [#1700](https://github.com/DGtal-team/DGtal/pull/1700)) - - Upgrade of the conan scripts (for windows build) to conan 2, removing the ENABLE_CONAN option - (documentation update instead) (David Coeurjolly, + - Upgrade of the conan scripts (for windows build) to conan 2, removing the ENABLE_CONAN option + (documentation update instead) (David Coeurjolly, [#1729](https://github.com/DGtal-team/DGtal/pull/1729)) - *IO* @@ -76,8 +82,8 @@ Hull files (David Coeurjolly, [#1716](https://github.com/DGtal-team/DGtal/pull/1716)) - Activate and fix CTest tests on windows system. (Bertrand Kerautret, [#1706](https://github.com/DGtal-team/DGtal/pull/1706)) - - For now, removing Cairo deps install on windows (6hours long build - with conan in the windows debug mode). (David Coeurjolly, + - For now, removing Cairo deps install on windows (6hours long build + with conan in the windows debug mode). (David Coeurjolly, [#1705](https://github.com/DGtal-team/DGtal/pull/1705)) - Fix conan file upload issue and log message. (Bertrand Kerautret, [#1704](https://github.com/DGtal-team/DGtal/pull/1704)) @@ -115,16 +121,16 @@ [#1717](https://github.com/DGtal-team/DGtal/pull/1717)) - Fix const attribute that shouldn't be in FreemanChain (Colin Weill--Duflos, [#1723](https://github.com/DGtal-team/DGtal/pull/1723)) - - Fix seg fault due to recent compilers in FrechetShortcut (Bertrand Kerautret, + - Fix seg fault due to recent compilers in FrechetShortcut (Bertrand Kerautret, Isabelle Sivignon [#1726](https://github.com/DGtal-team/DGtal/pull/1726)) - - Fix FrechetShortcut to enable the parameter error to be equal to 0 and add new + - Fix FrechetShortcut to enable the parameter error to be equal to 0 and add new tests in testFrechetShortcut (Isabelle Sivignon, [#1726](https://github.com/DGtal-team/DGtal/pull/1726)) - *IO* - Fix of the `getHSV` method in the `Color` class. (David Coeurjolly, [#1674](https://github.com/DGtal-team/DGtal/pull/1674)) - - Fix of `SurfaceMeshWriter::writeIsoLinesOBJ` + - Fix of `SurfaceMeshWriter::writeIsoLinesOBJ` (Jacques-Olivier Lachaud, [#1701](https://github.com/DGtal-team/DGtal/pull/1701)) - Fix of the `PointListReader::getPolygonsFromInputStream` (Xun Gong, [#1708](https://github.com/DGtal-team/DGtal/pull/1708)) @@ -538,7 +544,7 @@ (Jacques-Olivier Lachaud,[#1470](https://github.com/DGtal-team/DGtal/pull/1470)) - *io* - - The GenericWriter can now export in 3D ITK format (nii, mha, mhd, tiff). + - The GenericWriter can now export in 3D ITK format (nii, mha, mhd, tiff). (Bertrand Kerautret [#1485](https://github.com/DGtal-team/DGtal/pull/1485)) - New Viridis ColorGradientPreset and clean of useless template specializations in the GenericWriter for color image. (Bertrand Kerautret @@ -714,7 +720,7 @@ - Fix apple clang compilation issue with a workaround to the ConstIteratorAdapter class that does not satisfy the _is_forward concept of the STL: using boost::first_max_element instead std::max_element. - (Bertrand Kerautret, [#1437](https://github.com/DGtal-team/DGtal/pull/1437)) + (Bertrand Kerautret, [#1437](https://github.com/DGtal-team/DGtal/pull/1437)) - Abort compilation at configure time when the compiler is gcc 10.1 due to compiler bug. Fix issue #1501. (Pablo Hernandez-Cerdan, [#1506](https://github.com/DGtal-team/DGtal/pull/1506)) From 449c58aa4b5a2c570cfbfc46000931691c20a607 Mon Sep 17 00:00:00 2001 From: Deploy from CI <> Date: Fri, 21 Jun 2024 14:15:33 +0200 Subject: [PATCH 08/11] Fix changelog formatting --- ChangeLog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index a21213ad0b..3fe25aabcd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,7 +1,8 @@ # DGtal 1.5beta ## New features / critical changes ## Changes -- *DEC* Add normal corrected FEM calculus for Poisson problem and Interpolated Calculus variant of DEC (Colin Weill--Duflos, PULL_REQUEST) +- *DEC* + - Add normal corrected FEM calculus for Poisson problem and Interpolated Calculus variant of DEC (Colin Weill--Duflos, PULL_REQUEST) ## Bug fixes # DGtal 1.4 From 54b4dc6a1bf00ccd9b78f5877db74ad95f5471b1 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 21 Jun 2024 15:40:42 +0200 Subject: [PATCH 09/11] SurfaceDEC doc --- src/DGtal/dec/SurfaceDEC.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/DGtal/dec/SurfaceDEC.h b/src/DGtal/dec/SurfaceDEC.h index 7b77d0ff7b..fccd7e21cf 100644 --- a/src/DGtal/dec/SurfaceDEC.h +++ b/src/DGtal/dec/SurfaceDEC.h @@ -15,6 +15,17 @@ **/ #pragma once +/** + * @file + * @author + * + * @date 2024/06/21 + * + * Header file for module SurfaceDEC.h + * + * This file is part of the DGtal library. + */ + #if !defined SurfaceDEC_h /** Prevents repeated inclusion of headers. */ #define SurfaceDEC_h From 21ac2bbb5f8ed83380ffc456e8a6c3e4232eac15 Mon Sep 17 00:00:00 2001 From: David Coeurjolly Date: Fri, 21 Jun 2024 15:43:26 +0200 Subject: [PATCH 10/11] Doxygen fixes --- src/DGtal/dec/InterpolatedCorrectedCalculus.h | 12 ++++++++++++ src/DGtal/dec/NormalCorrectedFEM.h | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/DGtal/dec/InterpolatedCorrectedCalculus.h b/src/DGtal/dec/InterpolatedCorrectedCalculus.h index c48a393f19..75dd7d6666 100644 --- a/src/DGtal/dec/InterpolatedCorrectedCalculus.h +++ b/src/DGtal/dec/InterpolatedCorrectedCalculus.h @@ -15,6 +15,18 @@ **/ #pragma once +/** + * @file + * @author + * + * @date 2024/06/21 + * + * Header file for module SurfaceDEC.h + * + * This file is part of the DGtal library. + */ + + #if !defined InterpolatedCorrectedCalculus_h /** Prevents repeated inclusion of headers. */ #define InterpolatedCorrectedCalculus_h diff --git a/src/DGtal/dec/NormalCorrectedFEM.h b/src/DGtal/dec/NormalCorrectedFEM.h index a6682d8382..37e3a3c892 100644 --- a/src/DGtal/dec/NormalCorrectedFEM.h +++ b/src/DGtal/dec/NormalCorrectedFEM.h @@ -15,6 +15,18 @@ **/ #pragma once + +/** + * @file + * @author + * + * @date 2024/06/21 + * + * Header file for module SurfaceDEC.h + * + * This file is part of the DGtal library. + */ + #if !defined NormalCorrectedFEM_h /** Prevents repeated inclusion of headers. */ #define NormalCorrectedFEM_h @@ -383,6 +395,7 @@ namespace DGtal /// Constructor from surface mesh \a smesh. /// @param smesh any surface mesh + /// @param order the order (default 1) NormalCorrectedFEM( ConstAlias smesh, int order = 1 ) : myMesh( nullptr ), order( order ) { From 4379c52a91d034f17b8523f05c3d3e09c2ba642c Mon Sep 17 00:00:00 2001 From: Deploy from CI <> Date: Mon, 27 Jan 2025 11:36:36 +0100 Subject: [PATCH 11/11] Fix global polydec sharp/flat --- .../polyscope-examples/dgtalFEM-poisson.cpp | 2 +- src/DGtal/dec/PolygonalCalculus.h | 37 ++++++++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/examples/polyscope-examples/dgtalFEM-poisson.cpp b/examples/polyscope-examples/dgtalFEM-poisson.cpp index 2b7ca749af..25de9e00ee 100644 --- a/examples/polyscope-examples/dgtalFEM-poisson.cpp +++ b/examples/polyscope-examples/dgtalFEM-poisson.cpp @@ -105,7 +105,7 @@ int main() auto params = SH3::defaultParameters() | SHG3::defaultParameters() | SHG3::parametersGeometryEstimation(); auto h=.7 ; //gridstep - params( "polynomial", "0.1*y*y -0.1*x*x - 2.0*z" )( "gridstep", h ); + params( "polynomial", "0.1*y*y -0.1*x*x - 2.1*z" )( "gridstep", h ); auto implicit_shape = SH3::makeImplicitShape3D ( params ); auto digitized_shape = SH3::makeDigitizedImplicitShape3D( implicit_shape, params ); auto K = SH3::getKSpace( params ); diff --git a/src/DGtal/dec/PolygonalCalculus.h b/src/DGtal/dec/PolygonalCalculus.h index e6cac56c2b..da1fb8da86 100644 --- a/src/DGtal/dec/PolygonalCalculus.h +++ b/src/DGtal/dec/PolygonalCalculus.h @@ -1488,10 +1488,14 @@ namespace DGtal auto v = sharp( j, i ); auto edge_i = mySurfaceMesh->makeEdge( vertices[ i ], vertices[ ( i + 1 ) % nf ] ); - if ( v != 0.0 ) - triplets.emplace_back( Triplet( - (SparseMatrix::StorageIndex)f + j * mySurfaceMesh->nbFaces(), - (SparseMatrix::StorageIndex)edge_i, v ) ); + if(vertices[i] < vertices[(i + 1) % nf]) + triplets.emplace_back( Triplet( + (SparseMatrix::StorageIndex)3 * f + j, + (SparseMatrix::StorageIndex)edge_i, v ) ); + else + triplets.emplace_back( Triplet( + (SparseMatrix::StorageIndex)3 * f + j, + (SparseMatrix::StorageIndex)edge_i, -v ) ); } } mySharp.setFromTriplets( triplets.begin(), triplets.end() ); @@ -1510,17 +1514,22 @@ namespace DGtal DenseMatrix flat = this->flat( f ); const auto vertices = mySurfaceMesh->incidentVertices( f ); for ( auto i = 0u; i < nf; ++i ) - for ( auto j = 0; j < 3; ++j ) - { - auto v = flat( i, j ); + for ( auto j = 0; j < 3; ++j ) + { auto edge_i = mySurfaceMesh->makeEdge( vertices[ i ], - vertices[ ( i + 1 ) % nf ] ); - if ( v != 0.0 ) - triplets.emplace_back( Triplet( - (SparseMatrix::StorageIndex)edge_i, - (SparseMatrix::StorageIndex)f + j * mySurfaceMesh->nbFaces(), - v ) ); - } + vertices[ ( i + 1 ) % nf ] ); + auto v = flat( i, j ) / (double) mySurfaceMesh->edgeFaces(edge_i).size(); + if(vertices[i] < vertices[(i + 1) % nf]) + triplets.emplace_back( Triplet( + (SparseMatrix::StorageIndex)edge_i, + (SparseMatrix::StorageIndex)3 * f + j, + v ) ); + else + triplets.emplace_back( Triplet( + (SparseMatrix::StorageIndex)edge_i, + (SparseMatrix::StorageIndex)3 * f + j, + -v ) ); + } } myFlat.setFromTriplets( triplets.begin(), triplets.end() ); return myFlat;