Пример #1
0
def test_bous_2D():
    nx = 4
    ny = nx
    nz = 1
    dim = 3
    dof1 = 5
    parameters = {
        'Reynolds Number': 1,
        'Rayleigh Number': 100,
        'Prandtl Number': 100,
        'Problem Type': 'Rayleigh-Benard'
    }
    n = nx * ny * nz * dof1

    state1 = numpy.zeros(n)
    for i in range(n):
        state1[i] = i + 1

    discretization = Discretization(parameters, nx, ny, nz, dim, dof1)
    A1 = discretization.jacobian(state1)
    rhs1 = discretization.rhs(state1)

    dim = 2
    dof2 = 4
    n = nx * ny * nz * dof2

    state2 = numpy.zeros(n)
    for i in range(n):
        state2[i] = state1[i + (i + 2) // dof2]

    discretization = Discretization(parameters, nx, ny, nz, dim, dof2)
    A2 = discretization.jacobian(state2)
    rhs2 = discretization.rhs(state2)

    for i in range(n):
        print(i)

        i1 = i + (i + 2) // dof2

        print('Expected:')
        print(A1.jcoA[A1.begA[i1]:A1.begA[i1 + 1]])
        print(A1.coA[A1.begA[i1]:A1.begA[i1 + 1]])

        print('Got:')
        print(A2.jcoA[A2.begA[i]:A2.begA[i + 1]])
        print(A2.coA[A2.begA[i]:A2.begA[i + 1]])

        assert A1.begA[i1 + 1] - A1.begA[i1] == A2.begA[i + 1] - A2.begA[i]
        for j in range(A2.begA[i + 1] - A2.begA[i]):
            j1 = A1.begA[i1] + j
            j2 = A2.begA[i] + j
            assert A1.jcoA[j1] == A2.jcoA[j2] + (A2.jcoA[j2] + 2) // dof2
            assert A1.coA[j1] == pytest.approx(A2.coA[j2])

        assert rhs2[i] == pytest.approx(rhs1[i1])
Пример #2
0
def test_ldc_bnd():
    nx = 4
    ny = nx
    nz = nx
    dim = 3
    dof = 4
    parameters = {'Reynolds Number': 100}
    n = nx * ny * nz * dof

    discretization = Discretization(parameters, nx, ny, nz, dim, dof)
    atom = discretization.linear_part()
    discretization.boundaries(atom)
    A = discretization.assemble_jacobian(atom)

    B = read_matrix('ldc_bnd_%sx%sx%s.txt' % (nx, ny, nz))

    for i in range(n):
        print(i)

        print('Expected:')
        print(B.jcoA[B.begA[i]:B.begA[i + 1]])
        print(B.coA[B.begA[i]:B.begA[i + 1]])

        print('Got:')
        print(A.jcoA[A.begA[i]:A.begA[i + 1]])
        print(A.coA[A.begA[i]:A.begA[i + 1]])

        assert B.begA[i + 1] - B.begA[i] == A.begA[i + 1] - A.begA[i]
        for j in range(B.begA[i], B.begA[i + 1]):
            assert B.jcoA[j] == A.jcoA[j]
            assert B.coA[j] == A.coA[j]
Пример #3
0
    def __init__(self,
                 parameters,
                 nx,
                 ny,
                 nz,
                 dim,
                 dof,
                 x=None,
                 y=None,
                 z=None):
        self.nx = nx
        self.ny = ny
        self.nz = nz
        self.dim = dim
        self.dof = dof
        self.discretization = Discretization(parameters, nx, ny, nz, dim, dof,
                                             x, y, z)

        self.parameters = parameters

        # Solver caching
        self._lu = None
        self._prec = None

        # Eigenvalue solver caching
        self._subspaces = None
Пример #4
0
def test_bilin_uniform():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof)
    state = create_divfree_state(discretization)

    atomJ, atomF = discretization.nonlinear_part(state)
    A = discretization.assemble_jacobian(atomF)

    for i in range(A.n):
        for j in range(A.begA[i], A.begA[i + 1]):
            assert i != A.jcoA[j]
