Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
rand_elt_test.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <math.h>
3 #include "c99.h"
4 #include "types.h"
5 #include "name.h"
6 #include "poly.h"
7 #include "lob_bnd.h"
8 
9 static double det_2(const double A[4]) { return A[0]*A[3]-A[1]*A[2]; }
10 
11 static double quad_2(const double x0, const double g[2], const double H[3],
12  const double r[2])
13 {
14  return x0 + (g[0]*r[0]+g[1]*r[1])
15  + ( r[0] * (H[0]*r[0]+H[1]*r[1])
16  + r[1] * (H[1]*r[0]+H[2]*r[1]) )/2;
17 }
18 
19 static void quad_2_grad(double grad[2], const double g[2], const double H[3],
20  const double r[2])
21 {
22  grad[0] = g[0] + (H[0]*r[0]+H[1]*r[1]);
23  grad[1] = g[1] + (H[1]*r[0]+H[2]*r[1]);
24 }
25 
26 static double quad_2_jac(const double g[4], const double H[6],
27  const double r[2])
28 {
29  double J[4];
30  quad_2_grad(J ,g ,H ,r);
31  quad_2_grad(J+2,g+2,H+3,r);
32  return det_2(J);
33 }
34 
35 static double det_3(const double A[9])
36 {
37  const double a = A[4]*A[8]-A[5]*A[7],
38  b = A[5]*A[6]-A[3]*A[8],
39  c = A[3]*A[7]-A[4]*A[6];
40  return A[0]*a+A[1]*b+A[2]*c;
41 }
42 
43 static double quad_3(const double x0, const double g[3], const double H[6],
44  const double r[3])
45 {
46  return x0 + (g[0]*r[0]+g[1]*r[1]+g[2]*r[2])
47  + ( r[0] * (H[0]*r[0]+H[1]*r[1]+H[2]*r[2])
48  + r[1] * (H[1]*r[0]+H[3]*r[1]+H[4]*r[2])
49  + r[2] * (H[2]*r[0]+H[4]*r[1]+H[5]*r[2]) )/2;
50 }
51 
52 static void quad_3_grad(double grad[3], const double g[3], const double H[6],
53  const double r[3])
54 {
55  grad[0] = g[0] + (H[0]*r[0]+H[1]*r[1]+H[2]*r[2]);
56  grad[1] = g[1] + (H[1]*r[0]+H[3]*r[1]+H[4]*r[2]);
57  grad[2] = g[2] + (H[2]*r[0]+H[4]*r[1]+H[5]*r[2]);
58 }
59 
60 static double quad_3_jac(const double g[9], const double H[18],
61  const double r[3])
62 {
63  double J[9];
64  quad_3_grad(J ,g ,H ,r);
65  quad_3_grad(J+3,g+3,H+ 6,r);
66  quad_3_grad(J+6,g+6,H+12,r);
67  return det_3(J);
68 }
69 
70 void rand_elt_2(double *x, double *y,
71  const double *zr, unsigned nr,
72  const double *zs, unsigned ns)
73 {
74  static int init=0;
75  static double z4[4], lob_bnd_data[16+3*4*(2*16+1)],
76  work[2*16*(4+16+1)];
77  unsigned i,j;
78  double x0[2], g[4], H[6], jac[4*4], r[2];
79  struct dbl_range jr;
80  if(!init) {
81  init=1;
82  lobatto_nodes(z4,4);
83  lob_bnd_setup(lob_bnd_data,4,16);
84  }
85  do {
86  for(i=0;i<4;++i) g[i] = -1+2*(rand()/(double)RAND_MAX);
87  for(i=0;i<6;++i) H[i] =.5*(-1+2*(rand()/(double)RAND_MAX));
88  for(j=0;j<4;++j) { r[1] = z4[j];
89  for(i=0;i<4;++i) { r[0] = z4[i];
90  jac[j*4+i] = quad_2_jac(g,H,r);
91  }
92  }
93  jr = lob_bnd_2(lob_bnd_data,4,16, lob_bnd_data,4,16, jac, work);
94  /*printf("Jacobian range %g, %g\n", jr.min, jr.max);*/
95  } while(jr.max*jr.min<=0);
96  for(i=0;i< 2;++i) x0[i] = -1+2*(rand()/(double)RAND_MAX);
97  for(j=0;j<ns;++j) { r[1] = zs[j];
98  for(i=0;i<nr;++i) { r[0] = zr[i];
99  x[j*nr+i] = quad_2(x0[0],g ,H ,r);
100  y[j*nr+i] = quad_2(x0[1],g+2,H+3,r);
101  }
102  }
103 }
104 
105 void rand_elt_3(double *x, double *y, double *z,
106  const double *zr, unsigned nr,
107  const double *zs, unsigned ns,
108  const double *zt, unsigned nt)
109 {
110  static int init=0;
111  static double z4[4], lob_bnd_data[16+3*4*(2*16+1)],
112  work[2*16*16*(4+16+1)];
113  unsigned i,j,k;
114  double x0[3], g[9], H[18], jac[4*4*4], r[3];
115  struct dbl_range jr;
116  if(!init) {
117  init=1;
118  lobatto_nodes(z4,4);
119  lob_bnd_setup(lob_bnd_data,4,16);
120  }
121  do {
122  for(i=0;i< 9;++i) g[i] = -1+2*(rand()/(double)RAND_MAX);
123  for(i=0;i<18;++i) H[i] =.5*(-1+2*(rand()/(double)RAND_MAX));
124  for(k=0;k<4;++k) { r[2] = z4[k];
125  for(j=0;j<4;++j) { r[1] = z4[j];
126  for(i=0;i<4;++i) { r[0] = z4[i];
127  jac[(k*4+j)*4+i] = quad_3_jac(g,H,r);
128  }
129  }
130  }
131  jr = lob_bnd_3(lob_bnd_data,4,16, lob_bnd_data,4,16, lob_bnd_data,4,16,
132  jac, work);
133  /*printf("Jacobian range %g, %g\n", jr.min, jr.max);*/
134  } while(jr.max*jr.min<=0);
135  for(i=0;i< 3;++i) x0[i] = -1+2*(rand()/(double)RAND_MAX);
136  for(k=0;k<nt;++k) { r[2] = zt[k];
137  for(j=0;j<ns;++j) { r[1] = zs[j];
138  for(i=0;i<nr;++i) { r[0] = zr[i];
139  x[(k*ns+j)*nr+i] = quad_3(x0[0],g ,H ,r);
140  y[(k*ns+j)*nr+i] = quad_3(x0[1],g+3,H+ 6,r);
141  z[(k*ns+j)*nr+i] = quad_3(x0[2],g+6,H+12,r);
142  }
143  }
144  }
145 }
146 
147 #define PI 3.1415926535897932384626433832795028841971693993751058209749445923
148 
149 void bubble_elt(double *x, double *y, double *z,
150  const double *zr, unsigned nr,
151  const double *zs, unsigned ns,
152  const double *zt, unsigned nt, int type)
153 {
154  unsigned i,j,k;
155  for(k=0;k<nt;++k) for(j=0;j<ns;++j) for(i=0;i<nr;++i) {
156  double dx=0,dy=0,dz=0;
157  switch(type) {
158  case 0: dx = cos(PI*zs[j]/2)*cos(PI*zt[k]/2); break;
159  case 1: dx = -cos(PI*zs[j]/2)*cos(PI*zt[k]/2); break;
160  case 2: dy = cos(PI*zt[k]/2)*cos(PI*zr[i]/2); break;
161  case 3: dy = -cos(PI*zt[k]/2)*cos(PI*zr[i]/2); break;
162  case 4: dz = cos(PI*zr[i]/2)*cos(PI*zs[j]/2); break;
163  case 5: dz = -cos(PI*zr[i]/2)*cos(PI*zs[j]/2); break;
164  }
165  x[(k*ns+j)*nr+i] = zr[i] + dx;
166  y[(k*ns+j)*nr+i] = zs[j] + dy;
167  z[(k*ns+j)*nr+i] = zt[k] + dz;
168  }
169 }
static double quad_2_jac(const double g[4], const double H[6], const double r[2])
Definition: rand_elt_test.c:26
static double zt[NT]
static void quad_3_grad(double grad[3], const double g[3], const double H[6], const double r[3])
Definition: rand_elt_test.c:52
static double det_2(const double A[4])
Definition: rand_elt_test.c:9
#define lob_bnd_3
Definition: lob_bnd.c:19
double max
Definition: lob_bnd.c:21
static double zr[NR]
#define PI
void rand_elt_3(double *x, double *y, double *z, const double *zr, unsigned nr, const double *zs, unsigned ns, const double *zt, unsigned nt)
#define x
ulong A[NUM][SI]
Definition: sort_test.c:17
ns
Definition: xxt_test.m:43
void rand_elt_2(double *x, double *y, const double *zr, unsigned nr, const double *zs, unsigned ns)
Definition: rand_elt_test.c:70
static double quad_2(const double x0, const double g[2], const double H[3], const double r[2])
Definition: rand_elt_test.c:11
void bubble_elt(double *x, double *y, double *z, const double *zr, unsigned nr, const double *zs, unsigned ns, const double *zt, unsigned nt, int type)
static void quad_2_grad(double grad[2], const double g[2], const double H[3], const double r[2])
Definition: rand_elt_test.c:19
static double zs[NS]
static double quad_3_jac(const double g[9], const double H[18], const double r[3])
Definition: rand_elt_test.c:60
#define lob_bnd_2
Definition: lob_bnd.c:18
for i
Definition: xxt_test.m:74
double min
Definition: lob_bnd.c:21
static const unsigned nr[3]
#define lob_bnd_setup
Definition: lob_bnd.c:13
static double work[TNR *NS]
static double quad_3(const double x0, const double g[3], const double H[6], const double r[3])
Definition: rand_elt_test.c:43
#define lobatto_nodes
Definition: poly.c:15
static double det_3(const double A[9])
Definition: rand_elt_test.c:35
establishes some macros to establish naming conventions
static double y[NR *NS *NT *N]
Definition: obbox_test.c:31
static double z[NR *NS *NT *N]
Definition: obbox_test.c:31