1. Introduction

Spherefun has about 100 commands for computing with scalar- and vector-valued functions [1]. There is also some functionality for solving partial differential equations with the poisson and helmholtz commands. In this example, we show how the latter can be used to solve the heat equation on the sphere using an implicit time-stepping scheme.

The example code presented here can easily be adapted to solve more complicated equations involving diffusion.

2. Heat equation on the sphere

The heat equation on the sphere is defined by \begin{equation} u_t = \alpha\nabla^2 u, \end{equation} where $\nabla^2$ is the surface Laplacian (Laplace-Beltrami) operator and $\alpha>0$ is the coefficient of thermal diffusivity. The definition is completed by imposing an initial condition $u(\lambda,\theta,0) = u_0(\lambda,\theta,0)$, where $-\pi \leq \lambda \leq \pi$ is the longitudinal coordinate on the sphere and $0 \leq \theta \leq \pi$ is the latitudinal coordinate.

3. Implicit time discretization

In this example we consider discretizing (1) using the second-order backward differentiation formula (BDF2). In this method, the time derivative $u_t$ in (1) is replaced by the second-order accurate approximation $u_t \approx (3u_{n+1} - 4u_{n} + u_{n-1})/(2\Delta t)$, where $\Delta t$ is the time step and $u_n$ denotes the (approximate) solution at time $t=n\Delta t$. Substituting this into (1) and solving for $u_{n+1}$ gives the following partial differential equation (PDE) for the approximate solution $u_{n+1}$: \begin{equation} 3 u_{n+1} - 2\Delta t \alpha \nabla^2 u_{n+1} = 4 u_{n} - u_{n-1}. \end{equation} This equation can be rearranged as follows to reveal that it is a standard Helmholtz equation: \begin{equation} \nabla^2 u_{n+1} + K^2 u_{n+1} = \frac{K^2}{3}(4 u_{n} - u_{n-1}), \end{equation} where $K^2 = -3/(2 \Delta t \alpha)$.

The Spherefun command helmholtz can be used to solve (3) with optimal complexity [2].

4. An example with an analytic solution

We first consider solving (1) with an initial condition given by the following sum of spherical harmonics $Y_{\ell}^{m}(\lambda,\theta)$: $$ u_0(\lambda,\theta,0) = Y_{6}^{0}(\lambda,\theta) + \sqrt{\frac{14}{11}} Y_{6}^{6}(\lambda,\theta), $$ which is sometimes called the soccer ball function. First, we construct this initial condition in Spherefun and plot it.

u0 = spherefun.sphharm(6,0) + sqrt(14/11)*spherefun.sphharm(6,5);
plot(u0), colormap(flipud(hot)), caxis([-1 1.5]), colorbar, axis('off')

Since $Y_{\ell}^{m}$ is an eigenfunction of the surface Laplacian with eigenvalue $-\ell(\ell+1)$, the exact solution to (1) with the above initial condition is $$ u(\lambda,\theta,t) = e^{-42\alpha t} u_0(\lambda,\theta). $$

The code below solves (1) numerically with the discretization given in (3) to time $t=1$ using a time step of $\Delta t = 0.01$ and $\alpha=1/42$. Note that to bootstrap the BDF2 method (2) we first solve for $u_1$ using one step of BDF1 (backward Euler).

dt = 0.01;                         % Time step
tfinal = 1;                        % Stopping time
nsteps = ceil(tfinal/dt);          % Number of time steps
m = 20;                            % Spatial discretization
alpha = 1/42;                      % Diffusion constant
up = u0;                           % Previous time step

% Do one step of backward Euler
K = sqrt(1/(dt*alpha))*1i;         % Helmholtz frequency for BDF1
u = spherefun.helmholtz(K^2*up, K, m, m);

K = sqrt(3/(2*dt*alpha))*1i;       % Helmholtz frequency for BDF2
for n = 2:nsteps
    rhs = K^2/3*(4*u - up);
    up = u;
    u = spherefun.helmholtz(rhs, K, m, m);

    % Plot the solution every 25 time steps
    if ( mod(n, 25) == 0 )
        plot( u ), colormap(flipud(hot)), caxis([-1 1.5])
        title(sprintf('Time %1.2f',n*dt)), colorbar, axis('off'), snapnow
    end
end

The difference between the true solution and the computed solution is

utrue = exp(-42*alpha*tfinal)*u0;
norm(u-utrue)
ans =
     2.325280830910560e-05

The error here is dominated by temporal errors from the BDF2 method, as opposed to spatial discretization errors.

5. A more complicated example

In this second example we consider an initial condition for which there is no closed form solution. We set the initial heat profile to a sum of Gaussian bumps:

rng(10)
u0 = spherefun([]);
for bumps = 1:5
    x0 = 2*rand-1; y0 = sqrt(1-x0^2)*(2*rand-1); z0 = sqrt(1-x0^2-y0^2);
    u0 = u0 + spherefun(@(x,y,z) exp(-30*((x-x0).^2+(y-y0).^2+(z-z0).^2)));
end
plot(u0), colormap(flipud(hot)), colorbar, axis('off'), caxis([-0.05 1])

Since the sphere has no boundary, the total amount of heat is conserved: the mean of the solution at any time is equal to the mean of the the initial condition. We repeat the code above with this new initial condition, but now also plot a contour that tracks the mean of the initial condition solution, which can be computed using the command mean2:

meanu0 = mean2(u0);                % Mean of initial condition
dt = 0.01;                         % Time step
tfinal = 1;                        % Stopping time
nsteps = ceil(tfinal/dt);          % Number of time steps
m = 150;                           % Spatial discretization
alpha = 1/42;                      % Diffusion constant
up = u0;                           % Previous time step

% Do one step of backward Euler
K = sqrt(1/(dt*alpha))*1i;         % Helmholtz frequency for BDF1
u = spherefun.helmholtz(K^2*up, K, m, m);

K = sqrt(3/(2*dt*alpha))*1i;       % Helmholtz frequency for BDF2
for n = 2:nsteps
    rhs = K^2/3*(4*u - up);
    up = u;
    u = spherefun.helmholtz(rhs, K, m, m);   % Helmholtz solve

    % Plot the solution every 25 time steps
    if ( mod(n, 25) == 0 )
        plot( u ), colormap(flipud(hot)), caxis([-0.05 1]), hold on
        contour(u,[meanu0 meanu0],'b-'), hold off
        title(sprintf('Time %1.2f',n*dt)), colorbar, axis('off'), snapnow
    end
end

The numerical scheme preserves the mean value property to machine precision:

norm(meanu0 - mean2(u))
ans =
     1.762479051592436e-15

6. Future

In the future we hope to extend the technology of the new spin2 command in Chebfun, which is based on exponential integrators for stiff PDEs, to Spherefun. This has the potential to allow problems like the heat equation to be solved much more efficiently and accurately in time.

7. References

[1] A. Townsend, H. Wilber, and G. B. Wright, Computing with function in polar and spherical geometries I. The sphere, to appear in SIAM J. Sci. Comp., 2016

[2] A. Townsend and G. B. Wright, Fast spectral methods for partial differential equations in spherical and polar geometries, manuscript in preparation, 2016.