Exemplo n.º 1
0
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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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);
}