std::array<Vector3D, 3> gradient3( const ConstArrayAccessor3<Vector3D>& data, const Vector3D& gridSpacing, size_t i, size_t j, size_t k) { const Size3 ds = data.size(); JET_ASSERT(i < ds.x && j < ds.y && k < ds.z); Vector3D left = data((i > 0) ? i - 1 : i, j, k); Vector3D right = data((i + 1 < ds.x) ? i + 1 : i, j, k); Vector3D down = data(i, (j > 0) ? j - 1 : j, k); Vector3D up = data(i, (j + 1 < ds.y) ? j + 1 : j, k); Vector3D back = data(i, j, (k > 0) ? k - 1 : k); Vector3D front = data(i, j, (k + 1 < ds.z) ? k + 1 : k); std::array<Vector3D, 3> result; result[0] = 0.5 * Vector3D( right.x - left.x, up.x - down.x, front.x - back.x) / gridSpacing; result[1] = 0.5 * Vector3D( right.y - left.y, up.y - down.y, front.y - back.y) / gridSpacing; result[2] = 0.5 * Vector3D( right.z - left.z, up.z - down.z, front.z - back.z) / gridSpacing; return result; }
T laplacian( const ConstArrayAccessor3<T>& data, const Array3<char>& marker, const Vector3D& gridSpacing, size_t i, size_t j, size_t k) { const T center = data(i, j, k); const Size3 ds = data.size(); JET_ASSERT(i < ds.x && j < ds.y && k < ds.z); T dleft = zero<T>(); T dright = zero<T>(); T ddown = zero<T>(); T dup = zero<T>(); T dback = zero<T>(); T dfront = zero<T>(); if (i > 0 && marker(i - 1, j, k) == kFluid) { dleft = center - data(i - 1, j, k); } if (i + 1 < ds.x && marker(i + 1, j, k) == kFluid) { dright = data(i + 1, j, k) - center; } if (j > 0 && marker(i, j - 1, k) == kFluid) { ddown = center - data(i, j - 1, k); } if (j + 1 < ds.y && marker(i, j + 1, k) == kFluid) { dup = data(i, j + 1, k) - center; } if (k > 0 && marker(i, j, k - 1) == kFluid) { dback = center - data(i, j, k - 1); } if (k + 1 < ds.z && marker(i, j, k + 1) == kFluid) { dfront = data(i, j, k + 1) - center; } return (dright - dleft) / square(gridSpacing.x) + (dup - ddown) / square(gridSpacing.y) + (dfront - dback) / square(gridSpacing.z); }
Vector3D gradient3( const ConstArrayAccessor3<double>& data, const Vector3D& gridSpacing, size_t i, size_t j, size_t k) { const Size3 ds = data.size(); JET_ASSERT(i < ds.x && j < ds.y && k < ds.z); double left = data((i > 0) ? i - 1 : i, j, k); double right = data((i + 1 < ds.x) ? i + 1 : i, j, k); double down = data(i, (j > 0) ? j - 1 : j, k); double up = data(i, (j + 1 < ds.y) ? j + 1 : j, k); double back = data(i, j, (k > 0) ? k - 1 : k); double front = data(i, j, (k + 1 < ds.z) ? k + 1 : k); return 0.5 * Vector3D(right - left, up - down, front - back) / gridSpacing; }
Vector3D laplacian3( const ConstArrayAccessor3<Vector3D>& data, const Vector3D& gridSpacing, size_t i, size_t j, size_t k) { const Vector3D center = data(i, j, k); const Size3 ds = data.size(); JET_ASSERT(i < ds.x && j < ds.y && k < ds.z); Vector3D dleft; Vector3D dright; Vector3D ddown; Vector3D dup; Vector3D dback; Vector3D dfront; if (i > 0) { dleft = center - data(i - 1, j, k); } if (i + 1 < ds.x) { dright = data(i + 1, j, k) - center; } if (j > 0) { ddown = center - data(i, j - 1, k); } if (j + 1 < ds.y) { dup = data(i, j + 1, k) - center; } if (k > 0) { dback = center - data(i, j, k - 1); } if (k + 1 < ds.z) { dfront = data(i, j, k + 1) - center; } return (dright - dleft) / square(gridSpacing.x) + (dup - ddown) / square(gridSpacing.y) + (dfront - dback) / square(gridSpacing.z); }