hypre/sstruct_mv/sstruct_grid.h
2001-12-04 23:15:35 +00:00

233 lines
9.3 KiB
C

/*BHEADER**********************************************************************
* (c) 2000 The Regents of the University of California
*
* See the file COPYRIGHT_and_DISCLAIMER for a complete copyright
* notice, contact person, and disclaimer.
*
* $Revision$
*********************************************************************EHEADER*/
/******************************************************************************
*
* Header info for the hypre_SStructGrid structures
*
*****************************************************************************/
#ifndef hypre_SSTRUCT_GRID_HEADER
#define hypre_SSTRUCT_GRID_HEADER
/*--------------------------------------------------------------------------
* hypre_SStructGrid:
*
* NOTE: Since variables may be replicated across different processes,
* a separate set of "interface grids" is retained so that data can be
* migrated onto and off of the internal (non-replicated) grids.
*--------------------------------------------------------------------------*/
typedef enum hypre_SStructVariable_enum hypre_SStructVariable;
typedef struct
{
HYPRE_SStructVariable type;
int rank; /* local rank */
int proc;
} hypre_SStructUVar;
typedef struct
{
int part;
hypre_Index cell;
int nuvars;
hypre_SStructUVar *uvars;
} hypre_SStructUCVar;
typedef struct
{
MPI_Comm comm; /* TODO: use different comms */
int ndim;
int nvars; /* number of variables */
HYPRE_SStructVariable *vartypes; /* types of variables */
hypre_StructGrid *sgrids[8]; /* struct grids for each vartype */
hypre_BoxArray *iboxarrays[8]; /* interface boxes */
hypre_BoxArray *pneighbors;
int local_size; /* Number of variables locally */
int global_size; /* Total number of variables */
hypre_Index periodic; /* Indicates if pgrid is periodic */
} hypre_SStructPGrid;
typedef struct
{
hypre_Box box;
int part;
hypre_Index ilower;
hypre_Index coord;
hypre_Index dir;
} hypre_SStructNeighbor;
enum hypre_SStructMapInfoType
{
hypre_SSTRUCT_MAP_INFO_DEFAULT = 0,
hypre_SSTRUCT_MAP_INFO_NEIGHBOR = 1
};
typedef struct
{
int type;
int proc;
int offset;
} hypre_SStructMapInfo;
typedef struct
{
int type;
int proc;
int offset; /* minimum offset for this box */
int part; /* part the box lives on */
hypre_Index ilower; /* local ilower on neighbor index-space */
hypre_Index coord; /* lives on local index-space */
hypre_Index dir; /* lives on neighbor index-space */
hypre_Index stride; /* lives on local index-space */
} hypre_SStructNMapInfo;
typedef struct hypre_SStructGrid_struct
{
MPI_Comm comm;
int ndim;
int nparts;
/* s-variable info */
hypre_SStructPGrid **pgrids;
/* neighbor info */
int *nneighbors;
hypre_SStructNeighbor **neighbors;
int **nvneighbors;
hypre_SStructNeighbor ***vneighbors;
/* u-variables info: During construction, array entries are consecutive.
* After 'Assemble', entries are referenced via local cell rank. */
int nucvars;
hypre_SStructUCVar **ucvars;
/* info for mapping (part, index, var) --> rank */
hypre_BoxMap ***maps; /* map for each part, var */
hypre_SStructMapInfo ***info;
hypre_SStructNMapInfo ***ninfo;
int start_rank;
int local_size; /* Number of variables locally */
int global_size; /* Total number of variables */
int ref_count;
} hypre_SStructGrid;
/*--------------------------------------------------------------------------
* Accessor macros: hypre_SStructGrid
*--------------------------------------------------------------------------*/
#define hypre_SStructGridComm(grid) ((grid) -> comm)
#define hypre_SStructGridNDim(grid) ((grid) -> ndim)
#define hypre_SStructGridNParts(grid) ((grid) -> nparts)
#define hypre_SStructGridPGrids(grid) ((grid) -> pgrids)
#define hypre_SStructGridPGrid(grid, part) ((grid) -> pgrids[part])
#define hypre_SStructGridNNeighbors(grid) ((grid) -> nneighbors)
#define hypre_SStructGridNeighbors(grid) ((grid) -> neighbors)
#define hypre_SStructGridNVNeighbors(grid) ((grid) -> nvneighbors)
#define hypre_SStructGridVNeighbors(grid) ((grid) -> vneighbors)
#define hypre_SStructGridNUCVars(grid) ((grid) -> nucvars)
#define hypre_SStructGridUCVars(grid) ((grid) -> ucvars)
#define hypre_SStructGridUCVar(grid, i) ((grid) -> ucvars[i])
#define hypre_SStructGridMaps(grid) ((grid) -> maps)
#define hypre_SStructGridMap(grid, part, var) ((grid) -> maps[part][var])
#define hypre_SStructGridInfo(grid) ((grid) -> info)
#define hypre_SStructGridNInfo(grid) ((grid) -> ninfo)
#define hypre_SStructGridStartRank(grid) ((grid) -> start_rank)
#define hypre_SStructGridLocalSize(grid) ((grid) -> local_size)
#define hypre_SStructGridGlobalSize(grid) ((grid) -> global_size)
#define hypre_SStructGridRefCount(grid) ((grid) -> ref_count)
/*--------------------------------------------------------------------------
* Accessor macros: hypre_SStructPGrid
*--------------------------------------------------------------------------*/
#define hypre_SStructPGridComm(pgrid) ((pgrid) -> comm)
#define hypre_SStructPGridNDim(pgrid) ((pgrid) -> ndim)
#define hypre_SStructPGridNVars(pgrid) ((pgrid) -> nvars)
#define hypre_SStructPGridVarTypes(pgrid) ((pgrid) -> vartypes)
#define hypre_SStructPGridVarType(pgrid, var) ((pgrid) -> vartypes[var])
#define hypre_SStructPGridSGrids(pgrid) ((pgrid) -> sgrids)
#define hypre_SStructPGridSGrid(pgrid, var) \
((pgrid) -> sgrids[hypre_SStructPGridVarType(pgrid, var)])
#define hypre_SStructPGridCellSGrid(pgrid) \
((pgrid) -> sgrids[HYPRE_SSTRUCT_VARIABLE_CELL])
#define hypre_SStructPGridVTSGrid(pgrid, vartype) ((pgrid) -> sgrids[vartype])
#define hypre_SStructPGridIBoxArrays(pgrid) ((pgrid) -> iboxarrays)
#define hypre_SStructPGridIBoxArray(pgrid, var) \
((pgrid) -> iboxarrays[hypre_SStructPGridVarType(pgrid, var)])
#define hypre_SStructPGridCellIBoxArray(pgrid) \
((pgrid) -> iboxarrays[HYPRE_SSTRUCT_VARIABLE_CELL])
#define hypre_SStructPGridVTIBoxArray(pgrid, vartype) \
((pgrid) -> iboxarrays[vartype])
#define hypre_SStructPGridPNeighbors(pgrid) ((pgrid) -> pneighbors)
#define hypre_SStructPGridLocalSize(pgrid) ((pgrid) -> local_size)
#define hypre_SStructPGridGlobalSize(pgrid) ((pgrid) -> global_size)
#define hypre_SStructPGridPeriodic(pgrid) ((pgrid) -> periodic)
/*--------------------------------------------------------------------------
* Accessor macros: hypre_SStructMapInfo
*--------------------------------------------------------------------------*/
#define hypre_SStructMapInfoType(info) ((info) -> type)
#define hypre_SStructMapInfoProc(info) ((info) -> proc)
#define hypre_SStructMapInfoOffset(info) ((info) -> offset)
/*--------------------------------------------------------------------------
* Accessor macros: hypre_SStructMapInfo
*--------------------------------------------------------------------------*/
#define hypre_SStructNMapInfoType(info) ((info) -> type)
#define hypre_SStructNMapInfoProc(info) ((info) -> proc)
#define hypre_SStructNMapInfoOffset(info) ((info) -> offset)
#define hypre_SStructNMapInfoPart(info) ((info) -> part)
#define hypre_SStructNMapInfoILower(info) ((info) -> ilower)
#define hypre_SStructNMapInfoCoord(info) ((info) -> coord)
#define hypre_SStructNMapInfoDir(info) ((info) -> dir)
#define hypre_SStructNMapInfoStride(info) ((info) -> stride)
/*--------------------------------------------------------------------------
* Accessor macros: hypre_SStructNeighbor
*--------------------------------------------------------------------------*/
#define hypre_SStructNeighborBox(neighbor) &((neighbor) -> box)
#define hypre_SStructNeighborPart(neighbor) ((neighbor) -> part)
#define hypre_SStructNeighborILower(neighbor) ((neighbor) -> ilower)
#define hypre_SStructNeighborCoord(neighbor) ((neighbor) -> coord)
#define hypre_SStructNeighborDir(neighbor) ((neighbor) -> dir)
/*--------------------------------------------------------------------------
* Accessor macros: hypre_SStructUCVar
*--------------------------------------------------------------------------*/
#define hypre_SStructUCVarPart(uc) ((uc) -> part)
#define hypre_SStructUCVarCell(uc) ((uc) -> cell)
#define hypre_SStructUCVarNUVars(uc) ((uc) -> nuvars)
#define hypre_SStructUCVarUVars(uc) ((uc) -> uvars)
#define hypre_SStructUCVarType(uc, i) ((uc) -> uvars[i].type)
#define hypre_SStructUCVarRank(uc, i) ((uc) -> uvars[i].rank)
#define hypre_SStructUCVarProc(uc, i) ((uc) -> uvars[i].proc)
#endif