
#include <mpi.h>

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

/*
 Aufteilen von 1 bis n auf     m Workers 
 Falls ein Rest vorhanden ist, wird die Aufteilung  client_size um eins erhöht 
 geht die Aufteilung nicht auf, ist es schwierig die 
     Anzahl der übermittelten daten zu bestimmen
*/

#define C_MAX 10

// Scatter 1
int main(int  argc, char *argv[])
{
	int     root = 0;
    int     numprocs, Pid, i;
    int     x_root[C_MAX];
	int     client_size;
    div_t   part;
	MPI_Status status;
    
	int     x[C_MAX];  // Speicherung der Werte pro Client

    if (MPI_Init(&argc,&argv)!=MPI_SUCCESS) {
		printf("MPI_Init failed.\n");
		return -1;
    }

    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &Pid);

    printf("Proc %d: I´m  alive,  Anzahl Prozesse %d\n", Pid, numprocs);

    if (Pid==0) {
		  // Daten im Master erzeugen
		for (i=0; i<C_MAX; i++) {
			x_root[i] = i+1;
		}
		puts("  ");
    }
    
	  // zur Kontrolle in allen Workers auf Null gesetzt
	for (i=0; i<C_MAX; i++) {
		x[i] = 0;
	}

	// struct div_t   quot  rem
	part=div(C_MAX,numprocs);
	if (part.rem!=0) 
		client_size=part.quot+1;        
	else 
		client_size=part.quot;	

	printf("Vor Scatter: Client_size %d\n",client_size);

/*
Der Sendepuffer (seine Größe sei n Elemente) wird in Teile der Länge n / Gruppengröße 
	geteilt und mit Prozess 0 beginnend verteilt. Sollte die Division nicht aufgehen, 
	erhalten die ersten Prozesse um 1 größere Teile und der Prozeß 
	mit der höchsten ID den Rest.
*/
    MPI_Scatter(x_root, client_size, MPI_INT, 
		  x, client_size, MPI_INT, 0, MPI_COMM_WORLD);

	printf("Nach Scatter: client_size: %d\n",client_size);

	// Fehlerhaft
    MPI_Get_count(&status, MPI_INT, &client_size);
			
	printf("MPI_Get_count: client_size: %d\n",client_size);

    

	  // Ausgabe der erhaltenen Werte
	for (i=0; i<C_MAX; i++) {
		printf("Pid %d  i:  %d  x[i]: %d\n",Pid, i, x[i]);
	}
		puts("  ");
		puts("  ");


    MPI_Finalize();
	return 0;
}  // main