Пример #5
0
def test_u_z():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    atom = discretization.w_z()

    for i in range(nx):
        dx = x[i] - x[i - 1]
        for j in range(ny):
            dy = y[j] - y[j - 1]
            for k in range(nz):
                print(i, j, k)
                assert atom[i, j, k, 3, 2, 1, 1, 0] == pytest.approx(-dy * dx)
                assert atom[i, j, k, 3, 2, 1, 1, 1] == pytest.approx(dy * dx)
Пример #6
0
def test_u_y():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    atom = discretization.v_y()

    for i in range(nx):
        dx = x[i] - x[i - 1]
        for j in range(ny):
            for k in range(nz):
                dz = z[k] - z[k - 1]
                print(i, j, k)
                assert atom[i, j, k, 3, 1, 1, 0, 1] == pytest.approx(-dx * dz)
                assert atom[i, j, k, 3, 1, 1, 1, 1] == pytest.approx(dx * dz)
Пример #7
0
def test_p_x():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    atom = discretization.p_x()

    for i in range(nx):
        for j in range(ny):
            dy = y[j] - y[j - 1]
            for k in range(nz):
                dz = z[k] - z[k - 1]
                print(i, j, k)
                assert atom[i, j, k, 0, 3, 1, 1, 1] == pytest.approx(-dy * dz)
                assert atom[i, j, k, 0, 3, 2, 1, 1] == pytest.approx(dy * dz)
Пример #8
0
def test_jac_consistency():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    n = dof * nx * ny * nz
    state = numpy.random.random(n)
    pert = numpy.random.random(n)

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    A = discretization.jacobian(state)
    rhs = discretization.rhs(state)

    for i in range(3, 12):
        eps = 10**-i
        eps2 = max(eps, 10**(-14 + i))
        rhs2 = discretization.rhs(state + eps * pert)
        assert numpy.linalg.norm((rhs2 - rhs) / eps - A @ pert) < eps2
Пример #9
0
def test_bilin_stretched():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    x = utils.create_stretched_coordinate_vector(0, 1, nx, 1.5)
    y = utils.create_stretched_coordinate_vector(0, 1, ny, 1.5)
    z = utils.create_stretched_coordinate_vector(0, 1, nz, 1.5)

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    state = create_divfree_state(discretization)

    atomJ, atomF = discretization.nonlinear_part(state)
    A = discretization.assemble_jacobian(atomF)

    for i in range(A.n):
        for j in range(A.begA[i], A.begA[i + 1]):
            assert i != A.jcoA[j]
Пример #10
0
def test_v_yy():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    atom = discretization.v_yy()

    for i in range(nx):
        dx = x[i] - x[i - 1]
        for j in range(ny):
            dy = y[j] - y[j - 1]
            dyp1 = y[j + 1] - y[j]
            for k in range(nz):
                dz = z[k] - z[k - 1]
                print(i, j, k)
                assert atom[i, j, k, 1, 1, 1, 0,
                            1] == pytest.approx(1 / dy * dx * dz)
                assert atom[i, j, k, 1, 1, 1, 2,
                            1] == pytest.approx(1 / dyp1 * dx * dz)
Пример #11
0
def test_w_yy():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    atom = discretization.w_yy()

    for i in range(nx):
        dx = x[i] - x[i - 1]
        for j in range(ny):
            dy = (y[j] - y[j - 2]) / 2
            dyp1 = (y[j + 1] - y[j - 1]) / 2
            for k in range(nz):
                dz = (z[k + 1] - z[k - 1]) / 2
                print(i, j, k)
                assert atom[i, j, k, 2, 2, 1, 0,
                            1] == pytest.approx(1 / dy * dz * dx)
                assert atom[i, j, k, 2, 2, 1, 2,
                            1] == pytest.approx(1 / dyp1 * dz * dx)
Пример #12
0
def test_T_zz():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    atom = discretization.T_zz()

    for i in range(nx):
        dx = x[i] - x[i - 1]
        for j in range(ny):
            dy = y[j] - y[j - 1]
            for k in range(nz):
                dz = (z[k] - z[k - 2]) / 2
                dzp1 = (z[k + 1] - z[k - 1]) / 2
                print(i, j, k)
                assert atom[i, j, k, 4, 4, 1, 1,
                            0] == pytest.approx(1 / dz * dy * dx)
                assert atom[i, j, k, 4, 4, 1, 1,
                            2] == pytest.approx(1 / dzp1 * dy * dx)
