aboutsummaryrefslogtreecommitdiff
path: root/src/slab.h
blob: 7c02cce0612f61ecd45493896bd8f0e87df33660 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* $Header$ */

#ifndef SLAB_H
#define SLAB_H

#ifdef __cplusplus 
extern "C" 
{
#endif

#include <stdio.h>

#include "cctk.h"

/*
 * Slab_Transfer copies a slab from one array into a slab of another
 * array.
 * 
 * The src and dst variables describe the source and the destination
 * slab, respectively.
 * 
 * The variables gsh, lbnd, and lsh describe the shape and
 * distribution of the array containing the slab.  They are equivalent
 * to the corresponding quantities in the cGH structure.
 * 
 * off, str, and len describe the location and shape of the slab
 * within the array.  off is the offset, i.e., the location of the
 * "first" corner of the slab.  str is the stride, i.e., the distance
 * between to grid points in the slab.  The stride can be negative.
 * len is the length, i.e., the number of grid points making up the
 * slab.  len does not include the grid points that are skipped if the
 * stride is larger than one.
 * 
 * xpose describes a possible permutation of the coordinate axes
 * between the slabs.  It is source-axis = xpose[destination-axis].
 * 
 * flip describes a possible inversion of the coordinate axes (from
 * the point of view of the destination slab).  It is source-axis =
 * xpose[flip[destination-axis]].
 * 
 * The corresponding lengths of the source and the destination slabs
 * must be equal, i.e., for all d: src.len[xpose[d]] = dst.len[d].
 * 
 * The slabs are copied according to
 * 
 *     dst[dst.off + I * dst.str] = src[src.off + J * src.str]
 * 
 * where the multi-indices I and J have the ranges specified by
 * dst.len and src.len, respectively, and I and J are related by the
 * transposition
 * 
 *     J = xpose[flip[I]]
 * 
 * 
 * 
 * Restrictions:
 * 
 *     dim >= 0
 * 
 *     gsh >= 0
 *     lbnd >= 0
 *     lsh >= 0
 *     lbnd + lsh <= gsh
 *     lbbox and ubbox must be booleans, i.e., either 0 or 1
 *     nghostzones >= 0
 * 
 *     len >= 0
 *     str != 0
 *     off >= 0
 *     off < gsh
 *     off + (len-1) * str >= 0
 *     off + (len-1) * str < gsh
 * 
 *     xpose must be a permutation of 0 ... dim-1
 *     flip must be a boolean, i.e., either 0 or 1
 * 
 * The source and the destination arrays may be the same.
 */

#define SLAB_MAXDIM 3

struct slabinfo {
  int gsh;
  int lbnd, lsh;
  int lbbox, ubbox, nghostzones;
  int off, str, len;
};

struct xferinfo {
  struct slabinfo src, dst;
  int xpose;
  int flip;
};

void
print_slabinfo (FILE                  *               const out,
                struct slabinfo const * CCTK_RESTRICT const slabinfo);

void
print_xferinfo (FILE                  *               const out,
                struct xferinfo const * CCTK_RESTRICT const xferinfo);

int
Slab_Transfer (cGH             const * CCTK_RESTRICT const cctkGH,
               int                                   const dim,
               struct xferinfo const * CCTK_RESTRICT const xferinfo,
               int                                   const options,
               int                                   const srctype,
               void            const * CCTK_RESTRICT const srcptr,
               int                                   const dsttype,
               void                  * CCTK_RESTRICT const dstptr);

int
Slab_MultiTransfer (cGH             const                       * CCTK_RESTRICT const cctkGH,
                    int                                                         const dim,
                    struct xferinfo const                       * CCTK_RESTRICT const xferinfo,
                    int                                                         const options,
                    int                                                         const nvars,
                    int             const                       * CCTK_RESTRICT const srctypes,
                    void            const * CCTK_RESTRICT const * CCTK_RESTRICT const srcptrs,
                    int             const                       * CCTK_RESTRICT const dsttypes,
                    void                  * CCTK_RESTRICT const * CCTK_RESTRICT const dstptrs);

#ifdef __cplusplus 
}
#endif

#endif /* defined SLAB_H */