예제 #1
0
 def cube(k):
     cglob = -1j * k
     cloc = cloc0 + cloc1 * k + cloc2 * k**2
     print("k: ", k, "cloc: ", cloc)
     mus = {'k': k, 'c_glob': cglob, 'c_loc': cloc}
     resolution = int(
         np.ceil(float(k * 1.5 + 50) / coarse_grid_resolution) *
         coarse_grid_resolution)
     n = int(k / 5 + 30)
     gq, lq = localize_problem(p,
                               coarse_grid_resolution,
                               resolution,
                               mus=mus)
     d = gq["d"]
     u = d.solve(mus)
     e_r = []
     e_d = []
     for i in range(it):
         print(i, )
         sys.stdout.flush()
         bases = create_bases2(gq, lq, n, transfer='robin')
         ru_r = reconstruct_solution(gq, lq, bases)
         del bases
         dif_r = u - ru_r
         e_r.append(gq["full_norm"](dif_r)[0] / gq["full_norm"](u)[0])
         bases = create_bases2(gq, lq, n, transfer='dirichlet')
         ru_d = reconstruct_solution(gq, lq, bases)
         del bases
         dif_d = u - ru_d
         e_d.append(gq["full_norm"](dif_d)[0] / gq["full_norm"](u)[0])
     return np.mean(e_d), np.mean(e_r)
예제 #2
0
def evaluation(it,
               lim,
               k,
               boundary,
               save,
               cglob=0,
               cloc=0,
               plot=False,
               resolution=200,
               coarse_grid_resolution=10):
    p = helmholtz(boundary=boundary)
    mus = {'k': k, 'c_glob': cglob, 'c_loc': cloc}
    gq, lq = localize_problem(p, coarse_grid_resolution, resolution, mus=mus)
    d = gq["d"]
    u = d.solve(mus)
    h1_dirichlet = []
    h1_robin = []
    nrang = np.arange(0, lim, 5)
    for n in nrang:
        print("n: ", n)
        h1d = []
        h1r = []
        for j in range(it):
            print(j, )
            sys.stdout.flush()
            basis_dirichlet = create_bases2(gq, lq, n)
            ru_dirichlet = reconstruct_solution(gq, lq, basis_dirichlet)
            del basis_dirichlet
            basis_robin = create_bases2(gq, lq, n, transfer='robin')
            ru_robin = reconstruct_solution(gq, lq, basis_robin)
            del basis_robin
            dif_dirichlet = u - ru_dirichlet
            dif_robin = u - ru_robin
            h1d.append(gq["full_norm"](dif_dirichlet)[0] /
                       gq["full_norm"](u)[0])
            h1r.append(gq["full_norm"](dif_robin)[0] / gq["full_norm"](u)[0])
        h1_dirichlet.append(h1d)
        h1_robin.append(h1r)
    means_dirichlet_h1 = np.mean(h1_dirichlet, axis=1)
    means_robin_h1 = np.mean(h1_robin, axis=1)
    data = np.vstack([nrang, means_dirichlet_h1, means_robin_h1]).T
    open(save, "w").writelines([" ".join(map(str, v)) + "\n" for v in data])
    if plot:
        from matplotlib import pyplot as plt
        plt.figure()
        plt.semilogy(nrang, means_dirichlet_h1, label="Dirichlet h1")
        plt.semilogy(nrang, means_robin_h1, label="Robin h1")
        plt.legend(loc='upper right')
        plt.xlabel('Basis size')
        plt.show()
