示例#1
0
def main():
    for n in N:
        err = str(n)
        err7 = str(n)
        Z[0] = n
        HS = Helmholtz(n, sqrt(K2 + 2.0 / nu / dt), "GC", False)
        BS = Biharmonic(n,
                        -nu * dt / 2.,
                        1. + nu * dt * K2,
                        -(K2 + nu * dt / 2. * K4),
                        quad="GC",
                        solver="cython")
        BS2 = Biharmonic(n,
                         -nu * dt / 2.,
                         1. + nu * dt * K2,
                         -(K2 + nu * dt / 2. * K4),
                         quad="GC",
                         solver="scipy")

        fb = random.random((Z[0], Z[1], Z[2] // 2 + 1)) + random.random(
            (Z[0], Z[1], Z[2] // 2 + 1)) * 1j
        fb[-4:] = 0
        ub = zeros((Z[0], Z[1], Z[2] // 2 + 1), dtype=complex)
        #sleep(0.5)
        t0 = time()
        for m in range(M):
            ub = BS(ub, fb)
        t1 = (time() - t0) / M / Z[1:].prod()

        t0 = time()
        for m in range(M):
            ub = BS2(ub, fb)
        t7 = (time() - t0) / M / Z[1:].prod()

        #cProfile.runctx("for m in range(M): ub = BS(ub, fb)", globals(), locals(), "res1.stats")
        #ps = pstats.Stats("res1.stats")
        #for key, val in iteritems(ps.stats):
        #if "Solve_Biharmonic" in key[2]:
        #results = val[3]/M/Z[1:].prod()
        #break
        #t1 = results

        err += " & {:2.2e} ({:2.2f}) ".format(
            t1, 0 if n == N[0] else t1 / t11 / 2.)
        err += " & {:2.2e} ({:2.2f}) ".format(
            t7, 0 if n == N[0] else t7 / t71 / 2.)
        t11 = t1
        t71 = t7

        fh = random.random((Z[0], Z[1], Z[2] // 2 + 1)) + random.random(
            (Z[0], Z[1], Z[2] // 2 + 1)) * 1j
        fh[-2:] = 0
        uh = zeros((Z[0], Z[1], Z[2] // 2 + 1), dtype=complex)
        #sleep(0.5)
        t0 = time()
        for m in range(M):
            uh = HS(uh, fh)
        t2 = (time() - t0) / M / Z[1:].prod()
        #cProfile.runctx("for m in range(M): uh = HS(uh, fh)", globals(), locals(), "res.stats")
        #ps = pstats.Stats("res.stats")
        #for key, val in iteritems(ps.stats):
        #if "Solve_Helmholtz" in key[2]:
        #results = val[3]/M/Z[1:].prod()
        #break
        #t2 = results

        err += "& {:2.2e} ({:2.2f}) \\\ ".format(
            t2, 0 if n == N[0] else t2 / t22 / 2.)
        t22 = t2
        print(err)
示例#2
0
N = array([64, 128, 256])
Z = array([0, 200, 1800, 5400])
M = 100

print("\hline")
print("z & " + " & ".join([str(n) for n in N]) + " \\\ ")
print("\hline")
for z in Z:
    err = str(z)
    for n in N:
        errb = 0
        errs = 0
        vb = zeros(n)
        sb = zeros(n)
        ss = zeros(n)
        BH = Biharmonic(n, -nu * dt / 2., 1. + nu * dt * z**2,
                        -(z**2 + nu * dt / 2. * z**4), "GC", "cython")
        SH = Biharmonic(n, -nu * dt / 2., 1. + nu * dt * z**2,
                        -(z**2 + nu * dt / 2. * z**4), "GC", "scipy")
        for m in range(M):
            u = random.random(n)
            u[-4:] = 0
            vb = BH.matvec(u, vb)
            sb = BH(sb, vb)
            errb += max(abs(sb - u)) / max(abs(u))
            ###
            ss = SH(ss, vb)
            errs += max(abs(ss - u)) / max(abs(u))
            ###
        #err += " & {:2.2e} ".format(errb/M)
        err += " & {:2.2e}  & {:2.2e} ".format(errb / M, errs / M)
    err += " \\\ "
SD = ShenBiharmonicBasis("GC", True)
points, weights = SD.points_and_weights(N) 

uj = np.array([u.subs(x, j) for j in points], dtype=float)
fj = np.array([f.subs(x, j) for j in points], dtype=float)     # Get f on quad points

#uj_hat = np.zeros(N)
#uj_hat = SD.fst(uj, uj_hat)
#uj = SD.ifst(uj_hat, uj)
#fj_hat = np.zeros(N)
#fj_hat = SD.fst(fj, fj_hat)
#fj = SD.ifst(fj_hat, fj)


solver = Biharmonic(N, a, b, c, quad=SD.quad, solver="cython")
solver2 = Biharmonic(N, a, b, c, quad=SD.quad)

f_hat = np.zeros(N)
f_hat = SD.fastShenScalar(fj, f_hat)

u_hat = np.zeros(N)
u_hat2 = np.zeros(N)

from time import time
t0 = time()
u_hat = solver(u_hat, f_hat)
t1 = time()
u_hat2 = solver2(u_hat2, f_hat)
t2 = time()
print "cython / scipy ", t1-t0, t2-t1
示例#4
0
def test_ABBmat(SB):
    M = 6 * N
    u = sin(6 * pi * x)**2
    f = u.diff(x, 2)

    points, weights = SB.points_and_weights(M)
    uj = np.array([u.subs(x, h) for h in points], dtype=np.float)
    fj = np.array([f.subs(x, h) for h in points], dtype=np.float)

    A = ABBmat(np.arange(M).astype(np.float))

    f_hat = np.zeros(M)
    f_hat = SB.fastShenScalar(fj, f_hat)
    u_hat = np.zeros(M)
    u_hat[:-4] = la.spsolve(A.diags(), f_hat[:-4])

    u0 = np.zeros(M)
    u0 = SB.ifst(u_hat, u0)

    assert np.allclose(u0, uj)

    u1 = np.zeros(M)
    u1 = SB.fst(uj, u1)
    c = A.matvec(u1)

    assert np.allclose(c, f_hat, 1e-6, 1e-6)

    # Multidimensional
    f_hat = (f_hat.repeat(16).reshape(
        (M, 4, 4)) + 1j * f_hat.repeat(16).reshape((M, 4, 4)))
    u1 = (u1.repeat(16).reshape((M, 4, 4)) + 1j * u1.repeat(16).reshape(
        (M, 4, 4)))

    c = A.matvec(u1)

    assert np.allclose(c, f_hat, 1e-6, 1e-6)

    B = BBBmat(np.arange(M).astype(np.float), SB.quad)
    u0 = np.random.randn(M)
    u0_hat = np.zeros(M)
    u0_hat = SB.fst(u0, u0_hat)
    u0 = SB.ifst(u0_hat, u0)
    b = np.zeros(M)
    k = 2.
    b = A.matvec(u0_hat) - k**2 * B.matvec(u0_hat)
    AA = A.diags().toarray() - k**2 * B.diags().toarray()
    z0_hat = np.zeros(M)
    z0_hat[:-4] = solve(AA, b[:-4])
    z0 = np.zeros(M)
    z0 = SB.ifst(z0_hat, z0)
    assert np.allclose(z0, u0)

    k = np.ones(M) * 2
    k = k.repeat(16).reshape((M, 4, 4))
    k2 = k**2
    u0_hat = u0_hat.repeat(16).reshape(
        (M, 4, 4)) + 1j * u0_hat.repeat(16).reshape((M, 4, 4))
    u0 = u0.repeat(16).reshape((M, 4, 4))
    b = A.matvec(u0_hat) - k**2 * B.matvec(u0_hat)
    alfa = np.ones((M, 4, 4))

    BH = Biharmonic(M, 0, alfa[0], -k2[0], SB.quad, "cython")
    z0_hat = np.zeros((M, 4, 4), dtype=np.complex)
    z0_hat = BH(z0_hat, b)
    z0 = np.zeros((M, 4, 4))
    z0 = SB.ifst(z0_hat.real, z0)
    #from IPython import embed; embed()
    assert np.allclose(z0, u0)
示例#5
0
N = array([64, 128, 256])
Z = array([0, 200, 1800, 5400])
M = 100

print("\hline")
print("z & " + " & ".join([str(n) for n in N]) + " \\\ ")
print("\hline")
for z in Z:
    err = str(z)
    for n in N:
        errb = 0
        errs = 0
        vb = zeros(n)
        sb = zeros(n)
        ss = zeros(n)
        BH = Biharmonic(n, -nu*dt/2., 1.+nu*dt*z**2, -(z**2+nu*dt/2.*z**4), "GC", "cython")
        SH = Biharmonic(n, -nu*dt/2., 1.+nu*dt*z**2, -(z**2+nu*dt/2.*z**4), "GC", "scipy")
        for m in range(M):
            u = random.random(n)
            u[-4:] = 0
            vb = BH.matvec(u, vb)
            sb = BH(sb, vb)
            errb += max(abs(sb-u)) / max(abs(u))
            ###
            ss = SH(ss, vb)
            errs += max(abs(ss-u)) / max(abs(u))
            ###
        #err += " & {:2.2e} ".format(errb/M)
        err += " & {:2.2e}  & {:2.2e} ".format(errb/M, errs/M)
    err += " \\\ "
    print(err)