105 : Nonlinear Poisson Equation

(source code)

This examples solves the nonlinear Poisson problem

\[\begin{aligned} - \epsilon \partial^2 u / \partial x^2 + e^u - e^{-u} & = f && \text{in } \Omega \end{aligned}\]

where

\[f(x) = \begin{cases} 1 & x \geq 0.5, -1 & x < 0.5. \end{cases}\]

on the domain $\Omega := (0,1)$ with Dirichlet boundary conditions $u(0) = 0$ and $u(1) = 1$.

The solution looks like this:

module Example105_NonlinearPoissonEquation

using ExtendableFEM
using ExtendableGrids

# rigt-hand side data
function f!(result, qpinfo)
    result[1] = qpinfo.x[1] < 0.5 ? -1 : 1
    return nothing
end
# boundary data
function boundary_data!(result, qpinfo)
    result[1] = qpinfo.x[1]
    return nothing
end

# kernel for the (nonlinear) reaction-convection-diffusion operator
function nonlinear_kernel!(result, input, qpinfo)
    u, ∇u, ϵ = input[1], input[2], qpinfo.params[1]
    result[1] = exp(u) - exp(-u)
    result[2] = ϵ * ∇u
    return nothing
end

# everything is wrapped in a main function
function main(; Plotter = nothing, h = 1.0e-2, ϵ = 1.0e-3, order = 2, kwargs...)

    # problem description
    PD = ProblemDescription("Nonlinear Poisson Equation")
    u = Unknown("u"; name = "u")
    assign_unknown!(PD, u)
    assign_operator!(PD, NonlinearOperator(nonlinear_kernel!, [id(u), grad(u)]; params = [ϵ], kwargs...))
    assign_operator!(PD, LinearOperator(f!, [id(u)]; store = true, kwargs...))
    assign_operator!(PD, InterpolateBoundaryData(u, boundary_data!; kwargs...))

    # discretize: grid + FE space
    xgrid = simplexgrid(0:h:1)
    FES = FESpace{H1Pk{1, 1, order}}(xgrid)

    # generate a solution vector and solve
    sol = solve(PD, FES; kwargs...)

    # plot discrete and exact solution (on finer grid)
    plt = plot([id(u)], sol; Plotter = Plotter)

    return sol, plt
end

end

This page was generated using Literate.jl.