Skip to content

simplicial: the Levi-Civita connection of a Regge manifold - #119

Open
luiswirth wants to merge 1 commit into
mainfrom
worktree-connection
Open

simplicial: the Levi-Civita connection of a Regge manifold#119
luiswirth wants to merge 1 commit into
mainfrom
worktree-connection

Conversation

@luiswirth

Copy link
Copy Markdown
Owner

A Regge manifold is piecewise flat, but nothing in the crate could ask what its curvature was: the metric was only ever used within a cell, and no two cells' frames were ever compared. This adds that comparison, which is the Levi-Civita connection, and the curvature that falls out of it.

Parallel transport

MeshLengthsSq::transport gives the unique linear isometry $T_{K' \leftarrow K} : (\mathbb{R}^n, g_K) \to (\mathbb{R}^n, g_{K'})$ between the local frames of two cells sharing a facet: the one restricting on the facet to the transition differential, and carrying the direction out of the source to the direction into the target. That is the unfolding of the two cells into one flat frame, as opposed to the folding of one onto the other, and the side condition is what distinguishes them.

It exists because both cells read the shared facet's metric off the same squared edge lengths, so their restrictions agree. A bag of unrelated CellGramians would admit no such gluing. The connection is therefore a derived quantity of the Regge primitive, computed with no embedding anywhere, which is the point.

