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
110 Eigen::SparseMatrix<Scalar> star1(Scalar lambda = 1) const;
111
117 Eigen::SparseMatrix<Scalar> star2() const;
118
129 Eigen::SparseMatrix<Scalar> flat() const;
130
139 Eigen::SparseMatrix<Scalar> sharp() const;
140
149 Eigen::SparseMatrix<Scalar> projection() const;
150
159 Eigen::SparseMatrix<Scalar> inner_product_0_form() const;
160
171 Eigen::SparseMatrix<Scalar> inner_product_1_form(Scalar lambda = 1) const;
172
181 Eigen::SparseMatrix<Scalar> inner_product_2_form() const;
182
193 Eigen::SparseMatrix<Scalar> divergence(Scalar lambda = 1) const;
194
203 Eigen::SparseMatrix<Scalar> curl() const;
204
217 Eigen::SparseMatrix<Scalar> laplacian(Scalar lambda = 1) const;
218
233 Eigen::SparseMatrix<Scalar> delta1(Scalar lambda = 1) const;
234
247 Eigen::SparseMatrix<Scalar> delta2() const;
248
258 Eigen::SparseMatrix<Scalar> laplacian2() const;
259
277 Eigen::SparseMatrix<Scalar> laplacian1(Scalar lambda = 1) const;
278
287 Eigen::SparseMatrix<Scalar> vertex_tangent_coordinates() const;
288
297 Eigen::SparseMatrix<Scalar> facet_tangent_coordinates() const;
298
308 Eigen::SparseMatrix<Scalar> levi_civita() const;
309
317 Eigen::SparseMatrix<Scalar> levi_civita_nrosy(Index n) const;
318
330 Eigen::SparseMatrix<Scalar> covariant_derivative() const;
331
339 Eigen::SparseMatrix<Scalar> covariant_derivative_nrosy(Index n) const;
340
351 Eigen::SparseMatrix<Scalar> shape_operator() const;
352
362 Eigen::SparseMatrix<Scalar> adjoint_gradient() const;
363
374 Eigen::SparseMatrix<Scalar> adjoint_shape_operator() const;
375
387 Eigen::SparseMatrix<Scalar> connection_laplacian(Scalar lambda = 1) const;
388
397 Eigen::SparseMatrix<Scalar> connection_laplacian_nrosy(Index n, Scalar lambda = 1) const;
398
399public:
410 Eigen::Matrix<Scalar, 3, Eigen::Dynamic> gradient(Index fid) const;
411
423 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> d0(Index fid) const;
424
436 Eigen::Matrix<Scalar, 1, Eigen::Dynamic> d1(Index fid) const;
437
448 Eigen::Matrix<Scalar, Eigen::Dynamic, 3> flat(Index fid) const;
449
460 Eigen::Matrix<Scalar, 3, Eigen::Dynamic> sharp(Index fid) const;
461
472 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> projection(Index fid) const;
473
485 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> inner_product_0_form(Index fid) const;
486
499 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> inner_product_1_form(
500 Index fid,
501 Scalar lambda = 1) const;
502
513 Eigen::Matrix<Scalar, 1, 1> inner_product_2_form(Index fid) const;
514
527 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> laplacian(Index fid, Scalar lambda = 1)
528 const;
529
539 Eigen::Matrix<Scalar, 2, 2> levi_civita(Index fid, Index lv) const;
540
550 Eigen::Matrix<Scalar, 2, 2> levi_civita_nrosy(Index fid, Index lv, Index n) const;
551
563 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> levi_civita(Index fid) const;
564
573 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> levi_civita_nrosy(Index fid, Index n)
574 const;
575
587 Eigen::Matrix<Scalar, 4, Eigen::Dynamic> covariant_derivative(Index fid) const;
588
597 Eigen::Matrix<Scalar, 4, Eigen::Dynamic> covariant_derivative_nrosy(Index fid, Index n) const;
598
611 Eigen::Matrix<Scalar, 2, 2> shape_operator(Index fid) const;
612
627 Eigen::Matrix<Scalar, 3, Eigen::Dynamic> adjoint_gradient(Index vid) const;
628
642 Eigen::Matrix<Scalar, 2, 2> adjoint_shape_operator(Index vid) const;
643
655 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> covariant_projection(Index fid) const;
656
665 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> covariant_projection_nrosy(
666 Index fid,
667 Index n) const;
668
682 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> connection_laplacian(
683 Index fid,
684 Scalar lambda = 1) const;
685
695 Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>
696 connection_laplacian_nrosy(Index fid, Index n, Scalar lambda = 1) const;
697
698private:
703 void compute_vertex_normal_from_vector_area();
704
705
706public:
714 Eigen::Matrix<Scalar, 3, 2> facet_basis(Index fid) const;
715
723 Eigen::Matrix<Scalar, 3, 2> vertex_basis(Index vid) const;
724
725public:
731 AttributeId get_vector_area_attribute_id() const { return m_vector_area_id; }
732
738 AttributeId get_centroid_attribute_id() const { return m_centroid_id; }
739
745 AttributeId get_vertex_normal_attribute_id() const { return m_vertex_normal_id; }
746
747private:
749 AttributeId m_vector_area_id = invalid_attribute_id();
750 AttributeId m_centroid_id = invalid_attribute_id();
751 AttributeId m_vertex_normal_id = invalid_attribute_id();
752};
753
755
756} // namespace lagrange::polyddg
A general purpose polygonal mesh class.
Definition SurfaceMesh.h:73
Eigen::Matrix< Scalar, 3, 2 > vertex_basis(Index vid) const
Compute the local tangent basis for a single vertex.
Definition DifferentialOperators.cpp:1550
Eigen::SparseMatrix< Scalar > divergence(Scalar lambda=1) const
Compute the discrete divergence operator.
Definition DifferentialOperators.cpp:462
Eigen::SparseMatrix< Scalar > levi_civita_nrosy(Index n) const
n-rosy variant of levi_civita().
Definition DifferentialOperators.cpp:639
Eigen::SparseMatrix< Scalar > projection() const
Compute the projection operator.
Definition DifferentialOperators.cpp:355
Eigen::SparseMatrix< Scalar > laplacian2() const
Compute the discrete weak-form Laplacian operator on 2-forms ( ).
Definition DifferentialOperators.cpp:532
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:731
Eigen::SparseMatrix< Scalar > shape_operator() const
Compute the global discrete shape operator (Eq.
Definition DifferentialOperators.cpp:1178
Eigen::SparseMatrix< Scalar > adjoint_shape_operator() const
Compute the global discrete adjoint shape operator (Eq.
Definition DifferentialOperators.cpp:1385
Eigen::SparseMatrix< Scalar > delta2() const
Compute the discrete weak-form co-differential operator ( ).
Definition DifferentialOperators.cpp:521
Eigen::SparseMatrix< Scalar > covariant_derivative_nrosy(Index n) const
n-rosy variant of covariant_derivative().
Definition DifferentialOperators.cpp:688
Eigen::SparseMatrix< Scalar > star1(Scalar lambda=1) const
Compute the discrete Hodge star operator for 1-forms (size E x E).
Definition DifferentialOperators.cpp:244
Eigen::SparseMatrix< Scalar > connection_laplacian_nrosy(Index n, Scalar lambda=1) const
n-rosy variant of connection_laplacian().
Definition DifferentialOperators.cpp:754
Eigen::Matrix< Scalar, 3, 2 > facet_basis(Index fid) const
Compute the local tangent basis for a single facet.
Definition DifferentialOperators.cpp:1516
Eigen::SparseMatrix< Scalar > laplacian1(Scalar lambda=1) const
Compute the discrete weak-form Hodge Laplacian on 1-forms ( ).
Definition DifferentialOperators.cpp:543
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:307
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:554
Eigen::SparseMatrix< Scalar > inner_product_1_form(Scalar lambda=1) const
Compute the discrete inner product operator for 1-forms.
Definition DifferentialOperators.cpp:400
Eigen::SparseMatrix< Scalar > star2() const
Compute the discrete Hodge star operator for 2-forms (diagonal mass matrix, size F x F).
Definition DifferentialOperators.cpp:251
Eigen::SparseMatrix< Scalar > flat() const
Compute the discrete flat operator.
Definition DifferentialOperators.cpp:259
Eigen::SparseMatrix< Scalar > laplacian(Scalar lambda=1) const
Compute the discrete weak-form Laplacian operator ( ).
Definition DifferentialOperators.cpp:501
Eigen::SparseMatrix< Scalar > connection_laplacian(Scalar lambda=1) const
Compute the connection Laplacian operator.
Definition DifferentialOperators.cpp:746
Eigen::SparseMatrix< Scalar > delta1(Scalar lambda=1) const
Compute the discrete weak-form co-differential operator ( ).
Definition DifferentialOperators.cpp:512
Eigen::SparseMatrix< Scalar > curl() const
Compute the discrete curl operator.
Definition DifferentialOperators.cpp:471
Eigen::SparseMatrix< Scalar > levi_civita() const
Compute the discrete Levi-Civita connection.
Definition DifferentialOperators.cpp:632
Eigen::SparseMatrix< Scalar > inner_product_0_form() const
Compute the discrete inner product operator for 0-forms.
Definition DifferentialOperators.cpp:368
Eigen::SparseMatrix< Scalar > covariant_derivative() const
Compute the discrete covariant derivative operator.
Definition DifferentialOperators.cpp:681
Eigen::SparseMatrix< Scalar > inner_product_2_form() const
Compute the discrete inner product operator for 2-forms.
Definition DifferentialOperators.cpp:440
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:1106
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:593
AttributeId get_vertex_normal_attribute_id() const
Get the attribute ID for the per-vertex normal.
Definition DifferentialOperators.h:745
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:1114
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:1318
AttributeId get_centroid_attribute_id() const
Get the attribute ID for the per-facet centroid.
Definition DifferentialOperators.h:738
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