changeset 1628:9cd2b8f81175 feature/grids/plotting

Add package extensions for Makie for plotting grids and gridfunctions
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 26 Apr 2024 22:19:30 +0200
parents 857dab1a3116
children 2fab141e4a9a
files Project.toml ext/SbplibMakieExt.jl
diffstat 2 files changed, 77 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/Project.toml	Mon Jun 24 13:54:33 2024 +0200
+++ b/Project.toml	Fri Apr 26 22:19:30 2024 +0200
@@ -8,5 +8,11 @@
 TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
 TiledIteration = "06e1c1a7-607b-532d-9fad-de7d9aa2abac"
 
+[weakdeps]
+Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
+
+[extensions]
+SbplibMakieExt = "Makie"
+
 [compat]
 julia = "1.5"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ext/SbplibMakieExt.jl	Fri Apr 26 22:19:30 2024 +0200
@@ -0,0 +1,71 @@
+module SbplibMakieExt
+
+using Sbplib.Grids
+using Makie
+
+
+function verticies_and_faces_and_values(g::Grid{<:Any,2}, gf::AbstractArray{<:Any, 2})
+    ps = map(Tuple, g)[:]
+    values = gf[:]
+
+    N = length(ps)
+
+    faces = Vector{NTuple{3,Int}}()
+
+    n,m = size(g)
+    Li = LinearIndices((1:n, 1:m))
+    for i ∈ 1:n-1, j = 1:m-1
+
+        # Add point in the middle of the patch to preserve symmetries
+        push!(ps, Tuple((g[i,j] + g[i+1,j] + g[i+1,j+1] + g[i,j+1])/4))
+        push!(values, (gf[i,j] + gf[i+1,j] + gf[i+1,j+1] + gf[i,j+1])/4)
+
+        push!(faces, (Li[i,j],     Li[i+1,j],   length(ps)))
+        push!(faces, (Li[i+1,j],   Li[i+1,j+1], length(ps)))
+        push!(faces, (Li[i+1,j+1], Li[i,j+1],   length(ps)))
+        push!(faces, (Li[i,j+1],   Li[i,j],     length(ps)))
+    end
+
+    verticies = permutedims(reinterpret(reshape,eltype(eltype(ps)), ps))
+    faces = permutedims(reinterpret(reshape,Int, faces))
+
+    return verticies, faces, values
+end
+
+
+function make_plot(g,gf)
+    v,f,c = verticies_and_faces_and_values(g,gf)
+    mesh(v,f,color=c,
+        shading = NoShading,
+    )
+end
+
+# scatter(collect(g)[:])
+
+function Makie.surface(g::Grid{<:Any,2}, gf::AbstractArray{<:Any, 2}; kwargs...)
+    surface(getindex.(g,1), getindex.(g,2), gf;
+        shading = NoShading,
+        kwargs...,
+    )
+end
+
+function Makie.mesh(g::Grid{<:Any,2}, gf::AbstractArray{<:Any, 2}; kwargs...)
+    v,f,c = verticies_and_faces_and_values(g, gf)
+    mesh(v,f,color=c,
+        shading = NoShading,
+        kwargs...,
+    )
+end
+
+function Makie.plot!(plot::Plot(Grid{<:Any,2},AbstractArray{<:Any, 2}))
+    # TODO: How to handle kwargs?
+    # v,f,c = verticies_and_faces_and_values(plot[1], plot[2])
+    r = @lift verticies_and_faces_and_values($(plot[1]), $(plot[2]))
+    v,f,c = (@lift $r[1]), (@lift $r[2]), (@lift $r[3])
+    mesh!(plot, v, f, color=c,
+        shading = NoShading,
+    )
+end
+
+Makie.convert_arguments(::Type{<:Scatter}, g::Grid) = (map(Tuple,collect(g)[:]),)
+end