| 
 | 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