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]
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
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)
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)
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)
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)
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]
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]
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]
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]
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
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]
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]