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 input- AbstractVectorsimilar to- u, 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 for- u.- (m)
- approx_order: the order of the discretization in terms of O(dx^order).
- p: boundary padded- D.
- q: boundary padded- uobtained by- bc*u.
- dx: spacing of the discretization. If- dxis a- Number, the discretization is uniform. If- dxis an array, then the discretization is non-uniform.
- nknots: the length of discretization in the direction of operator.