* Allocate buffer on heap memory * Fix Pragma definition for MSVC * Fix uninitiliazed variable * Loop counter cannot be non-negative for MSVC
2736 lines
137 KiB
C
2736 lines
137 KiB
C
|
|
/*** DO NOT EDIT THIS FILE DIRECTLY (use 'headers' to generate) ***/
|
|
|
|
|
|
#ifndef hypre_STRUCT_MV_HEADER
|
|
#define hypre_STRUCT_MV_HEADER
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
|
|
#include "HYPRE_struct_mv.h"
|
|
#include "_hypre_utilities.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for the Box structures
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef hypre_BOX_HEADER
|
|
#define hypre_BOX_HEADER
|
|
|
|
#ifndef HYPRE_MAXDIM
|
|
#define HYPRE_MAXDIM 3
|
|
#endif
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_Index:
|
|
* This is used to define indices in index space, or dimension
|
|
* sizes of boxes.
|
|
*
|
|
* The spatial dimensions x, y, and z may be specified by the
|
|
* integers 0, 1, and 2, respectively (see the hypre_IndexD macro below).
|
|
* This simplifies the code in the hypre_Box class by reducing code
|
|
* replication.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef HYPRE_Int hypre_Index[HYPRE_MAXDIM];
|
|
typedef HYPRE_Int *hypre_IndexRef;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_Box:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_Box_struct
|
|
{
|
|
hypre_Index imin; /* min bounding indices */
|
|
hypre_Index imax; /* max bounding indices */
|
|
HYPRE_Int ndim; /* number of dimensions */
|
|
|
|
} hypre_Box;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_BoxArray:
|
|
* An array of boxes.
|
|
* Since size can be zero, need to store ndim separately.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_BoxArray_struct
|
|
{
|
|
hypre_Box *boxes; /* Array of boxes */
|
|
HYPRE_Int size; /* Size of box array */
|
|
HYPRE_Int alloc_size; /* Size of currently alloced space */
|
|
HYPRE_Int ndim; /* number of dimensions */
|
|
|
|
} hypre_BoxArray;
|
|
|
|
#define hypre_BoxArrayExcess 10
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_BoxArrayArray:
|
|
* An array of box arrays.
|
|
* Since size can be zero, need to store ndim separately.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_BoxArrayArray_struct
|
|
{
|
|
hypre_BoxArray **box_arrays; /* Array of pointers to box arrays */
|
|
HYPRE_Int size; /* Size of box array array */
|
|
HYPRE_Int ndim; /* number of dimensions */
|
|
|
|
} hypre_BoxArrayArray;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_Index
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_IndexD(index, d) (index[d])
|
|
|
|
/* Avoid using these macros */
|
|
#define hypre_IndexX(index) hypre_IndexD(index, 0)
|
|
#define hypre_IndexY(index) hypre_IndexD(index, 1)
|
|
#define hypre_IndexZ(index) hypre_IndexD(index, 2)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Member functions: hypre_Index
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
/*----- Avoid using these Index macros -----*/
|
|
|
|
#define hypre_SetIndex3(index, ix, iy, iz) \
|
|
( hypre_IndexD(index, 0) = ix,\
|
|
hypre_IndexD(index, 1) = iy,\
|
|
hypre_IndexD(index, 2) = iz )
|
|
|
|
#define hypre_ClearIndex(index) hypre_SetIndex(index, 0)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_Box
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_BoxIMin(box) ((box) -> imin)
|
|
#define hypre_BoxIMax(box) ((box) -> imax)
|
|
#define hypre_BoxNDim(box) ((box) -> ndim)
|
|
|
|
#define hypre_BoxIMinD(box, d) (hypre_IndexD(hypre_BoxIMin(box), d))
|
|
#define hypre_BoxIMaxD(box, d) (hypre_IndexD(hypre_BoxIMax(box), d))
|
|
#define hypre_BoxSizeD(box, d) \
|
|
hypre_max(0, (hypre_BoxIMaxD(box, d) - hypre_BoxIMinD(box, d) + 1))
|
|
|
|
#define hypre_IndexDInBox(index, d, box) \
|
|
( hypre_IndexD(index, d) >= hypre_BoxIMinD(box, d) && \
|
|
hypre_IndexD(index, d) <= hypre_BoxIMaxD(box, d) )
|
|
|
|
/* The first hypre_CCBoxIndexRank is better style because it is similar to
|
|
hypre_BoxIndexRank. The second one sometimes avoids compiler warnings. */
|
|
#define hypre_CCBoxIndexRank(box, index) 0
|
|
#define hypre_CCBoxIndexRank_noargs() 0
|
|
#define hypre_CCBoxOffsetDistance(box, index) 0
|
|
|
|
/*----- Avoid using these Box macros -----*/
|
|
|
|
#define hypre_BoxSizeX(box) hypre_BoxSizeD(box, 0)
|
|
#define hypre_BoxSizeY(box) hypre_BoxSizeD(box, 1)
|
|
#define hypre_BoxSizeZ(box) hypre_BoxSizeD(box, 2)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_BoxArray
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_BoxArrayBoxes(box_array) ((box_array) -> boxes)
|
|
#define hypre_BoxArrayBox(box_array, i) &((box_array) -> boxes[(i)])
|
|
#define hypre_BoxArraySize(box_array) ((box_array) -> size)
|
|
#define hypre_BoxArrayAllocSize(box_array) ((box_array) -> alloc_size)
|
|
#define hypre_BoxArrayNDim(box_array) ((box_array) -> ndim)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_BoxArrayArray
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_BoxArrayArrayBoxArrays(box_array_array) \
|
|
((box_array_array) -> box_arrays)
|
|
#define hypre_BoxArrayArrayBoxArray(box_array_array, i) \
|
|
((box_array_array) -> box_arrays[(i)])
|
|
#define hypre_BoxArrayArraySize(box_array_array) \
|
|
((box_array_array) -> size)
|
|
#define hypre_BoxArrayArrayNDim(box_array_array) \
|
|
((box_array_array) -> ndim)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Looping macros:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_ForBoxI(i, box_array) \
|
|
for (i = 0; i < hypre_BoxArraySize(box_array); i++)
|
|
|
|
#define hypre_ForBoxArrayI(i, box_array_array) \
|
|
for (i = 0; i < hypre_BoxArrayArraySize(box_array_array); i++)
|
|
|
|
#define ZYPRE_BOX_PRIVATE hypre__IN,hypre__JN,hypre__I,hypre__J,hypre__d,hypre__i
|
|
#define HYPRE_BOX_PRIVATE ZYPRE_BOX_PRIVATE
|
|
|
|
#define zypre_BoxLoopDeclare() \
|
|
HYPRE_Int hypre__tot, hypre__div, hypre__mod;\
|
|
HYPRE_Int hypre__block, hypre__num_blocks;\
|
|
HYPRE_Int hypre__d, hypre__ndim;\
|
|
HYPRE_Int hypre__I, hypre__J, hypre__IN, hypre__JN;\
|
|
HYPRE_Int hypre__i[HYPRE_MAXDIM+1], hypre__n[HYPRE_MAXDIM+1]
|
|
|
|
#define zypre_BoxLoopDeclareK(k) \
|
|
HYPRE_Int hypre__ikstart##k, hypre__i0inc##k;\
|
|
HYPRE_Int hypre__sk##k[HYPRE_MAXDIM], hypre__ikinc##k[HYPRE_MAXDIM+1]
|
|
|
|
#define zypre_BoxLoopInit(ndim, loop_size) \
|
|
hypre__ndim = ndim;\
|
|
hypre__n[0] = loop_size[0];\
|
|
hypre__tot = 1;\
|
|
for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\
|
|
{\
|
|
hypre__n[hypre__d] = loop_size[hypre__d];\
|
|
hypre__tot *= hypre__n[hypre__d];\
|
|
}\
|
|
hypre__n[hypre__ndim] = 2;\
|
|
hypre__num_blocks = hypre_NumThreads();\
|
|
if (hypre__tot < hypre__num_blocks)\
|
|
{\
|
|
hypre__num_blocks = hypre__tot;\
|
|
}\
|
|
if (hypre__num_blocks > 0)\
|
|
{\
|
|
hypre__div = hypre__tot / hypre__num_blocks;\
|
|
hypre__mod = hypre__tot % hypre__num_blocks;\
|
|
}
|
|
|
|
#define zypre_BoxLoopInitK(k, dboxk, startk, stridek, ik) \
|
|
hypre__sk##k[0] = stridek[0];\
|
|
hypre__ikinc##k[0] = 0;\
|
|
ik = hypre_BoxSizeD(dboxk, 0); /* temporarily use ik */\
|
|
for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\
|
|
{\
|
|
hypre__sk##k[hypre__d] = ik*stridek[hypre__d];\
|
|
hypre__ikinc##k[hypre__d] = hypre__ikinc##k[hypre__d-1] +\
|
|
hypre__sk##k[hypre__d] - hypre__n[hypre__d-1]*hypre__sk##k[hypre__d-1];\
|
|
ik *= hypre_BoxSizeD(dboxk, hypre__d);\
|
|
}\
|
|
hypre__i0inc##k = hypre__sk##k[0];\
|
|
hypre__ikinc##k[hypre__ndim] = 0;\
|
|
hypre__ikstart##k = hypre_BoxIndexRank(dboxk, startk)
|
|
|
|
#define zypre_BoxLoopSet() \
|
|
hypre__IN = hypre__n[0];\
|
|
if (hypre__num_blocks > 1)/* in case user sets num_blocks to 1 */\
|
|
{\
|
|
hypre__JN = hypre__div + ((hypre__mod > hypre__block) ? 1 : 0);\
|
|
hypre__J = hypre__block * hypre__div + hypre_min(hypre__mod, hypre__block);\
|
|
for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\
|
|
{\
|
|
hypre__i[hypre__d] = hypre__J % hypre__n[hypre__d];\
|
|
hypre__J /= hypre__n[hypre__d];\
|
|
}\
|
|
}\
|
|
else\
|
|
{\
|
|
hypre__JN = hypre__tot;\
|
|
for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\
|
|
{\
|
|
hypre__i[hypre__d] = 0;\
|
|
}\
|
|
}\
|
|
hypre__i[hypre__ndim] = 0
|
|
|
|
#define zypre_BoxLoopSetK(k, ik) \
|
|
ik = hypre__ikstart##k;\
|
|
for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\
|
|
{\
|
|
ik += hypre__i[hypre__d]*hypre__sk##k[hypre__d];\
|
|
}
|
|
|
|
#define zypre_BoxLoopInc1() \
|
|
hypre__d = 1;\
|
|
while ((hypre__i[hypre__d]+2) > hypre__n[hypre__d])\
|
|
{\
|
|
hypre__d++;\
|
|
}
|
|
|
|
#define zypre_BoxLoopInc2() \
|
|
hypre__i[hypre__d]++;\
|
|
while (hypre__d > 1)\
|
|
{\
|
|
hypre__d--;\
|
|
hypre__i[hypre__d] = 0;\
|
|
}
|
|
|
|
/* This returns the loop index (of type hypre_Index) for the current iteration,
|
|
* where the numbering starts at 0. It works even when threading is turned on,
|
|
* as long as 'index' is declared to be private. */
|
|
#define zypre_BoxLoopGetIndex(index) \
|
|
index[0] = hypre__I;\
|
|
for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\
|
|
{\
|
|
index[hypre__d] = hypre__i[hypre__d];\
|
|
}
|
|
|
|
/* Use this before the For macros below to force only one block */
|
|
#define zypre_BoxLoopSetOneBlock() hypre__num_blocks = 1
|
|
|
|
/* Use this to get the block iteration inside a BoxLoop */
|
|
#define zypre_BoxLoopBlock() hypre__block
|
|
|
|
#define zypre_BasicBoxLoopInitK(k, stridek) \
|
|
hypre__sk##k[0] = stridek[0];\
|
|
hypre__ikinc##k[0] = 0;\
|
|
for (hypre__d = 1; hypre__d < hypre__ndim; hypre__d++)\
|
|
{\
|
|
hypre__sk##k[hypre__d] = stridek[hypre__d];\
|
|
hypre__ikinc##k[hypre__d] = hypre__ikinc##k[hypre__d-1] +\
|
|
hypre__sk##k[hypre__d] - hypre__n[hypre__d-1]*hypre__sk##k[hypre__d-1];\
|
|
}\
|
|
hypre__i0inc##k = hypre__sk##k[0];\
|
|
hypre__ikinc##k[hypre__ndim] = 0;\
|
|
hypre__ikstart##k = 0
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* NOTES - Keep these for reference here and elsewhere in the code
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#if 0
|
|
|
|
#define hypre_BoxLoop2Begin(loop_size,
|
|
dbox1, start1, stride1, i1,
|
|
dbox2, start2, stride2, i2)
|
|
{
|
|
/* init hypre__i1start */
|
|
HYPRE_Int hypre__i1start = hypre_BoxIndexRank(dbox1, start1);
|
|
HYPRE_Int hypre__i2start = hypre_BoxIndexRank(dbox2, start2);
|
|
/* declare and set hypre__s1 */
|
|
hypre_BoxLoopDeclareS(dbox1, stride1, hypre__sx1, hypre__sy1, hypre__sz1);
|
|
hypre_BoxLoopDeclareS(dbox2, stride2, hypre__sx2, hypre__sy2, hypre__sz2);
|
|
/* declare and set hypre__n, hypre__m, hypre__dir, hypre__max,
|
|
* hypre__div, hypre__mod, hypre__block, hypre__num_blocks */
|
|
hypre_BoxLoopDeclareN(loop_size);
|
|
|
|
#define hypre_BoxLoop2For(i, j, k, i1, i2)
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++)
|
|
{
|
|
/* set i and hypre__n */
|
|
hypre_BoxLoopSet(i, j, k);
|
|
/* set i1 */
|
|
i1 = hypre__i1start + i * hypre__sx1 + j * hypre__sy1 + k * hypre__sz1;
|
|
i2 = hypre__i2start + i * hypre__sx2 + j * hypre__sy2 + k * hypre__sz2;
|
|
for (k = 0; k < hypre__nz; k++)
|
|
{
|
|
for (j = 0; j < hypre__ny; j++)
|
|
{
|
|
for (i = 0; i < hypre__nx; i++)
|
|
{
|
|
|
|
#define hypre_BoxLoop2End(i1, i2)
|
|
i1 += hypre__sx1;
|
|
i2 += hypre__sx2;
|
|
}
|
|
i1 += hypre__sy1 - hypre__nx * hypre__sx1;
|
|
i2 += hypre__sy2 - hypre__nx * hypre__sx2;
|
|
}
|
|
i1 += hypre__sz1 - hypre__ny * hypre__sy1;
|
|
i2 += hypre__sz2 - hypre__ny * hypre__sy2;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------
|
|
* Idea 2: Simple version of Idea 3 below
|
|
*----------------------------------------*/
|
|
|
|
N = 1;
|
|
for (d = 0; d < ndim; d++)
|
|
{
|
|
N *= n[d];
|
|
i[d] = 0;
|
|
n[d] -= 2; /* this produces a simpler comparison below */
|
|
}
|
|
i[ndim] = 0;
|
|
n[ndim] = 0;
|
|
for (I = 0; I < N; I++)
|
|
{
|
|
/* loop body */
|
|
|
|
for (d = 0; i[d] > n[d]; d++)
|
|
{
|
|
i[d] = 0;
|
|
}
|
|
i[d]++;
|
|
i1 += s1[d]; /* NOTE: These are different from hypre__sx1, etc. above */
|
|
i2 += s2[d]; /* The lengths of i, n, and s must be (ndim+1) */
|
|
}
|
|
|
|
/*----------------------------------------
|
|
* Idea 3: Approach used in the box loops
|
|
*----------------------------------------*/
|
|
|
|
N = 1;
|
|
for (d = 1; d < ndim; d++)
|
|
{
|
|
N *= n[d];
|
|
i[d] = 0;
|
|
n[d] -= 2; /* this produces a simpler comparison below */
|
|
}
|
|
i[ndim] = 0;
|
|
n[ndim] = 0;
|
|
for (J = 0; J < N; J++)
|
|
{
|
|
for (I = 0; I < n[0]; I++)
|
|
{
|
|
/* loop body */
|
|
|
|
i1 += s1[0];
|
|
i2 += s2[0];
|
|
}
|
|
for (d = 1; i[d] > n[d]; d++)
|
|
{
|
|
i[d] = 0;
|
|
}
|
|
i[d]++;
|
|
i1 += s1[d]; /* NOTE: These are different from hypre__sx1, etc. above */
|
|
i2 += s2[d]; /* The lengths of i, n, and s must be (ndim+1) */
|
|
}
|
|
|
|
#endif
|
|
#endif /* #ifndef hypre_BOX_HEADER */
|
|
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for the struct assumed partition
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef hypre_ASSUMED_PART_HEADER
|
|
#define hypre_ASSUMED_PART_HEADER
|
|
|
|
typedef struct
|
|
{
|
|
/* the entries will be the same for all procs */
|
|
HYPRE_Int ndim; /* number of dimensions */
|
|
hypre_BoxArray *regions; /* areas of the grid with boxes */
|
|
HYPRE_Int num_regions; /* how many regions */
|
|
HYPRE_Int *proc_partitions; /* proc ids assigned to each region
|
|
(this is size num_regions +1) */
|
|
hypre_Index *divisions; /* number of proc divisions in each
|
|
direction for each region */
|
|
/* these entries are specific to each proc */
|
|
hypre_BoxArray *my_partition; /* my portion of grid (at most 2) */
|
|
hypre_BoxArray *my_partition_boxes; /* boxes in my portion */
|
|
HYPRE_Int *my_partition_proc_ids;
|
|
HYPRE_Int *my_partition_boxnums;
|
|
HYPRE_Int my_partition_ids_size;
|
|
HYPRE_Int my_partition_ids_alloc;
|
|
HYPRE_Int my_partition_num_distinct_procs;
|
|
|
|
} hypre_StructAssumedPart;
|
|
|
|
|
|
/*Accessor macros */
|
|
|
|
#define hypre_StructAssumedPartNDim(apart) ((apart)->ndim)
|
|
#define hypre_StructAssumedPartRegions(apart) ((apart)->regions)
|
|
#define hypre_StructAssumedPartNumRegions(apart) ((apart)->num_regions)
|
|
#define hypre_StructAssumedPartDivisions(apart) ((apart)->divisions)
|
|
#define hypre_StructAssumedPartDivision(apart, i) ((apart)->divisions[i])
|
|
#define hypre_StructAssumedPartProcPartitions(apart) ((apart)->proc_partitions)
|
|
#define hypre_StructAssumedPartProcPartition(apart, i) ((apart)->proc_partitions[i])
|
|
#define hypre_StructAssumedPartMyPartition(apart) ((apart)->my_partition)
|
|
#define hypre_StructAssumedPartMyPartitionBoxes(apart) ((apart)->my_partition_boxes)
|
|
#define hypre_StructAssumedPartMyPartitionProcIds(apart) ((apart)->my_partition_proc_ids)
|
|
#define hypre_StructAssumedPartMyPartitionIdsSize(apart) ((apart)->my_partition_ids_size)
|
|
#define hypre_StructAssumedPartMyPartitionIdsAlloc(apart) ((apart)->my_partition_ids_alloc)
|
|
#define hypre_StructAssumedPartMyPartitionNumDistinctProcs(apart) ((apart)->my_partition_num_distinct_procs)
|
|
#define hypre_StructAssumedPartMyPartitionBoxnums(apart) ((apart)->my_partition_boxnums)
|
|
|
|
#define hypre_StructAssumedPartMyPartitionProcId(apart, i) ((apart)->my_partition_proc_ids[i])
|
|
#define hypre_StructAssumedPartMyPartitionBoxnum(apart, i) ((apart)->my_partition_boxnums[i])
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
#ifndef hypre_BOX_MANAGER_HEADER
|
|
#define hypre_BOX_MANAGER_HEADER
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* BoxManEntry
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_BoxManEntry_struct
|
|
{
|
|
hypre_Index imin; /* Extents of box */
|
|
hypre_Index imax;
|
|
HYPRE_Int ndim; /* Number of dimensions */
|
|
|
|
HYPRE_Int proc; /* This is a two-part unique id: (proc, id) */
|
|
HYPRE_Int id;
|
|
HYPRE_Int num_ghost[2 * HYPRE_MAXDIM];
|
|
|
|
HYPRE_Int position; /* This indicates the location of the entry in the the
|
|
* box manager entries array and is used for pairing with
|
|
* the info object (populated in addentry) */
|
|
|
|
void *boxman; /* The owning manager (populated in addentry) */
|
|
|
|
struct hypre_BoxManEntry_struct *next;
|
|
|
|
} hypre_BoxManEntry;
|
|
|
|
/*---------------------------------------------------------------------------
|
|
* Box Manager: organizes arbitrary information in a spatial way
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
typedef struct
|
|
{
|
|
MPI_Comm comm;
|
|
|
|
HYPRE_Int max_nentries; /* storage allocated for entries */
|
|
|
|
HYPRE_Int is_gather_called; /* Boolean to indicate whether
|
|
GatherEntries function has been
|
|
called (prior to assemble) - may not
|
|
want this (can tell by the size of
|
|
gather_regions array) */
|
|
|
|
hypre_BoxArray *gather_regions; /* This is where we collect boxes input
|
|
by calls to BoxManGatherEntries - to
|
|
be gathered in the assemble. These
|
|
are then deleted after the assemble */
|
|
|
|
|
|
HYPRE_Int all_global_known; /* Boolean to say that every processor
|
|
already has all of the global data
|
|
for this manager (this could be
|
|
accessed by a coarsening routine,
|
|
for example) */
|
|
|
|
HYPRE_Int is_entries_sort; /* Boolean to say that entries were
|
|
added in sorted order (id, proc)
|
|
(this could be accessed by a
|
|
coarsening routine, for example) */
|
|
|
|
HYPRE_Int entry_info_size; /* In bytes, the (max) size of the info
|
|
object for the entries */
|
|
|
|
HYPRE_Int is_assembled; /* Flag to indicate if the box manager has
|
|
been assembled (used to control whether
|
|
or not functions can be used prior to
|
|
assemble) */
|
|
|
|
/* Storing the entries */
|
|
HYPRE_Int nentries; /* Number of entries stored */
|
|
hypre_BoxManEntry *entries; /* Actual box manager entries - sorted by
|
|
(proc, id) at the end of the assemble) */
|
|
|
|
HYPRE_Int *procs_sort; /* The sorted procs corresponding to entries */
|
|
HYPRE_Int *ids_sort; /* Sorted ids corresponding to the entries */
|
|
|
|
HYPRE_Int num_procs_sort; /* Number of distinct procs in entries */
|
|
HYPRE_Int *procs_sort_offsets; /* Offsets for procs into the
|
|
entry_sort array */
|
|
HYPRE_Int first_local; /* Position of local infomation in entries */
|
|
HYPRE_Int local_proc_offset; /* Position of local information in
|
|
offsets */
|
|
|
|
/* Here is the table that organizes the entries spatially (by index) */
|
|
hypre_BoxManEntry **index_table; /* This points into 'entries' array and
|
|
corresponds to the index arays */
|
|
|
|
HYPRE_Int *indexes[HYPRE_MAXDIM]; /* Indexes (ordered) for imin and
|
|
imax of each box in the entries
|
|
array */
|
|
HYPRE_Int size[HYPRE_MAXDIM]; /* How many indexes in each
|
|
direction */
|
|
|
|
HYPRE_Int last_index[HYPRE_MAXDIM]; /* Last index used in the
|
|
indexes map */
|
|
|
|
HYPRE_Int num_my_entries; /* Num entries with proc_id = myid */
|
|
HYPRE_Int *my_ids; /* Array of ids corresponding to my entries */
|
|
hypre_BoxManEntry **my_entries; /* Points into entries that are mine and
|
|
corresponds to my_ids array. This is
|
|
destroyed in the assemble. */
|
|
|
|
void *info_objects; /* Array of info objects (each of size
|
|
entry_info_size), managed byte-wise */
|
|
|
|
hypre_StructAssumedPart *assumed_partition; /* The assumed partition object.
|
|
For now this is only used
|
|
during the assemble (where it
|
|
is created). */
|
|
HYPRE_Int ndim; /* Problem dimension (known in the grid) */
|
|
|
|
hypre_Box *bounding_box; /* Bounding box from associated grid */
|
|
|
|
HYPRE_Int next_id; /* Counter to indicate the next id that would be
|
|
unique (regardless of proc id) */
|
|
|
|
/* Ghost stuff */
|
|
HYPRE_Int num_ghost[2 * HYPRE_MAXDIM];
|
|
|
|
} hypre_BoxManager;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_BoxMan
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_BoxManComm(manager) ((manager) -> comm)
|
|
|
|
#define hypre_BoxManMaxNEntries(manager) ((manager) -> max_nentries)
|
|
|
|
#define hypre_BoxManIsGatherCalled(manager) ((manager) -> is_gather_called)
|
|
#define hypre_BoxManIsEntriesSort(manager) ((manager) -> is_entries_sort)
|
|
#define hypre_BoxManGatherRegions(manager) ((manager) -> gather_regions)
|
|
#define hypre_BoxManAllGlobalKnown(manager) ((manager) -> all_global_known)
|
|
#define hypre_BoxManEntryInfoSize(manager) ((manager) -> entry_info_size)
|
|
#define hypre_BoxManNEntries(manager) ((manager) -> nentries)
|
|
#define hypre_BoxManEntries(manager) ((manager) -> entries)
|
|
#define hypre_BoxManInfoObjects(manager) ((manager) -> info_objects)
|
|
#define hypre_BoxManIsAssembled(manager) ((manager) -> is_assembled)
|
|
|
|
#define hypre_BoxManProcsSort(manager) ((manager) -> procs_sort)
|
|
#define hypre_BoxManIdsSort(manager) ((manager) -> ids_sort)
|
|
#define hypre_BoxManNumProcsSort(manager) ((manager) -> num_procs_sort)
|
|
#define hypre_BoxManProcsSortOffsets(manager) ((manager) -> procs_sort_offsets)
|
|
#define hypre_BoxManLocalProcOffset(manager) ((manager) -> local_proc_offset)
|
|
|
|
#define hypre_BoxManFirstLocal(manager) ((manager) -> first_local)
|
|
|
|
#define hypre_BoxManIndexTable(manager) ((manager) -> index_table)
|
|
#define hypre_BoxManIndexes(manager) ((manager) -> indexes)
|
|
#define hypre_BoxManSize(manager) ((manager) -> size)
|
|
#define hypre_BoxManLastIndex(manager) ((manager) -> last_index)
|
|
|
|
#define hypre_BoxManNumMyEntries(manager) ((manager) -> num_my_entries)
|
|
#define hypre_BoxManMyIds(manager) ((manager) -> my_ids)
|
|
#define hypre_BoxManMyEntries(manager) ((manager) -> my_entries)
|
|
#define hypre_BoxManAssumedPartition(manager) ((manager) -> assumed_partition)
|
|
#define hypre_BoxManNDim(manager) ((manager) -> ndim)
|
|
#define hypre_BoxManBoundingBox(manager) ((manager) -> bounding_box)
|
|
|
|
#define hypre_BoxManNextId(manager) ((manager) -> next_id)
|
|
|
|
#define hypre_BoxManNumGhost(manager) ((manager) -> num_ghost)
|
|
|
|
#define hypre_BoxManIndexesD(manager, d) hypre_BoxManIndexes(manager)[d]
|
|
#define hypre_BoxManSizeD(manager, d) hypre_BoxManSize(manager)[d]
|
|
#define hypre_BoxManLastIndexD(manager, d) hypre_BoxManLastIndex(manager)[d]
|
|
|
|
#define hypre_BoxManInfoObject(manager, i) \
|
|
(void *) ((char *)hypre_BoxManInfoObjects(manager) + i* hypre_BoxManEntryInfoSize(manager))
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_BoxManEntry
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_BoxManEntryIMin(entry) ((entry) -> imin)
|
|
#define hypre_BoxManEntryIMax(entry) ((entry) -> imax)
|
|
#define hypre_BoxManEntryNDim(entry) ((entry) -> ndim)
|
|
#define hypre_BoxManEntryProc(entry) ((entry) -> proc)
|
|
#define hypre_BoxManEntryId(entry) ((entry) -> id)
|
|
#define hypre_BoxManEntryPosition(entry) ((entry) -> position)
|
|
#define hypre_BoxManEntryNumGhost(entry) ((entry) -> num_ghost)
|
|
#define hypre_BoxManEntryNext(entry) ((entry) -> next)
|
|
#define hypre_BoxManEntryBoxMan(entry) ((entry) -> boxman)
|
|
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for the hypre_StructGrid structures
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef hypre_STRUCT_GRID_HEADER
|
|
#define hypre_STRUCT_GRID_HEADER
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_StructGrid:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_StructGrid_struct
|
|
{
|
|
MPI_Comm comm;
|
|
|
|
HYPRE_Int ndim; /* Number of grid dimensions */
|
|
|
|
hypre_BoxArray *boxes; /* Array of boxes in this process */
|
|
HYPRE_Int *ids; /* Unique IDs for boxes */
|
|
hypre_Index max_distance; /* Neighborhood size - in each dimension*/
|
|
|
|
hypre_Box *bounding_box; /* Bounding box around grid */
|
|
|
|
HYPRE_Int local_size; /* Number of grid points locally */
|
|
HYPRE_BigInt global_size; /* Total number of grid points */
|
|
|
|
hypre_Index periodic; /* Indicates if grid is periodic */
|
|
HYPRE_Int num_periods; /* number of box set periods */
|
|
|
|
hypre_Index *pshifts; /* shifts of periodicity */
|
|
|
|
|
|
HYPRE_Int ref_count;
|
|
|
|
|
|
HYPRE_Int ghlocal_size; /* Number of vars in box including ghosts */
|
|
HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* ghost layer size */
|
|
|
|
hypre_BoxManager *boxman;
|
|
} hypre_StructGrid;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_StructGrid
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_StructGridComm(grid) ((grid) -> comm)
|
|
#define hypre_StructGridNDim(grid) ((grid) -> ndim)
|
|
#define hypre_StructGridBoxes(grid) ((grid) -> boxes)
|
|
#define hypre_StructGridIDs(grid) ((grid) -> ids)
|
|
#define hypre_StructGridMaxDistance(grid) ((grid) -> max_distance)
|
|
#define hypre_StructGridBoundingBox(grid) ((grid) -> bounding_box)
|
|
#define hypre_StructGridLocalSize(grid) ((grid) -> local_size)
|
|
#define hypre_StructGridGlobalSize(grid) ((grid) -> global_size)
|
|
#define hypre_StructGridPeriodic(grid) ((grid) -> periodic)
|
|
#define hypre_StructGridNumPeriods(grid) ((grid) -> num_periods)
|
|
#define hypre_StructGridPShifts(grid) ((grid) -> pshifts)
|
|
#define hypre_StructGridPShift(grid, i) ((grid) -> pshifts[i])
|
|
#define hypre_StructGridRefCount(grid) ((grid) -> ref_count)
|
|
#define hypre_StructGridGhlocalSize(grid) ((grid) -> ghlocal_size)
|
|
#define hypre_StructGridNumGhost(grid) ((grid) -> num_ghost)
|
|
#define hypre_StructGridBoxMan(grid) ((grid) -> boxman)
|
|
|
|
#define hypre_StructGridBox(grid, i) (hypre_BoxArrayBox(hypre_StructGridBoxes(grid), i))
|
|
#define hypre_StructGridNumBoxes(grid) (hypre_BoxArraySize(hypre_StructGridBoxes(grid)))
|
|
|
|
#define hypre_StructGridIDPeriod(grid) hypre_BoxNeighborsIDPeriod(hypre_StructGridNeighbors(grid))
|
|
#if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)
|
|
#define hypre_StructGridDataLocation(grid) ((grid) -> data_location)
|
|
#endif
|
|
/*--------------------------------------------------------------------------
|
|
* Looping macros:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_ForStructGridBoxI(i, grid) hypre_ForBoxI(i, hypre_StructGridBoxes(grid))
|
|
|
|
#if 0 //defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)
|
|
#define HYPRE_MIN_GPU_SIZE (131072)
|
|
#define hypre_SetDeviceOn() hypre_HandleStructExecPolicy(hypre_handle()) = HYPRE_EXEC_DEVICE
|
|
#define hypre_SetDeviceOff() hypre_HandleStructExecPolicy(hypre_handle()) = HYPRE_EXEC_HOST
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for hypre_StructStencil data structures
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef hypre_STRUCT_STENCIL_HEADER
|
|
#define hypre_STRUCT_STENCIL_HEADER
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_StructStencil
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_StructStencil_struct
|
|
{
|
|
hypre_Index *shape; /* Description of a stencil's shape */
|
|
HYPRE_Int size; /* Number of stencil coefficients */
|
|
|
|
HYPRE_Int ndim; /* Number of dimensions */
|
|
|
|
HYPRE_Int ref_count;
|
|
} hypre_StructStencil;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor functions for the hypre_StructStencil structure
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_StructStencilShape(stencil) ((stencil) -> shape)
|
|
#define hypre_StructStencilSize(stencil) ((stencil) -> size)
|
|
#define hypre_StructStencilNDim(stencil) ((stencil) -> ndim)
|
|
#define hypre_StructStencilRefCount(stencil) ((stencil) -> ref_count)
|
|
#define hypre_StructStencilElement(stencil, i) hypre_StructStencilShape(stencil)[i]
|
|
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
#ifndef hypre_COMMUNICATION_HEADER
|
|
#define hypre_COMMUNICATION_HEADER
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_CommInfo:
|
|
*
|
|
* For "reverse" communication, send_transforms is not needed (may be NULL).
|
|
* For "forward" communication, recv_transforms is not needed (may be NULL).
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_CommInfo_struct
|
|
{
|
|
HYPRE_Int ndim;
|
|
hypre_BoxArrayArray *send_boxes;
|
|
hypre_Index send_stride;
|
|
HYPRE_Int **send_processes;
|
|
HYPRE_Int **send_rboxnums;
|
|
hypre_BoxArrayArray *send_rboxes; /* send_boxes, some with periodic shift */
|
|
|
|
hypre_BoxArrayArray *recv_boxes;
|
|
hypre_Index recv_stride;
|
|
HYPRE_Int **recv_processes;
|
|
HYPRE_Int **recv_rboxnums;
|
|
hypre_BoxArrayArray *recv_rboxes; /* recv_boxes, some with periodic shift */
|
|
|
|
HYPRE_Int num_transforms; /* may be 0 = identity transform */
|
|
hypre_Index *coords; /* may be NULL = identity transform */
|
|
hypre_Index *dirs; /* may be NULL = identity transform */
|
|
HYPRE_Int **send_transforms; /* may be NULL = identity transform */
|
|
HYPRE_Int **recv_transforms; /* may be NULL = identity transform */
|
|
|
|
HYPRE_Int boxes_match; /* true (>0) if each send box has a
|
|
* matching box on the recv processor */
|
|
|
|
} hypre_CommInfo;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_CommEntryType:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_CommEntryType_struct
|
|
{
|
|
HYPRE_Int offset; /* offset for the data */
|
|
HYPRE_Int dim; /* dimension of the communication */
|
|
HYPRE_Int length_array[HYPRE_MAXDIM]; /* last dim has length num_values */
|
|
HYPRE_Int stride_array[HYPRE_MAXDIM + 1];
|
|
HYPRE_Int *order; /* order of last dim values */
|
|
|
|
} hypre_CommEntryType;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_CommType:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_CommType_struct
|
|
{
|
|
HYPRE_Int proc;
|
|
HYPRE_Int bufsize; /* message buffer size (in doubles) */
|
|
HYPRE_Int num_entries;
|
|
hypre_CommEntryType *entries;
|
|
|
|
/* this is only needed until first send buffer prefix is packed */
|
|
HYPRE_Int *rem_boxnums; /* entry remote box numbers */
|
|
hypre_Box *rem_boxes; /* entry remote boxes */
|
|
|
|
} hypre_CommType;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_CommPkg:
|
|
* Structure containing information for doing communications
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_CommPkg_struct
|
|
{
|
|
MPI_Comm comm;
|
|
|
|
/* is this the first communication? */
|
|
HYPRE_Int first_comm;
|
|
|
|
HYPRE_Int ndim;
|
|
HYPRE_Int num_values;
|
|
hypre_Index send_stride;
|
|
hypre_Index recv_stride;
|
|
|
|
/* total send buffer size (in doubles) */
|
|
HYPRE_Int send_bufsize;
|
|
/* total recv buffer size (in doubles) */
|
|
HYPRE_Int recv_bufsize;
|
|
/* total send buffer size (in doubles) at the first comm. */
|
|
HYPRE_Int send_bufsize_first_comm;
|
|
/* total recv buffer size (in doubles) at the first comm. */
|
|
HYPRE_Int recv_bufsize_first_comm;
|
|
|
|
HYPRE_Int num_sends;
|
|
HYPRE_Int num_recvs;
|
|
hypre_CommType *send_types;
|
|
hypre_CommType *recv_types;
|
|
|
|
hypre_CommType *copy_from_type;
|
|
hypre_CommType *copy_to_type;
|
|
|
|
/* these pointers are just to help free up memory for send/from types */
|
|
hypre_CommEntryType *entries;
|
|
HYPRE_Int *rem_boxnums;
|
|
hypre_Box *rem_boxes;
|
|
|
|
HYPRE_Int num_orders;
|
|
/* num_orders x num_values */
|
|
HYPRE_Int **orders;
|
|
|
|
/* offsets into recv data (by box) */
|
|
HYPRE_Int *recv_data_offsets;
|
|
/* recv data dimensions (by box) */
|
|
hypre_BoxArray *recv_data_space;
|
|
|
|
hypre_Index identity_coord;
|
|
hypre_Index identity_dir;
|
|
HYPRE_Int *identity_order;
|
|
} hypre_CommPkg;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* CommHandle:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_CommHandle_struct
|
|
{
|
|
hypre_CommPkg *comm_pkg;
|
|
HYPRE_Complex *send_data;
|
|
HYPRE_Complex *recv_data;
|
|
|
|
HYPRE_Int num_requests;
|
|
hypre_MPI_Request *requests;
|
|
hypre_MPI_Status *status;
|
|
|
|
HYPRE_Complex **send_buffers;
|
|
HYPRE_Complex **recv_buffers;
|
|
|
|
HYPRE_Complex **send_buffers_mpi;
|
|
HYPRE_Complex **recv_buffers_mpi;
|
|
|
|
/* set = 0, add = 1 */
|
|
HYPRE_Int action;
|
|
|
|
} hypre_CommHandle;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_CommInto
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_CommInfoNDim(info) (info -> ndim)
|
|
#define hypre_CommInfoSendBoxes(info) (info -> send_boxes)
|
|
#define hypre_CommInfoSendStride(info) (info -> send_stride)
|
|
#define hypre_CommInfoSendProcesses(info) (info -> send_processes)
|
|
#define hypre_CommInfoSendRBoxnums(info) (info -> send_rboxnums)
|
|
#define hypre_CommInfoSendRBoxes(info) (info -> send_rboxes)
|
|
|
|
#define hypre_CommInfoRecvBoxes(info) (info -> recv_boxes)
|
|
#define hypre_CommInfoRecvStride(info) (info -> recv_stride)
|
|
#define hypre_CommInfoRecvProcesses(info) (info -> recv_processes)
|
|
#define hypre_CommInfoRecvRBoxnums(info) (info -> recv_rboxnums)
|
|
#define hypre_CommInfoRecvRBoxes(info) (info -> recv_rboxes)
|
|
|
|
#define hypre_CommInfoNumTransforms(info) (info -> num_transforms)
|
|
#define hypre_CommInfoCoords(info) (info -> coords)
|
|
#define hypre_CommInfoDirs(info) (info -> dirs)
|
|
#define hypre_CommInfoSendTransforms(info) (info -> send_transforms)
|
|
#define hypre_CommInfoRecvTransforms(info) (info -> recv_transforms)
|
|
|
|
#define hypre_CommInfoBoxesMatch(info) (info -> boxes_match)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_CommEntryType
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_CommEntryTypeOffset(entry) (entry -> offset)
|
|
#define hypre_CommEntryTypeDim(entry) (entry -> dim)
|
|
#define hypre_CommEntryTypeLengthArray(entry) (entry -> length_array)
|
|
#define hypre_CommEntryTypeStrideArray(entry) (entry -> stride_array)
|
|
#define hypre_CommEntryTypeOrder(entry) (entry -> order)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_CommType
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_CommTypeProc(type) (type -> proc)
|
|
#define hypre_CommTypeBufsize(type) (type -> bufsize)
|
|
#define hypre_CommTypeNumEntries(type) (type -> num_entries)
|
|
#define hypre_CommTypeEntries(type) (type -> entries)
|
|
#define hypre_CommTypeEntry(type, i) (&(type -> entries[i]))
|
|
|
|
#define hypre_CommTypeRemBoxnums(type) (type -> rem_boxnums)
|
|
#define hypre_CommTypeRemBoxnum(type, i) (type -> rem_boxnums[i])
|
|
#define hypre_CommTypeRemBoxes(type) (type -> rem_boxes)
|
|
#define hypre_CommTypeRemBox(type, i) (&(type -> rem_boxes[i]))
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_CommPkg
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_CommPkgComm(comm_pkg) (comm_pkg -> comm)
|
|
|
|
#define hypre_CommPkgFirstComm(comm_pkg) (comm_pkg -> first_comm)
|
|
|
|
#define hypre_CommPkgNDim(comm_pkg) (comm_pkg -> ndim)
|
|
#define hypre_CommPkgNumValues(comm_pkg) (comm_pkg -> num_values)
|
|
#define hypre_CommPkgSendStride(comm_pkg) (comm_pkg -> send_stride)
|
|
#define hypre_CommPkgRecvStride(comm_pkg) (comm_pkg -> recv_stride)
|
|
#define hypre_CommPkgSendBufsize(comm_pkg) (comm_pkg -> send_bufsize)
|
|
#define hypre_CommPkgRecvBufsize(comm_pkg) (comm_pkg -> recv_bufsize)
|
|
#define hypre_CommPkgSendBufsizeFirstComm(comm_pkg) (comm_pkg -> send_bufsize_first_comm)
|
|
#define hypre_CommPkgRecvBufsizeFirstComm(comm_pkg) (comm_pkg -> recv_bufsize_first_comm)
|
|
|
|
#define hypre_CommPkgNumSends(comm_pkg) (comm_pkg -> num_sends)
|
|
#define hypre_CommPkgNumRecvs(comm_pkg) (comm_pkg -> num_recvs)
|
|
#define hypre_CommPkgSendTypes(comm_pkg) (comm_pkg -> send_types)
|
|
#define hypre_CommPkgSendType(comm_pkg, i) (&(comm_pkg -> send_types[i]))
|
|
#define hypre_CommPkgRecvTypes(comm_pkg) (comm_pkg -> recv_types)
|
|
#define hypre_CommPkgRecvType(comm_pkg, i) (&(comm_pkg -> recv_types[i]))
|
|
|
|
#define hypre_CommPkgCopyFromType(comm_pkg) (comm_pkg -> copy_from_type)
|
|
#define hypre_CommPkgCopyToType(comm_pkg) (comm_pkg -> copy_to_type)
|
|
|
|
#define hypre_CommPkgEntries(comm_pkg) (comm_pkg -> entries)
|
|
#define hypre_CommPkgRemBoxnums(comm_pkg) (comm_pkg -> rem_boxnums)
|
|
#define hypre_CommPkgRemBoxes(comm_pkg) (comm_pkg -> rem_boxes)
|
|
|
|
#define hypre_CommPkgNumOrders(comm_pkg) (comm_pkg -> num_orders)
|
|
#define hypre_CommPkgOrders(comm_pkg) (comm_pkg -> orders)
|
|
|
|
#define hypre_CommPkgRecvDataOffsets(comm_pkg) (comm_pkg -> recv_data_offsets)
|
|
#define hypre_CommPkgRecvDataSpace(comm_pkg) (comm_pkg -> recv_data_space)
|
|
|
|
#define hypre_CommPkgIdentityCoord(comm_pkg) (comm_pkg -> identity_coord)
|
|
#define hypre_CommPkgIdentityDir(comm_pkg) (comm_pkg -> identity_dir)
|
|
#define hypre_CommPkgIdentityOrder(comm_pkg) (comm_pkg -> identity_order)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_CommHandle
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_CommHandleCommPkg(comm_handle) (comm_handle -> comm_pkg)
|
|
#define hypre_CommHandleSendData(comm_handle) (comm_handle -> send_data)
|
|
#define hypre_CommHandleRecvData(comm_handle) (comm_handle -> recv_data)
|
|
#define hypre_CommHandleNumRequests(comm_handle) (comm_handle -> num_requests)
|
|
#define hypre_CommHandleRequests(comm_handle) (comm_handle -> requests)
|
|
#define hypre_CommHandleStatus(comm_handle) (comm_handle -> status)
|
|
#define hypre_CommHandleSendBuffers(comm_handle) (comm_handle -> send_buffers)
|
|
#define hypre_CommHandleRecvBuffers(comm_handle) (comm_handle -> recv_buffers)
|
|
#define hypre_CommHandleAction(comm_handle) (comm_handle -> action)
|
|
#define hypre_CommHandleSendBuffersMPI(comm_handle) (comm_handle -> send_buffers_mpi)
|
|
#define hypre_CommHandleRecvBuffersMPI(comm_handle) (comm_handle -> recv_buffers_mpi)
|
|
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for computation
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef hypre_COMPUTATION_HEADER
|
|
#define hypre_COMPUTATION_HEADER
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_ComputeInfo:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_ComputeInfo_struct
|
|
{
|
|
hypre_CommInfo *comm_info;
|
|
|
|
hypre_BoxArrayArray *indt_boxes;
|
|
hypre_BoxArrayArray *dept_boxes;
|
|
hypre_Index stride;
|
|
|
|
} hypre_ComputeInfo;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_ComputePkg:
|
|
* Structure containing information for doing computations.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_ComputePkg_struct
|
|
{
|
|
hypre_CommPkg *comm_pkg;
|
|
|
|
hypre_BoxArrayArray *indt_boxes;
|
|
hypre_BoxArrayArray *dept_boxes;
|
|
hypre_Index stride;
|
|
|
|
hypre_StructGrid *grid;
|
|
hypre_BoxArray *data_space;
|
|
HYPRE_Int num_values;
|
|
|
|
} hypre_ComputePkg;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_ComputeInfo
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_ComputeInfoCommInfo(info) (info -> comm_info)
|
|
#define hypre_ComputeInfoIndtBoxes(info) (info -> indt_boxes)
|
|
#define hypre_ComputeInfoDeptBoxes(info) (info -> dept_boxes)
|
|
#define hypre_ComputeInfoStride(info) (info -> stride)
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_ComputePkg
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_ComputePkgCommPkg(compute_pkg) (compute_pkg -> comm_pkg)
|
|
|
|
#define hypre_ComputePkgIndtBoxes(compute_pkg) (compute_pkg -> indt_boxes)
|
|
#define hypre_ComputePkgDeptBoxes(compute_pkg) (compute_pkg -> dept_boxes)
|
|
#define hypre_ComputePkgStride(compute_pkg) (compute_pkg -> stride)
|
|
|
|
#define hypre_ComputePkgGrid(compute_pkg) (compute_pkg -> grid)
|
|
#define hypre_ComputePkgDataSpace(compute_pkg) (compute_pkg -> data_space)
|
|
#define hypre_ComputePkgNumValues(compute_pkg) (compute_pkg -> num_values)
|
|
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for the hypre_StructMatrix structures
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef hypre_STRUCT_MATRIX_HEADER
|
|
#define hypre_STRUCT_MATRIX_HEADER
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_StructMatrix:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_StructMatrix_struct
|
|
{
|
|
MPI_Comm comm;
|
|
|
|
hypre_StructGrid *grid;
|
|
hypre_StructStencil *user_stencil;
|
|
hypre_StructStencil *stencil;
|
|
HYPRE_Int num_values; /* Number of "stored" coefficients */
|
|
|
|
hypre_BoxArray *data_space;
|
|
|
|
HYPRE_MemoryLocation memory_location; /* memory location of data */
|
|
HYPRE_Complex *data; /* Pointer to variable matrix data */
|
|
HYPRE_Complex *data_const; /* Pointer to constant matrix data */
|
|
HYPRE_Complex **stencil_data; /* Pointer for each stencil */
|
|
HYPRE_Int data_alloced; /* Boolean used for freeing data */
|
|
HYPRE_Int data_size; /* Size of variable matrix data */
|
|
HYPRE_Int data_const_size; /* Size of constant matrix data */
|
|
HYPRE_Int **data_indices; /* num-boxes by stencil-size array
|
|
of indices into the data array.
|
|
data_indices[b][s] is the starting
|
|
index of matrix data corresponding
|
|
to box b and stencil coefficient s */
|
|
HYPRE_Int constant_coefficient; /* normally 0; set to 1 for
|
|
constant coefficient matrices
|
|
or 2 for constant coefficient
|
|
with variable diagonal */
|
|
|
|
HYPRE_Int symmetric; /* Is the matrix symmetric */
|
|
HYPRE_Int *symm_elements; /* Which elements are "symmetric" */
|
|
HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* Num ghost layers in each direction */
|
|
|
|
HYPRE_BigInt global_size; /* Total number of nonzero coeffs */
|
|
|
|
hypre_CommPkg *comm_pkg; /* Info on how to update ghost data */
|
|
|
|
HYPRE_Int ref_count;
|
|
|
|
} hypre_StructMatrix;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_StructMatrix
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_StructMatrixComm(matrix) ((matrix) -> comm)
|
|
#define hypre_StructMatrixGrid(matrix) ((matrix) -> grid)
|
|
#define hypre_StructMatrixUserStencil(matrix) ((matrix) -> user_stencil)
|
|
#define hypre_StructMatrixStencil(matrix) ((matrix) -> stencil)
|
|
#define hypre_StructMatrixNumValues(matrix) ((matrix) -> num_values)
|
|
#define hypre_StructMatrixDataSpace(matrix) ((matrix) -> data_space)
|
|
#define hypre_StructMatrixMemoryLocation(matrix) ((matrix) -> memory_location)
|
|
#define hypre_StructMatrixData(matrix) ((matrix) -> data)
|
|
#define hypre_StructMatrixDataConst(matrix) ((matrix) -> data_const)
|
|
#define hypre_StructMatrixStencilData(matrix) ((matrix) -> stencil_data)
|
|
#define hypre_StructMatrixDataAlloced(matrix) ((matrix) -> data_alloced)
|
|
#define hypre_StructMatrixDataSize(matrix) ((matrix) -> data_size)
|
|
#define hypre_StructMatrixDataConstSize(matrix) ((matrix) -> data_const_size)
|
|
#define hypre_StructMatrixDataIndices(matrix) ((matrix) -> data_indices)
|
|
#define hypre_StructMatrixConstantCoefficient(matrix) ((matrix) -> constant_coefficient)
|
|
#define hypre_StructMatrixSymmetric(matrix) ((matrix) -> symmetric)
|
|
#define hypre_StructMatrixSymmElements(matrix) ((matrix) -> symm_elements)
|
|
#define hypre_StructMatrixNumGhost(matrix) ((matrix) -> num_ghost)
|
|
#define hypre_StructMatrixGlobalSize(matrix) ((matrix) -> global_size)
|
|
#define hypre_StructMatrixCommPkg(matrix) ((matrix) -> comm_pkg)
|
|
#define hypre_StructMatrixRefCount(matrix) ((matrix) -> ref_count)
|
|
|
|
#define hypre_StructMatrixNDim(matrix) \
|
|
hypre_StructGridNDim(hypre_StructMatrixGrid(matrix))
|
|
|
|
#define hypre_StructMatrixBox(matrix, b) \
|
|
hypre_BoxArrayBox(hypre_StructMatrixDataSpace(matrix), b)
|
|
|
|
#define hypre_StructMatrixBoxData(matrix, b, s) \
|
|
(hypre_StructMatrixStencilData(matrix)[s] + hypre_StructMatrixDataIndices(matrix)[b][s])
|
|
|
|
#define hypre_StructMatrixBoxDataValue(matrix, b, s, index) \
|
|
(hypre_StructMatrixBoxData(matrix, b, s) + \
|
|
hypre_BoxIndexRank(hypre_StructMatrixBox(matrix, b), index))
|
|
|
|
#define hypre_CCStructMatrixBoxDataValue(matrix, b, s, index) \
|
|
(hypre_StructMatrixBoxData(matrix, b, s) + \
|
|
hypre_CCBoxIndexRank(hypre_StructMatrixBox(matrix, b), index))
|
|
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for the hypre_StructVector structures
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#ifndef hypre_STRUCT_VECTOR_HEADER
|
|
#define hypre_STRUCT_VECTOR_HEADER
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* hypre_StructVector:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
typedef struct hypre_StructVector_struct
|
|
{
|
|
MPI_Comm comm;
|
|
|
|
hypre_StructGrid *grid;
|
|
|
|
hypre_BoxArray *data_space;
|
|
|
|
HYPRE_MemoryLocation memory_location; /* memory location of data */
|
|
HYPRE_Complex *data; /* Pointer to vector data on device*/
|
|
HYPRE_Int data_alloced; /* Boolean used for freeing data */
|
|
HYPRE_Int data_size; /* Size of vector data */
|
|
HYPRE_Int *data_indices; /* num-boxes array of indices into
|
|
the data array. data_indices[b]
|
|
is the starting index of vector
|
|
data corresponding to box b. */
|
|
|
|
HYPRE_Int num_ghost[2 * HYPRE_MAXDIM]; /* Num ghost layers in each
|
|
* direction */
|
|
HYPRE_Int bghost_not_clear; /* Are boundary ghosts clear? */
|
|
|
|
HYPRE_BigInt global_size; /* Total number coefficients */
|
|
|
|
HYPRE_Int ref_count;
|
|
|
|
} hypre_StructVector;
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Accessor macros: hypre_StructVector
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#define hypre_StructVectorComm(vector) ((vector) -> comm)
|
|
#define hypre_StructVectorGrid(vector) ((vector) -> grid)
|
|
#define hypre_StructVectorDataSpace(vector) ((vector) -> data_space)
|
|
#define hypre_StructVectorMemoryLocation(vector) ((vector) -> memory_location)
|
|
#define hypre_StructVectorData(vector) ((vector) -> data)
|
|
#define hypre_StructVectorDataAlloced(vector) ((vector) -> data_alloced)
|
|
#define hypre_StructVectorDataSize(vector) ((vector) -> data_size)
|
|
#define hypre_StructVectorDataIndices(vector) ((vector) -> data_indices)
|
|
#define hypre_StructVectorNumGhost(vector) ((vector) -> num_ghost)
|
|
#define hypre_StructVectorBGhostNotClear(vector) ((vector) -> bghost_not_clear)
|
|
#define hypre_StructVectorGlobalSize(vector) ((vector) -> global_size)
|
|
#define hypre_StructVectorRefCount(vector) ((vector) -> ref_count)
|
|
|
|
#define hypre_StructVectorNDim(vector) \
|
|
hypre_StructGridNDim(hypre_StructVectorGrid(vector))
|
|
|
|
#define hypre_StructVectorBox(vector, b) \
|
|
hypre_BoxArrayBox(hypre_StructVectorDataSpace(vector), b)
|
|
|
|
#define hypre_StructVectorBoxData(vector, b) \
|
|
(hypre_StructVectorData(vector) + hypre_StructVectorDataIndices(vector)[b])
|
|
|
|
#define hypre_StructVectorBoxDataValue(vector, b, index) \
|
|
(hypre_StructVectorBoxData(vector, b) + \
|
|
hypre_BoxIndexRank(hypre_StructVectorBox(vector, b), index))
|
|
|
|
#endif
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/* assumed_part.c */
|
|
HYPRE_Int hypre_APSubdivideRegion ( hypre_Box *region, HYPRE_Int dim, HYPRE_Int level,
|
|
hypre_BoxArray *box_array, HYPRE_Int *num_new_boxes );
|
|
HYPRE_Int hypre_APFindMyBoxesInRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array,
|
|
HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array );
|
|
HYPRE_Int hypre_APGetAllBoxesInRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array,
|
|
HYPRE_Int **p_count_array, HYPRE_Real **p_vol_array, MPI_Comm comm );
|
|
HYPRE_Int hypre_APShrinkRegions ( hypre_BoxArray *region_array, hypre_BoxArray *my_box_array,
|
|
MPI_Comm comm );
|
|
HYPRE_Int hypre_APPruneRegions ( hypre_BoxArray *region_array, HYPRE_Int **p_count_array,
|
|
HYPRE_Real **p_vol_array );
|
|
HYPRE_Int hypre_APRefineRegionsByVol ( hypre_BoxArray *region_array, HYPRE_Real *vol_array,
|
|
HYPRE_Int max_regions, HYPRE_Real gamma, HYPRE_Int dim, HYPRE_Int *return_code, MPI_Comm comm );
|
|
HYPRE_Int hypre_StructAssumedPartitionCreate ( HYPRE_Int dim, hypre_Box *bounding_box,
|
|
HYPRE_Real global_boxes_size, HYPRE_Int global_num_boxes, hypre_BoxArray *local_boxes,
|
|
HYPRE_Int *local_boxnums, HYPRE_Int max_regions, HYPRE_Int max_refinements, HYPRE_Real gamma,
|
|
MPI_Comm comm, hypre_StructAssumedPart **p_assumed_partition );
|
|
HYPRE_Int hypre_StructAssumedPartitionDestroy ( hypre_StructAssumedPart *assumed_part );
|
|
HYPRE_Int hypre_APFillResponseStructAssumedPart ( void *p_recv_contact_buf, HYPRE_Int contact_size,
|
|
HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf,
|
|
HYPRE_Int *response_message_size );
|
|
HYPRE_Int hypre_StructAssumedPartitionGetRegionsFromProc ( hypre_StructAssumedPart *assumed_part,
|
|
HYPRE_Int proc_id, hypre_BoxArray *assumed_regions );
|
|
HYPRE_Int hypre_StructAssumedPartitionGetProcsFromBox ( hypre_StructAssumedPart *assumed_part,
|
|
hypre_Box *box, HYPRE_Int *num_proc_array, HYPRE_Int *size_alloc_proc_array,
|
|
HYPRE_Int **p_proc_array );
|
|
|
|
/* box_algebra.c */
|
|
HYPRE_Int hypre_IntersectBoxes ( hypre_Box *box1, hypre_Box *box2, hypre_Box *ibox );
|
|
HYPRE_Int hypre_SubtractBoxes ( hypre_Box *box1, hypre_Box *box2, hypre_BoxArray *box_array );
|
|
HYPRE_Int hypre_SubtractBoxArrays ( hypre_BoxArray *box_array1, hypre_BoxArray *box_array2,
|
|
hypre_BoxArray *tmp_box_array );
|
|
HYPRE_Int hypre_UnionBoxes ( hypre_BoxArray *boxes );
|
|
HYPRE_Int hypre_MinUnionBoxes ( hypre_BoxArray *boxes );
|
|
|
|
/* box_boundary.c */
|
|
HYPRE_Int hypre_BoxBoundaryIntersect ( hypre_Box *box, hypre_StructGrid *grid, HYPRE_Int d,
|
|
HYPRE_Int dir, hypre_BoxArray *boundary );
|
|
HYPRE_Int hypre_BoxBoundaryG ( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundary );
|
|
HYPRE_Int hypre_BoxBoundaryDG ( hypre_Box *box, hypre_StructGrid *g, hypre_BoxArray *boundarym,
|
|
hypre_BoxArray *boundaryp, HYPRE_Int d );
|
|
HYPRE_Int hypre_GeneralBoxBoundaryIntersect( hypre_Box *box, hypre_StructGrid *grid,
|
|
hypre_Index stencil_element, hypre_BoxArray *boundary );
|
|
|
|
/* box.c */
|
|
HYPRE_Int hypre_SetIndex ( hypre_Index index, HYPRE_Int val );
|
|
HYPRE_Int hypre_CopyIndex( hypre_Index in_index, hypre_Index out_index );
|
|
HYPRE_Int hypre_CopyToCleanIndex( hypre_Index in_index, HYPRE_Int ndim, hypre_Index out_index );
|
|
HYPRE_Int hypre_IndexEqual ( hypre_Index index, HYPRE_Int val, HYPRE_Int ndim );
|
|
HYPRE_Int hypre_IndexMin( hypre_Index index, HYPRE_Int ndim );
|
|
HYPRE_Int hypre_IndexMax( hypre_Index index, HYPRE_Int ndim );
|
|
HYPRE_Int hypre_AddIndexes ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim,
|
|
hypre_Index result );
|
|
HYPRE_Int hypre_SubtractIndexes ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim,
|
|
hypre_Index result );
|
|
HYPRE_Int hypre_IndexesEqual ( hypre_Index index1, hypre_Index index2, HYPRE_Int ndim );
|
|
HYPRE_Int hypre_IndexPrint ( FILE *file, HYPRE_Int ndim, hypre_Index index );
|
|
HYPRE_Int hypre_IndexRead ( FILE *file, HYPRE_Int ndim, hypre_Index index );
|
|
hypre_Box *hypre_BoxCreate ( HYPRE_Int ndim );
|
|
HYPRE_Int hypre_BoxDestroy ( hypre_Box *box );
|
|
HYPRE_Int hypre_BoxInit( hypre_Box *box, HYPRE_Int ndim );
|
|
HYPRE_Int hypre_BoxSetExtents ( hypre_Box *box, hypre_Index imin, hypre_Index imax );
|
|
HYPRE_Int hypre_CopyBox( hypre_Box *box1, hypre_Box *box2 );
|
|
hypre_Box *hypre_BoxDuplicate ( hypre_Box *box );
|
|
HYPRE_Int hypre_BoxVolume( hypre_Box *box );
|
|
HYPRE_Real hypre_doubleBoxVolume( hypre_Box *box );
|
|
HYPRE_Int hypre_IndexInBox ( hypre_Index index, hypre_Box *box );
|
|
HYPRE_Int hypre_BoxGetSize ( hypre_Box *box, hypre_Index size );
|
|
HYPRE_Int hypre_BoxGetStrideSize ( hypre_Box *box, hypre_Index stride, hypre_Index size );
|
|
HYPRE_Int hypre_BoxGetStrideVolume ( hypre_Box *box, hypre_Index stride, HYPRE_Int *volume_ptr );
|
|
HYPRE_Int hypre_BoxIndexRank( hypre_Box *box, hypre_Index index );
|
|
HYPRE_Int hypre_BoxRankIndex( hypre_Box *box, HYPRE_Int rank, hypre_Index index );
|
|
HYPRE_Int hypre_BoxOffsetDistance( hypre_Box *box, hypre_Index index );
|
|
HYPRE_Int hypre_BoxShiftPos( hypre_Box *box, hypre_Index shift );
|
|
HYPRE_Int hypre_BoxShiftNeg( hypre_Box *box, hypre_Index shift );
|
|
HYPRE_Int hypre_BoxGrowByIndex( hypre_Box *box, hypre_Index index );
|
|
HYPRE_Int hypre_BoxGrowByValue( hypre_Box *box, HYPRE_Int val );
|
|
HYPRE_Int hypre_BoxGrowByArray ( hypre_Box *box, HYPRE_Int *array );
|
|
HYPRE_Int hypre_BoxPrint ( FILE *file, hypre_Box *box );
|
|
HYPRE_Int hypre_BoxRead ( FILE *file, HYPRE_Int ndim, hypre_Box **box_ptr );
|
|
hypre_BoxArray *hypre_BoxArrayCreate ( HYPRE_Int size, HYPRE_Int ndim );
|
|
HYPRE_Int hypre_BoxArrayDestroy ( hypre_BoxArray *box_array );
|
|
HYPRE_Int hypre_BoxArraySetSize ( hypre_BoxArray *box_array, HYPRE_Int size );
|
|
hypre_BoxArray *hypre_BoxArrayDuplicate ( hypre_BoxArray *box_array );
|
|
HYPRE_Int hypre_AppendBox ( hypre_Box *box, hypre_BoxArray *box_array );
|
|
HYPRE_Int hypre_DeleteBox ( hypre_BoxArray *box_array, HYPRE_Int index );
|
|
HYPRE_Int hypre_DeleteMultipleBoxes ( hypre_BoxArray *box_array, HYPRE_Int *indices,
|
|
HYPRE_Int num );
|
|
HYPRE_Int hypre_AppendBoxArray ( hypre_BoxArray *box_array_0, hypre_BoxArray *box_array_1 );
|
|
hypre_BoxArrayArray *hypre_BoxArrayArrayCreate ( HYPRE_Int size, HYPRE_Int ndim );
|
|
HYPRE_Int hypre_BoxArrayArrayDestroy ( hypre_BoxArrayArray *box_array_array );
|
|
hypre_BoxArrayArray *hypre_BoxArrayArrayDuplicate ( hypre_BoxArrayArray *box_array_array );
|
|
|
|
/* box_manager.c */
|
|
HYPRE_Int hypre_BoxManEntryGetInfo ( hypre_BoxManEntry *entry, void **info_ptr );
|
|
HYPRE_Int hypre_BoxManEntryGetExtents ( hypre_BoxManEntry *entry, hypre_Index imin,
|
|
hypre_Index imax );
|
|
HYPRE_Int hypre_BoxManEntryCopy ( hypre_BoxManEntry *fromentry, hypre_BoxManEntry *toentry );
|
|
HYPRE_Int hypre_BoxManSetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int known );
|
|
HYPRE_Int hypre_BoxManGetAllGlobalKnown ( hypre_BoxManager *manager, HYPRE_Int *known );
|
|
HYPRE_Int hypre_BoxManSetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int is_sort );
|
|
HYPRE_Int hypre_BoxManGetIsEntriesSort ( hypre_BoxManager *manager, HYPRE_Int *is_sort );
|
|
HYPRE_Int hypre_BoxManGetGlobalIsGatherCalled ( hypre_BoxManager *manager, MPI_Comm comm,
|
|
HYPRE_Int *is_gather );
|
|
HYPRE_Int hypre_BoxManGetAssumedPartition ( hypre_BoxManager *manager,
|
|
hypre_StructAssumedPart **assumed_partition );
|
|
HYPRE_Int hypre_BoxManSetAssumedPartition ( hypre_BoxManager *manager,
|
|
hypre_StructAssumedPart *assumed_partition );
|
|
HYPRE_Int hypre_BoxManSetBoundingBox ( hypre_BoxManager *manager, hypre_Box *bounding_box );
|
|
HYPRE_Int hypre_BoxManSetNumGhost ( hypre_BoxManager *manager, HYPRE_Int *num_ghost );
|
|
HYPRE_Int hypre_BoxManDeleteMultipleEntriesAndInfo ( hypre_BoxManager *manager, HYPRE_Int *indices,
|
|
HYPRE_Int num );
|
|
HYPRE_Int hypre_BoxManCreate ( HYPRE_Int max_nentries, HYPRE_Int info_size, HYPRE_Int dim,
|
|
hypre_Box *bounding_box, MPI_Comm comm, hypre_BoxManager **manager_ptr );
|
|
HYPRE_Int hypre_BoxManIncSize ( hypre_BoxManager *manager, HYPRE_Int inc_size );
|
|
HYPRE_Int hypre_BoxManDestroy ( hypre_BoxManager *manager );
|
|
HYPRE_Int hypre_BoxManAddEntry ( hypre_BoxManager *manager, hypre_Index imin, hypre_Index imax,
|
|
HYPRE_Int proc_id, HYPRE_Int box_id, void *info );
|
|
HYPRE_Int hypre_BoxManGetEntry ( hypre_BoxManager *manager, HYPRE_Int proc, HYPRE_Int id,
|
|
hypre_BoxManEntry **entry_ptr );
|
|
HYPRE_Int hypre_BoxManGetAllEntries ( hypre_BoxManager *manager, HYPRE_Int *num_entries,
|
|
hypre_BoxManEntry **entries );
|
|
HYPRE_Int hypre_BoxManGetAllEntriesBoxes ( hypre_BoxManager *manager, hypre_BoxArray *boxes );
|
|
HYPRE_Int hypre_BoxManGetLocalEntriesBoxes ( hypre_BoxManager *manager, hypre_BoxArray *boxes );
|
|
HYPRE_Int hypre_BoxManGetAllEntriesBoxesProc ( hypre_BoxManager *manager, hypre_BoxArray *boxes,
|
|
HYPRE_Int **procs_ptr );
|
|
HYPRE_Int hypre_BoxManGatherEntries ( hypre_BoxManager *manager, hypre_Index imin,
|
|
hypre_Index imax );
|
|
HYPRE_Int hypre_BoxManAssemble ( hypre_BoxManager *manager );
|
|
HYPRE_Int hypre_BoxManIntersect ( hypre_BoxManager *manager, hypre_Index ilower, hypre_Index iupper,
|
|
hypre_BoxManEntry ***entries_ptr, HYPRE_Int *nentries_ptr );
|
|
HYPRE_Int hypre_FillResponseBoxManAssemble1 ( void *p_recv_contact_buf, HYPRE_Int contact_size,
|
|
HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf,
|
|
HYPRE_Int *response_message_size );
|
|
HYPRE_Int hypre_FillResponseBoxManAssemble2 ( void *p_recv_contact_buf, HYPRE_Int contact_size,
|
|
HYPRE_Int contact_proc, void *ro, MPI_Comm comm, void **p_send_response_buf,
|
|
HYPRE_Int *response_message_size );
|
|
|
|
/* communication_info.c */
|
|
HYPRE_Int hypre_CommInfoCreate ( hypre_BoxArrayArray *send_boxes, hypre_BoxArrayArray *recv_boxes,
|
|
HYPRE_Int **send_procs, HYPRE_Int **recv_procs, HYPRE_Int **send_rboxnums,
|
|
HYPRE_Int **recv_rboxnums, hypre_BoxArrayArray *send_rboxes, hypre_BoxArrayArray *recv_rboxes,
|
|
HYPRE_Int boxes_match, hypre_CommInfo **comm_info_ptr );
|
|
HYPRE_Int hypre_CommInfoSetTransforms ( hypre_CommInfo *comm_info, HYPRE_Int num_transforms,
|
|
hypre_Index *coords, hypre_Index *dirs, HYPRE_Int **send_transforms, HYPRE_Int **recv_transforms );
|
|
HYPRE_Int hypre_CommInfoGetTransforms ( hypre_CommInfo *comm_info, HYPRE_Int *num_transforms,
|
|
hypre_Index **coords, hypre_Index **dirs );
|
|
HYPRE_Int hypre_CommInfoProjectSend ( hypre_CommInfo *comm_info, hypre_Index index,
|
|
hypre_Index stride );
|
|
HYPRE_Int hypre_CommInfoProjectRecv ( hypre_CommInfo *comm_info, hypre_Index index,
|
|
hypre_Index stride );
|
|
HYPRE_Int hypre_CommInfoDestroy ( hypre_CommInfo *comm_info );
|
|
HYPRE_Int hypre_CreateCommInfoFromStencil ( hypre_StructGrid *grid, hypre_StructStencil *stencil,
|
|
hypre_CommInfo **comm_info_ptr );
|
|
HYPRE_Int hypre_CreateCommInfoFromNumGhost ( hypre_StructGrid *grid, HYPRE_Int *num_ghost,
|
|
hypre_CommInfo **comm_info_ptr );
|
|
HYPRE_Int hypre_CreateCommInfoFromGrids ( hypre_StructGrid *from_grid, hypre_StructGrid *to_grid,
|
|
hypre_CommInfo **comm_info_ptr );
|
|
|
|
/* computation.c */
|
|
HYPRE_Int hypre_ComputeInfoCreate ( hypre_CommInfo *comm_info, hypre_BoxArrayArray *indt_boxes,
|
|
hypre_BoxArrayArray *dept_boxes, hypre_ComputeInfo **compute_info_ptr );
|
|
HYPRE_Int hypre_ComputeInfoProjectSend ( hypre_ComputeInfo *compute_info, hypre_Index index,
|
|
hypre_Index stride );
|
|
HYPRE_Int hypre_ComputeInfoProjectRecv ( hypre_ComputeInfo *compute_info, hypre_Index index,
|
|
hypre_Index stride );
|
|
HYPRE_Int hypre_ComputeInfoProjectComp ( hypre_ComputeInfo *compute_info, hypre_Index index,
|
|
hypre_Index stride );
|
|
HYPRE_Int hypre_ComputeInfoDestroy ( hypre_ComputeInfo *compute_info );
|
|
HYPRE_Int hypre_CreateComputeInfo ( hypre_StructGrid *grid, hypre_StructStencil *stencil,
|
|
hypre_ComputeInfo **compute_info_ptr );
|
|
HYPRE_Int hypre_ComputePkgCreate ( hypre_ComputeInfo *compute_info, hypre_BoxArray *data_space,
|
|
HYPRE_Int num_values, hypre_StructGrid *grid, hypre_ComputePkg **compute_pkg_ptr );
|
|
HYPRE_Int hypre_ComputePkgDestroy ( hypre_ComputePkg *compute_pkg );
|
|
HYPRE_Int hypre_InitializeIndtComputations ( hypre_ComputePkg *compute_pkg, HYPRE_Complex *data,
|
|
hypre_CommHandle **comm_handle_ptr );
|
|
HYPRE_Int hypre_FinalizeIndtComputations ( hypre_CommHandle *comm_handle );
|
|
|
|
/* HYPRE_struct_grid.c */
|
|
HYPRE_Int HYPRE_StructGridCreate ( MPI_Comm comm, HYPRE_Int dim, HYPRE_StructGrid *grid );
|
|
HYPRE_Int HYPRE_StructGridDestroy ( HYPRE_StructGrid grid );
|
|
HYPRE_Int HYPRE_StructGridSetExtents ( HYPRE_StructGrid grid, HYPRE_Int *ilower,
|
|
HYPRE_Int *iupper );
|
|
HYPRE_Int HYPRE_StructGridSetPeriodic ( HYPRE_StructGrid grid, HYPRE_Int *periodic );
|
|
HYPRE_Int HYPRE_StructGridAssemble ( HYPRE_StructGrid grid );
|
|
HYPRE_Int HYPRE_StructGridSetNumGhost ( HYPRE_StructGrid grid, HYPRE_Int *num_ghost );
|
|
|
|
/* HYPRE_struct_matrix.c */
|
|
HYPRE_Int HYPRE_StructMatrixCreate ( MPI_Comm comm, HYPRE_StructGrid grid,
|
|
HYPRE_StructStencil stencil, HYPRE_StructMatrix *matrix );
|
|
HYPRE_Int HYPRE_StructMatrixDestroy ( HYPRE_StructMatrix matrix );
|
|
HYPRE_Int HYPRE_StructMatrixInitialize ( HYPRE_StructMatrix matrix );
|
|
HYPRE_Int HYPRE_StructMatrixSetValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixGetValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixSetBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower,
|
|
HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices,
|
|
HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixGetBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower,
|
|
HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices,
|
|
HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixSetConstantValues ( HYPRE_StructMatrix matrix,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixAddToValues ( HYPRE_StructMatrix matrix, HYPRE_Int *grid_index,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixAddToBoxValues ( HYPRE_StructMatrix matrix, HYPRE_Int *ilower,
|
|
HYPRE_Int *iupper, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices,
|
|
HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixAddToConstantValues ( HYPRE_StructMatrix matrix,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructMatrixAssemble ( HYPRE_StructMatrix matrix );
|
|
HYPRE_Int HYPRE_StructMatrixSetNumGhost ( HYPRE_StructMatrix matrix, HYPRE_Int *num_ghost );
|
|
HYPRE_Int HYPRE_StructMatrixGetGrid ( HYPRE_StructMatrix matrix, HYPRE_StructGrid *grid );
|
|
HYPRE_Int HYPRE_StructMatrixSetSymmetric ( HYPRE_StructMatrix matrix, HYPRE_Int symmetric );
|
|
HYPRE_Int HYPRE_StructMatrixSetConstantEntries ( HYPRE_StructMatrix matrix, HYPRE_Int nentries,
|
|
HYPRE_Int *entries );
|
|
HYPRE_Int HYPRE_StructMatrixPrint ( const char *filename, HYPRE_StructMatrix matrix,
|
|
HYPRE_Int all );
|
|
HYPRE_Int HYPRE_StructMatrixMatvec ( HYPRE_Complex alpha, HYPRE_StructMatrix A,
|
|
HYPRE_StructVector x, HYPRE_Complex beta, HYPRE_StructVector y );
|
|
HYPRE_Int HYPRE_StructMatrixClearBoundary( HYPRE_StructMatrix matrix );
|
|
|
|
/* HYPRE_struct_stencil.c */
|
|
HYPRE_Int HYPRE_StructStencilCreate ( HYPRE_Int dim, HYPRE_Int size, HYPRE_StructStencil *stencil );
|
|
HYPRE_Int HYPRE_StructStencilSetElement ( HYPRE_StructStencil stencil, HYPRE_Int element_index,
|
|
HYPRE_Int *offset );
|
|
HYPRE_Int HYPRE_StructStencilDestroy ( HYPRE_StructStencil stencil );
|
|
|
|
/* HYPRE_struct_vector.c */
|
|
HYPRE_Int HYPRE_StructVectorCreate ( MPI_Comm comm, HYPRE_StructGrid grid,
|
|
HYPRE_StructVector *vector );
|
|
HYPRE_Int HYPRE_StructVectorDestroy ( HYPRE_StructVector struct_vector );
|
|
HYPRE_Int HYPRE_StructVectorInitialize ( HYPRE_StructVector vector );
|
|
HYPRE_Int HYPRE_StructVectorSetValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index,
|
|
HYPRE_Complex values );
|
|
HYPRE_Int HYPRE_StructVectorSetBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower,
|
|
HYPRE_Int *iupper, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructVectorAddToValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index,
|
|
HYPRE_Complex values );
|
|
HYPRE_Int HYPRE_StructVectorAddToBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower,
|
|
HYPRE_Int *iupper, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructVectorScaleValues ( HYPRE_StructVector vector, HYPRE_Complex factor );
|
|
HYPRE_Int HYPRE_StructVectorGetValues ( HYPRE_StructVector vector, HYPRE_Int *grid_index,
|
|
HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructVectorGetBoxValues ( HYPRE_StructVector vector, HYPRE_Int *ilower,
|
|
HYPRE_Int *iupper, HYPRE_Complex *values );
|
|
HYPRE_Int HYPRE_StructVectorAssemble ( HYPRE_StructVector vector );
|
|
HYPRE_Int hypre_StructVectorPrintData ( FILE *file, hypre_StructVector *vector, HYPRE_Int all );
|
|
HYPRE_Int hypre_StructVectorReadData ( FILE *file, hypre_StructVector *vector );
|
|
HYPRE_Int HYPRE_StructVectorPrint ( const char *filename, HYPRE_StructVector vector,
|
|
HYPRE_Int all );
|
|
HYPRE_Int HYPRE_StructVectorRead ( MPI_Comm comm, const char *filename,
|
|
HYPRE_Int *num_ghost, HYPRE_StructVector *vector );
|
|
HYPRE_Int HYPRE_StructVectorSetNumGhost ( HYPRE_StructVector vector, HYPRE_Int *num_ghost );
|
|
HYPRE_Int HYPRE_StructVectorCopy ( HYPRE_StructVector x, HYPRE_StructVector y );
|
|
HYPRE_Int HYPRE_StructVectorSetConstantValues ( HYPRE_StructVector vector, HYPRE_Complex values );
|
|
HYPRE_Int HYPRE_StructVectorGetMigrateCommPkg ( HYPRE_StructVector from_vector,
|
|
HYPRE_StructVector to_vector, HYPRE_CommPkg *comm_pkg );
|
|
HYPRE_Int HYPRE_StructVectorMigrate ( HYPRE_CommPkg comm_pkg, HYPRE_StructVector from_vector,
|
|
HYPRE_StructVector to_vector );
|
|
HYPRE_Int HYPRE_CommPkgDestroy ( HYPRE_CommPkg comm_pkg );
|
|
|
|
/* project.c */
|
|
HYPRE_Int hypre_ProjectBox ( hypre_Box *box, hypre_Index index, hypre_Index stride );
|
|
HYPRE_Int hypre_ProjectBoxArray ( hypre_BoxArray *box_array, hypre_Index index,
|
|
hypre_Index stride );
|
|
HYPRE_Int hypre_ProjectBoxArrayArray ( hypre_BoxArrayArray *box_array_array, hypre_Index index,
|
|
hypre_Index stride );
|
|
|
|
/* struct_axpy.c */
|
|
HYPRE_Int hypre_StructAxpy ( HYPRE_Complex alpha, hypre_StructVector *x, hypre_StructVector *y );
|
|
|
|
/* struct_communication.c */
|
|
HYPRE_Int hypre_CommPkgCreate ( hypre_CommInfo *comm_info, hypre_BoxArray *send_data_space,
|
|
hypre_BoxArray *recv_data_space, HYPRE_Int num_values, HYPRE_Int **orders, HYPRE_Int reverse,
|
|
MPI_Comm comm, hypre_CommPkg **comm_pkg_ptr );
|
|
HYPRE_Int hypre_CommTypeSetEntries ( hypre_CommType *comm_type, HYPRE_Int *boxnums,
|
|
hypre_Box *boxes, hypre_Index stride, hypre_Index coord, hypre_Index dir, HYPRE_Int *order,
|
|
hypre_BoxArray *data_space, HYPRE_Int *data_offsets );
|
|
HYPRE_Int hypre_CommTypeSetEntry ( hypre_Box *box, hypre_Index stride, hypre_Index coord,
|
|
hypre_Index dir, HYPRE_Int *order, hypre_Box *data_box, HYPRE_Int data_box_offset,
|
|
hypre_CommEntryType *comm_entry );
|
|
HYPRE_Int hypre_InitializeCommunication ( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data,
|
|
HYPRE_Complex *recv_data, HYPRE_Int action, HYPRE_Int tag, hypre_CommHandle **comm_handle_ptr );
|
|
HYPRE_Int hypre_FinalizeCommunication ( hypre_CommHandle *comm_handle );
|
|
HYPRE_Int hypre_ExchangeLocalData ( hypre_CommPkg *comm_pkg, HYPRE_Complex *send_data,
|
|
HYPRE_Complex *recv_data, HYPRE_Int action );
|
|
HYPRE_Int hypre_CommPkgDestroy ( hypre_CommPkg *comm_pkg );
|
|
|
|
/* struct_copy.c */
|
|
HYPRE_Int hypre_StructCopy ( hypre_StructVector *x, hypre_StructVector *y );
|
|
HYPRE_Int hypre_StructPartialCopy ( hypre_StructVector *x, hypre_StructVector *y,
|
|
hypre_BoxArrayArray *array_boxes );
|
|
|
|
/* struct_grid.c */
|
|
HYPRE_Int hypre_StructGridCreate ( MPI_Comm comm, HYPRE_Int dim, hypre_StructGrid **grid_ptr );
|
|
HYPRE_Int hypre_StructGridRef ( hypre_StructGrid *grid, hypre_StructGrid **grid_ref );
|
|
HYPRE_Int hypre_StructGridDestroy ( hypre_StructGrid *grid );
|
|
HYPRE_Int hypre_StructGridSetPeriodic ( hypre_StructGrid *grid, hypre_Index periodic );
|
|
HYPRE_Int hypre_StructGridSetExtents ( hypre_StructGrid *grid, hypre_Index ilower,
|
|
hypre_Index iupper );
|
|
HYPRE_Int hypre_StructGridSetBoxes ( hypre_StructGrid *grid, hypre_BoxArray *boxes );
|
|
HYPRE_Int hypre_StructGridSetBoundingBox ( hypre_StructGrid *grid, hypre_Box *new_bb );
|
|
HYPRE_Int hypre_StructGridSetIDs ( hypre_StructGrid *grid, HYPRE_Int *ids );
|
|
HYPRE_Int hypre_StructGridSetBoxManager ( hypre_StructGrid *grid, hypre_BoxManager *boxman );
|
|
HYPRE_Int hypre_StructGridSetMaxDistance ( hypre_StructGrid *grid, hypre_Index dist );
|
|
HYPRE_Int hypre_StructGridAssemble ( hypre_StructGrid *grid );
|
|
HYPRE_Int hypre_GatherAllBoxes ( MPI_Comm comm, hypre_BoxArray *boxes, HYPRE_Int dim,
|
|
hypre_BoxArray **all_boxes_ptr, HYPRE_Int **all_procs_ptr, HYPRE_Int *first_local_ptr );
|
|
HYPRE_Int hypre_ComputeBoxnums ( hypre_BoxArray *boxes, HYPRE_Int *procs, HYPRE_Int **boxnums_ptr );
|
|
HYPRE_Int hypre_StructGridPrint ( FILE *file, hypre_StructGrid *grid );
|
|
HYPRE_Int hypre_StructGridRead ( MPI_Comm comm, FILE *file, hypre_StructGrid **grid_ptr );
|
|
HYPRE_Int hypre_StructGridSetNumGhost ( hypre_StructGrid *grid, HYPRE_Int *num_ghost );
|
|
HYPRE_Int hypre_StructGridGetMaxBoxSize ( hypre_StructGrid *grid );
|
|
#if defined(HYPRE_USING_CUDA) || defined(HYPRE_USING_HIP)
|
|
HYPRE_Int hypre_StructGridSetDataLocation( HYPRE_StructGrid grid,
|
|
HYPRE_MemoryLocation data_location );
|
|
#endif
|
|
/* struct_innerprod.c */
|
|
HYPRE_Real hypre_StructInnerProd ( hypre_StructVector *x, hypre_StructVector *y );
|
|
|
|
/* struct_io.c */
|
|
HYPRE_Int hypre_PrintBoxArrayData ( FILE *file, hypre_BoxArray *box_array,
|
|
hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data );
|
|
HYPRE_Int hypre_PrintCCVDBoxArrayData ( FILE *file, hypre_BoxArray *box_array,
|
|
hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int center_rank, HYPRE_Int stencil_size,
|
|
HYPRE_Int *symm_elements, HYPRE_Int dim, HYPRE_Complex *data );
|
|
HYPRE_Int hypre_PrintCCBoxArrayData ( FILE *file, hypre_BoxArray *box_array,
|
|
hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Complex *data );
|
|
HYPRE_Int hypre_ReadBoxArrayData ( FILE *file, hypre_BoxArray *box_array,
|
|
hypre_BoxArray *data_space, HYPRE_Int num_values, HYPRE_Int dim, HYPRE_Complex *data );
|
|
HYPRE_Int hypre_ReadBoxArrayData_CC ( FILE *file, hypre_BoxArray *box_array,
|
|
hypre_BoxArray *data_space, HYPRE_Int stencil_size, HYPRE_Int real_stencil_size,
|
|
HYPRE_Int constant_coefficient, HYPRE_Int dim, HYPRE_Complex *data );
|
|
|
|
/* struct_matrix.c */
|
|
HYPRE_Complex *hypre_StructMatrixExtractPointerByIndex ( hypre_StructMatrix *matrix, HYPRE_Int b,
|
|
hypre_Index index );
|
|
hypre_StructMatrix *hypre_StructMatrixCreate ( MPI_Comm comm, hypre_StructGrid *grid,
|
|
hypre_StructStencil *user_stencil );
|
|
hypre_StructMatrix *hypre_StructMatrixRef ( hypre_StructMatrix *matrix );
|
|
HYPRE_Int hypre_StructMatrixDestroy ( hypre_StructMatrix *matrix );
|
|
HYPRE_Int hypre_StructMatrixInitializeShell ( hypre_StructMatrix *matrix );
|
|
HYPRE_Int hypre_StructMatrixInitializeData ( hypre_StructMatrix *matrix, HYPRE_Complex *data,
|
|
HYPRE_Complex *data_const);
|
|
HYPRE_Int hypre_StructMatrixInitialize ( hypre_StructMatrix *matrix );
|
|
HYPRE_Int hypre_StructMatrixSetValues ( hypre_StructMatrix *matrix, hypre_Index grid_index,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values, HYPRE_Int action,
|
|
HYPRE_Int boxnum, HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructMatrixSetBoxValues ( hypre_StructMatrix *matrix, hypre_Box *set_box,
|
|
hypre_Box *value_box, HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices,
|
|
HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructMatrixSetConstantValues ( hypre_StructMatrix *matrix,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Complex *values,
|
|
HYPRE_Int action );
|
|
HYPRE_Int hypre_StructMatrixClearValues ( hypre_StructMatrix *matrix, hypre_Index grid_index,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructMatrixClearBoxValues ( hypre_StructMatrix *matrix, hypre_Box *clear_box,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices, HYPRE_Int boxnum, HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructMatrixAssemble ( hypre_StructMatrix *matrix );
|
|
HYPRE_Int hypre_StructMatrixSetNumGhost ( hypre_StructMatrix *matrix, HYPRE_Int *num_ghost );
|
|
HYPRE_Int hypre_StructMatrixSetConstantCoefficient ( hypre_StructMatrix *matrix,
|
|
HYPRE_Int constant_coefficient );
|
|
HYPRE_Int hypre_StructMatrixSetConstantEntries ( hypre_StructMatrix *matrix, HYPRE_Int nentries,
|
|
HYPRE_Int *entries );
|
|
HYPRE_Int hypre_StructMatrixClearGhostValues ( hypre_StructMatrix *matrix );
|
|
HYPRE_Int hypre_StructMatrixPrintData ( FILE *file, hypre_StructMatrix *matrix, HYPRE_Int all );
|
|
HYPRE_Int hypre_StructMatrixReadData ( FILE *file, hypre_StructMatrix *matrix );
|
|
HYPRE_Int hypre_StructMatrixPrint ( const char *filename, hypre_StructMatrix *matrix,
|
|
HYPRE_Int all );
|
|
hypre_StructMatrix *hypre_StructMatrixRead ( MPI_Comm comm, const char *filename,
|
|
HYPRE_Int *num_ghost );
|
|
HYPRE_Int hypre_StructMatrixMigrate ( hypre_StructMatrix *from_matrix,
|
|
hypre_StructMatrix *to_matrix );
|
|
HYPRE_Int hypre_StructMatrixClearBoundary( hypre_StructMatrix *matrix);
|
|
|
|
/* struct_matrix_mask.c */
|
|
hypre_StructMatrix *hypre_StructMatrixCreateMask ( hypre_StructMatrix *matrix,
|
|
HYPRE_Int num_stencil_indices, HYPRE_Int *stencil_indices );
|
|
|
|
/* struct_matvec.c */
|
|
void *hypre_StructMatvecCreate ( void );
|
|
HYPRE_Int hypre_StructMatvecSetup ( void *matvec_vdata, hypre_StructMatrix *A,
|
|
hypre_StructVector *x );
|
|
HYPRE_Int hypre_StructMatvecCompute ( void *matvec_vdata, HYPRE_Complex alpha,
|
|
hypre_StructMatrix *A, hypre_StructVector *x, HYPRE_Complex beta, hypre_StructVector *y );
|
|
HYPRE_Int hypre_StructMatvecCC0 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x,
|
|
hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride );
|
|
HYPRE_Int hypre_StructMatvecCC1 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x,
|
|
hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride );
|
|
HYPRE_Int hypre_StructMatvecCC2 ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x,
|
|
hypre_StructVector *y, hypre_BoxArrayArray *compute_box_aa, hypre_IndexRef stride );
|
|
HYPRE_Int hypre_StructMatvecDestroy ( void *matvec_vdata );
|
|
HYPRE_Int hypre_StructMatvec ( HYPRE_Complex alpha, hypre_StructMatrix *A, hypre_StructVector *x,
|
|
HYPRE_Complex beta, hypre_StructVector *y );
|
|
|
|
/* struct_scale.c */
|
|
HYPRE_Int hypre_StructScale ( HYPRE_Complex alpha, hypre_StructVector *y );
|
|
|
|
/* struct_stencil.c */
|
|
hypre_StructStencil *hypre_StructStencilCreate ( HYPRE_Int dim, HYPRE_Int size,
|
|
hypre_Index *shape );
|
|
hypre_StructStencil *hypre_StructStencilRef ( hypre_StructStencil *stencil );
|
|
HYPRE_Int hypre_StructStencilDestroy ( hypre_StructStencil *stencil );
|
|
HYPRE_Int hypre_StructStencilElementRank ( hypre_StructStencil *stencil,
|
|
hypre_Index stencil_element );
|
|
HYPRE_Int hypre_StructStencilSymmetrize ( hypre_StructStencil *stencil,
|
|
hypre_StructStencil **symm_stencil_ptr, HYPRE_Int **symm_elements_ptr );
|
|
|
|
/* struct_vector.c */
|
|
hypre_StructVector *hypre_StructVectorCreate ( MPI_Comm comm, hypre_StructGrid *grid );
|
|
hypre_StructVector *hypre_StructVectorRef ( hypre_StructVector *vector );
|
|
HYPRE_Int hypre_StructVectorDestroy ( hypre_StructVector *vector );
|
|
HYPRE_Int hypre_StructVectorInitializeShell ( hypre_StructVector *vector );
|
|
HYPRE_Int hypre_StructVectorInitializeData ( hypre_StructVector *vector, HYPRE_Complex *data);
|
|
HYPRE_Int hypre_StructVectorInitialize ( hypre_StructVector *vector );
|
|
HYPRE_Int hypre_StructVectorSetValues ( hypre_StructVector *vector, hypre_Index grid_index,
|
|
HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum, HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructVectorSetBoxValues ( hypre_StructVector *vector, hypre_Box *set_box,
|
|
hypre_Box *value_box, HYPRE_Complex *values, HYPRE_Int action, HYPRE_Int boxnum,
|
|
HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructVectorClearValues ( hypre_StructVector *vector, hypre_Index grid_index,
|
|
HYPRE_Int boxnum, HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructVectorClearBoxValues ( hypre_StructVector *vector, hypre_Box *clear_box,
|
|
HYPRE_Int boxnum, HYPRE_Int outside );
|
|
HYPRE_Int hypre_StructVectorClearAllValues ( hypre_StructVector *vector );
|
|
HYPRE_Int hypre_StructVectorSetNumGhost ( hypre_StructVector *vector, HYPRE_Int *num_ghost );
|
|
HYPRE_Int hypre_StructVectorSetDataSize(hypre_StructVector *vector, HYPRE_Int *data_size,
|
|
HYPRE_Int *data_host_size);
|
|
HYPRE_Int hypre_StructVectorAssemble ( hypre_StructVector *vector );
|
|
HYPRE_Int hypre_StructVectorCopy ( hypre_StructVector *x, hypre_StructVector *y );
|
|
HYPRE_Int hypre_StructVectorSetConstantValues ( hypre_StructVector *vector, HYPRE_Complex values );
|
|
HYPRE_Int hypre_StructVectorSetFunctionValues ( hypre_StructVector *vector,
|
|
HYPRE_Complex (*fcn )( HYPRE_Int, HYPRE_Int, HYPRE_Int ));
|
|
HYPRE_Int hypre_StructVectorClearGhostValues ( hypre_StructVector *vector );
|
|
HYPRE_Int hypre_StructVectorClearBoundGhostValues ( hypre_StructVector *vector, HYPRE_Int force );
|
|
HYPRE_Int hypre_StructVectorScaleValues ( hypre_StructVector *vector, HYPRE_Complex factor );
|
|
hypre_CommPkg *hypre_StructVectorGetMigrateCommPkg ( hypre_StructVector *from_vector,
|
|
hypre_StructVector *to_vector );
|
|
HYPRE_Int hypre_StructVectorMigrate ( hypre_CommPkg *comm_pkg, hypre_StructVector *from_vector,
|
|
hypre_StructVector *to_vector );
|
|
HYPRE_Int hypre_StructVectorPrint ( const char *filename, hypre_StructVector *vector,
|
|
HYPRE_Int all );
|
|
hypre_StructVector *hypre_StructVectorRead ( MPI_Comm comm, const char *filename,
|
|
HYPRE_Int *num_ghost );
|
|
hypre_StructVector *hypre_StructVectorClone ( hypre_StructVector *vector );
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for the BoxLoop
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* BoxLoop macros:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#ifndef HYPRE_BOXLOOP_DEVICEOMP_HEADER
|
|
#define HYPRE_BOXLOOP_DEVICEOMP_HEADER
|
|
|
|
#if defined(HYPRE_USING_DEVICE_OPENMP) && !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS)
|
|
|
|
#include "omp.h"
|
|
|
|
/* concatenation:
|
|
*/
|
|
#define HYPRE_CONCAT2(x, y) x ## _ ## y
|
|
#define HYPRE_XCONCAT2(x, y) HYPRE_CONCAT2(x, y)
|
|
|
|
#define HYPRE_CONCAT3(x, y, z) x ## _ ## y ## _ ## z
|
|
#define HYPRE_XCONCAT3(x, y, z) HYPRE_CONCAT3(x, y, z)
|
|
|
|
/* if use OMP 4.5 default team size and number of teams */
|
|
#define AUTO_OMP_TEAM
|
|
|
|
#ifndef AUTO_OMP_TEAM
|
|
/* omp team size (aka. gpu block size) */
|
|
#define hypre_gpu_block_size HYPRE_1D_BLOCK_SIZE
|
|
/* the max number of omp teams */
|
|
#define hypre_max_num_blocks 1000000
|
|
#endif
|
|
|
|
//#define HYPRE_BOXLOOP_ENTRY_PRINT hypre_printf("%s %s %d\n", __FILE__, __func__, __LINE__);
|
|
#define HYPRE_BOXLOOP_ENTRY_PRINT
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
BOX LOOPS [TEAM DISTRIBUTE VERSION]
|
|
!!! NOTE: THIS CODE ONLY WORKS FOR DIM <= 3 !!!
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
/*
|
|
#define hypre_BoxLoop0For()
|
|
#define hypre_BoxLoop1For(i1)
|
|
#define hypre_BoxLoop2For(i1, i2)
|
|
#define hypre_BoxLoop3For(i1, i2, i3)
|
|
#define hypre_BoxLoop4For(i1, i2, i3, i4)
|
|
*/
|
|
#define hypre_BoxLoopBlock() 0
|
|
|
|
#define hypre_BoxLoop0Begin zypre_omp4_dist_BoxLoop0Begin
|
|
#define hypre_BoxLoop0End zypre_omp4_dist_BoxLoopEnd
|
|
#define hypre_BoxLoop1Begin zypre_omp4_dist_BoxLoop1Begin
|
|
#define hypre_BoxLoop1End zypre_omp4_dist_BoxLoopEnd
|
|
#define hypre_BasicBoxLoop2Begin zypre_omp4_dist_BoxLoop2_v2_Begin
|
|
#define hypre_BoxLoop2Begin zypre_omp4_dist_BoxLoop2Begin
|
|
#define hypre_BoxLoop2End zypre_omp4_dist_BoxLoopEnd
|
|
#define hypre_BoxLoop3Begin zypre_omp4_dist_BoxLoop3Begin
|
|
#if 0
|
|
#define hypre_BoxLoop3_SAME_STRIDE_Begin zypre_omp4_dist_BoxLoop3_SAME_STRIDE_Begin
|
|
#endif
|
|
#define hypre_BoxLoop3End zypre_omp4_dist_BoxLoopEnd
|
|
#define hypre_BoxLoop4Begin zypre_omp4_dist_BoxLoop4Begin
|
|
#define hypre_BoxLoop4End zypre_omp4_dist_BoxLoopEnd
|
|
#define hypre_LoopBegin zypre_omp4_dist_LoopBegin
|
|
#define hypre_LoopEnd zypre_omp4_dist_BoxLoopEnd
|
|
|
|
/* Look for more in struct_ls/red_black_gs.h" */
|
|
|
|
#define zypre_omp4_dist_BoxLoopEnd(...) \
|
|
}\
|
|
/*cudaDeviceSynchronize();*/ \
|
|
}
|
|
|
|
#define HYPRE_BOX_REDUCTION
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* host code: declare variables used in the box loop
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) \
|
|
HYPRE_Int hypre__ndim = ndim, hypre__tot = 1; \
|
|
/* HYPRE_Int hypre__thread; */ \
|
|
/* loop size */ \
|
|
HYPRE_Int hypre__loop_size_0, hypre__loop_size_1, hypre__loop_size_2; \
|
|
if (hypre__ndim > 0) { hypre__loop_size_0 = loop_size[0]; hypre__tot *= hypre__loop_size_0; } \
|
|
if (hypre__ndim > 1) { hypre__loop_size_1 = loop_size[1]; hypre__tot *= hypre__loop_size_1; } \
|
|
if (hypre__ndim > 2) { hypre__loop_size_2 = loop_size[2]; hypre__tot *= hypre__loop_size_2; }
|
|
|
|
#ifdef AUTO_OMP_TEAM
|
|
#define TEAM_CLAUSE
|
|
#define zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size)
|
|
#else
|
|
#define TEAM_CLAUSE num_teams(num_blocks) thread_limit(block_size)
|
|
#define zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) zypre_omp4_BoxLoopDeclareInit_0(ndim, loop_size) \
|
|
/* GPU block numbers and dimensions */ \
|
|
HYPRE_Int block_size = hypre_gpu_block_size; \
|
|
HYPRE_Int num_blocks = hypre_min(hypre_max_num_blocks, (hypre__tot + hypre_gpu_block_size - 1) / hypre_gpu_block_size);
|
|
#endif
|
|
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* host code: declare and initialize variables for box k
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxKDeclareInitBody(j, k, startk, dboxk, stridek) \
|
|
HYPRE_XCONCAT3(hypre__stride,j,k) = stridek[j]; \
|
|
/* precompute some entities used in the parallel for loop */ \
|
|
HYPRE_XCONCAT3(hypre__box_start_imin,j,k) = startk[j] - dboxk->imin[j]; \
|
|
HYPRE_XCONCAT3(hypre__box_imax_imin,j,k) = dboxk->imax[j] - dboxk->imin[j] + 1;
|
|
|
|
|
|
#define zypre_omp4_BoxKDeclareInit(k, startk, dboxk, stridek)\
|
|
/* start - imin */ \
|
|
HYPRE_Int HYPRE_XCONCAT3(hypre__box_start_imin,0,k), HYPRE_XCONCAT3(hypre__box_start_imin,1,k), HYPRE_XCONCAT3(hypre__box_start_imin,2,k); \
|
|
/* imax - imin + 1 */ \
|
|
HYPRE_Int HYPRE_XCONCAT3(hypre__box_imax_imin,0,k), HYPRE_XCONCAT3(hypre__box_imax_imin,1,k), HYPRE_XCONCAT3(hypre__box_imax_imin,2,k); \
|
|
/* stride */ \
|
|
HYPRE_Int HYPRE_XCONCAT3(hypre__stride,0,k), HYPRE_XCONCAT3(hypre__stride,1,k), HYPRE_XCONCAT3(hypre__stride,2,k); \
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxKDeclareInitBody(0, k, startk, dboxk, stridek) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxKDeclareInitBody(1, k, startk, dboxk, stridek) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxKDeclareInitBody(2, k, startk, dboxk, stridek) } \
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* map clause
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define MAP_CLAUSE0
|
|
#define MAP_CLAUSE1
|
|
#define MAP_CLAUSE2
|
|
#define MAP_CLAUSE3
|
|
#define MAP_CLAUSE4
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* if clause
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define IF_CLAUSE if (hypre__global_offload && hypre__tot > 0)
|
|
//#define IF_CLAUSE
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* is_device_ptr clause
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#if defined(HYPRE_DEVICE_OPENMP_ALLOC)
|
|
#define IS_DEVICE_CLAUSE DEVICE_VAR
|
|
#else
|
|
#define IS_DEVICE_CLAUSE
|
|
#endif
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* device code for BoxLoop 1, set i1
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxLoopSet1Body(j, i1) \
|
|
/* coord in dimension j */ \
|
|
hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* once */ \
|
|
hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\
|
|
/* once */ \
|
|
i1 += hypre__i_1 * hypre__I_1; \
|
|
/* once */ \
|
|
hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \
|
|
/* */ \
|
|
hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* save the 3-D id */ \
|
|
HYPRE_XCONCAT2(hypre__id,j) = hypre__i;
|
|
|
|
|
|
#define zypre_omp4_BoxLoopSet1(i1) \
|
|
HYPRE_Int hypre__I_1, hypre__i, hypre__i_1, hypre__J, i1, idx; \
|
|
HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \
|
|
hypre__I_1 = 1; idx = hypre__J = hypre__thread; i1 = 0; \
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet1Body(0, i1) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet1Body(1, i1) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet1Body(2, i1) }
|
|
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* device code for BoxLoop 2, set i1, i2
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxLoopSet2Body(j, i1, i2) \
|
|
/* */ \
|
|
hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* twice */ \
|
|
hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\
|
|
hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\
|
|
/* twice */ \
|
|
i1 += hypre__i_1 * hypre__I_1; \
|
|
i2 += hypre__i_2 * hypre__I_2; \
|
|
/* twice */ \
|
|
hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \
|
|
hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \
|
|
/* */ \
|
|
hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* save the 3-D id */ \
|
|
HYPRE_XCONCAT2(hypre__id,j) = hypre__i;
|
|
|
|
|
|
#define zypre_omp4_BoxLoopSet2(i1, i2) \
|
|
HYPRE_Int hypre__I_1, hypre__I_2, hypre__i, hypre__i_1, hypre__i_2, hypre__J, i1, i2; \
|
|
HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \
|
|
hypre__I_1 = hypre__I_2 = 1; hypre__J = hypre__thread; i1 = i2 = 0; \
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet2Body(0, i1, i2) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet2Body(1, i1, i2) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet2Body(2, i1, i2) }
|
|
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* device code for BoxLoop 3, set i1, i2, i3
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxLoopSet3Body(j, i1, i2, i3) \
|
|
/* */ \
|
|
hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* 3 times */ \
|
|
hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\
|
|
hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\
|
|
hypre__i_3 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,3) + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\
|
|
/* 3 times */ \
|
|
i1 += hypre__i_1 * hypre__I_1; \
|
|
i2 += hypre__i_2 * hypre__I_2; \
|
|
i3 += hypre__i_3 * hypre__I_3; \
|
|
/* 3 times */ \
|
|
hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \
|
|
hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \
|
|
hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \
|
|
/* */ \
|
|
hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* save the 3-D id */ \
|
|
HYPRE_XCONCAT2(hypre__id,j) = hypre__i;
|
|
|
|
|
|
#define zypre_omp4_BoxLoopSet3(i1, i2, i3) \
|
|
HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__J, i1, i2, i3; \
|
|
HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \
|
|
hypre__I_1 = hypre__I_2 = hypre__I_3 = 1; hypre__J = hypre__thread; i1 = i2 = i3 = 0; \
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet3Body(0, i1, i2, i3) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet3Body(1, i1, i2, i3) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet3Body(2, i1, i2, i3) }
|
|
|
|
#if 0
|
|
/* - - - - - special Box 3: XXX */
|
|
#define zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(j, i1, i2, i3) \
|
|
/* */ \
|
|
hypre__i = (hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j)) * HYPRE_XCONCAT3(hypre__stride,j,1); \
|
|
/* 3 times */ \
|
|
hypre__i_1 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\
|
|
hypre__i_2 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\
|
|
hypre__i_3 = hypre__i + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\
|
|
/* 3 times */ \
|
|
i1 += hypre__i_1 * hypre__I_1; \
|
|
i2 += hypre__i_2 * hypre__I_2; \
|
|
i3 += hypre__i_3 * hypre__I_3; \
|
|
/* 3 times */ \
|
|
hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \
|
|
hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \
|
|
hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \
|
|
/* */ \
|
|
hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j);
|
|
|
|
|
|
#define zypre_omp4_BoxLoopSet3_SAME_STRIDE(i1, i2, o2, i3) \
|
|
HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__J; \
|
|
hypre__I_1 = hypre__I_2 = hypre__I_3 = 1; hypre__J = hypre__thread; i1 = i3 = 0; i2 = o2;\
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(0, i1, i2, i3) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(1, i1, i2, i3) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet3_SAME_STRIDE_Body(2, i1, i2, i3) }
|
|
#endif
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* device code for BoxLoop 4, set i1, i2, i3, i4
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxLoopSet4Body(j, i1, i2, i3, i4) \
|
|
/* */ \
|
|
hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* 4 times */ \
|
|
hypre__i_1 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1) + HYPRE_XCONCAT3(hypre__box_start_imin,j,1);\
|
|
hypre__i_2 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2) + HYPRE_XCONCAT3(hypre__box_start_imin,j,2);\
|
|
hypre__i_3 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,3) + HYPRE_XCONCAT3(hypre__box_start_imin,j,3);\
|
|
hypre__i_4 = hypre__i * HYPRE_XCONCAT3(hypre__stride,j,4) + HYPRE_XCONCAT3(hypre__box_start_imin,j,4);\
|
|
/* 4 times */ \
|
|
i1 += hypre__i_1 * hypre__I_1; \
|
|
i2 += hypre__i_2 * hypre__I_2; \
|
|
i3 += hypre__i_3 * hypre__I_3; \
|
|
i4 += hypre__i_4 * hypre__I_4; \
|
|
/* 4 times */ \
|
|
hypre__I_1 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,1); \
|
|
hypre__I_2 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,2); \
|
|
hypre__I_3 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,3); \
|
|
hypre__I_4 *= HYPRE_XCONCAT3(hypre__box_imax_imin,j,4); \
|
|
/* */ \
|
|
hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* save the 3-D id */ \
|
|
HYPRE_XCONCAT2(hypre__id,j) = hypre__i;
|
|
|
|
|
|
#define zypre_omp4_BoxLoopSet4(i1, i2, i3, i4) \
|
|
HYPRE_Int hypre__I_1, hypre__I_2, hypre__I_3, hypre__I_4, hypre__i, hypre__i_1, hypre__i_2, hypre__i_3, hypre__i_4, hypre__J, i1, i2, i3, i4; \
|
|
HYPRE_Int hypre__id_0, hypre__id_1, hypre__id_2; \
|
|
hypre__I_1 = hypre__I_2 = hypre__I_3 = hypre__I_4 = 1; hypre__J = hypre__thread; i1 = i2 = i3 = i4 = 0; \
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet4Body(0, i1, i2, i3, i4) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet4Body(1, i1, i2, i3, i4) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet4Body(2, i1, i2, i3, i4) }
|
|
|
|
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* BoxLoop 0
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_dist_BoxLoop0Begin(ndim, loop_size) \
|
|
{\
|
|
/* host code: */ \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE0 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* BoxLoop 1
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
|
|
#define zypre_omp4_dist_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1) \
|
|
{\
|
|
/* host code: */ \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 IS_DEVICE_CLAUSE HYPRE_BOX_REDUCTION TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet1(i1)
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* BoxLoop 2
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
|
|
#define zypre_omp4_dist_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2) \
|
|
{\
|
|
/* host code: */ \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \
|
|
zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE HYPRE_BOX_REDUCTION TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet2(i1, i2)
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* BoxLoop 3
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_dist_BoxLoop3Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2, \
|
|
dbox3, start3, stride3, i3) \
|
|
{\
|
|
/* host code: */ \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \
|
|
zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \
|
|
zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE3 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet3(i1, i2, i3)
|
|
|
|
#if 0
|
|
#define zypre_omp4_dist_BoxLoop3_SAME_STRIDE_Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2, o2, \
|
|
dbox3, start3, stride3, i3) \
|
|
{\
|
|
/* host code: */ \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \
|
|
zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \
|
|
zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE3 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet3_SAME_STRIDE(i1, i2, o2, i3)
|
|
#endif
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* BoxLoop 4
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_dist_BoxLoop4Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2, \
|
|
dbox3, start3, stride3, i3, \
|
|
dbox4, start4, stride4, i4) \
|
|
{\
|
|
/* host code: */ \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \
|
|
zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \
|
|
zypre_omp4_BoxKDeclareInit(3, start3, dbox3, stride3) \
|
|
zypre_omp4_BoxKDeclareInit(4, start4, dbox4, stride4) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE4 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet4(i1, i2, i3, i4)
|
|
|
|
#if 0
|
|
|
|
/* no longer needed, use the above BoxLoop's for reductions */
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* BoxLoop 1 reduction
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
|
|
#define zypre_omp4_dist_Red_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1, xsum) \
|
|
{\
|
|
/* host code: */ \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 map(tofrom: xsum) reduction(+:xsum) TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet1(i1)
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* BoxLoop 2 reduction
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_dist_Red_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, dbox2, start2, stride2, i2, xsum) \
|
|
{\
|
|
/* host code: */ \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit(1, start1, dbox1, stride1) \
|
|
zypre_omp4_BoxKDeclareInit(2, start2, dbox2, stride2) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 map(tofrom: xsum) reduction(+:xsum) TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet2(i1, i2)
|
|
|
|
#endif
|
|
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* v2
|
|
* host code: declare and initialize variables for box k
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxKDeclareInit_v2(k, stridek)\
|
|
/* stridek[0,1,2] */ \
|
|
HYPRE_Int HYPRE_XCONCAT3(hypre__stride,0,k), HYPRE_XCONCAT3(hypre__stride,1,k), HYPRE_XCONCAT3(hypre__stride,2,k); \
|
|
/*if (hypre__ndim > 0)*/ { HYPRE_XCONCAT3(hypre__stride,0,k) = stridek[0]; } \
|
|
if (hypre__ndim > 1) { HYPRE_XCONCAT3(hypre__stride,1,k) = stridek[1]; } \
|
|
if (hypre__ndim > 2) { HYPRE_XCONCAT3(hypre__stride,2,k) = stridek[2]; } \
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* v2
|
|
* device code for BoxLoop 1, set i1
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxLoopSet1Body_v2(j, i1) \
|
|
i1 += ( hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j) ) * HYPRE_XCONCAT3(hypre__stride,j,1);\
|
|
hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j);
|
|
|
|
|
|
#define zypre_omp4_BoxLoopSet1_v2(i1, idx) \
|
|
HYPRE_Int hypre__J, i1, idx; \
|
|
idx = hypre__J = hypre__thread; i1 = 0; \
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet1Body_v2(0, i1) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet1Body_v2(1, i1) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet1Body_v2(2, i1) }
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* v2: Basic
|
|
* BoxLoop 1
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_dist_BoxLoop1_v2_Begin(ndim, loop_size, stride1, i1, idx) \
|
|
{\
|
|
/* host code: */ \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit_v2(1, stride1) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE1 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{\
|
|
zypre_omp4_BoxLoopSet1_v2(i1, idx)
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* v2
|
|
* device code for BoxLoop 2, set i1, i2
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_BoxLoopSet2Body_v2(j, i1, i2) \
|
|
hypre__i = hypre__J % HYPRE_XCONCAT2(hypre__loop_size,j); \
|
|
/* twice */ \
|
|
i1 += hypre__i * HYPRE_XCONCAT3(hypre__stride,j,1); \
|
|
i2 += hypre__i * HYPRE_XCONCAT3(hypre__stride,j,2); \
|
|
hypre__J /= HYPRE_XCONCAT2(hypre__loop_size,j);
|
|
|
|
|
|
#define zypre_omp4_BoxLoopSet2_v2(i1, i2) \
|
|
HYPRE_Int hypre__i, hypre__J, i1, i2; \
|
|
hypre__J = hypre__thread; i1 = i2 = 0; \
|
|
/*if (hypre__ndim > 0)*/ { zypre_omp4_BoxLoopSet2Body_v2(0, i1, i2) } \
|
|
if (hypre__ndim > 1) { zypre_omp4_BoxLoopSet2Body_v2(1, i1, i2) } \
|
|
if (hypre__ndim > 2) { zypre_omp4_BoxLoopSet2Body_v2(2, i1, i2) }
|
|
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* v2: Basic
|
|
* BoxLoop 2
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
|
|
#define zypre_omp4_dist_BoxLoop2_v2_Begin(ndim, loop_size, stride1, i1, stride2, i2) \
|
|
{ \
|
|
/* host code: */ \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
zypre_omp4_BoxLoopDeclareInit(ndim, loop_size) \
|
|
zypre_omp4_BoxKDeclareInit_v2(1, stride1) \
|
|
zypre_omp4_BoxKDeclareInit_v2(2, stride2) \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \
|
|
for (HYPRE_Int hypre__thread = 0; hypre__thread < hypre__tot; hypre__thread++) \
|
|
{ \
|
|
zypre_omp4_BoxLoopSet2_v2(i1, i2)
|
|
|
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
* Basic Loop
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
|
|
#define zypre_omp4_dist_LoopBegin(size, idx) \
|
|
{ \
|
|
/* host code: */ \
|
|
/* HYPRE_Int idx = 0; */\
|
|
HYPRE_Int hypre__tot = size; \
|
|
HYPRE_BOXLOOP_ENTRY_PRINT \
|
|
/* device code: */ \
|
|
_Pragma (HYPRE_XSTR(omp target teams distribute parallel for IF_CLAUSE MAP_CLAUSE2 IS_DEVICE_CLAUSE TEAM_CLAUSE)) \
|
|
for (HYPRE_Int idx = 0; idx < hypre__tot; idx++) \
|
|
{
|
|
|
|
#define hypre_BoxLoopGetIndex(index) \
|
|
index[0] = hypre__id_0; \
|
|
index[1] = hypre__id_1; \
|
|
index[2] = hypre__id_2;
|
|
|
|
/* Reduction */
|
|
#define hypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \
|
|
hypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1)
|
|
|
|
#define hypre_BoxLoop1ReductionEnd(i1, reducesum) \
|
|
hypre_BoxLoop1End(i1)
|
|
|
|
#define hypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2, reducesum) \
|
|
hypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2)
|
|
|
|
#define hypre_BoxLoop2ReductionEnd(i1, i2, reducesum) \
|
|
hypre_BoxLoop2End(i1, i2)
|
|
|
|
#endif
|
|
|
|
#endif /* #ifndef HYPRE_BOXLOOP_DEVICEOMP_HEADER */
|
|
|
|
/******************************************************************************
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
*
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
******************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Header info for the BoxLoop
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* BoxLoop macros:
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#ifndef HYPRE_BOXLOOP_HOST_HEADER
|
|
#define HYPRE_BOXLOOP_HOST_HEADER
|
|
|
|
#if defined(HYPRE_USING_OPENMP)
|
|
#define HYPRE_BOX_REDUCTION
|
|
#define HYPRE_OMP_CLAUSE
|
|
#if defined(WIN32) && defined(_MSC_VER)
|
|
#define Pragma(x) __pragma(x)
|
|
#else
|
|
#define Pragma(x) _Pragma(HYPRE_XSTR(x))
|
|
#endif
|
|
#define OMP0 Pragma(omp parallel for HYPRE_OMP_CLAUSE HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE)
|
|
#define OMP1 Pragma(omp parallel for private(HYPRE_BOX_PRIVATE) HYPRE_OMP_CLAUSE HYPRE_BOX_REDUCTION HYPRE_SMP_SCHEDULE)
|
|
#else /* #if defined(HYPRE_USING_OPENMP) */
|
|
#define OMP0
|
|
#define OMP1
|
|
#endif /* #if defined(HYPRE_USING_OPENMP) */
|
|
|
|
#define zypre_BoxLoop0Begin(ndim, loop_size) \
|
|
{ \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
OMP1 \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
zypre_BoxLoopSet(); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define zypre_BoxLoop0End() \
|
|
} \
|
|
zypre_BoxLoopInc1(); \
|
|
zypre_BoxLoopInc2(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define zypre_BoxLoop1Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1) \
|
|
{ \
|
|
HYPRE_Int i1; \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \
|
|
OMP1 \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
HYPRE_Int i1; \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define zypre_BoxLoop1End(i1) \
|
|
i1 += hypre__i0inc1; \
|
|
} \
|
|
zypre_BoxLoopInc1(); \
|
|
i1 += hypre__ikinc1[hypre__d]; \
|
|
zypre_BoxLoopInc2(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
|
|
#define zypre_BoxLoop2Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2) \
|
|
{ \
|
|
HYPRE_Int i1, i2; \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopDeclareK(2); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \
|
|
zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \
|
|
OMP1 \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
HYPRE_Int i1, i2; \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
zypre_BoxLoopSetK(2, i2); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define zypre_BoxLoop2End(i1, i2) \
|
|
i1 += hypre__i0inc1; \
|
|
i2 += hypre__i0inc2; \
|
|
} \
|
|
zypre_BoxLoopInc1(); \
|
|
i1 += hypre__ikinc1[hypre__d]; \
|
|
i2 += hypre__ikinc2[hypre__d]; \
|
|
zypre_BoxLoopInc2(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
|
|
#define zypre_BoxLoop3Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2, \
|
|
dbox3, start3, stride3, i3) \
|
|
{ \
|
|
HYPRE_Int i1, i2, i3; \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopDeclareK(2); \
|
|
zypre_BoxLoopDeclareK(3); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \
|
|
zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \
|
|
zypre_BoxLoopInitK(3, dbox3, start3, stride3, i3); \
|
|
OMP1 \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
HYPRE_Int i1, i2, i3; \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
zypre_BoxLoopSetK(2, i2); \
|
|
zypre_BoxLoopSetK(3, i3); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define zypre_BoxLoop3End(i1, i2, i3) \
|
|
i1 += hypre__i0inc1; \
|
|
i2 += hypre__i0inc2; \
|
|
i3 += hypre__i0inc3; \
|
|
} \
|
|
zypre_BoxLoopInc1(); \
|
|
i1 += hypre__ikinc1[hypre__d]; \
|
|
i2 += hypre__ikinc2[hypre__d]; \
|
|
i3 += hypre__ikinc3[hypre__d]; \
|
|
zypre_BoxLoopInc2(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define zypre_BoxLoop4Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2, \
|
|
dbox3, start3, stride3, i3, \
|
|
dbox4, start4, stride4, i4) \
|
|
{ \
|
|
HYPRE_Int i1, i2, i3, i4; \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopDeclareK(2); \
|
|
zypre_BoxLoopDeclareK(3); \
|
|
zypre_BoxLoopDeclareK(4); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \
|
|
zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \
|
|
zypre_BoxLoopInitK(3, dbox3, start3, stride3, i3); \
|
|
zypre_BoxLoopInitK(4, dbox4, start4, stride4, i4); \
|
|
OMP1 \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
HYPRE_Int i1, i2, i3, i4; \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
zypre_BoxLoopSetK(2, i2); \
|
|
zypre_BoxLoopSetK(3, i3); \
|
|
zypre_BoxLoopSetK(4, i4); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define zypre_BoxLoop4End(i1, i2, i3, i4) \
|
|
i1 += hypre__i0inc1; \
|
|
i2 += hypre__i0inc2; \
|
|
i3 += hypre__i0inc3; \
|
|
i4 += hypre__i0inc4; \
|
|
} \
|
|
zypre_BoxLoopInc1(); \
|
|
i1 += hypre__ikinc1[hypre__d]; \
|
|
i2 += hypre__ikinc2[hypre__d]; \
|
|
i3 += hypre__ikinc3[hypre__d]; \
|
|
i4 += hypre__ikinc4[hypre__d]; \
|
|
zypre_BoxLoopInc2(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define zypre_BasicBoxLoop1Begin(ndim, loop_size, \
|
|
stride1, i1) \
|
|
{ \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BasicBoxLoopInitK(1, stride1); \
|
|
OMP1 \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
HYPRE_Int i1; \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define zypre_BasicBoxLoop2Begin(ndim, loop_size, \
|
|
stride1, i1, \
|
|
stride2, i2) \
|
|
{ \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopDeclareK(2); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BasicBoxLoopInitK(1, stride1); \
|
|
zypre_BasicBoxLoopInitK(2, stride2); \
|
|
OMP1 \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
HYPRE_Int i1, i2; \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
zypre_BoxLoopSetK(2, i2); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
|
|
#define zypre_LoopBegin(size, idx) \
|
|
{ \
|
|
HYPRE_Int idx; \
|
|
OMP0 \
|
|
for (idx = 0; idx < size; idx ++) \
|
|
{
|
|
|
|
#define zypre_LoopEnd() \
|
|
} \
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------
|
|
* Serial BoxLoop macros:
|
|
* [same as the ones above (without OMP and with SetOneBlock)]
|
|
* TODO: combine them
|
|
*--------------------------------------------------------------------------*/
|
|
#define hypre_SerialBoxLoop0Begin(ndim, loop_size) \
|
|
{ \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BoxLoopSetOneBlock(); \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
zypre_BoxLoopSet(); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define hypre_SerialBoxLoop0End() \
|
|
} \
|
|
zypre_BoxLoopInc1(); \
|
|
zypre_BoxLoopInc2(); \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define hypre_SerialBoxLoop1Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1) \
|
|
{ \
|
|
HYPRE_Int i1; \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \
|
|
zypre_BoxLoopSetOneBlock(); \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define hypre_SerialBoxLoop1End(i1) zypre_BoxLoop1End(i1)
|
|
|
|
#define hypre_SerialBoxLoop2Begin(ndim, loop_size, \
|
|
dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2) \
|
|
{ \
|
|
HYPRE_Int i1,i2; \
|
|
zypre_BoxLoopDeclare(); \
|
|
zypre_BoxLoopDeclareK(1); \
|
|
zypre_BoxLoopDeclareK(2); \
|
|
zypre_BoxLoopInit(ndim, loop_size); \
|
|
zypre_BoxLoopInitK(1, dbox1, start1, stride1, i1); \
|
|
zypre_BoxLoopInitK(2, dbox2, start2, stride2, i2); \
|
|
zypre_BoxLoopSetOneBlock(); \
|
|
for (hypre__block = 0; hypre__block < hypre__num_blocks; hypre__block++) \
|
|
{ \
|
|
zypre_BoxLoopSet(); \
|
|
zypre_BoxLoopSetK(1, i1); \
|
|
zypre_BoxLoopSetK(2, i2); \
|
|
for (hypre__J = 0; hypre__J < hypre__JN; hypre__J++) \
|
|
{ \
|
|
for (hypre__I = 0; hypre__I < hypre__IN; hypre__I++) \
|
|
{
|
|
|
|
#define hypre_SerialBoxLoop2End(i1, i2) zypre_BoxLoop2End(i1, i2)
|
|
|
|
/* Reduction BoxLoop1 */
|
|
#define zypre_BoxLoop1ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, reducesum) \
|
|
zypre_BoxLoop1Begin(ndim, loop_size, dbox1, start1, stride1, i1)
|
|
|
|
#define zypre_BoxLoop1ReductionEnd(i1, reducesum) zypre_BoxLoop1End(i1)
|
|
|
|
/* Reduction BoxLoop2 */
|
|
#define zypre_BoxLoop2ReductionBegin(ndim, loop_size, dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2, reducesum) \
|
|
zypre_BoxLoop2Begin(ndim, loop_size, dbox1, start1, stride1, i1, \
|
|
dbox2, start2, stride2, i2)
|
|
|
|
#define zypre_BoxLoop2ReductionEnd(i1, i2, reducesum) zypre_BoxLoop2End(i1, i2)
|
|
|
|
|
|
/* Renaming */
|
|
#define hypre_BoxLoopGetIndexHost zypre_BoxLoopGetIndex
|
|
#define hypre_BoxLoopBlockHost zypre_BoxLoopBlock
|
|
#define hypre_BoxLoop0BeginHost zypre_BoxLoop0Begin
|
|
#define hypre_BoxLoop0EndHost zypre_BoxLoop0End
|
|
#define hypre_BoxLoop1BeginHost zypre_BoxLoop1Begin
|
|
#define hypre_BoxLoop1EndHost zypre_BoxLoop1End
|
|
#define hypre_BoxLoop2BeginHost zypre_BoxLoop2Begin
|
|
#define hypre_BoxLoop2EndHost zypre_BoxLoop2End
|
|
#define hypre_BoxLoop3BeginHost zypre_BoxLoop3Begin
|
|
#define hypre_BoxLoop3EndHost zypre_BoxLoop3End
|
|
#define hypre_BoxLoop4BeginHost zypre_BoxLoop4Begin
|
|
#define hypre_BoxLoop4EndHost zypre_BoxLoop4End
|
|
#define hypre_BasicBoxLoop1BeginHost zypre_BasicBoxLoop1Begin
|
|
#define hypre_BasicBoxLoop2BeginHost zypre_BasicBoxLoop2Begin
|
|
#define hypre_LoopBeginHost zypre_LoopBegin
|
|
#define hypre_LoopEndHost zypre_LoopEnd
|
|
#define hypre_BoxLoop1ReductionBeginHost zypre_BoxLoop1ReductionBegin
|
|
#define hypre_BoxLoop1ReductionEndHost zypre_BoxLoop1ReductionEnd
|
|
#define hypre_BoxLoop2ReductionBeginHost zypre_BoxLoop2ReductionBegin
|
|
#define hypre_BoxLoop2ReductionEndHost zypre_BoxLoop2ReductionEnd
|
|
|
|
//TODO TEMP FIX
|
|
#if !defined(HYPRE_USING_RAJA) && !defined(HYPRE_USING_KOKKOS) && !defined(HYPRE_USING_CUDA) && !defined(HYPRE_USING_HIP) && !defined(HYPRE_USING_DEVICE_OPENMP) && !defined(HYPRE_USING_SYCL)
|
|
#define hypre_BoxLoopGetIndex hypre_BoxLoopGetIndexHost
|
|
#define hypre_BoxLoopBlock() 0
|
|
#define hypre_BoxLoop0Begin hypre_BoxLoop0BeginHost
|
|
#define hypre_BoxLoop0End hypre_BoxLoop0EndHost
|
|
#define hypre_BoxLoop1Begin hypre_BoxLoop1BeginHost
|
|
#define hypre_BoxLoop1End hypre_BoxLoop1EndHost
|
|
#define hypre_BoxLoop2Begin hypre_BoxLoop2BeginHost
|
|
#define hypre_BoxLoop2End hypre_BoxLoop2EndHost
|
|
#define hypre_BoxLoop3Begin hypre_BoxLoop3BeginHost
|
|
#define hypre_BoxLoop3End hypre_BoxLoop3EndHost
|
|
#define hypre_BoxLoop4Begin hypre_BoxLoop4BeginHost
|
|
#define hypre_BoxLoop4End hypre_BoxLoop4EndHost
|
|
#define hypre_BasicBoxLoop1Begin hypre_BasicBoxLoop1BeginHost
|
|
#define hypre_BasicBoxLoop2Begin hypre_BasicBoxLoop2BeginHost
|
|
#define hypre_LoopBegin hypre_LoopBeginHost
|
|
#define hypre_LoopEnd hypre_LoopEndHost
|
|
#define hypre_BoxLoop1ReductionBegin hypre_BoxLoop1ReductionBeginHost
|
|
#define hypre_BoxLoop1ReductionEnd hypre_BoxLoop1ReductionEndHost
|
|
#define hypre_BoxLoop2ReductionBegin hypre_BoxLoop2ReductionBeginHost
|
|
#define hypre_BoxLoop2ReductionEnd hypre_BoxLoop2ReductionEndHost
|
|
#endif
|
|
|
|
#endif /* #ifndef HYPRE_BOXLOOP_HOST_HEADER */
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|