raw ยท 5180 bytes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | import unittest import numpy as np from mapgen import crust as CR from mapgen.plates import CONV, DIV from tests.helpers import make_ctx TECT = {"plate": [], "lip": [{"name": "l", "center": [10.0, -30.0], "radius_km": 1500.0}], "volcano": [{"name": "v", "center": [-10.0, 20.0], "radius_km": 700.0, "height_m": 7000.0, "scar_azimuths": [90.0]}]} def ctx3(): ctx = make_ctx(3, tect=TECT, cfg={"crust": {"edge_noise": 0.0}}) g = ctx.grid land = ((np.abs(g.lat) < 35) & (np.abs(g.lon) < 60)).astype(float) bt = np.zeros(g.n, np.int8) bt[np.abs(g.lon - 120) < 1.0] = DIV # a mid-ocean ridge along lon 120 bt[np.abs(g.lon - 0) < 1.0] = CONV ctx.data.update({"sk_land": land, "m_land_hint": np.zeros(g.n), "bnd_type": bt}) return ctx class CrustTest(unittest.TestCase): def test_classes(self): ctx = ctx3() out = CR.run(ctx) g = ctx.grid age = out["age_class"] self.assertTrue(out["continental"][g.cell_index(20.0, -50.0)]) self.assertFalse(out["continental"][g.cell_index(0.0, 150.0)]) self.assertEqual(age[g.cell_index(0.0, 150.0)], CR.OCEANIC) self.assertEqual(age[g.cell_index(10.0, -30.0)], CR.LIP) self.assertEqual(age[g.cell_index(-10.0, 20.0)], CR.VOLCANO) self.assertEqual(age[g.cell_index(-10.0, 24.0)], CR.SCAR) # east sector, ~900 km out self.assertEqual(age[g.cell_index(20.0, 3.0)], CR.POST_OROGEN) def test_ocean_age_grows_from_ridge(self): ctx = ctx3() out = CR.run(ctx) g = ctx.grid ocean = ~out["continental"] & (np.abs(g.lat) < 20) & (np.abs(g.lon - 120) < 20) r = np.corrcoef(np.abs(g.lon[ocean] - 120), out["ocean_age_myr"][ocean])[0, 1] self.assertGreater(r, 0.95) self.assertTrue(np.all(out["ocean_age_myr"][out["continental"]] == 0)) class ShelfTest(unittest.TestCase): def test_continental_shelf_is_resolution_independent(self): from mapgen.graph import distance_to for res in (3, 4): ctx = make_ctx(res, tect={"plate": []}, cfg={"crust": {"edge_noise": 0.0}}) g = ctx.grid land = ((np.abs(g.lat) < 30) & (np.abs(g.lon) < 40)).astype(float) ctx.data.update({"sk_land": land, "m_land_hint": np.zeros(g.n), "bnd_type": np.zeros(g.n, np.int8)}) cont = CR.run(ctx)["continental"] d = distance_to(g, land > 0.5) self.assertTrue(np.all(cont[land > 0.5]), res) self.assertGreater(cont[(d > 0) & (d < 300)].mean(), 0.8, res) # shelf self.assertEqual(cont[d > 700].sum(), 0, res) # but not far out class FractalMarginTest(unittest.TestCase): @staticmethod def _edge(noise): from mapgen.graph import components ctx = make_ctx(4, tect={"plate": []}, cfg={"crust": {"edge_noise": noise}}) g = ctx.grid land = ((np.abs(g.lat) < 30) & (np.abs(g.lon) < 60)).astype(float) ctx.data.update({"sk_land": land, "m_land_hint": np.zeros(g.n), "bnd_type": np.zeros(g.n, np.int8)}) cont = CR.run(ctx)["continental"] lab = components(g, cont) sizes = np.bincount(lab[cont]) return int(np.sum(cont[g.src] != cont[g.dst])), int(np.sum((sizes > 0) & (sizes < 0.05 * sizes.max()))) def test_margins_are_fractal_with_fragments(self): smooth, _ = self._edge(0.0) edges, fragments = self._edge(CR.DEFAULTS["edge_noise"]) self.assertGreater(edges, 1.4 * smooth) self.assertGreaterEqual(fragments, 3) class RevisionCrustTest(unittest.TestCase): def test_no_patch_no_plateau_keeps_crust(self): out = CR.run(ctx3()) np.testing.assert_array_equal(out["continental"], out["continental_base"]) self.assertTrue(np.all(out["plateau_id"] == -1)) def test_land_patch_adds_continental_crust_only_around_its_disc(self): ctx = ctx3() ctx.tect = {**TECT, "land_patch": [{"name": "fill", "center": [0.0, 150.0], "radius_km": 2000.0, "edge_noise": 0.4}]} out = CR.run(ctx) g = ctx.grid i = g.cell_index(0.0, 150.0) self.assertTrue(out["continental"][i]) self.assertFalse(out["continental_base"][i]) far = CR.center_dist(g, [0.0, 150.0]) > 4500.0 np.testing.assert_array_equal(out["continental"][far], out["continental_base"][far]) self.assertEqual(out["age_class"][i] == CR.OCEANIC, False) def test_plateau_cells_become_continental_crust_with_ids(self): ctx = ctx3() ctx.tect = {**TECT, "plateau": [{"name": "p", "center": [0.0, 150.0], "area_km2": 3.0e6, "top_m": [1500.0, 3000.0]}]} out = CR.run(ctx) i = ctx.grid.cell_index(0.0, 150.0) self.assertEqual(out["plateau_id"][i], 0) self.assertTrue(out["continental"][i]) self.assertFalse(out["continental_base"][i]) self.assertNotEqual(out["age_class"][i], CR.OCEANIC) self.assertGreater(out["ocean_age_myr"][i], 0.0, "the plateau keeps the age of the sea floor around it") |