Code covered by the BSD License

# Accelerating Heat Equation on the GPU

### Simone HÃ¤mmerle (view profile)

A GUI for comparing the performance of different implementations of the heat equation on CPU and GPU

heateq_cpu_ind(k, n, Ts, L, c,h)
```function [t, U] = heateq_cpu_ind(k, n, Ts, L, c,h)
% HEATEQ_CPU_IND Solves the 2D heat equation on the CPU using indexing
%
%    [t, U] = HEATEQ_CPU_IND(k, n, Ts, L, c)  returns a matrix U representing
%    the temperature at each row, column location.  The function discretizes a
%    2D square plate of length L and thermal diffusivity c by using n
%    points.  The function will perform k iterations using the timestep Ts.
%    h is the handles structure from heateqGUI
%
%    Example: Solve for the temperature on a 1 m -by- 1 m copper plate
%    after 10 seconds have elapsed.  The thermal diffusivity of copper is:
%    1.13e-4 m^2/s
%
%    [t, U] = heateq_cpu_ind(3e4, 100, 1e-2, 1, 1.13e-4);
%
%    Copyright 2013 The MathWorks, Inc.

tic;

% Calculate the mesh spacing
ms = L / n;

% Sanity Check: Ensure time step is small enough for stability
if Ts > 0.6*(ms^2/2/c)
Ts = 0.6*(ms^2/2/c);
warndlg(['Selected time step was too large and was changed to: ',num2str(Ts)]);
end

% Initialize the grid with starting temperatures
U = init_temp_distribution(n);

xy = linspace(0,1,n);
imagesc(xy, xy, U, 'Parent', h.axes1)
set(h.axes1, 'YDir', 'normal')
colorbar('peer', h.axes1)
set(h.axes1, 'NextPlot', 'ReplaceChildren')
set(h.tSimTime,'String','0')
drawnow

% set update rate
nextIter = 1;

% Calculate the coordinates for the neighboring grid points
north   = 1:n;
south   = 3:(n + 2);
current = 2:(n + 1);
east    = 3:(n + 2);
west    = 1:n;

% Perform k iterations
for iter = 1:k
U(current, current) = U(current, current) + c * Ts/(ms^2) * (U(north, current) + ...
U(south, current) - 4*U(current, current) + ...
U(current, east) + U(current, west));

if iter == updateIters(nextIter)
imagesc(xy, xy, U, 'Parent', h.axes1)
set(h.tSimTime,'String',num2str(iter*Ts, '%.1f'))
nextIter = nextIter + 1;
end
drawnow
if get(h.pbStartStop, 'Userdata') == 1
set(h.pbStartStop, 'Userdata', 0)
t = 0;
return
end
end

set(h.axes1, 'NextPlot', 'Replace')

t = toc;

function U = init_temp_distribution(n)

% Initialize each point on the grid to be at room temperature
U = 23*ones(n + 2);
T = 100;
% Create a temperature gradient at the boundary
U(1, :) = (1:(n + 2))*T/(n + 2);
U(end, :) = ((1:(n + 2)) + (n + 2))*T/2/(n + 2);
U(:, 1) = (1:(n + 2))*T/(n + 2);
U(:, end) = ((1:(n + 2)) + (n + 2))*T/2/(n + 2);```