(mesh, u)
| 83 | return M; |
| 84 | |
| 85 | def compute_gradient(mesh, u): |
| 86 | area = mesh.get_attribute("face_area").ravel(); |
| 87 | normal = mesh.get_attribute("face_normal").reshape((-1, 3)); |
| 88 | edges = mesh.get_attribute("edges").reshape((-1, 3, 3)); |
| 89 | grad = []; |
| 90 | |
| 91 | for fi,f in enumerate(mesh.faces): |
| 92 | A = area[fi]; |
| 93 | N = normal[fi]; |
| 94 | e0 = edges[fi, 0]; |
| 95 | e1 = edges[fi, 1]; |
| 96 | e2 = edges[fi, 2]; |
| 97 | u0 = u[f[0]]; |
| 98 | u1 = u[f[1]]; |
| 99 | u2 = u[f[2]]; |
| 100 | grad_u = (np.cross(N, e0) * u2 + |
| 101 | np.cross(N, e1) * u0 + |
| 102 | np.cross(N, e2) * u1) / (2 * A); |
| 103 | grad.append(grad_u); |
| 104 | return np.array(grad); |
| 105 | |
| 106 | def compute_divergence(mesh, X): |
| 107 | cotans = mesh.get_attribute("cotan").reshape((-1, 3)); |
no test coverage detected