/*
** Solution for homework 3, exercise 1
*/

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


typedef struct intint_t   {
    int value;
    int flag;
} intint_t;

typedef struct floatint_t   {
    float value;
    int flag;
} floatint_t;

typedef struct doubleint_t   {
    double value;
    int flag;
} doubleint_t;


void
selective_sum(void *invec, void *inoutvec, int *len, MPI_Datatype *dt)
{

int i;
intint_t *u, *v, *w;
floatint_t *uf, *vf, *wf;
doubleint_t *ud, *vd, *wd;


    if (*dt == MPI_2INT)   {
        u= invec;
        v= inoutvec;
        w= inoutvec;

        for (i= 0; i < *len; i++)   {
            if (u[i].flag)   {
                w[i].value= u[i].value + v[i].value;
            }
        }
    } else if (*dt == MPI_FLOAT_INT)   {
        uf= invec;
        vf= inoutvec;
        wf= inoutvec;

        for (i= 0; i < *len; i++)   {
            if (uf[i].flag)   {
                wf[i].value= uf[i].value + vf[i].value;
            }
        }
    } else if (*dt == MPI_DOUBLE_INT)   {
        ud= invec;
        vd= inoutvec;
        wd= inoutvec;

        for (i= 0; i < *len; i++)   {
            if (ud[i].flag)   {
                wd[i].value= ud[i].value + vd[i].value;
            }
        }
    } else   {
        /* A data type we cannot handle */
	MPI_Abort(MPI_COMM_WORLD, -1);
    }

}  /* end of my_func() */
