Exemple #1
0
    def post_loop(self, d_idx, d_gradv, d_invtt, d_divv):
        tt, invtt, idmat, gradv = declare('matrix(9)', 4)
        augtt = declare('matrix(18)')

        start_indx, row, col, rowcol, drowcol, dim = declare('int', 6)

        dim = self.dim
        start_indx = 9 * d_idx
        identity(idmat, 3)
        identity(tt, 3)

        for row in range(3):
            for col in range(3):
                rowcol = row * 3 + col
                drowcol = start_indx + rowcol
                gradv[rowcol] = d_gradv[drowcol]

        for row in range(dim):
            for col in range(dim):
                rowcol = row * 3 + col
                drowcol = start_indx + rowcol
                tt[rowcol] = d_invtt[drowcol]

        augmented_matrix(tt, idmat, 3, 3, 3, augtt)
        gj_solve(augtt, 3, 3, invtt)
        gradvls = declare('matrix(9)')
        mat_mult(gradv, invtt, 3, gradvls)

        for row in range(dim):
            d_divv[d_idx] += gradvls[row * 3 + row]
            for col in range(dim):
                rowcol = row * 3 + col
                drowcol = start_indx + rowcol
                d_gradv[drowcol] = gradvls[rowcol]
Exemple #2
0
 def loop_all(self, d_idx, d_rho, d_x, d_y, d_z, s_x, s_y, s_z, d_h, s_h,
              s_m, s_rhotmp, SPH_KERNEL, NBRS, N_NBRS):
     n, i, j, k, s_idx = declare('int', 5)
     n = 4
     amls = declare('matrix(16)')
     aug_mls = declare('matrix(20)')
     x = d_x[d_idx]
     y = d_y[d_idx]
     z = d_z[d_idx]
     xij = declare('matrix(4)')
     for i in range(n):
         for j in range(n):
             amls[n * i + j] = 0.0
     for k in range(N_NBRS):
         s_idx = NBRS[k]
         xij[0] = x - s_x[s_idx]
         xij[1] = y - s_y[s_idx]
         xij[2] = z - s_z[s_idx]
         rij = sqrt(xij[0] * xij[0] + xij[1] * xij[1] + xij[2] * xij[2])
         hij = (d_h[d_idx] + s_h[s_idx]) * 0.5
         wij = SPH_KERNEL.kernel(xij, rij, hij)
         for i in range(n):
             if i == 0:
                 fac1 = 1.0
             else:
                 fac1 = xij[i - 1]
             for j in range(n):
                 if j == 0:
                     fac2 = 1.0
                 else:
                     fac2 = xij[j - 1]
                 amls[n * i + j] += fac1 * fac2 * \
                     s_m[s_idx] * wij / s_rhotmp[s_idx]
     res = declare('matrix(4)')
     res[0] = 1.0
     res[1] = 0.0
     res[2] = 0.0
     res[3] = 0.0
     augmented_matrix(amls, res, n, 1, aug_mls)
     gj_solve(aug_mls, n, 1, res)
     b0 = res[0]
     b1 = res[1]
     b2 = res[2]
     b3 = res[3]
     d_rho[d_idx] = 0.0
     for k in range(N_NBRS):
         s_idx = NBRS[k]
         xij[0] = x - s_x[s_idx]
         xij[1] = y - s_y[s_idx]
         xij[2] = z - s_z[s_idx]
         rij = sqrt(xij[0] * xij[0] + xij[1] * xij[1] + xij[2] * xij[2])
         hij = (d_h[d_idx] + s_h[s_idx]) * 0.5
         wij = SPH_KERNEL.kernel(xij, rij, hij)
         wmls = (b0 + b1 * xij[0] + b2 * xij[1] + b3 * xij[2]) * wij
         d_rho[d_idx] += s_m[s_idx] * wmls
