#include <stdio.h>
#include "pvm3.h"

#define PROC 10
#define NELEM 1000

int add(int me, int n, int *data, int nproc)
  {
  int i;
  int sum = 0;
  int low, high;

  low = me *(n/nproc);
  high = low +(n/nproc);
  for(i=low; i<high; i++)
    sum += data[i];
  return(sum);
  }
  
main()
  {
  int mytid;              /* my task id */
  int tids[PROC];         /* task ids */
  int n;                  /* number of data elements */
  int me;                 /* integer id of my task */
  int i, msgtype;
  int nproc;              /* number of processes */
  int master;             /* integer id of master program */
  int data[NELEM];        /* data array */
  int result;             /* my partial sum */


  /* Enroll In PVM */
  mytid = pvm_mytid();

  /* Receive Data From Master */
  msgtype = 0;
  pvm_recv(-1, msgtype);
  pvm_upkint(&nproc, 1, 1);
  pvm_upkint(tids, nproc, 1);
  pvm_upkint(&n, 1, 1);
  pvm_upkint(data, n, 1);

  /* Determine Which Slave I Am (0 -- nproc-1) */
  for (i=0; i<nproc; i++)
    if (mytid == tids[i]) { me = i; break; }

  /* Add My Portion Of The Data */
  result = add(me, n, data, nproc);

  /* Send Result To The Master */
  pvm_initsend(PvmDataDefault);
  pvm_pkint(&me, 1, 1);
  pvm_pkint(&result, 1, 1);
  msgtype = 5;
  master = pvm_parent();
  pvm_send(master, msgtype);

  /* Program Finished.  Exit PVM */
  pvm_exit();

  return(0);
  }

