Mercurial > repos > public > sbplib_julia
changeset 1700:87d603499fc3 feature/sbp_operators/laplace_curvilinear
Merge feature/lazy_tensors/sparse_conversions
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 03 Sep 2024 08:38:27 +0200 |
parents | 3eb4e584425c (current diff) 3e9c3986930d (diff) |
children | 3684db043add |
files | Project.toml |
diffstat | 8 files changed, 149 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/Project.toml Wed Aug 28 14:34:33 2024 +0200 +++ b/Project.toml Tue Sep 03 08:38:27 2024 +0200 @@ -12,10 +12,15 @@ [weakdeps] Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" +SparseArrayKit = "a9a3c162-d163-4c15-8926-b8794fbefed2" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +Tokens = "040c2ec2-8d69-4aca-bf03-7d3a7092f2f6" [extensions] SbplibPlotsExt = "Plots" SbplibMakieExt = "Makie" +SbplibSparseArrayKitExt = ["SparseArrayKit", "Tokens"] +SbplibSparseArraysExt = ["SparseArrays", "Tokens"] [compat] julia = "1.5"
--- a/TODO.md Wed Aug 28 14:34:33 2024 +0200 +++ b/TODO.md Tue Sep 03 08:38:27 2024 +0200 @@ -33,6 +33,7 @@ - [ ] Kolla att vi har @inline på rätt ställen - [ ] Profilera + - [ ] Keep a lookout for allowing dependencies of package extensions (https://github.com/JuliaLang/Pkg.jl/issues/3641) This should be used to simplify the matrix extensions so that you don't have to load Tokens which is only used internally to the extension ### Grids
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/SbplibSparseArrayKitExt.jl Tue Sep 03 08:38:27 2024 +0200 @@ -0,0 +1,14 @@ +module SbplibSparseArrayKitExt + +using Sbplib +using Sbplib.LazyTensors + +using SparseArrayKit +using Tokens + +function SparseArrayKit.SparseArray(t::LazyTensor) + v = ArrayToken(:v, domain_size(t)...) + return Tokens._to_tensor(t*v, range_size(t), domain_size(t)) +end + +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/SbplibSparseArraysExt.jl Tue Sep 03 08:38:27 2024 +0200 @@ -0,0 +1,17 @@ +module SbplibSparseArraysExt + +using Sbplib +using Sbplib.LazyTensors + +using SparseArrays +using Tokens + +function SparseArrays.sparse(t::LazyTensor) + v = ArrayToken(:v, prod(domain_size(t))) + + v̄ = reshape(v,domain_size(t)...) + tv = reshape(t*v̄, :) + return Tokens._to_matrix(tv, prod(range_size(t)), prod(domain_size(t))) +end + +end
--- a/test/Manifest.toml Wed Aug 28 14:34:33 2024 +0200 +++ b/test/Manifest.toml Tue Sep 03 08:38:27 2024 +0200 @@ -2,7 +2,7 @@ julia_version = "1.10.4" manifest_format = "2.0" -project_hash = "f2b0634c12bbed93a17efc88d466604d5a07c465" +project_hash = "9dddd5385164ee197d1b3f22302bc95701c1f5e5" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" @@ -176,6 +176,12 @@ uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.5+0" +[[deps.PackageExtensionCompat]] +git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" +uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" +version = "1.0.2" +weakdeps = ["Requires", "TOML"] + [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" @@ -231,6 +237,20 @@ [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +[[deps.SparseArrayKit]] +deps = ["LinearAlgebra", "PackageExtensionCompat", "TupleTools", "VectorInterface"] +git-tree-sha1 = "e06f75c460c16b5b08bf93324b7db2cf9c1fe831" +uuid = "a9a3c162-d163-4c15-8926-b8794fbefed2" +version = "0.3.1" + + [deps.SparseArrayKit.extensions] + SparseArrayKitSparseArrays = "SparseArrays" + SparseArrayKitTensorOperations = "TensorOperations" + + [deps.SparseArrayKit.weakdeps] + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2" + [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" @@ -297,6 +317,12 @@ uuid = "98d24dd4-01ad-11ea-1b02-c9a08f80db04" version = "3.0.0" +[[deps.Tokens]] +deps = ["SparseArrayKit", "SparseArrays"] +git-tree-sha1 = "719b0bdaa0d28fea79796f586b67e576d9ca0c26" +uuid = "040c2ec2-8d69-4aca-bf03-7d3a7092f2f6" +version = "0.1.1" + [[deps.Tullio]] deps = ["DiffRules", "LinearAlgebra", "Requires"] git-tree-sha1 = "6d476962ba4e435d7f4101a403b1d3d72afe72f3" @@ -315,6 +341,11 @@ FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" +[[deps.TupleTools]] +git-tree-sha1 = "41d61b1c545b06279871ef1a4b5fcb2cac2191cd" +uuid = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" +version = "1.5.0" + [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" @@ -322,6 +353,12 @@ [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +[[deps.VectorInterface]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "7aff7d62bffad9bba9928eb6ab55226b32a351eb" +uuid = "409d34a3-91d5-4945-b6ec-7529ddf182d8" +version = "0.4.6" + [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
--- a/test/Project.toml Wed Aug 28 14:34:33 2024 +0200 +++ b/test/Project.toml Tue Sep 03 08:38:27 2024 +0200 @@ -2,8 +2,11 @@ BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" Glob = "c27321d9-0574-5035-807b-f59d2c89b15c" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +SparseArrayKit = "a9a3c162-d163-4c15-8926-b8794fbefed2" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TestSetExtensions = "98d24dd4-01ad-11ea-1b02-c9a08f80db04" +Tokens = "040c2ec2-8d69-4aca-bf03-7d3a7092f2f6" Tullio = "bc48ee85-29a4-5162-ae0b-a64e1601d4bc"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/ext/sparse_array_kit_test.jl Tue Sep 03 08:38:27 2024 +0200 @@ -0,0 +1,36 @@ +using Test + +using Sbplib +using Sbplib.Grids +using Sbplib.SbpOperators +using Sbplib.RegionIndices + +using SparseArrayKit +using Tokens +using Tullio + + +@testset "SparseArray" begin + g = equidistant_grid((0,0),(1,2), 20,30) + stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order=4) + + + @testset let Δ = laplace(g, stencil_set), M = SparseArray(Δ) + @test ndims(M) == 4 + @test size(M) == (20,30,20,30) + + v = rand(size(g)...) + @tullio Mv[i,j] := M[i,j,k,l]*v[k,l] + + @test Mv ≈ Δ*v + end + + @testset let dₙ = normal_derivative(g, stencil_set,CartesianBoundary{1,Lower}()), M = SparseArray(dₙ) + @test ndims(M) == 3 + @test size(M) == (30,20,30) + + v = rand(size(g)...) + @tullio Mv[i] := M[i,j,k]*v[j,k] + @test Mv ≈ dₙ*v + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/ext/sparse_arrays_test.jl Tue Sep 03 08:38:27 2024 +0200 @@ -0,0 +1,35 @@ +using Test + +using Sbplib +using Sbplib.Grids +using Sbplib.SbpOperators +using Sbplib.RegionIndices + +using SparseArrays +using Tokens + + +@testset "SparseArray" begin + g = equidistant_grid((0,0),(1,2), 20,30) + stencil_set = read_stencil_set(sbp_operators_path()*"standard_diagonal.toml"; order=4) + + + @testset let Δ = laplace(g, stencil_set), M = sparse(Δ) + @test ndims(M) == 2 + @test size(M) == (20*30,20*30) + + v = rand(size(g)...) + + Mv = M*reshape(v,:) + @test Mv ≈ reshape(Δ*v,:) + end + + @testset let dₙ = normal_derivative(g, stencil_set,CartesianBoundary{1,Lower}()), M = sparse(dₙ) + @test ndims(M) == 2 + @test size(M) == (30,20*30) + + v = rand(size(g)...) + Mv = M*reshape(v,:) + @test Mv ≈ reshape(dₙ*v,:) + end +end