Heat Equation Finite Element Method

# Heat Equation Finite Element Method

This tutorial will introduce you to the functionality for solving a PDE. Other introductions can be found by checking out DiffEqTutorials.jl. This tutorial assumes you have read the Ordinary Differential Equations tutorial.

In this example we will solve the heat equation $u_t=Δu+f$. To do this, we define a HeatProblem which contains the function $f$ and the boundary conditions. We specify one as follows:

f(t,x,u)  = ones(size(x,1)) - .5u
u0_func(x) = zeros(size(x,1))

Here the equation we chose was nonlinear since $f$ depends on the variable $u$. Thus we specify f=f(u,x,t). If $f$ did not depend on u, then we would specify f=f(x,t). We do need to specify $gD$ (the Dirichlet boundary condition) and $gN$ (the Neumann boundary condition) since both are zero. $u_0$ specifies the initial condition. These together give a HeatProblem object which holds everything that specifies a Heat Equation Problem.

We then generate a mesh. We will solve the equation on the parabolic cylinder $[0,1]^2 \times [0,1]$. You can think of this as the cube, or at every time point from 0 to 1, the domain is the unit square. To generate this mesh, we use the command

tspan = (0.0,1.0)
dx = 1//2^(3)
dt = 1//2^(7)
mesh = parabolic_squaremesh([0 1 0 1],dx,dt,tspan,:neumann)
u0 = u0_func(mesh.node)
prob = HeatProblem(u0,f,mesh)

Notice that here we used the mesh to generate our u0 from a function which specifies u0. We then call the solver

sol = solve(prob,FEMDiffEqHeatImplicitEuler())

Here we have chosen to use the ImplicitEuler algorithm to solve the equation. Other algorithms and their descriptions can be found in the solvers part of the documentation.