Chapter 03

Edge Signals & the Discrete Curl

Promoting our graph to a simplicial complex, the boundary matrix B₁₂, 1-cochains, the discrete curl operator, and the Hodge Laplacian on edges.

In this chapter
  1. 03Promoting the Graph to a Simplicial Complex
  2. 04The Boundary Matrix B₁₂
  3. 05Edge Signals and the Discrete Curl
  4. 06The Hodge Laplacian on Edges: L₁

03Promoting the Graph to a Simplicial Complex

In Chapter 1, we worked with a graph: 4 vertices and 5 edges. That graph had no notion of "faces" — just points and connections. Now we fill in two triangles to create a 2-dimensional simplicial complex. This is the same graph, but with new rank-2 cells added.

Our Running Example — Extended

We keep all 4 vertices ($v_0, v_1, v_2, v_3$) and all 5 edges ($a$ through $e$) from Chapter 1, and add two triangular 2-cells (faces):

$\sigma_1 = \{v_0, v_1, v_2\}$ — the triangle bounded by edges $a, b, c$
$\sigma_2 = \{v_0, v_2, v_3\}$ — the triangle bounded by edges $b, d, e$

This satisfies the simplicial closure property: every edge of each triangle is present, and every vertex of each edge is present.

a b c d e σ₁ σ₂ 0 1 2 3 Three ranks: Rank 0: 4 vertices Rank 1: 5 edges Rank 2: 2 faces Edge b is shared between both triangular faces.
Figure 3.1. The Chapter 1 graph, now extended into a simplicial complex by adding two triangular 2-cells: $\sigma_1 = \{0,1,2\}$ (blue) and $\sigma_2 = \{0,2,3\}$ (green). Edge $b$ is shared between both faces. We now have objects at three ranks.

We now have the discrete de Rham chain at three levels: vertex signals (rank 0, which we studied thoroughly), edge signals (rank 1, this chapter), and face signals (rank 2, next chapter). The incidence matrices connecting them are $\mathbf{B}_1$ (vertices ↔ edges, from Chapter 1) and the new $\mathbf{B}_{1,2}$ (edges ↔ faces).


04The Boundary Matrix $\mathbf{B}_{1,2}$

Just as $\mathbf{B}_1$ encoded which vertices bound each edge, $\mathbf{B}_{1,2}$ encodes which edges bound each face. And just as we needed to orient edges (pick a direction) to get signs, we now need to orient faces (pick a circulation direction).

Orienting a Triangle

A triangle $\{v_0, v_1, v_2\}$ is oriented by choosing a cyclic order of its vertices — say counterclockwise: $[v_0, v_1, v_2]$. Its oriented boundary is the cycle of edges traversed in that order:

Oriented boundary of a triangle
$$\partial \sigma_1 = \partial[v_0, v_1, v_2] = [v_0 \to v_1] + [v_1 \to v_2] + [v_2 \to v_0]$$

Now, each edge already has its own orientation from Chapter 1 (e.g., $a: v_0 \to v_1$). If the boundary traversal agrees with the edge orientation, the entry is $+1$; if it disagrees (we traverse the edge backwards), the entry is $-1$.

Oriented Boundaries of the Two Faces σ₁ = [v₀, v₁, v₂] a: 0→1 ✓ (+1) c: 1→2 ✓ (+1) b: need 2→0 but b = 0→2 ✗ (−1) 0 1 2 ∂σ₁ = +a − b + c σ₂ = [v₀, v₂, v₃] b: 0→2 ✓ (+1) e: 2→3 ✓ (+1) d: need 3→0 but d = 0→3 ✗ (−1) 0 2 3 ∂σ₂ = +b − d + e
Figure 4.1. Oriented boundaries of the two faces. Green arrows mark edges whose orientation agrees with the boundary traversal (+1). Red arrows mark edges traversed opposite to their assigned orientation (−1). The boundary formula sums the edges with these signs.

The Full $\mathbf{B}_{1,2}$ Matrix

Assembling the boundary formulas $\partial\sigma_1 = a - b + c$ and $\partial\sigma_2 = b - d + e$ into a matrix (rows = edges, columns = faces):

