view test/Grids/multiblockgrids_test.jl @ 2028:06f4b2ab43e8 feature/grids/multiblock_grids

Implement boundary_grid
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 11 Apr 2025 15:58:17 +0200
parents 0f27ddff6f92
children
line wrap: on
line source

using Diffinitive.Grids
using StaticArrays


function multiblockgrid1d()
    g₁ = equidistant_grid(0,1,5)
    g₂ = equidistant_grid(1,2,5)
    g₃ = equidistant_grid(2,3,5)

    C = connection.([
        (1, UpperBoundary(), 2, LowerBoundary()),
        (2, UpperBoundary(), 3, LowerBoundary()),
    ])

    return [g₁,g₂,g₃], C
end

function multiblockgrid2d()
    g₁₁ = equidistant_grid((0,0),(1,1),5,5)
    g₁₂ = equidistant_grid((0,1),(1,2),5,5)
    g₂₁ = equidistant_grid((1,0),(2,1),11,11)
    g₂₂ = equidistant_grid((1,1),(2,2),5,5)

    C = map(((i1,d1,b1,i2,d2,b2),)->connection(i1,CartesianBoundary{d1,b1}(), i2, CartesianBoundary{d2,b2}()),[
        (1, 1, UpperBoundary, 2, 1, LowerBoundary),
        (3, 1, UpperBoundary, 4, 1, LowerBoundary),
        (1, 2, UpperBoundary, 3, 2, LowerBoundary),
        (2, 2, UpperBoundary, 4, 2, LowerBoundary),
    ])

    return [g₁₁, g₁₂, g₂₁, g₂₂], C
end

function multiblockgrid_matrix()
    g₁₁ = equidistant_grid((0,0),(1,1),5,5)
    g₁₂ = equidistant_grid((0,1),(1,2),5,5)
    g₂₁ = equidistant_grid((1,0),(2,1),11,11)
    g₂₂ = equidistant_grid((1,1),(2,2),5,5)

    C = map(((i1,d1,b1,i2,d2,b2),)->connection(CartesianIndex(i1),CartesianBoundary{d1,b1}(), CartesianIndex(i2), CartesianBoundary{d2,b2}()),[
        ((1,1), 1, UpperBoundary, (1,2), 1, LowerBoundary),
        ((2,1), 1, UpperBoundary, (2,2), 1, LowerBoundary),
        ((1,1), 2, UpperBoundary, (1,2), 2, LowerBoundary),
        ((2,1), 2, UpperBoundary, (2,2), 2, LowerBoundary),
    ])

    return [g₁₁ g₁₂; g₂₁ g₂₂], C
end

function multiblockgrid_dict()
    g₁ = equidistant_grid(0,1,5)
    g₂ = equidistant_grid(0,1,5)

    C = [connection(:a, UpperBoundary(), :b, LowerBoundary())]
    return Dict(:a=>g₁, :b=>g₂), C
end

