def test_mat_vec_mult(self): # Given n = 3 a = np.random.random((3, 3)) b = np.random.random((3, )) result = [0.0] * 3 # When mat_vec_mult(a.ravel(), b, n, result) # Then. expect = np.dot(a, b) result = np.asarray(result) np.testing.assert_allclose(result, expect)
def loop(self, d_idx, s_idx, d_sigma, s_sigma, d_au, d_av, d_aw, s_m, DWIJ): i = declare('int') sigmaij = declare('matrix(9)') res = declare('matrix(3)') for i in range(9): sigmaij[i] = d_sigma[d_idx * 9 + i] + s_sigma[s_idx * 9 + i] mat_vec_mult(sigmaij, DWIJ, 3, res) d_au[d_idx] += s_m[s_idx] * res[0] d_av[d_idx] += s_m[s_idx] * res[1] d_aw[d_idx] += s_m[s_idx] * res[2]
def loop(self, d_idx, s_idx, d_rho, s_rho, d_u, d_v, d_w, d_uhat, d_vhat, d_what, s_u, s_v, s_w, s_uhat, s_vhat, s_what, d_au, d_av, d_aw, s_m, DWIJ): rhoi = d_rho[d_idx] rhoj = s_rho[s_idx] i, j = declare('int', 2) ui, uj, uidif, ujdif, res = declare('matrix(3)', 5) Aij = declare('matrix(9)') for i in range(3): res[i] = 0.0 for j in range(3): Aij[3 * i + j] = 0.0 ui[0] = d_u[d_idx] ui[1] = d_v[d_idx] ui[2] = d_w[d_idx] uj[0] = s_u[s_idx] uj[1] = s_v[s_idx] uj[2] = s_w[s_idx] uidif[0] = d_uhat[d_idx] - d_u[d_idx] uidif[1] = d_vhat[d_idx] - d_v[d_idx] uidif[2] = d_what[d_idx] - d_w[d_idx] ujdif[0] = s_uhat[s_idx] - s_u[s_idx] ujdif[1] = s_vhat[s_idx] - s_v[s_idx] ujdif[2] = s_what[s_idx] - s_w[s_idx] for i in range(3): for j in range(3): Aij[3 * i + j] = (ui[i] * uidif[j] / rhoi + uj[i] * ujdif[j] / rhoj) mat_vec_mult(Aij, DWIJ, 3, res) d_au[d_idx] += s_m[s_idx] * res[0] d_av[d_idx] += s_m[s_idx] * res[1] d_aw[d_idx] += s_m[s_idx] * res[2]
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]