B₁₂ (5 edges × 2 faces) σ₁ σ₂ a b c d e [ +1 0 ] [ −1 +1 ] [ +1 0 ] [ 0 −1 ] [ 0 +1 ] ← edge b appears in both faces (shared boundary) ← edge d only in σ₂, with reversed orientation Verify ∂² = 0: B₁ · B₁₂ = ? Each column of B₁·B₁₂ sums the signed vertices around a face loop → always 0
Figure 4.2. The incidence matrix $\mathbf{B}_{1,2}$ connecting edges to faces. Column $\sigma_1$ encodes $\partial\sigma_1 = a - b + c$; column $\sigma_2$ encodes $\partial\sigma_2 = b - d + e$. The product $\mathbf{B}_1 \cdot \mathbf{B}_{1,2} = \mathbf{0}$ — this is the discrete $\partial^2 = 0$ identity.

Physics meaning of $\partial^2 = 0$: The boundary of a boundary is empty. Walk around the edge of face $\sigma_1$: you visit vertices $v_0 \to v_1 \to v_2 \to v_0$, returning to where you started. Each vertex is entered and exited — the net "vertex charge" is zero. This is why $\nabla \times (\nabla f) = 0$ (curl of gradient is zero) — it's the same identity one dimension up.


05Edge Signals and the Discrete Curl

A 1-cochain (edge signal) assigns a value to each edge — think of it as a flow, a current, or a velocity field component along each edge. The coboundary operator $\mathbf{B}_{1,2}^\top$ acts as the discrete curl: it measures the net circulation of an edge signal around each face.

Definition — Discrete Curl

For an edge signal $\mathbf{f} \in \mathbb{R}^5$ (one value per edge), the curl is:

$$(\text{curl}\;\mathbf{f})_\sigma = (\mathbf{B}_{1,2}^\top \mathbf{f})_\sigma = \sum_{e \in \partial\sigma} [\text{sign}] \cdot f_e$$

This sums the edge values around face $\sigma$, with signs determined by orientation agreement. A nonzero curl means there is net circulation around that face.

Worked Example

Consider the edge signal $\mathbf{f} = (2, -1, 3, 0, 1)^\top$ on edges $a, b, c, d, e$ — imagine these as flow rates along each edge:

Discrete Curl: Measuring Circulation Around Faces +2 −1 +3 0 +1 a b c d e Curl at σ₁ (boundary: +a − b + c): (+1)(2) + (−1)(−1) + (+1)(3) = 2 + 1 + 3 = 6 ← strong vortex! Curl at σ₂ (boundary: +b − d + e): (+1)(−1) + (−1)(0) + (+1)(1) = −1 + 0 + 1 = 0 ← irrotational curl f = B₁₂ᵀf = (6, 0)ᵀ
Figure 5.1. Computing the discrete curl. The edge signal $\mathbf{f} = (2,-1,3,0,1)$ has strong counterclockwise circulation around $\sigma_1$ (curl = 6) but zero net circulation around $\sigma_2$ (curl = 0). This is the exact analogue of $\nabla \times \mathbf{F}$ evaluated on each face.

The Gradient–Curl Identity: curl(grad) = 0

If an edge signal is the gradient of a vertex potential — $\mathbf{f} = \mathbf{B}_1^\top \boldsymbol{\phi}$ for some vertex signal $\boldsymbol{\phi}$ — then its curl is automatically zero:

The fundamental identity
$$\mathbf{B}_{1,2}^\top (\mathbf{B}_1^\top \boldsymbol{\phi}) = (\mathbf{B}_{1,2}^\top \mathbf{B}_1^\top) \boldsymbol{\phi} = \mathbf{0} \cdot \boldsymbol{\phi} = \mathbf{0}$$
Numerical verification with φ = (10, 5, 8, 3): Step 1: grad φ = B₁ᵀφ = (5−10, 8−10, 8−5, 3−10, 3−8)ᵀ = (−5, −2, 3, −7, −5)ᵀ Step 2: curl(grad φ) = B₁₂ᵀ(−5,−2,3,−7,−5)ᵀ σ₁: (+1)(−5) + (−1)(−2) + (+1)(3) = −5+2+3 = 0 σ₂: (+1)(−2) + (−1)(−7) + (+1)(−5) = −2+7−5 = 0
Figure 5.2. A gradient field has zero curl — verified numerically. The potential differences around any closed loop always cancel, just like in electrostatics: $\oint \nabla\phi \cdot d\mathbf{l} = 0$.

