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.