aboutsummaryrefslogtreecommitdiff
path: root/src/slab.h
blob: dfed6ca27944398b9212e920f6adc9196c208933 (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
/* $Header$ */

#ifndef SLAB_H
#define SLAB_H

#ifdef __cplusplus 
extern "C" 
{
#endif

#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;
};

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

#ifdef __cplusplus 
}
#endif

#endif /* defined SLAB_H */