Skip to content

Commit 7736b27

Browse files
authored
Merge pull request #37 from smillerc/rigid-body-transformations
Rigid body transformations
2 parents 48653f8 + b9e6b91 commit 7736b27

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

src/CurvilinearGrids.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ export extract_surface_mesh
4949
include("mesh_functions/estimate_yplus.jl")
5050
export estimate_wall_distance
5151

52+
include("mesh_functions/rigid_body_transformations.jl")
53+
export translate!, rotate!, scale!
54+
5255
include("remap.jl")
5356
export change_resolution, scale_resolution, remap_cell_data
5457

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using StaticArrays, Unitful
2+
import LinearAlgebra.cross, LinearAlgebra.dot
3+
4+
function translate!(grid::AbstractCurvilinearGrid1D, translation_vector::SVector)
5+
@assert length(size(grid.node_coordinates)) == length(translation_vector)
6+
7+
grid.node_coordinates.x[grid.iterators.node.domain] .+= translation_vector[1]
8+
9+
update!(grid; force=true)
10+
end
11+
function translate!(grid::AbstractCurvilinearGrid2D, translation_vector::SVector)
12+
@assert length(size(grid.node_coordinates)) == length(translation_vector)
13+
14+
grid.node_coordinates.x[grid.iterators.node.domain] .+= translation_vector[1]
15+
grid.node_coordinates.y[grid.iterators.node.domain] .+= translation_vector[2]
16+
17+
update!(grid; force=true)
18+
end
19+
function translate!(grid::AbstractCurvilinearGrid3D, translation_vector::SVector)
20+
@assert length(size(grid.node_coordinates)) == length(translation_vector)
21+
22+
grid.node_coordinates.x[grid.iterators.node.domain] .+= translation_vector[1]
23+
grid.node_coordinates.y[grid.iterators.node.domain] .+= translation_vector[2]
24+
grid.node_coordinates.z[grid.iterators.node.domain] .+= translation_vector[3]
25+
26+
update!(grid; force=true)
27+
end
28+
29+
function rotate!(grid::AbstractCurvilinearGrid2D, rotation_angle::Quantity{T, NoDims, typeof(Unitful.°)}) where {T}
30+
domain = grid.iterators.node.domain
31+
rotation_matrix = [cos(rotation_angle * u"°") -sin(rotation_angle * u"°");
32+
sin(rotation_angle * u"°") cos(rotation_angle * u"°")]
33+
point = Vector{Float64}(undef, 2)
34+
35+
for c in domain
36+
point[1] = grid.node_coordinates[c].x
37+
point[2] = grid.node_coordinates[c].y
38+
39+
grid.node_coordinates.x[c] = (rotation_matrix*point)[1]
40+
grid.node_coordinates.y[c] = (rotation_matrix*point)[2]
41+
end
42+
43+
update!(grid; force=true)
44+
end
45+
function rotate!(grid::AbstractCurvilinearGrid3D, axis_vector::SVector, rotation_angle::Quantity{T, NoDims, typeof(Unitful.°)}) where {T}
46+
@assert axis_vector[1]^2 + axis_vector[2]^2 + axis_vector[3]^2 == 1.0
47+
48+
domain = grid.iterators.node.domain
49+
point = Vector{Float64}(undef, 3)
50+
rotated_point = Vector{Float64}(undef, 3)
51+
52+
for c in domain
53+
point[1] = grid.node_coordinates[c].x
54+
point[2] = grid.node_coordinates[c].y
55+
point[3] = grid.node_coordinates[c].z
56+
57+
rotated_point .= (point .* cos(rotation_angle * u"°")) + (cross(axis_vector, point) .* sin(rotation_angle * u"°")) + (axis_vector .* dot(axis_vector, point) .* (1 - cos(rotation_angle * u"°")))
58+
59+
grid.node_coordinates.x[c] = rotated_point[1]
60+
grid.node_coordinates.y[c] = rotated_point[2]
61+
grid.node_coordinates.z[c] = rotated_point[3]
62+
end
63+
64+
update!(grid; force=true)
65+
end
66+
67+
function scale!(grid::AbstractCurvilinearGrid, anchor::SVector, factor)
68+
@assert length(size(grid.node_coordinates)) == length(anchor)
69+
domain = grid.iterators.node.domain
70+
fields = propertynames(grid.node_coordinates)
71+
for dim in eachindex(fields)
72+
getproperty(grid.node_coordinates, fields[dim])[domain] .-= anchor[dim]
73+
getproperty(grid.node_coordinates, fields[dim])[domain] .*= factor
74+
getproperty(grid.node_coordinates, fields[dim])[domain] .+= anchor[dim]
75+
end
76+
77+
update!(grid; force=true)
78+
end

0 commit comments

Comments
 (0)