
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>  // srand

#include <mpi.h>

// Programm zur Bestimmung des Maximums
// jeweils der aktuelle Wert wird zum nächsten Client gesendet


// maximal  7 Workers incl. Server

#define MAX 7

void main(int argc, char *argv[])
{
	int Pid, tag=0;
	int iPrev, iNext;  // Vorgänger, Nachfolger
    int numprocs;
	int value;
	int max_value;  // vom Root, zum Root
	int max_value_Neu;  // vom Root, zum Root

	  // Status
	MPI_Status status;
	
	MPI_Init(&argc,&argv);

	   // Anzahl der Prozesse
	MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    
	   // meine eigene ID
	MPI_Comm_rank(MPI_COMM_WORLD,&Pid);
    
	if ( numprocs < 3 ){
      printf("Bitte mit mindestens drei Prozesse starten");
      MPI_Finalize();
	  return;
	}
	if ( numprocs >MAX ){
      printf("Bitte mit maximal %d Prozesse starten", MAX);
      MPI_Finalize();
	  return;
	}


	 // Init der Werte
	switch (Pid) {
	case 0: value = 11;
			break;
	case 1: value = 131;
			break;
	case 2: value = 12331;
			break;

	case 3: value = 1331;
			break;
	case 4: value = 1441;
			break;
	case 5: value = 441441;
			break;
	case 6: value = 13441;
			break;
	default: value = Pid+4;
	}
	max_value=1000+Pid;

		// Modulo rechnet falsch
	if (Pid  ==  0) 
		iPrev = (Pid-1+numprocs) % numprocs;
	else
		iPrev = (Pid-1) % numprocs;
	iNext = (Pid+1) % numprocs;
	  // testausgabe
    printf("Pid: %d   Value: %d  iPrev: %d   iNext: %d\n", 
		 Pid, value,iPrev, iNext);

	  // Senden und Empfangen
	if (Pid  ==  0) {
		// Root
		MPI_Send( &value, 1, MPI_INT, iNext, tag, MPI_COMM_WORLD);
		MPI_Recv( &max_value, 1, MPI_INT, 
			iPrev, tag, MPI_COMM_WORLD, &status);
        printf("   Root   Pid: %d   max_Value: %d\n", Pid, max_value);
		
	}
	else {
		MPI_Recv( &max_value, 1, MPI_INT, 
			iPrev, tag, MPI_COMM_WORLD, &status);
        printf("            Pid: %d   max_Value: %d\n", Pid, max_value);
		if (value>max_value) 
			max_value_Neu = value;
		else
			max_value_Neu = max_value;
		MPI_Send( &max_value_Neu, 1, MPI_INT, iNext, tag, MPI_COMM_WORLD);

	}
	
	  // Root gibt Maximum aus
	if (Pid  ==  0) {
	    printf("Root   Maximum: %d\n", max_value);
	}
	MPI_Finalize();
}