Frames are deliberately not orthonormalized. Orthonormalizing each cell would be an arbitrary gauge choice per cell, so a transport satisfies $T^\top g_{K'} T = g_K$ rather than literally being a matrix of $O(p,q)$ — the same statement with no choice in it. A holonomy, source and target being one chart, does land in $O(g_K)$.

Curvature

Piecewise flatness leaves no interior degrees of freedom (a cell's frame already identifies all its tangent spaces) and no holonomy around a contractible dual loop (the region unfolds flat and the product telescopes). So the whole connection is one matrix per interior facet, and all of its curvature concentrates on the codimension-2 hinges, where the holonomy fixes the hinge's tangent space and rotates the normal plane by the deficit angle. Curvature is a 2-form, hence measured against area, which is why the hinges are codimension 2: vertices in 2D, edges in 3D, triangles in 4D, one mechanism.

Added on top of transport: transport_along, holonomy, holonomy_angle, dihedral_angle, deficit_angle, and Ridge::is_boundary (the codimension-2 reading of Facet::is_boundary, and the condition under which there is no loop to transport around).

Totality

The normal direction is obtained as the least eigenvector of the normal equations of $B^\top g$, which stays an $n \times n$ eigenproblem in every dimension — the empty tangent space of a 1-manifold included — so there is no base case anywhere. None is returned on the two genuine degeneracies rather than papered over: a null normal (degenerate facet metric, no unit vector to be had) and a signature mismatch across the facet (no isometry exists).

Tests

  • metric compatibility, $T^\top g_{K'} T = g_K$
  • the two cells induce the same metric on the facet they share, which is what makes the connection exist
  • functoriality: reversal is inversion, and a chart transports to itself as the identity
  • a flat mesh has trivial holonomy around every hinge
  • the holonomy's rotation angle equals the magnitude of the deficit angle — an ordered product of isometries against a commutative sum of dihedral angles
  • Gauss-Bonnet: $\sum_h \varepsilon_h = 2\pi\chi$ on the sphere, at three refinements, exactly
  • in 2D a dihedral angle is the corner angle

The sign of the unfolding is pinned against an embedding, where transport must be $A_{K'}^{-1} A_K$: a reflection satisfies the isometry law just as well and fails only this. It is a test rather than the definition precisely because the definition may not consult coordinates.

One removal

vertex_gaussian_curvature carried its own 2D angle-defect loop, with a doc comment stating that the crate did not yet carry the general computation. Its angle defect was the $n = 2$ case of deficit_angle, so it now goes through it; only the lumped-area density is genuinely 2-dimensional. Its pre-existing exact Gauss-Bonnet test passes unchanged.

Not included

The $\Lambda^k$ extension of transport is exterior_power of the matrix, but exterior and simplicial are siblings, so it belongs in derham rather than here. And holonomy_angle is the Riemannian reading: on an indefinite signature the holonomy may be a boost, whose invariant is a rapidity and not an angle. The doc says so instead of the code pretending otherwise.

🤖 Generated with Claude Code

https://claude.ai/code/session_01DBMLrofgVMniugqfwti7p2

Parallel transport across a facet is the unique isometry of the two cells'
frames that restricts to the transition differential on the shared facet and
carries the direction out of the source to the direction into the target: the
unfolding of the pair into one flat frame. It exists because both cells read
the facet's metric off the same edge lengths, so the connection is a derived
quantity of the Regge primitive and needs no embedding.

Piecewise flatness leaves no interior degrees of freedom and no contractible
dual loop with holonomy, so the whole connection is one matrix per interior
facet and all curvature concentrates on the codimension-2 hinges, where the
holonomy rotates the normal plane by the deficit angle.

This generalizes vertex_gaussian_curvature, whose 2D angle defect was the
n = 2 case of deficit_angle; only the lumped-area density stays 2D, and the
duplicate implementation is gone.

The laws: metric compatibility, agreement of the shared facet metric,
functoriality, trivial holonomy on a flat mesh, agreement of the holonomy
rotation angle with the deficit angle, and Gauss-Bonnet. The sign of the
unfolding is pinned against an embedding, where transport must be the
ambient identity read in the two local frames -- a test, since the definition
may not consult coordinates.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DBMLrofgVMniugqfwti7p2
@luiswirth

Copy link
Copy Markdown
Owner Author

Four design points, before this gets implemented.

The connection is not a method on the metric

holonomy around a hinge needs facet adjacency and cofacets, so it needs the Complex, not just MeshLengthsSq. The signature ends up (&Complex, &MeshLengthsSq, ...) regardless, exactly as vertex_gaussian_curvature already is. That is the tell that the connection joins topology and geometry rather than belonging to either, so it wants its own geometry::connection module, plausibly a Connection<'a> borrowing both, rather than hanging off the lengths container.

A transport is not a matrix

T returned bare loses the whole claim: it is an isometry between two named frames, and nothing stops composing two transports that do not share a chart. A Transport { from: Chart, to: Chart, .. } makes composition and inversion type-checked, makes functoriality method-level rather than a test convention, and makes transport_along a fold that cannot silently chain a mismatched pair. Same pattern as Coords<S> and the role witnesses: a "trust me, this goes from K to K'" comment in a signature is where a witness belongs.

It also settles the derham extension cleanly. Pulling a covector back needs the inverse transpose, so a typed transport can carry the two variances as instantiations instead of leaving the caller to remember which one they hold.

The normal is a kernel, not an eigenvector

"Least eigenvector of the normal equations of $B^\top g$" is a numerical recipe standing in for a definition. The condition is $B^\top g n = 0$, i.e. $g$-orthogonality to the facet's tangent span, and that is a homogeneous linear system whose solution space is the kernel of an $(n-1) \times n$ matrix. For nondegenerate $g$, $\dim W^\perp = n - \dim W$ holds even when $W$ is degenerate, so the kernel is exactly one-dimensional in every dimension, the empty tangent space of a 1-manifold included. Totality is therefore not an argument for the eigensolve; both forms are total, and the kernel is exact where the eigensolve iterates. The null-normal degeneracy still surfaces the same way, as $n^\top g n = 0$.

Two smaller things

The Regge action $\sum_h \varepsilon_h \mathrm{vol}(h)$ is missing, and it is the classical payoff of exactly this machinery: the discrete Einstein-Hilbert functional that deficit angles were invented for. With deficit_angle and simplex_volume both present it is a one-liner, and it is the first thing a reader who knows Regge calculus will look for.

"Hinge" and Ridge name the same object in the text. Keep Ridge as the type, since it is the codimension role alongside Cell and Facet, and let "hinge" appear only in prose about Regge.

Separately, the sign paragraph reads worse than the design is. The stated side condition (restrict to the transition differential, carry the direction out of the source to the direction into the target) already pins the sign intrinsically; the embedding confirms it rather than defining it. Worth saying that outright, or a reader concludes the definition consults coordinates.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant