Пример #1
0
def test_to_ortho(basis, quad):
    N = 10
    if basis.family() == 'legendre':
        B1 = lBasis[0](N, quad)
        #B3 = lBasis[0](N, quad)
    elif basis.family() == 'chebyshev':
        if basis.short_name() == 'DU':
            B1 = cBasisGC[0](N, quad)
        else:
            B1 = cBasis[0](N, quad)
        #B3 = cBasis[0](N, quad)
    elif basis.family() == 'laguerre':
        B1 = laBasis[0](N, quad)
        #B3 = laBasis[0](N, quad)

    B0 = basis(N, quad=quad)
    a = shenfun.Array(B0)
    a_hat = shenfun.Function(B0)
    b0_hat = shenfun.Function(B1)
    b1_hat = shenfun.Function(B1)
    a[:] = np.random.random(a.shape)
    a_hat = a.forward(a_hat)
    b0_hat = shenfun.project(a_hat, B1, output_array=b0_hat, fill=False,  use_to_ortho=True)
    b1_hat = shenfun.project(a_hat, B1, output_array=b1_hat, fill=False,  use_to_ortho=False)
    assert np.linalg.norm(b0_hat-b1_hat) < 1e-10

    #B2 = basis(N, quad=quad)
    TD = shenfun.TensorProductSpace(shenfun.comm, (B0, B0))
    TC = shenfun.TensorProductSpace(shenfun.comm, (B1, B1))
    a = shenfun.Array(TD)
    a_hat = shenfun.Function(TD)
    b0_hat = shenfun.Function(TC)
    b1_hat = shenfun.Function(TC)
    a[:] = np.random.random(a.shape)
    a_hat = a.forward(a_hat)
    b0_hat = shenfun.project(a_hat, TC, output_array=b0_hat, fill=False, use_to_ortho=True)
    b1_hat = shenfun.project(a_hat, TC, output_array=b1_hat, fill=False, use_to_ortho=False)
    assert np.linalg.norm(b0_hat-b1_hat) < 1e-10

    F0 = shenfun.FunctionSpace(N, 'F')
    TD = shenfun.TensorProductSpace(shenfun.comm, (B0, F0))
    TC = shenfun.TensorProductSpace(shenfun.comm, (B1, F0))
    a = shenfun.Array(TD)
    a_hat = shenfun.Function(TD)
    b0_hat = shenfun.Function(TC)
    b1_hat = shenfun.Function(TC)
    a[:] = np.random.random(a.shape)
    a_hat = a.forward(a_hat)
    b0_hat = shenfun.project(a_hat, TC, output_array=b0_hat, fill=False, use_to_ortho=True)
    b1_hat = shenfun.project(a_hat, TC, output_array=b1_hat, fill=False, use_to_ortho=False)
    assert np.linalg.norm(b0_hat-b1_hat) < 1e-10
Пример #2
0
def test_helmholtz2D(family, axis):
    la = lla
    if family == 'chebyshev':
        la = cla
    N = (8, 9)
    SD = shenfun.Basis(N[axis], family=family, bc=(0, 0))
    K1 = shenfun.Basis(N[(axis + 1) % 2], family='F', dtype='d')
    subcomms = mpi4py_fft.pencil.Subcomm(MPI.COMM_WORLD, allaxes2D[axis])
    bases = [K1]
    bases.insert(axis, SD)
    T = shenfun.TensorProductSpace(subcomms, bases, axes=allaxes2D[axis])
    u = shenfun.TrialFunction(T)
    v = shenfun.TestFunction(T)
    if family == 'chebyshev':
        mat = shenfun.inner(v, shenfun.div(shenfun.grad(u)))
    else:
        mat = shenfun.inner(shenfun.grad(v), shenfun.grad(u))

    H = la.Helmholtz(*mat)
    H = la.Helmholtz(*mat)
    u = shenfun.Function(T)
    u[:] = np.random.random(u.shape) + 1j * np.random.random(u.shape)
    f = shenfun.Function(T)
    f = H.matvec(u, f)
    f = H.matvec(u, f)

    g0 = shenfun.Function(T)
    g1 = shenfun.Function(T)
    M = {d.get_key(): d for d in mat}
    g0 = M['ADDmat'].matvec(u, g0)
    g1 = M['BDDmat'].matvec(u, g1)

    assert np.linalg.norm(f - (g0 + g1)) < 1e-12, np.linalg.norm(f - (g0 + g1))
Пример #3
0
def test_tensor2():
    B0 = shenfun.FunctionSpace(8, 'C')
    T = shenfun.TensorProductSpace(comm, (B0, B0))
    x, y = sp.symbols('x,y')
    ue = x**2 + y**2
    ua = shenfun.Array(T, buffer=ue)
    uh = ua.forward()
    M = shenfun.VectorSpace(T)
    gradu = shenfun.project(grad(uh), M)
