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

// Programm berechnet die Summe von 1 bis N
// Jeweils pro Client

// Zeigt die Verwendung


void main(int argc, char *argv[])
{
    int Pid, numprocs;
    long int done = 0, n, i;
    long int G_sum, mysum;
	long int k1, k2, NN;
	double x;
    
	n = 10;  // Grenze für die Summe von 1 bis N

	NN=70000;  // Pausen NN
	NN=70;
	
	
    MPI_Init(&argc,&argv);

	   // Anzahl der Prozesse
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    
	   // meine eigene ID
	MPI_Comm_rank(MPI_COMM_WORLD,&Pid);
    
	// read n
	if (Pid==0) {
		n=100;
	}
        // An alle Client und Master eine Botschaft senden, wieviele n
    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
			/*
				int MPI_Bcast(	
					void  *smessage,		// Sendepuffer
					int count,
					MPI_Datatype datatype,	 
					int root,				// Sender
					MPI_Comm comm			// Bereichsname
				);
			*/

	puts("Master und Client rechnen");
    mysum = 0;  // lokale Summe pro Client
			  // Beachte die Incrementierung    i += numprocs
    for (i = 1; i <= n; i ++)
    {
      mysum += i;
    }



	// eine Art Pause
	for (k1=0; k1<NN; k1++) {
		for (k2=0; k2<NN; k2++) {
			x = 23.44*2;
		}
	}
			
			  // Akkumulationsoperation
			/*
				int MPI_Reduce(
					void  *sendbuf,			// sendepuffer			&mypi
					void *recvbuf,									&pi
					int count,										jeder ein double
					MPI_Datatype datatype,							Doubletyp Typ
					MPI_Op op,										Reduce-Op = Summe
					int root,				// Sender				Master ist Sender
					MPI_Comm comm			// Bereichsname			An Alle
				);	
			*/

 //   
    printf("Master und Client: mysum %d\n", mysum);  // Das wird von allen ausgeführt

	G_sum = 0;
    MPI_Reduce(&mysum, &G_sum, 1, MPI_INT, MPI_SUM, 
		    0, MPI_COMM_WORLD);

			
		  // nur Master gibt aus
    if (Pid == 0) {
       printf("Master: summe %d\n", G_sum);
	}
      

    MPI_Finalize();
}


