/******************************************************************************
* FILE: openmp_barre.c
* DESCRIPTION: 
* 
* REMARQUE: .
* AUTHOR: 
* LAST REVISED: 11/01/13
****************************************************************************/
  


#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define N       20000
#define CHUNKSIZE   100


void Remplace(float m[],float n[], int taille);
void Afficher(float m[], int taille, ,int nb);
int Comparer(float m[],float n[], int taille);


int main(int argc, char *argv[]){

 int i, chunk, tid;
 float b[N], c[N];
 
 /* Condition aux limite de la barre, initialisations */
  for (i=0; i < N-1 ; i++)
    b[i] = c[i] = 0.0;
    b[N-1]= c[N-1]=1.0;
   
  chunk = CHUNKSIZE;

    int t;
    t=1;
    int Est_egal=0;
	
	/*une boucle while pour parcourir le temps jusqu'ŕ la stabilité 
	de la propagation de la temperature
	*/
    while(!Est_egal){// on itere jusqu'a ce qu'il y ai stabilité
    
	/******************
	   code sequentiel
	   boucle de parcours dela barre le long de x (nombre de taches)
	*******************/
	for (i=1; i<N-1; i++) {
        c[i]= 0.25 *(b[i-1] + b[i+1] + 2*b[i]);
      }
	
	/******************
	   code parallele
	*******************/
      for (i=1; i<N-1; i++) {
        c[i]= 0.25 *(b[i-1] + b[i+1] + 2*b[i]);
      }
	  
       Est_egal=Comparer(b,c,N);
	   t++;//augmenter le nombre d'itération
       Remplace(b,c,N);
    }
 
  Afficher(b, N,t);
  return 0;
}

void Remplace(float m[],float n[], int taille){
     int i;
     for (i=1; i < taille-1; i++) m[i] = n[i];   
}

void Afficher(float m[], int taille,int nb)
{
     int i;
	 printf("nombre d'iterations =%d\n", nb); 
     for (i=0; i < taille; i++) 
        printf("m[%d]=%f ", i, m[i]); 
        printf("\n");  
}

int Comparer(float m[],float n[], int taille){
     int i;
     for(i=0;i<taille;i++) {
       if (m[i]!=n[i]) return 0;
     }
     return 1;
}
