Skip to content

Commit

Permalink
Merge pull request #50 from AlgebraicJulia/one_dim
Browse files Browse the repository at this point in the history
ENH: Added 1D FreeExteriorCalculus Definition
  • Loading branch information
jpfairbanks committed Jun 24, 2022
2 parents 4432cf1 + 22d5dab commit 4b40624
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/ExteriorCalculus.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ module ExteriorCalculus
export Ob, Hom, dom, codom, compose, , id,
otimes, , munit, braid, oplus, , mzero, swap, coproduct, ,
mcopy, Δ, delete, ◊, plus, +, zero, antipode,
MetricFreeExtCalc1D, MetricFreeExtCalc2D, ExtCalc1D, ExtCalc2D, FreeExtCalc2D,
MetricFreeExtCalc1D, MetricFreeExtCalc2D, ExtCalc1D, FreeExtCalc1D,
ExtCalc2D, FreeExtCalc2D,
Space, Chain0, Chain1, Chain2, Form0, Form1, Form2,
∂₁, ∂₂, d₀, d₁, ₀₀, ₁₀, ₀₁, ₁₁, ₂₀, ₀₂, ι₁, ι₂, ℒ₀, ℒ₁, ℒ₂,
DualForm0, DualForm1, DualForm2, ₀, ₁, ₂, ₀⁻¹, ₁⁻¹, ₂⁻¹,
Expand Down Expand Up @@ -173,6 +174,14 @@ end
Δ₁(X) == δ₁(X) d₀(X) (X::Space)
end

@syntax FreeExtCalc1D{ObExpr,HomExpr,GATExpr} ExtCalc1D begin
compose(f::Hom, g::Hom) = associate_unit(new(f,g; strict=true), id)
oplus(A::Ob, B::Ob) = associate_unit(new(A,B), mzero)
oplus(f::Hom, g::Hom) = associate(new(f,g))
otimes(A::Ob, B::Ob) = associate_unit(new(A,B), munit)
otimes(f::Hom, g::Hom) = associate(new(f,g))
end

""" Theory of exterior calculus on 2D Riemannian manifold-like space.
"""
@theory ExtCalc2D{Ob,Hom,Space} <: MetricFreeExtCalc2D{Ob,Hom,Space} begin
Expand Down
31 changes: 31 additions & 0 deletions test/ExteriorCalculus.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,37 @@ using Test
using Catlab
using CombinatorialSpaces.ExteriorCalculus

############
# 1D Tests #
############

@present Diffusion1DQuantities(FreeExtCalc1D) begin
X::Space
C::Hom(munit(), Form0(X)) # concentration
ϕ::Hom(munit(), DualForm0(X)) # negative diffusion flux
k::Hom(Form1(X), Form1(X)) # diffusivity (usually scalar multiplication)
end

@present Diffusion1D <: Diffusion1DQuantities begin
# Fick's first law
ϕ == C d₀(X) k (X)
# Diffusion equation
C ∂ₜ(Form0(X)) == ϕ dual_d₀(X) ⁻¹(X)
end

@present Diffusion1D′ <: Diffusion1DQuantities begin
# Diffusion equation
C ∂ₜ(Form0(X)) == C d₀(X) k δ₁(X)
end

X, C, ϕ = Diffusion1D[:X], Diffusion1D[:C], Diffusion1D[]
@test codom(C) == Form0(X)
@test codom(ϕ) == DualForm0(X)

############
# 2D Tests #
############

@present Diffusion2DQuantities(FreeExtCalc2D) begin
X::Space
C::Hom(munit(), Form0(X)) # concentration
Expand Down

0 comments on commit 4b40624

Please sign in to comment.