Lagrange
Loading...
Searching...
No Matches
DifferentialOperators.h
1/*
2 * Copyright 2025 Adobe. All rights reserved.
3 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License. You may obtain a copy
5 * of the License at http://www.apache.org/licenses/LICENSE-2.0
6 *
7 * Unless required by applicable law or agreed to in writing, software distributed under
8 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9 * OF ANY KIND, either express or implied. See the License for the specific language
10 * governing permissions and limitations under the License.
11 */
12#pragma once
13
14#include <lagrange/SurfaceMesh.h>
15
16#include <Eigen/Core>
17#include <Eigen/Sparse>
18
19namespace lagrange::polyddg {
20
23
36template <typename Scalar, typename Index>
38{
39public:
40 using Vector = Eigen::Matrix<Scalar, 1, 3>;
41
42public:
49
50public:
59 Eigen::SparseMatrix<Scalar> gradient() const;
60
69 Eigen::SparseMatrix<Scalar> d0() const;
70
79 Eigen::SparseMatrix<Scalar> d1() const;
80
86 Eigen::SparseMatrix<Scalar> star0() const;
87
93 Eigen::SparseMatrix<Scalar> star1() const;
94
100 Eigen::SparseMatrix<Scalar> star2() const;
101
112 Eigen::SparseMatrix<Scalar> flat() const;
113
122 Eigen::SparseMatrix<Scalar> sharp() const;
123
132 Eigen::SparseMatrix<Scalar> projection() const;
133
142 Eigen::SparseMatrix<Scalar> inner_product_0_form() const;
143
154 Eigen::SparseMatrix<Scalar> inner_product_1_form(Scalar lambda = 1) const;
155
164 Eigen::SparseMatrix<Scalar> inner_product_2_form() const;
165
176 Eigen::SparseMatrix<Scalar> divergence(Scalar lambda = 1) const;
177
186 Eigen::SparseMatrix<Scalar> curl() const;
187
198 Eigen::SparseMatrix<Scalar> laplacian(Scalar lambda = 1) const;
199
208 Eigen::SparseMatrix<Scalar> vertex_tangent_coordinates() const;
209
218 Eigen::SparseMatrix<Scalar> facet_tangent_coordinates() const;
219
229 Eigen::SparseMatrix<Scalar> levi_civita() const;
230
238 Eigen::SparseMatrix<Scalar> levi_civita_nrosy(Index n) const;
239
250 Eigen::SparseMatrix<Scalar> covariant_derivative() const;
251
259 Eigen::SparseMatrix<Scalar> covariant_derivative_nrosy(Index n) const;
260
271 Eigen::SparseMatrix<Scalar> shape_operator() const;
272
282 Eigen::SparseMatrix<Scalar> adjoint_gradient() const;
283
294 Eigen::SparseMatrix<Scalar> adjoint_shape_operator() const;
295
307 Eigen::SparseMatrix<Scalar> connection_laplacian(Scalar lambda = 1) const;
308
317 Eigen::SparseMatrix<Scalar> connection_laplacian_nrosy(Index n, Scalar lambda = 1) const;
318
319public:
330 Eigen::Matrix<Scalar, 3, Eigen::Dynamic> gradient(Index fid) const;
331
343 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> d0(Index fid) const;
344
356 Eigen::Matrix<Scalar, 1, Eigen::Dynamic> d1(Index fid) const;
357
368 Eigen::Matrix<Scalar, Eigen::Dynamic, 3> flat(Index fid) const;
369
380 Eigen::Matrix<Scalar, 3, Eigen::Dynamic> sharp(Index fid) const;
381
392 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> projection(Index fid) const;
393
405 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> inner_product_0_form(Index fid) const;
406
419 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> inner_product_1_form(
420 Index fid,
421 Scalar lambda = 1) const;
422
433 Eigen::Matrix<Scalar, 1, 1> inner_product_2_form(Index fid) const;
434
447 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> laplacian(Index fid, Scalar lambda = 1)
448 const;
449
459 Eigen::Matrix<Scalar, 2, 2> levi_civita(Index fid, Index lv) const;
460
470 Eigen::Matrix<Scalar, 2, 2> levi_civita_nrosy(Index fid, Index lv, Index n) const;
471
483 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> levi_civita(Index fid) const;
484
493 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> levi_civita_nrosy(Index fid, Index n)
494 const;
495
507 Eigen::Matrix<Scalar, 4, Eigen::Dynamic> covariant_derivative(Index fid) const;
508
517 Eigen::Matrix<Scalar, 4, Eigen::Dynamic> covariant_derivative_nrosy(Index fid, Index n) const;
518
531 Eigen::Matrix<Scalar, 2, 2> shape_operator(Index fid) const;
532
547 Eigen::Matrix<Scalar, 3, Eigen::Dynamic> adjoint_gradient(Index vid) const;
548
562 Eigen::Matrix<Scalar, 2, 2> adjoint_shape_operator(Index vid) const;
563
575 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> covariant_projection(Index fid) const;
576
585 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> covariant_projection_nrosy(
586 Index fid,
587 Index n) const;
588
602 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> connection_laplacian(
603 Index fid,
604 Scalar lambda = 1) const;
605
615 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>
616 connection_laplacian_nrosy(Index fid, Index n, Scalar lambda = 1) const;
617
618private:
623 void compute_vertex_normal_from_vector_area();
624
625
626public:
634 Eigen::Matrix<Scalar, 3, 2> facet_basis(Index fid) const;
635
643 Eigen::Matrix<Scalar, 3, 2> vertex_basis(Index vid) const;
644
645public:
651 AttributeId get_vector_area_attribute_id() const { return m_vector_area_id; }
652
658 AttributeId get_centroid_attribute_id() const { return m_centroid_id; }
659
665 AttributeId get_vertex_normal_attribute_id() const { return m_vertex_normal_id; }
666
667private:
669 AttributeId m_vector_area_id = invalid_attribute_id();
670 AttributeId m_centroid_id = invalid_attribute_id();
671 AttributeId m_vertex_normal_id = invalid_attribute_id();
672};
673
675
676} // namespace lagrange::polyddg
A general purpose polygonal mesh class.
Definition SurfaceMesh.h:66
Eigen::Matrix< Scalar, 3, 2 > vertex_basis(Index vid) const
Compute the local tangent basis for a single vertex.
Definition DifferentialOperators.cpp:1538
Eigen::SparseMatrix< Scalar > divergence(Scalar lambda=1) const
Compute the discrete divergence operator.
Definition DifferentialOperators.cpp:499
Eigen::SparseMatrix< Scalar > levi_civita_nrosy(Index n) const
n-rosy variant of levi_civita().
Definition DifferentialOperators.cpp:632
Eigen::SparseMatrix< Scalar > projection() const
Compute the projection operator.
Definition DifferentialOperators.cpp:392
Eigen::SparseMatrix< Scalar > d1() const
Compute the discrete d1 operator.
Definition DifferentialOperators.cpp:204
DifferentialOperators(SurfaceMesh< Scalar, Index > &mesh)
Precomputes necessary attributes for the differential operators.
Definition DifferentialOperators.cpp:112
AttributeId get_vector_area_attribute_id() const
Get the attribute ID for the per-facet vector area.
Definition DifferentialOperators.h:651
Eigen::SparseMatrix< Scalar > shape_operator() const
Compute the global discrete shape operator (Eq.
Definition DifferentialOperators.cpp:1166
Eigen::SparseMatrix< Scalar > adjoint_shape_operator() const
Compute the global discrete adjoint shape operator (Eq.
Definition DifferentialOperators.cpp:1373
Eigen::SparseMatrix< Scalar > covariant_derivative_nrosy(Index n) const
n-rosy variant of covariant_derivative().
Definition DifferentialOperators.cpp:681
Eigen::SparseMatrix< Scalar > connection_laplacian_nrosy(Index n, Scalar lambda=1) const
n-rosy variant of connection_laplacian().
Definition DifferentialOperators.cpp:747
Eigen::Matrix< Scalar, 3, 2 > facet_basis(Index fid) const
Compute the local tangent basis for a single facet.
Definition DifferentialOperators.cpp:1504
Eigen::SparseMatrix< Scalar > d0() const
Compute the discrete d0 operator.
Definition DifferentialOperators.cpp:179
Eigen::SparseMatrix< Scalar > sharp() const
Compute the discrete sharp operator.
Definition DifferentialOperators.cpp:344
Eigen::SparseMatrix< Scalar > vertex_tangent_coordinates() const
Compute the coordinate transformation that maps a per-vertex tangent vector field expressed in the gl...
Definition DifferentialOperators.cpp:547
Eigen::SparseMatrix< Scalar > star1() const
Compute the discrete Hodge star operator for 1-forms (diagonal mass matrix, size E x E).
Definition DifferentialOperators.cpp:244
Eigen::SparseMatrix< Scalar > inner_product_1_form(Scalar lambda=1) const
Compute the discrete inner product operator for 1-forms.
Definition DifferentialOperators.cpp:437
Eigen::SparseMatrix< Scalar > star2() const
Compute the discrete Hodge star operator for 2-forms (diagonal mass matrix, size F x F).
Definition DifferentialOperators.cpp:288
Eigen::SparseMatrix< Scalar > flat() const
Compute the discrete flat operator.
Definition DifferentialOperators.cpp:296
Eigen::SparseMatrix< Scalar > laplacian(Scalar lambda=1) const
Compute the discrete Laplacian operator.
Definition DifferentialOperators.cpp:538
Eigen::SparseMatrix< Scalar > connection_laplacian(Scalar lambda=1) const
Compute the connection Laplacian operator.
Definition DifferentialOperators.cpp:739
Eigen::SparseMatrix< Scalar > curl() const
Compute the discrete curl operator.
Definition DifferentialOperators.cpp:508
Eigen::SparseMatrix< Scalar > levi_civita() const
Compute the discrete Levi-Civita connection.
Definition DifferentialOperators.cpp:625
Eigen::SparseMatrix< Scalar > inner_product_0_form() const
Compute the discrete inner product operator for 0-forms.
Definition DifferentialOperators.cpp:405
Eigen::SparseMatrix< Scalar > covariant_derivative() const
Compute the discrete covariant derivative operator.
Definition DifferentialOperators.cpp:674
Eigen::SparseMatrix< Scalar > inner_product_2_form() const
Compute the discrete inner product operator for 2-forms.
Definition DifferentialOperators.cpp:477
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > covariant_projection(Index fid) const
Compute the discrete covariant projection operator for a single facet.
Definition DifferentialOperators.cpp:1094
Eigen::SparseMatrix< Scalar > gradient() const
Compute the discrete polygonal gradient operator.
Definition DifferentialOperators.cpp:129
Eigen::SparseMatrix< Scalar > facet_tangent_coordinates() const
Compute the coordinate transformation that maps a per-facet tangent vector field expressed in the glo...
Definition DifferentialOperators.cpp:586
AttributeId get_vertex_normal_attribute_id() const
Get the attribute ID for the per-vertex normal.
Definition DifferentialOperators.h:665
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > covariant_projection_nrosy(Index fid, Index n) const
n-rosy variant of covariant_projection(fid).
Definition DifferentialOperators.cpp:1102
Eigen::SparseMatrix< Scalar > star0() const
Compute the discrete Hodge star operator for 0-forms (diagonal mass matrix, size V x V).
Definition DifferentialOperators.cpp:237
Eigen::SparseMatrix< Scalar > adjoint_gradient() const
Compute the global discrete adjoint gradient operator (Eq.
Definition DifferentialOperators.cpp:1306
AttributeId get_centroid_attribute_id() const
Get the attribute ID for the per-facet centroid.
Definition DifferentialOperators.h:658
uint32_t AttributeId
Identified to be used to access an attribute.
Definition AttributeFwd.h:73
constexpr AttributeId invalid_attribute_id()
Invalid attribute id.
Definition AttributeFwd.h:76
@ Scalar
Mesh attribute must have exactly 1 channel.
Definition AttributeFwd.h:56