/*
This program implements the Jacobi algorithm to find the
steady-state temperature distribution on an insulated
two-dimensional plate, given constant boundary conditions.
For SIZE = 128 and EPSILON = 0.1, the program should print:
There are 11841 cells cooler than 50.00 degrees.
For SIZE = 128 and EPSILON = 2.0, the program should print:
There are 3852 cells cooler than 50.00 degrees
For SIZE = 32 and EPSILON = 2.0, the program should print:
There are 16044 cells cooler than 50.00 degrees (32 x 32 grid)
*/
#include <dpce.h>
#include <math.h>
#include <assert.h>
#include <stdio.h>
#define SIZE 32 /* Resolution of grid */
#define SHAPE_SIZE SIZE /* Size of defined shape */
#define TEMP 50.0 /* Arbitrary cut-off */
#define EPSILON 2.0
shape [SHAPE_SIZE][SHAPE_SIZE]cell;
int:cell active; /* 0 if cell boundary; 1 otherwise */
float:cell change; /* Change in temperature */
float:cell new; /* Newly calculated temperature */
float:cell old; /* Previous temperature */
main () {
float maxerr; /* Largest change in temp. over grid */
int cool_cells; /* Number of cells with temp. < TEMP */
int pass = 0;
where ((pcoord(cell,0) < SIZE) && (pcoord(cell,1) < SIZE)) {
where ((!pcoord(cell,0)) || (!pcoord(cell,1)) ||
(pcoord(cell,1) == (SIZE-1)))
{
old = new = 0.0;
printf("A: %d positions active\n", += (int:cell) 1);
}
else where (pcoord(cell,0) == (SIZE-1))
{
active = 0;
old = new = 100.0;
printf("B: %d positions active\n", += (int:cell) 1);
}
else
{
active = 1;
new = 50.0;
printf("C: %d positions active\n", += (int:cell) 1);
}
do { /* Compute steady-state temperatures */
where (active) {
/* BARR */
old = new;
/* BARR */
new = ([.-1][.]old + [.+1][.]old +
[.][.+1]old + [.][.-1]old) / 4.0;
maxerr = >?= fabs(old-new);
printf("Pass %3d, maxerr is %f\n", ++pass, maxerr);
}
} while (maxerr > EPSILON);
cool_cells = (+= (new < TEMP));
} /* where */
printf ("There are %d cells cooler than %5.2f degrees (%d x %d grid)\n",
cool_cells, TEMP, SIZE, SIZE);
if (SIZE == 32 && EPSILON == 2.0 && TEMP == 50.0)
assert (cool_cells == 692);
else if (SIZE == 128 && EPSILON == 0.1 && TEMP == 50.0)
assert (cool_cells == 11841);
else if (SIZE == 128 && EPSILON == 2.0 && TEMP == 50.0)
assert (cool_cells == 3852);
else
{
printf ("UNSUPPORTED #define COMBINATION FOR VALIDATION!\n");
}
}
Options:
©1995 Pacific-Sierra Research Corporation. All rights reserved.
Send comments or suggestions to dpce2 at crescentbaysoftware.com.