Exemple #3
0
 def test_augmented_matrix_with_gjsolve_with_lower_dimension(self):
     # Given
     nmax = 3
     mat = np.array([[7., 4., 2.], [8., 9., 4.], [1., 4., 10.]])
     b = np.array([5., 4., 2.])
     expect = np.linalg.solve(mat[:2, :2], b[:2])
     augmat = np.zeros((3, 4)).ravel().tolist()
     res = np.zeros(2).ravel().tolist()
     # When
     augmented_matrix(mat.ravel(), b.ravel(), 2, 1, nmax, augmat)
     gj_solve(augmat, 2, 1, res)
     # Then
     np.testing.assert_array_almost_equal(res, expect)
Exemple #4
0
 def test_augmented_matrix(self):
     # Given
     a = np.random.random((3, 3))
     b = np.random.random((3, 2))
     res = np.zeros((3, 5)).ravel().tolist()
     expect = np.zeros((3, 5))
     expect[:, :3] = a
     expect[:, 3:] = b
     # When
     augmented_matrix(a.ravel(), b.ravel(), 3, 2, 3, res)
     res = self._to_array(res, (3, 5))
     # Then
     np.testing.assert_array_almost_equal(res, expect)
Exemple #5
0
 def test_augmented_matrix_with_lower_dimension(self):
     # Given
     a = np.random.random((3, 3))
     b = np.random.random((3, 2))
     res = np.zeros((3, 5)).ravel().tolist()
     expect = np.zeros((2, 4))
     expect[:, :2] = a[:2, :2]
     expect[:, 2:] = b[:2, :]
     expect.resize((3, 5), refcheck=False)
     # When
     augmented_matrix(a.ravel(), b.ravel(), 2, 2, 3, res)
     res = self._to_array(res, (3, 5))
     # Then
     np.testing.assert_array_almost_equal(res, expect)
Exemple #6
0
    def test_inverse(self):
        # Given
        n = 3
        mat = [[1.0, 2.0, 2.5], [2.5, 1.0, 0.0], [0.0, 0.0, 1.0]]
        b = np.identity(3).ravel().tolist()
        A = np.zeros((3, 6)).ravel().tolist()
        augmented_matrix(np.ravel(mat), b, 3, 3, 3, A)
        result = np.zeros((3, 3)).ravel().tolist()

        # When
        sing = gj_solve(A, n, n, result)

        # Then
        mat = np.asarray(mat)
        res = np.asarray(result)
        res.shape = 3, 3
        np.testing.assert_allclose(res, np.linalg.inv(mat))
        self.assertAlmostEqual(sing, 0.0)
Exemple #7
0
    def post_loop(self, d_idx, d_A, d_po, d_Bp):
        a_mat = declare('matrix(16)')
        aug_mat = declare('matrix(20)')
        b_p = declare('matrix(4)')
        res_p = declare('matrix(4)')
        i, n, i16, i4 = declare('int', 4)
        i16 = 16 * d_idx
        i4 = 4 * d_idx

        for i in range(16):
            a_mat[i] = d_A[i16 + i]
        for i in range(20):
            aug_mat[i] = 0.0
        for i in range(4):
            b_p[i] = d_Bp[i4 + i]
            res_p[i] = 0.0

        n = self.dim + 1
        augmented_matrix(a_mat, b_p, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res_p)
        for i in range(4):
            d_po[i4 + i] = res_p[i]
Exemple #8
0
    def post_loop(self, d_idx, d_moment, d_prop, d_p_sph):

        a_mat = declare('matrix(16)')
        aug_mat = declare('matrix(20)')
        b = declare('matrix(4)')
        res = declare('matrix(4)')

        i, n, i16, i4 = declare('int', 4)
        i16 = 16 * d_idx
        i4 = 4 * d_idx
        for i in range(16):
            a_mat[i] = d_moment[i16 + i]
        for i in range(20):
            aug_mat[i] = 0.0
        for i in range(4):
            b[i] = d_p_sph[4 * d_idx + i]
            res[i] = 0.0

        n = self.dim + 1
        augmented_matrix(a_mat, b, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res)
        for i in range(4):
            d_prop[i4 + i] = res[i]
