#include <stdlib.h>
#include "parlib.h"

#ifdef FORTRANUNDERSCORE
void p_transpose_init_ ( ndims, dim_source, lblks_source, dim_dest, 
		lblks_dest, stride, blklen, overlap, datatype, comm, period,
		transp, ierr )
#elif defined(FORTRANDOUBLEUNDERSCORE)
void p_transpose_init__ ( ndims, dim_source, lblks_source, dim_dest, 
		lblks_dest, stride, blklen, overlap, datatype, comm, period,
		transp, ierr )
#else
void p_transpose_init ( ndims, dim_source, lblks_source, dim_dest, 
		lblks_dest, stride, blklen, overlap, datatype, comm, period,
		transp, ierr )
#endif
	MPI_Fint *ndims, *dim_source, *lblks_source, *dim_dest, *lblks_dest; 
	MPI_Fint *stride, *blklen, *overlap, *datatype, *comm, *period;
   MPI_Fint **transp, *ierr;
{
	*transp = (MPI_Fint *) malloc ( sizeof(Transposition) );
	*ierr = P_Transpose_init ( *ndims, *dim_source, lblks_source, 
		*dim_dest, lblks_dest, stride, blklen, overlap, 
		MPI_Type_f2c(*datatype), MPI_Comm_f2c(*comm), *period,
		(Transposition *) *transp );
}

#ifdef FORTRANUNDERSCORE
void p_transpose_start_ ( arr_source, arr_dest, transp, ierr )
#elif defined(FORTRANDOUBLEUNDERSCORE)
void p_transpose_start__ ( arr_source, arr_dest, transp, ierr )
#else
void p_transpose_start ( arr_source, arr_dest, transp, ierr )
#endif
	void *arr_source, *arr_dest;
	MPI_Fint **transp, *ierr;
{
   *ierr = P_Transpose_start ( arr_source, arr_dest, 
		(Transposition *) *transp );
}

#ifdef FORTRANUNDERSCORE
void p_transpose_end_ ( transp, ierr )
#elif defined(FORTRANDOUBLEUNDERSCORE)
void p_transpose_end__ ( transp, ierr )
#else
void p_transpose_end ( transp, ierr )
#endif
	MPI_Fint **transp, *ierr;
{
	*ierr = P_Transpose_end ( (Transposition *) *transp );
}

#ifdef FORTRANUNDERSCORE
void p_transpose_free_ ( transp, ierr )
#elif defined(FORTRANDOUBLEUNDERSCORE)
void p_transpose_free__ ( transp, ierr )
#else
void p_transpose_free ( transp, ierr )
#endif
	MPI_Fint **transp, *ierr;
{
	*ierr = P_Transpose_free ( (Transposition *) *transp );
	free ( *transp ); 
}

#ifdef FORTRANUNDERSCORE
void p_transpose_ ( ndims, arr_source, dim_source, lblks_source, arr_dest,
		dim_dest, lblks_dest, stride, blklen, overlap, datatype, comm, 
		period, ierr )
#elif defined(FORTRANDOUBLEUNDERSCORE)
void p_transpose__ ( ndims, arr_source, dim_source, lblks_source, arr_dest,
		dim_dest, lblks_dest, stride, blklen, overlap, datatype, comm, 
		period, ierr )
#else
void p_transpose ( ndims, arr_source, dim_source, lblks_source, arr_dest, 
		dim_dest, lblks_dest, stride, blklen, overlap, datatype, comm, 
		period, ierr )
#endif
	void *arr_source, *arr_dest;
	MPI_Fint *ndims, *dim_source, *lblks_source, *dim_dest, *lblks_dest; 
	MPI_Fint *stride, *blklen, *overlap, *datatype, *comm, *period;
	MPI_Fint *ierr;
{
	*ierr = P_Transpose ( *ndims, arr_source, *dim_source, lblks_source, 
		arr_dest, *dim_dest, lblks_dest, stride, blklen, overlap, 
		MPI_Type_f2c(*datatype), MPI_Comm_f2c(*comm), *period );
}