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.
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.
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:
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$.
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):
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.
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:
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:
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):
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
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.