예제 #3
0
def knerr2D(it,
            boundary,
            save,
            cglob=None,
            cloc0=0,
            cloc1=1,
            cloc2=1,
            krang=np.arange(0.1, 200.1, 10.),
            nrang=np.arange(0, 100, 5),
            plot=False,
            resolution=100,
            coarse_grid_resolution=10):
    err_r = np.zeros((len(krang), len(nrang)))
    p = helmholtz(boundary=boundary)
    usecglob = (cglob is None)
    xi = 0
    for k in krang:
        yi = 0
        if usecglob:
            cglob = -1j * k
        cloc = cloc0 + cloc1 * k + cloc2 * k**2
        mus = {'k': k, 'c_glob': cglob, 'c_loc': cloc}
        gq, lq = localize_problem(p,
                                  coarse_grid_resolution,
                                  resolution,
                                  mus=mus)
        d = gq["d"]
        u = d.solve(mus)
        for n in nrang:
            print(k, n)
            e_r = []
            for i in range(min(20 - n / 5, it)):
                print(i, )
                sys.stdout.flush()
                bases = create_bases2(gq, lq, n, transfer='robin')
                ru_r = reconstruct_solution(gq, lq, bases)
                del bases
                dif_r = u - ru_r
                e_r.append(gq["full_norm"](dif_r)[0] / gq["full_norm"](u)[0])
            err_r[xi][yi] = np.mean(e_r)
            yi += 1
        xi += 1
    X, Y = np.meshgrid(krang, nrang)
    data = np.vstack([X.T.ravel(), Y.T.ravel(), err_r.ravel()]).T
    open(save, "w").writelines([" ".join(map(str, v)) + "\n" for v in data])
    if plot:
        import matplotlib.pyplot as plt
        from matplotlib import cm
        fig = plt.figure()
        ax = fig.gca(projection='3d')
        surf = ax.plot_surface(X,
                               Y,
                               err_r,
                               cstride=1,
                               rstride=1,
                               cmap=cm.coolwarm,
                               linewidth=0,
                               antialiased=False)
        fig.colorbar(surf, shrink=0.5, aspect=5)
        plt.show()
예제 #4
0
def resolution(it,
               k,
               n,
               boundary,
               save,
               cloc=0,
               returnvals=False,
               coarse_grid_resolution=10):
    cglob = -1j * k
    mus = {'k': k, 'c_glob': cglob, 'c_loc': cloc}
    p = helmholtz(boundary=boundary)
    space = np.arange(20, 160, 10)
    err = []
    for resolution in space:
        print(resolution)
        gq, lq = localize_problem(p,
                                  coarse_grid_resolution,
                                  resolution,
                                  mus=mus)
        d = gq["d"]
        u = d.solve(mus)
        E = []
        for i in range(it):
            bases = create_bases2(gq, lq, n, transfer='robin')
            ru = reconstruct_solution(gq, lq, bases)
            E.append(gq["full_norm"](u - ru)[0] / gq["full_norm"](u)[0])
        err.append(E)
    errs = np.mean(err, axis=1)
    data = np.vstack([space, errs]).T
    open(save, "w").writelines([" ".join(map(str, v)) + "\n" for v in data])
    if returnvals:
        return [space, errs]
예제 #5
0
def test1(transfer='robin',
          boundary='dirichlet',
          n=15,
          k=6.,
          cloc=6.,
          title='test',
          resolution=100,
          coarse_grid_resolution=10,
          m=1):
    cglob = -1j * k
    mus = {'k': k, 'c_glob': cglob, 'c_loc': cloc}
    p = helmholtz(boundary=boundary)
    gq, lq = localize_problem(p, coarse_grid_resolution, resolution, mus, m=m)
    basis = create_bases2(gq, lq, n, transfer=transfer, silent=False)
    ru = reconstruct_solution(gq, lq, basis, silent=False)
    d = gq["d"]
    u = d.solve(mus)
    dif = u - ru
    print(gq["full_norm"](dif)[0] / gq["full_norm"](u)[0])
    d.visualize((dif.real, dif.imag, u.real, u.imag, ru.real, ru.imag),
                legend=('dif.real', 'dif.imag', 'u.real', 'u.imag', 'ru.real',
                        'ru.imag'),
                separate_colorbars=True,
                title=title)
예제 #6
0
 def cube():
     bases = create_bases2(gq, lq, n, transfer='robin')
     ru_r = reconstruct_solution(gq, lq, bases)
     del bases
     dif_r = u - ru_r
     return gq["full_norm"](dif_r)[0] / gq["full_norm"](u)[0]