Exemple #9
0
    def post_loop(self, d_idx, d_A, d_uho, d_Buh, d_vho, d_Bvh, d_who, d_Bwh):
        a_mat = declare('matrix(16)')
        aug_mat = declare('matrix(20)')
        b_uh = declare('matrix(4)')
        res_uh = declare('matrix(4)')
        b_vh = declare('matrix(4)')
        res_vh = declare('matrix(4)')
        b_wh = declare('matrix(4)')
        res_wh = declare('matrix(4)')
        i, n, i16, i4 = declare('int', 4)
        i16 = 16 * d_idx
        i4 = 4 * d_idx

        for i in range(16):
            a_mat[i] = d_A[i16 + i]
        for i in range(20):
            aug_mat[i] = 0.0
        for i in range(4):
            b_uh[i] = d_Buh[i4 + i]
            res_uh[i] = 0.0
            b_vh[i] = d_Bvh[i4 + i]
            res_vh[i] = 0.0
            b_wh[i] = d_Bwh[i4 + i]
            res_wh[i] = 0.0

        n = self.dim + 1
        augmented_matrix(a_mat, b_uh, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res_uh)
        for i in range(4):
            d_uho[i4 + i] = res_uh[i]
        augmented_matrix(a_mat, b_vh, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res_vh)
        for i in range(4):
            d_vho[i4 + i] = res_vh[i]
        augmented_matrix(a_mat, b_wh, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res_wh)
        for i in range(4):
            d_who[i4 + i] = res_wh[i]
Exemple #10
0
    def post_loop(self, d_idx, d_A, d_uo, d_Bu, d_vo, d_Bv, d_wo, d_Bw):
        a_mat = declare('matrix(16)')
        aug_mat = declare('matrix(20)')
        b_u = declare('matrix(4)')
        res_u = declare('matrix(4)')
        b_v = declare('matrix(4)')
        res_v = declare('matrix(4)')
        b_w = declare('matrix(4)')
        res_w = declare('matrix(4)')
        i, n, i16, i4 = declare('int', 4)
        i16 = 16 * d_idx
        i4 = 4 * d_idx

        for i in range(16):
            a_mat[i] = d_A[i16 + i]
        for i in range(20):
            aug_mat[i] = 0.0
        for i in range(4):
            b_u[i] = d_Bu[i4 + i]
            res_u[i] = 0.0
            b_v[i] = d_Bv[i4 + i]
            res_v[i] = 0.0
            b_w[i] = d_Bw[i4 + i]
            res_w[i] = 0.0

        n = self.dim + 1
        augmented_matrix(a_mat, b_u, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res_u)
        for i in range(4):
            d_uo[i4 + i] = res_u[i]
        augmented_matrix(a_mat, b_v, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res_v)
        for i in range(4):
            d_vo[i4 + i] = res_v[i]
        augmented_matrix(a_mat, b_w, n, 1, 4, aug_mat)
        gj_solve(aug_mat, n, 1, res_w)
        for i in range(4):
            d_wo[i4 + i] = res_w[i]
Exemple #11
0
def gj_solve_helper(a, b, n):
    m = np.zeros((n, n + 1)).ravel().tolist()
    augmented_matrix(a, b, n, 1, n, m)
    result = [0.0] * n
    is_singular = gj_solve(m, n, 1, result)
    return is_singular, result
