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 */
|