#ifndef PIO_INFO_
#define PIO_INFO_

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <mpi.h>
#include <stdio.h>

int cdiPioCommInit(MPI_Comm commGlob, int IOMode, int clientServerRole);
void cdiPioCommFinalize(void);

MPI_Comm commInqCommGlob(void);
int commInqSizeGlob(void);
int commInqRankGlob(void);
int commInqRootGlob(void);

/* returns the inter-communicator used to connect from
 * client to server group */
MPI_Comm cdiPioInqInterComm(void);

int commInqIsProcIO(void);
int commInqIOMode(void);

void commDefCommPio(void);
MPI_Comm commInqCommPio(void);
int commInqSizePio(void);
int commInqRankPio(void);

MPI_Comm commInqCommModel(void);
int commInqRankModel(void);
int cdiPioCommInqSizeClients(void);

int commInqSpecialRank(void);

void commDefCommColl(int);
MPI_Comm commInqCommColl(void);
int commRankGlob2CollID(int rankGlob);
int commInqSizeColl(void);
int commInqRankColl(void);
MPI_Comm commInqCommCalc(void);
int commInqNProcsColl(void);

void commPrint(FILE *);

/* query rank of collector responsible for client on inter-communicator
 * returns -1 on server processes.
 */
int cdiPioInqCollectorOfClient(void);

/* query communicator containing clients and collectors,
 * the collectors occupy the top-ranks
 */
MPI_Comm cdiPioInqCollClientIntraComm(void);

/* query group of corresponding processes in other group on
   intra-communicator */
MPI_Group cdiPioInqRemoteGroup(void);

static inline int
cdiPioCollRank(int clientRank, int numClients, int numColl)
{
  return (int) (((long long) clientRank * (long long) numColl + (long long) (numColl - 1)) / numClients);
}

static inline int
cdiPioClientRangeStart(int collRank, int numClients, int numColl)
{
  return (int) (((long long) collRank * (long long) numClients) / (long long) numColl);
}

#endif
/*
 * Local Variables:
 * c-file-style: "Java"
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */
