view benchmarks/laplace_benchmark.jl @ 1894:7a79e7f36ad4 laplace_benchmarks

Close branch
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 31 Jan 2025 10:56:57 +0100
parents 4f3924293894
children
line wrap: on
line source

using Sbplib.Grids, Sbplib.SbpOperators, Sbplib.LazyTensors, Sbplib.RegionIndices
using Profile, BenchmarkTools

function apply_laplace!(f, u, L, inds)
    for I in inds
        f[I] = (L*u)[I]
    end
end

apply_laplace!(f, u, L) = apply_laplace!(f, u, L, eachindex(u))

region_indices(L, N, ::Lower) = map(x->Index{Lower}(x),1:closure_size(L))
region_indices(L, N, ::Interior) = map(x->Index{Interior}(x),closure_size(L)+1:N-closure_size(L))
region_indices(L, N, ::Upper) = map(x->Index{Upper}(x),N-closure_size(L)+1:N)

function get_region_indices(L,N)
    ind_lower = region_indices(L, N, Lower())
    ind_interior = region_indices(L, N, Interior())
    ind_upper = region_indices(L, N, Upper())
    return (ind_lower, ind_interior, ind_upper)
end

function apply_laplace_regions!(f, u, L, region_inds)
    apply_laplace!(f, u, L, region_inds[1])
    apply_laplace!(f, u, L, region_inds[2])
    apply_laplace!(f, u, L, region_inds[3])
end

# Domain
N = 4001
g = EquidistantGrid(N,0.,1.)

# Operators
L = Laplace(g,sbp_operators_path()*"standard_diagonal.toml"; order=4)
u = evalOn(g,x->x^2)
f = similar(u)

apply_laplace!(f,u,L) #ensure compilation
@btime apply_laplace!(f,u,L)
rinds = get_region_indices(L,N)
apply_laplace_regions!(f,u,L,rinds) #ensure compilation
@btime apply_laplace_regions!(f,u,L,rinds)