import unittest
import numpy as np
import pandas as pd
from rsqsim_api.fault.segment import RsqSimTriangularPatch, RsqSimSegment
from rsqsim_api.fault.multifault import RsqSimMultiFault
import os
[docs]
test_vertices = np.array([[0., 0., 0.],
[1., 1., 0.],
[0., 1., -1.]])
[docs]
fault_names = pd.Series(["test"])
[docs]
column_names = ["x1", "y1", "z1", "x2", "y2", "z2", "x3", "y3", "z3", "rake",
"slip_rate", "fault_num", "bruce_name"]
[docs]
faults_in = pd.DataFrame([[0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, -1.0, 180.0, 0, 0, 0]], columns=column_names)
[docs]
class TestMultiFault(unittest.TestCase):
[docs]
def setUp(self):
self.multifault = RsqSimMultiFault.read_fault_file_keith(os.path.join(os.path.dirname(__file__),
"data/test_fault_keith.flt"))
[docs]
def test_return_faults(self):
segments = self.multifault.faults
self.assertTrue(len(segments) == 2)
self.assertIsInstance(segments[0], RsqSimSegment)
[docs]
def test_return_names(self):
names = self.multifault.names
self.assertTrue(len(names) == 2)
self.assertEqual(names[0], "hikurangi0")
[docs]
def test_return_name_dic(self):
self.assertDictEqual(self.multifault.name_dic, {'hikurangi0': self.multifault.faults[0],
'hikurangi1': self.multifault.faults[1]})
[docs]
def test_return_bounds(self):
np.testing.assert_array_almost_equal(self.multifault.bounds, np.array([724300.821675, 5206243.353544,
840261.391107, 5360639.504934]))
[docs]
def test_return_patch_dic(self):
self.assertIsInstance(self.multifault.patch_dic[0], RsqSimTriangularPatch)
[docs]
def test_return_faults_with_patches(self):
faults_with_patches = self.multifault.faults_with_patches
self.assertIsInstance(faults_with_patches[0], RsqSimSegment)
self.assertEqual(faults_with_patches[0], self.multifault.faults[0])
[docs]
def test_filter_faults_by_patch_numbers(self):
patch = self.multifault.filter_faults_by_patch_numbers(np.array([0], dtype=np.int32))
self.assertIsInstance(patch, RsqSimMultiFault)
self.assertEqual(patch.faults[0], self.multifault.faults[0])
self.assertEqual(len(patch.faults), 1)
[docs]
def test_read_bruce_fault_file(self):
multifault = RsqSimMultiFault.read_fault_file_bruce(os.path.join(os.path.dirname(__file__),
"data/test_fault_bruce.in"),
os.path.join(os.path.dirname(__file__),
"data/test_names_bruce.in"))
self.assertIsInstance(multifault, RsqSimMultiFault)
self.assertIsInstance(multifault.faults[0], RsqSimSegment)
self.assertEqual(len(multifault.faults), 2)
[docs]
class TestSegment(unittest.TestCase):
[docs]
def setUp(self) -> None:
self.fault = RsqSimSegment.from_pandas(faults_in, 0, [0], "test")
self.fault.strike_slip = -1. *np.ones((self.fault.patch_numbers.size,))
[docs]
def test_return_vertices(self):
np.testing.assert_array_equal(np.sort(self.fault.vertices.flat), np.sort(test_vertices.flat))
[docs]
def test_return_bounds(self):
np.testing.assert_array_equal(self.fault.bounds, np.array([0, 0, 1, 1]))
[docs]
def test_return_patch_outlines(self):
patch_outlines = self.fault.patch_outlines
self.assertTrue(len(patch_outlines) == 1)
self.assertIsInstance(patch_outlines[0], RsqSimTriangularPatch)
[docs]
def test_return_patch_numbers(self):
patch_numbers = self.fault.patch_numbers
self.assertTrue(len(patch_numbers) == 1)
self.assertEqual(patch_numbers[0], 0)
[docs]
def test_return_patch_dic(self):
self.assertIsInstance(self.fault.patch_dic[0], RsqSimTriangularPatch)
[docs]
def test_return_patch_vertices(self):
patch_vertices = self.fault.patch_vertices
self.assertTrue(len(patch_vertices) == 1)
np.testing.assert_array_equal(np.sort(patch_vertices[0].flat), np.sort(test_vertices.flat))
[docs]
def test_return_edge_lines(self):
np.testing.assert_array_equal(self.fault.edge_lines, [[0, 2], [0, 1], [2, 1]])
[docs]
def test_return_triangles(self):
np.testing.assert_array_equal(self.fault.triangles, [[0, 2, 1]])
[docs]
def test_dip_slip(self):
patch = self.fault.patch_dic[0]
np.testing.assert_almost_equal(patch.dip_slip, 0)
[docs]
def test_strike_slip(self):
patch = self.fault.patch_dic[0]
np.testing.assert_almost_equal(patch.strike_slip, -1)
[docs]
def test_total_slip(self):
patch = self.fault.patch_dic[0]
np.testing.assert_almost_equal(patch.total_slip, 1)
[docs]
def test_find_triangles_from_vertex_index(self):
triangle_index = self.fault.find_triangles_from_vertex_index(0)
self.assertTrue(len(triangle_index) == 1)
self.assertEqual(triangle_index[0], 0)
self.assertIn(0, self.fault.triangles[triangle_index])
[docs]
class TestTriangularPatch(unittest.TestCase):
[docs]
def setUp(self) -> None:
self.segment = RsqSimSegment(0)
self.triangle = RsqSimTriangularPatch(segment=self.segment, vertices=test_vertices)
[docs]
def test_return_vertices_shape(self):
self.assertSequenceEqual(self.triangle.vertices.shape, test_vertices.shape)
[docs]
def test_return_vertices(self):
np.testing.assert_array_almost_equal(self.triangle.vertices, test_vertices)
[docs]
def test_normal_vector(self):
np.testing.assert_array_almost_equal(self.triangle.normal_vector, np.array([-0.57735, 0.57735, 0.57735]))
[docs]
def test_down_dip_vector(self):
np.testing.assert_array_almost_equal(self.triangle.down_dip_vector, np.array([-0.408248, 0.408248, -0.816497]))
[docs]
def test_dip_magnitude(self):
np.testing.assert_almost_equal(self.triangle.dip, 54.735610317245346)
[docs]
def test_along_strike_vector(self):
np.testing.assert_array_almost_equal(self.triangle.along_strike_vector, np.array([-0.707107, -0.707107, 0. ]))
[docs]
def test_centre(self):
np.testing.assert_array_almost_equal(self.triangle.centre, np.array([0.333333, 0.6666667, -0.3333333]))
[docs]
def test_area(self):
np.testing.assert_almost_equal(self.triangle.area, 0.8660254)
[docs]
def test_strike(self):
self.assertEqual(self.triangle.strike, 225.0)