def test_curl_curl(U, x): curl_curl_u = spherical_curl(*spherical_curl(*U, *x), *x) grad_div_u = spherical_grad(spherical_div(*U, *x), *x) vec_lap_u = spherical_vector_laplacian(*U, *x) vec_delta = [ cc - (gd - vl) for cc, gd, vl in zip(curl_curl_u, grad_div_u, vec_lap_u) ] assert is_zero(vec_delta), vec_delta
def test_div_curl(U, x): curl_u = spherical_curl(*U, *x) div_curl_u = spherical_div(*curl_u, *x) assert is_zero(div_curl_u), div_curl_u
def test_div_grad(u, x): grad_u = spherical_grad(u, *x) div_grad_u = spherical_div(*grad_u, *x) lap_u = spherical_laplacian(u, *x) delta = div_grad_u - lap_u assert is_zero(delta), delta
r_max = 1.0 generator = GeneratorSpherical(n_points, r_min=r_min, r_max=r_max) r, theta, phi = [t.reshape(-1, 1) for t in generator.get_examples()] degrees = list(range(10)) harmoincs_fn = ZonalSphericalHarmonics(degrees=degrees) F_r, F_theta, F_phi = [HarmonicsNN(degrees, harmoincs_fn) for _ in range(3)] vector_u = (F_r(r, theta, phi), F_theta(r, theta, phi), F_phi(r, theta, phi)) f = HarmonicsNN(degrees, harmoincs_fn) scalar_u = f(r, theta, phi) curl = lambda a, b, c: spherical_curl(a, b, c, r, theta, phi) grad = lambda a: spherical_grad(a, r, theta, phi) div = lambda a, b, c: spherical_div(a, b, c, r, theta, phi) lap = lambda a: spherical_laplacian(a, r, theta, phi) vec_lap = lambda a, b, c: spherical_vector_laplacian(a, b, c, r, theta, phi) def is_zero(t): if isinstance(t, (tuple, list)): for i in t: if not is_zero(i): return False return True elif isinstance(t, torch.Tensor): return t.detach().cpu().max() < EPS else: raise ValueError(f"t must be list, tuple or tensor; got {type(t)}")