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

#include "mpi.h"

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

void mpf_f(mpf_t ret, mpf_t a)
{
	mpf_t tmp;

	mpf_init2(tmp, mpf_get_prec(ret));

	mpf_mul(tmp, a, a);
	mpf_add_ui(tmp, tmp, 1UL);
	mpf_ui_div(ret, 4UL, tmp);

	mpf_clear(tmp);

	return;
}

int main(int argc,char *argv[])
{
	int n, myid, numprocs, i;
	double startwtime = 0.0, endwtime;
	mpf_t mpf_pi, mpf_h, mpf_x;
	int  namelen;
	char processor_name[MPI_MAX_PROCESSOR_NAME];

	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);
	create_mpf_op(&(MPI_MPF_SUM), _mpi_mpf_add, MPI_COMM_WORLD);

	MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
	MPI_Comm_rank(MPI_COMM_WORLD,&myid);

	n=14 * 16384;

	mpf_init(mpf_h);
	mpf_init(mpf_x);
	mpf_init(mpf_pi);

	mpf_set_ui(mpf_x, 0UL);
	mpf_set_ui(mpf_h, 1UL);
	if(myid == 0) startwtime = MPI_Wtime();
	_mpi_mpf_trapezoidal_fs(mpf_pi, mpf_x, mpf_h, mpf_f, n, MPI_COMM_WORLD, MPI_MPF);
	if(myid == 0)
	{
		endwtime = MPI_Wtime() - startwtime;
		printf("BNC: _mpi_mpf_trapezoidal_fs = \n");
		mpf_out_str(stdout, 10, 0, mpf_pi);printf("\n");
		printf("Time: %f\n", endwtime);
	}

	mpf_clear(mpf_x);
	mpf_clear(mpf_h);
	mpf_clear(mpf_pi);

	free_mpf(&(MPI_MPF));
	free_mpf_op(&(MPI_MPF_SUM));

	MPI_Finalize();

	return EXIT_SUCCESS;
}