Пример #13
0
def test_T_xx():
    parameters, nx, ny, nz, dim, dof, x, y, z = create_test_problem()

    discretization = Discretization(parameters, nx, ny, nz, dim, dof, x, y, z)
    atom = discretization.T_xx()

    for i in range(nx):
        dx = (x[i] - x[i - 2]) / 2
        dxp1 = (x[i + 1] - x[i - 1]) / 2
        for j in range(ny):
            dy = y[j] - y[j - 1]
            for k in range(nz):
                dz = z[k] - z[k - 1]
                print(i, j, k)
                assert atom[i, j, k, 4, 4, 0, 1,
                            1] == pytest.approx(1 / dx * dy * dz)
                assert atom[i, j, k, 4, 4, 2, 1,
                            1] == pytest.approx(1 / dxp1 * dy * dz)
Пример #14
0
def test_bous():
    nx = 4
    ny = nx
    nz = nx
    dim = 3
    dof = 5
    parameters = {
        'Reynolds Number': 1,
        'Rayleigh Number': 100,
        'Prandtl Number': 100,
        'Problem Type': 'Rayleigh-Benard'
    }
    n = nx * ny * nz * dof

    state = numpy.zeros(n)
    for i in range(n):
        state[i] = i + 1

    discretization = Discretization(parameters, nx, ny, nz, dim, dof)
    A = discretization.jacobian(state)
    rhs = discretization.rhs(state)

    B = read_bous_matrix('bous_%sx%sx%s.txt' % (nx, ny, nz))
    rhs_B = read_bous_vector('bous_rhs_%sx%sx%s.txt' % (nx, ny, nz))

    pytest.skip('The Prandtl number is currently applied in a different place')

    for i in range(n):
        print(i)

        print('Expected:')
        print(B.jcoA[B.begA[i]:B.begA[i + 1]])
        print(B.coA[B.begA[i]:B.begA[i + 1]])

        print('Got:')
        print(A.jcoA[A.begA[i]:A.begA[i + 1]])
        print(A.coA[A.begA[i]:A.begA[i + 1]])

        assert A.begA[i + 1] - A.begA[i] == B.begA[i + 1] - B.begA[i]
        for j in range(A.begA[i], A.begA[i + 1]):
            assert A.jcoA[j] == B.jcoA[j]
            assert A.coA[j] == pytest.approx(B.coA[j])

        assert rhs_B[i] == pytest.approx(rhs[i])
Пример #15
0
def test_bous_bil():
    nx = 4
    ny = nx
    nz = nx
    dim = 3
    dof = 5
    parameters = {
        'Reynolds Number': 1,
        'Rayleigh Number': 100,
        'Prandtl Number': 100
    }
    n = nx * ny * nz * dof

    state = numpy.zeros(n)
    for i in range(n):
        state[i] = i + 1

    discretization = Discretization(parameters, nx, ny, nz, dim, dof)
    atom, atomF = discretization.nonlinear_part(state)
    A = discretization.assemble_jacobian(atom)

    B = read_bous_matrix('bous_bil_%sx%sx%s.txt' % (nx, ny, nz))

    pytest.skip('The Prandtl number is currently applied in a different place')

    for i in range(n):
        print(i)

        if i + 1 >= len(B.begA):
            break

        print('Expected:')
        print(B.jcoA[B.begA[i]:B.begA[i + 1]])
        print(B.coA[B.begA[i]:B.begA[i + 1]])

        print('Got:')
        print(A.jcoA[A.begA[i]:A.begA[i + 1]])
        print(A.coA[A.begA[i]:A.begA[i + 1]])

        assert B.begA[i + 1] - B.begA[i] == A.begA[i + 1] - A.begA[i]
        for j in range(B.begA[i], B.begA[i + 1]):
            assert B.jcoA[j] == A.jcoA[j]
            assert B.coA[j] == A.coA[j]
