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)
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()
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()
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]
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)
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]