#include "mpi.h"
#include <stdio.h>
#include <math.h>


#define MAX 3

// Bitte geben Sie IMMER drei Task an



void main(int argc, char *argv[])
{
    int myPid, i;
    int root = 0;
    
	  // Jeder Prozess hat n-Werte  Eingangswerte
	  // Es gibt k_Prozesse x n-Werte
	double a[MAX]; // a(i) Spalte
	double b;

	  // Ziel pro Index die Summe, in C
	double c[MAX];  // lokal

	double g_c[MAX]; // summenfeld   

	
	MPI_Init(&argc,&argv);

    
	   // meine eigene ID
	MPI_Comm_rank(MPI_COMM_WORLD,&myPid);
    
	for (i=0; i<MAX; i++) {
		c[i] = 0;
		a[i] = 0;
	}

      // Hier sollte aus einer Datei gelesen werden, pro Pid !
	switch (myPid) {
		case 0:
	    	a[0] = 1;
	    	a[1] = 4;
	    	a[2] = 7;
			b = 10;
		break;
		case 1:
	    	a[0] = 2;
	    	a[1] = 5;
	    	a[2] = 8;
			b = 11;
			break;
		case 2:
	    	a[0] = 3;
	    	a[1] = 6;
	    	a[2] = 9;
			b = 12;
			break;
	}

	  // Berechnung
	for (i=0; i<MAX; i++) {
		c[i] = a[i] * b;
		
	}
	printf("\n\nPId: %d \n", myPid);			
	for (i=0; i<MAX; i++) {
		printf("Index: %d   A(i) %f\n", i, a[i]);			
	} // for
	for (i=0; i<MAX; i++) {
		printf("Index: %d   C(i) %f\n", i, c[i]);			
	} // for

	
	MPI_Reduce(c, g_c, MAX, MPI_DOUBLE, MPI_SUM, root, MPI_COMM_WORLD);

	if (myPid  ==  root) {
		// Ausgabe
        printf("\n\n");			
		for (i=0; i<MAX; i++) {
			printf("Index: %d   C(i) %f\n", i, g_c[i]);			
		} // for
		
	}  // if

	

    MPI_Finalize();
}

/*
Ergebnisse:

Index: 0   Pid: 1   Maxwert: 5.000000
Index: 1   Pid: 2   Maxwert: 7.000000
Index: 2   Pid: 0   Maxwert: 4.000000


*/