@testset "MultiBlockGrid" begin
    @test MultiBlockGrid <: Grid

    @testset "Constructors" begin
        grids, connections = multiblockgrid1d()
        @test MultiBlockGrid(grids, connections) isa Grid{Float64,1}
        grids, connections = multiblockgrid1d()
        @test MultiBlockGrid(grids, connections) isa MultiBlockGrid{Float64,1}
        grids, connections = multiblockgrid2d()
        @test MultiBlockGrid(grids, connections) isa MultiBlockGrid{SVector{2,Float64},2}
        grids, connections = multiblockgrid_matrix()
        @test MultiBlockGrid(grids, connections) isa MultiBlockGrid{SVector{2,Float64},2}
        grids, connections = multiblockgrid_dict()
        @test MultiBlockGrid(grids, connections) isa MultiBlockGrid{Float64,1}
    end

    @testset "Accessors" begin
        @testset "grids" begin
            gs, cs = multiblockgrid1d()
            @test grids(MultiBlockGrid(gs, cs)) == gs

            gs, cs = multiblockgrid2d()
            @test grids(MultiBlockGrid(gs, cs)) == gs

            gs, cs = multiblockgrid_matrix()
            @test grids(MultiBlockGrid(gs, cs)) == gs

            gs, cs = multiblockgrid_dict()
            @test grids(MultiBlockGrid(gs, cs)) == gs
        end

        @testset "connections" begin
            gs, cs = multiblockgrid1d()
            @test connections(MultiBlockGrid(gs, cs)) == cs

            gs, cs = multiblockgrid2d()
            @test connections(MultiBlockGrid(gs, cs)) == cs

            gs, cs = multiblockgrid_matrix()
            @test connections(MultiBlockGrid(gs, cs)) == cs

            gs, cs = multiblockgrid_dict()
            @test connections(MultiBlockGrid(gs, cs)) == cs
        end
    end

    @testset "Base.getindex" begin
        gs, cs = multiblockgrid1d()
        @test MultiBlockGrid(gs, cs)[2] == gs[2]

        gs, cs = multiblockgrid2d()
        @test MultiBlockGrid(gs, cs)[3] == gs[3]

        gs, cs = multiblockgrid_matrix()
        @test MultiBlockGrid(gs, cs)[1,2] == gs[1,2]

        gs, cs = multiblockgrid_dict()
        @test MultiBlockGrid(gs, cs)[:a] == gs[:a]
    end

    @testset "boundary_identifiers" begin
        @test_broken false
    end

    @testset "boundary_grid" begin
        g1 = MultiBlockGrid(multiblockgrid1d()...)
        @test boundary_grid(g1, MultiBlockBoundary{1,LowerBoundary}()) == ZeroDimGrid(0.)
        @test boundary_grid(g1, MultiBlockBoundary{3,UpperBoundary}()) == ZeroDimGrid(3.)

        g2 = MultiBlockGrid(multiblockgrid2d()...)
        b1lb = MultiBlockBoundary{1,CartesianBoundary{1,LowerBoundary}}()
        @test boundary_grid(g2, b1lb) == TensorGrid(ZeroDimGrid(0.),equidistant_grid(0,1,5))

        gm = MultiBlockGrid(multiblockgrid_matrix()...)
        b21lb = MultiBlockBoundary{CartesianIndex(2,1),CartesianBoundary{2,LowerBoundary}}()
        @test boundary_grid(gm, b21lb) == TensorGrid(equidistant_grid(1,2,11),ZeroDimGrid(0.))
    end

    @testset "min_spacing" begin
        gs, cs = multiblockgrid2d()
        @test min_spacing(MultiBlockGrid(gs,cs)) isa Float64
        @test min_spacing(MultiBlockGrid(gs,cs)) == 0.1
    end

    @testset "refine" begin
        gs, cs = multiblockgrid2d()
        @test refine(MultiBlockGrid(gs,cs),2) isa MultiBlockGrid

        rg = refine(MultiBlockGrid(gs,cs),2)
        @test connections(rg) == cs
        @test grids(rg) == [
            equidistant_grid((0,0),(1,1),9,9),
            equidistant_grid((0,1),(1,2),9,9),
            equidistant_grid((1,0),(2,1),21,21),
            equidistant_grid((1,1),(2,2),9,9),
        ]
    end

    @testset "coarsen" begin
        gs, cs = multiblockgrid2d()
        @test coarsen(MultiBlockGrid(gs,cs),2) isa MultiBlockGrid

        cg = coarsen(MultiBlockGrid(gs,cs),2)
        @test connections(cg) == cs
        @test grids(cg) == [
            equidistant_grid((0,0),(1,1),3,3),
            equidistant_grid((0,1),(1,2),3,3),
            equidistant_grid((1,0),(2,1),6,6),
            equidistant_grid((1,1),(2,2),3,3),
        ]
    end

    @testset "boundary_indices" begin
        @test_broken false
    end

    @testset "eval_on" begin
        @test_broken false
    end

    @testset "Base.map" begin
        @test_broken false
    end
end


@testset "MultiBlockBoundary" begin
    @test MultiBlockBoundary{1,UpperBoundary}() isa BoundaryIdentifier

    @test grid_id(MultiBlockBoundary{1,UpperBoundary}()) == 1

    @test boundary_id(MultiBlockBoundary{1,UpperBoundary}()) == UpperBoundary()
end

@testset "connection" begin
    @test connection(1, UpperBoundary(), 2, LowerBoundary()) == (MultiBlockBoundary{1,UpperBoundary}(), MultiBlockBoundary{2,LowerBoundary}())
    @test connection(:a, UpperBoundary(), :b, LowerBoundary()) == (MultiBlockBoundary{:a,UpperBoundary}(), MultiBlockBoundary{:b,LowerBoundary}())
    @test connection((1, UpperBoundary(), 2, LowerBoundary())) == (MultiBlockBoundary{1,UpperBoundary}(), MultiBlockBoundary{2,LowerBoundary}())

    @test_throws Exception connection(1, UpperBoundary, 2, LowerBoundary())
    @test_throws Exception connection(1, UpperBoundary(), 2, LowerBoundary)
end