Пример #4
0
def test_transforms(ST, quad):
    N = 10
    kwargs = {}
    if not ST.family() == 'fourier':
        kwargs['quad'] = quad
    ST0 = ST(N, **kwargs)
    fj = shenfun.Array(ST0)
    fj[:] = np.random.random(N)
    fj = fj.forward().backward().copy()
    assert np.allclose(fj, fj.forward().backward())
    u0 = shenfun.Function(ST0)
    u1 = shenfun.Array(ST0)
    u0 = ST0.forward(fj, u0, fast_transform=False)
    u1 = ST0.backward(u0, u1, fast_transform=False)
    assert np.allclose(fj, u1, rtol=1e-5, atol=1e-6)

    # Multidimensional version
    ST0 = ST(N, **kwargs)
    if ST0.short_name() in ('R2C', 'C2C'):
        F0 = shenfun.FunctionSpace(N, 'F', dtype='D')
        T0 = shenfun.TensorProductSpace(shenfun.comm, (F0, ST0))

    else:
        F0 = shenfun.FunctionSpace(N, 'F', dtype='d')
        T0 = shenfun.TensorProductSpace(shenfun.comm, (F0, ST0))
    fij = shenfun.Array(T0)
    fij[:] = np.random.random(T0.shape(False))
    fij = fij.forward().backward().copy()
    assert np.allclose(fij, fij.forward().backward())

    if ST0.short_name() in ('R2C', 'C2C'):
        F0 = shenfun.FunctionSpace(N, 'F', dtype='D')
        F1 = shenfun.FunctionSpace(N, 'F', dtype='D')
        T = shenfun.TensorProductSpace(shenfun.comm, (F0, F1, ST0), dtype=ST0.dtype.char)

    else:
        F0 = shenfun.FunctionSpace(N, 'F', dtype='d')
        F1 = shenfun.FunctionSpace(N, ST.family())
        T = shenfun.TensorProductSpace(shenfun.comm, (F0, ST0, F1))

    fij = shenfun.Array(T)
    fij[:] = np.random.random(T.shape(False))
    fij = fij.forward().backward().copy()
    assert np.allclose(fij, fij.forward().backward())
Пример #5
0
def test_tensor2():
    B0 = shenfun.FunctionSpace(8, 'C')
    T = shenfun.TensorProductSpace(comm, (B0, B0))
    x, y = sp.symbols('x,y')
    ue = x**2 + y**2
    ua = shenfun.Array(T, buffer=ue)
    uh = ua.forward()
    M = shenfun.VectorSpace(T)
    gradu = shenfun.project(grad(uh), M)
    V = shenfun.TensorSpace(T)
    gradgradu = shenfun.project(grad(grad(uh)), V)
    g = gradgradu.backward()
    assert np.allclose(g.v[0], 2)
    assert np.allclose(g.v[1], 0)
    assert np.allclose(g.v[2], 0)
    assert np.allclose(g.v[3], 2)
Пример #6
0
    def _setup_function_space(self):
        self._nonhomogeneous_bcs = False
        self._function_spaces = []
        vec_space = []
        for i in range(self._dim):
            tens_space = []
            for j in range(self._dim):
                basis = sf.FunctionSpace(self._N[j],
                                         family='legendre',
                                         bc=self._bcs[i][j],
                                         domain=tuple(self._domain[j]))
                if basis.has_nonhomogeneous_bcs:
                    self._nonhomogeneous_bcs = True
                tens_space.append(basis)
            self._function_spaces.append(tens_space)
            vec_space.append(sf.TensorProductSpace(comm, tuple(tens_space)))

        self._V = sf.VectorSpace(vec_space)
    def get_dimensional_solution(self):
        assert hasattr(self, "_solution")
        vec_space = list()
        for i in range(self._dim):
            tens_space = []
            for j in range(self._dim):
                basis = sf.FunctionSpace(self._N[j], family='legendre',
                                         bc=self._bcs[i][j],
                                         domain=tuple(self._domain[j]))
                tens_space.append(basis)
            vec_space.append(sf.TensorProductSpace(sf.comm, tuple(tens_space)))

        V = sf.VectorSpace(vec_space)
        u_hat = sf.Function(V)
        for i in range(self._dim):
            # u has the same expansions coefficients as u_dimless
            u_hat[i] = self._u_ref * self._solution[i]
        return u_hat
