#include "pde.h"
/* Grid Functions */
Grid2d::Grid2d(int ni, int nj) {
int i,j;
xpoints = ni;
ypoints = nj;
data = new double *[ni];
for (i = 0; i < ni; i++)
data[i] = new double[nj];
for (i = 0; i < xpoints; i++)
for (j = 0; j < ypoints; j++)
data[i][j] = 0.0;
}
Grid2d::~Grid2d() {
for (int i = 0; i < xpoints; i++) {
delete data[i];
}
delete data;
}
/* Heat2d methods */
Heat2d::Heat2d(int ni, int nj) {
work = new Grid2d(ni+1,nj+1);
grid = new Grid2d(ni+1,nj+1);
// Set a few parameters here
h = 1.0/ni;
k = 1.0/nj;
time = 0.0;
// Pick a safe value of 'dt'
dt = 0.125*1.0/(1.0/(h*h) + 1.0/(k*k));
}
/* Clean up */
Heat2d::~Heat2d() {
delete grid;
delete work;
}
/* Solve equations for a few timesteps */
void Heat2d::solve(int nsteps) {
double s,r, **u, **w;
int i,j,n;
Grid2d *temp;
r = dt/(h*h);
s = dt/(k*k);
if (r+s >= 0.5) {
printf("Warning : Unstable solution.\n");
}
for (n = 0; n < nsteps; n++) {
w = work->data;
u = grid->data;
for (i = 1; i < grid->xpoints-1; i++)
for (j = 1; j < grid->ypoints-1; j++) {
w[i][j] = (1.0-2*(r+s))*u[i][j] + r*(u[i+1][j] + u[i-1][j]) +
s*(u[i][j+1] + u[i][j-1]);
}
// Copy boundary points over
for (i = 0; i < grid->xpoints; i++) {
w[i][0] = u[i][0];
w[i][grid->ypoints-1] = u[i][grid->ypoints-1];
}
for (i = 0; i < grid->ypoints; i++) {
w[0][i] = u[0][i];
w[grid->xpoints-1][i] = u[grid->xpoints-1][i];
}
time += dt;
// Swap working and current data
temp = work;
work = grid;
grid = temp;
}
}
void Heat2d::set_temp(double temp) {
int i,j;
for (i = 0; i < grid->xpoints; i++)
for (j = 0; j < grid->ypoints; j++)
grid->data[i][j] = temp;
}
syntax highlighted by Code2HTML, v. 0.9.1