#ifndef BDEF_H
#define BDEF_H 1
/* This file from mpiblacs_patch01 */
/*
* Include the system dependant and user defined stuff
*/
#include "Bconfig.h"
#ifdef CRAY
#define float double
#include <fortran.h>
#endif
/*
* ========================================================================
* TYPEDEF'S USED IN THE BLACS
* ========================================================================
*/
/*
* ---------------------------------------------------------------------------
* Define MPI's data types differently depending on whether we are using MPI's
* fortran or C interface
* ---------------------------------------------------------------------------
*/
#ifdef UseF77Mpi
#define BI_MPI_Aint int
#define BI_MPI_Comm int
#define BI_MPI_Datatype int
#define BI_MPI_Group int
#define BI_MPI_Op int
#define BI_MPI_Request int
#define BI_MPI_Status int
#else
#define BI_MPI_Aint MPI_Aint
#define BI_MPI_Comm MPI_Comm
#define BI_MPI_Datatype MPI_Datatype
#define BI_MPI_Group MPI_Group
#define BI_MPI_Op MPI_Op
#define BI_MPI_Request MPI_Request
#define BI_MPI_Status MPI_Status
#endif
/*
* Data type defining a scope for the BLACS
*/
typedef struct bLaCsScOpE BLACSSCOPE;
struct bLaCsScOpE
{
BI_MPI_Comm comm;
int ScpId, MaxId, MinId;
int Np, Iam;
};
/*
* Data type defining a context for the BLACS
*/
typedef struct bLaCsCoNtExT BLACSCONTEXT;
struct bLaCsCoNtExT
{
BLACSSCOPE rscp, cscp, ascp, pscp; /* row, column, all, and pt2pt scopes */
BLACSSCOPE *scp; /* pointer to present scope */
#if (BI_TransComm == BONEHEAD)
#ifdef UseF77Mpi
MPI_Comm C_comm;
#else
int *F77_comm;
#endif
#endif
int TopsRepeat; /* Use only repeatable topologies? */
int TopsCohrnt; /* Use only coherent topologies? */
int Nb_bs, Nr_bs; /* for bcast general tree and multiring tops */
int Nb_co, Nr_co; /* for combine general tree and multiring tops */
};
/*
* Define the fortran 77 data types COMPLEX*8 (SCOMPLEX)
* and COMPLEX*16 (DCOMPLEX).
*/
typedef struct {double r, i;} DCOMPLEX;
typedef struct {float r, i;} SCOMPLEX;
/*
* These variables will be defined to be MPI datatypes for complex and double
* complex if we are using the C interface to MPI. If we use the fortran
* interface, we need to declare the contants array. I'm too lazy to declare
* these guys external in every file that needs them.
*/
#ifndef GlobalVars
#ifdef UseF77Mpi
extern int *BI_F77_MPI_CONSTANTS, *BI_F77_MPI_COMM_WORLD;
#else
extern BI_MPI_Datatype BI_MPI_COMPLEX, BI_MPI_DOUBLE_COMPLEX;
extern int *BI_F77_MPI_COMM_WORLD;
#endif
#endif
/*
* Definition of buffer type for BLACS' asynchronous operations
*/
typedef struct bLaCbUfF BLACBUFF;
struct bLaCbUfF
{
char *Buff; /* send/recv buffer */
int Len; /* length of buffer in bytes */
int nAops; /* number of asynchronous operations out of buff */
BI_MPI_Request *Aops; /* list of async. operations out of buff */
BI_MPI_Datatype dtype; /* data type of buffer */
int N; /* number of elements of data type in buff */
BLACBUFF *prev, *next; /* pointer to the other BLACBUFF in queue */
};
/*
* Pointer to the combine's vector-vector functions
*/
#ifdef __STDC__
typedef void (*VVFUNPTR)(int, char *, char *);
typedef void (*SDRVPTR)(BLACSCONTEXT *, int, int, BLACBUFF *);
#else
typedef void (*VVFUNPTR)();
typedef void (*SDRVPTR)();
#endif
/*
* ========================================================================
* MACRO CONSTANTS
* ========================================================================
*/
/*
* ----------------------------------------------
* Define MPI's constants for fortran77 interface
* ----------------------------------------------
*/
#ifdef UseF77Mpi
/*
* return codes
*/
#define BI_MPI_SUCCESS BI_F77_MPI_CONSTANTS[0]
#define BI_MPI_ERR_UNKNOWN BI_F77_MPI_CONSTANTS[1]
#define BI_MPI_ERR_OTHER BI_F77_MPI_CONSTANTS[2]
#define BI_MPI_ERR_INTERN BI_F77_MPI_CONSTANTS[3]
/*
* Assorted constants
*/
#define BI_MPI_ANY_SOURCE BI_F77_MPI_CONSTANTS[4]
#define BI_MPI_UNDEFINED BI_F77_MPI_CONSTANTS[5]
/*
* Status size and reserved index values
*/
#define BI_MPI_STATUS_SIZE BI_F77_MPI_CONSTANTS[6]
#define BI_MPI_SOURCE BI_F77_MPI_CONSTANTS[7]
#define BI_MPI_TAG BI_F77_MPI_CONSTANTS[8]
/*
* Elementary datatypes
*/
#define BI_MPI_INT BI_F77_MPI_CONSTANTS[9]
#define BI_MPI_FLOAT BI_F77_MPI_CONSTANTS[10]
#define BI_MPI_DOUBLE BI_F77_MPI_CONSTANTS[11]
#define BI_MPI_COMPLEX BI_F77_MPI_CONSTANTS[12]
#define BI_MPI_DOUBLE_COMPLEX BI_F77_MPI_CONSTANTS[13]
#define BI_MPI_PACKED BI_F77_MPI_CONSTANTS[14]
#define BI_MPI_BYTE BI_F77_MPI_CONSTANTS[15]
/*
* Reserved communicators
*/
#define BI_MPI_COMM_WORLD BI_F77_MPI_CONSTANTS[16]
#define BI_MPI_COMM_NULL BI_F77_MPI_CONSTANTS[17]
/*
* Environmental inquiry keys
*/
#define BI_MPI_TAG_UB BI_F77_MPI_CONSTANTS[18]
/*
* Collective operations
*/
#define BI_MPI_MAX BI_F77_MPI_CONSTANTS[19]
#define BI_MPI_MIN BI_F77_MPI_CONSTANTS[20]
#define BI_MPI_SUM BI_F77_MPI_CONSTANTS[21]
/*
* NULL handles
*/
#define BI_MPI_REQUEST_NULL BI_F77_MPI_CONSTANTS[22]
/*
* Data types to use in the combine operations
*/
#define BI_DistType int
#define BI_MpiDistType BI_MPI_INT
/*
* ====================================
* Define MPI constants for C interface
* ====================================
*/
#else
/*
* return codes
*/
#define BI_MPI_SUCCESS MPI_SUCCESS
#define BI_MPI_ERR_UNKNOWN MPI_ERR_UNKNOWN
#define BI_MPI_ERR_OTHER MPI_ERR_OTHER
#define BI_MPI_ERR_INTERN MPI_ERR_INTERN
/*
* Assorted constants
*/
#define BI_MPI_ANY_SOURCE MPI_ANY_SOURCE
#define BI_MPI_UNDEFINED MPI_UNDEFINED
/*
* Status size and reserved index values
*/
#define BI_MPI_STATUS_SIZE 1
/*
* Elementary datatypes
*/
#define BI_MPI_SHORT MPI_SHORT
#define BI_MPI_INT MPI_INT
#define BI_MPI_FLOAT MPI_FLOAT
#define BI_MPI_DOUBLE MPI_DOUBLE
#define BI_MPI_PACKED MPI_PACKED
#define BI_MPI_BYTE MPI_BYTE
/*
* Reserved communicators
*/
#define BI_MPI_COMM_WORLD MPI_COMM_WORLD
#define BI_MPI_COMM_NULL MPI_COMM_NULL
/*
* Environmental inquiry keys
*/
#define BI_MPI_TAG_UB MPI_TAG_UB
/*
* Collective operations
*/
#define BI_MPI_MAX MPI_MAX
#define BI_MPI_MIN MPI_MIN
#define BI_MPI_SUM MPI_SUM
/*
* NULL handles
*/
#define BI_MPI_REQUEST_NULL MPI_REQUEST_NULL
/*
* Data types to use in the combine operations
*/
#define BI_DistType unsigned short
#define BI_MpiDistType MPI_UNSIGNED_SHORT
#endif
#define BUFFALIGN 8 /* force all buffers to 8 byte alignment */
#define BANYNODE BI_MPI_ANY_SOURCE
#define PT2PTID 9976 /* TAG used for point to point */
#define NOTINCONTEXT -1 /* Indicates node called gridmap, but not in grid */
#define MAXNCTXT 10 /* initial guess at max # of contexts */
#define MAXNSYSCTXT 10 /* initial guess at max # of system context */
#define AOPDONE BI_MPI_REQUEST_NULL
#define BUFWAIT 120 /* Length of time to wait for emergency buff */
/*
* Error codes
*/
#define NORV 1 /* No receiver (only 1 proc in scoped op) */
#define NPOW2 2 /* Number of procs is not a power of 2 */
#define BADSCP 3 /* Scope not row, column or all */
/*
* Data types
*/
#define INTEGER 3
#define SINGLE 4
#define DOUBLE 6
#define COMPLEX8 5
#define COMPLEX16 7
#define FULLCON 0 /* top is fully connected */
/*
* Routine types
*/
#define RT_SD 1
#define RT_RV 2
#define RT_BS 3
#define RT_BR 4
#define RT_COMB 5
/*
* Legal WHAT values for BLACS_SET
*/
#define SGET_SYSCONTXT 0
#define SGET_MSGIDS 1
#define SGET_DEBUGLVL 2
#define SGET_BLACSCONTXT 10
#define SGET_NR_BS 11
#define SGET_NB_BS 12
#define SGET_NR_CO 13
#define SGET_NB_CO 14
#define SGET_TOPSREPEAT 15
#define SGET_TOPSCOHRNT 16
/*
* These are prototypes for error and warning functions -- I don't want
* to prototype them in each routine.
*/
#ifdef __STDC__
void BI_BlacsWarn(int ConTxt, int line, char *file, char *form, ...);
void BI_BlacsErr(int ConTxt, int line, char *file, char *form, ...);
int BI_ContxtNum(BLACSCONTEXT *ctxt);
#else
void BI_BlacsWarn();
void BI_BlacsErr();
int BI_ContxtNum();
#endif
/*
* If we've got an ANSI standard C compiler, we can use void pointers,
* otherwise use char pointers
*/
#ifdef __STDC__
#define BVOID void
#else
#define BVOID char
#endif
/*
* ========================================================================
* PREPROCESSOR MACRO FUNCTIONS USED FOR OPTIMIZATION & CONVENIENCE
* ========================================================================
*/
#define Mlowcase(C) ( ((C) > 64 && (C) < 91) ? (C) | 32 : (C) )
/*
* Slightly modified gridinfo substitute
*/
#define Mgridinfo(ctxt, Ng0, nprow0, npcol0, myrow0, mycol0)\
{\
(Ng0) = (ctxt)->ascp.Np;\
(nprow0) = (ctxt)->cscp.Np;\
(npcol0) = (ctxt)->rscp.Np;\
(myrow0) = (ctxt)->cscp.Iam;\
(mycol0) = (ctxt)->rscp.Iam;\
}
/*
* These routines return coordinates based on nodes number, or node number
* based on coordinates. Those routines with v after the M return virtual
* nodes numbers (i.e., in respect to the grid, not physical node numbers)
* based on grid coordinates, or grid coordinates based on virtual node numbers.
*/
#define Mpcoord(ctxt, node, prow, pcol)\
{\
(prow) = (node) / (ctxt)->rscp.Np;\
(pcol) = (node) % (ctxt)->rscp.Np;\
}
#define Mvpcoord(ctxt, node, prow, pcol) \
Mpcoord((ctxt), (node), (prow), (pcol));
#define Mkpnum(ctxt, prow, pcol) ( (prow)*(ctxt)->rscp.Np+(pcol) )
#define Mvkpnum(ctxt, prow, pcol) ( (prow)*(ctxt)->rscp.Np+(pcol) )
/*
* This macro returns scoped message ID's.
*/
#define Mscopeid(ctxt) (ctxt)->scp->ScpId; \
if (++(ctxt)->scp->ScpId == (ctxt)->scp->MaxId) \
(ctxt)->scp->ScpId = (ctxt)->scp->MinId;
/*
* Get context, and check for validity if debug level is high
*/
#if (BlacsDebugLvl > 0)
#define MGetConTxt(Context, ctxtptr)\
{\
extern BLACSCONTEXT **BI_MyContxts;\
extern int BI_MaxNCtxt;\
if ( ((Context) >= BI_MaxNCtxt) || ((Context) < 0) )\
BI_BlacsErr(-1, __LINE__, __FILE__, "Invalid context handle: %d",\
(Context));\
else if (BI_MyContxts[(Context)] == NULL)\
BI_BlacsErr(-1, __LINE__, __FILE__, "Invalid context, handle=%d",\
(Context));\
(ctxtptr) = BI_MyContxts[(Context)];\
}
#else
#define MGetConTxt(Context, ctxtptr)\
{\
extern BLACSCONTEXT **BI_MyContxts;\
(ctxtptr) = BI_MyContxts[(Context)];\
}
#endif
/*
* This macro handles MPI errors
*/
#if(BlacsDebugLvl > 0)
#define Mmpierror(ierr, rout, ctxt, line, file) \
{ \
if ( (ierr) != BI_MPI_SUCCESS )\
BI_BlacsErr(BI_ContxtNum((ctxt)), (line), (file), \
"MPI error %d on call to %s", (ierr), (rout)); \
}
#else
#define Mmpierror(ierr, rout, ctxt, line, file)
#endif
/*
* A small macro useful for debugging
*/
#define ErrPrint \
{ \
extern int BI_Iam; \
fprintf(stderr, "%d: line %d of file %s\n", BI_Iam, __LINE__, __FILE__); \
}
/*
* These macros allow for the funky function declarations and character handling
* needed on the CRAY to have a C routine callable from fortran
*/
#define F_VOID_FUNC void
#define F_INT_FUNC int
#define F_DOUBLE_FUNC double
#if (INTFACE == C_CALL)
#define F2C_CharTrans(c) *(c)
#else
#ifdef CRAY
#define F2C_CharTrans(c) *( _fcdtocp((c)) )
#define F_CHAR _fcd
#else
#define F2C_CharTrans(c) *(c)
#define F_CHAR char *
#endif
#endif
/*
* These macros allow for accessing values and addresses of parameters, which
* will be pointers if we're using fortran, and values if we're using C.
*/
#if (INTFACE == C_CALL)
#define Mpval(para) (para)
#define Mpaddress(para) (&(para))
#define Mwalltime Cdwalltime00
#else
#define Mpval(para) (*(para))
#define Mpaddress(para) (para)
#define Mwalltime dwalltime00_
#endif
/*
* Real and complex absolute values
*/
#define Rabs(x) ( (x) < 0 ? (x) * -1 : (x) )
#define Cabs(z) ( (((z).i) < 0 ? ((z).i) * -1 : ((z).i)) + (((z).r) < 0 ? ((z).r) * -1 : ((z).r)) )
/*
* Figures the length of packed trapezoidal matrix
*/
#define trsize(diag, m, n, bytes, length)\
{\
if ( (diag) == 'u' ) (length) = 1;\
else (length) = 0;\
if ( (m) > (n) )\
(length) = ( (n) * ( (m) - (n) ) + ( (n)*(n) ) - ( (n)*(n) )/2 +\
(n)/2 - (n) * (length) ) * (bytes);\
else\
(length) = ( (m) * ( (n) - (m) ) + ( (m)*(m) ) - ( (m)*(m) )/2 +\
(m)/2 - (m) * (length) ) * (bytes);\
}
/*
* These macros call the correct packing/unpacking routines
*/
#define BI_cmvcopy(m, n, A, lda, buff) \
BI_smvcopy(2*(m), (n), (float *) (A), 2*(lda), (float *) (buff))
#define BI_cvmcopy(m, n, A, lda, buff) \
BI_svmcopy(2*(m), (n), (float *) (A), 2*(lda), (float *) (buff))
#define BI_zmvcopy(m, n, A, lda, buff) \
BI_dmvcopy(2*(m), (n), (double *) (A), 2*(lda), (double *) (buff))
#define BI_zvmcopy(m, n, A, lda, buff) \
BI_dvmcopy(2*(m), (n), (double *) (A), 2*(lda), (double *) (buff))
#if (F77_CALL_C == ADD_)
/*
* These defines set up the naming scheme required to have a fortran 77
* routine call a C routine (which is what the BLACS are written in).
* No redefinition necessary to have following Fortran to C interface:
* FORTRAN CALL C DECLARATION
* call dgebs2d(...) void dgebs2d_(...)
*/
#endif
#if (F77_CALL_C == NOCHANGE)
/*
* These defines set up the naming scheme required to have a fortran 77
* routine call a C routine (which is what the BLACS are written in)
* for the following Fortran to C interface:
* FORTRAN CALL C DECLARATION
* call dgebs2d(...) void dgebs2d(...)
*/
/*
* Support routines
*/
#define blacs_pinfo_ blacs_pinfo
#define blacs_setup_ blacs_setup
#define setpvmtids_ setpvmtids
#define blacs_set_ blacs_set
#define blacs_get_ blacs_get
#define blacs_gridinit_ blacs_gridinit
#define blacs_gridmap_ blacs_gridmap
#define ksendid_ ksendid
#define krecvid_ krecvid
#define kbsid_ kbsid
#define kbrid_ kbrid
#define blacs_freebuff_ blacs_freebuff
#define blacs_gridexit_ blacs_gridexit
#define blacs_abort_ blacs_abort
#define blacs_exit_ blacs_exit
#define blacs_gridinfo_ blacs_gridinfo
#define blacs_pnum_ blacs_pnum
#define blacs_pcoord_ blacs_pcoord
#define dcputime00_ dcputime00
#define dwalltime00_ dwalltime00
#define blacs_barrier_ blacs_barrier
/*
* Main, type dependent, routines
*/
#define igesd2d_ igesd2d
#define igerv2d_ igerv2d
#define igebs2d_ igebs2d
#define igebr2d_ igebr2d
#define itrsd2d_ itrsd2d
#define itrrv2d_ itrrv2d
#define itrbs2d_ itrbs2d
#define itrbr2d_ itrbr2d
#define igsum2d_ igsum2d
#define igamx2d_ igamx2d
#define igamn2d_ igamn2d
#define sgesd2d_ sgesd2d
#define sgerv2d_ sgerv2d
#define sgebs2d_ sgebs2d
#define sgebr2d_ sgebr2d
#define strsd2d_ strsd2d
#define strrv2d_ strrv2d
#define strbs2d_ strbs2d
#define strbr2d_ strbr2d
#define sgsum2d_ sgsum2d
#define sgamx2d_ sgamx2d
#define sgamn2d_ sgamn2d
#define dgesd2d_ dgesd2d
#define dgerv2d_ dgerv2d
#define dgebs2d_ dgebs2d
#define dgebr2d_ dgebr2d
#define dtrsd2d_ dtrsd2d
#define dtrrv2d_ dtrrv2d
#define dtrbs2d_ dtrbs2d
#define dtrbr2d_ dtrbr2d
#define dgsum2d_ dgsum2d
#define dgamx2d_ dgamx2d
#define dgamn2d_ dgamn2d
#define cgesd2d_ cgesd2d
#define cgerv2d_ cgerv2d
#define cgebs2d_ cgebs2d
#define cgebr2d_ cgebr2d
#define ctrsd2d_ ctrsd2d
#define ctrrv2d_ ctrrv2d
#define ctrbs2d_ ctrbs2d
#define ctrbr2d_ ctrbr2d
#define cgsum2d_ cgsum2d
#define cgamx2d_ cgamx2d
#define cgamn2d_ cgamn2d
#define zgesd2d_ zgesd2d
#define zgerv2d_ zgerv2d
#define zgebs2d_ zgebs2d
#define zgebr2d_ zgebr2d
#define ztrsd2d_ ztrsd2d
#define ztrrv2d_ ztrrv2d
#define ztrbs2d_ ztrbs2d
#define ztrbr2d_ ztrbr2d
#define zgsum2d_ zgsum2d
#define zgamx2d_ zgamx2d
#define zgamn2d_ zgamn2d
/*
* If we are using the fortran interface to MPI, need to redefine the names
*/
#ifdef UseF77Mpi
#define mpi_abort_ mpi_abort
#define mpi_allreduce_ mpi_allreduce
#define bi_f77_mpi_attr_get_ bi_f77_mpi_attr_get
#define mpi_barrier_ mpi_barrier
#define mpi_bcast_ mpi_bcast
#define mpi_comm_create_ mpi_comm_create
#define mpi_comm_dup_ mpi_comm_dup
#define mpi_comm_free_ mpi_comm_free
#define mpi_comm_group_ mpi_comm_group
#define mpi_comm_rank_ mpi_comm_rank
#define mpi_comm_size_ mpi_comm_size
#define mpi_comm_split_ mpi_comm_split
#define mpi_error_class_ mpi_error_class
#define mpi_finalize_ mpi_finalize
#define mpi_get_count_ mpi_get_count
#define mpi_group_incl_ mpi_group_incl
#define mpi_group_free_ mpi_group_free
#define mpi_init_ mpi_init
#define bi_f77_mpi_initialized_ bi_f77_mpi_initialized
#define mpi_irecv_ mpi_irecv
#define mpi_isend_ mpi_isend
#define bi_f77_mpi_op_create_ bi_f77_mpi_op_create
#define mpi_op_free_ mpi_op_free
#define mpi_pack_ mpi_pack
#define mpi_pack_size_ mpi_pack_size
#define mpi_recv_ mpi_recv
#define mpi_reduce_ mpi_reduce
#define mpi_rsend_ mpi_rsend
#define mpi_send_ mpi_send
#define mpi_sendrecv_ mpi_sendrecv
#define bi_f77_mpi_test_ bi_f77_mpi_test
#define bi_f77_mpi_testall_ bi_f77_mpi_testall
#define mpi_type_commit_ mpi_type_commit
#define mpi_type_contiguous_ mpi_type_contiguous
#define mpi_type_free_ mpi_type_free
#define mpi_type_indexed_ mpi_type_indexed
#define mpi_type_struct_ mpi_type_struct
#define mpi_type_vector_ mpi_type_vector
#define mpi_unpack_ mpi_unpack
#define mpi_waitall_ mpi_waitall
#define mpi_wtime_ mpi_wtime
#define bi_f77_get_constants_ bi_f77_get_constants
#define bi_f77_init_ bi_f77_init
#else
#define mpi_init_ mpi_init
#define bi_f77_get_constants_ bi_f77_get_constants
#define bi_f77_init_ bi_f77_init
#if (BI_TransComm == BONEHEAD)
#define mpi_comm_group_ mpi_comm_group
#define mpi_group_translate_ranks_ mpi_group_translate_ranks
#endif
#endif
#endif
#if (F77_CALL_C == UPCASE)
/*
* These defines set up the naming scheme required to have a fortran 77
* routine call a C routine (which is what the BLACS are written in)
* for the following Fortran to C interface:
* FORTRAN CALL C DECLARATION
* call dgebs2d(...) void DGEBS2D(...)
*/
/*
* Support routines
*/
#define blacs_pinfo_ BLACS_PINFO
#define blacs_setup_ BLACS_SETUP
#define setpvmtids_ SETPVMTIDS
#define blacs_set_ BLACS_SET
#define blacs_get_ BLACS_GET
#define blacs_gridinit_ BLACS_GRIDINIT
#define blacs_gridmap_ BLACS_GRIDMAP
#define ksendid_ KSENDID
#define krecvid_ KRECVID
#define kbsid_ KBSID
#define kbrid_ KBRID
#define blacs_freebuff_ BLACS_FREEBUFF
#define blacs_gridexit_ BLACS_GRIDEXIT
#define blacs_abort_ BLACS_ABORT
#define blacs_exit_ BLACS_EXIT
#define blacs_gridinfo_ BLACS_GRIDINFO
#define blacs_pnum_ BLACS_PNUM
#define blacs_pcoord_ BLACS_PCOORD
#define dcputime00_ DCPUTIME00
#define dwalltime00_ DWALLTIME00
#define blacs_barrier_ BLACS_BARRIER
/*
* Main, type dependent, routines
*/
#define igesd2d_ IGESD2D
#define igerv2d_ IGERV2D
#define igebs2d_ IGEBS2D
#define igebr2d_ IGEBR2D
#define itrsd2d_ ITRSD2D
#define itrrv2d_ ITRRV2D
#define itrbs2d_ ITRBS2D
#define itrbr2d_ ITRBR2D
#define igsum2d_ IGSUM2D
#define igamx2d_ IGAMX2D
#define igamn2d_ IGAMN2D
#define sgesd2d_ SGESD2D
#define sgerv2d_ SGERV2D
#define sgebs2d_ SGEBS2D
#define sgebr2d_ SGEBR2D
#define strsd2d_ STRSD2D
#define strrv2d_ STRRV2D
#define strbs2d_ STRBS2D
#define strbr2d_ STRBR2D
#define sgsum2d_ SGSUM2D
#define sgamx2d_ SGAMX2D
#define sgamn2d_ SGAMN2D
#define dgesd2d_ DGESD2D
#define dgerv2d_ DGERV2D
#define dgebs2d_ DGEBS2D
#define dgebr2d_ DGEBR2D
#define dtrsd2d_ DTRSD2D
#define dtrrv2d_ DTRRV2D
#define dtrbs2d_ DTRBS2D
#define dtrbr2d_ DTRBR2D
#define dgsum2d_ DGSUM2D
#define dgamx2d_ DGAMX2D
#define dgamn2d_ DGAMN2D
#define cgesd2d_ CGESD2D
#define cgerv2d_ CGERV2D
#define cgebs2d_ CGEBS2D
#define cgebr2d_ CGEBR2D
#define ctrsd2d_ CTRSD2D
#define ctrrv2d_ CTRRV2D
#define ctrbs2d_ CTRBS2D
#define ctrbr2d_ CTRBR2D
#define cgsum2d_ CGSUM2D
#define cgamx2d_ CGAMX2D
#define cgamn2d_ CGAMN2D
#define zgesd2d_ ZGESD2D
#define zgerv2d_ ZGERV2D
#define zgebs2d_ ZGEBS2D
#define zgebr2d_ ZGEBR2D
#define ztrsd2d_ ZTRSD2D
#define ztrrv2d_ ZTRRV2D
#define ztrbs2d_ ZTRBS2D
#define ztrbr2d_ ZTRBR2D
#define zgsum2d_ ZGSUM2D
#define zgamx2d_ ZGAMX2D
#define zgamn2d_ ZGAMN2D
/*
* If we are using the fortran interface to MPI, need to redefine the names
*/
#ifdef UseF77Mpi
#define mpi_abort_ MPI_ABORT
#define mpi_allreduce_ MPI_ALLREDUCE
#define bi_f77_mpi_attr_get_ BI_F77_MPI_ATTR_GET
#define mpi_barrier_ MPI_BARRIER
#define mpi_bcast_ MPI_BCAST
#define mpi_comm_create_ MPI_COMM_CREATE
#define mpi_comm_dup_ MPI_COMM_DUP
#define mpi_comm_free_ MPI_COMM_FREE
#define mpi_comm_group_ MPI_COMM_GROUP
#define mpi_comm_rank_ MPI_COMM_RANK
#define mpi_comm_size_ MPI_COMM_SIZE
#define mpi_comm_split_ MPI_COMM_SPLIT
#define mpi_error_class_ MPI_ERROR_CLASS
#define mpi_finalize_ MPI_FINALIZE
#define mpi_get_count_ MPI_GET_COUNT
#define mpi_group_incl_ MPI_GROUP_INCL
#define mpi_group_free_ MPI_GROUP_FREE
#define mpi_init_ MPI_INIT
#define bi_f77_mpi_initialized_ BI_F77_MPI_INITIALIZED
#define mpi_irecv_ MPI_IRECV
#define mpi_isend_ MPI_ISEND
#define bi_f77_mpi_op_create_ BI_F77_MPI_OP_CREATE
#define mpi_op_free_ MPI_OP_FREE
#define mpi_pack_ MPI_PACK
#define mpi_pack_size_ MPI_PACK_SIZE
#define mpi_recv_ MPI_RECV
#define mpi_reduce_ MPI_REDUCE
#define mpi_rsend_ MPI_RSEND
#define mpi_send_ MPI_SEND
#define mpi_sendrecv_ MPI_SENDRECV
#define bi_f77_mpi_test_ BI_F77_MPI_TEST
#define bi_f77_mpi_testall_ BI_F77_MPI_TESTALL
#define mpi_type_commit_ MPI_TYPE_COMMIT
#define mpi_type_contiguous_ MPI_TYPE_CONTIGUOUS
#define mpi_type_free_ MPI_TYPE_FREE
#define mpi_type_indexed_ MPI_TYPE_INDEXED
#define mpi_type_struct_ MPI_TYPE_STRUCT
#define mpi_type_vector_ MPI_TYPE_VECTOR
#define mpi_unpack_ MPI_UNPACK
#define mpi_waitall_ MPI_WAITALL
#define mpi_wtime_ MPI_WTIME
#define bi_f77_get_constants_ BI_F77_GET_CONSTANTS
#define bi_f77_init_ BI_F77_INIT
#else
#define mpi_init_ MPI_INIT
#define bi_f77_init_ BI_F77_INIT
#define bi_f77_get_constants_ BI_F77_GET_CONSTANTS
#if (BI_TransComm == BONEHEAD)
#define mpi_comm_group_ MPI_COMM_GROUP
#define mpi_group_translate_ranks_ MPI_GROUP_TRANSLATE_RANKS
#endif
#endif
#endif
#if (F77_CALL_C == F77ISF2C)
/*
* These defines set up the naming scheme required to have a fortran 77
* routine call a C routine (which is what the BLACS are written in)
* for systems where the fortran "compiler" is actually f2c (a fortran
* to C conversion utility).
*/
/*
* Initialization routines
*/
#define blacs_pinfo_ blacs_pinfo__
#define blacs_setup_ blacs_setup__
#define blacs_set_ blacs_set__
#define blacs_get_ blacs_get__
#define blacs_gridinit_ blacs_gridinit__
#define blacs_gridmap_ blacs_gridmap__
/*
* Destruction routines
*/
#define blacs_freebuff_ blacs_freebuff__
#define blacs_gridexit_ blacs_gridexit__
#define blacs_abort_ blacs_abort__
#define blacs_exit_ blacs_exit__
/*
* Informational & misc.
*/
#define blacs_gridinfo_ blacs_gridinfo__
#define blacs_pnum_ blacs_pnum__
#define blacs_pcoord_ blacs_pcoord__
#define blacs_barrier_ blacs_barrier__
/*
* If we are using the fortran interface to MPI, need to redefine the names
*/
#ifdef UseF77Mpi
#define mpi_abort_ mpi_abort__
#define mpi_allreduce_ mpi_allreduce__
#define mpi_barrier_ mpi_barrier__
#define mpi_bcast_ mpi_bcast__
#define mpi_init_ mpi_init__
#define mpi_finalize_ mpi_finalize__
#define mpi_irecv_ mpi_irecv__
#define mpi_pack_ mpi_pack__
#define mpi_isend_ mpi_isend__
#define mpi_recv_ mpi_recv__
#define mpi_reduce_ mpi_reduce__
#define mpi_rsend_ mpi_rsend__
#define mpi_send_ mpi_send__
#define mpi_sendrecv_ mpi_sendrecv__
#define mpi_unpack_ mpi_unpack__
#define mpi_waitall_ mpi_waitall__
#define mpi_wtime_ mpi_wtime__
#define mpi_comm_create_ mpi_comm_create__
#define mpi_comm_dup_ mpi_comm_dup__
#define mpi_comm_free_ mpi_comm_free__
#define mpi_comm_group_ mpi_comm_group__
#define mpi_comm_rank_ mpi_comm_rank__
#define mpi_comm_size_ mpi_comm_size__
#define mpi_comm_split_ mpi_comm_split__
#define mpi_error_class_ mpi_error_class__
#define mpi_get_count_ mpi_get_count__
#define mpi_group_incl_ mpi_group_incl__
#define mpi_group_free_ mpi_group_free__
#define mpi_op_free_ mpi_op_free__
#define mpi_pack_size_ mpi_pack_size__
#define mpi_type_commit_ mpi_type_commit__
#define mpi_type_contiguous_ mpi_type_contiguous__
#define mpi_type_free_ mpi_type_free__
#define mpi_type_indexed_ mpi_type_indexed__
#define mpi_type_struct_ mpi_type_struct__
#define mpi_type_vector_ mpi_type_vector__
#define bi_f77_get_constants_ bi_f77_get_constants__
#define bi_f77_init_ bi_f77_init__
#define mpi_group_translate_ranks_ mpi_group_translate_ranks__
#define bi_f77_mpi_initialized_ bi_f77_mpi_initialized__
#define bi_f77_mpi_test_ bi_f77_mpi_test__
#define bi_f77_mpi_testall_ bi_f77_mpi_testall__
#define bi_f77_mpi_attr_get_ bi_f77_mpi_attr_get__
#define bi_f77_mpi_op_create_ bi_f77_mpi_op_create__
#else
#define mpi_init_ mpi_init__
#define bi_f77_get_constants_ bi_f77_get_constants__
#define bi_f77_init_ bi_f77_init__
#if (BI_TransComm == BONEHEAD)
#define mpi_comm_group_ mpi_comm_group__
#define mpi_group_translate_ranks_ mpi_group_translate_ranks__
#endif
#endif
#endif
/*
* ==========================================================================
* Prototype the fortran interface MPI functions if they are going to be used
* ==========================================================================
*/
#ifdef UseF77Mpi
#ifdef __STDC__
F_VOID_FUNC mpi_abort_(int*, int*, int*);
F_VOID_FUNC mpi_allreduce_(void*, void*, int*, int*, int*, int*, int*);
F_VOID_FUNC bi_f77_mpi_attr_get_(int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_barrier_(int*, int*);
F_VOID_FUNC mpi_bcast_(void*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_comm_create_(int*, int*, int*, int*);
F_VOID_FUNC mpi_comm_dup_(int*, int*, int*);
F_VOID_FUNC mpi_comm_free_(int*, int*);
F_VOID_FUNC mpi_comm_group_(int*, int*, int*);
F_VOID_FUNC mpi_comm_rank_(int*, int*, int*);
F_VOID_FUNC mpi_comm_size_(int*, int*, int*);
F_VOID_FUNC mpi_comm_split_(int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_error_class_(int*, int*, int*);
F_VOID_FUNC mpi_finalize_(int*);
F_VOID_FUNC mpi_get_count_(int*, int*, int*, int*);
F_VOID_FUNC mpi_group_incl_(int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_group_free_(int*, int*);
F_VOID_FUNC mpi_init_(int*);
F_VOID_FUNC bi_f77_mpi_initialized_(int*, int*);
F_VOID_FUNC mpi_irecv_(void*, int*, int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_isend_(void*, int*, int*, int*, int*, int*, int*, int*);
F_VOID_FUNC bi_f77_mpi_op_create_(void func(void*, void*, int*, int*),
int*, int*, int*);
F_VOID_FUNC mpi_op_free_(int*, int*);
F_VOID_FUNC mpi_pack_(void*, int*, int*, void*, int*, int*, int*, int*);
F_VOID_FUNC mpi_pack_size_(int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_recv_(void *, int*, int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_reduce_(void*, void*, int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_rsend_(void*, int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_send_(void*, int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_sendrecv_(void*, int*, int*, int*, int*, void*, int*, int*,
int*, int*, int*, int*, int*);
F_VOID_FUNC bi_f77_mpi_test_(int*, int*, int*, int*);
F_VOID_FUNC bi_f77_mpi_testall_(int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_type_commit_(int*, int*);
F_VOID_FUNC mpi_type_contiguous_(int*, int*, int*, int*);
F_VOID_FUNC mpi_type_free_(int*, int*);
F_VOID_FUNC mpi_type_indexed_(int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_type_struct_(int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_type_vector_(int*, int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_unpack_(void*, int*, int*, void*, int*, int*, int*, int*);
F_VOID_FUNC mpi_waitall_(int*, int*, int*, int*);
F_DOUBLE_FUNC mpi_wtime(void);
#else
F_VOID_FUNC mpi_abort_();
F_VOID_FUNC mpi_allreduce_();
F_VOID_FUNC bi_f77_mpi_attr_get_();
F_VOID_FUNC mpi_barrier_();
F_VOID_FUNC mpi_bcast_();
F_VOID_FUNC mpi_comm_create_();
F_VOID_FUNC mpi_comm_dup_();
F_VOID_FUNC mpi_comm_free_();
F_VOID_FUNC mpi_comm_group_();
F_VOID_FUNC mpi_comm_rank_();
F_VOID_FUNC mpi_comm_size_();
F_VOID_FUNC mpi_comm_split_();
F_VOID_FUNC mpi_error_class_();
F_VOID_FUNC mpi_finalize_();
F_VOID_FUNC mpi_get_count_();
F_VOID_FUNC mpi_group_incl_();
F_VOID_FUNC mpi_group_free_();
F_VOID_FUNC mpi_init_();
F_VOID_FUNC bi_f77_mpi_initialized_();
F_VOID_FUNC mpi_irecv_();
F_VOID_FUNC mpi_isend_();
F_VOID_FUNC bi_f77_mpi_op_create_();
F_VOID_FUNC mpi_op_free_();
F_VOID_FUNC mpi_pack_();
F_VOID_FUNC mpi_pack_size_();
F_VOID_FUNC mpi_recv_();
F_VOID_FUNC mpi_reduce_();
F_VOID_FUNC mpi_rsend_();
F_VOID_FUNC mpi_send_();
F_VOID_FUNC mpi_sendrecv_();
F_VOID_FUNC bi_f77_mpi_test_();
F_VOID_FUNC bi_f77_mpi_testall_();
F_VOID_FUNC mpi_type_commit_();
F_VOID_FUNC mpi_type_contiguous_();
F_VOID_FUNC mpi_type_free_();
F_VOID_FUNC mpi_type_indexed_();
F_VOID_FUNC mpi_type_struct_();
F_VOID_FUNC mpi_type_vector_();
F_VOID_FUNC mpi_unpack_();
F_VOID_FUNC mpi_waitall_();
F_DOUBLE_FUNC BI_MPI_Wtime();
#endif
/*
* If we are using the C interface, still may need some f77 functions to do
* context translation
*/
#else
#if (BI_TransComm == BONEHEAD)
#ifdef __STDC__
F_VOID_FUNC mpi_comm_create_(int*, int*, int*, int*);
F_VOID_FUNC mpi_comm_free_(int*, int*);
F_VOID_FUNC mpi_comm_group_(int*, int*, int*);
F_VOID_FUNC mpi_comm_size_(int*, int*, int*);
F_VOID_FUNC mpi_group_incl_(int*, int*, int*, int*, int*);
F_VOID_FUNC mpi_group_free_(int*, int*);
F_VOID_FUNC mpi_group_translate_ranks_(int*, int*, int*, int*, int*, int*);
#else
F_VOID_FUNC mpi_comm_create_();
F_VOID_FUNC mpi_comm_free_();
F_VOID_FUNC mpi_comm_group_();
F_VOID_FUNC mpi_comm_size_();
F_VOID_FUNC mpi_group_incl_();
F_VOID_FUNC mpi_group_free_();
F_VOID_FUNC mpi_group_translate_ranks_();
#endif
#endif
#endif
/*
* ================================================
* Define MPI functions for C and fortran interface
* ================================================
*/
#ifdef UseF77Mpi
#define BI_MPI_Abort(comm_, errcode_, ierr_)\
{ \
mpi_abort_(&(comm_), &(errcode_), &(ierr_)); \
Mmpierror((ierr_), "MPI_ABORT", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Abort(comm_, errcode_, ierr_)\
{ \
(ierr_) = MPI_Abort((comm_), (errcode_)); \
Mmpierror((ierr_), "MPI_Abort", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Allreduce(sbuf_, rbuf_, count_, dtype_, op_, comm_, ierr_)\
{ \
mpi_allreduce_((sbuf_), (rbuf_), &(count_), &(dtype_), &(op_), &(comm_), \
&(ierr_)); \
Mmpierror((ierr_), "MPI_ALLREDUCE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Allreduce(sbuf_, rbuf_, count_, dtype_, op_, comm_, ierr_)\
{ \
(ierr_) = MPI_Allreduce((sbuf_), (rbuf_), (count_), (dtype_), (op_), \
(comm_)); \
Mmpierror((ierr_), "MPI_Allreduce", NULL, __LINE__, __FILE__); \
}
#endif
/*
* Need to be sure to set attr_ to pointing at int before call . . .
* int *iptr=&i; BI_MPI_Attr_get(... &iptr ...);
*/
#ifdef UseF77Mpi
#define BI_MPI_Attr_get(comm_, keyval_, attr_, flag_, ierr_) \
{ \
bi_f77_mpi_attr_get_(&(comm_), &(keyval_), (int *) *(attr_), (flag_), \
&(ierr_)); \
Mmpierror((ierr_), "MPI_ATTR_GET", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Attr_get(comm_, keyval_, attr_, flag_, ierr_) \
{ \
(ierr_) = MPI_Attr_get((comm_), (keyval_), (attr_), (flag_)); \
Mmpierror((ierr_), "MPI_Attr_get", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Barrier(comm_, ierr_) \
{ \
mpi_barrier_(&(comm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_BARRIER", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Barrier(comm_, ierr_) \
{ \
(ierr_) = MPI_Barrier((comm_)); \
Mmpierror((ierr_), "MPI_Barrier", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Bcast(buff_, count_, dtype_, root_, comm_, ierr_) \
{ \
mpi_bcast_((buff_), &(count_), &(dtype_), &(root_), &(comm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_BCAST", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Bcast(buff_, count_, dtype_, root_, comm_, ierr_) \
{ \
(ierr_) = MPI_Bcast((buff_), (count_), (dtype_), (root_), (comm_)); \
Mmpierror((ierr_), "MPI_Bcast", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Comm_create(comm_, group_, newcomm_, ierr_) \
{ \
mpi_comm_create_(&(comm_), &(group_), (newcomm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_COMM_CREATE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Comm_create(comm_, group_, newcomm_, ierr_) \
{ \
(ierr_) = MPI_Comm_create((comm_), (group_), (newcomm_)); \
Mmpierror((ierr_), "MPI_Comm_create", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Comm_dup(comm_, newcomm_, ierr_) \
{ \
mpi_comm_dup_(&(comm_), (newcomm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_COMM_DUP", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Comm_dup(comm_, newcomm_, ierr_) \
{ \
(ierr_) = MPI_Comm_dup((comm_), (newcomm_)); \
Mmpierror((ierr_), "MPI_Comm_dup", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Comm_free(comm_, ierr_) \
{ \
mpi_comm_free_((comm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_COMM_FREE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Comm_free(comm_, ierr_) \
{ \
(ierr_) = MPI_Comm_free((comm_)); \
Mmpierror((ierr_), "MPI_Comm_free", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Comm_group(comm_, grp_, ierr_) \
{ \
mpi_comm_group_(&(comm_), (grp_), &(ierr_)); \
Mmpierror((ierr_), "MPI_COMM_GROUP", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Comm_group(comm_, grp_, ierr_) \
{ \
(ierr_) = MPI_Comm_group((comm_), (grp_)); \
Mmpierror((ierr_), "MPI_Comm_group", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Comm_rank(comm_, rank_, ierr_) \
{ \
mpi_comm_rank_(&(comm_), (rank_), &(ierr_)); \
Mmpierror((ierr_), "MPI_COMM_RANK", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Comm_rank(comm_, rank_, ierr_) \
{ \
(ierr_) = MPI_Comm_rank((comm_), (rank_)); \
Mmpierror((ierr_), "MPI_Comm_rank", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Comm_size(comm_, size_, ierr_) \
{ \
mpi_comm_size_(&(comm_), (size_), &(ierr_)); \
Mmpierror((ierr_), "MPI_COMM_SIZE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Comm_size(comm_, size_, ierr_) \
{ \
(ierr_) = MPI_Comm_size((comm_), (size_)); \
Mmpierror((ierr_), "MPI_Comm_size", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Comm_split(comm_, color_, key_, newcomm_, ierr_) \
{ \
mpi_comm_split_(&(comm_), &(color_), &(key_), (newcomm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_COMM_SPLIT", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Comm_split(comm_, color_, key_, newcomm_, ierr_) \
{ \
(ierr_) = MPI_Comm_split((comm_), (color_), (key_), (newcomm_)); \
Mmpierror((ierr_), "MPI_Comm_split", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Error_class(errcode_, errclass_, ierr_) \
{ \
mpi_error_class_(&(errcode_), (errclass_), &(ierr_)); \
Mmpierror((ierr_), "MPI_ERROR_CLASS", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Error_class(errcode_, errclass_, ierr_) \
{ \
(ierr_) = MPI_Error_class((errcode_), (errclass_)); \
Mmpierror((ierr_), "MPI_Error_class", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Finalize(ierr_) \
{ \
mpi_finalize_(&(ierr_)); \
Mmpierror((ierr_), "MPI_FINALIZE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Finalize(ierr_) \
{ \
(ierr_) = MPI_Finalize(); \
Mmpierror((ierr_), "MPI_Finalize", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Get_count(stat_, dtype_, count_, ierr_) \
{ \
mpi_get_count_((stat_), &(dtype_), (count_), &(ierr_)); \
Mmpierror((ierr_), "MPI_GET_COUNT", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Get_count(stat_, dtype_, count_, ierr_) \
{ \
(ierr_) = MPI_Get_count((stat_), (dtype_), (count_)); \
Mmpierror((ierr_), "MPI_Get_count", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Group_free(grp_, ierr_) \
{ \
mpi_group_free_((grp_), &(ierr_)); \
Mmpierror((ierr_), "MPI_GROUP_FREE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Group_free(grp_, ierr_) \
{ \
(ierr_) = MPI_Group_free(grp_); \
Mmpierror((ierr_), "MPI_Group_free", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Group_incl(grp_, n_, ranks_, newgrp_, ierr_) \
{ \
mpi_group_incl_(&(grp_), &(n_), (ranks_), (newgrp_), &(ierr_)); \
Mmpierror((ierr_), "MPI_GROUP_INCL", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Group_incl(grp_, n_, ranks_, newgrp_, ierr_) \
{ \
(ierr_) = MPI_Group_incl((grp_), (n_), (ranks_), (newgrp_)); \
Mmpierror((ierr_), "MPI_Group_incl", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Group_translate_ranks(grp1_, n_, ranks1_, grp2_, ranks2_, ierr_) \
{ \
MPI_Group_translate_ranks(&(grp1_), &(n_), (ranks1_), &(grp2_), (ranks2_),\
&(ierr_)); \
Mmpierror((ierr_), "MPI_GROUP_TRANSLATE_RANKS", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Group_translate_ranks(grp1_, n_, ranks1_, grp2_, ranks2_, ierr_) \
{ \
(ierr_) = MPI_Group_translate_ranks((grp1_), (n_), (ranks1_), (grp2_),\
(ranks2_)); \
Mmpierror((ierr_), "MPI_Group_translate_ranks", NULL, __LINE__, __FILE__); \
}
#endif
/*
* The BLACS always call f77's mpi_init. If the user is using C, he should
* explicitly call MPI_Init . . .
*/
#define BI_MPI_Init(argc_, argv_, ierr_) \
{ \
mpi_init_(&(ierr_)); \
Mmpierror((ierr_), "MPI_INIT", NULL, __LINE__, __FILE__); \
}
#ifdef UseF77Mpi
#define BI_MPI_Initialized(flag_, ierr_) \
{ \
bi_f77_mpi_initialized_((flag_), &(ierr_)); \
Mmpierror((ierr_), "MPI_INITIALIZED", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Initialized(flag_, ierr_) \
{ \
(ierr_) = MPI_Initialized((flag_)); \
Mmpierror((ierr_), "MPI_Initialized", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Irecv(buf_, count_, dtype_, src_, tag_, comm_, req_, ierr_) \
mpi_irecv_((buf_), &(count_), &(dtype_), &(src_), &(tag_), &(comm_), \
(req_), &(ierr_))
#else
#define BI_MPI_Irecv(buf_, count_, dtype_, src_, tag_, comm_, req_, ierr_) \
(ierr_) = MPI_Irecv((buf_), (count_), (dtype_), (src_), (tag_), (comm_), \
(req_))
#endif
#ifdef UseF77Mpi
#define BI_MPI_Isend(buf_, count_, dtype_, dest_, tag_, comm_, req_, ierr_) \
mpi_isend_((buf_), &(count_), &(dtype_), &(dest_), &(tag_), &(comm_), \
(req_), &(ierr_));
#else
#define BI_MPI_Isend(buf_, count_, dtype_, dest_, tag_, comm_, req_, ierr_) \
(ierr_) = MPI_Isend((buf_), (count_), (dtype_), (dest_), (tag_), (comm_), \
(req_))
#endif
#ifdef UseF77Mpi
#define BI_MPI_Op_create(func_, commute_, op_, ierr_) \
{ \
bi_f77_mpi_op_create_((func_), &(commute_), (op_), &(ierr_)); \
Mmpierror((ierr_), "MPI_OP_CREATE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Op_create(func_, commute_, op_, ierr_) \
{ \
(ierr_) = MPI_Op_create((func_), (commute_), (op_)); \
Mmpierror((ierr_), "MPI_Op_create", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Op_free(op_, ierr_) \
{ \
mpi_op_free_((op_), &(ierr_)); \
Mmpierror((ierr_), "MPI_OP_FREE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Op_free(op_, ierr_) \
{ \
(ierr_) = MPI_Op_free((op_)); \
Mmpierror((ierr_), "MPI_Op_free", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Pack(inbuf_, incount_, dtype_, outbuf_, outsiz_, pos_, comm_, ierr_) \
{ \
mpi_pack_((inbuf_), &(incount_), &(dtype_), (outbuf_), &(outsiz_), \
(pos_), &(comm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_PACK", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Pack(inbuf_, incount_, dtype_, outbuf_, outsiz_, pos_, comm_, ierr_) \
{ \
(ierr_) = MPI_Pack((inbuf_), (incount_), (dtype_), (outbuf_), (outsiz_), \
(pos_), (comm_)); \
Mmpierror((ierr_), "MPI_Pack", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Pack_size(incount_, dtype_, comm_, size_, ierr_) \
{ \
mpi_pack_size_(&(incount_), &(dtype_), &(comm_), (size_), &(ierr_)); \
Mmpierror((ierr_), "MPI_PACK_SIZE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Pack_size(incount_, dtype_, comm_, size_, ierr_) \
{ \
(ierr_) = MPI_Pack_size((incount_), (dtype_), (comm_), (size_)); \
Mmpierror((ierr_), "MPI_Pack_size", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Recv(buf_, count_, dtype_, src_, tag_, comm_, stat_, ierr_) \
{ \
mpi_recv_((buf_), &(count_), &(dtype_), &(src_), &(tag_), &(comm_), \
(stat_), &(ierr_)); \
Mmpierror((ierr_), "MPI_RECV", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Recv(buf_, count_, dtype_, src_, tag_, comm_, stat_, ierr_) \
{ \
(ierr_) = MPI_Recv((buf_), (count_), (dtype_), (src_), (tag_), (comm_), \
(stat_)); \
Mmpierror((ierr_), "MPI_Recv", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Reduce(sbuf_, rbuf_, count_, dtype_, op_, root_, comm_, ierr_) \
{ \
mpi_reduce_((sbuf_), (rbuf_), &(count_), &(dtype_), &(op_), &(root_), \
&(comm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_REDUCE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Reduce(sbuf_, rbuf_, count_, dtype_, op_, root_, comm_, ierr_) \
{ \
(ierr_) = MPI_Reduce((sbuf_), (rbuf_), (count_), (dtype_), (op_), (root_), \
(comm_)); \
Mmpierror((ierr_), "MPI_Reduce", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Rsend(buf_, count_, dtype_, dest_, tag_, comm_, ierr_) \
{ \
mpi_rsend_((buf_), &(count_), &(dtype_), &(dest_), &(tag_), &(comm_), \
&(ierr_)); \
Mmpierror((ierr_), "MPI_RSEND", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Rsend(buf_, count_, dtype_, dest_, tag_, comm_, ierr_) \
{ \
(ierr_) = MPI_Rsend((buf_), (count_), (dtype_), (dest_), (tag_), (comm_)); \
Mmpierror((ierr_), "MPI_Rsend", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Send(buf_, count_, dtype_, dest_, tag_, comm_, ierr_) \
{ \
mpi_send_((buf_), &(count_), &(dtype_), &(dest_), &(tag_), &(comm_), \
&(ierr_)); \
Mmpierror((ierr_), "MPI_SEND", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Send(buf_, count_, dtype_, dest_, tag_, comm_, ierr_) \
{ \
(ierr_) = MPI_Send((buf_), (count_), (dtype_), (dest_), (tag_), (comm_)); \
Mmpierror((ierr_), "MPI_Send", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Sendrecv(sbuf_, scount_, stype_, dest_, stag_, rbuf_, rcount_, rtype_, src_, rtag_, comm_, stat_, ierr_) \
{ \
mpi_sendrecv_((sbuf_), &(scount_), &(stype_), &(dest_), &(stag_), \
(rbuf_), &(rcount_), &(rtype_), &(src_), &(rtag_), \
&(comm_), (stat_), &(ierr_)); \
Mmpierror((ierr_), "MPI_SENDRECV", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Sendrecv(sbuf_, scount_, stype_, dest_, stag_, rbuf_, rcount_, rtype_, src_, rtag_, comm_, stat_, ierr_) \
{ \
(ierr_) = MPI_Sendrecv((sbuf_), (scount_), (stype_), (dest_), (stag_), \
(rbuf_), (rcount_), (rtype_), (src_), (rtag_), \
(comm_), (stat_)); \
Mmpierror((ierr_), "MPI_Sendrecv", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Test(req_, flag_, stat_, ierr_) \
{ \
bi_f77_mpi_test_(&(req_), (flag_), (stat_), &(ierr_)); \
Mmpierror((ierr_), "MPI_TEST", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Test(req_, flag_, stat_, ierr_) \
{ \
(ierr_) = MPI_Test((req_), (flag_), (stat_)); \
Mmpierror((ierr_), "MPI_Test", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Testall(count_, reqs_, flag_, stats_, ierr_) \
{ \
bi_f77_mpi_testall_(&(count_), (reqs_), (flag_), (stats_), &(ierr_)); \
Mmpierror((ierr_), "MPI_TESTALL", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Testall(count_, reqs_, flag_, stats_, ierr_) \
{ \
(ierr_) = MPI_Testall((count_), (reqs_), (flag_), (stats_)); \
Mmpierror((ierr_), "MPI_Testall", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Type_commit(dtype_, ierr_) \
{ \
mpi_type_commit_((dtype_), &(ierr_)); \
Mmpierror((ierr_), "MPI_TYPE_COMMIT", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Type_commit(dtype_, ierr_) \
{ \
(ierr_) = MPI_Type_commit((dtype_)); \
Mmpierror((ierr_), "MPI_Type_commit", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Type_contiguous(count_, oldtype_, newtype_, ierr_) \
{ \
mpi_type_contiguous_(&(count_), &(oldtype_), (newtype_), &(ierr_)); \
Mmpierror((ierr_), "MPI_TYPE_CONTIGUOUS", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Type_contiguous(count_, oldtype_, newtype_, ierr_) \
{ \
(ierr_) = MPI_Type_contiguous((count_), (oldtype_), (newtype_)); \
Mmpierror((ierr_), "MPI_Type_contiguous", NULL, __LINE__, __FILE__); \
}
#endif
/*
* Some versions of mpich and its derivitives cannot handle 0 byte typedefs,
* so we set type MPI_BYTE as a flag for a 0 byte message
*/
#ifdef ZeroByteTypeBug
#ifdef UseF77Mpi
#define BI_MPI_Type_free(dtype_, ierr_) \
{ \
if ( *(dtype_) != BI_MPI_BYTE) \
{ \
mpi_type_free_((dtype_), &(ierr_)); \
Mmpierror((ierr_), "MPI_TYPE_FREE", NULL, __LINE__, __FILE__); \
} \
}
#else
#define BI_MPI_Type_free(dtype_, ierr_) \
{ \
if ( *(dtype_) != BI_MPI_BYTE) \
{ \
(ierr_) = MPI_Type_free((dtype_)); \
Mmpierror((ierr_), "MPI_Type_free", NULL, __LINE__, __FILE__); \
} \
}
#endif
#else
#ifdef UseF77Mpi
#define BI_MPI_Type_free(dtype_, ierr_) \
{ \
mpi_type_free_((dtype_), &(ierr_)); \
Mmpierror((ierr_), "MPI_TYPE_FREE", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Type_free(dtype_, ierr_) \
{ \
(ierr_) = MPI_Type_free((dtype_)); \
Mmpierror((ierr_), "MPI_Type_free", NULL, __LINE__, __FILE__); \
}
#endif
#endif
#ifdef UseF77Mpi
#define BI_MPI_Type_indexed(count_, lens_, disp_, oldtype_, newtype_, ierr_) \
{ \
mpi_type_indexed_(&(count_), (lens_), (disp_), &(oldtype_), (newtype_), \
&(ierr_)); \
Mmpierror((ierr_), "MPI_TYPE_INDEXED", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Type_indexed(count_, lens_, disp_, oldtype_, newtype_, ierr_) \
{ \
(ierr_) = MPI_Type_indexed((count_), (lens_), (disp_), (oldtype_), \
(newtype_)); \
Mmpierror((ierr_), "MPI_Type_indexed", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Type_struct(count_, lens_, disps_, types_, newtype_, ierr_) \
{ \
mpi_type_struct_(&(count_), (lens_), (disps_), (types_), (newtype_), \
&(ierr_)); \
Mmpierror((ierr_), "MPI_TYPE_STRUCT", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Type_struct(count_, lens_, disps_, types_, newtype_, ierr_) \
{ \
(ierr_) = MPI_Type_struct((count_), (lens_), (disps_), (types_), \
(newtype_)); \
Mmpierror((ierr_), "MPI_Type_struct", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Type_vector(count_, len_, stride_, oldtype_, newtype_, ierr_) \
{ \
mpi_type_vector_(&(count_), &(len_), &(stride_), &(oldtype_), (newtype_), \
&(ierr_)); \
Mmpierror((ierr_), "MPI_TYPE_VECTOR", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Type_vector(count_, len_, stride_, oldtype_, newtype_, ierr_) \
{ \
(ierr_) = MPI_Type_vector((count_), (len_), (stride_), (oldtype_), \
(newtype_)); \
Mmpierror((ierr_), "MPI_Type_vector", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Unpack(inbuf_, insize_, pos_, outbuf_, outcount_, dtype_, comm_, ierr_) \
{ \
mpi_unpack_((inbuf_), &(insize_), (pos_), (outbuf_), &(outcount_), \
&(dtype_), &(comm_), &(ierr_)); \
Mmpierror((ierr_), "MPI_UNPACK", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Unpack(inbuf_, insize_, pos_, outbuf_, outcount_, dtype_, comm_, ierr_) \
{ \
(ierr_) = MPI_Unpack((inbuf_), (insize_), (pos_), (outbuf_), (outcount_), \
(dtype_), (comm_)); \
Mmpierror((ierr_), "MPI_Unpack", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Waitall(count_, reqs_, stats_, ierr_) \
{ \
mpi_waitall_(&(count_), (reqs_), (stats_), &(ierr_)); \
Mmpierror((ierr_), "MPI_WAITALL", NULL, __LINE__, __FILE__); \
}
#else
#define BI_MPI_Waitall(count_, reqs_, stats_, ierr_) \
{ \
(ierr_) = MPI_Waitall((count_), (reqs_), (stats_)); \
Mmpierror((ierr_), "MPI_Waitall", NULL, __LINE__, __FILE__); \
}
#endif
#ifdef UseF77Mpi
#define BI_MPI_Wtime mpi_wtime_
#else
#define BI_MPI_Wtime MPI_Wtime
#endif
#ifdef CRAY
#ifndef UseF77Mpi
#undef BI_MPI_FLOAT
#define BI_MPI_FLOAT BI_MPI_DOUBLE
#endif
#endif
#endif
syntax highlighted by Code2HTML, v. 0.9.1