def test_print_data(capsys): # Test full with min amplitude with case 2 dat1 = DATA['case2'][()] fdesign.print_result(dat1[1], dat1[2]) out, _ = capsys.readouterr() assert "Filter length : 201" in out assert "Best filter" in out assert "> Min field : 1.79577e-11" in out assert "> Spacing : 0.0641" in out assert "> Shift : -1.2847" in out assert "> Base min/max : 4.552335e-04 / 1.682246e+02" in out # Test full with max r with case 3 dat2 = DATA['case4'][()] fdesign.print_result(dat2[1], dat2[2]) out, _ = capsys.readouterr() assert "Filter length : 201" in out assert "Best filter" in out assert "> Max r : 21.5443" in out assert "> Spacing : 0.0641" in out assert "> Shift : -1.2847" in out assert "> Base min/max : 4.552335e-04 / 1.682246e+02" in out # Test filter only with key_201_2009() fdesign.print_result(filters.key_201_2009()) out, _ = capsys.readouterr() assert "Filter length : 201" in out assert "Best filter" in out assert "> Spacing : 0.074" in out assert "> Shift : 1.509903313e-14" in out assert "> Base min/max : 6.112528e-04 / 1.635984e+03" in out
def __init__(self, mesh, **kwargs): Problem.BaseProblem.__init__(self, mesh, **kwargs) if self.filter_type == 'key_201': if self.verbose: print(">> Use Key 201 filter for Hankel Tranform") fht = filters.key_201_2009() self.WT0 = np.empty(201, complex) self.WT1 = np.empty(201, complex) self.YBASE = np.empty(201, complex) self.WT0 = fht.j0 self.WT1 = fht.j1 self.YBASE = fht.base elif self.filter_type == 'key_101': if self.verbose: print(">> Use Key 101 filter for Hankel Tranform") fht = filters.key_101_2009() self.WT0 = np.empty(101, complex) self.WT1 = np.empty(101, complex) self.YBASE = np.empty(101, complex) self.WT0 = fht.j0 self.WT1 = fht.j1 self.YBASE = fht.base elif self.filter_type == 'anderson_801': if self.verbose: print(">> Use Anderson 801 filter for Hankel Tranform") fht = filters.anderson_801_1982() self.WT0 = np.empty(801, complex) self.WT1 = np.empty(801, complex) self.YBASE = np.empty(801, complex) self.WT0 = fht.j0 self.WT1 = fht.j1 self.YBASE = fht.base else: raise NotImplementedError()
def test_plot_inversion1(self): # plot_inversion minimum amplitude f = fdesign.j0_1(5) filt = filters.key_201_2009() n = filt.base.size a = filt.base[-1] b = filt.base[-2] spacing = np.log(a) - np.log(b) shift = np.log(a) - spacing * (n // 2) cvar = 'amp' r = np.logspace(0, 1.5, 100) f.rhs = f.rhs(r) k = filt.base / r[:, None] rhs = np.dot(f.lhs(k), filt.j0) / r rel_error = np.abs((rhs - f.rhs) / f.rhs) imin = np.where(rel_error > 0.01)[0][0] fdesign._plot_inversion(f, rhs, r, k, imin, spacing, shift, cvar) return plt.gcf()
def test_plot_inversion2(self): # plot_inversion maximum r f = fdesign.empy_hankel('j2', 50, 100, 1, 1) filt = filters.key_201_2009() n = filt.base.size a = filt.base[-1] b = filt.base[-2] spacing = np.log(a) - np.log(b) shift = np.log(a) - spacing * (n // 2) cvar = 'r' r = np.logspace(1, 4.5, 100) f.rhs = f.rhs(r) k = filt.base / r[:, None] lhs = f.lhs(k) rhs0 = np.dot(lhs[0], filt.j0) / r rhs1 = np.dot(lhs[1], filt.j1) / r**2 rhs = rhs0 + rhs1 rel_error = np.abs((rhs - f.rhs) / f.rhs) imin = np.where(rel_error > 0.01)[0][0] fdesign._plot_inversion(f, rhs, r, k, imin, spacing, shift, cvar) return plt.gcf()
def test_j01(): # Check with Key201-filter if analytical transform pairs for J0 and J1 are # correct filt = filters.key_201_2009() for j01 in ['1', '2', '3', '4', '5']: if j01 == '1': r = np.logspace(0, 1.15, 100) else: r = np.logspace(0, 3, 100) k = filt.base / r[:, None] tp0 = getattr(fdesign, 'j0_' + j01)(3) tp1 = getattr(fdesign, 'j1_' + j01)(3) rhs1a = tp0.rhs(r) rhs1c = np.dot(tp0.lhs(k), filt.j0) / r assert_allclose(rhs1a, rhs1c, rtol=1e-3) rhs2a = tp1.rhs(r) rhs2c = np.dot(tp1.lhs(k), filt.j1) / r assert_allclose(rhs2a, rhs2c, rtol=1e-3)
def test_check_hankel(capsys): # # DLF # # # verbose ht, htarg = utils.check_hankel('dlf', {}, 4) out, _ = capsys.readouterr() assert " Hankel : DLF (Fast Hankel Transform)\n > F" in out assert " > DLF type : Standard" in out assert ht == 'dlf' assert htarg['dlf'].name == filters.key_201_2009().name assert htarg['pts_per_dec'] == 0 # provide filter-string and unknown parameter _, htarg = utils.check_hankel('dlf', {'dlf': 'key_201_2009', 'abc': 0}, 1) out, _ = capsys.readouterr() assert htarg['dlf'].name == filters.key_201_2009().name assert htarg['pts_per_dec'] == 0 assert "WARNING :: Unknown htarg {'abc': 0} for method 'dlf'" in out # provide filter-instance _, htarg = utils.check_hankel('dlf', {'dlf': filters.kong_61_2007()}, 0) assert htarg['dlf'].name == filters.kong_61_2007().name assert htarg['pts_per_dec'] == 0 # provide pts_per_dec _, htarg = utils.check_hankel('dlf', {'pts_per_dec': -1}, 3) out, _ = capsys.readouterr() assert " > DLF type : Lagged Convolution" in out assert htarg['dlf'].name == filters.key_201_2009().name assert htarg['pts_per_dec'] == -1 # provide filter-string and pts_per_dec _, htarg = utils.check_hankel('dlf', { 'dlf': 'key_201_2009', 'pts_per_dec': 20 }, 4) out, _ = capsys.readouterr() assert " > DLF type : Splined, 20.0 pts/dec" in out assert htarg['dlf'].name == filters.key_201_2009().name assert htarg['pts_per_dec'] == 20 # Assert it can be called repetitively _, _ = capsys.readouterr() ht, htarg = utils.check_hankel('dlf', {}, 1) _, _ = utils.check_hankel(ht, htarg, 1) out, _ = capsys.readouterr() assert out == "" # # QWE # # # verbose ht, htarg = utils.check_hankel('qwe', {}, 4) out, _ = capsys.readouterr() outstr = " Hankel : Quadrature-with-Extrapolation\n > rtol" assert outstr in out assert ht == 'qwe' assert htarg['rtol'] == 1e-12 assert htarg['atol'] == 1e-30 assert htarg['nquad'] == 51 assert htarg['maxint'] == 100 assert htarg['pts_per_dec'] == 0 assert htarg['diff_quad'] == 100 assert htarg['a'] is None assert htarg['b'] is None assert htarg['limit'] is None # limit _, htarg = utils.check_hankel('qwe', {'limit': 30}, 0) assert htarg['rtol'] == 1e-12 assert htarg['atol'] == 1e-30 assert htarg['nquad'] == 51 assert htarg['maxint'] == 100 assert htarg['pts_per_dec'] == 0 assert htarg['diff_quad'] == 100 assert htarg['a'] is None assert htarg['b'] is None assert htarg['limit'] == 30 # all arguments _, htarg = utils.check_hankel( 'qwe', { 'rtol': 1e-3, 'atol': 1e-4, 'nquad': 31, 'maxint': 20, 'pts_per_dec': 30, 'diff_quad': 200, 'a': 1e-6, 'b': 160, 'limit': 30 }, 3) out, _ = capsys.readouterr() assert " > a (quad): 1e-06" in out assert " > b (quad): 160" in out assert " > limit (quad): 30" in out assert htarg['rtol'] == 1e-3 assert htarg['atol'] == 1e-4 assert htarg['nquad'] == 31 assert htarg['maxint'] == 20 assert htarg['pts_per_dec'] == 30 assert htarg['diff_quad'] == 200 assert htarg['a'] == 1e-6 assert htarg['b'] == 160 assert htarg['limit'] == 30 # Assert it can be called repetitively _, _ = capsys.readouterr() ht, htarg = utils.check_hankel('qwe', {}, 1) _, _ = utils.check_hankel(ht, htarg, 1) out, _ = capsys.readouterr() assert out == "" # # QUAD # # # verbose ht, htarg = utils.check_hankel('quad', {}, 4) out, _ = capsys.readouterr() outstr = " Hankel : Quadrature\n > rtol" assert outstr in out assert ht == 'quad' assert htarg['rtol'] == 1e-12 assert htarg['atol'] == 1e-20 assert htarg['limit'] == 500 assert htarg['a'] == 1e-6 assert htarg['b'] == 0.1 assert htarg['pts_per_dec'] == 40 # pts_per_dec _, htarg = utils.check_hankel('quad', {'pts_per_dec': 100}, 0) assert htarg['rtol'] == 1e-12 assert htarg['atol'] == 1e-20 assert htarg['limit'] == 500 assert htarg['a'] == 1e-6 assert htarg['b'] == 0.1 assert htarg['pts_per_dec'] == 100 # all arguments _, htarg = utils.check_hankel( 'quad', { 'rtol': 1e-3, 'atol': 1e-4, 'limit': 100, 'a': 1e-10, 'b': 200, 'pts_per_dec': 50 }, 0) assert htarg['rtol'] == 1e-3 assert htarg['atol'] == 1e-4 assert htarg['limit'] == 100 assert htarg['a'] == 1e-10 assert htarg['b'] == 200 assert htarg['pts_per_dec'] == 50 # Assert it can be called repetitively _, _ = capsys.readouterr() ht, htarg = utils.check_hankel('quad', {}, 1) _, _ = utils.check_hankel(ht, htarg, 1) out, _ = capsys.readouterr() assert out == "" # wrong ht with pytest.raises(ValueError): utils.check_hankel('doesnotexist', {}, 1) # filter missing attributes with pytest.raises(AttributeError): utils.check_hankel('dlf', {'dlf': 'key_101_CosSin_2012'}, 1)
def test_check_hankel(capsys): # # FHT # # # verbose ht, htarg = utils.check_hankel('fht', None, 4) out, _ = capsys.readouterr() assert " Hankel : DLF (Fast Hankel Transform)\n > F" in out assert " > DLF type : Standard" in out assert ht == 'fht' assert htarg[0].name == filters.key_201_2009().name assert htarg[1] is 0 # [filter str] _, htarg = utils.check_hankel('fht', 'key_201_2009', 0) assert htarg[0].name == filters.key_201_2009().name assert htarg[1] is 0 # [filter inst] _, htarg = utils.check_hankel('fht', filters.kong_61_2007(), 0) assert htarg[0].name == filters.kong_61_2007().name assert htarg[1] is 0 # ['', pts_per_dec] :: list _, htarg = utils.check_hankel('fht', ['', 20], 0) assert htarg[0].name == filters.key_201_2009().name assert htarg[1] == 20 # ['', pts_per_dec] :: dict _, htarg = utils.check_hankel('fht', {'pts_per_dec': -1}, 4) out, _ = capsys.readouterr() assert " > DLF type : Lagged Convolution" in out assert htarg[0].name == filters.key_201_2009().name assert htarg[1] == -1 # [filter str, pts_per_dec] _, htarg = utils.check_hankel('fht', ['key_201_2009', 20], 4) out, _ = capsys.readouterr() assert " > DLF type : Splined, 20 pts/dec" in out assert htarg[0].name == filters.key_201_2009().name assert htarg[1] == 20 # # QWE # # # verbose ht, htarg = utils.check_hankel('qwe', None, 4) out, _ = capsys.readouterr() outstr = " Hankel : Quadrature-with-Extrapolation\n > rtol" assert outstr in out assert ht == 'hqwe' assert_allclose(htarg[:-3], [1e-12, 1e-30, 51, 100, 0, 100]) assert htarg[-3] is None assert htarg[-2] is None assert htarg[-1] is None # only last argument _, htarg = utils.check_hankel('qwe', ['', '', '', '', '', '', '', '', 30], 0) assert_allclose(htarg[:-3], [1e-12, 1e-30, 51, 100, 0, 100]) assert htarg[-3] is None assert htarg[-2] is None assert htarg[-1] == 30 # all arguments _, htarg = utils.check_hankel('qwe', [1e-3, 1e-4, 31, 20, 30, 200, 1e-6, 160, 30], 3) out, _ = capsys.readouterr() assert " > a (quad): 1e-06" in out assert " > b (quad): 160" in out assert " > limit (quad): 30" in out assert_allclose(htarg, [1e-3, 1e-4, 31, 20, 30, 200, 1e-6, 160, 30]) # # QUAD # # # verbose ht, htarg = utils.check_hankel('quad', None, 4) out, _ = capsys.readouterr() outstr = " Hankel : Quadrature\n > rtol" assert outstr in out assert ht == 'hquad' assert_allclose(htarg, [1e-12, 1e-20, 500, 1e-6, 0.1, 40]) # only last argument _, htarg = utils.check_hankel('quad', ['', '', '', '', '', 100], 0) assert_allclose(htarg, [1e-12, 1e-20, 500, 1e-6, 0.1, 100]) # all arguments _, htarg = utils.check_hankel('quad', [1e-3, 1e-4, 100, 1e-10, 200, 50], 0) assert_allclose(htarg, [1e-3, 1e-4, 100, 1e-10, 200, 50]) # wrong ht with pytest.raises(ValueError): utils.check_hankel('doesnotexist', None, 1)