3 #define STENCIL_ORDER (6)
16 #if STENCIL_ORDER == 2
17 Scalar coefficients[] = {0, 1.0 / 2.0};
18 #elif STENCIL_ORDER == 4
19 Scalar coefficients[] = {0, 2.0 / 3.0, -1.0 / 12.0};
20 #elif STENCIL_ORDER == 6
21 Scalar coefficients[] = {0, 3.0 / 4.0, -3.0 / 20.0, 1.0 / 60.0};
22 #elif STENCIL_ORDER == 8
23 Scalar coefficients[] = {0, 4.0 / 5.0, -1.0 / 5.0, 4.0 / 105.0, -1.0 / 280.0};
26 #define MID (STENCIL_ORDER / 2)
30 for (
int i = 1; i <=
MID; ++i) {
31 res += coefficients[i] * (pencil[
MID + i] - pencil[
MID - i]);
40 #if STENCIL_ORDER == 2
41 Scalar coefficients[] = {-2.0, 1.0};
42 #elif STENCIL_ORDER == 4
43 Scalar coefficients[] = {-5.0 / 2.0, 4.0 / 3.0, -1.0 / 12.0};
44 #elif STENCIL_ORDER == 6
45 Scalar coefficients[] = {-49.0 / 18.0, 3.0 / 2.0, -3.0 / 20.0, 1.0 / 90.0};
46 #elif STENCIL_ORDER == 8
47 Scalar coefficients[] = {-205.0 / 72.0, 8.0 / 5.0, -1.0 / 5.0, 8.0 / 315.0, -1.0 / 560.0};
50 #define MID (STENCIL_ORDER / 2)
51 Scalar res = coefficients[0] * pencil[
MID];
53 for (
int i = 1; i <=
MID; ++i) {
54 res += coefficients[i] * (pencil[
MID + i] + pencil[
MID - i]);
57 return res * inv_ds * inv_ds;
63 #if STENCIL_ORDER == 2
64 Scalar coefficients[] = {0, 1.0 / 4.0};
65 #elif STENCIL_ORDER == 4
66 Scalar coefficients[] = {0, 1.0 / 32.0,
68 #elif STENCIL_ORDER == 6
70 Scalar coefficients[] = {0.0 * fac, 270.0 * fac, -27.0 * fac, 2.0 * fac};
71 #elif STENCIL_ORDER == 8
72 Scalar fac = (1.0 / 20160.0);
73 Scalar coefficients[] = {0.0 * fac, 8064.0 * fac, -1008.0 * fac, 128.0 * fac, -9.0 * fac};
76 #define MID (STENCIL_ORDER / 2)
79 for (
int i = 1; i <=
MID; ++i) {
80 res += coefficients[i] *
81 (pencil_a[
MID + i] + pencil_a[
MID - i] - pencil_b[
MID + i] - pencil_b[
MID - i]);
83 return res * inv_ds_a * inv_ds_b;
87 derx(int3 vertexIdx, in ScalarField arr)
92 pencil[offset] = arr[vertexIdx.x + offset -
STENCIL_ORDER / 2, vertexIdx.y, vertexIdx.z];
99 derxx(int3 vertexIdx, in ScalarField arr)
104 pencil[offset] = arr[vertexIdx.x + offset -
STENCIL_ORDER / 2, vertexIdx.y, vertexIdx.z];
111 derxy(int3 vertexIdx, in ScalarField arr)
116 pencil_a[offset] = arr[vertexIdx.x + offset -
STENCIL_ORDER / 2,
123 pencil_b[offset] = arr[vertexIdx.x + offset -
STENCIL_ORDER / 2,
131 derxz(int3 vertexIdx, in ScalarField arr)
136 pencil_a[offset] = arr[vertexIdx.x + offset -
STENCIL_ORDER / 2, vertexIdx.y,
142 pencil_b[offset] = arr[vertexIdx.x + offset -
STENCIL_ORDER / 2, vertexIdx.y,
150 dery(int3 vertexIdx, in ScalarField arr)
155 pencil[offset] = arr[vertexIdx.x, vertexIdx.y + offset -
STENCIL_ORDER / 2, vertexIdx.z];
162 deryy(int3 vertexIdx, in ScalarField arr)
167 pencil[offset] = arr[vertexIdx.x, vertexIdx.y + offset -
STENCIL_ORDER / 2, vertexIdx.z];
174 deryz(int3 vertexIdx, in ScalarField arr)
179 pencil_a[offset] = arr[vertexIdx.x, vertexIdx.y + offset -
STENCIL_ORDER / 2,
186 pencil_b[offset] = arr[vertexIdx.x, vertexIdx.y + offset -
STENCIL_ORDER / 2,
194 derz(int3 vertexIdx, in ScalarField arr)
199 pencil[offset] = arr[vertexIdx.x, vertexIdx.y, vertexIdx.z + offset -
STENCIL_ORDER / 2];
206 derzz(int3 vertexIdx, in ScalarField arr)
211 pencil[offset] = arr[vertexIdx.x, vertexIdx.y, vertexIdx.z + offset -
STENCIL_ORDER / 2];
220 return vertex[vertexIdx];
240 return (Vector){
derx(vertexIdx, vertex),
dery(vertexIdx, vertex),
derz(vertexIdx, vertex)};
256 mat.
row[0] = (Vector){
derxx(vertexIdx, vertex),
derxy(vertexIdx, vertex),
257 derxz(vertexIdx, vertex)};
258 mat.
row[1] = (Vector){mat.
row[0].y,
deryy(vertexIdx, vertex),
deryz(vertexIdx, vertex)};
259 mat.
row[2] = (Vector){mat.
row[0].z, mat.
row[1].z,
derzz(vertexIdx, vertex)};
330 for (
int i = 0; i < 3; ++i) {
331 res += dot(mat.
row[i], mat.
row[i]);
342 return sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);
348 return rsqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z);
355 return inv_len * vec;