Пример #8
0
def test_biharmonic3D(family, axis):
    la = lla
    if family == 'chebyshev':
        la = cla
    N = (16, 16, 16)
    SD = shenfun.Basis(N[allaxes3D[axis][0]], family=family, bc='Biharmonic')
    K1 = shenfun.Basis(N[allaxes3D[axis][1]], family='F', dtype='D')
    K2 = shenfun.Basis(N[allaxes3D[axis][2]], family='F', dtype='d')
    subcomms = mpi4py_fft.pencil.Subcomm(MPI.COMM_WORLD, [0, 1, 1])
    bases = [0] * 3
    bases[allaxes3D[axis][0]] = SD
    bases[allaxes3D[axis][1]] = K1
    bases[allaxes3D[axis][2]] = K2
    T = shenfun.TensorProductSpace(subcomms, bases, axes=allaxes3D[axis])
    u = shenfun.TrialFunction(T)
    v = shenfun.TestFunction(T)
    if family == 'chebyshev':
        mat = shenfun.inner(
            v, shenfun.div(shenfun.grad(shenfun.div(shenfun.grad(u)))))
    else:
        mat = shenfun.inner(shenfun.div(shenfun.grad(v)),
                            shenfun.div(shenfun.grad(u)))

    H = la.Biharmonic(*mat)
    H = la.Biharmonic(*mat)
    u = shenfun.Function(T)
    u[:] = np.random.random(u.shape) + 1j * np.random.random(u.shape)
    f = shenfun.Function(T)
    f = H.matvec(u, f)
    f = H.matvec(u, f)

    g0 = shenfun.Function(T)
    g1 = shenfun.Function(T)
    g2 = shenfun.Function(T)
    M = {d.get_key(): d for d in mat}
    amat = 'ABBmat' if family == 'chebyshev' else 'PBBmat'
    g0 = M['SBBmat'].matvec(u, g0)
    g1 = M[amat].matvec(u, g1)
    g2 = M['BBBmat'].matvec(u, g2)

    assert np.linalg.norm(f - (g0 + g1 + g2)) < 1e-8, np.linalg.norm(f -
                                                                     (g0 + g1 +
                                                                      g2))
Пример #9
0
def test_CDDmat(quad):
    M = 48
    SD = cbases.ShenDirichlet(M, quad=quad)
    u = (1-x**2)*sin(np.pi*6*x)
    dudx = u.diff(x, 1)
    dudx_hat = shenfun.Function(SD, buffer=dudx)
    u_hat = shenfun.Function(SD, buffer=u)
    ducdx_hat = shenfun.project(shenfun.Dx(u_hat, 0, 1), SD)
    assert np.linalg.norm(ducdx_hat-dudx_hat)/M < 1e-10, np.linalg.norm(ducdx_hat-dudx_hat)/M

    # Multidimensional version
    SD0 = cbases.ShenDirichlet(8, quad=quad)
    SD1 = cbases.ShenDirichlet(M, quad=quad)
    T = shenfun.TensorProductSpace(shenfun.comm, (SD0, SD1))
    u = (1-y**2)*sin(np.pi*6*y)
    dudy = u.diff(y, 1)
    dudy_hat = shenfun.Function(T, buffer=dudy)
    u_hat = shenfun.Function(T, buffer=u)
    ducdy_hat = shenfun.project(shenfun.Dx(u_hat, 1, 1), T)
    assert np.linalg.norm(ducdy_hat-dudy_hat)/M < 1e-10, np.linalg.norm(ducdy_hat-dudy_hat)/M
Пример #10
0
B = sf.FunctionSpace(20, family='legendre')

r, phi = sp.symbols('x,y', real=True, positive=True)
psi = (r, phi)
# position vector
rv = (r * sp.cos(phi), r * sp.sin(phi))

# some parameters
r = 2

N, M = 30, 30

R = sf.FunctionSpace(N, family='legendre', domain=(0, r), dtype='D')
PHI = sf.FunctionSpace(M, family='fourier', domain=(0, 2.0 * np.pi))

T = sf.TensorProductSpace(sf.comm, (R, PHI), coordinates=(psi, rv))

u = sf.TrialFunction(T)
v = sf.TestFunction(T)

X, Y = T.cartesian_mesh()

plt.scatter(X, Y)

coors = T.coors

# test coordinates
assert coors.is_cartesian is False
assert coors.is_orthogonal is True

print('position vector\n', coors.rv)
Пример #11
0
import pytest
import numpy as np
import sympy as sp
from mpi4py import MPI
import shenfun
from shenfun import inner, div, grad, curl

N = 8
comm = MPI.COMM_WORLD

V = shenfun.FunctionSpace(N, 'C')
u0 = shenfun.TrialFunction(V)

T = shenfun.TensorProductSpace(comm, (V, V))
u1 = shenfun.TrialFunction(V)

TT = shenfun.VectorTensorProductSpace(T)
u2 = shenfun.TrialFunction(TT)

@pytest.mark.parametrize('basis', (u0, u1, u2))
def test_mul(basis):
    e = shenfun.Expr(basis)
    e2 = 2*e
    assert np.allclose(np.array(e2.scales()).astype(np.int), 2)
    e2 = e*2
    assert np.allclose(np.array(e2.scales()).astype(np.int), 2.)
    if e.expr_rank() == 1:
        a = tuple(range(e.dimensions))
        e2 = a*e
        assert np.allclose(np.array(e2.scales()).astype(np.int)[:, 0], (0, 1))