/******************************************************************************
* FILE: mpi_barre_NbProc_NbPix.c
* DESCRIPTION: 
*   
* REMARQUE: la taille du tableau doit être uniformément disible par le nombre de taches N.
Pour faciliter le traitement,
1. dans un premier temps on suppose qu'il y a autant de processus que de pixels
2. On repartit la barre par tranche pour chaque processus
* AUTHOR: 
* LAST REVISED: 11/01/13
****************************************************************************/

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#define  MASTER		0


int main (int argc, char *argv[])
{
int   numtasks, taskid, rc, dest,  i, j, tag1,t,Est_egal
      tag2, source, prochain, avant; 
float * b;
float * c;
MPI_Status status;

float update(int myoffset, int chunk, int myid);
void Remplace(float m[],float n[], int taille);
void Afficher(float m[], int taille,int nb);
int Comparer(float m[],float n[], int taille);

  b = (float *)malloc (sizeof(float)*numtasks);
  c = (float *)malloc (sizeof(float)*numtasks);

 tag2 = 1;
 tag1 = 2;
 
/***** Initialisations *****/
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
  MPI_Comm_rank(MPI_COMM_WORLD,&taskid);


/***** tache maitre uniquement ******/
if (taskid == MASTER){

  /* 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;
  
    t=1;
    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é
    
/***** uniquement les autres taches sans la tache maitre *****/

   if (taskid > MASTER) {

   /* Reception de ma tranche de tableau de la tache principale */
  
  
   MPI_Barrier(); //Point de RDV avant de passer à l'itération t+1
   /* je fais la mise à jour des elements de ma tranche et je calcule leur somme*/ 
   update(offset, chunksize, taskid);
 
 } /* fin du traitement d'une tache non maitre */

	
     Est_egal=Comparer(b,c,N);
	 t++;//augmenter le nombre d'itération
     Remplace(b,c,N);
    }
		
    printf("La valeur de la temperature le long de la barre: \n"); 
    afficher(b, numtasks);
  }  /* fin de la section du traitement de la tache principale */



MPI_Finalize();

}   /* fin du main */


//fonction de mise à jour d'un tableau et le calcul de la somme de ses elements
void update(int i) {
        c[i]= 0.25 *(b[i-1] + b[i+1] + 2*b[i]);
}

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 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;
}