Exemple #12
0
    def loop_all(self, d_idx, d_x, d_y, d_z, d_h, s_x, s_y, s_z, s_h, s_m,
                 s_rho, SPH_KERNEL, NBRS, N_NBRS, d_ai, d_gradai, d_bi, s_V,
                 d_gradbi):
        x = d_x[d_idx]
        y = d_y[d_idx]
        z = d_z[d_idx]
        h = d_h[d_idx]
        i, j, k, s_idx, d, d2 = declare('int', 6)
        alp, bet, gam, phi, psi = declare('int', 5)
        xij = declare('matrix(3)')
        dwij = declare('matrix(3)')
        d = self.dim
        d2 = d * d

        m0 = 0.0
        m1 = declare('matrix(3)')
        m2 = declare('matrix(9)')
        temp_vec = declare('matrix(3)')
        temp_aug_m2 = declare('matrix(18)')
        m2inv = declare('matrix(9)')
        grad_m0 = declare('matrix(3)')
        grad_m1 = declare('matrix(9)')
        grad_m2 = declare('matrix(27)')
        ai = 0.0
        bi = declare('matrix(3)')
        grad_ai = declare('matrix(3)')
        grad_bi = declare('matrix(9)')

        for i in range(3):
            m1[i] = 0.0
            grad_m0[i] = 0.0
            bi[i] = 0.0
            grad_ai[i] = 0.0
            for j in range(3):
                m2[3 * i + j] = 0.0
                grad_m1[3 * i + j] = 0.0
                grad_bi[3 * i + j] = 0.0
                for k in range(3):
                    grad_m2[9 * i + 3 * j + k] = 0.0
        for i in range(N_NBRS):
            s_idx = NBRS[i]
            xij[0] = x - s_x[s_idx]
            xij[1] = y - s_y[s_idx]
            xij[2] = z - s_z[s_idx]
            hij = (h + s_h[s_idx]) * 0.5
            rij = sqrt(xij[0] * xij[0] + xij[1] * xij[1] + xij[2] * xij[2])
            wij = SPH_KERNEL.kernel(xij, rij, hij)
            SPH_KERNEL.gradient(xij, rij, hij, dwij)
            V = 1.0 / s_V[s_idx]

            m0 += V * wij
            for alp in range(d):
                m1[alp] += V * wij * xij[alp]
                for bet in range(d):
                    m2[d * alp + bet] += V * wij * xij[alp] * xij[bet]
            for gam in range(d):
                grad_m0[gam] += V * dwij[gam]
                for alp in range(d):
                    fac = 1.0 if alp == gam else 0.0
                    temp = (xij[alp] * dwij[gam] + fac * wij)
                    grad_m1[d * gam + alp] += V * temp
                    for bet in range(d):
                        fac2 = 1.0 if bet == gam else 0.0
                        temp = xij[alp] * fac2 + xij[bet] * fac
                        temp2 = (xij[alp] * xij[bet] * dwij[gam] + temp * wij)
                        grad_m2[d2 * gam + d * alp + bet] += V * temp2

        identity(m2inv, d)
        augmented_matrix(m2, m2inv, d, d, d, temp_aug_m2)

        # If is_singular > 0 then matrix was singular
        is_singular = gj_solve(temp_aug_m2, d, d, m2inv)

        if is_singular > 0.0:
            # Cannot do much if the matrix is singular.  Perhaps later
            # we can tag such particles to see if the user can do something.
            pass
        else:
            mat_vec_mult(m2inv, m1, d, temp_vec)

            # Eq. 12.
            ai = 1.0 / (m0 - dot(temp_vec, m1, d))
            # Eq. 13.
            mat_vec_mult(m2inv, m1, d, bi)
            for gam in range(d):
                bi[gam] = -bi[gam]

            # Eq. 14. and 15.
            for gam in range(d):
                temp1 = grad_m0[gam]
                for alp in range(d):
                    temp2 = 0.0
                    for bet in range(d):
                        temp1 -= m2inv[d * alp + bet] * (
                            m1[bet] * grad_m1[d * gam + alp] +
                            m1[alp] * grad_m1[d * gam + bet])
                        temp2 -= (m2inv[d * alp + bet] *
                                  grad_m1[d * gam + bet])
                        for phi in range(d):
                            for psi in range(d):
                                temp1 += (m2inv[d * alp + phi] *
                                          m2inv[d * psi + bet] *
                                          grad_m2[d2 * gam + d * phi + psi] *
                                          m1[bet] * m1[alp])
                                temp2 += (m2inv[d * alp + phi] *
                                          m2inv[d * psi + bet] *
                                          grad_m2[d2 * gam + d * phi + psi] *
                                          m1[bet])
                    grad_bi[d * gam + alp] = temp2
                grad_ai[gam] = -ai * ai * temp1

        if N_NBRS < 2 or is_singular > 0.0:
            d_ai[d_idx] = 1.0
            for i in range(d):
                d_gradai[d * d_idx + i] = 0.0
                d_bi[d * d_idx + i] = 0.0
                for j in range(d):
                    d_gradbi[d2 * d_idx + d * i + j] = 0.0
        else:
            d_ai[d_idx] = ai
            for i in range(d):
                d_gradai[d * d_idx + i] = grad_ai[i]
                d_bi[d * d_idx + i] = bi[i]
                for j in range(d):
                    d_gradbi[d2 * d_idx + d * i + j] = grad_bi[d * i + j]
