/* * lalib.h * * Header for lalib library * */ #include <mpi.h> typedef enum {FALSE, TRUE} Boolean; /* Lalib_grid: infos about logical 'processor' grid */ #define LALIB_NDIMS 2 /* number of dimensions of processor grid */ typedef struct { int rows; /* dimensions of 'processor' grid */ int cols; int myrow; /* position of local process */ int mycol; MPI_Comm grid_comm; MPI_Comm row_comm; MPI_Comm col_comm; } Lalib_grid; Lalib_grid *lalib_build_grid(MPI_Comm comm, int rows, int cols); /* * Lalib_vector: row- or columnwise replicated distributed vector */ #define LALIB_ROW 0 /* vector types */ #define LALIB_COL 1 typedef struct { int length; /* full length of vector */ int local_length; /* local vector length */ int blocklength; /* length of blocks */ int type; /* column or row vector */ double * data; /* local part of vector data */ Lalib_grid * grid; /* processor grid */ } Lalib_vector; Lalib_vector *lalib_build_vector(int length, int type, int blocklen, Lalib_grid *grid); /* mappings between global vector index and (1d-processor, local index) */ void lalib_vector_local_index(Lalib_vector *v, int m, int *p, int*i); void lalib_vector_global_index(Lalib_vector *v, int p, int i, int *m); int lalib_dot_nostride(Lalib_vector *a, Lalib_vector *b, double *result); int lalib_dot_stride(Lalib_vector *a, Lalib_vector *b, double *result);