From d2e0bd716100f234de6843f52b6114509d38a8fd Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Mon, 19 Oct 2026 10:35:19 +0200 Subject: [PATCH 1/8] minor updates to avoid np2 deprecation warnings --- openquake/sub/get_profiles_from_slab2pt0.py | 6 +++--- openquake/sub/tests/profile_workflow_classification_test.py | 2 +- openquake/sub/utils.py | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openquake/sub/get_profiles_from_slab2pt0.py b/openquake/sub/get_profiles_from_slab2pt0.py index 4595511d5..a0c909ccc 100644 --- a/openquake/sub/get_profiles_from_slab2pt0.py +++ b/openquake/sub/get_profiles_from_slab2pt0.py @@ -300,12 +300,12 @@ def get_profiles_geojson(geojson: str, fname_dep: str, spacing: float, # Reading file with depth values f_dep = netCDF4.Dataset(fname_dep) - depths = np.array(f_dep.variables['z']) + depths = np.asarray(f_dep.variables['z']) mask = np.where(np.isfinite(depths)) # Mesh - x = np.array(f_dep.variables['x']) - y = np.array(f_dep.variables['y']) + x = np.asarray(f_dep.variables['x']) + y = np.asarray(f_dep.variables['y']) xx, yy = np.meshgrid(x, y) css = [] diff --git a/openquake/sub/tests/profile_workflow_classification_test.py b/openquake/sub/tests/profile_workflow_classification_test.py index 7c10f3f5f..5fa12ce59 100644 --- a/openquake/sub/tests/profile_workflow_classification_test.py +++ b/openquake/sub/tests/profile_workflow_classification_test.py @@ -13,7 +13,7 @@ def test_geojson_classification_workflow(): - raise unittest.SkipTest + #raise unittest.SkipTest fname_geojson = HERE / "data" / "izu_slab2_css.geojson" fname_slab = HERE / "data" / "izu_slab2_dep_02.24.18.grd" classification_ini = HERE / "data" / "mariana_classification.ini" diff --git a/openquake/sub/utils.py b/openquake/sub/utils.py index 8545db2e1..e303ea75c 100644 --- a/openquake/sub/utils.py +++ b/openquake/sub/utils.py @@ -306,6 +306,7 @@ def _check_edges(edges): # Fit the plane tmp = np.vstack((x.flatten(), y.flatten(), pnts[:, 2].flatten())).T _, ppar = plane_fit(tmp) + pparray = np.array([ppar[0], ppar[1], 0]) # Analyse the edges chks = [] @@ -319,8 +320,8 @@ def _check_edges(edges): # Check the edge direction Vs the perpendicular to the plane idx = [0, -1] - edgv = np.array([np.diff(ex[idx])[0], np.diff(ey[idx])[0]]) - chks.append(np.sign(np.cross(ppar[:2], edgv))) + edgv = np.array([np.diff(ex[idx])[0], np.diff(ey[idx])[0], 0]) + chks.append(np.sign(np.cross(pparray, edgv)[:2])) return np.array(chks) From bc90f378eff3d9e28bf34f195647ec0e844b2d4c Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Mon, 19 Oct 2026 12:07:34 +0200 Subject: [PATCH 2/8] tidying --- .../sub/tests/profile_workflow_classification_test.py | 11 ++++++----- openquake/sub/utils.py | 5 +++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/openquake/sub/tests/profile_workflow_classification_test.py b/openquake/sub/tests/profile_workflow_classification_test.py index 5fa12ce59..ff4ca51b1 100644 --- a/openquake/sub/tests/profile_workflow_classification_test.py +++ b/openquake/sub/tests/profile_workflow_classification_test.py @@ -13,7 +13,6 @@ def test_geojson_classification_workflow(): - #raise unittest.SkipTest fname_geojson = HERE / "data" / "izu_slab2_css.geojson" fname_slab = HERE / "data" / "izu_slab2_dep_02.24.18.grd" classification_ini = HERE / "data" / "mariana_classification.ini" @@ -43,13 +42,15 @@ def test_geojson_classification_workflow(): with open(classification_ini, "w") as configfile: config.write(configfile) - max_sampl_dist = 25 - upper_depth_int = 0 - lower_depth_int = 50 - lower_depth_slab = 300 + max_sampl_dist = 25.0 + upper_depth_int = 0.0 + lower_depth_int = 50.0 + lower_depth_slab = 300.0 slb = get_profiles_geojson(fname_geojson, fname_slab, spacing=10.0) slb.write_profiles(profiles) + + # Compare slab profiles create_2pt5_model(profiles, sfc_out, max_sampl_dist) diff --git a/openquake/sub/utils.py b/openquake/sub/utils.py index e303ea75c..fd2e03e0f 100644 --- a/openquake/sub/utils.py +++ b/openquake/sub/utils.py @@ -306,7 +306,7 @@ def _check_edges(edges): # Fit the plane tmp = np.vstack((x.flatten(), y.flatten(), pnts[:, 2].flatten())).T _, ppar = plane_fit(tmp) - pparray = np.array([ppar[0], ppar[1], 0]) + #pparray = np.array([ppar[0], ppar[1], 0]) # Analyse the edges chks = [] @@ -321,7 +321,8 @@ def _check_edges(edges): # Check the edge direction Vs the perpendicular to the plane idx = [0, -1] edgv = np.array([np.diff(ex[idx])[0], np.diff(ey[idx])[0], 0]) - chks.append(np.sign(np.cross(pparray, edgv)[:2])) + #chks.append(np.sign(np.cross(pparray, edgv))) + chks.append(np.sign(np.cross(ppar[:2], edgv))) return np.array(chks) From 398f2048dd9c43f09f7e4f1563a316880846f40a Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Mon, 19 Oct 2026 12:19:31 +0200 Subject: [PATCH 3/8] taking correct output of cross --- openquake/sub/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openquake/sub/utils.py b/openquake/sub/utils.py index fd2e03e0f..51ed27a3e 100644 --- a/openquake/sub/utils.py +++ b/openquake/sub/utils.py @@ -306,7 +306,7 @@ def _check_edges(edges): # Fit the plane tmp = np.vstack((x.flatten(), y.flatten(), pnts[:, 2].flatten())).T _, ppar = plane_fit(tmp) - #pparray = np.array([ppar[0], ppar[1], 0]) + pparray = np.array([ppar[0], ppar[1], 0]) # Analyse the edges chks = [] @@ -321,8 +321,8 @@ def _check_edges(edges): # Check the edge direction Vs the perpendicular to the plane idx = [0, -1] edgv = np.array([np.diff(ex[idx])[0], np.diff(ey[idx])[0], 0]) - #chks.append(np.sign(np.cross(pparray, edgv))) - chks.append(np.sign(np.cross(ppar[:2], edgv))) + chks.append(np.sign(np.cross(pparray, edgv)[2])) + return np.array(chks) From d904a9bd520a9f0a33c796a35967117f9457f1a1 Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Tue, 20 Oct 2026 11:04:00 +0200 Subject: [PATCH 4/8] adding tests on distances --- .../profile_workflow_classification_test.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/openquake/sub/tests/profile_workflow_classification_test.py b/openquake/sub/tests/profile_workflow_classification_test.py index ff4ca51b1..779bee97f 100644 --- a/openquake/sub/tests/profile_workflow_classification_test.py +++ b/openquake/sub/tests/profile_workflow_classification_test.py @@ -18,6 +18,9 @@ def test_geojson_classification_workflow(): classification_ini = HERE / "data" / "mariana_classification.ini" ## these go in a tmp folder... + #top_level = HERE / "data" / "test_folder" + #profiles = HERE / "data" / "test_folder" / "profiles" + #sfc_out = HERE / "data" / "test_folder" / "sfc_out" top_level = tempfile.mkdtemp() profiles = tempfile.mkdtemp(dir=top_level) sfc_out = tempfile.mkdtemp(dir=top_level) @@ -51,6 +54,14 @@ def test_geojson_classification_workflow(): slb.write_profiles(profiles) # Compare slab profiles + import pandas as pd + + df1 = pd.read_csv(os.path.join(profiles, "cs_000.csv")) + df2 = pd.read_csv(HERE / "data" / "cs_000.csv") + + # Compare DataFrames + res = df1.compare(df2) + assert len(res) == 0 create_2pt5_model(profiles, sfc_out, max_sampl_dist) @@ -69,6 +80,13 @@ def test_geojson_classification_workflow(): ) classify.classify(classification_ini, True) + + # Test the distances are the same + dists = pd.read_pickle(os.path.join(top_level, "distances", "vert_dist_to_slab_slab.pkl")) + test_dists = pd.read_pickle(HERE / "data" / "vert_dist_to_slab_slab.pkl") + assert len(dists) == len(test_dists) + for a, b in zip(dists, test_dists): + assert a == b # Test the resulting classification is as expected classified = pd.read_csv(os.path.join(top_level, "classified_earthquakes.csv")) From f6ebaed32fd79cb0143cafb65f02ba02e564f5f1 Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Tue, 20 Oct 2026 11:29:54 +0200 Subject: [PATCH 5/8] adding test files --- openquake/sub/tests/data/cs_000.csv | 49 ++++++++++++++++++ .../sub/tests/data/vert_dist_to_slab_slab.pkl | Bin 0 -> 15440 bytes 2 files changed, 49 insertions(+) create mode 100644 openquake/sub/tests/data/cs_000.csv create mode 100644 openquake/sub/tests/data/vert_dist_to_slab_slab.pkl diff --git a/openquake/sub/tests/data/cs_000.csv b/openquake/sub/tests/data/cs_000.csv new file mode 100644 index 000000000..bd4bd3946 --- /dev/null +++ b/openquake/sub/tests/data/cs_000.csv @@ -0,0 +1,49 @@ +1.435446094052026638e+02 2.401308591980515672e+01 1.132732022828012930e+01 +1.434954976799403141e+02 2.400434697468638490e+01 1.190561589960553590e+01 +1.434463926316922198e+02 2.399559238759614033e+01 1.254143236962554298e+01 +1.433972942687359762e+02 2.398682216709252302e+01 1.323666306944010174e+01 +1.433482025993247078e+02 2.397803632174514021e+01 1.399429457634280638e+01 +1.432991176316870394e+02 2.396923486013503179e+01 1.482556792962662051e+01 +1.432500393740271534e+02 2.396041779085468448e+01 1.574420432198734154e+01 +1.432009678345243913e+02 2.395158512250799276e+01 1.676243620142352242e+01 +1.431519030213338510e+02 2.394273686371022336e+01 1.789757172483989933e+01 +1.431028449425858184e+02 2.393387302308800102e+01 1.917136028048950180e+01 +1.430537936063860514e+02 2.392499360927928720e+01 2.058329299147684566e+01 +1.430047490208158649e+02 2.391609863093334454e+01 2.216642013631120278e+01 +1.429557111939317338e+02 2.390718809671070133e+01 2.394920448041169792e+01 +1.429066801337656614e+02 2.389826201528315508e+01 2.592329399299599046e+01 +1.428576558483248675e+02 2.388932039533371210e+01 2.814328151808559753e+01 +1.428086383455921293e+02 2.388036324555658751e+01 3.066574464814294032e+01 +1.427596276335253265e+02 2.387139057465717684e+01 3.346200916374149870e+01 +1.427106237200578960e+02 2.386240239135200270e+01 3.655092701965818947e+01 +1.426616266130984343e+02 2.385339870436873255e+01 4.002451856989834766e+01 +1.426126363205308678e+02 2.384437952244611836e+01 4.387326164097233061e+01 +1.425636528502144529e+02 2.383534485433397165e+01 4.814472404329134037e+01 +1.425146762099837758e+02 2.382629470879317424e+01 5.280716198140613926e+01 +1.424657064076485540e+02 2.381722909459560711e+01 5.795058157771575225e+01 +1.424167434509938630e+02 2.380814802052413981e+01 6.356865348581769126e+01 +1.423677873477800517e+02 2.379905149537262687e+01 6.962007400241589039e+01 +1.423188381057426852e+02 2.378993952794584033e+01 7.616785668034182777e+01 +1.422698957325925448e+02 2.378081212705949099e+01 8.316454153878673594e+01 +1.422209602360155714e+02 2.377166930154015745e+01 9.059205530690070418e+01 +1.421720316236730639e+02 2.376251106022529314e+01 9.842075024588027077e+01 +1.421231099032013674e+02 2.375333741196317661e+01 1.066362707307830959e+02 +1.420741950822122419e+02 2.374414836561291509e+01 1.152026983293106071e+02 +1.420252871682923512e+02 2.373494393004436986e+01 1.240593132900936837e+02 +1.419763861690037743e+02 2.372572411413819893e+01 1.331799377969740021e+02 +1.419274920918835505e+02 2.371648892678576459e+01 1.425402296540906946e+02 +1.418786049444440778e+02 2.370723837688915125e+01 1.521112089443612376e+02 +1.418297247341726859e+02 2.369797247336111568e+01 1.618230276431121410e+02 +1.417808514685321200e+02 2.368869122512506920e+01 1.716798226686515250e+02 +1.417319851549599434e+02 2.367939464111505998e+01 1.817318634691140460e+02 +1.416831258008690213e+02 2.367008273027573040e+01 1.918661884548160401e+02 +1.416342734136473780e+02 2.366075550156229923e+01 2.022366833295921822e+02 +1.415854280006580268e+02 2.365141296394055104e+01 2.127530311619178747e+02 +1.415365895692390552e+02 2.364205512638677931e+01 2.234935955372048113e+02 +1.414877581267038806e+02 2.363268199788778290e+01 2.345162610869746800e+02 +1.414389336803406820e+02 2.362329358744083763e+01 2.458748628952209856e+02 +1.413901162374128546e+02 2.361388990405365007e+01 2.576196954502950121e+02 +1.413413058051589530e+02 2.360447095674437890e+01 2.698029403007594169e+02 +1.412925023907924356e+02 2.359503675454154603e+01 2.825116878153254447e+02 +1.412437060015019483e+02 2.358558730648406154e+01 2.957778391302533691e+02 +1.411949166444511263e+02 2.357612262162117744e+01 3.096842848306729366e+02 diff --git a/openquake/sub/tests/data/vert_dist_to_slab_slab.pkl b/openquake/sub/tests/data/vert_dist_to_slab_slab.pkl new file mode 100644 index 0000000000000000000000000000000000000000..f07f40d60be02261a72c708cda7f3776afeedbaf GIT binary patch literal 15440 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 Fe*j1S>)ZeU literal 0 HcmV?d00001 From 51231570a8bddc7544481b2967cca97c40e196c7 Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Tue, 20 Oct 2026 12:50:35 +0200 Subject: [PATCH 6/8] rounding distances --- openquake/mbt/tools/tr/catalogue_hmtk.py | 3 ++- .../sub/tests/data/vert_dist_to_slab_slab.pkl | Bin 15440 -> 15440 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openquake/mbt/tools/tr/catalogue_hmtk.py b/openquake/mbt/tools/tr/catalogue_hmtk.py index 4d22741a0..963d04f8d 100644 --- a/openquake/mbt/tools/tr/catalogue_hmtk.py +++ b/openquake/mbt/tools/tr/catalogue_hmtk.py @@ -61,9 +61,10 @@ def get_distances_from_surface(catalogue, surface): mesh = Mesh(catalogue.data['longitude'][i:upp], catalogue.data['latitude'][i:upp], catalogue.data['depth'][i:upp]) - tmp = surface.get_min_distance(mesh) + tmp = np.float64(surface.get_min_distance(mesh), 5) dsts[i:upp] = tmp i = upp + dsts = dsts.round(5) return dsts diff --git a/openquake/sub/tests/data/vert_dist_to_slab_slab.pkl b/openquake/sub/tests/data/vert_dist_to_slab_slab.pkl index f07f40d60be02261a72c708cda7f3776afeedbaf..77bde828c3bb0c5651d55b80b691c222dd1948af 100644 GIT binary patch literal 15440 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 L{j8!JyuSYfo37~I literal 15440 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 Fe*j1S>)ZeU From 7e83d0ad9e18123cf4fdd40ce6bc31f6f415de07 Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Tue, 20 Oct 2026 14:37:50 +0200 Subject: [PATCH 7/8] improving profile tests --- openquake/sub/get_profiles_from_slab2pt0.py | 28 +++++++++---------- .../create_profiles_from_slab2pt0_test.py | 17 ++++++++++- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/openquake/sub/get_profiles_from_slab2pt0.py b/openquake/sub/get_profiles_from_slab2pt0.py index a0c909ccc..0e2e36036 100644 --- a/openquake/sub/get_profiles_from_slab2pt0.py +++ b/openquake/sub/get_profiles_from_slab2pt0.py @@ -113,7 +113,7 @@ def get_initial_traces(box, boy, dip_dir, spacing): # reverse profiles to satisfy right hand rule profiles.reverse() - return np.array(profiles), max_length + return np.asarray(profiles), max_length def aa_get_initial_traces(bb, dip_dir, spacing): @@ -145,24 +145,24 @@ def aa_get_initial_traces(bb, dip_dir, spacing): points = g.fwd_intermediate(bb[0], bb[2], az12_low, num_samples_low + 1, spacing_hor, initial_idx=0, terminus_idx=0) - profiles = _get_profiles(np.array(points.lons), np.array(points.lats), + profiles = _get_profiles(np.asarray(points.lons), np.asarray(points.lats), dip_dir, max_length) points = g.fwd_intermediate(bb[1], bb[3], az21_right, num_samples_right + 1, spacing_ver, initial_idx=0, terminus_idx=0) - tmp_profiles = _get_profiles(np.array(points.lons), np.array(points.lats), + tmp_profiles = _get_profiles(np.asarray(points.lons), np.asarray(points.lats), dip_dir, max_length) profiles.extend(tmp_profiles) - return np.array(profiles), max_length + return np.asarray(profiles), max_length def _get_profiles(lons, lats, dip_dir, max_length): tmp_profiles = [] for xco, yco in zip(lons, lats): tmp = point_at(xco, yco, dip_dir, max_length) - arr = np.array([[xco, yco], [tmp[0], tmp[1]]]) + arr = np.asarray([[xco, yco], [tmp[0], tmp[1]]]) tmp_profiles.append(arr) return tmp_profiles @@ -244,7 +244,7 @@ def tmp_get_initial_traces(bb, dip_dir, spacing): # Update the profile list profiles.extend(tmp_profiles) - profiles = np.array(profiles) + profiles = np.asarray(profiles) mask = profiles[:, :, 0] > 180 profiles[mask, 0] = profiles[mask, 0] - 360 return profiles, distance @@ -318,7 +318,7 @@ def get_profiles_geojson(geojson: str, fname_dep: str, spacing: float, max_lo = -180.0 max_la = -90.0 for index, row in gdf.iterrows(): - coo = np.array(row.coords) + coo = np.asarray(row.coords) min_lo = np.min([min_lo, np.min(coo[:, 0])]) min_la = np.min([min_la, np.min(coo[:, 1])]) max_lo = np.max([max_lo, np.max(coo[:, 0])]) @@ -348,7 +348,7 @@ def get_profiles_geojson(geojson: str, fname_dep: str, spacing: float, # Coords tmp = zip(xx.flatten(), yy.flatten(), depths.flatten()) depths = [[x, y, z] for x, y, z in tmp] - depths = np.array(depths) + depths = np.asarray(depths) mask = depths[:, 0] > 180 depths[mask, 0] = depths[mask, 0] - 360 milo = np.min(depths[:, 0]) @@ -362,7 +362,7 @@ def get_profiles_geojson(geojson: str, fname_dep: str, spacing: float, if len(str(fname_fig)) > 0: - bb = np.array([min_lo, min_la, max_lo, max_la]) + bb = np.asarray([min_lo, min_la, max_lo, max_la]) dlt = 5.0 reg = [bb[0] - dlt, bb[2] + dlt, bb[1] - dlt, bb[3] + dlt] clo = np.mean([bb[0], bb[1]]) @@ -428,7 +428,7 @@ def get_profiles(fname_str: str, fname_dep: str, spacing: float, fname_fig: # Reading file with strike values f_strike = netCDF4.Dataset(fname_str) - strikes = np.array(f_strike.variables['z']) + strikes = np.asarray(f_strike.variables['z']) mask = np.where(np.isfinite(strikes)) strikes = strikes[mask] @@ -437,8 +437,8 @@ def get_profiles(fname_str: str, fname_dep: str, spacing: float, fname_fig: dip_dir = (strike_dir + 90) % 360 # Mesh - x = np.array(f_strike.variables['x']) - y = np.array(f_strike.variables['y']) + x = np.asarray(f_strike.variables['x']) + y = np.asarray(f_strike.variables['y']) xx, yy = np.meshgrid(x, y) # Compute the initial bounding box @@ -471,7 +471,7 @@ def get_profiles(fname_str: str, fname_dep: str, spacing: float, fname_fig: # Reading file with depth values f_dep = netCDF4.Dataset(fname_dep) - depths = np.array(f_dep.variables['z']) + depths = np.asarray(f_dep.variables['z']) mask = np.where(np.isfinite(depths)) # Filter @@ -482,7 +482,7 @@ def get_profiles(fname_str: str, fname_dep: str, spacing: float, fname_fig: # Coords tmp = zip(xx.flatten(), yy.flatten(), depths.flatten()) depths = [[x, y, z] for x, y, z in tmp] - depths = np.array(depths) + depths = np.asarray(depths) mask = depths[:, 0] > 180 depths[mask, 0] = depths[mask, 0] - 360 diff --git a/openquake/sub/tests/create_profiles_from_slab2pt0_test.py b/openquake/sub/tests/create_profiles_from_slab2pt0_test.py index 3f3460017..fa3fff544 100644 --- a/openquake/sub/tests/create_profiles_from_slab2pt0_test.py +++ b/openquake/sub/tests/create_profiles_from_slab2pt0_test.py @@ -27,6 +27,9 @@ import pathlib import unittest import numpy as np +import pandas as pd +import tempfile +import os from openquake.sub.get_profiles_from_slab2pt0 import (get_profiles, get_bounding_box, get_initial_traces, @@ -200,4 +203,16 @@ def test_geojson_mariana(self): fname = HERE / 'data' / 'izu_slab2_css.geojson' fname_slab = HERE / 'data' / 'izu_slab2_dep_02.24.18.grd' - get_profiles_geojson(fname, fname_slab, spacing=10.) + test = get_profiles_geojson(fname, fname_slab, spacing=10.) + + top_level = tempfile.mkdtemp() + profiles = tempfile.mkdtemp(dir=top_level) + + test.write_profiles(profiles) + + df1 = pd.read_csv(os.path.join(profiles,'cs_000.csv')) + df2 = pd.read_csv(HERE / "data" / "mar_cs_000.csv") + res = df1.compare(df2) + assert len(res) == 0 + + From a584756896efcd95885dd8545bbeeff9da115151 Mon Sep 17 00:00:00 2001 From: Kirsty Bayliss Date: Tue, 20 Oct 2026 14:38:48 +0200 Subject: [PATCH 8/8] adding test file --- openquake/sub/tests/data/mar_cs_000.csv | 49 +++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 openquake/sub/tests/data/mar_cs_000.csv diff --git a/openquake/sub/tests/data/mar_cs_000.csv b/openquake/sub/tests/data/mar_cs_000.csv new file mode 100644 index 000000000..bd4bd3946 --- /dev/null +++ b/openquake/sub/tests/data/mar_cs_000.csv @@ -0,0 +1,49 @@ +1.435446094052026638e+02 2.401308591980515672e+01 1.132732022828012930e+01 +1.434954976799403141e+02 2.400434697468638490e+01 1.190561589960553590e+01 +1.434463926316922198e+02 2.399559238759614033e+01 1.254143236962554298e+01 +1.433972942687359762e+02 2.398682216709252302e+01 1.323666306944010174e+01 +1.433482025993247078e+02 2.397803632174514021e+01 1.399429457634280638e+01 +1.432991176316870394e+02 2.396923486013503179e+01 1.482556792962662051e+01 +1.432500393740271534e+02 2.396041779085468448e+01 1.574420432198734154e+01 +1.432009678345243913e+02 2.395158512250799276e+01 1.676243620142352242e+01 +1.431519030213338510e+02 2.394273686371022336e+01 1.789757172483989933e+01 +1.431028449425858184e+02 2.393387302308800102e+01 1.917136028048950180e+01 +1.430537936063860514e+02 2.392499360927928720e+01 2.058329299147684566e+01 +1.430047490208158649e+02 2.391609863093334454e+01 2.216642013631120278e+01 +1.429557111939317338e+02 2.390718809671070133e+01 2.394920448041169792e+01 +1.429066801337656614e+02 2.389826201528315508e+01 2.592329399299599046e+01 +1.428576558483248675e+02 2.388932039533371210e+01 2.814328151808559753e+01 +1.428086383455921293e+02 2.388036324555658751e+01 3.066574464814294032e+01 +1.427596276335253265e+02 2.387139057465717684e+01 3.346200916374149870e+01 +1.427106237200578960e+02 2.386240239135200270e+01 3.655092701965818947e+01 +1.426616266130984343e+02 2.385339870436873255e+01 4.002451856989834766e+01 +1.426126363205308678e+02 2.384437952244611836e+01 4.387326164097233061e+01 +1.425636528502144529e+02 2.383534485433397165e+01 4.814472404329134037e+01 +1.425146762099837758e+02 2.382629470879317424e+01 5.280716198140613926e+01 +1.424657064076485540e+02 2.381722909459560711e+01 5.795058157771575225e+01 +1.424167434509938630e+02 2.380814802052413981e+01 6.356865348581769126e+01 +1.423677873477800517e+02 2.379905149537262687e+01 6.962007400241589039e+01 +1.423188381057426852e+02 2.378993952794584033e+01 7.616785668034182777e+01 +1.422698957325925448e+02 2.378081212705949099e+01 8.316454153878673594e+01 +1.422209602360155714e+02 2.377166930154015745e+01 9.059205530690070418e+01 +1.421720316236730639e+02 2.376251106022529314e+01 9.842075024588027077e+01 +1.421231099032013674e+02 2.375333741196317661e+01 1.066362707307830959e+02 +1.420741950822122419e+02 2.374414836561291509e+01 1.152026983293106071e+02 +1.420252871682923512e+02 2.373494393004436986e+01 1.240593132900936837e+02 +1.419763861690037743e+02 2.372572411413819893e+01 1.331799377969740021e+02 +1.419274920918835505e+02 2.371648892678576459e+01 1.425402296540906946e+02 +1.418786049444440778e+02 2.370723837688915125e+01 1.521112089443612376e+02 +1.418297247341726859e+02 2.369797247336111568e+01 1.618230276431121410e+02 +1.417808514685321200e+02 2.368869122512506920e+01 1.716798226686515250e+02 +1.417319851549599434e+02 2.367939464111505998e+01 1.817318634691140460e+02 +1.416831258008690213e+02 2.367008273027573040e+01 1.918661884548160401e+02 +1.416342734136473780e+02 2.366075550156229923e+01 2.022366833295921822e+02 +1.415854280006580268e+02 2.365141296394055104e+01 2.127530311619178747e+02 +1.415365895692390552e+02 2.364205512638677931e+01 2.234935955372048113e+02 +1.414877581267038806e+02 2.363268199788778290e+01 2.345162610869746800e+02 +1.414389336803406820e+02 2.362329358744083763e+01 2.458748628952209856e+02 +1.413901162374128546e+02 2.361388990405365007e+01 2.576196954502950121e+02 +1.413413058051589530e+02 2.360447095674437890e+01 2.698029403007594169e+02 +1.412925023907924356e+02 2.359503675454154603e+01 2.825116878153254447e+02 +1.412437060015019483e+02 2.358558730648406154e+01 2.957778391302533691e+02 +1.411949166444511263e+02 2.357612262162117744e+01 3.096842848306729366e+02