Exemple #13
0
    def post_loop(self, d_idx, d_gradv, d_invtt, d_divv, d_grada, d_adivv,
                  d_ss, d_trssdsst):
        tt = declare('matrix(9)')
        invtt = declare('matrix(9)')
        augtt = declare('matrix(18)')
        idmat = declare('matrix(9)')
        gradv = declare('matrix(9)')
        grada = declare('matrix(9)')

        start_indx, row, col, rowcol, drowcol, dim, colrow = declare('int', 7)
        ltstart_indx, dltrowcol = declare('int', 2)
        dim = self.dim
        start_indx = 9 * d_idx
        identity(idmat, 3)
        identity(tt, 3)

        for row in range(3):
            for col in range(3):
                rowcol = row * 3 + col
                drowcol = start_indx + rowcol
                gradv[rowcol] = d_gradv[drowcol]
                grada[rowcol] = d_grada[drowcol]

        for row in range(dim):
            for col in range(dim):
                rowcol = row * 3 + col
                drowcol = start_indx + rowcol
                tt[rowcol] = d_invtt[drowcol]

        augmented_matrix(tt, idmat, 3, 3, 3, augtt)
        gj_solve(augtt, 3, 3, invtt)
        gradvls = declare('matrix(9)')
        gradals = declare('matrix(9)')
        mat_mult(gradv, invtt, 3, gradvls)
        mat_mult(grada, invtt, 3, gradals)

        for row in range(dim):
            d_divv[d_idx] += gradvls[row * 3 + row]
            d_adivv[d_idx] += gradals[row * 3 + row]
            for col in range(dim):
                rowcol = row * 3 + col
                colrow = row + col * 3
                drowcol = start_indx + rowcol
                d_gradv[drowcol] = gradvls[rowcol]
                d_grada[drowcol] = gradals[rowcol]
                d_adivv[d_idx] -= gradals[rowcol] * gradals[colrow]

        # Traceless Symmetric Strain Rate
        divvbydim = d_divv[d_idx] / dim
        start_indx = d_idx * 9
        ltstart_indx = d_idx * 6
        for row in range(dim):
            col = row
            rowcol = start_indx + row * 3 + col
            dltrowcol = ltstart_indx + (row * (row + 1)) / 2 + col
            d_ss[dltrowcol] = d_gradv[rowcol] - divvbydim

        for row in range(1, dim):
            for col in range(row):
                rowcol = row * 3 + col
                colrow = row + col * 3
                dltrowcol = ltstart_indx + (row * (row + 1)) / 2 + col
                d_ss[dltrowcol] = 0.5 * (gradvls[rowcol] + gradvls[colrow])

        # Trace ( S dot transpose(S) )
        for row in range(dim):
            for col in range(dim):
                dltrowcol = ltstart_indx + (row * (row + 1)) / 2 + col
                d_trssdsst[d_idx] += d_ss[dltrowcol] * d_ss[dltrowcol]