def test_empy_hankel(): # 1. Simple test to compare ['j0', 'j1'] with 'j0' and 'j1' out1 = fdesign.empy_hankel(['j0', 'j1'], 50, 100, [2e14, 1], 1, 0) out2 = fdesign.empy_hankel('j0', 50, 100, [2e14, 1], 1, 0) out3 = fdesign.empy_hankel('j1', 50, 100, [2e14, 1], 1, 0) assert out1[0].name == out2.name assert out1[1].name == out3.name # 2. Check J0, J1 with analytical, wavenumber zsrc = -50 zrec = 0 r = np.arange(1, 101) f = 100 model1 = {'res': 100, 'aniso': 2, 'epermH': 15, 'epermV': 30, 'mpermH': 1, 'mpermV': 5} out4a = fdesign.empy_hankel(['j0', 'j1'], zsrc, zrec, freqtime=f, depth=[], **model1) out4b = model.analytical([0, 0, zsrc], [r/np.sqrt(2), r/np.sqrt(2), zrec], freqtime=f, verb=0, **model1) out4c = model.analytical([0, 0, zsrc], [r, r*0, zrec], freqtime=f, verb=0, ab=31, **model1) out4d, _ = model.dipole_k(src=[0, 0, zsrc], rec=[1/np.sqrt(2), 1/np.sqrt(2), zrec], freq=f, depth=[], wavenumber=1/r, **model1) _, out4e = model.dipole_k(src=[0, 0, zsrc], ab=31, rec=[1, 0, zrec], freq=f, depth=[], wavenumber=1/r, **model1) assert_allclose(out4a[0].rhs(r), out4b) assert_allclose(out4a[1].rhs(r), out4c) assert_allclose(out4a[0].lhs(1/r), out4d) assert_allclose(out4a[1].lhs(1/r), out4e) # 2. Check J2 with dipole, wavenumber zsrc = 950 zrec = 1000 r = np.arange(1, 101)*20 f = 0.1 model2 = {'depth': [0, 1000], 'res': [2e14, 0.3, 1], 'aniso': [1, 1, 1.5], 'epermH': [1, 15, 1], 'epermV': [1, 1, 30], 'mpermH': [1, 1, 10], 'mpermV': [1, 1, 5]} out5a = fdesign.empy_hankel('j2', zsrc, zrec, freqtime=f, **model2) out5b = model.dipole([0, 0, zsrc], [r/np.sqrt(2), r/np.sqrt(2), zrec], freqtime=f, verb=0, ab=12, **model2) out5c, out5d = model.dipole_k(src=[0, 0, zsrc], rec=[1/np.sqrt(2), 1/np.sqrt(2), zrec], ab=12, freq=f, wavenumber=1/r, **model2) assert_allclose(out5a.rhs(r), out5b) assert_allclose(out5a.lhs(1/r)[0], out5c) assert_allclose(out5a.lhs(1/r)[1], out5d)
def test_call_qc_transform_pairs2(self): # plot_transform_pair J2 r = np.logspace(1, 2, 50) fI = (fdesign.j0_1(5), fdesign.j1_1(5)) fC = fdesign.empy_hankel('j2', 950, 1000, 1, 1) fC.rhs = fC.rhs(r) fdesign._call_qc_transform_pairs(101, (0.06, 0.07, 0.01), (-1, 1, 0.3), fI, [fC, ], r, (0, 0, 2), np.imag) return plt.gcf()
def test_get_min_val(capsys): # Some parameters fI0 = fdesign.j0_1(5) fI1 = fdesign.j1_1(5) rdef = (1, 1, 2) error = 0.01 # 1. "Normal" case r = np.logspace(0, 2, 10) fC = fdesign.j0_1(5) fC.rhs = fC.rhs(r) out = fdesign._get_min_val((0.05, -1.0), 201, [fI0, ], [fC, ], r, rdef, error, np.real, 'amp', 0, 0, []) assert_allclose(out, 2.386523e-05, rtol=1e-5) # 2. "Normal" case j0 and j1; J0 is better than J1 fC1 = fdesign.j1_1(5) fC1.rhs = fC1.rhs(r) out = fdesign._get_min_val((0.05, -1.0), 201, [fI1, fI0], [fC1, fC], r, rdef, error, np.real, 'amp', 0, 0, []) assert_allclose(out, 2.386523e-05, rtol=1e-5) # 3. f2 fC2 = fdesign.empy_hankel('j2', 950, 1000, 1, 1) fC2.rhs = fC2.rhs(r) out = fdesign._get_min_val((0.05, -1.0), 201, [fI0, fI1], [fC2, ], r, rdef, error, np.real, 'amp', 0, 0, []) assert_allclose(out, 6.831394e-08, rtol=1e-5) # 4. No solution below error out = fdesign._get_min_val((0.05, -10.0), 201, [fI0, ], [fC, ], r, rdef, error, np.real, 'amp', 0, 0, []) assert_allclose(out, np.inf) # 5. All nan's; with max r out = fdesign._get_min_val((0.05, 10.0), 201, [fI0, ], [fC, ], r, rdef, error, np.real, 'r', 0, 0, []) assert_allclose(out, np.inf) # 6. r too small, with verbosity log = {'cnt1': 1, 'cnt2': 9, 'totnr': 10, 'time': default_timer(), 'warn-r': 0} r = np.logspace(0, 1.1, 10) fC = fdesign.j0_1(5) fC.rhs = fC.rhs(r) out, _ = capsys.readouterr() # empty fdesign._get_min_val((0.058, -1.26), 201, [fI0, ], [fC, ], r, rdef, error, np.real, 'amp', 3, 0, log) out, _ = capsys.readouterr() assert "* WARNING :: all data have error < "+str(error)+";" in out assert "brute fct calls : 10" in out
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_design(): # 1. General case with various spacing and shifts fI = (fdesign.j0_1(5), fdesign.j1_1(5)) dat1 = DATA['case1'][()] _, out1 = fdesign.design(fI=fI, verb=0, plot=0, **dat1[0]) # First value is always the same. # Second value jumps btw -2.722222 and -0.777778, so we don't check it. assert_allclose(out1[0][0], dat1[2][0][0]) assert_allclose(out1[1], dat1[2][1], rtol=1e-3) assert_allclose(out1[2], dat1[2][2]) # np.linalg(.qr) can have roundoff errors which are not deterministic, # which can yield different results for badly conditioned matrices. This # only affects the edge-cases, not the best result we are looking for. # However, we have to limit the following comparison; we check that at # least 50% are within a relative error of 0.1%. rate = np.sum(np.abs((out1[3] - dat1[2][3]) / dat1[2][3]) < 1e-3) assert rate > out1[3].size / 2 # 2. Specific model with only one spacing/shift dat2 = DATA['case2'][()] _, out2 = fdesign.design(fI=fI, verb=0, plot=0, **dat2[0]) assert_allclose(out2[0], dat2[2][0]) assert_allclose(out2[1], dat2[2][1], rtol=1e-3) assert_allclose(out2[2], dat2[2][2]) assert_allclose(out2[3], dat2[2][3], rtol=1e-3) # 3. Same, with only one transform dat2b = DATA['case3'][()] _, out2b = fdesign.design(fI=fI[0], verb=0, plot=0, **dat2b[0]) assert_allclose(out2b[0], dat2b[2][0]) assert_allclose(out2b[1], dat2b[2][1], rtol=1e-3) assert_allclose(out2b[2], dat2b[2][2]) assert_allclose(out2b[3], dat2b[2][3], rtol=1e-3) # 4.a Maximize r dat4 = DATA['case4'][()] dat4[0]['save'] = True dat4[0]['name'] = 'tmpfilter' _, out4 = fdesign.design(fI=fI, verb=0, plot=0, **dat4[0]) assert_allclose(out4[0], dat4[2][0]) assert_allclose(out4[1], dat4[2][1], rtol=1e-3) assert_allclose(out4[2], dat4[2][2]) assert_allclose(out4[3], dat4[2][3], rtol=1e-3) # Clean-up # Should be replaced eventually by tmpdir os.remove('./filters/tmpfilter_base.txt') os.remove('./filters/tmpfilter_j0.txt') os.remove('./filters/tmpfilter_j1.txt') os.remove('./filters/tmpfilter_full.txt') # 4.b Without full output and all the other default inputs dat4[0]['full_output'] = False del dat4[0]['name'] dat4[0]['finish'] = 'Wrong input' del dat4[0]['r'] dat4[0]['reim'] = np.imag # Set once to imag fdesign.design(fI=fI, verb=2, plot=0, **dat4[0]) # Clean-up # Should be replaced eventually by tmpdir os.remove('./filters/dlf_201_base.txt') os.remove('./filters/dlf_201_j0.txt') os.remove('./filters/dlf_201_j1.txt') # 5. j2 for fI with pytest.raises(ValueError, match="is only implemented for fC"): fI2 = fdesign.empy_hankel('j2', 0, 50, 100, 1) fdesign.design(fI=fI2, verb=0, plot=0, **dat4[0])