/**
Date : 07-03-2014
Auteur :
Sujet : Racine Carrée de la somme des carrées d'un vecteur
*/
#include "mpi.h"
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#define SIZE 4
#define ETIQUETTE 100

float sommeCarre(float * x, int debut, int fin) ;

int main(int argc, char *argv[]) {
	MPI_Status status;
	MPI_Init (&argc,&argv);
	int i, n = SIZE;
	float x[SIZE];
	for (i=0; i<SIZE; i++)
    	x[i]= i*1.1;
	float res = 0;
	int rang, nb_procs; 
	MPI_Comm_rank (MPI_COMM_WORLD , &rang);
	MPI_Comm_size (MPI_COMM_WORLD , &nb_procs);
	int r = n/nb_procs;
	float temp[SIZE] ;
	if(rang % nb_procs == 0) {
  		MPI_Send (&res, 1, MPI_INT , 1, ETIQUETTE, MPI_COMM_WORLD );
  	}
  	for(i=(rang % nb_procs)*r; i<((rang % nb_procs)+1)*r; i++) {
  		MPI_Recv (&res, 1, MPI_INT , (rang-1) % nb_procs, ETIQUETTE, MPI_COMM_WORLD , &status);
  		//printf("Moi, processus %d, j’ai recu '%f' du processus %d.\n", rang, res, (rang-1) % nb_procs);
  		res += sommeCarre(x, rang*r, (rang+1)*r);
  		MPI_Send (&res, 1, MPI_INT , (rang+1) % nb_procs, ETIQUETTE, MPI_COMM_WORLD );
  		//printf("Moi, processus %d, j’ai envoye '%f' au processus %d.\n", rang, res, (rang+1) % nb_procs);
  	}
  	MPI_Finalize ();
  	res = sqrt(res);
  	if((rang % nb_procs) == (nb_procs - 1)) printf("Et à la fin, valeur = %f\n", res);
  	return 0;
}

float sommeCarre(float * x, int debut, int fin) {
	int i=0;
	float res = 0;
	for(i=debut ; i<fin ; i++) {
		res += x[i]*x[i];
	}
	return res ;
}


