main()
{
int i,j,m,k=0;
float u[N][N];
float r[KR],b[KB],v[K];
int label[N][N],lab[K],rl[KR],bl[KB];
int rn,rs,bn,bs;
rn = (N+1)/2;
rs = N/2;
bn = rs;
bs = rn;
for(j=1;j<N-1;j++) /* set
interior values of label and u arrays */
{
for(i=1;i<N-1;i++)
{
label[i][j] = 1;
u[i][j] = 7;
}
}
for(j=0;j<N;j++) {u[j][0] = 15; label[j][0] = 0;}
/* set boundary values */
for(j=0;j<N;j++) {u[0][j] = 15; label[0][j] = 0;}
/* in label and u arrays */
for(j=0;j<N;j++) {u[N-1][j] = 1; label[N-1][j] = 0;}
for(j=0;j<N;j++) {u[j][N-1] = 1; label[j][N-1] = 0;}
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
{
lab[k] = label[i][j] ; /* write
2-d label array into 1-d array */
v[k] = u[i][j];
/* write 2-d u array into 1-d array */
k++;
}
}
for(k=0;k<KR;k++)
{
rl[k] = lab[2*k];
/* identify red cells in 1-d label array */
r[k] = v[2*k];
/* identify red cells in 1-d u array */
}
for(k=0;k<KB;k++)
{
bl[k] = lab[2*k+1]; /*
identify black cells in 1-d label array */
b[k] = v[2*k+1];
/* identify black cells in 1-d u array */
}
k = 0;
while(k < 50)
/* begin red-black iterations */
{
k++;
for(i=rn;i< KR-rn;i++) /* update all red cells using rl
to mask boundary */
{
r[i] = r[i] + .25*(b[i-1]+b[i]-4*r[i]+b[i-rn]+b[i+rs])*rl[i];
}
for(i=0;i<KR;i++)
{
v[2*i] = r[i];
/* store red values in 1-d u-array */
}
m=0;
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
{
u[i][j] = v[m];
/* write 1-d u-array into 2-d u-array */
m++;
/* in preparation for plotting red update */
}
}
for(i=bs;i<KB-bs;i++) /* update all black cells using bl
to mask boundary */
{
b[i] = b[i] + .25*(r[i+1]+r[i]-4*b[i]+r[i-bn]+r[i+bs])*bl[i];
}
for(i=0;i<KB;i++)
{
v[2*i+1]= b[i];
/* store black values in 1-d u-array */
}
m=0;
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
{
/* write 1-d u-array into 2-d u-array */
u[i][j] = v[m];
/* in preparation for plotting black cells*/
m++;
}
}
/* printf("%f\n",u[20][20]); */
}
return(0);
}