Skip to content

Commit 4dbd2e2

Browse files
authored
Add TranformedDomain (#1153)
* Add 'TranformedDomain' * Add docstring * Add some tests * Fix typo * Add more tests * Add comments
1 parent 86359bb commit 4dbd2e2

File tree

4 files changed

+109
-0
lines changed

4 files changed

+109
-0
lines changed

src/Meshes.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ export
289289
# domain traits
290290
Domain,
291291
SubDomain,
292+
TransformedDomain,
292293
embeddim,
293294
paramdim,
294295
crs,

src/domains.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ include("domains/sets.jl")
143143
include("domains/meshes.jl")
144144
include("domains/trajecs.jl")
145145
include("domains/subdomains.jl")
146+
include("domains/transformeddomain.jl")
146147

147148
# ------------
148149
# CONVERSIONS

src/domains/transformeddomain.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# ------------------------------------------------------------------
2+
# Licensed under the MIT License. See LICENSE in the project root.
3+
# ------------------------------------------------------------------
4+
5+
"""
6+
TransformedDomain(domain, transform)
7+
8+
Lazy representation of a geometric `transform` applied to a `domain`.
9+
"""
10+
struct TransformedDomain{M<:Manifold,C<:CRS,D<:Domain,T<:Transform} <: Domain{M,C}
11+
domain::D
12+
transform::T
13+
14+
function TransformedDomain{M,C}(domain::D, transform::T) where {M<:Manifold,C<:CRS,D<:Domain,T<:Transform}
15+
new{M,C,D,T}(domain, transform)
16+
end
17+
end
18+
19+
function TransformedDomain(d::Domain, t::Transform)
20+
g = t(first(d))
21+
TransformedDomain{manifold(g),crs(g)}(d, t)
22+
end
23+
24+
# specialize constructor to avoid deep structures
25+
TransformedDomain(d::TransformedDomain, t::Transform) = TransformedDomain(d.domain, d.transform t)
26+
27+
Base.parent(d::TransformedDomain) = d.domain
28+
29+
transform(d::TransformedDomain) = d.transform
30+
31+
# domain interface
32+
element(d::TransformedDomain, ind::Int) = d.transform(element(d.domain, ind))
33+
34+
nelements(d::TransformedDomain) = nelements(d.domain)

test/transformeddomain.jl

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
@testitem "TransformedDomain" setup = [Setup] begin
2+
# constructor
3+
pset = PointSet(randpoint2(10))
4+
trans1 = Scale(T(2), T(2))
5+
trans2 = Translate(T(4), T(4))
6+
tpset1 = TransformedDomain(pset, trans1)
7+
@test parent(tpset1) == pset
8+
@test Meshes.transform(tpset1) == trans1
9+
tpset2 = TransformedDomain(tpset1, trans2)
10+
@test parent(tpset2) == pset
11+
@test Meshes.transform(tpset2) == (trans1 trans2)
12+
13+
pset = PointSet(randpoint2(10))
14+
trans = Identity()
15+
tpset = TransformedDomain(pset, trans)
16+
@test nelements(tpset) == nelements(pset)
17+
@test element(tpset, 1) == element(pset, 1)
18+
@test tpset == pset
19+
trans = Translate(T(2), T(2))
20+
tpset = TransformedDomain(pset, trans)
21+
@test nelements(tpset) == nelements(pset)
22+
@test element(tpset, 1) == trans(element(pset, 1))
23+
@test tpset == trans(pset)
24+
25+
t1 = Triangle(cart(0, 0), cart(1, 0), cart(0, 1))
26+
t2 = Triangle(cart(1, 1), cart(2, 1), cart(1, 2))
27+
gset = GeometrySet([t1, t2])
28+
trans = Identity()
29+
tgset = TransformedDomain(gset, trans)
30+
@test nelements(tgset) == nelements(gset)
31+
@test element(tgset, 1) == element(gset, 1)
32+
@test tgset == gset
33+
trans = Translate(T(2), T(2))
34+
tgset = TransformedDomain(gset, trans)
35+
@test nelements(tgset) == nelements(gset)
36+
@test element(tgset, 1) == trans(element(gset, 1))
37+
@test tgset == trans(gset)
38+
39+
grid = cartgrid(10, 10)
40+
trans = Identity()
41+
tgrid = TransformedDomain(grid, trans)
42+
@test nelements(tgrid) == nelements(grid)
43+
@test element(tgrid, 1) == element(grid, 1)
44+
@test tgrid == grid
45+
trans = Translate(T(2), T(2))
46+
tgrid = TransformedDomain(grid, trans)
47+
@test nelements(tgrid) == nelements(grid)
48+
@test element(tgrid, 1) == trans(element(grid, 1))
49+
@test tgrid == trans(grid)
50+
51+
grid = cartgrid(10, 10)
52+
subgrid = view(grid, 1:10)
53+
trans = Identity()
54+
tsubgrid = TransformedDomain(subgrid, trans)
55+
@test nelements(tsubgrid) == nelements(subgrid)
56+
@test element(tsubgrid, 1) == element(subgrid, 1)
57+
@test tsubgrid == subgrid
58+
trans = Translate(T(2), T(2))
59+
tsubgrid = TransformedDomain(subgrid, trans)
60+
@test nelements(tsubgrid) == nelements(subgrid)
61+
@test element(tsubgrid, 1) == trans(element(subgrid, 1))
62+
@test tsubgrid == trans(subgrid)
63+
64+
# transforms that change the CRS
65+
pset = PointSet(latlon(0, 0), latlon(0, 45), latlon(45, 0))
66+
trans = Proj(Mercator)
67+
tpset = TransformedDomain(pset, trans)
68+
@test manifold(tpset) === 𝔼{2}
69+
@test crs(tpset) <: Mercator
70+
@test nelements(tpset) == nelements(pset)
71+
@test element(tpset, 1) == trans(element(pset, 1))
72+
@test tpset == trans(pset)
73+
end

0 commit comments

Comments
 (0)