using Random using SHTOOLS using Test ################################################################################ # Legendre Polynomials @testset "PlmBar" begin p = PlmBar(4, 0) p′ = zeros(15) PlmBar!(p′, 4, 0) @test p′ == p p, dp = PlmBar_d1(4, 0) dp′ = zeros(15) PlmBar_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp p = PlBar(4, 0) p′ = zeros(5) PlBar!(p′, 4, 0) @test p′ == p p, dp = PlBar_d1(4, 0) dp′ = zeros(5) PlBar_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp end @testset "PlmON" begin p = PlmON(4, 0) p′ = zeros(15) PlmON!(p′, 4, 0) @test p′ == p p, dp = PlmON_d1(4, 0) dp′ = zeros(15) PlmON_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp p = PlON(4, 0) p′ = zeros(5) PlON!(p′, 4, 0) @test p′ == p p, dp = PlON_d1(4, 0) dp′ = zeros(5) PlON_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp end @testset "PlmSchmidt" begin p = PlmSchmidt(4, 0) p′ = zeros(15) PlmSchmidt!(p′, 4, 0) @test p′ == p p, dp = PlmSchmidt_d1(4, 0) dp′ = zeros(15) PlmSchmidt_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp p = PlSchmidt(4, 0) p′ = zeros(5) PlSchmidt!(p′, 4, 0) @test p′ == p p, dp = PlSchmidt_d1(4, 0) dp′ = zeros(5) PlSchmidt_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp end @testset "PLegendreA" begin p = PLegendreA(4, 0) p′ = zeros(15) PLegendreA!(p′, 4, 0) @test p′ == p p, dp = PLegendreA_d1(4, 0) dp′ = zeros(15) PLegendreA_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp p = PLegendre(4, 0) p′ = zeros(5) PLegendre!(p′, 4, 0) @test p′ == p p, dp = PLegendre_d1(4, 0) dp′ = zeros(5) PLegendre_d1!(p′, dp′, 4, 0) @test p′ == p @test dp′ == dp end @testset "PlmIndex" begin index = PlmIndex(4, 3) @test index == 14 end ################################################################################ # Spherical harmonic transforms @testset "MakeGridDH and SHExpandDH" begin # Invent a random grid Random.seed!(0) n = 10 griddh = randn(n, n) # Calculate coefficients cilm, lmax = SHExpandDH(griddh, n) @test lmax == 4 # Go back to the grid (it will be low-pass filtered) griddh′, n′ = MakeGridDH(cilm, lmax) @test n′ == n # Go back to coefficients again (they must be the same) cilm′, lmax′ = SHExpandDH(griddh, n) @test lmax′ == lmax @test cilm′ == cilm # Go back to the grid again (it must the be same this time) griddh″, n″ = MakeGridDH(cilm′, lmax′) @test n″ == n @test griddh″ == griddh′ end @testset "MakeGridDHC and SHExpandDHC" begin # Invent a random grid Random.seed!(0) n = 10 griddh = randn(Complex{Float64}, n, n) # Calculate coefficients cilm, lmax = SHExpandDHC(griddh, n) @test lmax == 4 # Go back to the grid (it will be low-pass filtered) griddh′, n′ = MakeGridDHC(cilm, lmax) @test n′ == n # Go back to coefficients again (they must be the same) cilm′, lmax′ = SHExpandDHC(griddh, n) @test lmax′ == lmax @test cilm′ == cilm # Go back to the grid again (it must the be same this time) griddh″, n″ = MakeGridDHC(cilm′, lmax′) @test n″ == n @test griddh″ == griddh′ end @testset "SHExpandGLQ and MakeGridGLQ" begin Random.seed!(0) lmax = 4 zero, w = SHGLQ(nothing, lmax) # Invent a random grid gridglq = randn(lmax + 1, 2 * lmax + 1) # Calculate coefficients cilm = SHExpandGLQ(lmax, gridglq, w, nothing, zero) # Go back to the grid (it will be low-pass filtered) gridglq′ = MakeGridGLQ(cilm, lmax, nothing, zero) @test size(gridglq′) == size(gridglq) # Go back to coefficients again (they must be the same) cilm′ = SHExpandGLQ(lmax, gridglq′, w, nothing, zero) @test isapprox(cilm′, cilm) # Go back to the grid again (it must the be same this time) gridglq″ = MakeGridGLQ(cilm′, lmax, nothing, zero) @test size(gridglq″) == size(gridglq′) @test isapprox(gridglq″, gridglq′) latglq, longlq = GLQGridCoord(lmax) @test (length(latglq), length(longlq)) == size(gridglq) end @testset "SHExpandGLQC and MakeGridGLQC" begin Random.seed!(0) lmax = 4 zero, w = SHGLQ(nothing, lmax) # Invent a random grid gridglq = randn(Complex{Cdouble}, lmax + 1, 2 * lmax + 1) # Calculate coefficients cilm = SHExpandGLQC(lmax, gridglq, w, nothing, zero) # Go back to the grid (it will be low-pass filtered) gridglq′ = MakeGridGLQC(cilm, lmax, nothing, zero) @test size(gridglq′) == size(gridglq) # Go back to coefficients again (they must be the same) cilm′ = SHExpandGLQC(lmax, gridglq′, w, nothing, zero) @test isapprox(cilm′, cilm) # Go back to the grid again (it must the be same this time) gridglq″ = MakeGridGLQC(cilm′, lmax, nothing, zero) @test size(gridglq″) == size(gridglq′) @test isapprox(gridglq″, gridglq′) end @testset "SHExpandLSQ" begin Random.seed!(0) lmax = 2 n = (lmax + 1)^2 lat = π * rand(n) lon = 2π * rand(n) d = randn(n) weights = Float64[1 for i in 1:n] cilm, chi2 = SHExpandLSQ(d, lat, lon, n, lmax; weights=weights) @test size(cilm) == (2, lmax + 1, lmax + 1) @test abs(chi2) < 10 * eps(Float64) end @testset "MakeGrid2d" begin Random.seed!(0) lmax = 4 cilm = randn(2, lmax + 1, lmax + 1) interval = 15 # grid spacing in degrees grid = MakeGrid2d(cilm, lmax, interval) @test size(grid) == (180 ÷ interval + 1, 360 ÷ interval + 1) end @testset "MakeGridPoint" begin Random.seed!(0) # Choose random values lmax = 2 nmax = (lmax + 1)^2 lat = π * rand(nmax) lon = 2π * rand(nmax) values = randn(nmax) weights = Float64[1 for n in 1:nmax] # Expand cilm, chi2 = SHExpandLSQ(values, lat, lon, nmax, lmax; weights=weights) @test size(cilm) == (2, lmax + 1, lmax + 1) @test abs(chi2) < 10 * eps(Float64) # Convert back to values (they will be low-pass filtered) values′ = Float64[MakeGridPoint(cilm, lmax, lat[n], lon[n]) for n in 1:nmax] # Expand again (result must be the same) cilm′, chi2 = SHExpandLSQ(values′, lat, lon, nmax, lmax; weights=weights) @test abs(chi2) < 10 * eps(Float64) @test isapprox(cilm′, cilm) # Convert back to values (result must be the same this time) values″ = Float64[MakeGridPoint(cilm′, lmax, lat[n], lon[n]) for n in 1:nmax] @test isapprox(values″, values′) end @testset "MakeGridPointC" begin Random.seed!(0) # Choose random values lmax = 2 cilm = randn(Complex{Float64}, 2, lmax + 1, lmax + 1) lat = π * rand() lon = 2π * rand() value = MakeGridPointC(cilm, lmax, lat, lon) @test value isa Complex{Float64} end @testset "SHMultiply" begin Random.seed!(0) # Choose random values lmax1 = 2 lmax2 = 3 cilm1 = randn(2, lmax1 + 1, lmax1 + 1) cilm2 = randn(2, lmax2 + 1, lmax2 + 1) cilmout = SHMultiply(cilm1, lmax1, cilm2, lmax2) @test size(cilmout) == (2, lmax1 + lmax2 + 1, lmax1 + lmax2 + 1) end