| 1 | /*BHEADER**********************************************************************
|
|---|
| 2 | * Copyright (c) 2008, Lawrence Livermore National Security, LLC.
|
|---|
| 3 | * Produced at the Lawrence Livermore National Laboratory.
|
|---|
| 4 | * This file is part of HYPRE. See file COPYRIGHT for details.
|
|---|
| 5 | *
|
|---|
| 6 | * HYPRE is free software; you can redistribute it and/or modify it under the
|
|---|
| 7 | * terms of the GNU Lesser General Public License (as published by the Free
|
|---|
| 8 | * Software Foundation) version 2.1 dated February 1999.
|
|---|
| 9 | *
|
|---|
| 10 | * $Revision: 2.4 $
|
|---|
| 11 | ***********************************************************************EHEADER*/
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 | /******************************************************************************
|
|---|
| 16 | *
|
|---|
| 17 | * Header info for the hypre_SStructGrid structures
|
|---|
| 18 | *
|
|---|
| 19 | *****************************************************************************/
|
|---|
| 20 |
|
|---|
| 21 | #ifndef hypre_SSTRUCT_GRID_HEADER
|
|---|
| 22 | #define hypre_SSTRUCT_GRID_HEADER
|
|---|
| 23 |
|
|---|
| 24 | /*--------------------------------------------------------------------------
|
|---|
| 25 | * hypre_SStructGrid:
|
|---|
| 26 | *
|
|---|
| 27 | * NOTE: Since variables may be replicated across different processes,
|
|---|
| 28 | * a separate set of "interface grids" is retained so that data can be
|
|---|
| 29 | * migrated onto and off of the internal (non-replicated) grids.
|
|---|
| 30 | *--------------------------------------------------------------------------*/
|
|---|
| 31 |
|
|---|
| 32 | typedef enum hypre_SStructVariable_enum hypre_SStructVariable;
|
|---|
| 33 |
|
|---|
| 34 | typedef struct
|
|---|
| 35 | {
|
|---|
| 36 | HYPRE_SStructVariable type;
|
|---|
| 37 | int rank; /* local rank */
|
|---|
| 38 | int proc;
|
|---|
| 39 |
|
|---|
| 40 | } hypre_SStructUVar;
|
|---|
| 41 |
|
|---|
| 42 | typedef struct
|
|---|
| 43 | {
|
|---|
| 44 | int part;
|
|---|
| 45 | hypre_Index cell;
|
|---|
| 46 | int nuvars;
|
|---|
| 47 | hypre_SStructUVar *uvars;
|
|---|
| 48 |
|
|---|
| 49 | } hypre_SStructUCVar;
|
|---|
| 50 |
|
|---|
| 51 | typedef struct
|
|---|
| 52 | {
|
|---|
| 53 | MPI_Comm comm; /* TODO: use different comms */
|
|---|
| 54 | int ndim;
|
|---|
| 55 | int nvars; /* number of variables */
|
|---|
| 56 | HYPRE_SStructVariable *vartypes; /* types of variables */
|
|---|
| 57 | hypre_StructGrid *sgrids[8]; /* struct grids for each vartype */
|
|---|
| 58 | hypre_BoxArray *iboxarrays[8]; /* interface boxes */
|
|---|
| 59 |
|
|---|
| 60 | hypre_BoxArray *pneighbors;
|
|---|
| 61 |
|
|---|
| 62 | int local_size; /* Number of variables locally */
|
|---|
| 63 | HYPRE_BigInt global_size; /* Total number of variables */
|
|---|
| 64 |
|
|---|
| 65 | hypre_Index periodic; /* Indicates if pgrid is periodic */
|
|---|
| 66 |
|
|---|
| 67 | /* GEC0902 additions for ghost expansion of boxes */
|
|---|
| 68 |
|
|---|
| 69 | int ghlocal_size; /* Number of vars including ghosts */
|
|---|
| 70 |
|
|---|
| 71 | int cell_sgrid_done; /* =1 implies cell grid already assembled */
|
|---|
| 72 | } hypre_SStructPGrid;
|
|---|
| 73 |
|
|---|
| 74 | typedef struct
|
|---|
| 75 | {
|
|---|
| 76 | hypre_Box box;
|
|---|
| 77 | int part;
|
|---|
| 78 | hypre_Index ilower;
|
|---|
| 79 | hypre_Index coord;
|
|---|
| 80 | hypre_Index dir;
|
|---|
| 81 | int primary;
|
|---|
| 82 |
|
|---|
| 83 | } hypre_SStructNeighbor;
|
|---|
| 84 |
|
|---|
| 85 | enum hypre_SStructMapInfoType
|
|---|
| 86 | {
|
|---|
| 87 | hypre_SSTRUCT_MAP_INFO_DEFAULT = 0,
|
|---|
| 88 | hypre_SSTRUCT_MAP_INFO_NEIGHBOR = 1
|
|---|
| 89 | };
|
|---|
| 90 |
|
|---|
| 91 | typedef struct
|
|---|
| 92 | {
|
|---|
| 93 | int type;
|
|---|
| 94 | int proc;
|
|---|
| 95 | HYPRE_BigInt offset;
|
|---|
| 96 | int box;
|
|---|
| 97 | /* GEC0902 ghost offset */
|
|---|
| 98 | HYPRE_BigInt ghoffset;
|
|---|
| 99 |
|
|---|
| 100 | } hypre_SStructMapInfo;
|
|---|
| 101 |
|
|---|
| 102 | typedef struct
|
|---|
| 103 | {
|
|---|
| 104 | int type;
|
|---|
| 105 | int proc;
|
|---|
| 106 | HYPRE_BigInt offset; /* minimum offset for this box */
|
|---|
| 107 | int box;
|
|---|
| 108 | HYPRE_BigInt ghoffset; /* GEC0902 minimum offset ghost for this box */
|
|---|
| 109 | int part; /* part the box lives on */
|
|---|
| 110 | hypre_Index ilower; /* local ilower on neighbor index-space */
|
|---|
| 111 | hypre_Index coord; /* lives on local index-space */
|
|---|
| 112 | hypre_Index dir; /* lives on neighbor index-space */
|
|---|
| 113 | hypre_Index stride; /* lives on local index-space */
|
|---|
| 114 | hypre_Index ghstride; /* GEC1002 the ghost equivalent of strides */
|
|---|
| 115 |
|
|---|
| 116 | } hypre_SStructNMapInfo;
|
|---|
| 117 |
|
|---|
| 118 | typedef struct hypre_SStructGrid_struct
|
|---|
| 119 | {
|
|---|
| 120 | MPI_Comm comm;
|
|---|
| 121 | int ndim;
|
|---|
| 122 | int nparts;
|
|---|
| 123 |
|
|---|
| 124 | /* s-variable info */
|
|---|
| 125 | hypre_SStructPGrid **pgrids;
|
|---|
| 126 |
|
|---|
| 127 | /* neighbor info */
|
|---|
| 128 | int *nneighbors;
|
|---|
| 129 | hypre_SStructNeighbor **neighbors;
|
|---|
| 130 | int **nvneighbors;
|
|---|
| 131 | hypre_SStructNeighbor ***vneighbors;
|
|---|
| 132 |
|
|---|
| 133 | /* u-variables info: During construction, array entries are consecutive.
|
|---|
| 134 | * After 'Assemble', entries are referenced via local cell rank. */
|
|---|
| 135 | int nucvars;
|
|---|
| 136 | hypre_SStructUCVar **ucvars;
|
|---|
| 137 |
|
|---|
| 138 | /* info for mapping (part, index, var) --> rank */
|
|---|
| 139 | hypre_BoxMap ***maps; /* map for each part, var */
|
|---|
| 140 | hypre_SStructMapInfo ***info;
|
|---|
| 141 | hypre_SStructNMapInfo ***ninfo;
|
|---|
| 142 | HYPRE_BigInt start_rank;
|
|---|
| 143 |
|
|---|
| 144 | int local_size; /* Number of variables locally */
|
|---|
| 145 | HYPRE_BigInt global_size; /* Total number of variables */
|
|---|
| 146 |
|
|---|
| 147 | int ref_count;
|
|---|
| 148 |
|
|---|
| 149 | /* GEC0902 additions for ghost expansion of boxes */
|
|---|
| 150 |
|
|---|
| 151 | int ghlocal_size; /* GEC0902 Number of vars including ghosts */
|
|---|
| 152 | HYPRE_BigInt ghstart_rank; /* GEC0902 start rank including ghosts */
|
|---|
| 153 |
|
|---|
| 154 | } hypre_SStructGrid;
|
|---|
| 155 |
|
|---|
| 156 | /*--------------------------------------------------------------------------
|
|---|
| 157 | * Accessor macros: hypre_SStructGrid
|
|---|
| 158 | *--------------------------------------------------------------------------*/
|
|---|
| 159 |
|
|---|
| 160 | #define hypre_SStructGridComm(grid) ((grid) -> comm)
|
|---|
| 161 | #define hypre_SStructGridNDim(grid) ((grid) -> ndim)
|
|---|
| 162 | #define hypre_SStructGridNParts(grid) ((grid) -> nparts)
|
|---|
| 163 | #define hypre_SStructGridPGrids(grid) ((grid) -> pgrids)
|
|---|
| 164 | #define hypre_SStructGridPGrid(grid, part) ((grid) -> pgrids[part])
|
|---|
| 165 | #define hypre_SStructGridNNeighbors(grid) ((grid) -> nneighbors)
|
|---|
| 166 | #define hypre_SStructGridNeighbors(grid) ((grid) -> neighbors)
|
|---|
| 167 | #define hypre_SStructGridNVNeighbors(grid) ((grid) -> nvneighbors)
|
|---|
| 168 | #define hypre_SStructGridVNeighbors(grid) ((grid) -> vneighbors)
|
|---|
| 169 | #define hypre_SStructGridNUCVars(grid) ((grid) -> nucvars)
|
|---|
| 170 | #define hypre_SStructGridUCVars(grid) ((grid) -> ucvars)
|
|---|
| 171 | #define hypre_SStructGridUCVar(grid, i) ((grid) -> ucvars[i])
|
|---|
| 172 | #define hypre_SStructGridMaps(grid) ((grid) -> maps)
|
|---|
| 173 | #define hypre_SStructGridMap(grid, part, var) ((grid) -> maps[part][var])
|
|---|
| 174 | #define hypre_SStructGridInfo(grid) ((grid) -> info)
|
|---|
| 175 | #define hypre_SStructGridNInfo(grid) ((grid) -> ninfo)
|
|---|
| 176 | #define hypre_SStructGridStartRank(grid) ((grid) -> start_rank)
|
|---|
| 177 | #define hypre_SStructGridLocalSize(grid) ((grid) -> local_size)
|
|---|
| 178 | #define hypre_SStructGridGlobalSize(grid) ((grid) -> global_size)
|
|---|
| 179 | #define hypre_SStructGridRefCount(grid) ((grid) -> ref_count)
|
|---|
| 180 | #define hypre_SStructGridGhlocalSize(grid) ((grid) -> ghlocal_size)
|
|---|
| 181 | #define hypre_SStructGridGhstartRank(grid) ((grid) -> ghstart_rank)
|
|---|
| 182 |
|
|---|
| 183 | /*--------------------------------------------------------------------------
|
|---|
| 184 | * Accessor macros: hypre_SStructPGrid
|
|---|
| 185 | *--------------------------------------------------------------------------*/
|
|---|
| 186 |
|
|---|
| 187 | #define hypre_SStructPGridComm(pgrid) ((pgrid) -> comm)
|
|---|
| 188 | #define hypre_SStructPGridNDim(pgrid) ((pgrid) -> ndim)
|
|---|
| 189 | #define hypre_SStructPGridNVars(pgrid) ((pgrid) -> nvars)
|
|---|
| 190 | #define hypre_SStructPGridVarTypes(pgrid) ((pgrid) -> vartypes)
|
|---|
| 191 | #define hypre_SStructPGridVarType(pgrid, var) ((pgrid) -> vartypes[var])
|
|---|
| 192 | #define hypre_SStructPGridCellSGridDone(pgrid) ((pgrid) -> cell_sgrid_done)
|
|---|
| 193 |
|
|---|
| 194 | #define hypre_SStructPGridSGrids(pgrid) ((pgrid) -> sgrids)
|
|---|
| 195 | #define hypre_SStructPGridSGrid(pgrid, var) \
|
|---|
| 196 | ((pgrid) -> sgrids[hypre_SStructPGridVarType(pgrid, var)])
|
|---|
| 197 | #define hypre_SStructPGridCellSGrid(pgrid) \
|
|---|
| 198 | ((pgrid) -> sgrids[HYPRE_SSTRUCT_VARIABLE_CELL])
|
|---|
| 199 | #define hypre_SStructPGridVTSGrid(pgrid, vartype) ((pgrid) -> sgrids[vartype])
|
|---|
| 200 |
|
|---|
| 201 | #define hypre_SStructPGridIBoxArrays(pgrid) ((pgrid) -> iboxarrays)
|
|---|
| 202 | #define hypre_SStructPGridIBoxArray(pgrid, var) \
|
|---|
| 203 | ((pgrid) -> iboxarrays[hypre_SStructPGridVarType(pgrid, var)])
|
|---|
| 204 | #define hypre_SStructPGridCellIBoxArray(pgrid) \
|
|---|
| 205 | ((pgrid) -> iboxarrays[HYPRE_SSTRUCT_VARIABLE_CELL])
|
|---|
| 206 | #define hypre_SStructPGridVTIBoxArray(pgrid, vartype) \
|
|---|
| 207 | ((pgrid) -> iboxarrays[vartype])
|
|---|
| 208 |
|
|---|
| 209 | #define hypre_SStructPGridPNeighbors(pgrid) ((pgrid) -> pneighbors)
|
|---|
| 210 | #define hypre_SStructPGridLocalSize(pgrid) ((pgrid) -> local_size)
|
|---|
| 211 | #define hypre_SStructPGridGlobalSize(pgrid) ((pgrid) -> global_size)
|
|---|
| 212 | #define hypre_SStructPGridPeriodic(pgrid) ((pgrid) -> periodic)
|
|---|
| 213 | #define hypre_SStructPGridGhlocalSize(pgrid) ((pgrid) -> ghlocal_size)
|
|---|
| 214 |
|
|---|
| 215 | /*--------------------------------------------------------------------------
|
|---|
| 216 | * Accessor macros: hypre_SStructMapInfo
|
|---|
| 217 | *--------------------------------------------------------------------------*/
|
|---|
| 218 |
|
|---|
| 219 | #define hypre_SStructMapInfoType(info) ((info) -> type)
|
|---|
| 220 | #define hypre_SStructMapInfoProc(info) ((info) -> proc)
|
|---|
| 221 | #define hypre_SStructMapInfoOffset(info) ((info) -> offset)
|
|---|
| 222 | #define hypre_SStructMapInfoBox(info) ((info) -> box)
|
|---|
| 223 | #define hypre_SStructMapInfoGhoffset(info) ((info) -> ghoffset)
|
|---|
| 224 |
|
|---|
| 225 | /*--------------------------------------------------------------------------
|
|---|
| 226 | * Accessor macros: hypre_SStructNMapInfo
|
|---|
| 227 | *--------------------------------------------------------------------------*/
|
|---|
| 228 |
|
|---|
| 229 | /* Use the MapInfo macros to access the first five structure components */
|
|---|
| 230 |
|
|---|
| 231 | #define hypre_SStructNMapInfoPart(info) ((info) -> part)
|
|---|
| 232 | #define hypre_SStructNMapInfoILower(info) ((info) -> ilower)
|
|---|
| 233 | #define hypre_SStructNMapInfoCoord(info) ((info) -> coord)
|
|---|
| 234 | #define hypre_SStructNMapInfoDir(info) ((info) -> dir)
|
|---|
| 235 | #define hypre_SStructNMapInfoStride(info) ((info) -> stride)
|
|---|
| 236 | #define hypre_SStructNMapInfoGhstride(info) ((info) -> ghstride)
|
|---|
| 237 |
|
|---|
| 238 | /*--------------------------------------------------------------------------
|
|---|
| 239 | * Accessor macros: hypre_SStructNeighbor
|
|---|
| 240 | *--------------------------------------------------------------------------*/
|
|---|
| 241 |
|
|---|
| 242 | #define hypre_SStructNeighborBox(neighbor) &((neighbor) -> box)
|
|---|
| 243 | #define hypre_SStructNeighborPart(neighbor) ((neighbor) -> part)
|
|---|
| 244 | #define hypre_SStructNeighborILower(neighbor) ((neighbor) -> ilower)
|
|---|
| 245 | #define hypre_SStructNeighborCoord(neighbor) ((neighbor) -> coord)
|
|---|
| 246 | #define hypre_SStructNeighborDir(neighbor) ((neighbor) -> dir)
|
|---|
| 247 | #define hypre_SStructNeighborPrimary(neighbor) ((neighbor) -> primary)
|
|---|
| 248 |
|
|---|
| 249 | /*--------------------------------------------------------------------------
|
|---|
| 250 | * Accessor macros: hypre_SStructUCVar
|
|---|
| 251 | *--------------------------------------------------------------------------*/
|
|---|
| 252 |
|
|---|
| 253 | #define hypre_SStructUCVarPart(uc) ((uc) -> part)
|
|---|
| 254 | #define hypre_SStructUCVarCell(uc) ((uc) -> cell)
|
|---|
| 255 | #define hypre_SStructUCVarNUVars(uc) ((uc) -> nuvars)
|
|---|
| 256 | #define hypre_SStructUCVarUVars(uc) ((uc) -> uvars)
|
|---|
| 257 | #define hypre_SStructUCVarType(uc, i) ((uc) -> uvars[i].type)
|
|---|
| 258 | #define hypre_SStructUCVarRank(uc, i) ((uc) -> uvars[i].rank)
|
|---|
| 259 | #define hypre_SStructUCVarProc(uc, i) ((uc) -> uvars[i].proc)
|
|---|
| 260 |
|
|---|
| 261 | #endif
|
|---|
| 262 |
|
|---|