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

#include "mpi.h"

#include "mpi_bnc.h"

#define DIM 10

int main(int argc, char *argv[])
{
	DVector x, b;
	DVector local_x, local_b;

	long int d_dim[10];
	double ip;
	long int i, j, local_dim;
	int myrank, num_procs;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
	MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

	local_dim = _mpi_divide_dim(d_dim, DIM, num_procs);
	if(myrank == 0)
	{
		x = init_dvector(local_dim * num_procs);
		b = init_dvector(local_dim * num_procs);

		for(i = 0; i < DIM; i++)
		{
			set_dvector_i(x, i, (double)(i + 1));
			set_dvector_i(b, i, (double)(DIM - i));
		}
	}
	local_x = _mpi_init_dvector(d_dim, DIM, MPI_COMM_WORLD);
	local_b = _mpi_init_dvector(d_dim, DIM, MPI_COMM_WORLD);

	_mpi_divide_dvector(local_b, d_dim, b, MPI_COMM_WORLD);
	_mpi_divide_dvector(local_x, d_dim, x, MPI_COMM_WORLD);

	ip = _mpi_ip_dvector(local_x, local_b, MPI_COMM_WORLD);

	_mpi_free_dvector(local_x);
	_mpi_free_dvector(local_b);

	/* free */
	if(myrank == 0)
	{
		printf("Inner Product(MPI): %25.17e\n", ip);

		free_dvector(x);
		free_dvector(b);
	}
	MPI_Finalize();

	return EXIT_SUCCESS;
}
