From: Robert Edwards <edwards@jlab.org>
To: Richard Brower <brower@ctp.mit.edu>
Subject: parsmp_rts.h


/* $Id: parsmp_rts.h,v 12.11 2001/02/15 21:45:58 edwards Exp $ ($Date: 2001/02/15 21:45:58 $) */

/* Data structures used to parallel SMP boxes running MPI */

#ifndef _PARSMP_RTS_
#define _PARSMP_RTS_

#define ND  4

typedef struct PARSMP_geometry
{
  /* Dimension of problem geometry */
  unsigned dimension;

  /* Dimension of geometry used for PAR */
  unsigned PAR_dim;

  /* My logical (rotated) coordinates */
  unsigned coord[ND];

  /* My logical (rotated) lexicographic node id */
  unsigned nodeid;

  /* Number of virtual processors to physical processors */
  unsigned subgrid_vol;

  /* Virtual lattice size */
  unsigned length[ND];

  /* Index mapping virtual lattice axes to physical axes */
  unsigned ordering[ND];

  /* Logical size of the machine */
  unsigned machine_size[ND];

  /* Subgrid length each logical (rotated) direction */
  unsigned subgrid_length[ND];

  /* Total number of words on face for each direction */
  unsigned count[ND];

  /* Number of blocks on face for each direction */
  unsigned numblk[ND];

  /* Block size on each face for each direction */
  unsigned blksize[ND];

} *PARSMP_geometry_t;


/* Some prototypes */
/* Main initialization */
void PARSMP_machine_init(int *argc, char ***argv);        /* initialize machine state */
void PARSMP_machine_init_child();                         /* initialize child state */
void PARSMP_machine_close(void);                          /* shutdown machine */
void PARSMP_create_physical_geometry(int *length, unsigned rank);

/* Virtual lattice */
PARSMP_geometry_t PARSMP_create_geometry(int *length, unsigned rank);
PARSMP_geometry_t PARSMP_create_detailed_geometry(int *length, unsigned rank, unsigned *ordering);
void PARSMP_grid_coord(PARSMP_geometry_t geom, int *length);
void PARSMP_machine_size(PARSMP_geometry_t geom, int *length);
void PARSMP_free_geometry(PARSMP_geometry_t geom);

/* Physical lattice */
int  PARSMP_physical_dimension();         /* dimension of machine - 0 if not inited */
void PARSMP_physical_coord(int coord[]);  /* coordinates in machine */
void PARSMP_physical_size(int size[]);    /* machine size */
int  PARSMP_physical_num_nodes();         /* number of nodes in system */
int  PARSMP_primary_nodeP();              /* is this the primary node ? */
int  PARSMP_physical_nodeid();            /* lexicographic node id in machine. x is fast */
int  PARSMP_physical_neigh(int isign, int dir); /* Return the neighbor id in the isign and dir direction */

/* Shifting */
int PARSMP_shift(PARSMP_geometry_t geom, int site, unsigned char *data,
		 int prim_size, int sn);

/* Basic communication operations */
void PARSMP_sendrecv_wait(void *send_buf, void *recv_buf, 
			  int count, int sign, int dir);
void PARSMP_sendrecv(void *send_buf, void *recv_buf, 
		     int count, int sign, int dir);
void PARSMP_wait(int dir);
void PARSMP_waitall(void);
void PARSMP_barrier(void);
void PARSMP_broadcast(void *data, int count);

/* Global sums */
void PARSMP_d_reduce(double *src, double *dest, int count);
void PARSMP_f_reduce(float *src, float *dest, int count);
void PARSMP_s_reduce(int *src, int *dest, int count);
void PARSMP_u_reduce(unsigned int *src, unsigned int *dest, int count);

#endif















