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

#include "mpi.h"

#define USE_GMP
#define USE_MPFR
#include "gmp.h"
#include "mpfr.h"
#include "mpi_bnc.h"

main(int argc, char *argv[])
{
	int num_procs, myrank;
	mpf_t a, b;
	void *buf;
	int tag = 0;
	MPI_Status status;

	MPI_Init(&argc, &argv);

	_mpi_set_bnc_default_prec_decimal(50, MPI_COMM_WORLD);
	commit_mpf(&(MPI_MPF), ceil(50/log10(2.0)), MPI_COMM_WORLD);

	MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

	mpf_init_set_ui(a, 0);
	mpf_init_set_ui(b, 0);
	if(myrank == 0)
	{
		mpf_set_ui(a, 1);
		buf = allocbuf_mpf(mpf_get_prec(a), 1);
		pack_mpf(a, 1, buf);
		MPI_Send(buf, 1, MPI_MPF, 1, tag, MPI_COMM_WORLD);
	}
	else if(myrank == 1)
	{
		buf = allocbuf_mpf(mpf_get_prec(b), 1);
		MPI_Recv(buf, 1, MPI_MPF, 0, tag, MPI_COMM_WORLD, &status);
		unpack_mpf(buf, b, 1);
	}

	printf("Process %d: a = ", myrank);
	mpf_out_str(stdout, 10, 0, a);
	printf(", b = ");
	mpf_out_str(stdout, 10, 0, b);
	printf("\n");

	mpf_clear(a);
	mpf_clear(b);
	free_mpf(&(MPI_MPF));

	MPI_Finalize();

	return EXIT_SUCCESS;
}

