Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sarray_sort.c
Go to the documentation of this file.
1 #include <stddef.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "c99.h"
5 #include "name.h"
6 #include "types.h"
7 #include "fail.h"
8 #include "mem.h"
9 #include "sort.h"
10 
11 #define sarray_permute_ PREFIXED_NAME(sarray_permute_)
12 #define sarray_permute_buf_ PREFIXED_NAME(sarray_permute_buf_)
13 
14 void sarray_permute_(size_t size, void *A, size_t n, uint *perm, void *work)
15 {
16  char *const ar = A, *const item = work;
17  sint *const fperm = (sint*)perm;
18  uint i;
19  for(i=0;i<n;++i) {
20  sint pi = fperm[i];
21  if(pi<0) { fperm[i] = -pi-1; continue; }
22  else if((uint)pi==i) continue;
23  else {
24  char *dst = ar+i*size, *src = ar+pi*size;
25  memcpy(item, dst, size);
26  for(;;) {
27  sint ppi;
28  memcpy(dst, src, size);
29  dst=src;
30  ppi=fperm[pi], fperm[pi]=-ppi-1, pi=ppi;
31  if((uint)pi==i) break;
32  src=ar+pi*size;
33  }
34  memcpy(dst, item, size);
35  }
36  }
37 }
38 
39 void sarray_permute_buf_(size_t align, size_t size, void *A, size_t n,
40  buffer *buf)
41 {
42  buffer_reserve(buf,align_as_(align,n*sizeof(uint)+size));
43  sarray_permute_(size,A,n, buf->ptr,
44  (char*)buf->ptr + align_as_(align,n*sizeof(uint)));
45 }
#define uint
Definition: types.h:70
#define sarray_permute_
Definition: sarray_sort.c:11
#define sint
Definition: types.h:69
n
Definition: xxt_test.m:73
#define sarray_permute_buf_
Definition: sarray_sort.c:12
ulong A[NUM][SI]
Definition: sort_test.c:17
#define buffer_reserve(b, max)
Definition: mem.h:157
Definition: mem.h:111
static size_t align_as_(size_t a, size_t n)
Definition: mem.h:164
for i
Definition: xxt_test.m:74
void * ptr
Definition: mem.h:111
static double work[TNR *NS]
establishes some macros to establish naming conventions