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
Exemple #4
0
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)}")