annotate src/Grids/mapped_grid.jl @ 1681:5ea0299b45b4 feature/grids/curvilinear

Add todo
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 11 Jul 2024 11:23:35 +0200
parents 3bbcd496e021
children 4ce9cb21220c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
1 struct MappedGrid{T,D, GT<:Grid{<:Any,D}, CT<:AbstractArray{T,D}, JT<:AbstractArray{<:AbstractArray{<:Any, 2}, D}} <: Grid{T,D}
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
2 logicalgrid::GT
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
3 physicalcoordinates::CT
1505
63101a1cd0e6 Remove some comments
Jonatan Werpers <jonatan@werpers.com>
parents: 1504
diff changeset
4 jacobian::JT
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
5 end
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
6
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
7 jacobian(g::MappedGrid) = g.jacobian
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
8 logicalgrid(g::MappedGrid) = g.logicalgrid
1431
6adf31ba6cfd Add `jacobian` and `logicalgrid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1430
diff changeset
9
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
10
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
11 # Indexing interface
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
12 Base.getindex(g::MappedGrid, I::Vararg{Int}) = g.physicalcoordinates[I...]
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
13 Base.eachindex(g::MappedGrid) = eachindex(g.logicalgrid)
1432
64b60b42d367 Implement indexing interface
Jonatan Werpers <jonatan@werpers.com>
parents: 1431
diff changeset
14
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
15 Base.firstindex(g::MappedGrid, d) = firstindex(g.logicalgrid, d)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
16 Base.lastindex(g::MappedGrid, d) = lastindex(g.logicalgrid, d)
1645
64452a678e7a Add todo
Jonatan Werpers <jonatan@werpers.com>
parents: 1570
diff changeset
17 # TODO: axes(...)?
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
18
1450
647c8b18b84f Implement iterator interface
Jonatan Werpers <jonatan@werpers.com>
parents: 1449
diff changeset
19 # Iteration interface
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
20
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
21 Base.iterate(g::MappedGrid) = iterate(g.physicalcoordinates)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
22 Base.iterate(g::MappedGrid, state) = iterate(g.physicalcoordinates, state)
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
23
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
24 Base.IteratorSize(::Type{<:MappedGrid{<:Any, D}}) where D = Base.HasShape{D}()
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
25 Base.length(g::MappedGrid) = length(g.logicalgrid)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
26 Base.size(g::MappedGrid) = size(g.logicalgrid)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
27 Base.size(g::MappedGrid, d) = size(g.logicalgrid, d)
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
28
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
29 boundary_identifiers(g::MappedGrid) = boundary_identifiers(g.logicalgrid)
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
30 boundary_indices(g::MappedGrid, id::TensorGridBoundary) = boundary_indices(g.logicalgrid, id)
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
31
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
32 function boundary_grid(g::MappedGrid, id::TensorGridBoundary)
1451
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
33 b_indices = boundary_indices(g.logicalgrid, id)
1503
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
34
1504
976f5784d7b9 Spelling
Jonatan Werpers <jonatan@werpers.com>
parents: 1503
diff changeset
35 # Calculate indices of needed jacobian components
1503
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
36 D = ndims(g)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
37 all_indices = SVector{D}(1:D)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
38 free_variable_indices = deleteat(all_indices, grid_id(id))
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
39 jacobian_components = (:, free_variable_indices)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
40
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
41 # Create grid function for boundary grid jacobian
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
42 boundary_jacobian = componentview((@view g.jacobian[b_indices...]) , jacobian_components...)
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
43 boundary_physicalcoordinates = @view g.physicalcoordinates[b_indices...]
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
44
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
45 return MappedGrid(
1451
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
46 boundary_grid(g.logicalgrid, id),
1503
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
47 boundary_physicalcoordinates,
704a84eef8b6 Add tests for boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1502
diff changeset
48 boundary_jacobian,
1451
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
49 )
2e08f3444354 Implement boundary_identifiers, and a wishful implementation of boundary_grid
Jonatan Werpers <jonatan@werpers.com>
parents: 1450
diff changeset
50 end
1430
9fc3c1af33e5 Add testsets and a few tests
Jonatan Werpers <jonatan@werpers.com>
parents: 1426
diff changeset
51
1527
69790e9d1652 Remove tests for refine and coarsen
Jonatan Werpers <jonatan@werpers.com>
parents: 1506
diff changeset
52 # TBD: refine and coarsen could be implemented once we have a simple manifold implementation.
69790e9d1652 Remove tests for refine and coarsen
Jonatan Werpers <jonatan@werpers.com>
parents: 1506
diff changeset
53 # Before we do, we should consider the overhead of including such a field in the mapped grid struct.
69790e9d1652 Remove tests for refine and coarsen
Jonatan Werpers <jonatan@werpers.com>
parents: 1506
diff changeset
54
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
55 function mapped_grid(x, J, size...)
1502
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
56 D = length(size)
1570
063a2bfb03da Fix bugs in calls to equidistant_grid after merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 1560
diff changeset
57 lg = equidistant_grid(ntuple(i->0., D), ntuple(i->1., D), size...)
1506
535f32316637 Rename from curvilinear to mapped
Jonatan Werpers <jonatan@werpers.com>
parents: 1505
diff changeset
58 return MappedGrid(
1502
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
59 lg,
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
60 map(x,lg),
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
61 map(J,lg),
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
62 )
a2dc80396808 Add functions `curvilinear_grid`
Jonatan Werpers <jonatan@werpers.com>
parents: 1501
diff changeset
63 end
1681
5ea0299b45b4 Add todo
Jonatan Werpers <jonatan@werpers.com>
parents: 1659
diff changeset
64 # TODO: Delete this function
1560
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
65
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
66 function jacobian_determinant(g::MappedGrid)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
67 return map(jacobian(g)) do ∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
68 det(∂x∂ξ)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
69 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
70 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
71
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
72 function geometric_tensor(g::MappedGrid)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
73 return map(jacobian(g)) do ∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
74 ∂x∂ξ'*∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
75 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
76 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
77
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
78 function geometric_tensor_inverse(g::MappedGrid)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
79 return map(jacobian(g)) do ∂x∂ξ
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
80 inv(∂x∂ξ'*∂x∂ξ)
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
81 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
82 end
5d32ecb98db8 Add functions for jacobian_determiant, geometric_tensor, geometric_tensor_inverse
Jonatan Werpers <jonatan@werpers.com>
parents: 1527
diff changeset
83
1659
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
84 """
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
85 normal(g::MappedGrid, boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
86
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
87 The outward pointing normal as a grid function on the boundary
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
88 """
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
89 function normal(g::MappedGrid, boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
90 b_indices = boundary_indices(g, boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
91 σ =_boundary_sign(component_type(g), boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
92 return map(jacobian(g)[b_indices...]) do ∂x∂ξ
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
93 ∂ξ∂x = inv(∂x∂ξ)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
94 k = grid_id(boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
95 σ*∂ξ∂x[k,:]/norm(∂ξ∂x[k,:])
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
96 end
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
97 end
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
98
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
99 function _boundary_sign(T, boundary)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
100 if boundary_id(boundary) == Upper()
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
101 return one(T)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
102 elseif boundary_id(boundary) == Lower()
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
103 return -one(T)
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
104 else
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
105 throw(ArgumentError("The boundary identifier must be either `Lower()` or `Upper()`"))
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
106 end
3bbcd496e021 Add function for computing the normal at the boundary of a mapped grid as a grid function
Jonatan Werpers <jonatan@werpers.com>
parents: 1645
diff changeset
107 end