def test_site_factors__assert_linear_amp_factor_is_approx_1_at_small_freq( self): sf = SF(265, 128, 0.012) amp = sf.get_amplification(Fourier=True, show_interp_plots=False) self.assertTrue(isinstance(amp, FS)) self.assertTrue( np.allclose(amp.raw_data[0, 1], 1.0, atol=0.1, rtol=0.0))
def test_site_factors__assert_phase_starts_from_approx_0_at_small_freq( self): sf = SF(265, 128, 0.012) phase = sf.get_phase_shift(show_interp_plots=False, method='eq_hh') self.assertTrue(isinstance(phase, FS)) self.assertTrue( np.allclose(phase.raw_data[0, 1], 0.0, atol=0.1, rtol=0.0))
def test_interpolate(self): import itertools from scipy.interpolate import RegularGridInterpolator def f(x, y, z): return x + y + z x = [1, 2] y = [10, 20] z = [100, 200] vertices = list(itertools.product(x, y, z)) point = (1.5, 15, 150) # point at which you want to know the value data = f(*np.meshgrid(x, y, z, indexing='ij', sparse=False)) my_interpolating_function = RegularGridInterpolator((x, y, z), data) benchmark = my_interpolating_function(point) values_at_vertices = [] for vertex in vertices: values_at_vertices.append([f(*vertex)]) answer = SF._interpolate(vertices, values_at_vertices, point) self.assertEqual(answer, benchmark)
def test_find_neighbors(self): Vs30, z1000, PGA = 190, 60, 0.85 locations = SF._find_neighbors(Vs30, z1000, PGA) self.assertEqual(locations[0], [0, 1]) self.assertEqual(locations[1], [3, 4]) self.assertEqual(locations[2], [7, 8]) Vs30, z1000, PGA = 175, 900, 0.05 locations = SF._find_neighbors(Vs30, z1000, PGA) self.assertEqual(locations[0], [0, 1]) self.assertEqual(locations[1], [8, 9]) self.assertEqual(locations[2], [0, 1]) Vs30, z1000, PGA = 950, 120, 0.01 locations = SF._find_neighbors(Vs30, z1000, PGA) self.assertEqual(locations[0], [15, 16]) self.assertEqual(locations[1], [4, 5]) self.assertEqual(locations[2], [0, 1])
def test_site_factors__out_of_bound_PGA__lenient_case_2(self): sf1 = SF(300, 120, 1.75, lenient=True) sf2 = SF(300, 120, 1.5) self.assertTrue( np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue( np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum))
def test_site_factors__out_of_bound_z1__lenient_case_2(self): sf1 = SF(275, 980, 0.3, lenient=True) sf2 = SF(275, 900, 0.3) self.assertTrue( np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue( np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum))
def test_site_factors__out_of_bound_Vs30__lenient_case_1(self): sf1 = SF(170, 125, 0.3, lenient=True) sf2 = SF(175, 125, 0.3) self.assertTrue( np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue( np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum))
def test_search_sorted(self): z1000_array = [8, 16, 24, 36, 75, 150, 300, 450, 600, 750, 900] loc = SF._search_sorted(24, z1000_array) self.assertEqual(loc, [1, 2]) loc = SF._search_sorted(25, z1000_array) self.assertEqual(loc, [2, 3]) loc = SF._search_sorted(60, z1000_array) self.assertEqual(loc, [3, 4]) loc = SF._search_sorted(150, z1000_array) self.assertEqual(loc, [4, 5]) loc = SF._search_sorted(8, z1000_array) self.assertEqual(loc, [0, 1]) loc = SF._search_sorted(900, z1000_array) self.assertEqual(loc, [9, 10])
def test_interp_plots(self): vs30, z1000, pga = 365, 247, 0.75 sf = SF(vs30, z1000, pga) sf.get_both_amplf_and_phase(show_interp_plots=True) sf.get_amplification(Fourier=False, show_interp_plots=True) sf.get_amplification(Fourier=True, show_interp_plots=True) sf.get_amplification(method='eq_hh', Fourier=True, show_interp_plots=True) sf.get_phase_shift(show_interp_plots=True)
def test_range_check(self): self.assertEqual(SF._range_check(174, 10, 0.6), ['Vs30 out of range']) self.assertEqual(SF._range_check(951, 10, 0.6), ['Vs30 out of range']) self.assertEqual(SF._range_check(300, 7, 0.6), ['z1 out of range']) self.assertEqual(SF._range_check(300, 901, 0.6), ['z1 out of range']) self.assertEqual(SF._range_check(300, 600, 0.0009), ['PGA out of range']) self.assertEqual(SF._range_check(300, 600, 1.501), ['PGA out of range']) self.assertEqual(SF._range_check(300, 900, 0.5), []) self.assertEqual(SF._range_check(400, 900, 0.5), []) self.assertEqual(SF._range_check(450, 750, 0.5), []) self.assertEqual(SF._range_check(450, 751, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(451, 750, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(550, 600, 0.5), []) self.assertEqual(SF._range_check(551, 600, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(550, 601, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(600, 450, 0.5), []) self.assertEqual(SF._range_check(601, 450, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(600, 451, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(650, 300, 0.5), []) self.assertEqual(SF._range_check(651, 300, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(650, 301, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(750, 150, 0.5), []) self.assertEqual(SF._range_check(751, 150, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(750, 151, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(800, 75, 0.5), []) self.assertEqual(SF._range_check(801, 75, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(800, 76, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(850, 36, 0.5), []) self.assertEqual(SF._range_check(851, 36, 0.5), ['Invalid Vs30-z1 combination']) self.assertEqual(SF._range_check(850, 37, 0.5), ['Invalid Vs30-z1 combination'])
def test_site_factors__assert_data_type(self): sf = SF(265, 128, 0.012) amp = sf.get_amplification(Fourier=False, show_interp_plots=False) self.assertTrue(isinstance(amp, FS))
def test_range_check(self): self.assertEqual(SF._range_check(174, 300, 0.6), [1]) self.assertEqual(SF._range_check(951, 300, 0.6), [1]) self.assertEqual(SF._range_check(300, 7, 0.6), [2]) self.assertEqual(SF._range_check(300, 901, 0.6), [2]) self.assertEqual(SF._range_check(300, 600, 0.0009), [3]) self.assertEqual(SF._range_check(300, 600, 1.501), [3]) self.assertEqual(SF._range_check(300, 900, 0.5), []) self.assertEqual(SF._range_check(400, 900, 0.5), []) self.assertEqual(SF._range_check(450, 750, 0.5), []) self.assertEqual(SF._range_check(450, 751, 0.5), [4]) self.assertEqual(SF._range_check(451, 750, 0.5), [4]) self.assertEqual(SF._range_check(550, 600, 0.5), []) self.assertEqual(SF._range_check(551, 600, 0.5), [4]) self.assertEqual(SF._range_check(550, 601, 0.5), [4]) self.assertEqual(SF._range_check(600, 450, 0.5), []) self.assertEqual(SF._range_check(601, 450, 0.5), [4]) self.assertEqual(SF._range_check(600, 451, 0.5), [4]) self.assertEqual(SF._range_check(650, 300, 0.5), []) self.assertEqual(SF._range_check(651, 300, 0.5), [4]) self.assertEqual(SF._range_check(650, 301, 0.5), [4]) self.assertEqual(SF._range_check(750, 150, 0.5), []) self.assertEqual(SF._range_check(751, 150, 0.5), [4]) self.assertEqual(SF._range_check(750, 151, 0.5), [4]) self.assertEqual(SF._range_check(800, 75, 0.5), []) self.assertEqual(SF._range_check(801, 75, 0.5), [4]) self.assertEqual(SF._range_check(800, 76, 0.5), [4]) self.assertEqual(SF._range_check(850, 36, 0.5), []) self.assertEqual(SF._range_check(851, 36, 0.5), [4]) self.assertEqual(SF._range_check(850, 37, 0.5), [4])
def test_site_factors(self): sf = SF(265, 128, 0.012) # assert data type amp = sf.get_amplification(Fourier=False, show_interp_plots=False) self.assertTrue(isinstance(amp, FS)) # assert that linear amplification factor starts from ~1.0 at small freq amp = sf.get_amplification(Fourier=True, show_interp_plots=False) self.assertTrue(isinstance(amp, FS)) self.assertTrue(np.allclose(amp.raw_data[0, 1], 1.0, atol=0.1, rtol=0.0)) # assert that phase start from ~0.0 at small freq phase = sf.get_phase_shift(show_interp_plots=False, method='eq_hh') self.assertTrue(isinstance(phase, FS)) self.assertTrue(np.allclose(phase.raw_data[0, 1], 0.0, atol=0.1, rtol=0.0)) # test out-of-bound values (not lenient) with self.assertRaises(ValueError, msg='Vs30 should be between'): SF(174, 125, 0.3, lenient=False) with self.assertRaises(ValueError, msg='z1_in_m should be between'): SF(180, 901, 0.3, lenient=False) with self.assertRaises(ValueError, msg='PGA should be between'): SF(180, 650, 1.6, lenient=False) # test invalid combinations (not lenient) with self.assertRaises(ValueError, msg='combination not valid'): SF(650, 900, 1.0, lenient=False) # test lenient cases: out-of-bound Vs30 sf1 = SF(170, 125, 0.3, lenient=True) sf2 = SF(175, 125, 0.3) self.assertTrue(np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue(np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum)) sf1 = SF(980, 10, 0.3, lenient=True) sf2 = SF(950, 10, 0.3) self.assertTrue(np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue(np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum)) # test lenient cases: out-of-bound z1 sf1 = SF(275, 5, 0.3, lenient=True) sf2 = SF(275, 8, 0.3) self.assertTrue(np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue(np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum)) sf1 = SF(275, 980, 0.3, lenient=True) sf2 = SF(275, 900, 0.3) self.assertTrue(np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue(np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum)) # test lenient cases: out-of-bound PGA sf1 = SF(300, 120, 0.008, lenient=True) sf2 = SF(300, 120, 0.01) self.assertTrue(np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue(np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum)) sf1 = SF(300, 120, 1.75, lenient=True) sf2 = SF(300, 120, 1.5) self.assertTrue(np.allclose(sf1.get_amplification().spectrum, sf2.get_amplification().spectrum)) self.assertTrue(np.allclose(sf1.get_phase_shift().spectrum, sf2.get_phase_shift().spectrum))