06The Hodge Laplacian on Edges: $\mathbf{L}_1$

In Chapter 1, the graph Laplacian $\mathbf{L}_0 = \mathbf{B}_1\mathbf{B}_1^\top$ governed diffusion on vertices. Now we need an analogous operator for edges. The Hodge Laplacian $\mathbf{L}_1$ combines information from both the rank below (vertices) and the rank above (faces):

Definition — Hodge Laplacian on Edges
$$\mathbf{L}_1 = \underbrace{\mathbf{B}_1^\top \mathbf{B}_1}_{\mathbf{L}_1^{\text{down}}\;(5 \times 5)} + \underbrace{\mathbf{B}_{1,2} \mathbf{B}_{1,2}^\top}_{\mathbf{L}_1^{\text{up}}\;(5 \times 5)}$$

The lower Laplacian $\mathbf{L}_1^{\text{down}}$ captures how edges relate through shared vertices (below). The upper Laplacian $\mathbf{L}_1^{\text{up}}$ captures how edges relate through shared faces (above). Together they measure how an edge signal deviates from being both curl-free and divergence-free.

Computing $\mathbf{L}_1$ Step by Step

Building the Hodge Laplacian L₁ = L₁ᵈᵒʷⁿ + L₁ᵘᵖ L₁ᵈᵒʷⁿ = B₁ᵀB₁ (via shared vertices) a b c d e a[ 2 1 -1 1 0] b[ 1 2 1 1 -1] c[-1 1 2 0 -1] d[ 1 1 0 2 1] e[ 0 -1 -1 1 2] Diagonal = # shared vertices per edge (always 2) L₁ᵘᵖ = B₁₂B₁₂ᵀ (via shared faces) a b c d e a[ 1 -1 1 0 0] b[-1 2 -1 -1 1] c[ 1 -1 1 0 0] d[ 0 -1 0 1 -1] e[ 0 1 0 -1 1] Diagonal = # faces each edge bounds (1 or 2) + = L₁ = L₁ᵈᵒʷⁿ + L₁ᵘᵖ (full Hodge Laplacian on edges) a b c d e a[ 3 0 0 1 0] b[ 0 4 0 0 0] c[ 0 0 3 0 -1] d[ 1 0 0 3 0] e[ 0 0 -1 0 3] Edge b (shared between both faces) has the highest diagonal value (4)
Figure 6.1. Construction of the Hodge Laplacian on edges. The lower part (from shared vertices) and upper part (from shared faces) combine to give $\mathbf{L}_1$. Note that $\mathbf{L}_1$ is not simply the graph Laplacian on edges — it incorporates higher-order structure from the faces. Eigenvalues: $\lambda = (2, 2, 4, 4, 4)$ — no zero eigenvalue, meaning $\beta_1 = 0$ (no independent loops).

The two parts have different physics: $\mathbf{L}_1^{\text{down}}$ measures how an edge signal fails to be divergence-free (related to the gradient part). $\mathbf{L}_1^{\text{up}}$ measures how it fails to be curl-free (related to the face circulation). An edge signal in the kernel of $\mathbf{L}_1$ (a harmonic 1-cochain) is simultaneously divergence-free and curl-free — it represents a topological feature of the complex (an independent loop). Here $\ker \mathbf{L}_1 = \{0\}$, meaning there are no such loops: every cycle is the boundary of some combination of faces.

EM analogy: On a simplicial mesh, $\mathbf{L}_1^{\text{down}}$ is the discrete $\nabla(\nabla\cdot)$ and $\mathbf{L}_1^{\text{up}}$ is the discrete $-\nabla\times(\nabla\times)$. Their sum $\mathbf{L}_1 = \nabla(\nabla\cdot) - \nabla\times(\nabla\times)$ is the vector Laplacian $\nabla^2$ — this is the vector identity $\nabla^2\mathbf{F} = \nabla(\nabla\cdot\mathbf{F}) - \nabla\times(\nabla\times\mathbf{F})$ made discrete.