52 lines
2.1 KiB
C++
52 lines
2.1 KiB
C++
/* Implement Mixed Gradient (Lee et al. JCP 2016)*/
|
|
|
|
extern "C" void ScaLBL_D3Q19_MixedGradient(int *Map, double *Phi,
|
|
double *Gradient, int start,
|
|
int finish, int Np, int Nx, int Ny,
|
|
int Nz) {
|
|
static int D3Q19[18][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0},
|
|
{0, 0, 1}, {0, 0, -1}, {1, 1, 0}, {-1, -1, 0},
|
|
{1, -1, 0}, {-1, 1, 0}, {1, 0, 1}, {-1, 0, -1},
|
|
{1, 0, -1}, {-1, 0, 1}, {0, 1, 1}, {0, -1, -1},
|
|
{0, 1, -1}, {0, -1, 1}};
|
|
|
|
int i, j, k, n;
|
|
int np, np2, nm; // neighbors
|
|
double v, vp, vp2, vm; // values at neighbors
|
|
double grad;
|
|
for (int idx = start; idx < finish; idx++) {
|
|
n = Map[idx]; // layout in regular array
|
|
//.......Back out the 3-D indices for node n..............
|
|
k = n / (Nx * Ny);
|
|
j = (n - Nx * Ny * k) / Nx;
|
|
i = n - Nx * Ny * k - Nx * j;
|
|
v = Phi[n];
|
|
grad = 0.0;
|
|
for (int q = 0; q < 6; q++) {
|
|
int iqx = D3Q19[q][0];
|
|
int iqy = D3Q19[q][1];
|
|
int iqz = D3Q19[q][2];
|
|
np = (k + iqz) * Nx * Ny + (j + iqy) * Nx + i + iqx;
|
|
np2 = (k + 2 * iqz) * Nx * Ny + (j + 2 * iqy) * Nx + i + 2 * iqx;
|
|
nm = (k - iqz) * Nx * Ny + (j - iqy) * Nx + i - iqx;
|
|
vp = Phi[np];
|
|
vp2 = Phi[np2];
|
|
vm = Phi[nm];
|
|
grad += 0.25 * (5.0 * vp - vp2 - 3.0 * v - vm);
|
|
}
|
|
for (int q = 6; q < 18; q++) {
|
|
int iqx = D3Q19[q][0];
|
|
int iqy = D3Q19[q][1];
|
|
int iqz = D3Q19[q][2];
|
|
np = (k + iqz) * Nx * Ny + (j + iqy) * Nx + i + iqx;
|
|
np2 = (k + 2 * iqz) * Nx * Ny + (j + 2 * iqy) * Nx + i + 2 * iqx;
|
|
nm = (k - iqz) * Nx * Ny + (j - iqy) * Nx + i - iqx;
|
|
vp = Phi[np];
|
|
vp2 = Phi[np2];
|
|
vm = Phi[nm];
|
|
grad += 0.125 * (5.0 * vp - vp2 - 3.0 * v - vm);
|
|
}
|
|
Gradient[n] = grad;
|
|
}
|
|
}
|