Adding Kernels

If you need a different kernel function than the ones I implemented you can add them by defining a new kernel struct as a subtype of AbstractSPHKernel

struct MyKernel{T} <: AbstractSPHKernel
    dim::Int64
    norm::T
end

"""
    MyKernel(T::DataType=Float64, dim::Integer=3)

Set up a `MyKernel` kernel for a given DataType `T`.
"""
MyKernel(T::DataType=Float64, dim::Integer=3) = MyKernel{T}(dim, T(1))


"""
    MyKernel(dim::Integer)

Define `MyKernel` kernel with dimension `dim` for the native `DataType` of the OS.
"""
MyKernel(dim::Integer) = MyKernel{T}(typeof(1.0), dim)
Main.MyKernel

and defining its value and derivative, e.g.

function kernel_value(kernel::MyKernel{T}, u::Real, h_inv::Real) where T

    if u < 1
        n = kernel.norm * h_inv^kernel.dim
        return 1n |> T
    else
        return 0 |> T
    end

end
kernel_value (generic function with 1 method)
@inline function kernel_deriv(kernel::MyKernel{T}, u::Real, h_inv::Real) where T
    return 0 |> T
end
kernel_deriv (generic function with 1 method)

so you can run the following code

k = MyKernel()
u = 0.5
h_inv = 1.0

v = kernel_value(k, u, h_inv)
println("MyKernel value: $v")

d = kernel_deriv(k, u, h_inv)
println("MyKernel derivative: $d")
MyKernel value: 1.0
MyKernel derivative: 0.0

Contributing

Please feel free to create a pull request if you feel that your kernel could be useful to others! I only ask you to also add unit tests for your kernels in the test/runtests.jl file.