Пример #16
0
def test_ldc8():
    nx = 8
    ny = nx
    nz = nx
    dim = 3
    dof = 4
    parameters = {'Reynolds Number': 100}
    n = nx * ny * nz * dof

    state = numpy.zeros(n)
    for i in range(n):
        state[i] = i + 1

    discretization = Discretization(parameters, nx, ny, nz, dim, dof)
    A = discretization.jacobian(state)
    rhs = discretization.rhs(state)

    if not os.path.isfile('ldc_%sx%sx%s.txt' % (nx, ny, nz)):
        return

    B = read_matrix('ldc_%sx%sx%s.txt' % (nx, ny, nz))
    rhs_B = read_vector('ldc_rhs_%sx%sx%s.txt' % (nx, ny, nz))

    for i in range(n):
        print(i)

        print('Expected:')
        print(B.jcoA[B.begA[i]:B.begA[i + 1]])
        print(B.coA[B.begA[i]:B.begA[i + 1]])

        print('Got:')
        print(A.jcoA[A.begA[i]:A.begA[i + 1]])
        print(A.coA[A.begA[i]:A.begA[i + 1]])

        assert A.begA[i + 1] - A.begA[i] == B.begA[i + 1] - B.begA[i]
        for j in range(A.begA[i], A.begA[i + 1]):
            assert A.jcoA[j] == B.jcoA[j]
            assert A.coA[j] == pytest.approx(B.coA[j])

        assert rhs_B[i] == pytest.approx(rhs[i])
Пример #17
0
def test_bous_bnd():
    nx = 4
    ny = nx
    nz = nx
    dim = 3
    dof = 5
    parameters = {
        'Reynolds Number': 1,
        'Rayleigh Number': 100,
        'Prandtl Number': 100,
        'Problem Type': 'Rayleigh-Benard'
    }
    n = nx * ny * nz * dof

    discretization = Discretization(parameters, nx, ny, nz, dim, dof)
    atom = discretization.linear_part()
    discretization.boundaries(atom)
    A = discretization.assemble_jacobian(atom)

    B = read_bous_matrix('bous_bnd_%sx%sx%s.txt' % (nx, ny, nz))

    pytest.skip('The Prandtl number is currently applied in a different place')

    for i in range(n):
        print(i)

        print('Expected:')
        print(B.jcoA[B.begA[i]:B.begA[i + 1]])
        print(B.coA[B.begA[i]:B.begA[i + 1]])

        print('Got:')
        print(A.jcoA[A.begA[i]:A.begA[i + 1]])
        print(A.coA[A.begA[i]:A.begA[i + 1]])

        assert B.begA[i + 1] - B.begA[i] == A.begA[i + 1] - A.begA[i]
        for j in range(B.begA[i], B.begA[i + 1]):
            assert B.jcoA[j] == A.jcoA[j]
            assert B.coA[j] == pytest.approx(A.coA[j])
Пример #18
0
def test_ldc_bil():
    nx = 4
    ny = nx
    nz = nx
    dim = 3
    dof = 4
    parameters = {'Reynolds Number': 100}
    n = nx * ny * nz * dof

    state = numpy.zeros(n)
    for i in range(n):
        state[i] = i + 1

    discretization = Discretization(parameters, nx, ny, nz, dim, dof)
    atom, atomF = discretization.nonlinear_part(state)
    A = discretization.assemble_jacobian(atom)

    B = read_matrix('ldc_bil_%sx%sx%s.txt' % (nx, ny, nz))

    for i in range(n):
        print(i)

        if i + 1 >= len(B.begA):
            break

        print('Expected:')
        print(B.jcoA[B.begA[i]:B.begA[i + 1]])
        print(B.coA[B.begA[i]:B.begA[i + 1]])

        print('Got:')
        print(A.jcoA[A.begA[i]:A.begA[i + 1]])
        print(A.coA[A.begA[i]:A.begA[i + 1]])

        assert B.begA[i + 1] - B.begA[i] == A.begA[i + 1] - A.begA[i]
        for j in range(B.begA[i], B.begA[i + 1]):
            assert B.jcoA[j] == A.jcoA[j]
            assert B.coA[j] == A.coA[j]