Nonlinear Diffusion
This function handles expressions of the form ðₙ(D(ðₘu)) where n,m > 0 and D is a function of u i.e. they vary as u(x,t) and D(u). The expansion can be carried out via general Leibniz rule.
A boundary condition operator bc is first operated on u resulting in a boundary padded vector bc*u. Since D is a function of u, its discrete values can be obtained at grid points once u has been padded. After producing these two functions in the grid range, we can expand the given expression via binomial expansion through the nonlinear_diffusion and nonlinear_diffusion! functions and produce the final discretized derivatives.
The functions implicitly put the CenteredDifference operator to use for computing derivates of various orders, e.g. uᵏ = CenteredDifference(k,approx_order,dx,nknots)*u, helping us generate a symmetric discretization. The two functions differ in terms of memory allocation, since the non-! one will allocate memory to the output whereas the ! one can be used for non-allocating applications.
Functions
The two functions are as follows :
nonlinear_diffusion(second_differential_order::Int, first_differential_order::Int, approx_order::Int,
p::AbstractVector{T}, q::AbstractVector{T}, dx::Union{T , AbstractVector{T} , Real},
nknots::Int) where {T<:Real, N}
nonlinear_diffusion!(du::AbstractVector{T}, second_differential_order::Int, first_differential_order::Int,
approx_order::Int,p::AbstractVector{T}, q::AbstractVector{T},
dx::Union{T , AbstractVector{T} , Real}, nknots::Int) where {T<:Real, N}Arguments :
du: an inputAbstractVectorsimilar tou, to store the final discretized expression.second_differential_order: the overall order of derivative on the expression.(n)first_differential_order: the inner order of derivative to discretize foru.(m)approx_order: the order of the discretization in terms of O(dx^order).p: boundary paddedD.q: boundary paddeduobtained bybc*u.dx: spacing of the discretization. Ifdxis aNumber, the discretization is uniform. Ifdxis an array, then the discretization is non-uniform.nknots: the length of discretization in the direction of operator.