#include "stdio.h"
#include "math.h"
#define MAX 80
void nextstep(float A[MAX][MAX], float B[MAX][MAX], float
f[MAX][MAX], float alfa,float beta, float Uext)
{int i,j,k,N=MAX;
float M=MAX;
float h=4/M,t=h*h/4;
float c=2*h*alfa;
int m=N/3;
B[0][0]=A[0][0]+t*f[0][0]+beta*(2*A[0][1]+2*A[1][0]-4*A[0][0]);
B[0][N-1]=A[0][N-1]+t*f[0][N-1]+beta*(2*A[1][N-1]+2*A[0][N-2]-4*A[0][N-1]);
B[N-1][0]=A[N-1][0]+t*f[N-1][0]+beta*(2*A[N-1][1]+2*A[N-2][1]-4*A[N-1][0]);
B[N-1][N-1]=A[N-1][N-1]+t*f[N-1][N-1]+beta*(2*A[N-2][N-1]+2*A[N-1][N-2]-4*A[N-1][N-1]);
for(k=1;k<=N-2;k++)
{B[0][k]=A[0][k]+t*f[0][k]-beta*(4*A[0][k]-2*A[1][k]-A[0][k+1]-A[0][k-1]);
B[N-1][k]=A[N-1][k]+t*f[N-1][k]-beta*(4*A[N-1][k]-2*A[N-2][k]-A[N-1][k+1]-A[N-1][k-1]);}
for(k=1;k<=m-1;k++)
{B[k][0]=A[k][0]+t*f[k][0]+beta*(2*A[k][1]+A[k-1][0]+A[k+1][0]-4*A[k][0]);
B[k][N-1]=A[k][N-1]+t*f[k][N-1]+beta*(2*A[k][N-2]+A[k+1][N-1]+A[k-1][N-1]-4*A[k][N-1]);}
for(k=2*m+1;k<=N-2;k++)
{B[k][0]=A[k][0]+t*f[k][0]+beta*(2*A[k][1]+A[k-1][0]+A[k+1][0]-4*A[k][0]);
B[k][N-1]=A[k][N-1]+t*f[k][N-1]+beta*(2*A[k][N-2]+A[k+1][N-1]+A[k-1][N-1]-4*A[k][N-1]);}
for (k=m;k<=2*m;k++)
{B[k][0]=A[k][0]+t*f[k][0]+beta*(2*A[k][1]+c*Uext+A[k+1][0]+A[k-1][0]-(4+c)*A[k][0]);
B[k][N-1]=A[k][N-1];}
for(i=1;i<=N-2;i++)
{for(j=1;j<=N-2;j++)
{B[i][j]=A[i][j]+t*f[i][j]+beta*(A[i-1][j]+A[i+1][j]+A[i][j+1]+A[i][j-1]-4*A[i][j]);}
}}
void copier(float A[MAX][MAX],float B[MAX][MAX])
{int i,j,N=MAX;
for(i=0;i<=N-1;i++)
{for(j=0;j<=N-1;j++)
{B[i][j]=A[i][j];}
}
}
void afficher(float A[MAX][MAX],int k)
{int i,j,N=MAX; float M=MAX;
float h=4/M;
/*-------------------------------------------------------*/
/* Affichage d'un fichier de commandes Matlab */
/* Le programme genere automatiquement une suite */
/* d'instructions en Matlab qui stocke des images dans */
/* pour en faire une animation. Pour executer cette */
/* animation, compilez: gcc warm.c -o warm */
/* redirigez dans un fichier ./warm > animation.m */
/* puis rentrez dans Matlab et tapez: A=moviein(48) */
/* puis: animation */
/*-------------------------------------------------------*/
printf("x=linspace(0,4,%d);\n",N);
printf("y=x;\n");
printf("T%d=[",k);
for(i=0;i<=N-2;i++)
{for(j=0;j<=N-1;j++)
{printf("%3.1f ",A[i][j]);}
printf(";\n");}
for(j=0;j<=N-1;j++)
{printf("%3.1f ",A[i][j]);}
printf ("];\n");
printf("surf(x,y,T%d)\n",k);
printf("axis([0 4 0 4 12 26])\n");
printf("zlabel('TEMPERATURE')\n");
printf("title('t=%f heure')\n",0.5*k);
/* on stocke une image toute les demi-heures*/
printf("A(:,%d)=getframe;\n",k);}
main()
{float A[MAX][MAX];
float B[MAX][MAX];
float f[MAX][MAX];
float C[MAX][MAX];
float alfa=0.1;
int i,j,k,P,N=MAX,m=N/3;
float M=MAX;
float h=4/M,t=h*h/4;
P=1/t;
/* 1600 iterations correspondent a une heure */
for(i=0;i<=N-1;i++)
{for(j=0;j<=N-1;j++)
{A[i][j]=15;
f[i][j]=0;}}
for(k=m;k<2*m;k++)
{A[k][N-1]=25;}
for(k=1;k<=48;k++)
/* une iteration de cette boucle correspond a 1/2 heure */
{for(i=1;i<=800;i++)
{nextstep(A,B,f,alfa,0.25,-10);
copier(B,A); }
afficher(A,k);
printf("\n");}
}