1 /******************************************************************************
2  * Copyright 1998-2019 Lawrence Livermore National Security, LLC and other
3  * HYPRE Project Developers. See the top-level COPYRIGHT file for details.
4  *
5  * SPDX-License-Identifier: (Apache-2.0 OR MIT)
6  ******************************************************************************/
7 
8 /******************************************************************************
9  *
10  * Header info for the hypre_StructVector structures
11  *
12  *****************************************************************************/
13 
14 #ifndef hypre_STRUCT_VECTOR_HEADER
15 #define hypre_STRUCT_VECTOR_HEADER
16 
17 /*--------------------------------------------------------------------------
18  * hypre_StructVector:
19  *--------------------------------------------------------------------------*/
20 
21 typedef struct hypre_StructVector_struct
22 {
23    MPI_Comm              comm;
24 
25    hypre_StructGrid     *grid;
26 
27    hypre_BoxArray       *data_space;
28 
29    HYPRE_Complex        *data;         /* Pointer to vector data on device*/
30    HYPRE_Int             data_alloced; /* Boolean used for freeing data */
31    HYPRE_Int             data_size;    /* Size of vector data */
32    HYPRE_Int            *data_indices; /* num-boxes array of indices into
33                                           the data array.  data_indices[b]
34                                           is the starting index of vector
35                                           data corresponding to box b. */
36 
37    HYPRE_Int             num_ghost[2*HYPRE_MAXDIM]; /* Num ghost layers in each
38                                                      * direction */
39    HYPRE_Int             bghost_not_clear; /* Are boundary ghosts clear? */
40 
41    HYPRE_BigInt          global_size;  /* Total number coefficients */
42 
43    HYPRE_Int             ref_count;
44 
45 } hypre_StructVector;
46 
47 /*--------------------------------------------------------------------------
48  * Accessor macros: hypre_StructVector
49  *--------------------------------------------------------------------------*/
50 
51 #define hypre_StructVectorComm(vector)          ((vector) -> comm)
52 #define hypre_StructVectorGrid(vector)          ((vector) -> grid)
53 #define hypre_StructVectorDataSpace(vector)     ((vector) -> data_space)
54 #define hypre_StructVectorData(vector)          ((vector) -> data)
55 #define hypre_StructVectorDataAlloced(vector)   ((vector) -> data_alloced)
56 #define hypre_StructVectorDataSize(vector)      ((vector) -> data_size)
57 #define hypre_StructVectorDataIndices(vector)   ((vector) -> data_indices)
58 #define hypre_StructVectorNumGhost(vector)      ((vector) -> num_ghost)
59 #define hypre_StructVectorBGhostNotClear(vector)((vector) -> bghost_not_clear)
60 #define hypre_StructVectorGlobalSize(vector)    ((vector) -> global_size)
61 #define hypre_StructVectorRefCount(vector)      ((vector) -> ref_count)
62 
63 #define hypre_StructVectorNDim(vector) \
64 hypre_StructGridNDim(hypre_StructVectorGrid(vector))
65 
66 #define hypre_StructVectorBox(vector, b) \
67 hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), b)
68 
69 #define hypre_StructVectorBoxData(vector, b) \
70 (hypre_StructVectorData(vector) + hypre_StructVectorDataIndices(vector)[b])
71 
72 #define hypre_StructVectorBoxDataValue(vector, b, index) \
73 (hypre_StructVectorBoxData(vector, b) + \
74  hypre_BoxIndexRank(hypre_StructVectorBox(vector, b), index))
75 
76 #endif
77