def test_grid3():
    global cnt

    a = pyjet.CellCenteredScalarGrid3(resolution=(3, 4, 5),
                                      gridSpacing=(1, 2, 3),
                                      gridOrigin=(7, 5, 3))

    assert a.resolution == (3, 4, 5)
    assert_vector_similar(a.origin, (7, 5, 3))
    assert_vector_similar(a.gridSpacing, (1, 2, 3))
    assert_bounding_box_similar(
        a.boundingBox, pyjet.BoundingBox3D((7, 5, 3), (10, 13, 18)))
    f = a.cellCenterPosition
    assert_vector_similar(f(0, 0, 0), (7.5, 6, 4.5))

    b = pyjet.CellCenteredScalarGrid3(resolution=(3, 4, 5),
                                      gridSpacing=(1, 2, 3),
                                      gridOrigin=(7, 5, 3))
    assert a.hasSameShape(b)

    def func(i, j, k):
        global cnt
        assert i >= 0 and i < 3
        assert j >= 0 and j < 4
        assert k >= 0 and k < 5
        cnt += 1
    cnt = 0
    a.forEachCellIndex(func)
    assert cnt == 60
def test_cell_centered_scalar_grid3():
    # CTOR
    a = pyjet.CellCenteredScalarGrid3()
    assert a.resolution == (1, 1, 1)
    assert_vector_similar(a.origin, (0.0, 0.0, 0.0))
    assert_vector_similar(a.gridSpacing, (1.0, 1.0, 1.0))

    a = pyjet.CellCenteredScalarGrid3((3, 4, 5), (1, 2, 3), (7, 5, 2))
    assert a.resolution == (3, 4, 5)
    assert_vector_similar(a.origin, (7, 5, 2))
    assert_vector_similar(a.gridSpacing, (1, 2, 3))

    a = pyjet.CellCenteredScalarGrid3(resolution=(3, 4, 5),
                                      gridSpacing=(1, 2, 3),
                                      gridOrigin=(7, 5, 2))
    assert a.resolution == (3, 4, 5)
    assert_vector_similar(a.origin, (7, 5, 2))
    assert_vector_similar(a.gridSpacing, (1, 2, 3))

    a = pyjet.CellCenteredScalarGrid3(resolution=(3, 4, 5),
                                      domainSizeX=12.0,
                                      gridOrigin=(7, 5, 2))
    assert a.resolution == (3, 4, 5)
    assert_vector_similar(a.origin, (7, 5, 2))
    assert_vector_similar(a.gridSpacing, (4, 4, 4))

    # Properties
    a = pyjet.CellCenteredScalarGrid3(resolution=(3, 4, 5),
                                      gridSpacing=(1, 2, 3),
                                      gridOrigin=(7, 5, 2))
    assert_vector_similar(a.dataSize, (3, 4, 5))
    assert_vector_similar(a.dataOrigin, (7.5, 6, 3.5))

    # Modifiers
    b = pyjet.CellCenteredScalarGrid3(resolution=(6, 3, 7),
                                      gridSpacing=(5, 9, 3),
                                      gridOrigin=(1, 2, 8))
    a.fill(42.0)
    for k in range(a.resolution.z):
        for j in range(a.resolution.y):
            for i in range(a.resolution.x):
                assert a[i, j, k] == 42.0

    a.swap(b)
    assert a.resolution == (6, 3, 7)
    assert_vector_similar(a.origin, (1, 2, 8))
    assert_vector_similar(a.gridSpacing, (5, 9, 3))
    assert b.resolution == (3, 4, 5)
    assert_vector_similar(b.origin, (7, 5, 2))
    assert_vector_similar(b.gridSpacing, (1, 2, 3))
    for k in range(a.resolution.z):
        for j in range(a.resolution.y):
            for i in range(a.resolution.x):
                assert a[i, j, k] == 0.0
    for k in range(b.resolution.z):
        for j in range(b.resolution.y):
            for i in range(b.resolution.x):
                assert b[i, j, k] == 42.0

    a.set(b)
    assert a.resolution == (3, 4, 5)
    assert_vector_similar(a.origin, (7, 5, 2))
    assert_vector_similar(a.gridSpacing, (1, 2, 3))
    for k in range(a.resolution.z):
        for j in range(a.resolution.y):
            for i in range(a.resolution.x):
                assert a[i, j, k] == 42.0

    c = a.clone()
    assert c.resolution == (3, 4, 5)
    assert_vector_similar(c.origin, (7, 5, 2))
    assert_vector_similar(c.gridSpacing, (1, 2, 3))
    for k in range(c.resolution.z):
        for j in range(c.resolution.y):
            for i in range(c.resolution.x):
                assert c[i, j, k] == 42.0
def test_scalar_grid3():
    global cnt
    a = pyjet.CellCenteredScalarGrid3(resolution=(3, 4, 5),
                                      gridSpacing=(1, 2, 3),
                                      gridOrigin=(7, 5, 3))

    a.resize(resolution=(12, 7, 2),
             gridSpacing=(3, 4, 5),
             gridOrigin=(9, 2, 5))
    assert a.resolution == (12, 7, 2)
    assert_vector_similar(a.origin, (9, 2, 5))
    assert_vector_similar(a.gridSpacing, (3, 4, 5))

    for k in range(a.resolution.z):
        for j in range(a.resolution.y):
            for i in range(a.resolution.x):
                assert a[i, j, k] == 0.0

    a[5, 6, 1] = 17.0
    assert a[5, 6, 1] == 17.0

    a.fill(42.0)
    for k in range(a.resolution.z):
        for j in range(a.resolution.y):
            for i in range(a.resolution.x):
                assert a[i, j, k] == 42.0

    def func(pt):
        return pt.x ** 2 + pt.y ** 2 + pt.z ** 2

    a.fill(func)
    pos = a.dataPosition()
    acc = np.array(a.dataAccessor(), copy=False)
    for k in range(a.resolution.z):
        for j in range(a.resolution.y):
            for i in range(a.resolution.x):
                pt = pos(i, j, k)
                assert func(pt) == a[i, j, k]
                assert func(pt) == approx(a.sample(pt))
                assert acc[k, j, i] == a[i, j, k]
                # Can't compare to analytic solution because FDM with such a
                # coarse grid will return inaccurate results by design.
                assert_vector_similar(
                    a.gradientAtDataPoint(i, j, k), a.gradient(pt))
                assert a.laplacianAtDataPoint(i, j, k) == a.laplacian(pt)

    def func(i, j, k):
        global cnt
        assert i >= 0 and i < a.resolution.x
        assert j >= 0 and j < a.resolution.y
        assert k >= 0 and k < a.resolution.z
        cnt += 1
    cnt = 0
    a.forEachDataPointIndex(func)
    assert cnt == a.resolution.x * a.resolution.y * a.resolution.z

    blob = a.serialize()
    b = pyjet.CellCenteredScalarGrid3()
    b.deserialize(blob)
    assert b.resolution == (12, 7, 2)
    assert_vector_similar(b.origin, (9, 2, 5))
    assert_vector_similar(b.gridSpacing, (3, 4, 5))
    for k in range(a.resolution.z):
        for j in range(a.resolution.y):
            for i in range(a.resolution.x):
                assert a[i, j, k] == b[i, j, k]