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;
}
double laplacian2(
    const ConstArrayAccessor2<double>& data,
    const Vector2D& gridSpacing,
    size_t i,
    size_t j) {
    const double center = data(i, j);
    const Size2 ds = data.size();

    JET_ASSERT(i < ds.x && j < ds.y);

    double dleft = 0.0;
    double dright = 0.0;
    double ddown = 0.0;
    double dup = 0.0;

    if (i > 0) {
        dleft = center - data(i - 1, j);
    }
    if (i + 1 < ds.x) {
        dright = data(i + 1, j) - center;
    }

    if (j > 0) {
        ddown = center - data(i, j - 1);
    }
    if (j + 1 < ds.y) {
        dup = data(i, j + 1) - center;
    }

    return (dright - dleft) / square(gridSpacing.x)
        + (dup - ddown) / square(gridSpacing.y);
}
void SphSystemData2::computeMass() {
    Array1<Vector2D> points;
    TrianglePointGenerator pointsGenerator;
    BoundingBox2D sampleBound(
        Vector2D(-1.5*_kernelRadius, -1.5*_kernelRadius),
        Vector2D(1.5*_kernelRadius, 1.5*_kernelRadius));

    pointsGenerator.generate(sampleBound, _targetSpacing, &points);

    double maxNumberDensity = 0.0;
    SphStdKernel2 kernel(_kernelRadius);

    for (size_t i = 0; i < points.size(); ++i) {
        const Vector2D& point = points[i];
        double sum = 0.0;

        for (size_t j = 0; j < points.size(); ++j) {
            const Vector2D& neighborPoint = points[j];
            sum += kernel(neighborPoint.distanceTo(point));
        }

        maxNumberDensity = std::max(maxNumberDensity, sum);
    }

    JET_ASSERT(maxNumberDensity > 0);

    double newMass = _targetDensity / maxNumberDensity;

    ParticleSystemData2::setMass(newMass);
}
Beispiel #4
0
Database::~Database()
{
    if (dbId_ != JET_dbidNil)
    {
        const JET_ERR jetErr = JetCloseDatabase(sesId_, dbId_, 0);
        JET_ASSERT(jetErr, "JetCloseDatabase");
        dbId_ = JET_dbidNil;
        sesId_ = JET_sesidNil;
    }
}
Beispiel #5
0
Table::~Table()
{
    if (tableId_ != JET_tableidNil)
    {
        const JET_ERR jetErr = JetCloseTable(sesId_, tableId_);
        JET_ASSERT(jetErr, "JetCloseTable");
        sesId_ = JET_sesidNil;
        tableId_ = JET_tableidNil;
        dbId_ = JET_dbidNil;
        tableName_.clear();
        colNames_.clear();
    }
}
Vector2D gradient2(
    const ConstArrayAccessor2<double>& data,
    const Vector2D& gridSpacing,
    size_t i,
    size_t j) {
    const Size2 ds = data.size();

    JET_ASSERT(i < ds.x && j < ds.y);

    double left = data((i > 0) ? i - 1 : i, j);
    double right = data((i + 1 < ds.x) ? i + 1 : i, j);
    double down = data(i, (j > 0) ? j - 1 : j);
    double up = data(i, (j + 1 < ds.y) ? j + 1 : j);

    return 0.5 * Vector2D(right - left, up - down) / gridSpacing;
}
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;
}
std::array<Vector2D, 2> gradient2(
    const ConstArrayAccessor2<Vector2D>& data,
    const Vector2D& gridSpacing,
    size_t i,
    size_t j) {
    const Size2 ds = data.size();

    JET_ASSERT(i < ds.x && j < ds.y);

    Vector2D left = data((i > 0) ? i - 1 : i, j);
    Vector2D right = data((i + 1 < ds.x) ? i + 1 : i, j);
    Vector2D down = data(i, (j > 0) ? j - 1 : j);
    Vector2D up = data(i, (j + 1 < ds.y) ? j + 1 : j);

    std::array<Vector2D, 2> result;
    result[0] = 0.5 * Vector2D(right.x - left.x, up.x - down.x) / gridSpacing;
    result[1] = 0.5 * Vector2D(right.y - left.y, up.y - down.y) / gridSpacing;
    return result;
}
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);
}